Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Безопасность систем баз данных. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
905 Кб
Скачать

mysql> SELECT gruppirovka_name FROM gruppirovka

-> WHERE gruppirovka_name < 'M';

Рис. 4.5. Выборка по фамилии до «М»

Поскольку имя Alecsandrovskaya начинается с буквы, которая в алфавите расположена перед«М», оно и будет отображено в результатах. Названия других группировок начинаются с букв, следующих в алфавите после буквы«М» (речь идет об английском алфавите). Следует отметить, что по умолчанию MySQL не учитывает регистр.

Еще одна очень распространенная задача, имеющая отношение к манипуляциям со строками, заключается в поиске совпадений, которые начинаются с префикса, содержат строку или заканчиваются суффиксом. Например, имеется возможность выбрать всех преступников, фамилия которых начинается на букву «B». Воспользуйтесь оператором LIKE в выражении WHERE, как показано ниже (рис. 4.6).

Mysql> SELECT prestupnik_name FROM prestupnik

WHERE prestupnik_name -> LIKE “B%”;

Рис. 4.6. Выборка по фамилии на «В»

Рассмотрим детально, как это работает. Оператор LIKE используется только вместе со строками, причем строка должна

41

соответствовать шаблону. В данном примере применяем оператор LIKE "B%", определяющий символ ‘B’ перед любым количеством символов. Большинство строк, используемых в операторе LIKE, содержат символ процента(%) в качестве обобщающего символа, который сравнивает все строки. Также можно использовать этот символ для определения строки, заканчивающейся суффиксом, например «%ing», или строки, содержащей определенную подстроку, например % Corruption%.

Так, шаблон "John%" будет выполнять поиск всех строк,

начинающихся со слова«John» (скажем, John Smith, John Paul Getty). Шаблон "%Petrovich" ищет строки только со словом«Petrovich» в конце. И, наконец, шаблон «%Ivan%» способен найти строки, где слово «Ivan» будет и в начале, и в конце, и в середине.

Если в операторе LIKE необходимо выполнить поиск только по одному обобщающему символу, используйте символ подчеркивания (_). Например, желая извлечь преступления, начинающиеся со слова из четырех букв, первой из которых является буква «U», воспользуйтесь командой (рис. 4.7).

mysql> SELECT prestuplenie_name FROM

-> prestuplenie WHERE prestuplenie_name -> LIKE "U_ _ _ %";

Рис. 4.7. Выборка со слова из четырех букв

Спецификация "U_ _ _ %" означает, что должно быть найдено слово из четырех букв, начинающееся с «U» (например, «Ugon», «Uron»), перед которым стоит пробел, а затем любая строка.

42

4.3. Комбинированные условия с помощью операторов

AND, OR, NOT и XOR

В предыдущих главах использовали выражениеWHERE для тестирования одного условия и извлекали строки, соответствующие этому условию. Можно комбинировать несколько условий с помощью булевых операторов AND, OR, NOT и XOR.

Начнем с примера. Предположим, что нужно найти все преступные группировки, начинающимся с буквы«S», идентификатор которых больше 2. Это можно сделать без труда с помощью оператора AND (рис. 4.8):

mysql> SELECT gruppirovka_name FROM gruppirovka

-> WHERE gruppirovka_name LIKE"S%" -> AND gruppirovka_id>2;

Рис. 4.8. Оператор AND

Оператор AND в выражении WHERE ограничивает результат поиска теми строками, которые отвечают обоим условиям.

Оператор OR используется для поиска строк, соответствующих хотя бы одному из нескольких условий. Предположим, вам нужен список всех группировок с названием, начинающимся с буквы «P», «A» или «S». Этот поиск выполняется с помощью двух операторов OR и трех операторов LIKE (рис. 4.9):

mysql> SELECT gruppirovka_name FROM gruppirovka

-> WHERE gruppirovka_name

LIKE "P%" OR

-> gruppirovka_name

LIKE "A%" OR

-> gruppirovka_name

LIKE "S%";

