Теперь пришло время объединить всё это в единое целое и научиться строить простые, но полезные запросы с использованием комбинации SELECT, WHERE и ORDER BY. Этот навык пригодится вам для множества задач, начиная от получения списков пользователей до составления небольших отчетов.
Прежде чем мы начнем, напомним, как выглядит структура простого SQL-запроса:
SELECT колонка1, колонка2, колонка3
FROM таблица
WHERE условие
ORDER BY колонка ASC
LIMIT количество_строк
OFFSET количество_строк;
Если SQL был бы литературным произведением, то SELECT — это заголовок главы, FROM — её содержание, а WHERE — объяснение сюжета. Ну а ORDER BY добавляет порядок, чтобы читать было интереснее!
Порядок операторов строго фиксирован. Опускать (не указывать) некоторые из них можно, менять порядок - нельзя.
Пример 1: Выбор имен студентов с отличными оценками
Представим, что у нас есть таблица students со следующей структурой и данными:
| id | name | age | grade |
|---|---|---|---|
| 1 | Otto | 21 | A |
| 2 | Maria | 22 | B |
| 3 | Alex | 20 | A |
| 4 | Nat | 23 | C |
| 5 | Dan | 25 | B |
Вам нужно получить список всех студентов с отличной оценкой (то есть grade = 'A'), отсортированный по имени. Вот как мы это сделаем:
SELECT name
FROM students
WHERE grade = 'A'
ORDER BY name ASC;
Результат:
| name |
|---|
| Alex |
| Otto |
Объяснение:
SELECT name— мы выбираем только имя. Незачем тратить ресурсы на извлечение данных, которые нам не нужны.WHERE grade = 'A'— фильтруем только тех, у кого отличная оценка.ORDER BY name ASC— сортируем имена студентов в алфавитном порядке.
Пример 2: Поиск товаров по цене
Теперь представим, что у нас есть таблица products с информацией о товарах:
| id | product_name | category | price |
|---|---|---|---|
| 1 | Смартфон | Electronics | 30000 |
| 2 | Телевизор | Electronics | 45000 |
| 3 | Холодильник | Appliances | 50000 |
| 4 | Пылесос | Appliances | 15000 |
| 5 | Лампочка | Lighting | 500 |
Наша задача — получить список товаров из категории "Electronics", отсортировав их по убыванию цены. Запрос будет выглядеть так:
SELECT product_name, price
FROM products
WHERE category = 'Electronics'
ORDER BY price DESC;
Результат:
| product_name | price |
|---|---|
| Телевизор | 45000 |
| Смартфон | 30000 |
Объяснение:
SELECT product_name, price— выбираем название товара и его цену.WHERE category = 'Electronics'— фильтруем только товары из категории "Electronics".ORDER BY price DESC— сортируем результаты по убыванию цены (самый дорогой товар будет первым).
Пример 3: Сложные фильтры с логикой
Используем ту же таблицу students. Допустим, нам нужно найти всех студентов старше 21 года, у которых оценка B или C, и отсортировать их по возрасту. Здесь мы комбинируем несколько условий:
SELECT name, age, grade
FROM students
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
ORDER BY age ASC;
Результат:
| name | age | grade |
|---|---|---|
| Maria | 22 | B |
| Nat | 23 | C |
| Dan | 25 | B |
Объяснение:
WHERE age > 21— выбираем только студентов старше 21 года.AND (grade = 'B' OR grade = 'C')— фильтруем тех, у кого оценка либоB, либоC. Круглые скобки используются для группировки условий.ORDER BY age ASC— сортируем результат по возрасту, начиная с самого молодого.
Пример 4: Комбинирование сортировки и фильтрации
Возвращаемся к таблице products. Мы хотим найти товары дешевле 50 000, упорядочить их по категории, а внутри каждой категории — по цене (от самой низкой к самой высокой).
SELECT product_name, category, price
FROM products
WHERE price < 50000
ORDER BY category ASC, price ASC;
Результат:
| product_name | category | price |
|---|---|---|
| Пылесос | Appliances | 15000 |
| Смартфон | Electronics | 30000 |
| Телевизор | Electronics | 45000 |
| Лампочка | Lighting | 500 |
Объяснение:
WHERE price < 50000— сначала фильтруем товары, оставляя только те, которые дешевле 50 000.ORDER BY category ASC, price ASC— сортируем по категориям (в алфавитном порядке), а внутри каждой категории сортируем по возрастанию цены.
Пример 5: Частая ошибка — пропуск условий
Теперь посмотрим, что может пойти не так. Что если мы забудем поставить группировку условий, как в случае с логическими операторами?
Неправильный запрос:
SELECT name, age, grade
FROM students
WHERE age > 21 AND grade = 'B' OR grade = 'C'
ORDER BY age ASC;
Здесь OR grade = 'C' выполнится без учёта AND age > 21, и запрос вернёт не тот результат. Мы получим вывод всех, кто имеет оценку C, даже если они младше 21 года.
Поэтому всегда используйте скобки для ясности:
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