Rusau LearnВойти

Базы данных

Запросы SELECT в SQL: WHERE, ORDER BY, LIMIT и агрегатные функции

SELECT – запрос, который читает данные из таблицы: после SELECT перечисляют нужные колонки, после FROM называют таблицу. WHERE оставляет только строки, подходящие под условие, ORDER BY сортирует результат по возрастанию или, со словом DESC, по убыванию, а LIMIT ограничивает число строк. Такие запросы чаще всего просят написать на собеседовании junior-тестировщика, и их стоит натренировать руками.

Мой видеоурок: Урок 21. Запросы SELECT в SQL/MySQL для тестировщикаОткрыть на YouTube
SELECT
запросы, которые чаще всего просят написать на собеседовании
Песочница
учебная база магазина в браузере, без установки и регистрации
Бесплатно
урок с заданиями в моём базовом курсе

Как устроен запрос SELECT

В уроке я работаю с базой students из прошлого занятия. В ней одна таблица courses с тремя полями: id, faculty (факультет) и number (номер курса), и в таблице пять строк. Базу выбирают командой USE students;, а все её строки выводит самый простой запрос: SELECT * FROM courses;. Звёздочка означает все колонки.

Вместо звёздочки можно перечислить нужные колонки через запятую: SELECT faculty, number FROM courses;. Запрос заканчивается точкой с запятой, и забывать её не стоит.

Части запроса идут в строгом порядке: SELECT, FROM, WHERE, ORDER BY, LIMIT. Если их переставить, СУБД вернёт синтаксическую ошибку. Ещё три приёма из урока работают с тем, что запрос выводит.

  • DISTINCT

    Убирает повторы. На первом курсе учатся несколько факультетов, и SELECT DISTINCT number FROM courses; покажет каждый номер курса по одному разу.

  • AS

    Задаёт псевдоним, то есть временное имя колонки в результате: SELECT number AS course_number FROM courses;. В самой таблице колонка по-прежнему называется number, а псевдонимы помогают читать сложные запросы.

  • LIMIT

    Ограничивает число строк. В рабочих базах записей сотни и тысячи, а SELECT * FROM courses LIMIT 2; выведет только две первые. LIMIT понимают MySQL, PostgreSQL и SQLite, в Microsoft SQL Server то же самое делает SELECT TOP 2.

WHERE: условия и сравнения

WHERE оставляет только строки, которые подходят под условие. SELECT faculty, number FROM courses WHERE faculty = 'bio'; выведет строки биологического факультета. Текст пишут в кавычках, числа без них.

Для чисел работают сравнения больше и меньше: WHERE number > 1 оставит курсы со второго и выше. В составных знаках сначала идёт больше или меньше, потом равно, то есть >= и <=. Неравенство записывают как <> или !=.

Условия соединяют логическими операторами. С AND должны выполниться оба условия, с OR хотя бы одно.

  • AND

    SELECT * FROM courses WHERE number = 1 AND faculty = 'bio'; вернёт только первый курс биологического факультета. Первый курс теологического в результат не попадёт: номер подходит, а факультет нет.

  • OR

    WHERE number = 1 OR faculty = 'gum' вернёт все первые курсы и вдобавок все строки гуманитарного факультета.

  • Скобки

    AND выполняется раньше OR, поэтому смешанные условия берут в скобки: WHERE (faculty = 'gum' OR faculty = 'bio') AND number = 1 вернёт первые курсы только этих двух факультетов. Без скобок в результат попадут все курсы гуманитарного факультета.

  • IS NULL

    Пустое значение NULL обычным равенством не найти: WHERE faculty = NULL не вернёт ни одной строки. Для пустых значений пишут WHERE faculty IS NULL, для заполненных IS NOT NULL.

  • Пример: обращения без заказа

    В песочнице SELECT id, subject FROM support_tickets WHERE order_id IS NULL; вернёт два обращения в поддержку, 7 и 8, а с order_id = NULL ответ будет пустым. У обращения 8 "Верните деньги за отменённый заказ" номера заказа нет, хотя речь в нём о заказе. Если покупатель писал со страницы заказа, стоит проверить, сохраняет ли форма обращения его номер.

LIKE, BETWEEN и IN: шаблон, диапазон и список

Эти операторы сокращают длинные условия, и на собеседовании их ждут наравне с простыми сравнениями.

  • LIKE

    Поиск по шаблону. Знак % заменяет любое число символов, в том числе ни одного, знак _ заменяет ровно один символ. WHERE faculty LIKE '%o' найдёт факультеты, которые заканчиваются на o, а WHERE faculty LIKE '_io' – трёхбуквенные на io вроде bio. Знаки работают только со словом LIKE: в уроке я сначала написал faculty = '%o' и получил пустой результат.

  • BETWEEN

    Диапазон, и границы в него входят: WHERE number BETWEEN 2 AND 4 вернёт курсы со второго по четвёртый, то же самое, что number >= 2 AND number <= 4. С NOT BETWEEN 2 AND 4 останется всё вне диапазона, в моей таблице это первые курсы.

  • IN

    Совпадение с одним из значений списка. WHERE number IN (1, 4) короче, чем number = 1 OR number = 4, а NOT IN вернёт всё, что в список не входит.

  • Пример: заказы за период

    Отчёт админки магазина за 3–5 августа сверяют с базой: SELECT id, created_at FROM orders WHERE created_at BETWEEN '2026-08-03' AND '2026-08-05'; вернёт в песочнице шесть заказов, со 104 по 109. Если в отчёте их меньше, первым делом смотрят, попали ли в него заказы первого и последнего дня. Если в колонке хранится и время, заказ от '2026-08-05 14:30' в такой диапазон уже не попадёт, и последний день теряется.

