数据库回顾(五) 子查询概述

120 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

大家好! 我是慕歌,一只想教你学习 后端技术的野生coder! 欢迎来到慕歌的数据库系列教程,希望通过这个教程带大家深入学习数据库技术,该教程所有知识点均来源于本人的日常学习与开发中,如有疑问请与我联系!

前言

在上一节的学习中,慕歌为大家带来关于聚合函数的分享,聚合函数主要用于对整个数据库表的数据分析。主要包含基础聚合分析函数,统计数据的平均值,总和以及计数。计数函数是特殊的函数,在不同的引擎中具有不同的维护方式,执行效率是不一样的,大家根据自己的数据特点进行选择。对于数据统计还可以通过分组函数,分组函数可以实现对数据的分组处理,分组函数的同时可以添加筛选限制对数据的进一步处理。
在这一节中慕歌带来关于子查询知识的学习,对于特殊的表关系我们需需要采用子查询建立连接。

子查询

子查询概述:

子查询指一个查询语句嵌套于另一条查询语句,一条查询语句能够使用另一条的条件,子查询的作用能够极大的增强查询的作用。

#子查询
SELECT * FROM where (SELECT * FROM where condition);
#一条查询语句在另一条作为的条件
#这里将另一个表作为另一个查询的条件


#示例:
#简单查询:
#查询名字为Abel 的工资
SELECT salary
FROM employees
WHERE last_name = 'Abel';

#判断工资是否大于Abel
SELECT last_name,salary
FROM employees
WHERE salary > 11000;

#子查询:
#通过子查询获取工资大于Abel 的人员工资,名字
SELECT last_name,salary
FROM employees
WHERE salary > (
		SELECT salary
		FROM employees
		WHERE last_name = 'Abel'
		);

这就是子查询的简单概述,通过子查询能够实现简单查询不能达到的效果。

单行子查询:

内子查询:
#基本结构:
SELECT select_list 
FROM tab_name
WHERE exp (SELECT select_list FROM tab_name);

#子查询在主查询之前执行
#子查询被外查询使用

注意:

  • 子查询包含在括号内
  • 子查询在条件的右侧
  • 单行子查询对应单行操作符
比较子查询:
#基本语法
SELECT select_list 
FROM tab_name
WHERE (= / <>) (SELECT select_list FROM tab_name);
#将一个子查询作为另一个子查询的比较结果

#示例:
#返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资
SELECT last_name, job_id, salary
FROM   employees
WHERE  job_id =  
                (SELECT job_id
                 FROM   employees
                 WHERE  employee_id = 141);

比较符可以作为子查询的连接,用于作为判断性的筛选,便于另一条的查询。

分组子查询:
#示例:
#查询分组中最小工资大于工资号为50 的员工信息
SELECT   department_id, MIN(salary)
FROM     employees
GROUP BY department_id
HAVING   MIN(salary) >
                       (SELECT MIN(salary)
                        FROM   employees
                        WHERE  department_id = 50);
#通过分组的条件来筛选数据

注意:

  • 子查询的时候为空值时,不返回数据
  • 子查询非法时,依旧返回异常

多行子查询:

多行比较符:

多行比较符用于对单行子查询的补充,同时引入多个条件,对数据进行更多的聚合。

#多行聚合符:
IN() 任何一个,ANY() 某一个比较,ALL() 满足所有条件,SOME()

#示例:
#查询平均工资最低的部门id
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) <= ALL (
				SELECT AVG(salary) avg_sal
				FROM employees
				GROUP BY department_id
)

建议:

  • 子查询任具有改造空间
  • 子查询可通过自连接进行优化
  • 自连接的查询效率高于子查询

结语

这一章的分享到这里就结束了,下一节中将进入数据库约束的分享学习!
如果您觉得本文不错,欢迎点赞支持,您的关注是我坚持的动力!