Перейти к содержанию
Educora
Продвинутый10 класс24 мин39 / 59

Запросы, поиск и сортировка в базе данных

Простые и сложные условия (=, <>, <, >, <=, >=, AND, OR, NOT), маски * и ?, пошаговое вычисление запроса через множества, подсчёт записей и новое место записи после сортировки — в записи DİM.

Проверь себя
В этом уроке ты узнаешь
  • Записывать простые условия со знаками сравнения и находить записи, которые им удовлетворяют
  • Пошагово вычислять сложный запрос с AND, OR, NOT и скобками через множества
  • Применять маски * и ? к текстовым полям
  • Определять новое место записи после запроса и сортировки

В интернет-магазине ты выбираешь фильтры «цена меньше 50 манатов» и «рейтинг выше 4» — и из тысяч товаров остаётся несколько. Это запрос: СУБД проверяет каждую запись по условию и показывает только подходящие.

В каждом варианте вступительного экзамена есть одно задание на запрос: найти, сколько записей ему удовлетворяет, какие номера записей отобраны или как сдвинется запись после сортировки. Устройство таблиц объяснено в уроке «Базы данных: модели, СУБД и связанные таблицы».

Запрос и простое условие

Определение
Запрос

Объект СУБД: команда, которая отбирает (ищет) записи, удовлетворяющие условию, при необходимости сортирует их и показывает результат в виде новой таблицы. Запрос не меняет данные, а только отбирает.

Определение
Простое условие

Записывается в виде «поле — знак сравнения — значение»: Математика > 18, Статус = «задерживается». Текстовые значения пишутся в кавычках и сравниваются посимвольно.

ЗнакЗначениеПример
=равноКласс = 10
<>не равноПлатформа <> 2
<меньшеВозраст < 16
>большеБалл > 90
<=меньше или равноЦена <= 50
>=больше или равноИстория >= 70
№ИмяМатематикаФизикаИнформатика
1Айсель181225
2Мурад252114
3Лейла121922
4Эльвин202517
5Нигяр91620
6Рашад231124
7Гюнай152219
Таблица «Олимпиада»: баллы учеников по трём предметам. Примеры 1–3 этого урока относятся к ней.
Пример 1. Простые условия — множества записей

Какие номера записей таблицы «Олимпиада» удовлетворяют условию?
1) Математика > 18 2) Физика <= 16 3) Информатика <> 22 4) Математика >= 18

Показать решение
Проверяем записи сверху вниз и выписываем номера множеством.
1) 25, 20, 23 → {2, 4, 6}. 18 > 18 — ложно, поэтому 1 не входит.
2) 12, 16, 11 → {1, 5, 6}. 16 <= 16 — истинно.
3) Все, кроме 22 → {1, 2, 4, 5, 6, 7}.
4) Граница входит: 18, 25, 20, 23 → {1, 2, 4, 6}.

Сложные условия: AND, OR, NOT

Простые условия соединяются логическими операциями — И, ИЛИ, НЕ из урока «Логические операции и логические элементы». В заданиях DİM они пишутся по-английски: AND, OR, NOT. Если найти множество записей для каждого простого условия, сложное условие превращается в операции над множествами. M(A) — множество номеров записей, удовлетворяющих условию A.

M(A AND B) = M(A) ∩ M(B)
где:
  • M(A)номера записей, удовлетворяющих условию A
  • ∩пересечение: входят в оба множества

AND — должны выполняться оба условия: остаются общие номера.

M(A OR B) = M(A) ∪ M(B)
где:
  • ∪объединение: входят хотя бы в одно множество

OR — должно выполняться хотя бы одно условие: номера объединяются без повторов.

M(NOT A) = U \ M(A)
где:
  • Uвсе записи таблицы
  • \разность: из U убираем M(A)

NOT — остаются записи, не удовлетворяющие условию.

Примеры по таблице «Олимпиада»: (Математика > 18) AND (Информатика >= 20) → {2, 4, 6} ∩ {1, 3, 5, 6} = {6}; (Математика > 18) OR (Физика > 20) → {2, 4, 6} ∪ {2, 4, 7} = {2, 4, 6, 7}; NOT (Физика > 15) → {1, 6}. Порядок действий: сначала скобки (изнутри наружу), затем NOT, затем AND и последним OR. В запросах DİM скобки обычно расставлены: начинай с самых внутренних, а где скобок нет, соблюдай порядок NOT → AND → OR. Та же логика работает при поиске в интернете — см. «Поиск в интернете: поисковые системы и запросы».

  1. 1
    Выдели простые условия

    Для каждого простого условия запроса выпиши множество записей.

  2. 2
    Примени NOT

    Для условия под NOT возьми оставшиеся записи — или замени знак на противоположный.

  3. 3
    Раскрывай скобки изнутри

    AND → пересечение, OR → объединение; записывай каждый промежуточный результат.

  4. 4
    Возьми ответ

    Итоговое множество — номера отобранных записей, число его элементов — количество записей.

