Distinct в access
Зарезервированные слова DISTINCTROW и DISTINCT
Зарезервированные слова DISTINCTROW и DISTINCT в инструкции SELECT Jet SQL позволяют исключить из результирующего множества повторяющиеся строки. Разница между этими словами состоит в том, как при их использовании определяются повторяющиеся записи.
Если в инструкции SELECT используется слово DISTINCTROW, то для сравнения записей применяются все поля исходной таблицы, независимо от того, какие из этих полей включены в запрос.
Если в инструкцию SELECT входит слово DISTINCT, то для сравнения записей используются данные в строках результирующего множества запроса, т. е. только те поля, которые включены в запрос.
Модификаторы могут использоваться не только в инструкции SELECT, но также и в запросах на добавление записей и на создание таблицы.
Для того чтобы понять, как влияет включение этих слов в запрос на его результат, построим запрос, который будет показывать, какие товары приобрел каждый клиент:
- Создайте новый запрос в базе данных «Борей». Для этого раскройте список запросов окна базы данных и нажмите кнопку Создать (New Query). В списке диалогового окна Новый запрос (New Query) выделите значение Конструктор (Design View) и нажмите кнопку ОК.
- Добавьте в запрос таблицы «Клиенты» (Customers), «Заказы» (Orders), «Заказано» (Orders Details) и «Товары» (Products). Access автоматически создает необходимые связи между таблицами.
- Перетащите поле «Название» (CompanyName) из списка полей таблицы «Клиенты» в первый столбец бланка запроса. Выделите ячейку Сортировка (Sort) и выберите значение По возрастанию (Ascending).
- Перетащите поле «Марка» (ProductName) из списка полей таблицы «Товары» (Products) во второй столбец бланка запроса. Задайте в этом столбце также сортировку по возрастанию.
- Нажмите на панели инструментов кнопку Запуск (Run) для выполнения запроса.
Вы должны получить результирующее множество, которое содержит 2169 записей. При этом те клиенты, которые не сделали ни одного заказа, в результирующее множество .не попадут, однако клиенты, которые заказывали один и тот же товар несколько раз, могут попасть в таблицу несколько раз. Теперь добавим в инструкцию SQI, SELECT слово DISTINCTROW для зтого:
- Выберите команду меню Вид, Режим SQL (View, SQL View) или щелкните по стрелке на кнопке Вид (View) на панели управления и выберите элемент Режим SQL (SQL View). Откроется диалоговое окно, в котором выведена инструкция SQL, соответствующая построенному запросу.
- Введите слово DISTINCTROW сразу после слова SELECT. Запрос должен выглядеть гак, как показано на рис. 8.58.
- Нажмите кнопку Запуск (Run). Результирующее множество запроса будет включать 1695 записей.
- Снова выполните команду Вид, Режим SQL (View, SQL Mode) и замените в инструкции SQL СЛОВО DISTINCTRTOW СЛОВОМ DISTINCT.
- Нажмите кнопку Запуск (Run). Результирующее множество запроса содержит те же 1695 строк, что и при использовании ключевого слова DISTINCTROW.
Рис. 8.58. Инструкция SQL с модификатором DISTINCTROW
В данном случае разницы между употреблением этих модификаторов нет (в других случаях может получиться иной результат). Однако при попытке редактировать данные в таблице вы убедитесь, что при использовании модификатора DISTINCT результирующий набор записей получается необновляемым, а модификатор DISTINCTROW допускает изменение данных в результирующем наборе.
Вместо того чтобы вносить эти модификаторы вручную в режиме SQL, можно просто установить соответствующие свойства запроса. Чтобы открыть диалоговое окно свойств запроса, щелкните правой кнопкой мыши по свободному полю в верхней панели окна Конструктора запроса и выберите из контекстного меню команду Свойства (Properties). Появляется диалоговое окно, представленное на рис. 8.57.
Два свойства в этом окне определяют использование модификаторов DISTINCTROW и DISTINCT: Уникальные значения (Unique Values) и Уникальные записи (Unique Rows). Свойство Уникальные значения соответствует модификатору DISTINCT, a свойство Уникальные записи — модификатору DISTINCTROW. Если вы попробуете установить эти значения, то увидите, что Access не позволит установить значения Да (Yes) для обоих свойств. Если одно из них имеет значение Да (Yes), то для второго автоматически устанавливается значение Нет (No). Если оба свойства имеют значение Нет (No), запрос будет включать в результирующий набор все записи.
Свойство Уникальные записи имеет смысл только для запроса, который строится по нескольким таблицам. Если запрос имеет только одну таблицу, значение этого свойства игнорируется.
Особенности функции COUNT
Агрегатные функции.
Итоговые запросы на чтение
Итоговые запросы на чтение позволяют получить промежуточные или окончательные итоги (статистическую информацию) по содержащимся в базе данных значениям. Итоговые запросы необходимо использовать, когда требуемой информации в базе данных в явной виде нет, и ее необходимо вычислить.
Для подведения итогов по информации, содержащейся в базе данных, в SQL предусмотрены агрегатные (статистические) функции.
Агрегатами называют группы строк, следовательно, агрегатными функциями называют функции, аргументами которых являются группы строк.
Агрегаты могут представлять собой все строки таблицы или группы строк, созданные предложением GROUP BY (будет рассмотрено в п.13.7.2).
Агрегатная функция получает в качестве аргумента выражение, содержащее, по крайней мере, один столбец таблицы, а в качестве результата возвращает одно значение. Таким образом, агрегатные функции позволяют выполнять операции над значениями сразу целого столбца таблицы или нескольких таблиц.
В SQL имеется пять стандартных агрегатных функций: SUM, AVG, MIN, MAX, COUNT.
SUM( ) вычисляет сумму всех значений в выражении;
AVG( ) вычисляет среднее всех значений в выражении;
MIN( ) находит наименьшее среди всех значений в выражении;
MAX( ) находит наибольшее среди всех значений в выражении;
COUNT( ) подсчитывает количество значений в выражении.
В качестве выражения чаще всего выступает имя столбца таблицы.
Функция COUNT(*) подсчитывает количество строк (т.е. учитывает и NULL).
Функция COUNT(DISTINCT ) подсчитывает количество разных значений в выражении.
Примечание 1.В Microsoft Access конструкция COUNT(DISTINCT ) не работает. Данная проблема решается применением вложенного запроса в предложении FROM.
Ограничения на использование агрегатных функций:
— агрегатные функции нельзя использовать в предложении WHERE (оно работает для одной строки, а не для агрегата);
— агрегатные функции нельзя вкладывать друг в друга (при необходимости можно использовать вложенные запросы);
— в предложении SELECT нельзя одновременно использоваться агрегатные функции и обычные имена столбцов (если только по этим столбцам не указана группировка GROUP BY)
Примечание 2.В предложении SELECT возвращаемым столбцам, в которых используются агрегатные функции, рекомендуется присваивать псевдонимы.
Пример 29. Вычислить суммарную стоимость всех вызовов.
Пример 30. Вычислить средний возраст для контактов.
Пример 31. Вычислить минимальную и максимальную длительность исходящих вызовов.
SELECT MIN(DLIT), MAX(DLIT)
FROM VYZOVY V, TIPY_VYZ T
WHERE (V.TIP_ID=T.ID) AND (T.NAZV=’Исходящий’)
Пример 32. Вывести дату и время самого первого вызова.
Пример 33. Вычислить количество контактов старше 30 лет.
Пример 34. Вычислить количество мелодий, уже назначенных для какого-либо контакта.
Ключевое слово DISTINCTROW
Ключевое слово DISTINCTROW в SQL-выражениях используется в Access для ограничения возвращаемых записей. Оно не используется в SQL-языке других баз данных. В Access оно служит для предотвращения вывода дублирующихся записей. Это ключевое слово работает подобно предикату DISTINCT в других реализациях SQL, но действие DISTINCT внутри запроса распространяется только на поля. DISTINCTROW проверяет записи (даже если их полей нет в выражении SELECT).
Команда SELECT
SELECT — это первое слово запроса на выборку или на добавление. Команда SELECT используется для выбора поля (или полей), которое будет выводиться в результате.
После ключевого слова SELECT необходимо указать поля, которые нужно вывести. Если используется больше одного поля, то между полями нужно вставлять запятые:
SELECT Первое_поле, Второе_поле, Третье_поле, . . .
Предикаты SELECT
В выражениях SELECT можно использовать несколько предикатов, приведенных ниже.
Эти предикаты служат для ограничения количества возвращаемых записей. В SQL-выражении их можно использовать с командой WHERE.
Предикат ALL назначен по умолчанию. Он выбирает все записи, которые в выражении SQL удовлетворяет условию WHERE. Указывать его необязательно, поскольку он назначен по умолчанию. Предикат DISTINCT необходимо включать, когда из запроса следует исключить одинаковые записи (рассматриваются только поля, включенные в запрос). Например, при создании запроса, выводящего идентификатор покупателя и день, в который он сделал заказ, нужно использовать следующее SELECT DISTINCT [CustomerlD], [OrderDate]
Если в таблицу Orders помещено два заказа одного покупателя за один день, то в результирующей таблице будет содержаться только одна запись. Предикат DISTINCT указывает Access, что, если отобранные поля содержат одинаковые значения, нужно выводить только одну запись. Даже если на самом деле в таблице Orders есть две различные записи, то отображена будет только одна из них. Предикат DISTINCT проверяет дублирование только для полей, указанных для просмотра.
Предикат DISTINCT предназначен для исключения записей, которые содержат повторяющиеся значения в отобранных полях. Для того чтобы запись была включена в результат выполнения запроса, значения в каждом поле, включенном в инструкцию SELECT, должны быть уникальными.
DISTINCTROW— это предикат, существующий только в Access. Он работает подобно предикату DISTINCT, но с одним большим отличием: DISTINCTROW проверят совпадение в таблице или таблицах всех полей, а не только выбранных. Предикат DISTINCTROW используется для исключения записей, повторяющихся полностью. Он влияет на результат только в том случае, если в запрос включены не все поля из анализируемых таблиц. Предикат DISTINCTROW игнорируется, если запрос содержит только одну таблицу.
Если, например, какому-либо покупателю в таблице Orders соответствуют две различные записи, то при использовании в предыдущем SQL-выражении distinctrow вместо DISTINCT будут выведены обе записи. Предикат DISTINCTROW проверяет совпадение всех полей в таблицах Customers и Orders. Если содержимое каких-либо полей различно (в данном случае — идентификатор заказа), то будут выведены обе записи.
Предикат ТОР, который также характерен только для Access, ограничивает число выводимых записей, удовлетворяющих условию WHERE. Предикат TOP предназначен для возврата определенного числа записей, находящихся в начале или в конце диапазона, описанного с помощью предложения ORDER BY. Например, ТОР 10 выводит только десять первых записей, удовлетворяющих условию WHERE.
Предикат ТОР имеет один необязательный параметр PERCENT (процент), который указывает не количество первых записей, а их процентное отношение к общему числу отобранных записей.
Предикаты ALL, DISTINCT, DISTINCTROW и TOP
Эти предикаты задают записи, выбираемые с помощью запросов SQL.
Синтаксис
SELECT [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]]
FROM таблица
Инструкция SELECT, содержащая эти предикаты, состоит из следующих частей:
Используется по умолчанию, если вы не указываете ни один из предикатов. Ядро СУБД Microsoft Access выбирает все записи, которые удовлетворяют условиям в инструкции SQL. Следующие два примера эквивалентны и возвращает все записи из таблицы Employees:
Исключает записи, содержащие повторяющиеся данные в выбранных полях. Для включения в результаты запроса значения каждого из полей, перечисленных в инструкции SELECT, должны быть уникальными. Например, у нескольких сотрудников, перечисленных в таблице Employees, могут быть одинаковые фамилии. Если две записи содержат «Глазков» в поле LastName, следующая инструкция SQL возвращает только одну запись, содержащую значение «Глазков»:
Если опустить DISTINCT, этот запрос возвратит обе записи с фамилией «Глазков».
Если предложение SELECT содержит несколько полей, запись будет включена в результаты только в том случае, если сочетание значений всех таких полей уникально.
Выходные данные запроса, использующего DISTINCT, не является обновляемыми и не отражают изменения, внесенные другими пользователями.
Исключает полностью повторяющиеся записи, а не просто записи с повторяющимися полями. Например, вы можете создать запрос, объединяющий таблицы Customers и Orders по полю CustomerID. В таблице Customers нет повторяющихся полей CustomerID, но в таблице Orders они есть, потому что от каждого клиента может быть несколько заказов. Следующая инструкция SQL показывает, как использовать DISTINCTROW для создания списка компаний, которые имеют по крайней мере один заказ. При этом список не будет включать сведения об этих заказах:
Если опустить DISTINCTROW, этот запрос создаст несколько строк для каждой компании, от которой поступало более одного заказа.
DISTINCTROW действует только в том случае, если вы выбираете поля из некоторых (но не всех) таблиц, используемых в запросе. DISTINCTROW игнорируется, если запрос содержит только одну таблицу или вы включаете поля из всех таблиц.
Возвращает записи, относящиеся к верхней или нижней части диапазона, заданного предложением ORDER BY. Предположим, что вы хотите получить имена 25 лучших студентов из группы 1994 г.:
Если не включить предложение ORDER BY, запрос вернет из таблицы Students произвольный набор, включающий 25 записей, которые удовлетворяют предложению WHERE.
Предикат TOP не выбирает между равными значениями. Если в предыдущем примере двадцать пятый и двадцать шестой средний балл совпадают, запрос вернет 26 записей.
Вы также можете использовать зарезервированное слово PERCENT для возвращения определенного процента записей из верхней или нижней части диапазона, заданного предложением ORDER BY. Предположим, что вместо 25 лучших студентов вы хотите получить 10 процентов худших студентов группы:
Предикат ASC позволяет вернуть нижние значения. Значение после TOP должно быть целым числом без знака.
TOP не влияет на возможность обновления запроса.
MySQL Distinct
Выражение MySQL DISTINCT используется для выборки уникальных значений из указанных столбцов. В этой статье мы покажем, как применять DISTINCT в MySQL с помощью Workbench и командной строки.
Синтаксис запросов SELECT DISTINCT в MySQL
Базовый синтаксис запросов SELECT DISTINCT :
- DISTINCT : это ключевое слово возвращает уникальные результаты;
- Columns : позволяет выбрать столбцы, из которых будет осуществляться выборка. Это может быть один или несколько столбцов;
- Source : одна или несколько таблиц, присутствующих в базе данных. Используйте ключевое слово JOIN , чтобы соединить несколько таблиц.
Мы собираемся использовать данные, приведенные ниже, чтобы объяснить применение ключевого слова DISTINCT в MySQL на конкретном примере:
DISTINCT-запрос к одному столбцу
В этом примере мы отобразим уникальные записи из столбца education , используя SELECT DISTINCT MySQL . Но сначала выведем все значения из этого столбца:
Теперь я использую ключевое слово DISTINCT :
DISTINCT-запрос к нескольким столбцам
Когда мы используем запрос MySQL DISTINCT по нескольким полям , SELECT вернёт комбинацию нескольких столбцов вместо уникальных отдельных записей. В этом примере мы выберем уникальные записи из столбцов education и profession :
Несмотря на то, что мы использовали ключевое слово DISTINCT в выражении SELECT , из скриншота, приведенного выше видно, что запрос вернул дублирующие результаты внутри каждого столбца, потому что:
- Bachelors и Developer — это уникальная комбинация;
- Bachelors и Programming — это уникальная комбинация и т.д.
Пример DISTINCT-запроса в MySQL – условие WHERE
В этом MySQL DISTINCT примере мы покажем, как его использовать вместе с условием WHERE . Следующее выражение возвратит уникальные значения столбцов education и profession из таблицы customers , в которых годовой доход больше или равен 85000 :
Несмотря на то, что существует 13 уникальных записей с комбинациями столбцов education и profession , 10 записей не соответствуют условию WHERE . Поэтому на скриншоте показано только 5 записей.
Замечание : Выражение DISTINCT в MySQL воспринимает NULL как допустимое уникальное значение. Поэтому используйте любое NOT NULL условие или функцию, чтобы избавиться от этих значений.
DISTINCT или GROUP BY в MySQL
В MySQL DISTINCT наследует поведение от GROUP BY . Если вы используете выражение GROUP BY без агрегатной функции, то оно будет выполнять роль ключевого слова DISTINCT .
Единственное отличие между ними заключается в следующем:
- GROUP BY сначала сортирует данные, а затем осуществляет группировку;
- Ключевое слово DISTINCT не выполняет сортировки.
Если вы используете ключевое слово DISTINCT вместе с выражением ORDER BY , то получите тот же результат, что и при применении GROUP BY . Следующий запрос возвращает уникальные значения столбца profession из таблицы customerdetails :
Уберём ключевое слово DISTINCT и используем выражение GROUP BY :
Как видите, запрос возвращает тот же результат, но в другом порядке:
В этом MySQL SELECT DISTINCT примере я использую выражение ORDER BY :
Результат тот же, что и при использовании GROUP BY :
Пример DISTINCT-запроса в MySQL – командная строка
Теперь я покажу, как отобразить уникальные записи с помощью SELECT DISTINCT MySQL в командной строки. В этом случае мы выбираем записи с уникальными значениями столбцов education и profession из таблицы customerdetails :
Данная публикация представляет собой перевод статьи « MySQL Distinct » , подготовленной дружной командой проекта Интернет-технологии.ру