Mysql的子查询和联合查询

本文介绍了SQL中的几种高级查询技术,包括IN子查询用于筛选满足特定集合条件的记录,比较子查询允许使用比较运算符与子查询结果进行比较,EXISTS子查询关注子查询是否返回行,以及联合查询(UNION)用于合并多个查询的结果。这些技术在数据库管理和数据分析中非常实用。
摘要由CSDN通过智能技术生成

IN子查询

在IN子查询中,使用IN谓词实现子查询和父查询的连接。

语法格式:

<表达式> [ NOT ] IN ( <子查询>)

说明:

在IN子查询中,首先执行括号内的子查询,再执行父查询,子查询的结果作为父查询的查询条件。

当表达式与子查询的结果集中的某个值相等时,IN关键字返回TRUE,否则返回FALSE;若使用了NOT,则返回的值相反。

比较子查询

比较子查询是指父查询与子查询之间用比较运算符进行关联。

语法格式:

<表达式> { < | <= | = | > | >= | != | <>  } { ALL | SOME | ANY } ( <子查询> )

说明:

关键字ALL、SOME和ANY用于对比较运算的限制,ALL指定表达式要与子查询结果集中每个值都进行比较,当表达式与子查询结果集中每个值都满足比较关系时,才返回TRUE,否则返回FALSE;SOME和ANY指定表达式要只要与子查询结果集中某个值满足比较关系时,就返回TRUE,否则返回FALSE。

EXISTS子查询 

在EXISTS子查询中,EXISTS谓词只用于测试子查询是否返回行,若子查询返回一个或多个行,则EXISTS返回TRUE,否则返回FALSE,如果为NOT EXISTS,其返回值与EXIST相反。

语法格式:

[ NOT ] EXISTS ( <子查询> )

说明:

在EXISTS子查询中,父查询的SELECT语句返回的每一行数据都要由子查询来评价,如果EXISTS谓词指定条件为TRUE,查询结果就包含该行,否则该行被丢弃。

【例6.31】查询选修1004课程的学生姓名。

mysql> SELECT sname AS 姓名

    -> FROM student

    -> WHERE EXISTS

    ->     (SELECT *

    ->      FROM score

    ->      WHERE score.sno=student.sno AND cno='1004'

    ->     );

查询结果:

+----------+

| 姓名      |

+----------+

| 刘清泉  |

| 张慧玲  |

| 冯涛      |

+----------+

3 rows in set (0.00 sec)

联合查询

联合查询将两个或多个SQL语句的查询结果集合并起来,利用联合进行查询处理以完成特定的任务,使用UNION关键字,将两个或多个SQL查询语句结合成一个单独SQL查询语句。

联合查询的基本语法如下:

语法格式:

<SELECT查询语句1>

{UNION | UNION ALL }

<SELECT查询语句2>

UNION语句将第一个查询中的所有行与第二个查询的所有行相加。不使用关键字ALL,消除重复行,所有返回行都是唯一的。使用关键字ALL,不去掉重复记录,也不对结果自动排序。

在联合查询中,需要遵循的规则为:

在构成联合查询的各个单独的查询中,列数和列的顺序必须匹配,数据类型必须兼容。

ORDER BY子句和LIMIT子句,必须置于最后一条SELECT语句之后。

【例6.32】查询性别为女及选修了课程号为4002的学生。

mysql> SELECT sno, sname, ssex

    -> FROM student

    -> WHERE ssex='女'

    -> UNION

    -> SELECT a.sno, a.sname, a.ssex

    -> FROM student a, score b

    -> WHERE a.sno=b.sno AND b.cno='4002';

查询结果:

+----------+----------+------+

| sno         | sname   | ssex  |

+----------+----------+------+

| 191002  | 张慧玲  | 女     |

| 196001  | 董明霞  | 女     |

| 196002  | 李茜      | 女     |

| 196004  | 周俊文  | 男     |

+----------+----------+------+

4 rows in set (0.05 sec)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值