MySQL约束,多表查询和子查询

约束

主键约束

主键特性

  1. 非空
  2. 唯一
  3. 被引用

当表的某一列被指定为主键后,该列就不能为空,不能有重复值出现

  1. 创建表时指定主键

方法一:
CREATE TABLE emp( empno INT PRIMARY KEY, ename VARCHAR(20) );

方法二:
CREATE TABLE emp( empno INT, ename VARCHAR(20) PRIMARY KEY(empno) );

指定empno列为主键列,就是为empno列添加主键约束

主键自增长

通常,我们会指定主键列为整型,然后设置自增长,以保证在插入数据时主键列的唯一和非空。

  1. 创建表时指定主键自增长

CREATE TABLE emp( empno INT PRIMARY KEY AUTO_INCREMENT, ename VARCHAR(20) );

  1. 修改表时设置主键自增长

ALTER TABLE emp CHANGE empno empno INT AUTO_INCREMENT;

  1. 修改表时删除主键自增长

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 列进行了设置

外键约束

  1. 外键必须是另一个表的主键的值
  2. 外键可以重复
  3. 外键可以为空

修改表时添加外键约束

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

子查询

查询中有查询

出现位置

  1. where 后作为条件存在
  2. from 后作为表存在

条件

  1. 单行单列

SELECT * FROM 表1 别名1 WHERE 列1 [=,<,>,<=,>=,!=] (SELECT 列 FROM 表2 别名2 WHERE 条件);

  1. 多行单列

SELECT * FROM 表1 别名1 WHERE 列1 [IN,ALL,ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件);

  1. 单行多列

SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1,列2 FROM 表2 别名2 WHERE 条件);

  1. 多行多列

SELECT * FROM 表1 别名1,(SELECT ......) 别名2 WHERE 条件;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值