Пример 2. Задание в стиле DİM: какие записи?

Какие номера записей отберёт запрос
(((Математика < 20) AND NOT (Физика > 18)) OR ((Информатика > 21) AND (Физика > 15)))
в таблице «Олимпиада»?
A) 1, 5 B) 1, 3, 5 C) 3, 5, 6 D) 1, 3, 5, 6 E) 3

Показать решение
1) Математика < 20 → {1, 3, 5, 7}; NOT (Физика > 18) = Физика <= 18 → {1, 5, 6}. AND → {1, 5}.
2) Информатика > 21 → {1, 3, 6}; Физика > 15 → {2, 3, 4, 5, 7}. AND → {3}.
3) OR: {1, 5} ∪ {3} = {1, 3, 5}.
Верный ответ: B) 1, 3, 5.
NOT (A AND B) = (NOT A) OR (NOT B) · NOT (A OR B) = (NOT A) AND (NOT B)
где:
  • A, Bлюбые условия

Законы де Моргана: при внесении NOT в скобки AND и OR меняются местами.

Пример 3. NOT снаружи: сколько записей?

Сколько записей таблицы «Олимпиада» удовлетворяют запросу NOT (NOT (Математика > 15) AND (Информатика < 20)) OR NOT (Физика > 20)?

Показать решение
Способ 1 (множества): NOT (Математика > 15) → {3, 5, 7}; Информатика < 20 → {2, 4, 7}; AND → {7}; внешнее NOT → {1, 2, 3, 4, 5, 6}. NOT (Физика > 20) → {1, 3, 5, 6}. OR → {1, 2, 3, 4, 5, 6}.
Способ 2 (де Морган): NOT (NOT A AND B) = A OR NOT B, то есть (Математика > 15) OR (Информатика >= 20) → {1, 2, 4, 6} ∪ {1, 3, 5, 6} = {1, 2, 3, 4, 5, 6} — результат тот же.
Ответ: 6 записей.
Замени NOT знаком сравнения
  1. 1.NOT (Балл > 45) ⇔ Балл 45
  2. 2.NOT (Возраст >= 16) ⇔ Возраст 16
  3. 3.NOT (Город = «Баку») ⇔ Город «Баку»
  4. 4.NOT (Цена <= 20) ⇔ Цена 20

Маски: * и ?

В текстовом поле иногда ищут не точное значение, а маску — образец. В маске два особых знака: * — любое количество любых символов (в том числе ноль), ? — ровно один любой символ. В записи DİM маска пишется в кавычках после знака равенства: Направление = «*n».

МаскаЗначениеПодходитНе подходит
*nоканчивается на nRiverton, MapletonSandford, Oakdale
M*начинается с MMilltown, MapletonRiverton
*ll*содержит llMilltown, HillsideLakeside
?a*второй символ — aOakdale, LakesideMilltown
1??3 символа, первый — 1101, 1501150, 205
№РейсНаправлениеПлатформаСтатус
1101Riverton2по расписанию
2205Oakdale1задерживается
3310Milltown3по расписанию
4118Mapleton2задерживается
5222Lakeside1по расписанию
6407Sandford3задерживается
7150Hillside2по расписанию
8333Brighton1по расписанию
Таблица «Автовокзал»: междугородние рейсы (названия городов вымышлены).
Пример 4. Запрос с маской

Сколько записей таблицы «Автовокзал» отберёт запрос ((Статус = «задерживается» OR Платформа = 1) AND Направление = «*n*»)? Как изменится ответ, если маска будет «*n»?

Показать решение
1) Статус = «задерживается» → {2, 4, 6}; Платформа = 1 → {2, 5, 8}; OR → {2, 4, 5, 6, 8}.
2) «*n*» — в названии есть n: Riverton, Milltown, Mapleton, Sandford, Brighton → {1, 3, 4, 6, 8}.
3) AND → {4, 6, 8} — 3 записи.
4) «*n» — только оканчивающиеся на n: {1, 3, 4, 8} (Sandford выпадает). Тогда {2, 4, 5, 6, 8} ∩ {1, 3, 4, 8} = {4, 8} — 2 записи.

Сортировка

Определение
Сортировка

Расположение записей в определённом порядке по значениям одного или нескольких полей. По возрастанию: числа от меньшего к большему, текст по алфавиту (А → Я), даты от ранних к поздним. По убыванию — наоборот. Сортировка не меняет записи и их число, только порядок.

При сортировке по двум полям записи сначала упорядочиваются по первому полю; записи с одинаковым значением первого поля упорядочиваются по второму. Например, Баку, Гянджа, Ленкорань, Шеки — города по возрастанию. Самое трудное задание DİM на запросы сочетает отбор и сортировку:

  1. 1
    Примени запрос

    Выпиши отобранные записи в новую таблицу в исходном порядке.

  2. 2
    Отметь старое место

    Запиши, в какой строке новой таблицы стоит нужная запись: k.

  3. 3
    Отсортируй

    Упорядочь итоговую таблицу по заданному полю по возрастанию или убыванию.

  4. 4
    Сравни с новым местом

    Пусть новое место m: k − m > 0 — «на k − m строк вверх», k − m < 0 — вниз, k = m — не изменится.

