什么是多表查询?同时查询多张表获取到需要的数据 什么是子查询?一条SELECT语句结果作为另一条SELECT语法一部分(比如是查询条件,查询结果,表)
子查询总结:
子查询需要放在()中
子查询结果的三种情况:
1. 子查询的结果是一个值的时候
2. 子查询结果是单例多行的时候
3. 子查询的结果是多行多列
说明:子查询结果只要是单列,肯定在WHERE后面作为条件。子查询结果只要是多列,肯定在FROM后面作为表。
1.子查询结果只要是单列,肯定在WHERE后面作为条件
子查询结果只要是单列,肯定在WHERE后面作为条件
SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
2.子查询结果是单列多行,结果集类似于一个数组,父查询使用IN运算符
`SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);`
3.子查询结果只要是多列,肯定在FROM后面作为表
SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;
多表查询规律
不管我们查询几张表,表连接查询会产出笛卡尔积,我们需要消除笛卡尔积,拿到正确的数据。
我们需要找到表与表之间通过哪个字段关联起来的(通常是外键=主键)
消除笛卡尔积规律:2张表需要1个条件,3张表需要2个条件,4张表需要3个条件。(条件数量=表的数量-1)
每张表都要参与进来多表连接查询步骤:
1. 确定要查询哪些表
2. 确定表连接条件
3. 确定查询字段
数据准备
演示:
查询所有员工信息。显示员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
- 确定要查询哪些表,emp e, job j, dept d, salarygrade s
SELECT * FROM emp e INNER JOIN job j INNER JOIN dept d INNER JOIN salarygrade s;
SELECT * FROM emp e INNER JOIN job j INNER JOIN dept d INNER JOIN salarygrade s ON e.job_id=j.id AND e.dept_id=d.id AND e.salary BETWEEN s.losalary AND hisalary;
- 确定查询字段:员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
SELECT e.`ename`, e.`salary`, j.`jname`, j.`description`, d.`dname`, d.`loc`, s.`grade` FROM emp e INNER JOIN job j INNER JOIN dept d INNER JOIN salarygrade s ON e.job_id=j.id AND e.dept_id=d.id AND e.salary BETWEEN s.losalary AND hisalary;