多表查询
select * from 表名1,表名2; -- 会产生笛卡尔积
笛卡尔积:
1.有两个集合A,B,取这两个集合的所有组成情况
2.要完成多表查询,需要消除无用的数据
多表查询的分类:
1.内连接查询
用左边表的记录去匹配右边表的记录,如果符合条件的则显示。如:从表.外键=主表.主键
1.隐式内连接:使用where条件消除无用数据
-- 查找两张表中的数据,当 emp 表的外键 dept_id 与 dept 表中的主键 id 匹配时,显示数据
-- 消除了无用数据
SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;
2.显示内连接:select 字段列表 from 表名1 [inner] join 表名2 on 条件
SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`;
3.注意事项:
1.从哪些表查询数据
2.查询条件是什么
3.查询哪些字段
内连接查询步骤:
1) 确定查询哪些表
2) 确定表连接的条件
3) 确定查询的条件
4) 确定查询的字段
2.外连接查询
1.左外连接
*语法:select 字段列表 from 表1 left [outer] join 表2 on 条件
*查询的是左表所有数据以及其交集部分(在内连接的基础上保证左表的数据全部显示)
SELECT
t1.*,t2.`name`
FROM
dept t2
LEFT JOIN
emp t1
ON
t1.`dept_id` = t2.`id`
2.右外连接
*语法:select 字段列表 from 表1 right [outer] join 表2 on 条件
*查询的是右表所有数据以及其交集部分(在内连接的基础上保证右表的数据全部显示)
SELECT
t1.*,t2.`name`
FROM
dept t2
RIGHT JOIN
emp t1
ON
t1.`dept_id` = t2.`id`
3.子查询
*查询中嵌套查询,成嵌套查询为子查询
-- 查询工资最高的员工信息
SELECT * FROM emp WHERE salary = (SELECT MAX(salary) FROM emp);
*子查询的情况
1.子查询的结果是单行单列的 当成一个数据进行处理
* 子查询可以作为条件,使用运算符去判断。运算符:> < = !=
* 语法:SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
-- 查询工资大于平均工资的员工信息
SELECT * FROM emp WHERE salary > (SELECT AVG(salary) FROM emp);
2.子查询的结果是多行单列的 当成一个集合进行处理
* 子查询可以作为条件,使用运算符去判断。运算符:in
* 语法:SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
-- 查询财务部和市场部的员工信息
SELECT * FROM emp WHERE emp.`dept_id` IN (SELECT id FROM dept WHERE NAME IN('财务部','市场部'));
3.子查询的结果是多行多列的 当成一张虚拟表
* 子查询可以作为一张虚拟表参与查询
* 语法:SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;