MySQL数据的处理之查询

一,分组查询

在分组统计的时候,一定会用到分组查询。比如统计每个部门的最低工资,每个部门的员工人数。
分组查询的语法:
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可以包含重复项

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值