文章目录
- 重点:SQL执行顺序
- 0. 分组查询
- 1. 表连接
- 1.1. 内连接
- 1.2. 外连接
- 1.3 交叉连接 - 其实就是等值连接
- 2. 子查询
- 2.1 普通子查询
- 2.2 分页查询 - limit无论如何都是最后运行
- 2.3 联合查询
重点:SQL执行顺序
select 查询列 ⑤
from 表名 ①
连接类型 join 表 on 连接条件 ②
where 筛选 ③
group by 分组列 ④
having 分组组内筛选条件 ⑥
order by 排序列 ⑦
limit 起始索引, 记录数 ⑧
0. 分组查询
语法
SELECT 列名
FROM 表
【WHERE 筛选条件】
【GROUP BY 分组的字段、列名
HAVING 分组后的筛选条件
】
ORDER BY 列名
1. 表连接
笛卡儿积:
- 含义:表1有2行数据,表2有3行数据,笛卡儿积连接后的新表有 2*3 = 6 行的数据
- 发生原因:表之间没有任何连接条件,所以避免产生则使用连接条件
# book,dept之间没有任何连接条件,故产生笛卡尔积连接
select book,dept from book,dept;
表连接语法
select 列名
from 表
【连接类型left/right/full/cross】join 表
on 连接条件
where 筛选条件
group by 列名
having 分组后筛选的条件
order by 需要排序的列
1.1. 内连接
内连接
等值连接
非等值连接
自连接
笛卡尔积连接 - 不算内连接
等值连接
SELECT 列名 FROM 表 WHERE 表1.列名 = 表2.名
// 例子 - 下面两者的等值连接效果是一样的
select *
from emp1,dept1
where emp1.deptno = dept1.deptno;
select *
from emp1
【inner】 join dept1
on emp1.deptno = dept1.deptno;
非等值连接
# 举例 - 根据工资查询工资登记
select *
from emp1 inner
join sal_level
on emp1.sal between sal_level.lowersal and sal_level.maxsal;
1.2. 外连接
外连接结果 = 内连接结果 + 内连接没有的主表结果
左连接的主表在左边;同理右连接的主表的右边
外连接
左外连接
右外连接
全外连接
# 查询员工以及员工所属部门 - 没有部门的员工也查询出来
select *
from emp1
left join dept1
on emp1.deptno = dept1.deptno;
1.3 交叉连接 - 其实就是等值连接
等值连接
//查询员工信息
select *
from emp1
cross join dept1
on emp1.deptno = dept1.deptno;
笛卡儿积连接
//查询员工信息
select *
from emp1
cross join dept1
2. 子查询
2.1 普通子查询
主查询、外查询:最外层的select
子查询、内查询:不在最外层的select
子查询放在小括号内,一般放在条件右侧
搭配in、any/some、all
查询
标量子查询:必须保证且明确只有一个数据(一行一列)
列子查询:查询结果只有一列多行数据
行子查询:查询结果为一行多列数据
表子查询:没有限制,即多行多列
语法
select 列名、标量子查询
from 表、标量\列\行子查询
where 筛选条件、标量\列\行子查询
group by 列名
having 分组后筛选条件、标量\列\行子查询
exists 相关子查询、表子查询
例子
# 列子查询 - 查询在研发部工作的职员
select * from emp1
where deptno in ( select deptno
from dept1
where dname like '%研发部%' )
# 标量子查询 - 无论如何肯定是只有一行数据的子查询
select *,( select count(*)
from emp1
where emp1.deptno = dept1.deptno)
from dept1;
# 相关子查询如果有数据行 则返回1 否则返回0
select EXISTS( select * from dept1 )
# 相关子查询 - 查询有员工的部门
select * from dept1
where EXISTS(select * from emp1 where emp1.deptno = dept1.deptno)
2.2 分页查询 - limit无论如何都是最后运行
语法:分页开始索引从0开始
select 查询的列 ⑦
from 表 ①
【连接类型 join on 连接条件】 ②
where 筛选条件 ③
group by 分组列 ④
having 分组后筛选 ⑤
order by 排序字段 ⑥
limit 开始索引,显示的行数; ⑧
// 显示前两行的数据
select *
from emp1
limit 0,2;
2.3 联合查询
语法
select 查询
union
select 查询