MySQL---多表查询

多表查询可分为两大类,一是连接查询,另一种是子查询

准备两张案例表

连接查询

  1. 内连接查询 :相当于查询AB交集数据
  2. 外连接查询
    2.1 左外连接查询 :相当于查询A表所有数据和交集部门数据
    2.2 右外连接查询 : 相当于查询B表所有数据和交集部分数据

** 内连接查询**
内连接相当于查询 A B 交集数据
语法
隐式内连接:SELECT 字段列表 FROM 表1,表2… WHERE 条件;
显式内连接:SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;
案例:查询 emp的 name, gender,dept表的dname
隐式内连接:SELECT emp. NAME, emp.gender,dept.dname FROM emp, dept WHERE emp.dep_id = dept.did;

显式内连接:select * from emp inner join dept on emp.dep_id = dept.did;

外连接查询
语法
左外连接:SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
左外连接:相当于查询A表所有数据和交集部分数据
右外连接:SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
右外连接:相当于查询B表所有数据和交集部分数据
案例:查询emp表所有数据和对应的部门信息(左外连接)
select * from emp left join dept on emp.dep_id = dept.did

查询dept表所有数据和对应的员工信息(右外连接)
select * from emp right join dept on emp.dep_id = dept.did;

子查询
概念:查询中嵌套查询,称嵌套查询为子查询。
案例分析:查询工资高于猪八戒的员工信息。

  1. 第一步:先查询出来 猪八戒的工资
    select salary from emp where name = '猪八戒';
  2. 第二步:查询工资高于猪八戒的员工信息
    select * from emp where salary > 3600;
  3. 第二步中的3600可以通过第一步的sql查询出来,所以将3600用第一步的sql语句进行替换
    select * from emp where salary > (select salary from emp where name = '猪八戒');
    子查询根据查询结果不同,作用不同
  • 子查询语句结果是单行单列,子查询语句作为条件值,使用 = != > < 等进行条件判断
  • 子查询语句结果是多行单列,子查询语句作为条件值,使用 in 等关键字进行条件判断
  • 子查询语句结果是多行多列,子查询语句作为虚拟表
    案例1:查询 '财务部' 和 '市场部' 所有的员工信息
    首先查询 '财务部' 或者 '市场部' 所有的员工的部门did
    select did from dept where dname = '财务部' or dname = '市场部';
    select * from emp where dep_id in (select did from dept where dname = '财务部' or dname = '市场部');
    案例2:查询入职日期是 '2011-11-11' 之后的员工信息和部门信息
    首先查询入职日期是 '2011-11-11' 之后的员工信息
    select * from emp where join_date > '2011-11-11' ;
    将上面语句的结果作为虚拟表和dept表进行内连接查询
    select * from (select * from emp where join_date > '2011-11-11' ) t1, dept where t1.dep_id = dept.did;
posted @ 2023-06-25 13:44  wzh_Official  阅读(12)  评论(0编辑  收藏  举报