$ sudo teach IT

🔍 Урок 2.3 — AND, OR, ORDER BY

Модуль 2: Первые запросы

🎯 Что мы будем делать

В прошлом уроке мы научились фильтровать строки с WHERE. Но у нас было только одно условие. А что, если нужно найти товары, которые одновременно дешёвые И в наличии? Или сотрудников, которые работают в IT ИЛИ в Продажах?

В этом уроке мы разберём:

  • AND — два условия одновременно (и то, и другое)
  • OR — хотя бы одно из условий (или то, или другое)
  • Скобки — для группировки условий
  • ORDER BY — сортировка результатов
  • LIMIT — показать только первые N строк

Это последний урок модуля 2. После него ты сможешь писать полноценные запросы с фильтрацией и сортировкой.

💡 Напоминание:

Порядок SQL-запроса: SELECT → FROM → WHERE → ORDER BY → LIMIT. Именно в таком порядке. WHERE мы уже знаем. Сегодня добавим ORDER BY и LIMIT в конец.

🧩 AND — два условия одновременно

AND соединяет два (или больше) условия. Запрос покажет строки, которые удовлетворяют ВСЕМ условиям одновременно.

Представь: "Покажи сотрудников, которые работают в IT И зарабатывают больше 90000". Нужно AND:

SELECT name, department, salary FROM employees WHERE department = 'IT' AND salary > 90000;

Результат: Мария Иванова (IT, 95000) и Алексей Волков (IT, 100000). Оба условия выполнены: отдел = IT И зарплата > 90000.

Если бы мы написали только WHERE department = 'IT', мы бы получили 3 сотрудников (Дмитрий Новиков тоже IT). Но он не проходит по зарплате. AND отсеял его.

Ещё примеры с AND:

-- Товары категории "Аксессуары" с ценой меньше 3000
SELECT name, price, category FROM products WHERE category = 'Аксессуары' AND price < 3000; -- Сотрудники старше 30 из отдела Продажи
SELECT name, age, department FROM employees WHERE age > 30 AND department = 'Продажи'; -- Клиенты из Москвы старше 30 лет
SELECT name, city, age FROM customers WHERE city = 'Москва' AND age > 30;

Сколько строк вернёт каждый запрос? Выполни их и проверь:

  • Первый: товары-аксессуары дешевле 3000 — должно быть 3 (Клавиатура 2500, Мышь 1500, Лампа 2200). Наушники 3500 не подходят — цена >= 3000.
  • Второй: сотрудники старше 30 из Продаж — должен быть 1 (Иван Петров, 35 лет). Николай Морозов (29 лет) не старше 30.
  • Третий: клиенты из Москвы старше 30 — должно быть 3 (Иван Петров 35, Сергей Иванов 42, Елена Новикова 31).

Можно соединять AND сколько угодно раз. Хоть 5 условий подряд:

-- Товары категории "Электроника", цена от 20000 до 100000, в наличии больше 10 штук
SELECT name, price, category, quantity
FROM products
WHERE category = 'Электроника' AND price >= 20000 AND price <= 100000 AND quantity > 10;

Результат: Ноутбук (75000, 15 шт) и Смартфон (45000, 30 шт). Монитор (28000) подходит по всем условиям, но его количество = 20, что больше 10 — должно быть в результате. А, он тоже подходит. Давай проверим: Монитор — Электроника, цена 28000 (между 20000 и 100000), количество 20 (>10). Да, Монитор тоже в результате. То есть 3 товара.

Обрати внимание на форматирование: я перенёс AND на новые строки и добавил отступы. SQL это не важно, но людям так читать удобнее. В реальной работе запросы часто пишут именно так — каждое условие на новой строке.

💡 Запомни:

AND работает как "сужающий" фильтр. Чем больше условий с AND, тем меньше строк остаётся в результате. AND — это как дополнительные требования: "дай мне товар, который дешёвый И качественный И в наличии". Каждое новое требование отсеивает часть товаров.

🤝 OR — хотя бы одно из условий

OR соединяет условия, но в отличие от AND, достаточно выполнения ХОТЯ БЫ ОДНОГО условия. Результат включает строки, которые подходят под первое условие ИЛИ под второе ИЛИ под оба.

Пример: "Покажи сотрудников из IT ИЛИ из Продаж":

SELECT name, department FROM employees WHERE department = 'IT' OR department = 'Продажи';

