使用EXISTS和IN的写出易于理解的SQL语句
我们在使用数据库查询语句时,经常会用到EXISTS和IN这两个关键字,但有些时候使用他们写出的SQL语句并不是很容易理解,接下来让我们探讨一下如何使用EXISTS和IN写出易于理解的SQL语句。
EXISTS的用法
EXISTS通常用于不需要JOIN另外一张表,但需要根据这张表的字段进行筛选时。例如:
// 创建A和B两张表
CREATE TABLE A(Id INT, Pid INT);
CREATE TABLE B(Id INT, Pid INT);
// 向表中插入一些数据
INSERT INTO A (Id, Pid) VALUES (1,0);
INSERT INTO A (Id, Pid) VALUES (2,1);
INSERT INTO A (Id, Pid) VALUES (3,2);
INSERT INTO B (Id, Pid) VALUES (2,1);
INSERT INTO B (Id, Pid) VALUES (3,2);
INSERT INTO B (Id, Pid) VALUES (4,3);
// 从A表中选择A表中和B表中Id相同的记录
SELECT * FROM A
WHERE EXISTS (
SELECT * FROM B
WHERE A.Id = B.Id
AND A.Pid = B.Pid
)
IN的用法
IN用于子查询筛选字段较少,主查询表较大且有索引时。例如:
// 创建A和B两张表
CREATE TABLE A(Id INT, Pid INT);
CREATE TABLE B(Id INT, Pid INT);
// 向表中插入一些数据
INSERT INTO A (Id, Pid) VALUES (1,0);
INSERT INTO A (Id, Pid) VALUES (2,1);
INSERT INTO A (Id, Pid) VALUES (3,2);
INSERT INTO B (Id, Pid) VALUES (2,1);
INSERT INTO B (Id, Pid) VALUES (3,2);
INSERT INTO B (Id, Pid) VALUES (4,3);
// 查询A表中A的Id与B的Id相同的记录
SELECT * FROM A
WHERE Id IN (
SELECT Id FROM B
WHERE A.Id = B.Id
)
EXISTS和IN的用法比较
我们继续使用上面的例子,通过两个例子来对比EXISTS和IN的易于理解性。
- 查询A表中Id等于B表中Pid的记录
// 使用EXISTS
SELECT * FROM A
WHERE EXISTS (
SELECT * FROM B
WHERE A.Id = B.Pid
)
// 使用IN
SELECT * FROM A
WHERE Id IN (
SELECT Pid FROM B
WHERE A.Id = B.Pid
)
2.查询A表中Id等于B表中Id并且Pid等于B表Pid的的记录
// 使用EXISTS
SELECT * FROM A
WHERE EXISTS (
SELECT * FROM B
WHERE A.Id = B.Id
AND A.Pid = B.Pid
)
// 使用IN
SELECT * FROM A
WHERE Id IN (
SELECT Id FROM B
WHERE A.Id = B.Id
AND A.Pid = B.Pid
)
AND Pid IN (
SELECT Pid FROM B
WHERE A.Id = B.Id
AND A.Pid = B.Pid
)
如何用EXISTS和IN写出易于理解的SQL语句
通过对比发现,在子查询条件单一(字段只有一个时),使用IN写出的语句容易理解,使用EXISTS写出的SQL语句需要耗费一点时间去理解。而在查询条件较多时,使用EXISTS可以很直观的看出查询的意图,这时IN的子查询反而不容易理解。