1. 程式人生 > 其它 >mysql中not in 和 not exists不是等價的

mysql中not in 和 not exists不是等價的

技術標籤:踩坑記錄資料庫mysqlsql資料庫

mysql中not in 和 not exists不是等價的

參考網址:

https://blog.csdn.net/yj_445324989/article/details/102576518?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160959460916780262042949%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=160959460916780262042949&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2all

first_rank_v2~rank_v29-8-102576518.first_rank_v2_pc_rank_v29&utm_term=ALL%20%E8%B0%93%E8%AF%8D%E7%94%A8%E4%BA%8E%20NULL%20%E6%88%96%E7%A9%BA%E9%9B%86%E6%97%B6%E4%BC%9A%E5%87%BA%E7%8E%B0%E9%97%AE%E9%A2%98

說明:

sql中查詢重要的三個點

1.子查詢的

exists,in,not in , not exists

2.連線查詢

3.null值的處理

以後準備整理一下這三個點,總結好

1.準備資料庫指令碼

CREATE TABLE Class_A
(name VARCHAR(16) PRIMARY KEY,
 age  INTEGER,
 city VARCHAR(16) NOT NULL );

CREATE TABLE Class_B
(name VARCHAR(16) PRIMARY KEY,
 age  INTEGER,
 city VARCHAR(16) NOT NULL );

INSERT INTO Class_A VALUES('布朗', 22, '東京');
INSERT INTO Class_A VALUES('拉里',   19, '埼玉');
INSERT INTO Class_A VALUES('伯傑',   21, '千葉');

INSERT INTO Class_B VALUES('齊藤',  22,   '東京');
INSERT INTO Class_B VALUES('田尻',  23,   '東京');
INSERT INTO Class_B VALUES('山田',  NULL, '東京');
INSERT INTO Class_B VALUES('和泉',  18,   '千葉');
INSERT INTO Class_B VALUES('武田',  20,   '千葉');
INSERT INTO Class_B VALUES('石川',  19,   '神奈川');

2.比較not in 和 not exists

我們考慮查詢”與B班住在東京的學生年齡不同 的A班學生“。也就是說我們希望查詢到的結果是拉里與伯傑

not in 實現

mysql> select * from class_a
    -> where age not in (select age from class_b where city='東京');
Empty set (0.04 sec)

not exists 實現

mysql> select * from class_a a
    -> where not exists (select * from class_b b where a.age=b.age and b.city='東京');
+--------+------+--------+
| name   | age  | city   |
+--------+------+--------+
| 伯傑   |   21 | 千葉   |
| 拉里   |   19 | 埼玉   |
+--------+------+--------+

3.結論

1.in改寫成exists是等價的

2.not in 子句查詢中用到的表裡被選擇的列中存在null,則SQL語句整體的查詢結果永遠是空,not in和not exists不是等價的