DQL
分组函数
用于对一组数据进行运算,也叫聚合函数或统计函数
- sum:求和
- avg: 平均数
- max
- min
- count:计算非空字段值的个数
count补充作用
select count(*) from employees
查询employees 表中的行数,*可以换成任意字符。- 搭配distinct实现去重统计
select count(distinct depermant_id) from employees
查询有员工的部门个数
分组查询
group by
特点:
- 查询列表一般是分组和被分组的字段
- 分组查询中筛选分为两类
分组前:筛选的基表是原始表, 关键词where 在groupby前
分组后:筛选的基表是分组后的结果集,关键词是having 在groupby后
案例:
简单的分组
案例1:查询每个工种的员工平均工资
SELECT AVG(salary) ,job_id 工种
FROM `employees`
GROUP BY job_id
可以实现分组后的筛选
案例1:查询哪个部门的员工个数>5
SELECT COUNT(*) 员工个数 ,department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>5
此处用having,分组函数作为条件就使用having
案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT job_id,MAX(salary)
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000
按多个字段分组
案例:查询每个工种每个部门的最低工资,并按最低工资降序
groupby后可以不止一个字段
SQL99语法
内连接
select 查询列表
from 表1
inner join 表2
on 连接条件
where
- 等值连接
①简单的两表连接
案例:查询员工名和部门名
SELECT last_name,department_name
FROM `employees` e
INNER JOIN `departments` d
ON e.department_id = d.department_id
- 非等值
大于或者小于 - 自连接
外连接
查询主表所有记录,如果有匹配项则显示,没有就显示null
应用场景:查询主表但从表可能没有记录情况
特点
1.外连接分主从表,不能调换
2.左连接就是左边为主表
语法
select
from 表1
left outer join 表2
on
查询哪个部门没有员工,并显示部门编号和部门名
SELECT d.department_id,department_name
FROM `departments` d
LEFT OUTER JOIN `employees` e
ON e.department_id = d.department_id
WHERE e.department_id IS NULL
子查询
分类:
1.按子查询出现的位置进行分类
1.select后面
要求:子查询的结果为单行单列
2.from 后面
可以为多行多列
3.where或者having后面 ⭐
要求:子查询的结果为单列
分为:
单行子查询
多行子查询
4.exist后面
要求:子查询的结果为单列(相关子查询)
单行子查询
嵌套在里面 < > =
多行子查询
in:
any/some:判断某字段的值是否满足其中任意一个
x>any(10,20)
all:判断某字段的值是否满足其中所有
分页查询
limit 起始条目数,显示的条目数
特点:
如果不写默认从起始条目索引从0开始
执行顺序:
from–join–on–where–group by–having–select–order by–limit
查询有奖金的且工资较高的第11到20名
select *
from employees
where commission_pct is not null
order by salary desc
limit 10,10
联合查询
union
用union把两条查询语句联合在一起结果显示在一张表中
创建表
创建表:
CREATE TABLE 表名(
字段名 字段类型 【字段约束】,
字段名 字段类型 【字段约束】,
…
);