相较于 in,exists 其实没有特别高频的使用。exists 语句并不那么容易读。今天我们来使用一下:
mock data
CREATE TABLE `users` ( |
插入测试数据:
INSERT INTO `users`(id, name) VALUES(1, 'sai'); |
判断是否存在
我们使用 exists 判断某条记录是否存在:
mysql> select exists (select * from `users` where id = 1); |
子查询
exists 更多用于子查询:
SELECT * FROM `user_logs` |
你知道会输出什么吗?
当我第一次看到这个语句时是这么理解的, where 后面的是1,所以会列出所有的 user_logs
。
显然我的理解是:
SELECT * FROM `user_logs` |
但输出打脸了 😢
+----+---------+-----------------+---------------------+ |
其实上面的语句与下面的语句结果一致的。
SELECT * FROM `user_logs` |
SELECT `user_logs`.* FROM `user_logs` |
in 还是 exists
对于很多博客中提到的 in 适合于外表大而子查询表小的情况,exists 适合于外表小而子查询表大的情况
,其实并不准确。MySQL 手册中提到,如果没有使用 materialization ,优化器又是会重写查询,即可能会将 in 转成 exists。那么这种情况性能其实是没什么差别的。但是给大表加索引一般是有效的。