SQL-Урок 11. Выборка уникальных данных (SELECT DISTINCT)

Базы данных

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

Оператор SQL DISTINCT нашел широкое применение в операторе SQL SELECT, для выборки уникальных значений. Так же используется в агрегатных функциях.

Синтаксис

При выборке:

SELECT DISTINCT поле FROM имя_таблицы WHERE условие

При подсчете:

SELECT COUNT(DISTINCT поле) FROM имя_таблицы WHERE условие

При суммировании:

SELECT SUM(DISTINCT поле) FROM имя_таблицы WHERE условие

Примеры

Все примеры будут по этой таблице workers, если не сказано иное:

idnameagesalary
1Дима23400
2Петя25500
3Вася23500
4Коля301000
5Иван27500
6Кирилл281000

Пример 

Давайте выберем все уникальные значения зарплат из таблицы workers:

SELECT DISTINCT salary FROM workers

SQL запрос выберет следующие строки:

salary
400
500
1000

Пример 

Давайте подсчитаем все уникальные значения зарплат из таблицы workers (их будет 3 штуки: 400, 500 и 1000):

SELECT COUNT(DISTINCT salary) as count FROM workers

SQL запрос выберет следующие строки:

count
3

Пример 

Давайте подсчитаем одновременно все уникальные значения зарплат и уникальные значения возрастов и запишем их в разные поля:

SELECT
	COUNT(DISTINCT salary) as salary_count,
 	COUNT(DISTINCT age) as age_count
FROM workers

SQL запрос выберет следующие строки:

salary_countage_count
35

Пример 

Давайте просуммируем все уникальные значения зарплат из таблицы 

workers:

SELECT SUM(DISTINCT salary) as sum FROM workers

SQL запрос выберет следующие строки:

sum
1900

Предикаты 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 объясняется, как использовать оператор SQL DISTINCT с синтаксисом и примерами.

Описание

Предложение SQL DISTINCT используется для удаления дубликатов из набора результатов оператора SELECT.

Синтаксис

Синтаксис для предложения DISTINCT в SQL:

 SELECT DISTINCT выражения
ИЗ столов
[ГДЕ условия]; 

Параметры или аргументы

выражения
Столбцы или вычисления, которые вы хотите получить.
столы
Таблицы, из которых вы хотите извлечь записи. В предложении FROM должна быть хотя бы одна таблица.
ГДЕ условия
Дополнительно. Условия, которые должны быть соблюдены для выбора записей.

Примечание

  • Если в предложении DISTINCT указано только одно выражение, запрос вернет уникальные значения для этого выражения.
  • Если в предложении DISTINCT указано более одного выражения, запрос будет извлекать уникальные комбинации для перечисленных выражений.
  • В SQL предложение DISTINCT не игнорирует значения NULL. Таким образом, при использовании предложения DISTINCT в вашем операторе SQL ваш результирующий набор будет включать NULL в качестве отдельного значения.

DDL/DML для примеров

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

Получить DDL/DML

Пример. Поиск уникальных значений в столбце

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

В этом примере у нас есть таблица с именем поставщиков со следующими данными:

supplier_id имя_поставщика город состояние
100 Майкрософт Редмонд Вашингтон
200 Гугл Маунтин-Вью Калифорния
300 Оракул Редвуд Сити Калифорния
400 Кимберли-Кларк Ирвинг Техас
500 Тайсон Фудс Спрингдейл Арканзас
600 СК Джонсон Расин Висконсин
700 Доул Фуд Компани Вестлейк Виллидж Калифорния
800 Цветочная еда Томасвилл Грузия
900 Электронное искусство Редвуд Сити Калифорния

Давайте найдем все уникальные состояния в таблице поставщиков . Введите следующую инструкцию SQL:

Попробуйте

 SELECT DISTINCT state
ОТ поставщиков
ЗАКАЗАТЬ ПО состоянию; 

Будет выбрано 6 записей. Вот результаты, которые вы должны увидеть:

состояние
Арканзас
Калифорния
Грузия
Техас
Вашингтон
Висконсин

В этом примере будут возвращены все уникальные значения состояния из таблицы поставщиков и удалены все дубликаты из набора результатов. Как видите, штат Калифорния появляется в наборе результатов только один раз, а не четыре раза.

Пример. Поиск уникальных значений в нескольких столбцах

Далее рассмотрим, как использовать предложение SQL DISTINCT для удаления дубликатов из более чем одного поля в операторе SELECT.

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

Попробуйте

 SELECT DISTINCT city, state
ОТ поставщиков
ЗАКАЗАТЬ ПО городу, области; 

Будет выбрано 8 записей. Вот результаты, которые вы должны увидеть:

городской состояние
Ирвинг Техас
Маунтин-Вью Калифорния
Расин Висконсин
Редмонд Вашингтон
Редвуд Сити Калифорния
Спрингдейл Арканзас
Томасвилл Грузия
Уэстлейк Виллидж Калифорния

В этом примере будет возвращена каждая уникальная комбинация город и штат . В этом случае DISTINCT применяется к каждому полю, указанному после ключевого слова DISTINCT. Как видите, Redwood City, California появляется в наборе результатов только один раз вместо двух.

Пример. Как предложение DISTINCT обрабатывает значения NULL

Наконец, считает ли предложение DISTINCT значение NULL уникальным значением в SQL? Ответ положительный. Давайте исследуем это дальше.

В этом примере у нас есть таблица products со следующими данными:

product_id имя_продукта id категории
1 Груша 50
2 Банан 50
3 Оранжевый 50
4 Яблоко 50
5 Хлеб 75
6 Нарезанная ветчина 25
7 Клинекс НУЛЕВОЙ

Теперь давайте выберем уникальные значения из поля category_id , которое содержит значение NULL.