SQL
December 29, 2023

Основные запросы SELECT

Фильтрация колонок

SELECT * FROM band;

В этом запросе выбираем все колонки из таблицы band

SELECT band_id, name, year, comment FROM band;

В этом запросе выбираем колонки band_id, name, year, comment.

Так же можно вывести дополнительную (несуществующую) колонку, создав ее в запросе. Например, мы хотим вывести дополнительную колонку, которая будет содержать названия групп в верхнем регистре:

SELECT band_id,
name, 
upper(name) as u_name
-- строка выше создает новый столбец, в котором будут прописаны группы
-- в верхнем регистре
FROM band;

ФИЛЬТРАЦИЯ СТРОК

Оператор WHERE

SELECT band_id, name -- выводим столбцы band_id и name 
FROM band -- из таблицы band 
WHERE band_id = 93; -- где band_id равен 93

WHERE можно указывать или не указывать. Если WHERE указано, тогда запрос выводит только строки, которые соответствуют условию фильтрации.

Если мы хотим посмотреть как выглядят строки из таблицы - можно запросить не всю таблицу (чтобы не перегружать систему), а всего несколько строк с помощью команды LIMIT

SELECT * FROM band LIMIT 10
-- LIMIT 10 говорит о том, что выводим всего 10 строк

Условие WHERE может быть более сложным, используя разные операторы.

Оператор OR (ИЛИ)

SELECT band_id, name
FROM band
WHERE band_id = 93 OR band_id = 192;
-- для каждой строки проверяем первое и второе условие. 
--Если хотя бы одно удовлетворяет - выводится результат

Выведет таблицу с двумя строками, где band_id 93 и 192. Если бы строки с band_id = 192 не существовало, тогда вывело бы только строку с 92.

Оператор AND (И)

Если нужно, чтобы оба условия выполнялись одновременно, тогда соединяем их оператором AND

SELECT *
FROM band
WHERE year < 1980 AND comment <>''
-- выводим группы, дата создания (year) меньше 1980 и comment - не пустой

Если в условии несколько AND и OR, то результат вывода зависит от того, в какой последовательности выполнить операции

SELECT *
FROM band
WHERE band_id = 303 OR (band_id = 93 AND year = 1981);
SELECT *
FROM band
WHERE (band_id = 303 OR band_id = 93) AND year = 1981;

Если скобки не указаны, то в стандарте SQL есть договоренность - сначала выполняется AND, затем OR.

SELECT *
FROM band
WHERE band_id = 303 OR band_id = 93 AND year 1981;

Но лучше, в любом случае, использовать скобки для читаемости:

SELECT *
FROM band
WHERE band_id = 303 OR (band_id = 93 AND year = 1981);

Операторы IN и NOT IN

Допустим, нужно составить конструкцию с несколькими операторами OR

SELECT band_id, name FROM band 
WHERE band_id = 303 OR band_id = 93 OR band_id = 192

Такая конструкция не совсем корректна и проще и лучше использовать такую конструкцию

SELECT band_id, name FROM band WHERE band_id IN (93, 192, 303)

Если нужно выбрать все, кроме каких либо значений. Можно написать конструкцию с несколькими AND

SELECT band_id, name FROM band 
WHERE band_id <> 2 AND band_id <> 3 AND band_id <> 192

Такая конструкция не совсем корректна и проще и лучше использовать такую конструкцию

SELECT band_id, name FROM band WHERE band_id NOT IN (2, 3, 192)

Оператор IN с подзапросом

Предположим, нужно сравнить значения с колонкой другой таблицы

SELECT band_id, name, year FROM band 
WHERE band_id IN (SELECT id FROM list1);

Оператор BETWEEN

Оператор BETWEEN - это полезный способ сравнить значение с диапазоном значений. Он используется для проверки, находится ли значение в указанном диапазоне включительно.

SELECT band_id, name, year FROM band 
WHERE year BETWEEN 1970 and 1981;
-- выставляем фильтр на группы, которые были созданы между 
-- 1970 и 1981 годами включительно

Оператор NOT

Иногда удобно использовать оператор NOT чтобы поменять условие на противоположное

SELECT * FROM band WHERE band_id <> 2
-- тоже самое, что
SELECT * FROM band WHERE NOT (band_id = 2)
SELECT * FROM band WHERE band_id < 2 OR band_id > 6
-- тоже самое, что
SELECT * FROM band WHERE NOT (band_id BETWEEN 2 and 6)
-- или же
SELECT * FROM band WHERE band_id NOT BETWEEN 2 and 6

Вложенные SELECT'ы

В условии WHERE указывается не набор констант через запятую, а значения из другой таблицы

SELECT * FROM band WHERE band_id IN (SELECT id FROM list1);

Другой вид подзапроса, когда вложенный SELECT находится не в условии WHERE, а в секции FROM

SELECT * FROM (SELECT band_id, name FROM band WHERE >= 1980) as p 
WHERE p.band_id BETWEEN 10 and 20
-- as p - это алиас можно использовать в основном запросе

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

Комментарии

Комментарии дают возможность в текстовом виде написать комментарии к запросу, а так же временно закомментировать (скрыть) некоторые элементы запроса.

Типы комментариев:

Однострочные (--) - определяются двумя дефисами, и все, что после них - это комментарий, невидимый для языка.

SELECT band_id, name 
FROM band 
WHERE name = 'Metallica' -- Take only Metallica

Многострочные - (/* */) - определяется открывающими /* и закрывающими */. Позволяет комментировать несколько строк подряд.

/*SELECT band_id, 
name 
FROM band;*/

Рассмотрим пример, как комментарии облегчают работу с кодом

SELECT band_id,
       name,
       year
FROM band
WHERE name = upper(name) --название записано заглавными буквами
AND year IN (2000, 2001) -- фильтрация по году
AND substring(name, 1, 1) BETWEEN 'a' AND 'z'; 
-- первая буква названия - строчная буква

С помощью динамической работы с комментами преобразовали код выше в этот код

SELECT band_id,
       upper(name) as u_name,
       year,
	   substring(name, 1, 1) as first_letter
FROM band
WHERE name = upper(name)
AND year IN (2000, 2001)
AND substring(name, 1, 1) BETWEEN 'A' AND 'Z';