1.内连接
内连接查询:查询两表或多表中交集部分数据。从语法上可以分为隐式内链接、显式内连接。
1.1隐式内连接
语法:
select 字段列表 from 表1 , 表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 字段列表 from 表1 [ inner ] join 表2 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 字段列表 from 表1 left [ outer ] join 表2 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 字段列表 from 表1 right [ outer ] join 表2 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.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 ;