数据库学习之MySQL (二十)—— 子查询 (三)SELECT EXIST FROM

MySQL学习专栏 正在持续更新中:)

前言

这一节其实没啥必要看 因为语法有点晦涩 可读性差 而且都能用我们之前的知识实现相同的效果 性能也没提升
仅做了解

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;

在这里插入图片描述

总结

至此 子查询完美收官!
下一站我们来看看两个简单却又非常有用的查询方式 —— 分页查询+联合查询
传送:数据库学习之MySQL (二十一)—— 分页查询 联合查询 LIMIT UNION 查询语句执行顺序总结

发布了28 篇原创文章 · 获赞 24 · 访问量 8922

猜你喜欢

转载自blog.csdn.net/weixin_43178828/article/details/104215111