Тепер настав час об'єднати все це в одне ціле і навчитися будувати прості, але корисні запити з комбінацією 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')
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