Операторы OR в выражении WHERE ограничивают результаты поиска теми строками, которые соответствуют любому из трех условий. Заметим, что в этом примере результаты выво-

43

дятся без сортировки, а в том порядке, в каком добавлялись в базу данных.

Рис.4.9. Поиск двумя операторами OR и тремя операторами LIKE

Операторы AND и OR можно комбинировать, главное понять, какое условие нужно использовать первым. Рассмотрим пример запроса, где функция неочевидна (рис. 4.10):

mysql> SELECT gruppirovka_name FROM gruppirovka

-> WHERE gruppirovka_name LIKE "P%" -> OR gruppirovka_name LIKE "A%"

-> AND gruppirovka_name LIKE "%drovskaya";

Рис. 4.10. Запрос с неочевидной функцией

После анализа результатов все становится понятно: результаты должны либо начинаться с буквы «P» или «A», либо заканчиваться подстрокой «drovskaya». Запрос можно - ин терпретировать еще и таким образом: результаты должны начинаться с буквы «P» или «A» и заканчиваться подстрокой «drovskaya». Здесь неясно, как сервер MySQL обрабатывает такой запрос. Чтобы запросы, содержащие несколько булевых условий, были более читабельными, группируйте условия с помощью круглых скобок (рис. 4.11). Круглые скобки объединяют

44

части инструкции и повышают читабельность выражений. Можно использовать их точно так же, как и в стандартных математических выражениях. Предыдущий пример в связи с этим можно переписать таким образом:

mysql> SELECT gruppirovka_name FROM gruppirovka

-> WHERE gruppirovka_name LIKE "P%" -> OR (gruppirovka_name LIKE "A%"

-> AND gruppirovka_name LIKE "%drovskaya");

Рис. 4.11. Запрос с использованием круглых скобок

Когда используются круглые скобки, становится понятным порядок выражений: извлекаем преступные группировки, начинающиеся с буквы «P» или начинающиеся c буквы «A» и заканчивающиеся подстрокой «drovskaya». Кроме того, мы ввели запрос в трех строках вместо четырех, чтобы легче было определить его цель. Именно такой стиль применяется во время написания программных кодов. Отступы, используемые в кодах, и их четкая схема способствуют читабельности запросов.

Круглые скобки применяются также для указания иного порядка выражений. Если вам нужны преступные группировки с буквой «P» или «A» в начале и «drovskaya» в конце, можете ввести следующую команду (рис. 4.12):

mysql> SELECT gruppirovka_name FROM gruppirovka

-> WHERE (gruppirovka_name LIKE "P%" -> OR gruppirovka_name LIKE "A%")

-> AND gruppirovka_name LIKE "%drovskaya";

Рис. 4.12. Группировки с буквой «Р»

45

С применением круглых скобок оба примера становятся более понятными. Рекомендуется использовать круглые скобки, чтобы избегать двусмысленности в интерпретации сути запроса,

если не очень полагаетесь на неявный порядок выражений

MySQL (рис. 4.13).

Унарный оператор NOТ выполняет отрицание булевого выражения. Предположим, что нам нужен список всех преступных группировок за исключением тех, для которых значение gruppirovka_id равно 1 или 3. В этом случае подойдет такой запрос:

mysql> SELECT gruppirovka_name FROM gruppirovka -> WHERE NOT (gruppirovka_id = 1

-> OR gruppirovka_id = 3);

Рис. 4.13. Группировки со значениями не 1 и 3

Выражение в круглых скобках указывает, что нужно:

(gruppirovka_id = 1 OR gruppirovka_id = 3)

Оператор NOT отрицает это. Таким образом, получаем все строки за исключением тех, которые обусловлены в круглых скобках. Существует несколько способов применения выражения WHERE с этой же функцией, и их выбор не играет роли. Например, следующие три выражения выдают один и тот же результат:

WHERE NOT (gruppirovka_id = 1) AND NOT (gruppirovka_id = 3)

WHERE gruppirovka_id != 1 AND gruppirovka_id NOT 3

