SQL 语句可分为以下几类:
- 数据定义语言 DDL(Data Ddefinition Language):即逻辑操作,如
CREATE
,DROP
,ALTER
- 数据查询语言 DQL(Data Query Language):即查询操作,以
SELECT
关键字为主 - 数据操纵语言 DML(Data Manipulation Language):即增删改操作,如
INSERT
,UPDATE
,DELETE
- 数据控制功能 DCL(Data Control Language):即权限控制操作,如
GRANT
,REVOKE
,COMMIT
,ROLLBACK
1、键
- 超键:在关系中,能唯一标识元组的属性集称为关系模式的超键。
一个属性可以作为一个超键,多个属性组合在一起也可以作为一个超键。
超键包含候选键和主键。
- 候选键:是最小超键,即没有冗余元素的超键。
- 主键:数据库表中对储存数据对象予以 唯一和完整标识的数据列或属性的组合。
一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(NULL)。
- 外键:在一个表中存在的另一个表的主键称此表的外键。
外键可以有重复的, 可以是空值。
2、约束
约束是一种简单地强加于表中一列或多列的限制,从而保证表中数据一致性(准确和可靠)。以下为六大约束:
- 非空约束(NOT NULL):保证该字段值一定不为空;
- 默认约束(DEFAULT):保证字段有默认值;
- 主键约束(PRIMARY KEY):标志一列或者多列,并保证其值在表内的唯一性;
- 外键约束(FOREIGN KEY):限制一列或多列中的值必须被包含在另一表的外键列中,并且在级联更新或级联删除规则建立后也可以限制其他表中的可用值;
- 唯一约束(UNIQUE): 限制一列或多列的值,保证字段值在表内的唯一性,可以为空(主键约束是一种特殊类型的唯一约束);
- 检查约束(CHECK):限制一列的可用值范围。
创建约束
- 创建表时,在字段描述处,声明指定字段为主键:
1 | CREATE TABLE persons ( |
- 创建表时,在 constraint 约束区域,声明指定字段为主键:
1 | CREATE TABLE persons ( |
- 创建表之后,通过修改表结构,声明指定字段为主键:
1 | -- 添加联合主键约束 |
删除约束
1 | -- 删除主键约束 |
3、SQL 语句
参考 w3cschool 即可:
增删改查 CRUD
1 | -- 插入 |
关联查询
在项目开发过程中,使用数据库查询语句时,有很多需求都是要涉及到较为复杂或者多表的连接查询,需要关联查询实现。以下为总结的 MySQL 的五种关联查询。
交叉连接(CROSS JOIN)
除了在
FROM
子句中使用 逗号间隔连接的表 外,SQL 还支持另一种被称为交叉连接的操作,它们都返回被连接的两个表所有数据行的 笛卡尔积,返回到的数据行数等于第一个表中符合查询条件的数据行数 乘以 第二个表中符合查询条件的数据行数。惟一的不同在于,交叉连接分开列名时,使用CROSS JOIN
关键字而不是逗号,即以下两个表达式等价:SELECT * FROM A, B
SELECT * FROM A CROSS JOIN B
内连接(INNER JOIN)
内连接分为三类,分别是 等值连接:
ON A.id = B.id
、不等值连接:ON A.id > B.id
和 自连接:SELECT * FROM A T1 INNER JOIN A T2 ON T1.id = T2.pid
外连接(LEFT JOIN/RIGHT JOIN)
左外连接:以左表为主,先查询出左表,按照
ON
后的关联条件匹配右表,没有匹配到的用NULL
填充,可以简写成LEFT JOIN
右外连接:以右表为主,先查询出右表,按照ON
后的关联条件匹配左表,没有匹配到的用NULL
填充,可以简写成RIGHT JOIN
联合查询(UNION 与 UNION ALL)
SELECT * FROM A UNION SELECT * FROM B UNION …
联合查询就是把多个结果集集中在一起,
UNION
前的结果为基准,需要注意的是联合查询的 列数要相等,相同的记录行会合并;如果使用
UNION ALL
,不会合并重复的记录行,所以效率更高。全连接(FULL JOIN)
MySQL 本身不支持全连接,但可以通过联合使用
LEFT JOIN
、UNION
和RIGHT JOIN
来实现。SELECT * FROM A LEFT JOIN B ON A.id = B.id UNIONSELECT * FROM A RIGHT JOIN B ON A.id = B.id
1 | -- join |
子查询
多条 MySQL 语句嵌套使用时,内部的 MySQL 查询语句称为子查询。
子查询是一个 SELECT
语句,它嵌套在另一个 SELECT
、SELECT…INTO
语句、INSERT…INTO
语句、DELETE
语句、 UPDATE
语句或嵌套在另一子查询中。
MySQL 的子查询是多表查询的一个重要组成部分,常常和 连接查询 一起使用,是多表查询的基础。
子查询分为以下四类:
标量子查询
查询返回单一值的标量,如一个数字或一个字符串,是子查询中最简单的形式。
列子查询
子查询返回的结果集是 N 行一列,该结果通常来自对表的 某个字段 查询返回。
行子查询
子查询返回的结果集是一行 N 列,该结果通常是对表的 某行数据 进行查询而返回的结果集
表子查询
子查询返回的结果集是 N 行 N 列的一个表数据。
1 | -- where |
排序和分组
ORDER BY
:用于对结果集进行排序。ASC
:升序(默认)DESC
:降序
- 可以按多个列进行排序,并且为每个列指定不同的排序方式
GROUP BY
:将记录分组到汇总行中- 为每个组返回一个记录
- 按分组字段进行排序后,
ORDER BY
可以以汇总字段来进行排序
HAVING
:对汇总的GROUP BY
结果进行过滤- 要求存在一个
GROUP BY
子句
- 要求存在一个
WHERE
和HAVING
都是用于过滤。
HAVING
适用于汇总的组记录;而 WHERE 适用于单个记录。
1 | -- order by:DESC 递减 |
More
Char 与 Varchar 的区别
- char 表示定长字符串,长度是固定的,最多能存放的字符个数为 255,和编码无关;而 varchar 表示可变长字符串,长度是可变的,最多能存放的字符个数为 65532;
- 使用 char 时,如果插入数据的长度小于 char 的固定长度时,则用空格填充;
- 因为固定长度,char 的存取速度比 varchar 快很多,同时缺点是会占用多余空间,属于空间换时间;
DROP、DELETE 与 TRUNCATE 的区别
DROP | DELETE | TRUNCATE | |
---|---|---|---|
SQL 语句类型 | DDL | DML | DDL |
回滚 | 不可回滚 | 可回滚 | 不可回滚 |
删除内容 | 从数据库中 删除表,所有的数据行,索引和权限也会被删除 | 表结构还在,删除表的 全部或者一部分数据行 | 表结构还在,删除表中的 所有数据 |
删除速度 | 删除速度最快 | 删除速度慢,需要逐行删除 | 删除速度快 |
在不再需要一张表的时候,采用
DROP
在想删除部分数据行时候,用DELETE
在保留表而删除所有数据的时候用TRUNCATE
UNION 与 UNION ALL 的区别
UNION
用于把来自多个SELECT
语句的结果组合到一个结果集合中,MySQL 会把结果集中 重复的记录删掉UNION ALL
,MySQL 会把所有的记录返回,且效率高于UNION