JavaRush /Курси /SQL SELF /Побудова простих запитів з SELECT, WHERE та ORDER BY

Побудова простих запитів з SELECT, WHERE та ORDER BY

SQL SELF
Рівень 3 , Лекція 2
Відкрита

Тепер настав час об'єднати все це в одне ціле і навчитися будувати прості, але корисні запити з комбінацією 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

Пояснення:

  1. SELECT name — вибираємо тільки ім'я. Навіщо тягнути зайві дані, якщо вони не потрібні?
  2. WHERE grade = 'A' — фільтруємо тільки тих, у кого відмінна оцінка.
  3. 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

Пояснення:

  1. SELECT product_name, price — вибираємо назву товару і його ціну.
  2. WHERE category = 'Electronics' — фільтруємо тільки товари з категорії "Electronics".
  3. 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

Пояснення:

  1. WHERE age > 21 — вибираємо тільки студентів старше 21 року.
  2. AND (grade = 'B' OR grade = 'C') — фільтруємо тих, у кого оцінка або B, або C. Дужки використовуються для групування умов.
  3. 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

Пояснення:

  1. WHERE price < 50000 — спочатку фільтруємо товари, залишаючи тільки ті, що дешевші за 50 000.
  2. 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')
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