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, если не сказано иное:
id | name | age | salary |
---|---|---|---|
1 | Дима | 23 | 400 |
2 | Петя | 25 | 500 |
3 | Вася | 23 | 500 |
4 | Коля | 30 | 1000 |
5 | Иван | 27 | 500 |
6 | Кирилл | 28 | 1000 |
Пример
Давайте выберем все уникальные значения зарплат из таблицы 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_count | age_count |
---|---|
3 | 5 |
Пример
Давайте просуммируем все уникальные значения зарплат из таблицы
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:
|
DISTINCT |
Исключает записи, содержащие повторяющиеся данные в выбранных полях. Для включения в результаты запроса значения каждого из полей, перечисленных в инструкции SELECT, должны быть уникальными. Например, у нескольких сотрудников, перечисленных в таблице Employees, могут быть одинаковые фамилии. Если две записи содержат «Глазков» в поле LastName, следующая инструкция SQL возвращает только одну запись, содержащую значение «Глазков»:
Если опустить DISTINCT, этот запрос возвратит обе записи с фамилией «Глазков». Если предложение SELECT содержит несколько полей, запись будет включена в результаты только в том случае, если сочетание значений всех таких полей уникально. Выходные данные запроса, использующего DISTINCT, не является обновляемыми и не отражают изменения, внесенные другими пользователями. |
DISTINCTROW |
Данные не просто повторяют поля, но и не повторяются. Например, можно создать запрос, который соединяет таблицы Customers и Orders по полю CustomerID. Таблица «Клиенты» не содержит повторяют поля CustomerID, но таблица Orders содержит, так как у каждого клиента может быть множество заказов. В следующей SQL показано, как использовать DISTINCTROW для создания списка компаний, у кого есть хотя бы один заказ, но нет сведений об этих заказах:
Если опустить DISTINCTROW, этот запрос создаст несколько строк для каждой компании, от которой поступало более одного заказа. DISTINCTROW действует только в том случае, если вы выбираете поля из некоторых (но не всех) таблиц, используемых в запросе. DISTINCTROW игнорируется, если запрос содержит только одну таблицу или вы включаете поля из всех таблиц. |
TOP n [PERCENT] |
Возвращает записи, относящиеся к верхней или нижней части диапазона, заданного предложением ORDER BY.
Если не включить предложение ORDER BY, запрос вернет из таблицы Students произвольный набор, включающий 25 записей, которые удовлетворяют предложению WHERE. Предикат TOP не выбирает между равными значениями. Если в предыдущем примере двадцать пятый и двадцать шестой средний балл совпадают, запрос вернет 26 записей. Вы также можете использовать зарезервированное слово PERCENT для возвращения определенного процента записей из верхней или нижней части диапазона, заданного предложением ORDER BY. Предположим, что вместо 25 лучших студентов вы хотите получить 10 процентов худших студентов группы:
Предикат ASC позволяет вернуть нижние значения. 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)
В запросе используется комбинация значений во всех указанных столбцах в
список для оценки уникальности.
Если применить предложение 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.