SQL 中 EXISTS 用法详解
时间:2022-07-24
本文章向大家介绍SQL 中 EXISTS 用法详解,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
EXISTS
首先来看一个示例
SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
像列 LIKE 字符串
或者列 BETWEEN 值 1 AND 值 2
这样的谓词需要指定 2 个以上的参数,而 EXIST 的左侧并没有任何参数。因为 EXIST 是只有 1 个参数的谓词。所以,EXIST 只需要在右侧书写 1 个参数,该参数通常都会是一个子查询。如果子查询返回任何行,EXISTS 子查询为 TRUE。
EXISTS 语句是对外表作 loop 循环,每次 loop 循环再对内表进行查询。或许你一直认为 EXISTS 比 IN 语句的效率要高,这种说法是不准确的。
那到底该如何选择呢?
- 如果查询的两个表大小相当,那么用 EXISTS 和 IN 差别不大
- 如果两个表中一个较小,一个是大表,则子查询表大的用 EXISTS,子查询表小的用 IN
来看两个示例,假设 表 t1 为小表,表 t2 为大表
- 子查询为表 t2
select * from t1
where id in (select id from t2)
//效率低,用到了 t1 表上 id 列的索引;
select * from t1
where exists(select id from t2 where id=t1.id)
//效率高,用到了 t2 表上 id 列的索引。
- 子查询为表 t1
select * from t2
where id in (select id from t1)
//效率高,用到了t2 表上 id 列的索引;
select * from t2
where exists(select id from t1 where id=t2.id)
//效率低,用到了 t1 表上 id 列的索引。
上述示例中,在大表查询中使用了索引的用法效率更高。
NOT EXISTS
就像 EXIST 可以用来替换 IN 一样, NOT IN 也可以用 NOT EXIST来替换。
select * from t2
where id not in (select id from t1)
//效率低,内外表都进行全表扫描,不能用到索引;
select * from t2
where not exists(select id from t1 where id=t2.id)
//效率高,用到了 t1 表上 id 列的索引。
如果查询语句使用了 NOT IN 那么内外表都进行全表扫描,没有用到索引;而 NOT EXISTS 的子查询依然能用到表上的索引。所以可以得出结论:
- 所以无论哪个表大,用 NOT EXISTS 都比 NOT IN 要快。
-- END --
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- scRNA-seq Clustering quality control
- Python实战之tkinter库画图,用canver画布教你画卡通人物!
- Python教程之正则表达式(基础篇)
- Python教程之正则表达式(提高篇)
- 【剑指Offer】树的子结构
- 【剑指Offer】合并两个排序的链表
- Python实战之特定文本提取,挑战高效办公的第一步
- 【剑指Offer】调整数组顺序使奇数位于偶数前面
- 【剑指Offer】链表中倒数第 k 个节点
- 【剑指Offer】调整数组顺序使奇数位于偶数前面
- 【剑指Offer】复杂链表的复制
- 【剑指Offer】二叉树中和为某一值的路径
- 【剑指Offer】二叉搜索树的后序遍历序列
- 【剑指Offer】Ⅲ. 从上到下打印二叉树
- scRepertoire||单细胞免疫组库分析:R语言应用(二)