数据库distinct、union、exists等技术总结

一、mysql distinct技术点

1,创建table:

create table t1 (id varchar, name varchar);

2,插入数据:

insert into t1 values(1,a);

insert into t1 values(2,b);

insert into t1 values(3,c);

insert into t1 values(4,c);

insert into t1 values(5,b);

3,查询不重复name:

select distinct name from t1,得到a、b、c

4,查询name和id字段:

select distinct name,id from t1,得到全部数据

即,只有当name和id都相同时,重复的记录才被排除

5,将distinct放在id后:

select id, distinct name from table,结果报错!

6,得到name不重复的每条记录:

select *,count(distinct name) from t1 group by name

二、union union all distinct技术点

1,  union合并后再进行distinct

2,  union all合并后不进行distinct

3,  (a) union = union all + distinct,(b) union != distinct + union all

4,  对于3的理解(a)和(b)的不同在于执行顺序

5,  只有当数据量级小的时候(如千条以下),没有明显的查询效率;当数据量级大时,应采用临时表merge策略替换union,用exists替换distinct

三、用EXISTS替换DISTINCT技术点

1,  示例:

SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E WHERED.DEPT_NO = E.DEPT_NO;   低效

SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT‘X‘ FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);  高效

SELECT DEPT_NO,DEPT_NAME FROM DEPT, (SELECT DISTINCTDEPT_NO FROM EMP) TMP WHERE DEPT.DEPT_NO=TMP.DEPT_NO;  避免使用

2,解析:

当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。

用EXISTS的确可以替代DISTINCT,不过以上方案仅适合DEPT_NO为唯一主键的情况。

3,参考,如果要去掉重复记录,需参照以下方法:

SELECT * FROM EMP WHERE DEPT_NO EXISTS(select Max(DEPT_NO)FROM DEPT D , EMP E WHERE E.DEPT_NO = D.DEPT_NO GROUP BY D.DEPT_NO)

四、IN和EXISTS效率技术点

表A(小表),表B(大表)

select *from B where cc in (select cc from A)

这个语句中是先从A表中把cc找出来,然后根据cc再在B中去找相关的cc 由于A表的cc远小于B表的cc 所以可以节省时间。

select *from B exists (select cc from A where cc=B.cc)

这句话是先从B表里把cc找出来然后再在A表里找相关的cc  由于B表的cc远多于A表的cc 所以这样做很浪费时间。

总结: 外大内小用IN,外小内大用EXISTS

时间: 2024-10-18 17:33:45

数据库distinct、union、exists等技术总结的相关文章

http和数据库sql分析与窃听技术

用tunnel,tunnel是一种技术称谓,将其放到真正的服务器和客户端之间.调试阶段可以使用webcream运行tomcat作为模拟的真正的服务器. 具体:用apache axis及其项目中的工具tcpmon. 但tunnel有个缺点,就是要重新配置客户端和服务器让他们发送请求道tunnel代理. 另: 在RMI协议上的监听:RMI指的是Remote method invocation,即远程过程调用,它是使用java 的JRMP(java remote method protocol)或II

TerarkDB 数据库的性能报告与技术解析

相信很多人都看过火爆的美剧<硅谷>,里面描述的未来科技就是,可以在压缩的数据上作检索,而无需事先将数据解压.在现实中,我们就在研发这种技术.基于这项核心技术,我们对外发布了存储引擎产品 TerarkDB,这个产品具有极高的技术壁垒.我们的目标就是超越 Facebook 的 RocksDB,Google的 LevelDB,MongoDB 的 Wiredtiger,作出世界上性能最好的存储引擎. TerarkDB 简介 TerarkDB 是一个拥有极高性能和数据压缩率的存储引擎.使用方法类似Fac

mysql的InnoDB 数据库引擎TableSpace Exists 问题

Mysql数据库报错: ERROR 1813 (HY000): Tablespace '`coll`.`t1`' exists. 原因:在使用InnoDB引擎的数据库中,所有已经存在的表都使在使用InnoDB引擎的数据库中,所有已经存在的表都使用两个文件保存,假设表名为 t1,则在数据库的数据目录下会有两个文件, (1).frm 文件 数据表定义信息 (2).ibd 文件 数据表内容 处理方法: 在 MySql 5.6之前,这些文件都是可以公用的,如果.frm 文件丢失,则会报这个错,使用一个临

MySql学习(六) —— 数据库优化理论(二) —— 查询优化技术

逻辑查询优化包括的技术 1)子查询优化  2)视图重写  3)等价谓词重写  4)条件简化  5)外连接消除  6)嵌套连接消除  7)连接消除  8)语义优化 9)非SPJ优化 一.子查询优化 1. 什么是子查询:当一个查询是另一个查询的子部分时,称之为子查询. 2. 查询的子部分,包含的情况: a) 目标列位置:子查询如果位于目标列,则只能是标量子查询,否则数据库可能返回类似“错误:子查询只能返回一个字段 ( [Err] 1242 - Subquery returns more than 1

数据库——SQL中EXISTS怎么用2(转)

数据库sql语句的exists总结 sql exists in 学习 先来比较下语法: --deals=交易表,areas=地域表,例如香港:我们的目的:查看有交易的地域 select * from areas where id in (select city_id from deals); select * from areas where id in   (select city_id from deals where deals.city_id = areas.id); select *

20141104数据库join,union

use new go --------常用方法-----查销售部里年龄大于35 的人全部信息------- select *from haha  where age >35 and bumen =(select code from bumen where bumen ='销售部') --------偏方exists(认识她,会用她就好)哈哈哈------------- select *from haha  where age >35 and exists (select * from bume

数据库中union 与union all 的区别

union 将两个表连接后删除其重复的项: union all 将两个表连接都不删除其重复的项. 数据库中,UNION和UNION ALL都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同. UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果.实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION.如: select * from users1 union select * from user2 这个

Java网络编程丶数据库编程丶XML解析技术。

Java网络编程 物理层. 数据链路层. 网络层. 传输层. 会话层. 表示层. 应用层. TCP/IP分层接口包括用于协作层分别完成以下的功能: 网络接口层. 网络互联层. 传输层. 应用层. 套接字: Socket.套接字.是一种抽象层. // 创建客户端Socket向服务器发起连接请求 Socket socket = new Socket("127.0.0.1", 30001); /* 利用已建立的socket创建输入输出流,处理与服务器端的连接 */ // 向服务器写入数据 B

数据库的完整性和恢复技术

一.数据库的完整性 1实体完整性 主码不能为空,且唯一 2参照完整性 被参照表如student表 参照表如sc表 违约处理 可能破坏参照完整性                    ← 插入元组 拒绝(not action) 可能破坏参照完整性                     ← 修改外码值→ 拒绝 删除元组                                   → 可能破坏参照完整性 拒绝.级联删除(cascade).设置为空 修改主码值