zoukankan      html  css  js  c++  java
  • 如鹏网学习笔记(五)MySql基础

    MySQL基础

    一、数据库概念
      1,网友装备信息、论坛帖子信息、QQ好友关系信息、学籍管理系统中的学生信息等都要“持久化”的保存到一个地方,
        如果通过IO写到文件中,那么会非常麻烦,而且不利于多人共享数据

      2,我们开发大部分软件、网站都要大量用到书库,甚至开发游戏、手机App也要用到数据库,公司面试的时候数据库的考核在三分之一以上

      3,数据库(DataBase)是保存数据的仓库,可以方便的把数据放进去,并且把数据根据各种需要取出来。
        数据库管理系统(Database Management SYSTEM,DBMS)是对数据库进行管理(增删改查等)的软件,
        常用的DBMS有MYSQL、Oracle、DB2、MSSQLServer等。
        MYSQL是开源、免费的,因此应用最广泛

      4,不同的DBMS用法大同小异,掌握了一个也就基本等于掌握了其他DBMS

    二、数据库、表、列

      1,Table(表):存放数据的“书架的格子”

      2,两种叫法:列(column)/字段(Field)

    三、MYSQL环境安装

      1,下载
        http://www.mysql.com/downloads/ MySQL Enterprise Edition (commercial)、MySQL Cluster CGE (commercial)都是收费版;MySQL Community Edition 是开源免费版。

      2,添加系统服务
        以管理员身份运行命令行,cd到mysql的bin文件夹,执行“mysqlld -install”

        卸载服务:mysql -remove


    四、MYSQL管理工具

      1,MYSQL管理工具用于对DBMS进行数据库创建、表创建等管理。开发人员必装。管理工具不是DBMS,DBMS不可少

      2,管理工具有很多:Navicat、Workbench(官方)、phpMyAdmin、SQLyog、MySQL-Front,用法大同小异。
        NaviCat lite是免费版,功能学习够用了。

      3,安装后在开始菜单的“PremiumSoft”中。
        主菜单“文件”→“新建连接”→“MYSQL”,“连接名”随意,“主机名或IP地址”填MYSQLServer的IP地址或者主机名,

        装在本机填127.0.0.1(本地回环地址),用户名密码都是root(生产环境中密码要改的复杂一点)。

      4,如果连接不报错,说明MYSQLServer和管理工具都安装没有问题


    五、主键(PrimaryKey)

      1,主键就是数据行的唯一标识。不会重复的列才能当主键。一个表可以没有主键,但是会非常难以处理,
        因此没有特殊理由表都要设定主键

      2,主键有两种选用策略:
        业务主键和逻辑主键

        业务主键就是使用有业务意义的字段做主键,比如身份证号、银行账号等

        逻辑主键是使用没有任务业务意义的字段做主键,完全是给程序看的,业务人员不会看的数据。

        因为很难保证业务主键不会重复(身份证号重复)、不会变化(账号升位),因此推荐用逻辑主键


    六、表间关联、外键(ForeignKey)

      1,一张表中的一个字段是指向了另一张表的主键,这样就将两张表的信息连接在一起了

      2,可以多张表“串联”,也可以“多对多”的在两张表之间存在一张关系表


    七、建库建表

      1,根节点点右键,新建数据库,数据库名字取得有意义,比如“study1”,字符集建议用UTF-8。

      2,在study1下的“表”节点下右键“新建表”,“栏位”其实指的就是列。

        Id(主键,潜规则的名称,int、不允许为空、点右键“主键”)
        Name(nvarchar,长度为10,不允许为空)
        Gender(bit,不允许为空)
        保存为“T_Persons”

      3,建表常见错误:

        列名/表名不要用可能的关键字,不要有空格(包括前后)、不要有特殊字符

      4,MYSQL的存储引擎有很多,最常用的是InnoDB和MyISAM,MyISAM效率较高,但是不支持事务、外键约束等特性,
        因此一般建议用InnoDB,新版本默认也是InnoDB。

        怎么设:建表时“选项”→“引擎”。建好了如何看引擎:表上点右键“对象信息”。

      5,常用的数据类型
        文本:
        CHAR(*):最多255个字节的定长字符串,它的长度必须在创建时指定
        VARCHAR(*):最多255个字节的可变长度字符串,它的长度必须在创建时指定
        TEXT:最大长度为64K字符的变长文本
        TINYTEXT:最大长度为255字符的变长文本
        MEDUIMTEXT:最大长度为16K字符的变长文本
        LONGTEXT:最大长度为4GB字符的变长文本

        整数:(考虑数据取值后选择尽可能小的类型)
        tinyint:1字节。有符号值:-128 到127;无符号值:0到255
        smallint:1字节。有符号值:-32768 到32767;无符号值:0到65535
        mediumint:3字节。
        int:4字节
        bigint:8字节

        小数:(需要指定长度和小数点,也就是显示宽度和小数位数):
        decimal:精确存储的小数,在内部用字符串存储,适合金额等要求精确的类型。别名:NUMERIC
        float:4字节,单精度。会近似存储(*),效率比decimal高。
        double:8字节,双精度。会近似存储(*),效率比decimal高。

        日期时间:
        DATE:4字节。范围:1000-01-01——9999-12-31
        TIME:3字节。范围:-838:59:59——838:59:59
        DATETIME:8字节。范围:1000-01-01 00:00:00——9999-12-31 23:59:59

        二进制大数据:
        TITYBLOB:最大长度为255字节
        BLOB:最大长度为64KB
        MEDIUMBLOB:最大长度为16MB
        LONGBLOB:最大长度为4GB


    八、SQL语句入门

      1,不能总是用鼠标点来点去手动管理数据,要能够通过语言和数据库自动交流,SQL语句就是和数据库“交谈”专用的语句

      2,SQL语句中字符串一般用单引号

      3,SQL语句是大小写不敏感的

      4,NavCat中找到执行SQL语句的地方“查询”——“新建查询”,编写SQL后点击“运行”执行SQL语句

      5,最简单的SQL:

        查看一个表的全部数据:select * from T_Persons

      6,Insert
        简单的插入数据的SQL语句:
        insert into T_Persons (Id,Name,Age,Gender) values(5,'jim',20,1)

        Insert语句可以省略表名后的列名,但是强烈不推荐

        如果插入的行中有些字段的值不确定,那么Insert的时候不指定那些列即可。“不允许为空”的列在插入的时候不能省略

        自动递增/自增(Auto Increment):字段自增可以避免并发等问题,不要程序员代码控制自增。用自增字段在Insert的时候不用指定值。

      7,修改表结构的方法:点“设计表”

        1,把“允许为空”的字段修改为“不允许为空”,需要先给旧数据默认值(用Update语句),
          如果之前是测试数据无所谓,可以把旧数据都删除(增加Height字段)

        2,修改列的数据类型要注意旧数据能否兼容转换为新类型;修改数据的长度的时候也是如此

      8,数据更新

        更新一个列:
        update T_Persons Set Age=30

        更新多个列:
        update T_Persons s Set Age=30,Name='tom'

        表达式:UPDATE T_Persons Set Age=Age+1

      9,条件数据更新

        更新一部分数据: 
        UPDATE T_Persons Set Age=30 where Name='tom',用where语句表示只更新Name是'tom'的行,
        注意SQL中等于判断用单个=,而不是==。

        Where中还可以使用复杂的逻辑判断UPDATE T_Persons Set Age=30 where Name='tom' or Age<25,or相当于Java中的||

        where (Age>20 and Age<30) or(Age=80)

        Where中可以使用的其他逻辑运算符:or、and、not、<、>、>=、<=、!=(或<>)等

      10,数据删除
        删除表中全部数据:
        DELETE from T_Persons

        删除表中部分数据
        Delete from T_Persons where Age>20

        DELETE只是删除数据,表还在,

      11,删除表
        Drop table T_Persons

    九、数据检索
      1,简单的数据检索:Select * from T_Persons

      2,只检索需要的列:
        SELECT Number FROM T_Employees 、
        SELECT Name,Age FROM T_Employees

      3,列别名
        SELECT Number AS 编号,Name AS 姓名,Age AS Age111 FROM T_Employees 
        写不写AS都行


      4,计算列
        SELECT Number 编号,Name 姓名,Age Age111,Age+10 十年后的年龄,1+1,now() FROM T_Employees

      5,使用where检索复合条件的数据:
        SELECT Name FROM T_Employees WHERE Salary<5000

      6,还可以检索不与任何表关联的数据:
        select 1+1;
        select now();

    十、数据汇总
      1,SQL聚合函数:
        MAX
        MIN
        AVG
        SUM
        COUNT
      2,大于25岁的员工的最高工资 :

        SELECT MAX(Salary) FROM T_Employees WHERE Age>25

      3,最低工资和最高工资:

        SELECT MIN(Salary),MAX(Salary) FROM T_Employees

      4,大于25岁的员工人数:

        SELECT COUNT(*) FROM T_Employees WHERE Age>25

      5,全体员工的工资总和平均工资:

        SELECT SUM(Salary),AVG (Salary) FROM T_Employees

    十一、数据排序

      1,Order by子句位于Select语句的末尾,它允许执行按照一个列或者多个列进行排序,还可以指定排序方式是升序(ASC)还是降序(DESC)

      2,按照年龄升序排序所有员工信息的列表:
        SELECT * FROM T_Employees ORDER BY Age ASC

      3,按照年龄从大到小排序,如果年龄相同则按照工资从大到小排序 :
        SELECT * FROM T_Employees ORDER BY Age DESC,Salary DESC

      4,ORDER BY子句要放到WHERE子句之后 :
        SELECT * FROM T_Employees WHERE Age>23 ORDER BY Age DESC,Salary DESC


    十二、通配符过滤

      1,通配符过滤使用like

      2,单字符匹配的通配符为半角下划线“_”,它匹配单个出现的字符。
        以任意字符开头,剩余部分为“erry”:
        Select * from T_Employees where Name like '_erry'

      3,多字符匹配的通配符为半角百分号“%”,它匹配任意次数(0或者多个)出现的任意字符。
        k% 匹配以k开头、任意长度的字符串
        检索姓名中包含字母n的员工信息:
        select * from T_Employees where name like '%n%'

      4,like性能较差,很容易造成全表扫描,谨慎使用。
        后面会讲数据库优化(索引等),项目中做搜索用全文索引


    十三、空值处理

      1,数据库中,一个列如果没有指定值,那么值就为null,数据库中的null表示“不知道”,而不是表示没有。
        因此select null+1结果是null,因为“不知道”加1的结果还是“不知道”

      2,Select * from T_Employees where name = null;
        select * from T_Employees where name!=null;
        都没有任何返回结果,因为数据库“也不知道”
        select name+"a" from T_Employees

      3,SQL中使用is null、is not null 来进行空值判断
        SELECT * FROM T_Employees WHERE NAME is null ; 
        SELECT * FROM T_Employees WHERE NAME is not null ;

    十四、limit

      limit关键字用来限制返回的结果集,limit放在select语句的最后位置,
      语法为:limit 首行行号,要返回的结果集的最大数目

      比如下面的SQL语句将返回Name不为空的、按照工资降序排列的从第二行开始(行号从0开始)的最多五条记录
      select 8 from T_Employees
      where Name is not null
      order by Salary desc
      limit 2,5

      注意:limit一定要放到所有的语句的最后

      使用场景:开发网站、开发手机程序的时候分页用的非常多

    十五、group by

      1,数据分组用来将数据分为多个逻辑组,从而可以对每个组进行聚合运算。
        SQL语句中使用group by子句进行分组,使用方式为“group by 分组字段”。
        分组一般和集合函数一起使用,group by子句负责将数据分成逻辑组,而聚合函数则对每个组进行统计计算

      2,查看公司员工有哪些年龄段的:
        select Age from T_Employees group by Age

      3,将Age相同的数据行放到一组,分组后的数据可以看作一个临时的结果集,而SELECT Age语句则取出每组的Age字段的值,
        这样我们就得到上表的员工年龄段表了。

      4,如果SELECT语句有WHERE子句,则GROUP BY子句必须放到WHERE语句的之后

      5,group by子句将检索结果划分为多个组,每个组是所有记录的一个子集。

    十六、group by与聚合函数

      1,分组后就可以对组内的数据采用聚合函数进行统计了;

        计算每个分组中员工的平均工资:
        select Age,avg(salary) from T_Employees
        group by Age

        查看每个年龄段的员工的人数:
        select Age,count(*) from T_Employees 
        group by Age

    十七、join
      1,真是的业务系统中,各个表之间都存在这种联系,很少存在不与其他表存在关联关系的表,
        而在实现业务功能的时候也经常需要从多个表中进行数据的检索,而进行多表检索最常用的技术就是表连接

      2,如果没有表连接,那么查询每张订单的客户姓名就要先查询订单,再去查询客户表,麻烦而且效率低

      3,SQL中使用JOIN关键字来进行表连接。
        表连接有多种不同的类型,被主流数据库系统支持的有交叉连接(CROSS JOIN)、内连接(INNER JOIN)、外连接(OUTTER JOIN)

        外连接分为:left join、right join。

    十八、外键约束

      1,如果删除/更新T_Customers一行记录,那么就可能会导致T_Orders中存在CustomerId为非法值的数据,使得程序逻辑错误。
        一般不会更新主键Id的值,所以谈外键约束的时候只谈“删除T_Customers时”

      2,外键约束:当删除T_Customer中一条数据的时候,如何处理T_Orders等存在指向T_Customers外键的行。外键约束建立在外键字段***Id的表上

      3,建外键约束的方法:新建或者修改表的时候“外键”→“添加外键”。
        名字:自动命名即可;栏位名:CustomerId;参考表:t_customers;外栏位名:Id;
        删除时、更新时:一般默认RESTRICT(CASCADE:删除T_Customers一行时把它的订单也删除了;
        SET NULL:删除T_Customers一行时把它的订单CustomerId设置为NULL;NO ACTION/RESTRICT:拒绝删除)。


    十九、扩展学习资料
      1,DDL:

      2,存储过程、触发器、约束、子查询、处理left join之外其他的join


























  • 相关阅读:
    批处理命令系列
    CMD批处理之PC查看连过的WIFI密码
    数据结构与算法之各种方法遍历二叉树
    二叉树同构判定算法
    卡拉兹(Callatz)猜想
    Java之字符串比较大小
    Java报错之StackOverflowError
    火绒勒索病毒诱捕技术浅析
    数据结构与算法之二叉链树
    数据结构与算法之广义表的基本运算
  • 原文地址:https://www.cnblogs.com/DotNetStu/p/7397483.html
Copyright © 2011-2022 走看看