№ИмяМатематикаФизикаХимия
1Камран728164
2Сабина886990
3Орхан657771
4Фидан908558
5Турал706283
6Гюнай597476
Таблица «Пробный экзамен»: для примера 5.
Пример 5. Отбор + сортировка

После применения запроса ((Математика >= 70 OR Химия > 75) AND Физика > 65) к таблице «Пробный экзамен» результат сортируют по полю Химия по возрастанию. Как изменится место записи о Фидан?
A) на 2 строки вниз B) на 1 строку вверх C) не изменится D) на 2 строки вверх E) на 1 строку вниз

Показать решение
1) Камран: 72 >= 70, 81 > 65 → да. Сабина: 88, 69 → да. Орхан: 65 и 71 — скобка ложна → нет. Фидан: 90, 85 → да. Турал: 70 >= 70, но Физика 62 → нет. Гюнай: Химия 76 > 75, Физика 74 → да.
2) Итоговая таблица: Камран, Сабина, Фидан, Гюнай — Фидан в 3-й строке (k = 3).
3) По возрастанию химии: Фидан 58, Камран 64, Гюнай 76, Сабина 90 — Фидан в 1-й строке (m = 1).
4) k − m = 2 > 0.
Верный ответ: D) на 2 строки вверх.
Пример 6. Сортировка по двум полям

Записи (имя — класс — балл): Айсель — 9 — 85, Мурад — 10 — 90, Лейла — 9 — 92, Эльвин — 11 — 78, Нигяр — 10 — 88, Рашад — 9 — 70. Таблицу сортируют сначала по полю Класс по возрастанию, затем по полю Балл по убыванию. На каком месте окажется Нигяр?

Показать решение
1) 9-й класс (балл по убыванию): Лейла 92, Айсель 85, Рашад 70 → места 1–3.
2) 10-й класс: Мурад 90, Нигяр 88 → места 4–5.
3) 11-й класс: Эльвин 78 → место 6.
Ответ: Нигяр на 5-м месте.
Python
rows = [('Kamran', 72, 81, 64), ('Sabina', 88, 69, 90), ('Orkhan', 65, 77, 71),
        ('Fidan', 90, 85, 58), ('Tural', 70, 62, 83), ('Gunay', 59, 74, 76)]

# query: ((Math >= 70 OR Chemistry > 75) AND Physics > 65)
result = [r for r in rows if (r[1] >= 70 or r[3] > 75) and r[2] > 65]
print('After the query:', [r[0] for r in result])

# sort by Chemistry, ascending (reverse=True would give descending)
sorted_rows = sorted(result, key=lambda r: r[3])
print('After sorting: ', [r[0] for r in sorted_rows])

k = [r[0] for r in result].index('Fidan') + 1
m = [r[0] for r in sorted_rows].index('Fidan') + 1
print('Fidan:', k, '->', m, '| rows up:', k - m)
▸ Ожидаемый результат
After the query: ['Kamran', 'Sabina', 'Fidan', 'Gunay']
After sorting:  ['Fidan', 'Kamran', 'Gunay', 'Sabina']
Fidan: 3 -> 1 | rows up: 2
Пример 5 на Python: AND, OR, NOT в Python пишутся как and, or, not, а <> — как !=. Измени условие и нажми «Запустить».
Интерактив
Загрузка симуляции…
Проверь каждую запись по запросу. Внимание к Гюнай: 90 > 90 — ложно.
Запись DİMSQL
(A > 5) AND NOT (B = 2)WHERE a > 5 AND NOT b = 2
Platforma <> 2platform <> 2
İstiqamət = «*n»destination LIKE '%n'
Kod = «1??»code LIKE '1__'
Химия по возрастанию / убываниюORDER BY chemistry ASC / DESC
Те же запросы на SQL: в маске вместо * пишут %, вместо ? — _. Подробнее — в уроках курса SQL «WHERE: фильтрация строк», «LIKE, IN, BETWEEN и IS NULL», «ORDER BY и LIMIT: сортировка и ограничение».

Главное

  • Простое условие: поле — знак — значение; > и < не включают границу, >= и <= включают, <> — «не равно».
  • AND → пересечение, OR → объединение, NOT → оставшиеся записи; порядок: скобки, NOT, AND, OR.
  • Заменяй NOT противоположным знаком (NOT (x > a) ⇔ x <= a) и применяй законы де Моргана.
  • Маска: * — любое число символов (и ноль), ? — ровно один; «*n» — оканчивается на n, «*n*» — содержит n.
  • Отбор + сортировка: место записи считают в итоговой таблице запроса и сравнивают с местом после сортировки.

Проверь себя

Вопросов: 12. Каждый правильный ответ приносит XP.

1 / 12
Что означает знак <> в запросе?