一,分组查询
在分组统计的时候,一定会用到分组查询。比如统计每个部门的最低工资,每个部门的员工人数。
分组查询的语法:
select 分组函数,列
from 表
【where 筛选条件】
group by 分组列表
【order by】排序;
例子1查询每个部门的员工人数
SELECT COUNT(*) ,`department_id`
FROM employees
GROUP BY `department_id`;
例子2查询每个部门的最低工资
SELECT MIN(salary) ,`department_id`
FROM employees
GROUP BY `department_id`;
在分组后我们还会遇到筛选条件,需要使用having进行筛选。
例子统计每个部门的员工人数大于10的部门
SELECT COUNT(*) ,`department_id`
FROM employees
GROUP BY `department_id`
HAVING COUNT(*)>10;
两种筛选的关键字对比
1.分组函数做筛选条件一定是在having,where不能出现分组函数
2.能在分组前筛选就放在where中,where一定是在from后面,
二,查询连接
查询链接分类:
sql99语法:
select 查询列表
from 表1 别名【连接类型】
jion 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组列】
【having 筛选条件】
【order by 排序列表】
分类:内连接 :inner 外连接(左外连接:left 【outer】 右外连接 right【outer】 全外连接 full【outer】) 交叉连接 cross
1.内连接
内连接分类:等值连接,非等职连接,自连接。
内连接语法:
等值连接例子:查询员工名,部门号
SELECT last_name,`department_name`
FROM employees e INNER
JOIN departments d
ON e.`department_id` = d.`department_id`;
非等值连接例子:查询员工的工资级别
SELECT salary,grade_level
FROM employees e
JOIN job_grades g
ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`;
自连接例子:查询员工的名字,上级的名字
SELECT e.last_name ,m.manager_id
FROM employees e INNER
JOIN employees m
ON e.`employee_id` = m.`manager_id`;
2.外连接分类 左外,右外,全外
例子1:查询哪个部门没有员工
SELECT d.*,e.`employee_id`
FROM departments d LEFT OUTER
JOIN employees e
ON d.`department_id` = e.`department_id`
WHERE e.`employee_id` IS NULL;
子查询
子查询:出现在其他语句中的select语句,称为子查询或内查询,外部的查询语句,称为主查询或外查询
按照出现的位置分:
select后面:只支持标量子查询
from后面:支持表子查询
where或者having :标量子查询,列子查询,行子查询
exits后面:表子查询
按照结果集的行列数不同
标量子查询 (结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集一行多列)
表子查询(结果集为多行多列)
1.where或者having后面
特点:
(1).子查询一般放在小括号内
(2).子查询一般放在条件的右侧
(3).标量子查询一般搭配单行操作符使用:>,<,=,<>,=>,=<.
(4).列子查询一般搭配只多行操作符使用:in,any,all
例子1:谁的工资必Abel高?(标量子查询)
SELECT salary
FROM employees
WHERE salary>(
SELECT salary
FROM employees
WHERE last_name ='Abel'
);
例子2:返回location_id是1400或1700的部门中的所有员工姓名(列子查询)
SELECT last_name
FROM employees
WHERE department_id <>ALL(
SELECT department_id
FROM departments
WHERE location_id IN (1400,1700)
);
分页查询
分页语法:
select 查询列表
from 表1 别名【连接类型】
jion 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组列】
【having 筛选条件】
【order by 排序列表】
limit 【offset】,size;
ofrrset:表示起始的索引位置,这里的索引位置起始为0,
size:要显示的条目数
limit 放在所有语句的最后
公式:要显示的页数page,每条的条目数size
limit (page-1)*size,size;
例子:显示前五名的员工名
SELECT last_name
FROM employees
LIMIT 0,5;//(如果起始位0则可以省略)
联合查询
union 联合 合并:将多条查询语句的结果合并成一个结果
语法:
查询语句1
union
查询语句2
union
…
例子:查询部门编号>90或邮箱包含a的员工信息
SELECT * FROM employees WHERE email LIKE '%a%'
UNION
SELECT * FROM employees WHERE department_id>90;
特点:
1.要求多条查询语句的查询列数一致
2.要求多条查询语句的查询的每一列的数据类型喝顺序一致
3.union是默认去重,union all可以包含重复项