数据库学习之MySQL (二十)—— 子查询 (三)SELECT EXIST FROM
前言
这一节其实没啥必要看 因为语法有点晦涩 可读性差 而且都能用我们之前的知识实现相同的效果 性能也没提升
仅做了解
select 语句后面的子查询
注意 仅支持标量子查询
可以用来代替我们之前的分组查询
案例:还是查询每个部门的员工数量
方法一:利用分组查询 COUNT * 统计个数 输出
USE data1;
SELECT
department_id 部门号,
COUNT(*) AS 数量
FROM
employees
GROUP BY department_id
ORDER BY 数量 DESC;
方法二:SELECT
我们看看方法二:
SELECT
d.department_id 部门号,
(SELECT
COUNT(*)
FROM
employees e
WHERE e.department_id = d.department_id) AS 数量
FROM
departments d
ORDER BY 数量 DESC;
实现思路是 先内连接(等值) 统计employees里面 职工的department_id与departments表里面的department_id 是否相同 相同的就计数
之后 再打印出数量以及对应的部门号
注意 两者有区别
第二种方法因为 假设没有任何一个员工的department_id = d.department_id 也就是部门没有一个人
那么他会计数为0 而不是直接删掉这一行(就像第一种方法一样)
第一种是针对员工employees表而言的 表里没有的department_id自然不会出现在结果里
EXIST语句 后面的子查询
EXIST语句其实只是返回True 和 False
也就是 子查询结果有 就返回1 没有任何结果返回0
SELECT
EXISTS
( SELECT
employee_id
FROM
employees
WHERE salary = 30000) AS 结果;
FROM语句后面的子查询
有了这个 我们会在以前 多表查询的基础上再进一步
当然 可以搭配别的查询方法 更灵活
FROM后面跟着的是数据源 毋庸置疑
如果 数据源是另一个数据查询的结果呢?可行吗
当然可以!都是表嘛
我在一个表上继续查询 有何不可?
案例给部门的平均工资划分等级
我们之前多表查询 做过给每个人的工资划分等级的
还记得吗:
传送:数据库学习之MySQL (十四)—— SQL92 内连接 等值连接 非等值连接 自连接
数据库学习之MySQL (十五)—— SQL99 基本格式 内连接 等值连接 非等值连接 自连接
实现效果这样的
当时代码这么写的
USE data1;
SELECT
CONCAT_WS(
'-',
e.`first_name`,
e.`last_name`,
e.`phone_number`
) AS ID,
e.`salary` AS 基本工资,
e.`salary` * (1+ IFNULL(e.`commission_pct`, 0)) AS 总工资,
g.`grade` AS 工资评级
FROM
`employees` e
INNER JOIN `grade-evaluation` g
ON e.`salary` * (1+ IFNULL(e.`commission_pct`, 0)) BETWEEN g.`least` AND g.`most`
ORDER BY 总工资 DESC;
现在 我想把工资变成一个部门的平均工资 很简单 FROM加上 查询一个部门平均工资的语句就OK了:
SELECT
ag_table.*,
g.grade
FROM(
SELECT
AVG(salary) AS 平均工资,
department_id AS 部门编号
FROM
employees
GROUP BY department_id
) ag_table # 一定要给FROM的数据表起别名 否则没法调用!!
INNER JOIN `grade-evaluation` g
ON ag_table.平均工资 BETWEEN `least` AND `most` # 可见 ag_table的别名可以当做变量来用
ORDER BY 部门编号 ASC;
总结
至此 子查询完美收官!
下一站我们来看看两个简单却又非常有用的查询方式 —— 分页查询+联合查询
传送:
上一篇: uniapp的数据缓存