Sql запрос вывод данных таблицы. Как составлять SQL-запросы - подробные примеры
Типы данных SQL (Как в Pg , как в стандарте)
Строковые типы
Числовые типы данных
Денежные, Символьные, Двоичные типы данных
Логический тип. Перечисления
Примеры простейших SQL-запросов
Простейшие SELECT-запросы
Оператор SELECT (выбрать) языка SQL является самым важным и самым часто используемым оператором. Он предназначен для выборки информации из таблиц базы данных. Упрощенный синтаксис оператора SELECT выглядит следующим образом.
SELECT [ ALL | DISTINCT ] select_item_commalist
FROM table_reference_commalist
[ WHERE conditional_expression ]
[ GROUP BY column_name_commalist ]
[ HAVING conditional_expression ]
[ ORDER BY order_item_commalist ]
В квадратных скобках указаны элементы, которые могут отсутствовать в запросе.
Ключевое слово SELECT сообщает базе данных, что данное предложение является запросом на извлечение информации.
После слова SELECT через запятую перечисляются наименования полей (список атрибутов), содержимое которых запрашивается.
Обязательным ключевым словом в предложении-запросе SELECT является слово FROM (из). За ключевым словом FROM указывается список разделенных запятыми имен таблиц, из ко-торых извлекается информация.
Например, select title, description from film
Любой SQL-запрос должен заканчиваться символом «;» (точка с запятой). Результатом данного запроса будет таблица...
Порядок следования столбцов в этой таблице соответствует порядку полей, указанному в запросе
Если необходимо вывести значения всех, столбцов таблицы, то можно вместо перечисления их имен использовать символ «*» (звездочка).
SELECT * FROM film;
В данном случае результатом выполнения запроса будет вся таблица film.
Еще раз обратим внимание на то, что получаемые в результате SQL-запроса таблицы не в полной мере отвечают определению реляционного отношения. В частности, в них могут оказаться кортежи (строки) с одинаковыми значениями атрибутов.
Например, запрос «список имен актеров», можно записать в следующем виде.
select first_name from actor;
Его результатом будет таблица, в таблице встречаются одинаковые строки. Для исключения из результата SELECT-запроса повторяющихся записей используется ключевое слово DISTINCT (отличный).
Если запрос SELECT извлекает множество полей, то DISTINCT исключает дубликаты строк, в которых значения всех выбранных полей идентичны.
Предыдущий запрос можно записать в следующем виде.
select distinct first_name from actor;
В результате получим таблицу, в которой дубликаты строк исключены.
Ключевое слово ALL (все), в отличие от DISTINCT, оказывает противоположное действие, то есть при его использовании повторяющиеся строки включаются в состав выходных данных. Режим, задаваемый ключевым словом ALL, действует по умолчанию, поэтому в реальных запросах для этих целей оно практически не используется.
Использование в операторе SELECT предложения, определяемого ключевым словом WHERE (где), позволяет задавать выражение условия (предикат), принимающее значение истина или ложь для значений полей строк таблиц, к которым обращается оператор SELECT. Предложение WHERE определяет, какие строки указанных таблиц должны быть выбраны. В таблицу, яв-ляющуюся результатом запроса, включаются только те строки, для которых условие (предикат), указанное в предложении WHERE, принимает значение истина.
Пример: Написать запрос, выполняющий выборку фамилий всех актеров с именем PENELOPE
select last_name from actor
where first_name="PENELOPE";
В задаваемых в предложении WHERE условиях могут использоваться операции сравнения, определяемые операторами = (равно), > (больше), < (меньше), >= (больше или равно), <- (меньше или равно), <> (не равно), а также логические операторы AND, OR И NOT.
Например, запрос для получения названий и описаний фильмов - короткометражек (короче 60 мин), прокат которых стоит меньше 3$ , будет выглядеть таким образом:
select title, description from film
where length < 60 and rental_rate < 3
Результат выполнения этого запроса имеет вид:
rental - прокат
inventory - опись, запасы
store- запас, магазин
Итак, в нашей БД forum есть три таблицы: users (пользователи), topics (темы) и posts (сообщения). И мы хотим посмотреть, какие
данные в них содержатся. Для этого в SQL существует оператор SELECT
. Синтаксис его использования следующий:
SELECT что_выбрать FROM откуда_выбрать;
Вместо "что_выбрать" мы должны указать либо имя столбца, значения которого хотим увидеть, либо имена нескольких столбцов через запятую, либо символ звездочки (*), означающий выбор всех столбцов таблицы. Вместо "откуда_выбрать" следует указать имя таблицы.
Давайте сначала посмотрим все столбцы из таблицы users:
SELECT * FROM users;
Вот и все наши данные, которые мы вносили в эту таблицу. Но предположим, что мы хотим посмотреть только столбец id_user (например, в прошлом уроке, нам надо было для заполнения таблицы topics (темы) знать, какие id_user есть в таблице users). Для этого в запросе мы укажем имя этого столбца:
SELECT id_user FROM users;
Ну, а если мы захотим посмотреть, например, имена и e-mail наших пользователей, то мы перечислим интересующие столбцы через запятую:
SELECT name, email FROM users;
Аналогично, вы можете посмотреть, какие данные содержат и другие наши таблицы. Давайте посмотрим, какие у нас существуют темы:
SELECT * FROM topics;
Сейчас у нас всего 4 темы, а если их будет 100? Хотелось бы, чтобы они выводились, например, по алфавиту. Для этого в SQL существует
ключевое слово ORDER BY
после которого указывается имя столбца по которому будет происходить сортировка.
Синтаксис следующий:
SELECT имя_столбца FROM имя_таблицы ORDER BY имя_столбца_сортировки;
По умолчанию сортировка идет по возрастанию, но это можно изменить, добавив ключевое слово DESC
Теперь наши данные отсортированы в порядке по убыванию.
Сортировку можно производить сразу по нескольким столбцам. Например, следующий запрос отсортирует данные по столбцу topic_name, и если в этом столбце будет несколько одинаковых строк, то в столбце id_author будет осуществлена сортировка по убыванию:
Сравните результат с результатом предыдущего запроса.
Очень часто нам не нужна вся информация из таблицы. Например, мы хотим узнать, какие темы были созданы пользователем sveta (id=4).
Для этого в SQL есть ключевое слово WHERE
, синтаксис у такого запроса следующий:
Для нашего примера условием является идентификатор пользователя, т.е. нам нужны только те строки, в столбце id_author которых стоит 4
(идентификатор пользователя sveta):
Или мы хотим узнать, кто создал тему "велосипеды":
Конечно, было бы удобнее, чтобы вместо id автора, выводилось его имя, но имена хранятся в другой таблице. В последующих уроках мы узнаем, как выбирать данные из нескольких таблиц. А пока узнаем, какие условия можно задавать, используя ключевое слово WHERE.
Оператор | Описание |
= (равно) | Отбираются значения равные указанному Пример: SELECT * FROM topics WHERE id_author=4; Результат: |
> (больше) | Отбираются значения больше указанного Пример: SELECT * FROM topics WHERE id_author>2; Результат: |
< (меньше) | Отбираются значения меньше указанного Пример: SELECT * FROM topics WHERE id_author |
>= (больше или равно) | Отбираются значения большие и равные указанному Пример: SELECT * FROM topics WHERE id_author>=2; Результат: |
<= (меньше или равно) | Отбираются значения меньшие и равные указанному Пример: SELECT * FROM topics WHERE id_author |
!= (не равно) | Отбираются значения не равные указанному Пример: SELECT * FROM topics WHERE id_author!=1; Результат: |
IS NOT NULL | Отбираются строки, имеющие значения в указанном поле Пример: SELECT * FROM topics WHERE id_author IS NOT NULL; Результат: |
IS NULL | Отбираются строки, не имеющие значения в указанном поле Пример: SELECT * FROM topics WHERE id_author IS NULL; Результат: Empty set - нет таких строк. |
BETWEEN (между) | Отбираются значения, находящиеся между указанными Пример: SELECT * FROM topics WHERE id_author BETWEEN 1 AND 3; Результат: |
IN (значение содержится) | Отбираются значения, соответствующие указанным Пример: SELECT * FROM topics WHERE id_author IN (1, 4); Результат: |
NOT IN (значение не содержится) | Отбираются значения, кроме указанных Пример: SELECT * FROM topics WHERE id_author NOT IN (1, 4); Результат: |
LIKE (соответствие) | Отбираются значения, соответствующие образцу Пример: SELECT * FROM topics WHERE topic_name LIKE "вел%"; Результат: Возможные метасимволы оператора LIKE будут рассмотрены ниже. |
NOT LIKE (не соответствие) | Отбираются значения, не соответствующие образцу Пример: SELECT * FROM topics WHERE topic_name NOT LIKE "вел%"; Результат: |
Метасимволы оператора LIKE
Поиск с использованием метасимволов может осуществляться только в текстовых полях.Самый распространенный метасимвол - % . Он означает любые символы. Например, если нам надо найти слова, начинающиеся с букв "вел", то мы напишем LIKE "вел%", а если мы хотим найти слова, которые содержат символы "клуб", то мы напишем LIKE "%клуб%". Например:
Еще один часто используемый метасимвол - _ . В отличие от %, который обозначает несколько или ни одного символа, нижнее подчеркивание обозначает ровно один символ. Например:
Обратите внимание на пробел между метасимволом и "рыб", если его пропустить, то запрос не сработает, т.к. метасимвол _ обозначает ровно один символ, а пробел - это тоже символ.
На сегодня достаточно. В следующем уроке мы научимся составлять запросы к двум и более таблицам. А пока попробуйте самостоятельно составить запросы к таблице posts (сообщения).
Синтаксис:
* где fields1
— поля для выборки через запятую, также можно указать все поля знаком *; table
— имя таблицы, из которой вытаскиваем данные; conditions
— условия выборки; fields2
— поле или поля через запятую, по которым выполнить сортировку; count
— количество строк для выгрузки.
* запрос в квадратных скобках не является обязательным для выборки данных.
Простые примеры использования select
1. Обычная выборка данных:
> SELECT * FROM users
2. Выборка данных с объединением двух таблиц (JOIN):
SELECT u.name, r.* FROM users u JOIN users_rights r ON r.user_id=u.id
* в данном примере идет выборка данных с объединением таблиц users и users_rights . Объединяются они по полям user_id (в таблице users_rights) и id (users). Извлекается поле name из первой таблицы и все поля из второй.
3. Выборка с интервалом по времени и/или дате
а) известна точка начала и определенный временной интервал:
* будут выбраны данные за последний час (поле date ).
б) известны дата начала и дата окончания:
25.10.2017 и 25.11.2017 .
в) известны даты начала и окончания + время:
* выбираем данные в промежутке между 25.03.2018 0 часов 15 минут и 25.04.2018 15 часов 33 минуты и 9 секунд .
г) вытаскиваем данные за определенные месяц и год:
* извлечем данные, где в поле date присутствуют значения для апреля 2018 года.
4. Выборка максимального, минимального и среднего значения:
> SELECT max(area), min(area), avg(area) FROM country
* max — максимальное значение; min — минимальное; avg — среднее.
5. Использование длины строки:
* данный запрос должен показать всех пользователей, имя которых состоит из 5 символов.
Примеры более сложных запросов или используемых редко
1. Объединение с группировкой выбранных данных в одну строку (GROUP_CONCAT):
* из таблицы users извлекаются данные по полю id , все они помещаются в одну строку, значения разделяются запятыми .
2. Группировка данных по двум и более полям:
> SELECT * FROM users GROUP BY CONCAT(title, "::", birth)
* итого, в данном примере мы сделаем выгрузку данных из таблицы users и сгруппируем их по полям title и birth . Перед группировкой мы делаем объединение полей в одну строку с разделителем :: .
3. Объединение результатов из двух таблиц (UNION):
> (SELECT id, fio, address, "Пользователи" as type FROM users)
UNION
(SELECT id, fio, address, "Покупатели" as type FROM customers)
* в данном примере идет выборка данных из таблиц users и customers .
4. Выборка средних значений, сгруппированных за каждый час:
SELECT avg(temperature), DATE_FORMAT(datetimeupdate, "%Y-%m-%d %H") as hour_datetime FROM archive GROUP BY DATE_FORMAT(datetimeupdate, "%Y-%m-%d %H")
* здесь мы извлекаем среднее значение поля temperature из таблицы archive и группируем по полю datetimeupdate (с разделением времени за каждый час).
Вставка (INSERT)
Синтаксис 1:
> INSERT INTO
snum | sname | city | comm |
---|---|---|---|
1001 | Peel | London | 0,12 |
1002 | Serres | San Jose | 0,13 |
1003 | Axelrod | New York | 0,1 |
1004 | Motika | London | 0,11 |
1007 | Rifkin | Barcelona | 0,15 |
Так будут выведены 4 столбца, однако при такой записи можно легко закомментировать ненужный столбец. Например так:
SELECT /* snum , */ sname , city , comm FROM Salespeople
Теперь столбец snum выводиться не будет, потому что он закомментирован. Очень быстро и удобно. Как писать SQL код, решать конечно Вам, но знать такие вещи иногда бывает полезно.
Использование выражений (expressions) в операторе SELECT
Многие СУБД предоставляют специальные возможности по обработке результатов запроса. Набор таких средств в разных СУБД различен, однако существуют некоторые стандартные возможности, такие как выражения. Например может потребоваться выполнить простые математические операции над данными, чтобы представить их в более удобном виде, или вставить дополнительный текст в результат запроса. SQL позволяет размещать среди выбранных столбцов скалярные выражения и константы, которые могут дополнять или замещать столбцы в предложениях SELECT. Рассмотрим пример.
4. Необходимо вывести комиссионные (comm) продавцов в виде процентов, а не десятичных чисел
SELECT snum, sname, city, comm * 100 FROM Salespeople
Результат:
snum | sname | city | comm |
---|---|---|---|
1001 | Peel | London | 12 |
1002 | Serres | San Jose | 13 |
1003 | Axelrod | New York | 10 |
1004 | Motika | London | 11 |
1007 | Rifkin | Barcelona | 15 |
Этот столбец не имеет названия, потому что не содержит измененные данные и поэтому именуется по усмотрению СУБД (например MySQL именует столбец comm * 100, в примерах М.Граббера столбец имеет имя 4, т.е его номер).
В таких случаях удобно использовать именование столбцов . Например можно назвать последний столбец percent. Для этого после имени столбца необходимо указать ключевое слово AS и затем имя столбца в результирующей страницы.
SELECT snum, sname, city, comm * 100 AS "percent"
FROM Salespeople
Результат:
snum | sname | city | percent |
---|---|---|---|
1001 | Peel | London | 12 |
1002 | Serres | San Jose | 13 |
1003 | Axelrod | New York | 10 |
1004 | Motika | London | 11 |
1007 | Rifkin | Barcelona | 15 |
В результате запроса последний столбец именуется строкой "percent", что облегчает понимание.
Так как выводится число в виде процентов, то неплохо бы обозначить это в результате. На помощь приходит возможность SQL добавлять текст в результат . Выглядит это так:
SELECT snum, sname, city, comm * 100 AS percent , "%" FROM Salespeople
Результат:
snum | sname | city | percent | % |
---|---|---|---|---|
1001 | Peel | London | 12 | % |
1002 | Serres | San Jose | 13 | % |
1003 | Axelrod | New York | 10 | % |
1004 | Motika | London | 11 | % |
1007 | Rifkin | Barcelona | 15 | % |
Видно, что после вывода строки из БД, появился новый столбец, заполненный знаком процента (%).
Если Вас не устраивает вывод данных и дополняющего текста в разных столбцах, то можно использовать специальные функции Вашей СУБД, для объединения в один столбец.
В MySQL для этого используется функция CONCAT . Вот ее определение из справочника:
CONCAT(str1,str2,...)
Возвращает строку, являющуюся результатом конкатенации аргументов. Если хотя бы один из аргументов равен NULL, возвращается NULL. Может принимать более 2 аргументов. Числовой аргумент преобразуется в эквивалентную строковую форму.
Пример:
SELECT snum, sname, city , CONCAT(comm * 100, "%") AS "persent" FROM salespeople
Результат:
snum | sname | city | persent |
---|---|---|---|
1001 | Peel | London | 12.000% |
1002 | Serres | San Jose | 13.000% |
1003 | Axelrod | New York | 10.000% |
1004 | Motika | London | 11.000% |
1007 | Rifkin | Barcelona | 15.000% |
В данном запросе, функция CONCAT принимает 2 аргумента, это comm * 100 и знак процента ("%"). После этого с помощью AS мы именуем столбец.
Важно знать, что использование функций ухудшает быстродействие. Это не единственный минус, но очень важный. Поэтому если можно обойтись стандартным кодом SQL, лучше не использовать функции. О них стоит вспоминать только в крайних случаях.
Исключение избыточных данных
Часто бывает необходимым исключить повторяющиеся значения из результатов запроса. Для этого используется ключевое слово DISTINCT. Противоположный эффект дает применение слова ALL, которое используется по умолчанию (т.е. его не нужно указывать).
5. Необходимо вывести города (city), где есть продавцы
Запрос без исключений:
SELECT city FROM salespeople
Результат:
Повторяющиеся значение London исключены из результата, что и требовалось.
Сортировка результата по значениям столбцом
Оператор SELECT выводит данные в произвольной последовательности. Для сортировки результата по определенному столбцу, в SQL используется оператор ORDER BY (т.е. упорядочить по….). Этот оператор позволяет изменить порядок вывода данных. ORDER BY упорядочивает результат запроса в соответствии со значениями одного или нескольких столбцов, выбранных в предложении SELECT. При этом для каждого столбца можно задать сортировку по возрастанию – ascending (ASC) (этот параметр используется по умолчанию) или по убыванию – descending (DESC).
Отсортируем результат по столбцу sname. После оператора ORDER BY указываем по какому столбцу сортировать, затем необходимо указать способ сортировки
Пример – сортировка по возрастанию:
SELECT * FROM Salespeople ORDER BY sname ASC
Результат:
Пример – сортировка по нескольким столбца:
SELECT snum, sname, city FROM Salespeople ORDER BY sname DESC, city DESC Результат:
snum | sname | city |
---|---|---|
1002 | Serres | San Jose |
1007 | Rifkin | Barcelona |
1001 | Peel | London |
1004 | Motika | London |
1003 | Axelrod | New York |
Несколько важных замечаний:
- столбец, по которому происходит сортировка, обязательно должен быть указан в SELECT (можно использовать *)
- оператор ORDER BY всегда пишется в конце запроса