SELECT: базовый запрос
SELECT: базовый запрос
Если SQL был бы игрой, то SELECT - это кнопка «начать». Жмёшь - и понеслось. Это та самая группа DQL, о которой шла речь в первом уроке.
Базовый SELECT
SELECT 1;
SELECT 'Привет, SQL' AS message;
Даже без таблиц SELECT работает. Используй это для быстрой проверки:
SELECT NOW(); - текущее время
SELECT 10 + 5; - арифметика
SELECT 'test' LIKE 't%'; - логика
SELECT из таблицы
SELECT * FROM users;
SELECT id, name, email FROM users;
Alias (AS) - переименование столбцов
Хочешь вывести столбец с другим именем? Используй AS:
SELECT id, name AS username, email AS user_email FROM users;
SELECT COUNT(*) AS total_users FROM users; - подробнее про такие функции в уроке про [агрегаты и GROUP BY](./05-group-by.md)
SELECT price * quantity AS total_amount FROM orders;
Alias в SELECT только для результата. Если потом нужен WHERE или ORDER BY, используй исходное имя:
SELECT id, age * 2 AS double_age
FROM users
WHERE age > 18 - используем исходное имя age
ORDER BY age DESC; - и тут тоже
DISTINCT - только уникальные значения
Если хочешь узнать, какие города есть в базе, но не все 10 млн строк:
SELECT DISTINCT city FROM users;
Вместо вывода каждого города из каждого пользователя (10 млн строк) получишь уникальные города (допустим, 50 строк).
Можно и по нескольким столбцам:
SELECT DISTINCT city, country FROM users;
NULL в результатах
NULL - это «пусто» или «неизвестно». Это не 0, не пустая строка, а специальное значение:
SELECT id, name, phone FROM users;
-- Результат:
-- id | name | phone
-- 1 | Alice | +7999...
-- 2 | Bob | NULL - нет номера
-- 3 | Carol | +7888...
NULL в расчётах обычно заразителен:
SELECT NULL + 10; - результат: NULL
SELECT NULL || 'text'; - результат: NULL
Позже узнаешь, как с этим работать: IS NULL разбираем в уроке про WHERE, там же - почему = NULL молча возвращает пустоту.
Порядок выполнения SELECT
Поэтому alias из SELECT не доступен в WHERE - на момент фильтрации база ещё не знает про твои переименованные столбцы. А как база выполняет запрос на самом деле, показывает EXPLAIN.
ORDER BY: ASC vs DESC
-- По возрастанию (по умолчанию)
SELECT * FROM users ORDER BY created_at ASC;
-- По убыванию
SELECT * FROM users ORDER BY age DESC;
-- По нескольким полям (сначала по country, потом по name внутри каждой страны)
SELECT * FROM users
ORDER BY country ASC, name ASC;
LIMIT и OFFSET для пагинации
LIMIT 10 - выведи максимум 10 строк.
OFFSET 20 - пропусти первые 20 строк.
Вместе это пагинация:
-- Страница 1: строки 1-10
SELECT * FROM users LIMIT 10 OFFSET 0;
-- Страница 2: строки 11-20
SELECT * FROM users LIMIT 10 OFFSET 10;
-- Страница 3: строки 21-30
SELECT * FROM users LIMIT 10 OFFSET 20;
Или более читаемо (некоторые БД поддерживают):
SELECT * FROM users LIMIT 10 OFFSET 20;
-- то же самое:
SELECT * FROM users LIMIT 20, 10; - MySQL синтаксис
Сортировку по такому полю обычно ускоряет индекс - без него база сначала прочитает всю таблицу и только потом отсортирует.
Практический пример:
-- Последние 5 добавленных пользователей
SELECT id, name, created_at FROM users
ORDER BY created_at DESC
LIMIT 5;
Мини-задание
- Выведи 5 последних пользователей (с помощью DESC и LIMIT)
- Выведи только
idиname(не всё подряд) - Получи список уникальных городов, где живут пользователи (DISTINCT)
- Выведи 10 пользователей, начиная со второй страницы (LIMIT + OFFSET)
- Переименуй столбцы так, чтобы они были на русском:
id→ID,name→Имя