文章目录

    • 多表查询
      • 3.1 内连接查询
      • 3.2 外连接查询
      • 3.3 子查询
    • 最后说一句

多表查询

3.1 内连接查询

  • 语法
-- 隐式内连接SELECT 字段列表 FROM1,2WHERE 条件;-- 显示内连接SELECT 字段列表 FROM1 [INNER] JOIN2 ON 条件;

内连接相当于查询 A B 交集数据

  • 案例

    • 隐式内连接

      SELECT*FROMemp,deptWHEREemp.dep_id = dept.did;

      执行上述语句结果如下:

    • 查询 emp的 name, gender,dept表的dname

      SELECTemp. NAME,emp.gender,dept.dnameFROMemp,deptWHEREemp.dep_id = dept.did;

      执行语句结果如下:

      上面语句中使用表名指定字段所属有点麻烦,sql也支持给表指别名,上述语句可以改进为

      SELECTt1. NAME,t1.gender,t2.dnameFROMemp t1,dept t2WHEREt1.dep_id = t2.did;
    • 显式内连接

      select * from emp inner join dept on emp.dep_id = dept.did;-- 上面语句中的inner可以省略,可以书写为如下语句select * from empjoin dept on emp.dep_id = dept.did;

      执行结果如下:

3.2 外连接查询

  • 语法

    -- 左外连接SELECT 字段列表 FROM1 LEFT [OUTER] JOIN2 ON 条件;-- 右外连接SELECT 字段列表 FROM1 RIGHT [OUTER] JOIN2 ON 条件;

    左外连接:相当于查询A表所有数据和交集部分数据

    右外连接:相当于查询B表所有数据和交集部分数据

  • 案例

    • 查询emp表所有数据和对应的部门信息(左外连接)

      select * from emp left join dept on emp.dep_id = dept.did;

      执行语句结果如下:

      结果显示查询到了左表(emp)中所有的数据及两张表能关联的数据。

    • 查询dept表所有数据和对应的员工信息(右外连接)

      select * from emp right join dept on emp.dep_id = dept.did;

      执行语句结果如下:

      结果显示查询到了右表(dept)中所有的数据及两张表能关联的数据。

      要查询出部门表中所有的数据,也可以通过左外连接实现,只需要将两个表的位置进行互换:

      select * from dept left join emp on emp.dep_id = dept.did;

3.3 子查询

  • 概念

    查询中嵌套查询,称嵌套查询为子查询。

    什么是查询中嵌套查询呢?我们通过一个例子来看:

    需求:查询工资高于猪八戒的员工信息。

    来实现这个需求,我们就可以通过二步实现,第一步:先查询出来 猪八戒的工资

    select salary from emp where name = '猪八戒'

    第二步:查询工资高于猪八戒的员工信息

    select * from emp where salary > 3600;

    第二步中的3600可以通过第一步的sql查询出来,所以将3600用第一步的sql语句进行替换

    select * from emp where salary > (select salary from emp where name = '猪八戒');

    这就是查询语句中嵌套查询语句。

  • 子查询根据查询结果不同,作用不同

    • 子查询语句结果是单行单列,子查询语句作为条件值,使用 = != > < 等进行条件判断
    • 子查询语句结果是多行单列,子查询语句作为条件值,使用 in 等关键字进行条件判断
    • 子查询语句结果是多行多列,子查询语句作为虚拟表
  • 案例

    • 查询 ‘财务部’ 和 ‘市场部’ 所有的员工信息

      -- 查询 '财务部' 或者 '市场部' 所有的员工的部门didselect did from dept where dname = '财务部' or dname = '市场部';select * from emp where dep_id in (select did from dept where dname = '财务部' or dname = '市场部');
    • 查询入职日期是 ‘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;

最后说一句

感谢大家的阅读,文章通过网络资源与自己的学习过程整理出来,希望能帮助到大家。

才疏学浅,难免会有纰漏,如果你发现了错误的地方,可以提出来,我会对其加以修改。