Pulpcode

捕获,搅碎,拼接,吞咽

0%

sql知识总结之子查询

最近sql语句接触的比较多,这里总结一下子查询的相关知识,我使用的数据库是postgres(所以sql语句会与mysql之类的有所不同,字段,表名需要被双引号括住)

但如果是使用方法,那我直接看文档就好了,之所以写成博客,是分享我对子查询的理解方式。

从输入和输出的方式理解子查询。

首先我们要理解,在关系数据库中,始终是对二维表的操作,比如你的SELECT结果是一张表,你的FROM也是要对一张表。

WHERE是一个谓词没错,但是构成这个谓词的,可能需要一个值: WHERE "NAME" = 'aiqier'

或者可能需要一个多行(类似于python的元组): WHERE "Oid" IN (111, 222, 333, 444))

而这些部分,可以被SELECT中的筛选字段所提供,所以只要它们的数据结果类型和他们数据需要类型相一致,就可以看作是将输入输出连接起来,这就是所谓的子查询。

sql

假设有这样两张表,MessageMessageReceive是一对多的关系:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE "Message"
(
"Oid" bigint NOT NULL,
"Subject" character varying(255),
"Information" character varying(100),
CONSTRAINT "PK_Message" PRIMARY KEY ("Oid"),
);

CREATE TABLE "MessageReceive"
(
"Oid" bigint NOT NULL,
"Message" bigint,
"Employee" bigint,
CONSTRAINT "FK_MessageReceive" PRIMARY KEY ("Oid"),
CONSTRAINT "FK_MessageReceive_Message" FOREIGN KEY ("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");

其它说明

  1. 上面介绍的例子可能比较极端,不实用,类似于“谁会写这样的查询”,因为我主要是想解释输入与输出的连接,是子查询的根本
  2. 同理,UPDATEDELETE也有 WHERE部分,可以被子查询链接。