最近sql语句接触的比较多,这里总结一下子查询的相关知识,我使用的数据库是postgres
(所以sql语句会与mysql之类的有所不同,字段,表名需要被双引号括住)
但如果是使用方法,那我直接看文档就好了,之所以写成博客,是分享我对子查询的理解方式。
从输入和输出的方式理解子查询。
首先我们要理解,在关系数据库中,始终是对二维表的操作,比如你的SELECT
结果是一张表,你的FROM
也是要对一张表。
WHERE
是一个谓词没错,但是构成这个谓词的,可能需要一个值: WHERE "NAME" = 'aiqier'
或者可能需要一个多行(类似于python的元组): WHERE "Oid" IN (111, 222, 333, 444))
而这些部分,可以被SELECT
中的筛选字段所提供,所以只要它们的数据结果类型和他们数据需要类型相一致,就可以看作是将输入输出连接起来,这就是所谓的子查询。
假设有这样两张表,Message和MessageReceive是一对多的关系:
1 | CREATE TABLE "Message" |
例子1: 将WHERE部分用子查询替换
1 | SELECT * FROM "MessageReceive" WHERE "Message" IN (SELECT "Oid" FROM "Message" WHERE "Subject" = '会议室申请'); |
例子2: 将SELECT部分用子查询替换(注意区分,哪个Message是指字段,哪个Message是指表)
1 | SELECT "Oid", (SELECT "Subject" FROM "Message" WHERE "Message"."Oid" = "Message") FROM "MessageReceive" WHERE "Message" = 200000010256; |
例子3: 将FROM部分用子查询替换(子查询返回了一张新表):
1 | SELECT "Message" FROM (SELECT "Message","Oid" FROM "MessageReceive" WHERE "Employee" = 200000010256) AS "NewMessageReceive"); |
其它说明
- 上面介绍的例子可能比较极端,不实用,类似于“谁会写这样的查询”,因为我主要是想解释输入与输出的连接,是子查询的根本。
- 同理,
UPDATE
和DELETE
也有WHERE
部分,可以被子查询链接。