MySQL-多表查询

1.内连接

内连接查询:查询两表或多表中交集部分数据。从语法上可以分为隐式内链接、显式内连接。

1.1隐式内连接

语法:

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

where之后的条件为表之间的相关联的字段
示例:

select tb_emp.name , tb_dept.name -- 分别查询两张表中的数据
from tb_emp , tb_dept -- 关联两张表
where tb_emp.dept_id = tb_dept.id; -- 消除笛卡尔积

1.2显式内连接

语法:

select  字段列表   from1  [ inner ]  join2  on  连接条件 ... ;

on之后的连接条件为表之间的关联字段
示例:

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

2.外连接

外连接查询:查询某个表的所有数据,并包含两个表之间的交集数据。分为左外连接和右外连接

2.1左外连接

左外连接相当于查询表1(左表)的所有数据,当然也包含表1和表2交集部分的数据。
语法结构:

select  字段列表   from1  left  [ outer ]  join2  on  连接条件 ... ;

连接条件为表一和表二的关联字段的关系
示例:

select emp.name , dept.name
from tb_emp AS emp left join tb_dept AS dept 
     on emp.dept_id = dept.id;

2.2右外连接

右外连接相当于查询表2(右表)的所有数据,当然也包含表1和表2交集部分的数据。
语法结构:

select  字段列表   from1  right  [ outer ]  join2  on  连接条件 ... ;

示例:

select dept.name , emp.name
from tb_emp AS emp right join  tb_dept AS dept
     on emp.dept_id = dept.id;

3.子查询

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

SELECT  *  FROM   t1   WHERE  column1 =  ( SELECT  column1  FROM  t2 ... );

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

根据结果分类:

  1. 标量子查询(子查询结果为单个值[一行一列])
  2. 列子查询(子查询结果为一列,但可以是多行)
  3. 行子查询(子查询结果为一行,但可以是多列)
  4. 表子查询(子查询结果为多行多列[相当于子查询结果是一张表])

子查询所在的位置:
1.where之后
2.from之后
3.select之后

3.1标量子查询

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。
常用操作符: = <> > >= < <=
示例:

-- 1.查询"教研部"部门ID
select id from tb_dept where name = '教研部';    #查询结果:2
-- 2.根据"教研部"部门ID, 查询员工信息
select * from tb_emp where dept_id = 2;

-- 合并出上两条SQL语句
select * from tb_emp where dept_id = (select id from tb_dept where name = '教研部');

3.2列子查询

子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。

常用操作符:in, not in
示例:

-- 1.查询"销售部"和"市场部"的部门ID
select id from tb_dept where name = '教研部' or name = '咨询部';    #查询结果:3,2
-- 2.根据部门ID, 查询员工信息
select * from tb_emp where dept_id in (3,2);

-- 合并以上两条SQL语句
select * from tb_emp where dept_id in (select id from tb_dept where name = '教研部' or name = '咨询部');

3.3行子查询

子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。

常用的操作符:= 、<> 、IN 、NOT IN

示例:

-- 查询"韦一笑"的入职日期 及 职位
select entrydate , job from tb_emp where name = '韦一笑';  #查询结果: 2007-01-01 , 2
-- 查询与"韦一笑"的入职日期及职位相同的员工信息
select * from tb_emp where (entrydate,job) = ('2007-01-01',2);

-- 合并以上两条SQL语句
select * from tb_emp where (entrydate,job) = (select entrydate , job from tb_emp where name = '韦一笑');

3.4表子查询

子查询返回的结果是多行多列,常作为临时表,这种子查询称为表子查询。
示例:

select * from emp where entrydate > '2006-01-01';

select e.*, d.* from (select * from emp where entrydate > '2006-01-01') e left join dept d on e.dept_id = d.id ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值