Результат: 5 сотрудников. 3 из IT (Мария, Дмитрий, Алексей) + 2 из Продаж (Иван, Николай).

Ещё примеры:

-- Клиенты из Москвы или из Казани
SELECT name, city FROM customers WHERE city = 'Москва' OR city = 'Казань'; -- Товары ценой 1500 или 2500
SELECT name, price FROM products WHERE price = 1500 OR price = 2500; -- Сотрудники с должностью Менеджер или Разработчик
SELECT name, position FROM employees WHERE position = 'Менеджер' OR position = 'Разработчик';

OR работает как "расширяющий" фильтр. Чем больше условий с OR, тем больше строк в результате. OR — это как альтернативы: "покажи товары, которые дешёвые ИЛИ качественные". Чем больше альтернатив, тем больше подходящих товаров.

⚠️ Распространённая ошибка:

Новички часто пишут WHERE city = 'Москва' OR 'Казань'. Это ОШИБКА! Нужно полностью повторять условие для каждого значения: WHERE city = 'Москва' OR city = 'Казань'. SQL не понимает сокращения типа "city равно одному из". Для этого есть IN (мы изучим позже), но с OR нужно писать полностью.

📐 Скобки для группировки условий

Когда в запросе есть и AND, и OR одновременно, порядок их выполнения может сбить с толку. Как в математике: 2 + 3 * 4 = 14 (сначала умножение), а (2 + 3) * 4 = 20 (сначала сложение). В SQL AND выполняется РАНЬШЕ, чем OR.

Пример: найди сотрудников из IT или Продаж, но только тех, кто старше 30 лет.

-- Без скобок: AND выполнится раньше OR
SELECT name, department, age FROM employees WHERE department = 'IT' OR department = 'Продажи' AND age > 30;

Этот запрос сработает не так, как мы ожидаем. SQL сначала выполнит AND: department = 'Продажи' AND age > 30, а потом OR с IT. То есть он покажет:

  • Всех из IT (потому что OR — достаточно одного совпадения)
  • И сотрудников из Продажи, которые старше 30
Результат: 4 строки (3 из IT + 1 из Продаж старше 30). Но мы хотели (IT ИЛИ Продажи) И возраст > 30.

Чтобы исправить, используем скобки:

-- Со скобками: сначала OR, потом AND с возрастом
SELECT name, department, age FROM employees WHERE (department = 'IT' OR department = 'Продажи') AND age > 30;

Теперь результат: 2 строки — Иван Петров (Продажи, 35) и Алексей Волков (IT, 33). Именно то, что мы хотели: сотрудники из IT или Продаж, но только те, кто старше 30.

Правило: если в условии есть и AND, и OR — ИСПОЛЬЗУЙ СКОБКИ. Даже если ты уверен в порядке выполнения, скобки делают запрос понятнее для других людей (и для тебя самого через месяц).

Ещё примеры со скобками:

-- Товары из Электроники или Офиса, но дешевле 30000
SELECT name, category, price
FROM products
WHERE (category = 'Электроника' OR category = 'Офис') AND price < 30000; -- Сотрудники из IT или с зарплатой больше 90000
SELECT name, department, salary
FROM employees
WHERE department = 'IT' OR salary > 90000;

Во втором примере скобки не нужны — всего два условия с OR. Но если добавить третье условие с AND — сразу нужны скобки. Запомни: AND сильнее OR. Используй скобки, чтобы управлять порядком.

💡 Золотое правило:

Если сомневаешься в порядке выполнения — ставь скобки. Они не делают запрос медленнее, зато делают его понятнее. В реальной работе лучше поставить лишние скобки, чем получить неправильные данные из-за приоритета операторов.

📊 ORDER BY — сортируем результаты

По умолчанию SQL возвращает строки в том порядке, в котором они хранятся в таблице (обычно в порядке добавления). Но мы можем управлять порядком с помощью ORDER BY.

ORDER BY сортирует результат по указанному столбцу. Синтаксис:

SELECT name, salary FROM employees ORDER BY salary;

Результат: сотрудники отсортированы по зарплате от меньшей к большей (по возрастанию, ASC).

Если нужно от большей к меньшей (по убыванию) — добавляем DESC:

SELECT name, salary FROM employees ORDER BY salary DESC;

Теперь первым идёт Алексей Волков с зарплатой 100000, последним — Дмитрий Новиков с 55000.

