我们使用的是PostgreSQL数据库,以下是在审核和优化开发人员SQL时发现的一些问题,现整理共享出来希望对各位有用,每个案例先都构造了一部分数据,然后提一个问题,看是否你能回答出来(记住先不要看运行结果),然后把你的结果和实际结果对比看差异在哪里,一切的答案在执行计划中会告诉你。
案例1:
DROP TABLE IF EXISTS test1;
CREATE TABLE test1(id INT, name VARCHAR(32));
DROP TABLE IF EXISTS test2;
CREATE TABLE test2(id INT, name VARCHAR(32));
INSERT INTO test1 VALUES(1,'A'),(2,'B'),(3,'C'),(4,'D');
INSERT INTO test2 VALUES(1,'A'),(2,'B'),(3,NULL),(4,'DD');
--请问这个语句返回什么结果集
SELECT t1.id,t1.name FROM test1 t1 WHERE t1.name NOT IN (SELECT t2.name FROM test2 t2);
案例2:
DROP TABLE IF EXISTS test1;
CREATE TABLE test1(id INT, name VARCHAR(32));
DROP TABLE IF EXISTS test2;
CREATE TABLE test2(id INT, name VARCHAR(32));
INSERT INTO test1 VALUES(1,'aa'),(2,'bb'),(3,'cc');
INSERT INTO test2 VALUES(2,'aaa'),(3,'bbb');
--请问这个语句返回什么结果集
SELECT a.id,
a.name,
b.id,
b.name
FROM test1 a
LEFT JOIN test2 b
ON a.id = b.id
AND a.name = 'bb';
--请问这个语句返回什么结果集
SELECT a.id,
a.name,
b.id,
b.name
FROM test1 a
LEFT JOIN test2 b
ON a.id = b.id
WHERE b.name = 'bbb';
案例3:
DROP TABLE IF EXISTS test1;
CREATE TABLE test1(id INT, name VARCHAR(32));
DROP TABLE IF EXISTS test2;
CREATE TABLE test2(id INT, name VARCHAR(32));
INSERT INTO test1 VALUES(1,'A'),(2,'B'),(3,'C'),(4,'D');
INSERT INTO test2 VALUES(1,'A'),(1,'B'),(3,NULL),(4,'DD');
--请问这个语句是否会报错
SELECT COUNT(*)
FROM (SELECT t1.id,
(SELECT t2.name FROM test2 t2 WHERE t1.id = t2.id)
FROM test1 t1) t;
案例4:
DROP TABLE IF EXISTS test1;
CREATE TABLE test1(id INT, name VARCHAR(32));
DROP TABLE IF EXISTS test2;
CREATE TABLE test2(id1 INT, name VARCHAR(32));
INSERT INTO test1 VALUES(1,'A'),(2,'B'),(3,'C'),(4,'D');
INSERT INTO test2 VALUES(1,'A'),(1,'B');
--请问这个返回什么结果集
SELECT * FROM test1 WHERE id IN (SELECT id FROM test2);
案例5:
DROP TABLE IF EXISTS test1;
CREATE TABLE test1(id INT);
INSERT INTO test1 VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
--请问这个返回什么结果集
SELECT COUNT(id < 5) FROM test1;