使用SQL DISTINCT刪除重複資料項

2022-09-19 04:54:08 字數 3837 閱讀 2194

在本教程中,我們將學習如何使用sqldistinct運算子從結果集中刪除重複資料項。

1. sql distinct運算子簡介

主鍵確保表沒有重複的行。 但是,當您使用select語句查詢表中的一部分列時,可能會得到重複資料項。

要從結果集中刪除重複資料項,請在select子句中插入distinct運算子,如下所示:

select distinct

column1, column2, ...

from

table1;

如果在distinct運算子後使用一列,則資料庫系統使用該列來計算重複。 如果使用兩列或更多列,資料庫系統將使用這些列的組合進行重複檢查。

要刪除重複項,資料庫系統首先按select子句中指定的每個列對結果集進行排序。 然後,它從上到下掃瞄表,以識別彼此相鄰的重複項。 如果結果集很大,則排序和掃瞄操作可能會降低查詢的效能。

2. sql distinct示例

我們將使用示例資料庫中的employees表來演示distinct運算子的工作原理。

3. sql distinct一列示例

以下語句從employees表中檢索薪水資料,並按降序對其進行排序。

select 

salary

from

employees

order by salary desc;

執行上面查詢語句,得到以下結果 -

+--------+

| salary |

+--------+

| 24000 |

| 17000 |

| 17000 |

| 14000 |

| 13500 |

| 13000 |

... ...

如上所見,有重複的薪資資料,例如17,000,因為兩個或更多員工的薪水相同。 要刪除重複項,請將distinct運算子新增到select子句,如下所示:

select 

distinct salary

from

employees

order by salary desc;

執行上面查詢語句,得到以下結果 -

+--------+

| salary |

+--------+

| 24000 |

| 17000 |

| 14000 |

| 13500 |

| 13000 |

| 12000 |

... ...

現在,從結果集中刪除所有重複項。

4. sql distinct多列示例

以下語句從employees表中檢索job_idsalary列的資料。

select

job_id,

salary

from

employees

order by

job_id,

salary desc;

執行上面查詢語句,得到以下結果 -

+--------+--------+

| job_id | salary |

+--------+--------+

| 1 | 8300 |

| 2 | 12000 |

| 3 | 4400 |

| 4 | 24000 |

| 5 | 17000 |

| 5 | 17000 |

... ...

上面查詢結果集中,有兩行記錄相同:job_id5salary17000兩行記錄。

現在,如果將distinct運算子新增到select子句,則資料庫系統將使用job_idsalary列中的值來計算重複項。 它只保留乙個行記錄,如上面的螢幕截圖所示。

select distinct

job_id,

salary

from

employees

order by

job_id,

salary desc;

執行上面查詢語句,得到以下結果 -

+--------+--------+

| job_id | salary |

+--------+--------+

| 1 | 8300 |

| 2 | 12000 |

| 3 | 4400 |

| 4 | 24000 |

| 5 | 17000 |

| 6 | 9000 |

| 6 | 8200 |

......

5. sql distinct和null值

null值在sql中是乙個特別的值。 它在某些情況下用作標記,比如:缺少資訊或資訊不適用。 因此,null無法與任何值進行比較。 即使null也不等於它自己。 如果列中有兩個或多個null值,資料庫系統是否將它們視為相同或不同的值?

通常,distinct運算子將所有null值視為相同的值。 因此在結果集中,distinct運算子只保留乙個null值,並從結果集中刪除其它的null值。

以下語句返回員工的不同**號碼。

select distinct

phone_number

from

employees;

執行上面查詢語句,得到以下結果 -

+----------------+

| phone_number |

+----------------+

| 0532-86011111 |

| 0551-4243311 |

| 0571-87622362 |

......

| null |

| 0351-2233611 |

| 021-66050000 |

| 010-67237328 |

| 0755-28114518 |

| 0755-83587526 |

| 0513-83512816 |

| 0898-31686222 |

| 022-26144822 |

+----------------+

34 rows in set

請注意,它只返回乙個null值。

在本教程中,您學習了如何使用distinct運算子從結果集中刪除重複的行。

sql distinct 多列問題

查詢單列,使用select distinct name from photos 是沒有問題的。但若想查詢多列,如select distinct name,nickname,department from photos 是將三列完全相同的內容過濾掉,但凡三列有一列不同,均會列出來。若將distinct...

SQL DISTINCT 用法(去重)

現在以下資料 查有出現的teacherid 1 select teacherid from studentview code 結果 有重複的id出現 確實查法 1 select teacherid from student 2 group by teacherid view code 1 selec...

SQL Distinct處理多列的問題

今天在做ssis的etl工作時,其中乙個left join元件的執行結果總是會多出一些記錄。分析了一下,該問題的原因是右表中作為關聯的那一列資料有重複。left join的執行策略可以理解為根據左表的每一條記錄的關聯欄位去對照右表的關聯字段,如果右表的關聯字段存在重複,就會生成重複的記錄。如果左表存...