mysql中not in 和 not exists不是等價的
阿新 • • 發佈:2021-01-04
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不是等價的