Вывести только уникальные значения mysql

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

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

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

Синтаксис

Примеры

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

id name age salary
1 Дима 23 400
2 Петя 25 500
3 Вася 23 500
4 Коля 30 1000
5 Иван 27 500
6 Кирилл 28 1000

Пример

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

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

salary
400
500
1000

Пример

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

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

count
3

Пример

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

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

salary_count age_count
3 5

Пример

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

Источник

Веб-заметки и Веб-подсказки

SQL: Как выбрать только уникальные (неповторяющиеся) записи

SELECT DISTINCT .

Отфильтровать все повторяющиеся записи с результата запроса можно с помощью DISTINCT.

Пример использования:
Допустим у нас есть таблица «winners» с данными:

id winner_name
1 Nick
2 Ann
3 Ann
4 David
5 Nick
6 Nick
7 Natali

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

SELECT DISTINCT winner_name FROM winners;

Результат запроса:

winner_name
Nick
Ann
David
Natali

15 комментариев на «SQL: Как выбрать только уникальные (неповторяющиеся) записи»

Спасибо огромное, помогло!)

как в php сделать вывод данных?

Как я искал подобное решение. Огромное вам спасибо!

А как удалить неуникальные??

а еще можно использовать group by :

SELECT Filed FROM Table GROUP BY Field;

А если нужен и столбец id? подходит любое из значений… например
id winner_name
1 Nick
2 Ann
4 David
5 Nick
7 Natali

как такой запрос может выглядеть?

Так же есть задача, похожая на предыдущую. Есть таблица с вопросами из разных тем для экзамена. Нужно выбрать по одному случайному вопросу из 2-х любых тем (например так).
id theme question
1 1 question1
2 1 question2
3 1 question3
4 2 question4
5 2 question5
6 3 question6
7 3 question7
Тут решение из составного запроса в котором случайно сортируются все вопросы и берутся только 2 различные темы и потом как сделать, чтобы вопросов было по одному… Если кто знает — помогите, пожалуйста

Источник

Вывод уникальных данных из MySQL

Как сделать вывод из MySql таблицы уникальных данных.
Например таблица содержит.

строка 1 столбец 1;строка 1 столбец 2;строка 1 столбец 3; данные1
строка 2 столбец 1;строка 2 столбец 2;строка 2 столбец 3; данные2
строка 3 столбец 1;строка 3 столбец 2;строка 3 столбец 3; данные1
строка 4 столбец 1;строка 4 столбец 2;строка 4 столбец 3; данные1
строка 5 столбец 1;строка 5 столбец 2;строка 5 столбец 3; данные8
строка 6 столбец 1;строка 6 столбец 2;строка 6 столбец 3; данные1
строка 7 столбец 1;строка 7 столбец 2;строка 7 столбец 3; данные2

Как вывести их этой таблицы данные из последнего столбца.
Так чтоб выводились только уникальные значения. А именно:
данные1,данные2,данные8
Желательно. если нетрудно. занесите данные в php массив.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Вывод уникальных данных MySQL без пустых значений
Люди добрые подскажите как вывести уникальные значения исключив из результата пустые значения.

Сравнение данных и вывод уникальных
В бд находятся даты и числа в одной строке (формат id,sum,date) пытаюсь сделать график сумм за.

Вывод уникальных данных с двух таблиц
Всем добрый день. Есть две таблицы с одинаковыми полями — Date (datetime), LagerID (int) и.

Запрос sql: совместный вывод уникальных и не уникальных столбцов
Добрый день, уважаемые программисты! Вопрос следующий: каким образом вывести уникальные значения.

а разве group by не то, что нужно?
другое дело? если ты неправильно используешь group by

я бы с удовольствие привёл бы тебе пример конкретно на втоём примере
но из того как ты представил данные
строка 1 столбец 1;строка 1 столбец 2;строка 1 столбец 3; данные1
строка 2 столбец 1;строка 2 столбец 2;строка 2 столбец 3; данные2
строка 3 столбец 1;строка 3 столбец 2;строка 3 столбец 3; данные1
строка 4 столбец 1;строка 4 столбец 2;строка 4 столбец 3; данные1
строка 5 столбец 1;строка 5 столбец 2;строка 5 столбец 3; данные8
строка 6 столбец 1;строка 6 столбец 2;строка 6 столбец 3; данные1
строка 7 столбец 1;строка 7 столбец 2;строка 7 столбец 3; данные2

я нихрена не понял.

То, что я посоветовал, используется так

SJack ваш пример думаю работает но содержит много обращений в MySql базе. Данную вещь я уже давно реализовал. База данных достаточно большая и на выполнение этой операции потребудется много времени и памяти.

sl_play то что вы посоветовали
select * from table group by column
действительно функционирует как раз так как мне нужно. По крайней мере так было при прямом обращении в MySql серверу.
Пожалуйста помогите вывести это на экран скриптом PHP c минимальным временем выполнения
Мануал, к сажелению, читать я просто неуспеваю так как много другой работы. Но то что я когда нибудь делал я могу повторить без проблем. Раньше мне этого хватало но сейчас потребности значительно растут. И простейшие функции с которыми я привык общатся не справляются со свой задачей, вот и приходится искать новые пути с целью повышения быстрордействия вебприложений.

