天天看點

資料庫distinct、union、exists等技術總結

一、mysql distinct技術點

1.  建立table:

createtable t1 (id varchar, name varchar);

2.  插入資料:

insertinto t1 values(1,a);

insertinto t1 values(2,b);

insertinto t1 values(3,c);

insertinto t1 values(4,c);

insertinto 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 groupby 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' FROMEMP E WHERE E.DEPT_NO = D.DEPT_NO);  高效

SELECT DEPT_NO,DEPT_NAME FROM DEPT, (SELECT DISTINCT DEPT_NO FROMEMP) 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 DEPTD , 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 fromA)

這個語句中是先從A表中把cc找出來,然後根據cc再在B中去找相關的cc 由于A表的cc遠小于B表的cc 是以可以節省時間。

select * from B exists (select cc from Awhere cc=B.cc)

這句話是先從B表裡把cc找出來 然後再在A表裡找相關的cc  由于B表的cc遠多于A表的cc 是以這樣做很浪費時間。

總結: 外大内小用IN,外小内大用EXISTS

資料庫distinct、union、exists等技術總結文檔    ​​下載下傳​​