Исключение дубликатов, оператор DISTINCT
В некоторых ситуациях SQL запрос на выборку может возвращать повторяющиеся строки данных.
Например, давайте выведем поле class из таблицы Student_in_class из базы данных, в которой организовано хранение информации о расписании занятий в школе.
SELECT class FROM Student_in_class;
class |
---|
9 |
9 |
9 |
9 |
9 |
9 |
9 |
9 |
9 |
9 |
9 |
9 |
9 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
8 |
6 |
6 |
6 |
6 |
6 |
6 |
6 |
6 |
6 |
6 |
6 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
4 |
4 |
4 |
4 |
4 |
4 |
4 |
4 |
4 |
3 |
3 |
3 |
3 |
3 |
3 |
3 |
3 |
2 |
2 |
2 |
2 |
2 |
2 |
2 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
Поскольку в одном классе возможно нахождение нескольких студентов, то не удивительно, что при выводе мы можем наблюдать одинаковые значения. Чтобы при выборке избежать такого дублирования, есть оператор DISTINCT.
SELECT [DISTINCT] поля_таблиц FROM наименование_таблицы;
То есть в нашем случае запрос на получение уникальных классов, в которых есть хотя бы один студент, будет выглядеть следующим образом:
SELECT DISTINCT class FROM Student_in_class;
class |
---|
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
При использовании оператора DISTINCT для двух и более колонок будут удаляться записи, которые имеют одинаковые значения по всем полям.
То есть для такой таблицы
first_name | last_name |
---|---|
John | Scott |
William | Dawson |
Raul | Hartman |
William | Hartman |
John | Scott |
John | Hartman |
запрос с оператором DISTINCT вернул бы все сочетания имён и фамилий кроме дублирующихся «John Scott».
SELECT DISTINCT first_name, last_name FROM User;
first_name | last_name |
---|---|
John | Scott |
William | Dawson |
Raul | Hartman |
William | Hartman |
John | Hartman |
Предикаты ALL, DISTINCT, DISTINCTROW и TOP
Access
Запросы
Синтаксис SQL
Синтаксис SQL
Предикаты ALL, DISTINCT, DISTINCTROW и TOP
Access для Microsoft 365 Access 2021 Access 2019 Access 2016 Access 2013 Access 2010 Access 2007 Еще…Меньше
Эти предикаты задают записи, выбираемые с помощью запросов SQL.
SELECT [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]]
FROM таблица
Инструкция SELECT, содержащая эти предикаты, состоит из следующих частей:
Элемент |
Описание |
ALL |
Используется по умолчанию, если вы не указываете ни один из предикатов.
|
DISTINCT |
Исключает записи, содержащие повторяющиеся данные в выбранных полях. Для включения в результаты запроса значения каждого из полей, перечисленных в инструкции SELECT, должны быть уникальными. Например, у нескольких сотрудников, перечисленных в таблице Employees, могут быть одинаковые фамилии. Если две записи содержат «Глазков» в поле LastName, следующая инструкция SQL возвращает только одну запись, содержащую значение «Глазков»:
Если опустить DISTINCT, этот запрос возвратит обе записи с фамилией «Глазков». Если предложение SELECT содержит несколько полей, запись будет включена в результаты только в том случае, если сочетание значений всех таких полей уникально. Выходные данные запроса, использующего DISTINCT, не является обновляемыми и не отражают изменения, внесенные другими пользователями. |
DISTINCTROW |
Данные не просто повторяют поля, но и не повторяются. Например, можно создать запрос, который соединяет таблицы Customers и Orders по полю CustomerID. Таблица «Клиенты» не содержит повторяют поля CustomerID, но таблица Orders содержит, так как у каждого клиента может быть множество заказов. В следующей SQL показано, как использовать DISTINCTROW для создания списка компаний, у кого есть хотя бы один заказ, но нет сведений об этих заказах:
Если опустить DISTINCTROW, этот запрос создаст несколько строк для каждой компании, от которой поступало более одного заказа. DISTINCTROW действует только в том случае, если вы выбираете поля из некоторых (но не всех) таблиц, используемых в запросе. DISTINCTROW игнорируется, если запрос содержит только одну таблицу или вы включаете поля из всех таблиц. |
TOP n [PERCENT] |
Возвращает записи, относящиеся к верхней или нижней части диапазона, заданного предложением ORDER BY. Предположим, что вы хотите получить имена 25 лучших студентов из группы 1994 г.:
Если не включить предложение ORDER BY, запрос вернет из таблицы Students произвольный набор, включающий 25 записей, которые удовлетворяют предложению WHERE. Предикат TOP не выбирает между равными значениями. Если в предыдущем примере двадцать пятый и двадцать шестой средний балл совпадают, запрос вернет 26 записей. Вы также можете использовать зарезервированное слово PERCENT для возвращения определенного процента записей из верхней или нижней части диапазона, заданного предложением ORDER BY. Предположим, что вместо 25 лучших студентов вы хотите получить 10 процентов худших студентов группы:
Предикат ASC позволяет вернуть нижние значения. Значение после TOP должно быть целым числом без знака. TOP не влияет на возможность обновления запроса. |
таблица |
Имя таблицы, из которой извлекаются записи. |
SQL Server SELECT DISTINCT
Резюме : в этом руководстве вы узнаете, как использовать предложение SQL Server SELECT DISTINCT
для получения единственных различных значений в указанном списке столбцов.
Введение в SQL Server
Предложение SELECT DISTINCT
Иногда может потребоваться получить только отдельные значения в указанном столбце таблицы. Для этого вы используете предложение SELECT DISTINCT
следующим образом:
SELECT DISTINCT имя_столбца ОТ имя_таблицы; Язык кода: SQL (язык структурированных запросов) (sql)
Запрос возвращает только различные значения в указанном столбце. Другими словами, он удаляет повторяющиеся значения в столбце из набора результатов.
Если вы используете несколько столбцов следующим образом:
SELECT DISTINCT имя_столбца1, имя_столбца2, ... ОТ имя_таблицы; Язык кода: SQL (язык структурированных запросов) (sql)
В запросе используется комбинация значений во всех указанных столбцах в SELECT
список для оценки уникальности.
Если применить предложение DISTINCT
к столбцу со значением NULL, предложение DISTINCT
сохранит только одно значение NULL и удалит другое. Другими словами, предложение DISTINCT
рассматривает все «значения» NULL как одно и то же значение.
SQL Server
SELECT DISTINCT
примеров Для демонстрации мы будем использовать таблицу клиентов
из примера базы данных.
А)
DISTINCT
Пример одного столбца Следующий оператор возвращает все города всех клиентов в таблицах клиентов
:
SELECT город ОТ продажи.клиенты СОРТИРОВАТЬ ПО город; Язык кода: SQL (язык структурированных запросов) (sql)
Как видно из вывода, города дублируются.
Чтобы получить отдельные города, добавьте ключевое слово DISTINCT
следующим образом:
SELECT DISTINCT город ОТ продажи.клиенты СОРТИРОВАТЬ ПО город; Язык кода: SQL (язык структурированных запросов) (sql)
Теперь запрос возвращает отдельное значение для каждой группы дубликатов. Другими словами, он удалил все города-дубликаты из набора результатов.
B)
DISTINCT
пример нескольких столбцовЭтот оператор возвращает все города и штаты всех клиентов:
SELECT город, состояние ОТ продажи.клиенты СОРТИРОВАТЬ ПО город, состояние; Язык кода: SQL (язык структурированных запросов) (sql)
Следующий оператор находит различные города и штаты всех клиентов.
ВЫБЕРИТЕ ОТЛИЧНЫЙ город, состояние ОТ продажи.клиенты Язык кода: SQL (язык структурированных запросов) (sql)
В этом примере оператор использовал комбинацию значений в столбцах city
и state
для оценки дубликатов.
C)
DISTINCT
с нулевыми значениями примерСледующий пример находит различные телефонные номера клиентов:
ВЫБЕРИТЕ ОТЛИЧНЫЙ телефон ОТ продажи.клиенты СОРТИРОВАТЬ ПО телефон; Язык кода: SQL (язык структурированных запросов) (sql)
В этом примере предложение DISTINCT
оставило только одно значение NULL в столбце phone
и удалило другие значения NULL.
DISTINCT
по сравнению с GROUP BY
В следующем операторе используется предложение GROUP BY
для возврата отдельных городов вместе со штатом и почтовым индексом из sales.customers
таблица:
SELECT город, состояние, почтовый индекс ОТ продажи.клиенты ГРУППА ПО Город (*): Штат (*): Почтовый Индекс СОРТИРОВАТЬ ПО city, state, zip_code Язык кода: SQL (язык структурированных запросов) (sql)
На следующем рисунке показан частичный вывод:
Это эквивалентно следующему запросу, использующему оператор DISTINCT
:
SELECT ОТЧЕТЛИВЫЙ город, состояние, почтовый индекс ОТ продажи. клиенты; Язык кода: SQL (язык структурированных запросов) (sql)
Оба предложения DISTINCT
и GROUP BY
уменьшают количество возвращаемых строк в результирующем наборе путем удаления дубликатов.
Однако следует использовать предложение GROUP BY
, если вы хотите применить агрегатную функцию к одному или нескольким столбцам.
Из этого руководства вы узнали, как использовать предложение SQL Server SELECT DISTINCT
для получения уникальных значений в указанном списке столбцов.
Удаление дубликатов с помощью оператора SQL DISTINCT
Резюме : в этом руководстве вы узнаете, как использовать оператор SQL DISTINCT для удаления повторяющихся строк в результирующем наборе.
Результирующий набор оператора SELECT может содержать повторяющиеся строки. Чтобы устранить дубликаты, вы используете оператор DISTINCT
следующим образом:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT DISTINCT select_list ОТ имя_таблицы;
Обратите внимание, что вы можете использовать оператор DISTINCT
только в операторе SELECT
.
Оператор SELECT
использует значения столбцов, указанных после оператора DISTINCT
, для оценки уникальности строк в результирующем наборе.
Если указать один столбец, база данных использует значения в столбце для оценки уникальности. Если вы укажете несколько столбцов, механизм базы данных оценивает уникальность строк на основе комбинации значений в этих столбцах.
Примеры операторов SQL DISTINCT
Давайте рассмотрим несколько примеров использования оператора DISTINCT
в операторе SELECT
.
1) Пример использования SQL DISTINCT с одним столбцом
Следующий запрос получает город сотрудника в таблице сотрудников
:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT city ОТ сотрудников
Набор результатов содержит повторяющийся город, т. е. London
встречается четыре раза, что указывает на то, что некоторые сотрудники находятся в одном городе.
Чтобы удалить повторяющиеся города, вы можете использовать оператор DISTINCT
, как показано в следующем запросе:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT DISTINCT город ОТ сотрудники;
2) Пример использования SQL DISTINCT с несколькими столбцами
Чтобы найти список уникальных городов и стран из сотрудников
, вы можете указать столбцы city
и country
после оператора DISTINCT
, как показано в следующем запросе:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT DISTINCT столица ОТ сотрудники;
В этом примере DISTINCT
использует комбинацию значений в столбцах города и страны для определения уникальности строк в результирующем наборе.
Использование SQL DISTINCT с NULL
Оператор DISTINCT
обрабатывает NULL
дубликат. Это означает, что два NULL
одинаковы. Следовательно, если оператор SELECT
возвращает NULL
s, DISTINCT
возвращает только один NULL
.
Следующий оператор SELECT
выбирает все регионы из столбца region
таблицы сотрудников
:
ВЫБЕРИТЕ регион ИЗ сотрудников;
Как видно из вывода, запрос возвращает повторяющиеся регионы. Например, NULL встречается четыре раза.
Следующая инструкция SELECT использует оператор DISTINCT для выбора уникальных регионов из таблицы сотрудников:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT DISTINCT region ОТ сотрудников;
Результирующий набор теперь имеет уникальные области.