Источник

SQL — урок 4. Выборка данных из базы

Базы данных › SQL — урок 4. Выборка данных из базы

  • В этой теме 0 ответов, 1 участник, последнее обновление 3 года назад сделано Васильев Владимир Сергеевич.

Выборка записей

Выбор данных выполняется командой SELECT.
Ниже приведен примерный список используемых ею конструкций и ключевых слов, полный же список зависит от реализации СУБД:

  • AS — определяет временный синоним источника данных или столбца;
  • FROM — указывает источники данных как таблицы, представления, другие выборки. По необходимости здесь можно указать соединение источников — каким образом запись одного источника сопоставляется с записью другого;
  • WHERE — позволяет указать условия по которым нужно производить отбор данных. Если хоть одно из перечисленных условий не выполняется, запись не попадает в выборку. Здесь также можно указать соединение источников;
  • ORDER BY — позволяет отсортировать выборку по указанным полям;
  • ASC, DESC — задают направление сортировки;
  • GROUP BY — позволяет разбить выборку на группы по указанному полю. Все записи, имеющие одно и то же значение в указанном поле, будут принадлежать одной группе;
  • HAVING — позволяет задать условие включения группы в выборку. Набор возможных условий как у WHERE плюс возможность использования агрегатных функций;
  • FOR UPDATE — позволяет заблокировать выбранные данные для изменения;
  • DISTINCT — позволяет включить в выборку только уникальные записи. Конечно это замедляет запрос, но бывает необходимо при использовании агрегатных функций.

Это наверно самая сложная команда, поэтому ее изучение лучше разбить на несколько частей. Здесь рассмотрим эту команду в общем, а соединения, группировку данных и подобное более детально чуть позже. Пусть имеется следующая таблица с указанными данными.

выборка констант

Для выбора констант может указываться любой источник. Однако, если мы хотим просто
подсчитать значение какого-то выражения, то указывать источник имеющий сотню тысяч записей затратно по ресурсам. Поэтому многие СУБД позволяют выбрать константы без указания источника. Oracle не поддерживает синтаксис SELECT без FROM, а для выбора констант используется специальная системная таблица dual.

выборка по столбцам таблиц

Если источники данных указаны, то кроме констант можно выбирать столбцы или строить выражения с их использованием. Столбец определяется как имя_источника.имя_столбца. Если источник данных один, то его имя можно опустить. Для выбора всех столбцов всех источников используется символ *. Аналогично можно выбрать все столбцы указанного источника: имя_источника.*. Ниже приведен пример выборки всех записей нашей таблицы.

синонимы (алиасы)

При выборе данных можно назначать временные синонимы источникам данных и используемым столбцам. А в некоторых случаях необходимо. Например, когда источник подзапрос соединяется с другим источником, именование подзапроса обязательно. Другой пример, это объединение нескольких выборок, имена столбцов которых должны совпадать. Ключевое слово AS как правило необязательно, а в Oracle разрешено только для столбцов.

уникальные записи

Записи выборки считаются одинаковыми, если значения соответствующих полей одинаковы. Поэтому для демонстрации distinct на нашей таблице нужно исключить первичный ключ (поле id) из выборки.

Конструкция ORDER BY позволяет последовательно отсортировать сразу по нескольким столбцам. Столбцы, по которым происходит сортировка, желательно проиндексировать.

выборка по условию

Конструкция WHERE позволяет ограничить множество выбираемых записей. Ниже приведено несколько примеров.

выборка по группам

И напоследок пару примеров группировки данных.

Соединения (Join)

Этот раздел написан на основе материалов сайта Javenue.

Ключевое слово join в SQL используется при построении select выражений. Инструкция Join позволяет объединить колонки из нескольких таблиц в одну. Объединение происходит временное и целостность таблиц не нарушается. Существует три типа join-выражений:

В свою очередь, outer join может быть left, right и full (слово outer обычно опускается).

В качестве примера (DBMS Oracle) создадим две простые таблицы и сконструируем для них SQL-выражения с использованием join .

В первой таблице будет хранится ID пользователя и его nick-name, а во второй — ID ресурса, имя ресурса и ID пользователя, который может этот ресурс администрировать.

Содержимое таблиц пусть будет таким:

Конструкция join выглядит так:

. join_type join table_name on condition .

Где join_type — тип join-выражения, table_name — имя таблицы, которая присоединяется к результату, condition — условие объединения таблиц.

Кострукция join располагается сразу после select-выражения. Можно использовать несколько таких конструкций подряд для объединения соответствующего кол-ва таблиц. Логичнее всего использовать join в том случае, когда таблица имеет внешний ключ ( foreign key ).

Inner join необходим для получения только тех строк, для которых существует соответствие записей главной таблицы и присоединяемой. Иными словами условие condition должно выполняться всегда. Пример:

Результат будет таким:

