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;
`SELECT *` в учебе норм. В проде чаще выбирают конкретные поля: меньше данных, меньше сюрпризов при изменении схемы.

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

Порядок выполнения 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)
  • Переименуй столбцы так, чтобы они были на русском: idID, nameИмя

Зарегистрируйтесь бесплатно, чтобы пройти квиз, решить задание с автопроверкой и вести прогресс.