Два ключевых слова для ORDER BY:

  • ASC (ascending) — по возрастанию (1, 2, 3... или А, Б, В...). Это значение по умолчанию, можно не писать.
  • DESC (descending) — по убыванию (100, 90, 80... или Я, Ю, Э...). Нужно указывать явно.
-- По возрастанию (ASC — можно не писать)
SELECT name, age FROM employees ORDER BY age;
SELECT name, age FROM employees ORDER BY age ASC; -- То же самое -- По убыванию
SELECT name, age FROM employees ORDER BY age DESC; -- По алфавиту (текстовый столбец)
SELECT name FROM employees ORDER BY name;
SELECT name FROM employees ORDER BY name DESC; -- От Я до А

ORDER BY с текстом сортирует по алфавиту. Для русских букв: А, Б, В, ... Я. Для английских: A, B, C, ... Z. Смешанные тексты (русские + английские) сортируются хитро — лучше так не делать.

ORDER By с числами: 1, 2, 3, ... и 100, 99, 98, ... для DESC.

ORDER BY обычно пишется в конце запроса, после WHERE (если WHERE есть):

-- Сотрудники IT, отсортированные по возрасту
SELECT name, age, department FROM employees
WHERE department = 'IT'
ORDER BY age; -- Товары дешевле 30000, отсортированные по цене (от дорогих к дешёвым)
SELECT name, price FROM products
WHERE price < 30000
ORDER BY price DESC;

Порядок в запросе: SELECT → FROM → WHERE → ORDER BY. Запомни этот порядок, он строгий.

💡 Важно:

ORDER BY применяется к РЕЗУЛЬТАТУ запроса. Сначала SQL выполняет WHERE (отфильтровывает строки), а потом сортирует то, что осталось. ORDER BY — это последняя операция в запросе (перед LIMIT).

📑 ORDER BY по двум столбцам

Можно сортировать по двум (и более) столбцам. Это работает как сортировка в Excel: сначала все строки сортируются по первому столбцу, а строки с одинаковым значением — по второму.

Синтаксис: столбцы перечисляются через запятую.

-- Сначала по отделу, потом по зарплате (по убыванию)
SELECT name, department, salary FROM employees
ORDER BY department, salary DESC;

Результат будет выглядеть так:

Аналитика Сергей Смирнов 70000
Аналитика Татьяна Белова 72000
Дизайн Анна Кузнецова 65000
HR Елена Попова 60000
IT Алексей Волков 100000
IT Мария Иванова 95000
IT Дмитрий Новиков 55000
Продажи Иван Петров 80000
Продажи Николай Морозов 75000
Финансы Ольга Соколова 58000

Сначала строки сгруппированы по отделам (в алфавитном порядке: Аналитика, Дизайн, HR, IT, Продажи, Финансы). Внутри каждого отдела — по убыванию зарплаты.

Для каждого столбца можно указать своё направление сортировки:

-- Сначала по категории (А→Я), потом по цене (от дорогих к дешёвым)
SELECT name, category, price FROM products
ORDER BY category ASC, price DESC; -- Сначала по возрасту (старшие внизу), потом по имени (А→Я)
SELECT name, age FROM employees
ORDER BY age DESC, name ASC;

Если направление сортировки не указано, ASC подставляется по умолчанию. Поэтому ORDER BY category, price DESC — это то же, что ORDER BY category ASC, price DESC.

💡 Когда это нужно:

Сортировка по двум столбцам часто нужна в отчётах. Например, "покажи сотрудников по отделам, а внутри каждого отдела — по зарплате" или "товары по категориям, внутри категории — по названию". Это стандартный способ организации данных в отчётах.

✂️ LIMIT — только первые N строк

LIMIT ограничивает количество строк в результате. Это полезно, когда нужно быстро посмотреть на данные или взять только несколько первых записей.

-- Первые 3 сотрудника (в порядке хранения в таблице)
SELECT name, salary FROM employees LIMIT 3; -- Первые 5 товаров
SELECT * FROM products LIMIT 5;

LIMIT часто используют вместе с ORDER BY, чтобы получить, например, "3 самых дорогих товара" или "5 самых молодых сотрудников":

-- 3 самых дорогих товара
SELECT name, price FROM products ORDER BY price DESC LIMIT 3; -- 5 самых молодых сотрудников
SELECT name, age FROM employees ORDER BY age LIMIT 5; -- 2 самых старых клиента
SELECT name, age FROM customers ORDER BY age DESC LIMIT 2;

LIMIT всегда пишется в самом конце запроса, после ORDER BY:

