约束
主键约束
主键特性
- 非空
- 唯一
- 被引用
当表的某一列被指定为主键后,该列就不能为空,不能有重复值出现
- 创建表时指定主键
方法一:
CREATE TABLE emp( empno INT PRIMARY KEY, ename VARCHAR(20) );
方法二:
CREATE TABLE emp( empno INT, ename VARCHAR(20) PRIMARY KEY(empno) );
指定empno列为主键列,就是为empno列添加主键约束
主键自增长
通常,我们会指定主键列为整型,然后设置自增长,以保证在插入数据时主键列的唯一和非空。
- 创建表时指定主键自增长
CREATE TABLE emp( empno INT PRIMARY KEY AUTO_INCREMENT, ename VARCHAR(20) );
- 修改表时设置主键自增长
ALTER TABLE emp CHANGE empno empno INT AUTO_INCREMENT;
- 修改表时删除主键自增长
ALTER TABLE emp CHANGE empno empno INT;
非空约束
如果某些列不能设置NULL值,那么就可以对该列添加非空约束。
CREATE TABLE emp( empno INT PRIMARY KEY AUTO_INCREMENT, ename VARCHAR(20) NOT NULL );
对 ename 列进行了设置
唯一约束
如果某些列不能设置重复的值,那么就可以对该列添加唯一约束。
CREATE TABLE emp( empno INT PRIMARY KEY AUTO_INCREMENT, ename VARCHAR(20) NOT NULL UNIQUE, age INT );
对 ename 列进行了设置
外键约束
- 外键必须是另一个表的主键的值
- 外键可以重复
- 外键可以为空
修改表时添加外键约束
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept FOREIGN KEY(deptno) REFERENCES dept(deptno);
修改表时删除外键约束
ALTER TABLE emp DROP FOREIGN fk_emp_dept;/*约束名称*/
多表查询
合并结果集
要求被合并的表中,列的类型和数目相同
UNION 去除重复行
UNION ALL 不去除重复行
SELECT * FROM 表1 UNION ALL SELECT * FROM 表2;
SELECT * FROM 表1 UNION SELECT * FROM 表2;
连接查询
内连接
- 方言:
SELECT * FROM 表1 别名1,表2 别名2 WHERE 别名1.xx=别名2.xx;
- 标准:
SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
- 自然:
SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2;
外连接
左外连接
SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能出来。左表中不满足条件的记录,右表部分都为NULL值。
左外自然连接
SELECT * FROM 表1 别名1 NATURAL LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能出来。右表中不满足条件的记录,左表部分都为NULL值。
右外连接
SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
右外自然连接
SELECT * FROM 表1 别名1 NATURAL RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
全外连接
MySQL不支持,但是可以使用 UNION
子查询
查询中有查询
出现位置
- where 后作为条件存在
- from 后作为表存在
条件
- 单行单列
SELECT * FROM 表1 别名1 WHERE 列1 [=,<,>,<=,>=,!=] (SELECT 列 FROM 表2 别名2 WHERE 条件);
- 多行单列
SELECT * FROM 表1 别名1 WHERE 列1 [IN,ALL,ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件);
- 单行多列
SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1,列2 FROM 表2 别名2 WHERE 条件);
- 多行多列
SELECT * FROM 表1 别名1,(SELECT ......) 别名2 WHERE 条件;