Оператор distinct в sql: SQL оператор DISTINCT — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite

Исключение дубликатов, оператор 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_namelast_name
JohnScott
WilliamDawson
RaulHartman
WilliamHartman
JohnScott
JohnHartman

запрос с оператором DISTINCT вернул бы все сочетания имён и фамилий кроме дублирующихся «John Scott».

SELECT DISTINCT first_name, last_name FROM User;

first_namelast_name
JohnScott
WilliamDawson
RaulHartman
WilliamHartman
JohnHartman

Предикаты 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

Используется по умолчанию, если вы не указываете ни один из предикатов.

Ядро СУБД Microsoft Access выбирает все записи, которые удовлетворяют условиям в инструкции SQL. Следующие два примера эквивалентны и возвращает все записи из таблицы Employees:

SELECT ALL *
FROM Employees
ORDER BY EmployeeID;
SELECT *
FROM Employees
ORDER BY EmployeeID;

DISTINCT

Исключает записи, содержащие повторяющиеся данные в выбранных полях. Для включения в результаты запроса значения каждого из полей, перечисленных в инструкции SELECT, должны быть уникальными. Например, у нескольких сотрудников, перечисленных в таблице Employees, могут быть одинаковые фамилии. Если две записи содержат «Глазков» в поле LastName, следующая инструкция SQL возвращает только одну запись, содержащую значение «Глазков»:

SELECT DISTINCT LastName
FROM Employees;

Если опустить DISTINCT, этот запрос возвратит обе записи с фамилией «Глазков».

Если предложение SELECT содержит несколько полей, запись будет включена в результаты только в том случае, если сочетание значений всех таких полей уникально.

Выходные данные запроса, использующего DISTINCT, не является обновляемыми и не отражают изменения, внесенные другими пользователями.

DISTINCTROW

Данные не просто повторяют поля, но и не повторяются. Например, можно создать запрос, который соединяет таблицы Customers и Orders по полю CustomerID. Таблица «Клиенты» не содержит повторяют поля CustomerID, но таблица Orders содержит, так как у каждого клиента может быть множество заказов. В следующей SQL показано, как использовать DISTINCTROW для создания списка компаний, у кого есть хотя бы один заказ, но нет сведений об этих заказах:

SELECT DISTINCTROW CompanyName
FROM Customers INNER JOIN Orders
ON Customers. CustomerID = Orders.CustomerID
ORDER BY CompanyName;

Если опустить DISTINCTROW, этот запрос создаст несколько строк для каждой компании, от которой поступало более одного заказа.

DISTINCTROW действует только в том случае, если вы выбираете поля из некоторых (но не всех) таблиц, используемых в запросе. DISTINCTROW игнорируется, если запрос содержит только одну таблицу или вы включаете поля из всех таблиц.

TOP n [PERCENT]

Возвращает записи, относящиеся к верхней или нижней части диапазона, заданного предложением ORDER BY. Предположим, что вы хотите получить имена 25 лучших студентов из группы 1994 г.:

SELECT TOP 25
FirstName, LastName
FROM Students
WHERE GraduationYear = 2003
ORDER BY GradePointAverage DESC;

Если не включить предложение ORDER BY, запрос вернет из таблицы Students произвольный набор, включающий 25 записей, которые удовлетворяют предложению WHERE.

Предикат TOP не выбирает между равными значениями. Если в предыдущем примере двадцать пятый и двадцать шестой средний балл совпадают, запрос вернет 26 записей.

Вы также можете использовать зарезервированное слово PERCENT для возвращения определенного процента записей из верхней или нижней части диапазона, заданного предложением ORDER BY. Предположим, что вместо 25 лучших студентов вы хотите получить 10 процентов худших студентов группы:

SELECT TOP 10 PERCENT
FirstName, LastName
FROM Students
WHERE GraduationYear = 2003
ORDER BY GradePointAverage ASC;

Предикат 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 следующим образом:

 

SELECT DISTINCT select_list ОТ имя_таблицы;

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

Обратите внимание, что вы можете использовать оператор DISTINCT только в операторе SELECT .

Оператор SELECT использует значения столбцов, указанных после оператора DISTINCT , для оценки уникальности строк в результирующем наборе.

Если указать один столбец, база данных использует значения в столбце для оценки уникальности. Если вы укажете несколько столбцов, механизм базы данных оценивает уникальность строк на основе комбинации значений в этих столбцах.

Примеры операторов SQL DISTINCT

Давайте рассмотрим несколько примеров использования оператора DISTINCT в операторе SELECT .

1) Пример использования SQL DISTINCT с одним столбцом

Следующий запрос получает город сотрудника в таблице сотрудников :

 

SELECT city ОТ сотрудников

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

Набор результатов содержит повторяющийся город, т. е. London встречается четыре раза, что указывает на то, что некоторые сотрудники находятся в одном городе.

Чтобы удалить повторяющиеся города, вы можете использовать оператор DISTINCT , как показано в следующем запросе:

 

SELECT DISTINCT город ОТ сотрудники;

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

2) Пример использования SQL DISTINCT с несколькими столбцами

Чтобы найти список уникальных городов и стран из сотрудников , вы можете указать столбцы city и country после оператора DISTINCT , как показано в следующем запросе:

 

SELECT DISTINCT столица ОТ сотрудники;

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

В этом примере DISTINCT использует комбинацию значений в столбцах города и страны для определения уникальности строк в результирующем наборе.

Использование SQL DISTINCT с NULL

Оператор DISTINCT обрабатывает NULL дубликат. Это означает, что два NULL одинаковы. Следовательно, если оператор SELECT возвращает NULL s, DISTINCT возвращает только один NULL .

Следующий оператор SELECT выбирает все регионы из столбца region таблицы сотрудников :

 

ВЫБЕРИТЕ регион ИЗ сотрудников;

Как видно из вывода, запрос возвращает повторяющиеся регионы. Например, NULL встречается четыре раза.

Следующая инструкция SELECT использует оператор DISTINCT для выбора уникальных регионов из таблицы сотрудников:

 

SELECT DISTINCT region ОТ сотрудников;

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

Результирующий набор теперь имеет уникальные области.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *