MySQL多表查询

多表查询:

从多张表中查询数据

示例:

1
select * from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.id;

内连接:

相当于查询A、B表交集部分的数据

  • 隐式内连接:

    1
    select 字段列表 from 表1,表2 where 条件....;

示例:

1
select tb_emp.name,tb_dept.name from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.id;
  • 显式内连接:

    1
    select 字段列表 from 表1 [inner] join 表2 on 连接条件

示例:

1
select tb_emp.name,tb_dept.name from tb_emp inner join tb_dept on tb_emp.dept_id=tb_dept.id;

外连接:

  • 左外连接:

    查询左表所有数据(包括两张交集部分数据)

    1
    select 字段列表 from 表1 left [outer] join 表2 on 连接条件...;

示例:

1
select tb_emp.name,tb_dept.name from tb_emp left join tb_dept on tb_emp.dept_id=tb_dept.id;
  • 右外连接:

    查询右表所有数据(包括两张表交集部分数据)

    1
    select 字段列表 from 表1 right [outer] join 表2 on 连接条件....;

示例:

1
select tb_emp.name,tb_dept.name from tb_emp right join tb_dept on tb_emp.dept_id = tb_dept.id;

子查询:

SQL语句中嵌套select语句,称为嵌套查询,又称为子查询

形式:

select *from t1 where column1 = (select column1 from t2);

子查询外部的语句可以是insert / update / delete / select 的任何一个,最常见的是select.

  • 标量子查询:

    子查询返回的结果为单个值(数字、字符串、日期等),最简单的形式

    • 常用的操作符:

      = <> > >= < <=

    1
    2
    /*查询部门id为教研部的人员*/
    select * from tb_emp where dept_id = (select id from tb_dept where name = '教研部');
    1
    select * from tb_emp where entrydate>(select entrydate from tb_emp where name='方东白');
  • 列子查询:

    子查询返回的结果是一列(可以是多行)

    • 常用的操作符:

      in,not in等

    1
    select * from tb_emp where dept_id in (select id from tb_dept where name = '教研部' or name='咨询部');
  • 行子查询

    子查询返回的结果是一行(可以是多列)。

    • 常用的操作符号:

      =,<>,in,not,in

    1
    select *from tb_emp where(entrydate,job)=(select entrydate,job from tb_emp where name = '韦一笑');
  • 表子查询:

    子查询返回的结果是多行多列,常作为临时表

    • 常用的操作符:

      in

    1
    select e.*, d.name from (select * from tb_emp where entrydate > '2006-1-1') e ,tb_dept d where e.dept_id = d.id;