SQL

数据类型

  • 最常用的数据类型
    • 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)