В случае с left join из главной таблицы будут выбраны все записи, даже если в присоединяемой таблице нет совпадений, то есть условие condition не учитывает присоединяемую (правую) таблицу. Пример:

Результат выполнения запроса:

Результат показывает все ресурсы и их администраторов, вне зависимотсти от того есть они или нет.

Right join отображает все строки удовлетворяющие правой части условия condition , даже если они не имеют соответствия в главной (левой) таблице:

А результат будет следующим:

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

Full outer join (ключевое слово outer можно опустить) необходим для отображения всех возможных комбинаций строк из нескольких таблиц. Иными словами, это объединение результатов left и right join .

А результат будет таким:

Некоторые СУБД не поддерживают такую функциональность (например, MySQL), в таких случаях обычно используют объединение двух запросов:

Наконец, cross join. Этот тип join еще называют декартовым произведением (на английском — cartesian product). Настоятельно рекомендую использовать его с умом, так как время выполнения запроса с увеличением числа таблиц и строк в них растет нелинейно. Вот пример запроса, который аналогичен cross join :

Агрегатные функции, группировка данных

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

Сами по себе группы редко используются, и предыдущий пример выборки можно заменить
сортировкой. Другое дело, если необходимо воспользоваться одной из групповых функций,
называемых агрегатными:

  • avg([DISTINCT|ALL] column) — среднее значение по указанному столбцу;
  • count(*|[DISTINCT|ALL] соlumn) — количество элементов в выборке
    или в группе определяемой указанным столбцом;
  • sum([DISTINCT | ALL] соlumn) — сумма значений указанного столбца;
  • max(соlumn) — максимальное значение в столбце;
  • min(соlumn) — минимальное значение в столбце.

Ключевое слово DISTINCT позволяет игнорировать повторные значения в столбце, ALL
обрабатывает все значения в столбце (по умолчанию), * позволяет включить в обработку поля с null значением.
В MySQL между именем функции и скобкой не должно быть пробелов.
Ниже приведен пример использования агрегатных функций в качестве выбираемых данных. Если
агрегатная функция используется в выборке без group by, то она применяется ко всем записям
выборки, иначе для каждой группы в отдельности. И в любом случае в перечислении select нельзя
смешивать групповые столбцы с не групповыми.

Агрегатные функции можно использовать в выражениях условия в конструкции having для
отбора группы.

Операции над выборками

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

  • UNION — объединение, в конечной выборке записи из обоих запросов;
  • INTERSECT — пересечение, в конечной выборке записи входящие в оба запроса;
  • EXCEPT — исключение, в конечной выборке записи входящие только в первый запрос.

Запросы участвующие в таких операциях должны следовать нескольким условиям.
Иметь одинаковое число столбцов, соответствующие столбцы должны быть одного типа.
Тип данных столбца должен быть простым, т.е. не разрешаются типы подобные blob.
MySQL 5 поддерживает только UNION, в Oracle EXCEPT для других целей,
а для исключения используется MINUS.

По умолчанию в результирующую выборку попадают только уникальные записи.
Для включения всех записей используется ключевое слово ALL после имени операции.
Например, в следующем примере будет две записи со значением 2.

Добавление итогов в SQL

Еще раз рассмотрим таблицу bills созданную в пункте об агрегатных функциях.
Предположим мы хотим вывести все суммы, а в конце выборки добавить итоговую сумму.
Наиболее универсальным способом является объединение двух запросов.

Для решения подобных задач в стандарте введена конструкция ROLLUP генерирующая
дополнительную строку. Если в определении столбца агрегатная функция не используется,
то соответствующее поле в этой строке заполняется значением null. В противном случае
заполняется значением выражения столбца, причем агрегатная функция выполняется ко
всем записям основной выборки.

А теперь предположим мы хотим вывести все суммы с итогами по каждой группе и в конце выборки
общий итог. Ниже приведен пример с использованием объединений. Чтобы общий итог был точно в
конце выборки, задаем в поле d максимальню дату. В Oracle и Postgre можно оставить значение
null.

Подобную задачу можно решить с помощью стандартной конструкции CUBE, если она уже
реализована в СУБД. Куб генерирует не только общий итог, но и все возможные под итоги.
Ниже приведен пример использования куба. Для упрощения кода пустые значения не заменяются.

Нумерация записей

В стандарт SQL2003 уже добавлена функция row_number(), если она еще не реализована
в вашей версии БД, используйте следующие методы.

Oracle

В Oracle для нумерации записей введен псевдостолбец rownum.

MySQL

В MySQL для этого надо воспользоваться переменной. Чтобы увидеть результат следующего
примера в MySQLQueryBrowser, необходимо начать транзакцию (на панели кнопка после слова
Transaction). Далее выполняем приведенные в примере команды и затем завершаем транзакцию
(соседняя кнопка с галочкой).

PostgreSQL

В PostgreSQL для этих целей можно выделить последовательность и сбрасывать ее перед новой
выборкой.

Источник

Читайте также:  Каким порошком стирать вещи для детей
Оцените статью