select 分组函数,分组后的字段 ⑤
from 表 ①
【where 筛选条件】 ②
group by 分组的字段 ③
【having 分组后的筛选】 ④
【order by 排序列表】 ⑥
使用关键字 筛选的表 位置
分组前筛选 where 原始表 group by的前面
分组前筛选 having 分组后的结果 group by的后面
当查询中涉及到了多个表的字段,需要使用多个表连接
select 字段1,字段2
from 表1, 表2,…;
笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
如何解决:添加有效的连接条件
按年代分类
sql92:
等值
非等值
自连接
也支持一部分外连接(用于Oracle、SQL server)
sql99:
内连接
等值
非等值
自连接
外连接
左外
右外
全外(MySQL不支持)
交叉连接
语法:
select 查询列表
from 表1 别名,表2 别名
where 表1.key=表2.key
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
特点:
①一般为表起别名
②多表的顺序可以调换
③n表连接至少需要n-1个连接条件
④等值连接的结果时多表的交接部分
语法:
select 查询列表
from 表1 别名,表2 别名
where 非等值连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
语法:
select 查询列表
from 表 别名1,表 别名2
where 等值连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
嵌套在其他语句内部的select语句称为子查询或内查询
外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多
外面如果为select语句,则此语句称为外查询或主查查询
1、按出现位置
select后面:
仅仅支持标量子查询
from后面:
表子查询
where或having后面:
标量子查询
列子查询
行子查询
exists后面:
标量子查询
列子查询
行子查询
表子查询
2、按结果集的行列
标量子查询(单行子查询):结果集为一行一列
列子查询(多行子查询):结果集为多行一列
行子查询:结果集为多行多列
表子查询:结果集为多行多列
where或having
1、标量子查询
案例:查询最低工资的员工姓名和工资
①最低工资
select min(salary)
from employees
②查询员工的姓名和工资,要求工资=①
select last_name,salary
from employees
where salary=(
select min(salary) from employees
);
2、列子查询
案例:查询所有是领导的员工姓名
①查询所有员工的manager_id
select manager_id
from employees;
②查询姓名,employee_id属于①列表的一个
select last_name
from employees
where employee_id in (
select manager_id
from employees
);
当要查询的条目太多,一页显示不全
select 查询列表
from 表
limit 【offset,】size;
注意:
offset代表的是起始的条目索引,默认从0开始
size代表的是显示的条目数
公式:
假如要显示的页数为page,每一页条目数为size
select 查询列表
from 表
limit (page-1)*size,size;
union:合并、联合,将多次查询结果合并成一个结果
查询语句1
union 【all】
查询语句2
union 【all】
…
1、将一条比较复杂的查询语句拆分成多条语句
2、适应于查询多个表的时候,查询的列基本是一致
1、要求多条查询语句的查询列数必须一致
2、要求多条查询语句的查询的各类类型、顺序最后一致
3、union 去重,union all 包含重复项
语法:
select 查询列表 ⑦
from 表1 别名 ①
连接类型 join 表2 ②
on 连接条件 ③
where 筛选 ④
group by 分组列表 ⑤
having 筛选 ⑥
order by 排序列表 ⑧
limit 起始条目索引,条目数 ⑨