如鹏网学习笔记(五)MySql基础

时间:2022-05-22 13:37:00

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