# 多表操作
# 写在前面
多表操作会涉及到 主码,外码,这一块的知识 数据库理论课已经总结过了,这里不再赘述
对已存在表 修改约束用 alter table 表名 add constraint FK_ID foreign key(外键字段名) REFERENCES 外表表名(主键字段名);
即可
删除外码用 alter table 表名 drop foreign key 外键名;
即可
下面进入正题,多表操作
# 交叉连接
返回的结果是被连接的两个表中所有数据行的笛卡尔积即行数的乘积。
SELECT * from 表1 CROSS JOIN 表2; |
PS: 在实际开发中这种业务需求是很少见,一般不会使用交叉连接,而是使用具体的条件对数据进行有目的的查询。
# 内连接
内连接(INNER JOIN)又称简单连接或自然连接,内连接使用比较运算符对两个表中的数据进行比较,列出与连接条件匹配的数据行,组合成新的记录
SELECT 查询字段 FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段 | |
SELECT 查询字段 FROM 表1 ,表2 | |
WHERE 表1.关系字段 = 表2.关系字段 |
例:
在 department 表和 employee 表之间使用内连接查询员工姓名、部门名称。
# 外连接
SELECT 所查字段 FROM 表1 LEFT|RIGHT [OUTER] JOIN 表2 | |
ON 表1.关系字段 = 表2.关系字段 WHERE 条件 |
- 左连接的结果包括 LEFT JOIN 子句中指定的左表的所有记录,和所有满足连接条件的记录
- 右连接与左连接正好相反,返回右表中所有指定的记录和所有满足连接条件的记录
例:
在 department 表和 employee 表之间使用 左 右 连接查询。
# 复合条件连接查询
在 department 表和 employee 表之间使用内连接查询,查询结果按照年龄从大到小进行排序。
# 子查询
子查询是指一个查询语句嵌套在另一个查询语句内部的查询
# 带 IN 关键字的子查询
例:
查询存在年龄为 20 岁的员工的部门信息
# 带 EXISTS 关键字的子查询
EXISTS 关键字后面的参数可以是任意一个子查询,这个子查询的作用相当于测试,
它不产生任何数据,只返回 TRUE 或 FALSE,当返回值为 TRUE 时,外层查询才会执行
例:
查询 employee 表中是否存在年龄大于 21 岁的员工,如果存在,则查询 department 表中的所有记录。
# 带 ANY 关键字的子查询
例:
使用 ANY 关键字的子查询,查询满足条件的部门 (最小)
# 带 ALL 关键字的子查询
例:
使用带 ALL 关键字的子查询,查询满足条件的部门(最大)
# 带比较运算符的子查询
例:
使用带比较运算符的子查询,查询赵四是哪个部门的员工
学习不易,诸君共勉!