ORDER BY и агрегатные функции

ORDER BY сортирует результат по указанной колонке. По умолчанию сортировка идёт по возрастанию, для текста это алфавитный порядок, и слово ASC можно не писать: SELECT * FROM courses ORDER BY faculty;. Обратный порядок задаёт DESC: ORDER BY faculty DESC.

Сортировать можно и по нескольким колонкам. ORDER BY number, faculty сначала упорядочит строки по номеру курса, а внутри одного номера по факультету. Без ORDER BY порядок строк база не обещает, поэтому в проверках на него не полагаются.

Агрегатные функции сводят все подходящие строки к одному числу.

  • COUNT

    Считает строки. COUNT(faculty) считает заполненные значения в колонке и пропускает пустые, а COUNT(*) считает все строки. В таблице из урока заполнены все пять факультетов, и запрос вернул 5.

  • SUM и AVG

    Сумма и среднее по колонке: SELECT AVG(number) FROM courses; посчитает средний номер курса.

  • MIN и MAX

    Наименьшее и наибольшее значение. Результату удобно дать имя через AS: SELECT MIN(number) AS min_number FROM courses; вернёт 1 в колонке min_number.

  • Пример: сверить выручку

    В песочнице SELECT SUM(amount) FROM orders WHERE status = 'paid'; вернёт 20570. Столько же должна показать выручка в отчёте админки за те же даты. Если в отчёте другое число, он считает иначе: например, по таблице платежей, где заказ 111 оплачен дважды.

Пример: проверить заказы в учебной базе магазина

В SQL-песочнице лежит база интернет-магазина из курса SQL, и запросы ниже выполняются в ней как есть. Задача такая: найти оплаченные заказы дороже 2000.

  • 1. Узнать, какие бывают статусы

    SELECT DISTINCT status FROM orders ORDER BY status; вернёт четыре значения: cancelled, failed, paid и pending. Так видно, как именно записан нужный статус.

  • 2. Отобрать по двум условиям

    SELECT id, amount FROM orders WHERE status = 'paid' AND amount > 2000; вернёт четыре заказа: 101, 108, 111 и 112. Без условия на статус строк станет семь, а без условия на сумму останутся все девять оплаченных заказов.

  • 3. Отсортировать и ограничить

    Если дописать в конец ORDER BY amount DESC LIMIT 1, останется одна строка, самый дорогой из этих четырёх заказов.

  • 4. Посчитать

    SELECT COUNT(*) FROM orders WHERE status = 'paid'; вернёт 9, по числу оплаченных заказов.

  • 5. Помнить о регистре

    WHERE status = 'Paid' с большой буквы в песочнице ничего не найдёт: SQLite, как и PostgreSQL, различает регистр. MySQL с настройками по умолчанию регистр не различает и вернёт те же девять строк. Поэтому запрос, проверенный на одной СУБД, на другой может посчитать иначе.

Видеоурок, шпаргалка и задания

SELECT я разбираю в двадцать первом уроке курса "Тестировщик с нуля" на YouTube. Перед ним идёт урок о создании таблиц в MySQL, после него урок о JOIN. Домашнее задание из урока – пройти все запросы на своих таблицах и потренироваться в разделе SQL на сайте W3Schools. В бесплатном базовом курсе по тестированию тема идёт уроком "SELECT в MySQL", и после теории в нём есть задания.

Шпаргалка по SQL собирает SELECT, WHERE, JOIN и GROUP BY с примерами, а в тренажёре запросы пишут к учебной базе библиотеки и сразу видят результат. На задачах из рабочего дня тестировщика SQL учит мой отдельный курс.

Курсы по теме

Вопросы и ответы

Как написать простой запрос SELECT?

После SELECT перечислить колонки через запятую или поставить звёздочку для всех колонок, после FROM назвать таблицу и закончить запрос точкой с запятой: SELECT faculty, number FROM courses;. Условие добавляют через WHERE, сортировку через ORDER BY, ограничение числа строк через LIMIT.

Как убрать повторяющиеся значения в результате SELECT?

Поставить DISTINCT сразу после SELECT: SELECT DISTINCT number FROM courses; покажет каждое значение по одному разу.

Входят ли границы в BETWEEN?

Да. BETWEEN 2 AND 4 включает и 2, и 4, то есть равнозначно number >= 2 AND number <= 4. Это важно при проверке граничных значений.

Как отсортировать результат по убыванию?

Дописать DESC после колонки в ORDER BY, например ORDER BY amount DESC. По умолчанию сортировка идёт по возрастанию (ASC), а текст сортируется по алфавиту.

Как вывести только первые несколько строк?

В MySQL, PostgreSQL и SQLite дописать LIMIT в конец запроса: LIMIT 5 оставит пять строк. В Microsoft SQL Server пишут SELECT TOP 5. Чтобы первые строки были предсказуемыми, вместе с LIMIT ставят ORDER BY.

Чем COUNT(*) отличается от COUNT(колонка)?

COUNT(*) считает все строки. COUNT с именем колонки считает только строки, где в этой колонке есть значение, и пропускает пустые NULL.

Какие запросы SELECT спрашивают на собеседовании тестировщика?

Чаще всего дают таблицу и просят вывести строки по условию: с WHERE и сравнением, с LIKE, BETWEEN или IN, с сортировкой и подсчётом через COUNT, SUM или AVG. Следом нередко просят соединить две таблицы через JOIN.

Посмотреть программы курсов

Программа каждого курса открыта целиком: видны все модули, уроки и число шагов.

Все курсы

Здесь используются cookies: без них сайт не работает, и по ним видно, откуда о платформе узнают.Cookies нужны для входа и учёта переходов. Подробнее