WHERE gruppirovka_id != 1 AND NOT (gruppirovka_id = 3).

46

Рассмотрим еще один пример использования оператора NOT в круглых скобок. Попробуем получить список группировок

со значением gruppirovka_id, большим 2, но без значений 4 и 6

(рис. 4.14):

mysql> SELECT * FROM gruppirovka WHERE ->gruppirovka_id > 2 AND NOT (gruppirovka_id = 4

-> OR gruppirovka_id = 6);

Рис. 4.14. Группировка с Id больше 2

Выражение в круглых скобках перечисляет группировки, соответствующие условию, то есть с номерами4 и 6, а оператор NOT отвергает их, чтобы получить все группировки, кроме этих.

Со старшинством оператора NOT не все так просто. С формальной точки зрения, после применения его к любой инструкции, выполняющей оценку с булевымFALSE или арифметическим нулем, должно быть получено TRUE (и значение TRUE будет определено как 1). Однако если применить его к инструкции оценки с ненулевым значением, то получите FALSE (и значение FALSE будет определено как 0). До сих пор рассматривали примеры с выражениями, в которых оператор NOT стоял перед круг-

лыми скобками, например NOT (album_id =4 OR album_id =6).

Оператор NOT необходимо использовать именно таким образом, иначе можно получить неожиданный результат. Например, предыдущее выражение и то, которое приведено ниже, нельзя назвать эквивалентными (рис. 4.15):

mysql> SELECT * FROM gruppirovka WHERE

-> gruppirovka_id > 2 AND NOT gruppirovka_id = 4 -> OR gruppirovka_id = 6;

47

Рис. 4.15. Оператор NOT

Эта инструкция возвращает не тот результат, который ожи-

дали.

Оператор NOT можно комбинировать с операторомLIKE. Предположим, что нужны все группировки, которые не начинаются с буквы «S» (рис 4.16). Для этого воспользуемся такой инструкцией:

mysql> SELECT gruppirovka_name FROM gruppirovka ->

WHERE gruppirovka_name NOT LIKE "S%";

Рис. 4.16. NOT с оператором Like

В результате будут получены все группировки за исключением тех, названия которых начинаются с буквы «S».

Можно комбинировать оператор NOT LIKE с операторами AND и OR. Запросим, например, группировки, начинающиеся с буквы «S», кроме тех, что заканчиваются подстрокой «kaya». Используем для этого следующую команду (рис. 4.17):

mysql> SELECT gruppirovka_name FROM gruppirovka

-> WHERE gruppirovka_name LIKE "S%"

-> AND gruppirovka_name NOT LIKE "%kaya";

48

Рис.4.17. Группировки с буквы “S”

MySQL также поддерживает операцию исключения OR через оператор XOR. Оператор исключения OR оценивает значение как TRUE лишь в том случае, когда только одно (не оба) выражение является истинным. Например, a XOR b представляет экви-

валент (a AND (NOT b)) OR ((NOT a) AND b). Предположим, что требуется найти преступников, либо чьи имена «Ivan», либо отчество «Ivanovich», но не то и другое сразу(рис.4.18). Для этого следует ввести:

mysql> SELECT prestupnik_name FROM prestupnik

-> WHERE prestupnik_name LIKE "% Ivan %" XOR -> prestupnik_name LIKE "% Ivanovich";

Рис.4.18. Поиск по имени

Необходимо отметить, что для правильной работы запроса необходимо обрамить слова Ivan и Ivanovich пробелами, так как Ivan является подстрокой Ivanovich. Таким образом, запрос отработал правильно.

49

Контрольные вопросы

1.Назначение выражения WHERE.

2.Из каких частей состоит язык SQL?

3.В чем особенности построения сложных условий?

4.В чем особенности использования операторов AND и OR?

5.В чем особенности использования операторов NOT и XOR?

6.В чем особенности использования оператора LIKE?

7.Какие обобщающие символы могут использоваться с оператором LIKE?

8.Как происходит сравнение с символьными полями?

50

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]