暑期自学 Day 13 | 数据库 (六)- 多表查询
内连接
隐式内连接
- 使用 where 关键字消除无用数据
- 例子:
SELECT t1.name, -- 员工姓名 t1.gender, -- 员工性别 t2.name, -- 部门名称 FROM emp t1, -- 员工表命名为t1 dept t2, -- 部门表命名为t2 WHERE t1.`dept_id` = t2.`id`; -- 员工表中部门id和部门表主键id匹配
显式内连接
SELECT 字段 FROM 表名1 INNER JOIN 表名2 ON 条件
- 例子
SELECT * FROM emp t1 INNER JOIN dept t2 ON t1.`dept_id` = dept.`id`;
外连接
- 左外连接
- 查询左表所有数据和其交集部分
SELECT 字段 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
- 右外连接
- 查询右表所有数据和其交集部分
SELECT 字段 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
- 如果所查询数据和另一表交集为空,则相应的列数据显示为 NULL
子查询
- 查询中嵌套查询
- 例:查询工资最高的员工信息
SELECT emp.`id`, emp.`name` FROM emp WHERE emp.`salary` = (SELECT max(salary) FROM emp);
子查询不同情况
结果单行单列
- 看上面的例子
结果多行单列
- 例子:查询财务部和市场部所有员工信息。由于要查两个部门,需要用到 IN 关键词限定部门的范围
SELECT emp.`id`, emp.`name` FROM emp WHERE dept.`id` IN -- 多行查询的关键,查询出这两个部门的信息 SELECT dept.`id` FROM dept WHERE dept.`name` = `财务部` OR dept.`name` = `市场部`;
- 例子:查询财务部和市场部所有员工信息。由于要查两个部门,需要用到 IN 关键词限定部门的范围
结果多行多列
用子查询创建一张虚拟表参与查询
例子:查询2011年11月11日后入职的员工信息和部门信息
子查询
SELECT * FROM dept t1, SELECT * FROM emp WHERE emp.`join_date` > `2011-11-11` t2 WHERE t1.`id` INNER JOIN t2.`dept_id`;
普通内连接
SELECT * FROM emp t1, dept t2 WHERE t1.`dept_id` = t2.`id` AND t1.`join_date` > `2011-11-11`;
本作品采用《CC 协议》,转载必须注明作者和本文链接