Исключение дубликатов, оператор 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 ОТ сотрудников;
Результирующий набор теперь имеет уникальные области.



CustomerID = Orders.CustomerID


клиенты; Язык кода: SQL (язык структурированных запросов) (sql)