Основные запросы 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';