Синтаксис SELECT SQL
Общий синтаксис оператора выглядит следующим образом:
SELECT column1, column2, …
FROM table_name
[WHERE condition]
[GROUP BY column1, column2, ...]
[HAVING condition]
[ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...];
Здесь:
- после SELECT указываются один или несколько столбцов, которые нужно выбрать;
- после FROM указывается таблица, из которой нужно выбрать эти столбцы;
- после WHERE (этот оператор опциональный, как и все следующие) указывается условие, по которому нужно фильтровать данные;
- GROUP BY нужен для группировки строк по столбцам, которые указываются после этого оператора;
- HAVING нужен для фильтрации групп (то есть применяется после GROUP BY);
- ORDER BY нужен для сортировки результата.
Самый простой пример SQL-запроса с SELECT может выглядеть так:
SELECT name, age
FROM students;
В результате будут выбраны столбцы «имя» и «возраст» из таблицы с информацией о студентах.
Порядок логической обработки инструкции SELECT
В SQL запросы обрабатываются в определенном порядке. Ниже этот порядок представлен в виде списка (в него включено больше операторов, чем было рассмотрено в разделе синтаксиса):
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- WITH CUBE или WITH ROLLUP
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- TOP
Можно заметить, что порядок выполнения отличается от того, как эти операторы записываются в запросе. Но зачем это нужно учитывать? Допустим, из таблицы с информацией о студентах необходимо получить только те группы, где средняя оценка больше 4.
Попробуем выполнить эту задачу, используя WHERE. Ниже представлено построчное объяснение запроса:
- Выбор нужного столбца (в данном случае это столбец с группами студентов) с помощью SELECT. Запись функции AVG(), которая вычисляет среднее значение оценок студентов в каждой группе. После AS указывается псевдоним, в который будет записан результат функции AVG().
- Указание на таблицу, из которой будут выбраны данные (в данном случае students).
- Группировка по группам студентов: к одной группе будут отнесены все студенты с одинаковыми значениями поля group. Именно для этих групп будет рассчитана функция AVG().
- После WHERE будет указано условие: средняя оценка студентов в данной группе должна быть больше 4.
SELECT group, AVG(score) AS avg_score
FROM students
GROUP BY group
WHERE avg_score > 4;
Такой SQL-запрос завершится ошибкой, так как WHERE обрабатывается до GROUP BY и ничего не знает о группировке и значении avg_score. Поэтому для решения этой задачи нужно использовать HAVING:
SELECT group, AVG(score) AS avg_score
FROM students
GROUP BY group
HAVING avg_score > 4;
Этот запрос сработает так, как ожидается, потому что HAVING обрабатывается после GROUP BY и уже может использовать значение avg_score.
Примеры использования SELECT SQL
Рассмотрим примеры использования SELECT, в том числе в комбинации с другими операторами SQL. То, как можно выбрать определенные столбцы, уже описано в разделе о синтаксисе, теперь можно рассмотреть то, как выбрать все столбцы:
SELECT * FROM students;
Так можно выбрать студентов, оценка которых выше 4:
SELECT student_name, score FROM students
WHERE score > 4;
Также с помощью BETWEEN можно задать определенный диапазон оценок, например, от 2 до 4:
SELECT student_name, score FROM students
WHERE score BETWEEN 2 AND 4;
Дополнительно можно отсортировать результат, расположив оценки в порядке убывания:
SELECT student_name, score FROM students
WHERE score BETWEEN 2 AND 4 ORDER BY score DESC;
Если нужно отсортировать результат по возрастанию какого-то значения, то используется ASC. Так можно получить список всех студентов от младших к старшим (то есть в порядке возрастания возраста):
SELECT * FROM students
ORDER BY age ASC;
Количество возвращаемых строк в SQL можно ограничить с помощью LIMIT. Например, если нужно получить список из 10 лучших студентов (то есть тех, чьи оценки самые высокие), то подойдет такой запрос:
SELECT student_name, score FROM students
ORDER BY score DESC
LIMIT 5;
С помощью функции AVG() можно найти среднюю оценку всех студентов:
SELECT AVG(score) FROM students;
Если нужно выбрать только уникальные значения определенного столбца, то нужно воспользоваться DISTINCT. Так можно выбрать только уникальные значения столбца age:
SELECT DISTINCT age FROM teachers;
SQL-оператор SELECT также позволяет узнать количество строк в таблице:
SELECT COUNT(*) FROM teachers;
С помощью оператора LIKE в SQL можно выполнять поиск по шаблону. Например, такой запрос вернет всех преподавателей, чья фамилия начинается на букву А:
SELECT teachers_last_name FROM teachers
WHERE teachers_last_name LIKE 'A%';
Если необходимо выбрать только тех учеников, которые обучаются в определенных группах, то можно воспользоваться оператором IN. Например, если нужны студенты из 1, 5 и 10 группы, то подойдет такой запрос:
SELECT student_last_name FROM students
WHERE group IN(1, 5, 10);
GROUP BY позволяет группировать данные. Например, так можно получить среднюю оценку студентов по группам (то есть, узнать, каков средний балл в каждой группе):
SELECT group, AVG(score) AS avg_score FROM students
GROUP BY group
Также в SQL есть логические операторы (NOT (логическое отрицание), OR (логическое сложение), AND (логическое умножение)). Часто они нужны для объединения условий. Так можно получить список фамилий студентов, которые учатся во второй группе и имеют оценку выше, чем 4:
SELECT student_name, score FROM students
WHERE score > 4 AND group = 2;
Оператор UNION в SQL нужен для объединения результатов нескольких запросов. К примеру, можно объединить два запроса: на выбор студентов с оценкой выше 4 и преподавателей, чья фамилия начинается на букву А:
SELECT student_name, score FROM students WHERE score > 4
UNION
SELECT teacher_last_name FROM teachers WHERE teacher_last_name LIKE 'A%';
CASE — это еще один полезный оператор в SQL, который позволяет создавать условную логику: менять поведение программы в зависимости от соответствия или несоответствия какому-то условию. Так можно вывести оценки за экзамен в формате текстового представления (например, 5 — это «Отлично»):
SELECT student_name, student_last_name,
CASE
WHEN score = 5 THEN 'Отлично'
WHEN score = 4 THEN 'Хорошо'
WHEN score = 3 THEN 'Удовлетворительно'
ELSE 'Неудовлетворительно'
END AS performance
FROM students;
В результате будут выведены имена и фамилии студентов, а также их оценка за экзамен в текстовом формате.
Также в SQL существуют подзапросы — это запросы, которые используются в других запросах и обычно выполняются до основного запроса. Подзапрос всегда записывается в круглых скобках. Так можно найти самого старшего преподавателя:
SELECT * FROM teachers
WHERE age = (SELECT MAX(age) FROM teachers);
Итак, сначала выполнится выражение в скобках (будет найдено максимальное значение столбца age в таблице teachers), а затем результат выполнения будет использоваться оператором WHERE.