SQL-запросы по-быстрому: краткий и понятный гайд
SQL (Structured Query Language) — это язык структурированных запросов. Он позволяет читать, записывать, удалять, сортировать и фильтровать информацию в базе данных.
В SQL используется немного слов. Он напоминает человеческий язык и поэтому его легко изучить. С его помощью можно работать с реляционными базами данных: пользователь отправляет SQL-запрос к базе данных через систему управления базами данных (СУБД). Последняя обрабатывает запрос и отправляет полученные данные пользователю.
Структура SQL-запроса
Запрос на выборку данных выглядит вот так:
SELECT ('столбцы через запятую или символ * для выбора всех столбцов') FROM ('таблицы через запятую') WHERE ('условие или фильтр') GROUP BY ('столбцы через запятую, по которым нужно сгруппировать данные') HAVING ('условие в уже сгрупированных данных') ORDER BY ('столбцы через запятую, по которым нужно отсортировать вывод')
Рассмотрим подробнее, как производится выборка.
SELECT и FROM
SELECT и FROM — обязательные ключевые слова в этом запросе. С их помощью можно указать, откуда и какие данные можно выбрать:
- К примеру, выбрать фамилии сотрудников из таблицы Employees:
SELECT last_name FROM Employees
- Получить только фамилию и размер зарплаты из этой же таблицы:
SELECT last_name, salary FROM Employees
Обратите внимание: имена столбцов указываются через запятую.
- Выбрать все столбцы из таблицы Employees:
SELECT * FROM Employees
Для выборки всех столбцов применяется групповой символ «*». При его использовании столбцы будут возвращены, но иногда порядок может не соблюдаться.
Групповой символ упрощает запрос, но при этом снижает производительность. Поэтому лучше использовать его в редких случаях.
WHERE
Обычно нам нужна определенная информация из таблицы. Но как ее быстро найти? WHERE помогает извлечь информацию, отфильтровав ее по одному или нескольким условиям. Это очень удобно!
С WHERE применяются такие операции:
- = (равенство);
- <> или != (неравенство);
- < (меньше);
- <= (меньше или равно) или !> (не больше);
- > (больше);
- >= (больше или равно) или !< (не меньше);
- BETWEEN (между двумя значениями);
- IS NULL (пустое поле).
Некоторые из операций приведены в нескольких вариантах, потому что в разных СУБД они указываются по-разному. Чтобы узнать, какие операции используются в вашей СУБД — смотрите ее документацию.
Теперь вернемся к практике. Например, вам нужно выбрать фамилии сотрудников с зарплатой свыше 1000. Применим WHERE:
SELECT last_name FROM Employees WHERE salary > 1000
Если требуется указать значение строки, заключите его в апострофы:
SELECT * FROM Employees WHERE department = 'Sales'
Фильтр по нескольким условиям
Данные можно фильтровать не только по одному, а и по нескольким условиям и значениям. Для этого используются операторы IN, NOT IN, AND, OR.
- Отфильтровать по нескольким значениям с дополнительными условиями:
SELECT * FROM Employees WHERE department IN ('IT', 'Marketing')
В результате этого запроса будут выбраны все сотрудники из подразделений ИТ и маркетинга.
- Отфильтровать по нескольким значениям с исключением:
SELECT * FROM Employees WHERE department NOT IN ('IT', 'Marketing')
Будут выбраны все сотрудники, кроме тех, кто работает в подразделениях ИТ и маркетинга.
- Выбрать сотрудников из ИТ-подразделения с зарплатой свыше 1000:
SELECT * FROM Employees WHERE department = 'IT' AND salary > 1000
- Выбрать сотрудников из ИТ-подразделения или с зарплатой свыше 1000:
SELECT * FROM Employees WHERE department = 'IT' OR salary > 1000
GROUP BY
С помощью необязательного предложения GROUP BY создаются группы данных. Это удобно для получения итоговых значений. Например, нужно узнать, сколько человек работает в отделе продаж. Инструкция может выглядеть так:
SELECT department, COUNT (*) AS cnt FROM Employees GROUP BY department
Этот код возвращает названия подразделений и количество работников в каждом из них. Количество сотрудников помещается в столбец с псевдонимом cnt, который мы задали с помощью ключевого слова AS.
Предложение GROUP BY указывается после WHERE и перед ORDER BY.
В GROUP BY можно указать столько столбцов, сколько нужно. В результате группы вкладываются друг в друга.
При вложении данные будут суммироваться для последней заданной группы, а не для отдельно для каждого столбца.
В предложении GROUP BY можно указать только столбцы выборки или выражения. В нем не указывается функция группирования и не применяются псевдонимы.
Если в столбце, по которому производится группирование, встречается одна или несколько строк со значением NULL, они выделяются в отдельную группу.
HAVING
С помощью предложения GROUP BY можно также указывать, какие группы включить в результат, а какие — исключить из него. Для этого используется предложение HAVING. Оно очень напоминает WHERE, но фильтрует не строки, а группы.
HAVING можно использовать с любыми операторами. В этом предложении используется тот же синтаксис, что и в предложении WHERE:
SELECT department, COUNT (*) AS cnt FROM Employees GROUP BY department HAVING COUNT(*) >= 3
Этот код похож на предыдущий, но возвращает только те группы, в которых найдены три или больше сотрудников. Фильтрация выполняется по итоговому значению группы. Этим HAVING отличается от WHERE, которое фильтрует по значениям строк.
Эти предложения можно использовать вместе. Например, можно узнать, сколько сотрудников в подразделениях со штатом более трех человек, получают более 1000:
SELECT department, COUNT (*) AS cnt FROM Employees WHERE salary > 1000 GROUP BY department HAVING COUNT(*) >= 3
Сначала выбираются все строки, где в столбце salary содержатся значения больше 1000. А затем выбираются только те группы, в которых не меньше трех записей.
ORDER BY
Предложение ORDER BY используется для сортировки результатов запроса. В нем указываются имена столбцов, по которым нужна сортировка.
Давайте отсортируем список фамилий сотрудников:
SELECT last_name FROM Employees ORDER BY last_name
В предложении ORDER BY можно указывать и те столбцы, которые не выбраны в операторе SELECT:
SELECT last_name FROM Employees ORDER BY salary
Так список фамилий сотрудников будет отсортирован по размеру зарплаты.
Сортировку можно выполнять и по нескольким столбцам. Для этого имена столбцов указывают через запятую:
SELECT first_name, last_name FROM Employees ORDER BY last_name, first_name
Так мы увидим список сотрудников, который сначала отсортирован по фамилии, а затем — по имени.
Вместо имен столбцов можно указать их порядковые номера в операторе SELECT:
SELECT first_name, last_name FROM Employees ORDER BY 2, 1
Этот код также возвращает список сотрудников с сортировкой по фамилии, а затем — по имени.
Сортировка по убыванию
В предыдущих примерах мы сортировали по возрастанию (это делается по умолчанию). Но можно сортировать и по убыванию. Для этого укажем слово DESC:
SELECT first_name, last_name FROM Employees ORDER BY last_name DESC
Так мы отсортируем список с именами и фамилиями в обратном алфавитном порядке.
Если обратная сортировка выполняется по нескольким столбцам, укажите ключевое слово DESC после каждого из них.
Слово DESC — это сокращение от слова DESCENDING. В запросах можно использовать как полную, так и сокращенную форму. Для сортировки в порядке возрастания тоже существует ключевое слово. Его полная форма — ASCENDING, а сокращенная — ASC. Поскольку по умолчанию выполняется сортировка по возрастанию, то это слово не указывают.
Объединение таблиц
Иногда нам нужны данные из нескольких таблиц. Рассмотрим пример:
SELECT first_name, last_name, order_id FROM Employees, Orders WHERE Employees. employee_id = Orders.employee_id
Этот код возвратит имена и фамилии сотрудников из таблицы Employees и номера заказов из таблицы Orders, которые выполнены соответствующими сотрудниками. В предложении WHERE имена столбцов указаны с именами соответствующих таблиц. Это необходимо, чтобы СУБД могла различать столбцы employee_id из разных таблиц.
Такое объединение называется внутренним. Для него можно использовать специальный синтаксис с ключевым словом INNER JOIN. Приведенный ниже код выдаст те же результаты, что и предыдущий фрагмент:
SELECT first_name, last_name, order_id FROM Employees INNER JOIN Orders ON Employees.employee_id = Orders.employee_id
Вместо предложения WHERE используется предложение ON, синтаксис которого совпадает с синтаксисом WHERE.
Число объединяемых таблиц в SQL не ограничено, но может ограничиваться в разных СУБД. Обратите внимание: чем больше таблиц объединяется, тем ниже производительность. Поэтому не рекомендуем объединять таблицы без особой необходимости.
Вместо заключения
SQL — простой для освоения и при этом мощный язык. Он появился в 1970-х и до сих пор используется, хотя наряду с ним появляются новые похожие языки. Этот язык используется различными СУБД: MySQL, SQLite, Oracle Database, Microsoft Access, Microsoft SQL Server, dBASE, IBM DB2.
Сегодня SQL — не просто язык формирования запросов. С его помощью можно упорядочивать и изменять данные, делать выборки, управлять доступом к ним, совместно использовать информацию и обеспечивать ее целостность. Пользуйтесь!
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: