MySQL 嵌套查询数据

一、定义

  1. 在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。
  2. 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING子句的条件中的查询称为嵌套查询。
  3. 上层的查询块称为外层查询或者父查询,下层的查询块称为内层查询或子查询。
SELECT 姓名
	FROM XS
	WHERE 借书证号 IN
		(SELECT 借书证号
			FROM JY
			WHERE ISBN ='978-7-111-21382-6'
		)

注意:

  1. 嵌套查询一般的求解方法是由内而外处理。
  2. 子查询的SELECT语句中不能包含ORDER BY子句,ORDER BY子句只能对最终查询结果进行排序。

二、IN子查询

EX:查询与“李明”在同一个专业的学生信息

  1. 分布查询

(1)先查询李明的专业:

SELECT 专业
	FROM XS
	WHERE 姓名='李明'

(2)该查询结果为“计算机”。在查询“计算机”专业的学生信息:

SELECT 借书证号,姓名,性别,出生时间,借书量
	FROM XS
	WHERE 专业='计算机'
  1. 嵌套查询

构造嵌套查询语句如下:

SELECT 借书证号,姓名,性别,出生时间,借书量
	FROM XS
	WHERE 专业 IN
		(SELECT 专业
			FROM XS
			WHERE 姓名='李明'
		)

三、比较子查询

比较子查询是指父查询与子查询之间用比较运算符(<, <=, =, >, >=, !=, <>, !< 和 !>)进行关联。

  1. 如果子查询的结果是一个值的话,可以使用=代替IN:
SELECT 借书证号,姓名,性别,出生时间,借书量
	FROM XS
	WHERE 专业 =
		(SELECT 专业
			FROM XS
			WHERE 姓名='李明'
		)
  1. ALL指定表达式要与子查询结果就中的每一个值都进行比较,当表达式与每个值都满足比较的关系是,才返回TRUE,否则返回FALSE。

EX:查找其他专业比所有通信工程专业的同学年龄都小的学生:

SELECT *
	FROM XS 
	WHERE 专业<>'通信工程' AND 出生时间>ALL
		(SELECT 出生时间
			FROM XS
			WHERE 专业='通信工程'
		)
  1. SOME 或 ANY表示表达式只要与子查询结构集中的某个值满足比较条件时,返回TRUE,否则返回FALSE。

EX:查找其他专业比所有计算机专业某个学生年龄小的学生:

(1)首先找出“计算机”专业所有学生的出生时间,构成一个集合;然后找出所有不是“计算机”专业且出生时间比上述集合中任一个值小的学生。

SELECT *
	FROM XS 
	WHERE 专业<>'计算机' AND 出生时间>ANY 
		(SELECT 出生时间
			FROM XS
			WHERE 专业='计算机'
		)

(2)首先查询找出“计算机”专业中“出生时间”最小值,然后再找出非“计算机”专业且“出生时间”值大于上述最小值的学生。

SELECT *
	FROM XS 
	WHERE 专业<>'计算机' AND 出生时间>
		(SELECT (MIN)出生时间
			FROM XS
			WHERE 专业='计算机'
		)

注意: 通常,使用聚合函数实现子查询比直接用ANY 或 ALL 查询效率更高。

四、EXISTS子查询

EXISTS谓词用于测试子查询的结果是否为空值,若子查询的结果集不为空,则EXISTS 返回TRUE,否则返回FALSE 。

EX:查找借阅了ISBN为978-7-111-21382-6图书的学生姓名。

SELECT 姓名
	FROM XS 
	WHERE EXISTS
		(SELECT *
			FROM JY
			WHERE XS.借书证号=JY.借书证号 AND ISBN='978-7-111-21382-6'
		)

你可能感兴趣的:(数据库)