SELECT столбцы
FROM таблица
WHERE условие
ORDER BY столбец
LIMIT число;

Это полный синтаксис SELECT-запроса (пока без GROUP BY и JOIN — это будет в следующих модулях). Запомни этот порядок, он очень важен.

-- Пример полного запроса: 3 самых дорогих товара из Электроники
SELECT name, price, category FROM products
WHERE category = 'Электроника'
ORDER BY price DESC
LIMIT 3; -- Результат: Ноутбук (75000), Смартфон (45000), Монитор (28000)

Ещё один пример с LIMIT:

-- 2 сотрудника с самой высокой зарплатой в IT
SELECT name, salary, department FROM employees
WHERE department = 'IT'
ORDER BY salary DESC
LIMIT 2; -- Результат: Алексей Волков (100000), Мария Иванова (95000)
💡 Важно:

LIMIT БЕЗ ORDER BY — это лотерея. Ты получишь первые N строк, но в каком порядке они хранятся в таблице — не гарантировано. Если тебе нужны "первые 5" по какому-то критерию — всегда используй ORDER BY вместе с LIMIT. Иначе результат может быть разным при каждом запуске.

🔬 Собираем всё вместе: сложные запросы

Теперь давай соберём все полученные знания в один большой запрос. Мы используем SELECT, FROM, WHERE, AND, OR, ORDER BY и LIMIT:

/* Запрос: найти 3 самых дорогих товара из категорий Электроника или Офис, которые есть в наличии (количество > 0)
*/
SELECT name AS "Товар", price AS "Цена", category AS "Категория", quantity AS "Остаток"
FROM products
WHERE (category = 'Электроника' OR category = 'Офис') AND quantity > 0
ORDER BY price DESC
LIMIT 3;

Разберём по шагам, как SQL выполняет этот запрос:

  1. FROM products — берём таблицу products
  2. WHERE (category = 'Электроника' OR category = 'Офис') AND quantity > 0 — оставляем только товары из Электроники или Офиса, у которых количество > 0
  3. SELECT ... AS ... — выбираем столбцы и даём им псевдонимы
  4. ORDER BY price DESC — сортируем от самых дорогих к дешёвым
  5. LIMIT 3 — оставляем только первые 3 строки

Результат будет: 3 самых дорогих товара из указанных категорий.

Ещё один сложный запрос:

-- Сотрудники из IT или Аналитики с зарплатой от 70000
-- отсортированные по возрасту (младшие первые)
SELECT name, department, salary, age
FROM employees
WHERE (department = 'IT' OR department = 'Аналитика') AND salary >= 70000
ORDER BY age ASC;

Результат: 4 сотрудника (Мария из IT 28 лет, Алексей из IT 33 года, Татьяна из Аналитики 36 лет, Сергей из Аналитики 42 года), отсортированные по возрасту.

💡 Как читать сложный запрос:

Читай запрос "снизу вверх" по порядку выполнения: FROM → WHERE → SELECT → ORDER BY → LIMIT. Сначала понимай, из какой таблицы берём, потом — какие строки оставляем, потом — какие столбцы показываем, потом — как сортируем, потом — сколько строк оставляем. Это поможет разобраться в любом, даже очень сложном запросе.

🎯 Практические задания

Теперь твоя очередь. Задания разбиты на группы: AND/OR, ORDER BY, LIMIT и комбинированные.

AND и OR

Задание 1: Найди товары категории "Аксессуары" с ценой меньше 3000 рублей. Выведи название, цену и категорию.

-- Подсказка: ... WHERE category = 'Аксессуары' AND price < 3000

Задание 2: Найди сотрудников из отдела Продажи или Финансы. Выведи имя, отдел и зарплату.

Задание 3: Найди клиентов из Москвы или Санкт-Петербурга, которые старше 30 лет. Выведи имя, город и возраст. Используй скобки!

Задание 4: Найди товары с ценой 1500 или 8500. Выведи название и цену (без OR, двумя разными запросами, а потом одним с OR).

ORDER BY

Задание 5: Выведи всех сотрудников, отсортированных по возрасту (от младших к старшим).

Задание 6: Выведи все товары, отсортированные по цене от самых дорогих к самым дешёвым.

Задание 7: Выведи клиентов, отсортированных по имени в алфавитном порядке. Кто первый? Кто последний?

Задание 8: Выведи сотрудников, отсортированных сначала по отделу (по алфавиту), а внутри отдела — по зарплате (от высокой к низкой).

