SQL

作者: Kevin_Huang54 | 来源:发表于2019-02-15 10:56 被阅读0次

    数据类型

    • 最常用的数据类型
      • int整型
      • varchar字符串
      • float浮点数
      • decimal精确浮点数
      • datetime日期时间

    数据库约束:

    • 五种完整性约束

      • NUT NULL——非空
      • UNIQUE——值唯一
      • PRIMARY KEY——主键
      • FOREIGN KEY——外键
      • CHECK——(MySQL不支持)指定一个表达式,值必须满足该表达式
    • 定义方法

      • 列级约束:字段名 字段类型 约束类型
        id int primary key
      • 表级约束1:创建或修改表时,对已创建的字段添加约束,约束类型(字段名),
        not null(name)
      • 表级约束2:contraint 约束名 约束类型(字段名)
        contraint nn not null(name)

    PRIMARY KEY 主键约束

    • 主键约束就是UNIQUE+NOT NULL,并在该列上建立唯一索引
    • 一个表只能有一个主键约束
    • 可以用列级和表级语句创建
    • 主键约束可以定义名称,但名称无效,主键约束总是命名为PRIMARY
    • 如果主键列是int类型,则可以设置auto_increment自增长

    FOREIGIN KEY 外键约束

    • 一对多,在多的字段增加外键,连接到主表字段

    • 一对一,外键列增加唯一约束即可

    • 多对多,增加一个连接表

    • 定义方法:

      • 列级语法,用references 外表(字段名),但是MySQL不支持
      • 两种表级语法:
        -- foreign key(字段名) references 外表(字段名)
        -- contraint 约束名 foreign key(字段名) references 外表(字段名)
    • 推荐第二种,使用drop删除约束时需要用到约束名

    • 删除主表记录时的处理,在定义外键时在后面增加:

      • on delete cascade,级联删除
      • on delete set null,从表记录的外键设为null

    索引

    • 类似于书后的索引,列举重要知识点并对应页码
    • 以下情况会创建索引
      • 自动创建索引:建立主键约束、唯一约束、外键约束时
      • 手动创建索引
        create index 索引名 on 表名(列名1、列名2……)
    • 索引可以加快某一列的查询速度
    • 但是在增加、删除、修改时增加系统开销,且占据一定磁盘空间

    视图

    • 视图就是一个被命名的查询语句
      create view 视图名 as 查询语句
    • 使用视图和使用数据表是一样的
    • 视图中的数据属于表,不属于视图,当表中数据修改后,应该删除视图后重建

    插入语句

    • 单条插入
      insert into 表名 (字段1,字段2……) values(value1, value2……)

    • 如果省略字段名,则认为是插入所有数据,后面的value要与所有字段对应
      insert into 表名 values(value1, value2……)

      • 如果不愿意写字段名,不插入数据的字段可以设为null
      • 自增长列(例如主键列)要设为null
    • 多条插入
      insert into 表名 (字段1,字段2……) values(value1, value2……),(value1, value2……), ……

    • 带子查询的插入

      • 查询出的数据直接插入
        insert into 表名 (字段1,字段2……) select value1, value2... from 表名 where……

    更新和删除语句

    • 更新语句
      update 表名 set 字段名1=value1, 字段名2=value2…… where 条件
      • 如果没有where,就是set表中所有记录
    • 删除语句
      delete from 表名 where 条件
      • 无需指定列名,因为删除总是删除整行
      • 如果没有where,就是删除所有记录

    单表查询语句

    • 常用语句
      select 字段1,字段2…… from 表名/视图名 where 条件
      select * from 表名/视图名 where 条件

    • select后可以使用表达式

      • 可以由几个字段数据组成
      • 例如查询结果的加减乘除
      • 字符串连接使用concat(String1,String2)
      • 如果其中有null,则返回结果都为null
    • 字段名和表名都可以起别名
      select 字段1 别名1,字段2 别名2…… from 表名/视图名 where 条件

    • distinct表示不显示重复的查询结果
      select distinct 字段1,字段2…… from 表名/视图名 where 条件

    • 关于where

      • 可以使用=、>、>=、<、<=
      • 使用between,where expr between expr1 and expr2,expr可以是常量、字段
      • 使用in,where expr in(expr1、expr2、……),等于其中任意一个
      • 为空,where is null
      • 使用like精确查询,select * from users expr like 'key';
      • 使用like模糊查询,select * from users expr like '%key%';,常用于搜索引擎。
    • 关于排序

    • 查询语句后面加上order by 字段名1 [desc], 字段名2 [desc]

      • 默认是降序,加上desc就是升序

    函数

    • 每种数据库都提供了一些函数,用于常用计算

    • 单行函数例如sin、char_length

    • 多行函数(也就是组函数),例如count(),sum()、min()、max()、avg()

    • 使用count时,null不会计算在内

    • 组函数默认只返回一行

    • 后面加上group by 字段名,可以返回多行,按字段内容分组


    多表查询

    • SQL92

    select 字段1,字段2 from 表1,表2 where 条件,字段如果有同名,需要使用表名.字段名

    • SQL99

    • 使用xxx join连接,from后都只有一个表名,join后才是从表

    • cross join 广义笛卡尔连接
      select * from 表1 cross join 表2;,返回字段数量为字段1*字段2,广义笛卡尔连接不需要任何条件

    • natural join 自然连接
      select * from 表1 natural join 表2;,默认以同名列作为连接条件,如果没有同名列,则等同于cross连接

    • join+using
      select * from 表名 join 表名 using(字段名);,使用指定字段连接, 适合在有多个同名列时使用。如果只有一个同名列,则等同于自然连接。

    • join+on,最常用
      select * from 表名 join 表名 on 条件;

    • left/right join:将左/右表中不符合条件的字段也放入查询条件,没有查询结果的字段设为null

    相关文章

      网友评论

          本文标题:SQL

          本文链接:https://www.haomeiwen.com/subject/bwxyeqtx.html