LIMIT

Задание 9: Выведи 3 самых дешёвых товара (название и цена).

Задание 10: Выведи 2 самых молодых сотрудников (имя и возраст).

Задание 11: Выведи 5 первых товаров из таблицы products (просто LIMIT 5, без сортировки).

Комбинированные (AND/OR + ORDER BY + LIMIT)

Задание 12: Найди 3 самых дорогих товара из категории "Аксессуары". Выведи название и цену.

Задание 13: Найди сотрудников из IT или Аналитики с возрастом младше 40 лет. Отсортируй их по зарплате (от высокой к низкой). Выведи имя, отдел, зарплату и возраст.

Задание 14: Выведи 2 самых старых клиентов из Москвы. Выведи имя, возраст и город.

Задание 15: Найди товары с ценой от 2000 до 10000 (price >= 2000 AND price <= 10000) в категориях "Аксессуары" или "Офис". Отсортируй по цене (от дешёвых к дорогим). Выведи название, цену и категорию. Сколько товаров подошло?

💡 Проверь себя:

В задании 3: должно быть 4 клиента (Иван, Сергей, Елена из Москвы + Ольга из СПб). В задании 12: топ-3 аксессуаров — Наушники (3500), Клавиатура (2500), Лампа (2200). В задании 14: Алексей Фёдоров 45 лет из Екатеринбурга — не подходит (не Москва). Из Москвы: Сергей Иванов 42 и Иван Петров 35 — два самых старых.

🧠 Порядок выполнения запроса (шпаргалка)

Давай ещё раз зафиксируем порядок, в котором SQL выполняет части запроса. Это поможет понимать, как работают сложные запросы:

Порядок Ключевое слово Что делает
1 FROM Выбирает таблицу
2 WHERE Фильтрует строки
3 SELECT Выбирает столбцы (и вычисляет)
4 ORDER BY Сортирует результат
5 LIMIT Ограничивает количество строк

Обрати внимание: SELECT на шаге 3, а WHERE на шаге 2. Это значит, что WHERE не может использовать псевдонимы из SELECT (потому что SELECT ещё не выполнился). Точнее, SELECT name AS "Имя" FROM employees WHERE "Имя" = 'Иван' — не сработает. Но это тонкость, до которой мы дойдём позже. Сейчас просто запомни порядок.

💡 Запомни порядок:

Простое английское предложение: "SELECT columns FROM table WHERE condition ORDER BY column LIMIT number". По-русски: "ВЫБЕРИ столбцы ИЗ таблицы ГДЕ условие ОТСОРТИРУЙ ПО столбцу ОГРАНИЧЬ числом".

📝 Что мы узнали в этом уроке

Подведём итоги урока 2.3:

  • AND — все условия должны быть истинными. Сужает результат.
  • OR — хотя бы одно условие должно быть истинным. Расширяет результат.
  • Скобки () — группируют условия. AND выполняется раньше OR. Скобки меняют порядок.
  • ORDER BY столбец — сортирует результат. ASC — по возрастанию (по умолчанию), DESC — по убыванию.
  • ORDER BY столбец1, столбец2 — сортировка по двум столбцам. Для каждого можно указать ASC/DESC.
  • LIMIT N — показывает только первые N строк. Пишется в самом конце запроса.
  • Полный порядок запроса: SELECT → FROM → WHERE → ORDER BY → LIMIT.
  • LIMIT без ORDER BY даёт случайные строки — всегда используй ORDER BY, если нужен определённый порядок.

Поздравляю! Ты закончил модуль 2. Теперь ты умеешь:

  • Читать данные из таблиц (SELECT)
  • Выбирать нужные столбцы
  • Давать столбцам псевдонимы (AS)
  • Фильтровать строки (WHERE)
  • Соединять условия (AND, OR, скобки)
  • Сортировать результаты (ORDER BY)
  • Ограничивать количество строк (LIMIT)

Это основа основ SQL. В следующих модулях мы научимся группировать данные, соединять таблицы и изменять данные. Но сначала — закрепи пройденное. Переделай все задания из уроков 2.1, 2.2 и 2.3. Если можешь написать любой из них не подглядывая — ты готов к следующему шагу.

Увидимся в модуле 3! 👋

ТЕСТ — Урок 2.3: AND, OR, ORDER BY

5 вопросов

Поиск сотрудников с двумя условиями и сортировкой

Premium

Выбор товаров из нескольких категорий

Premium