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

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

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

5. УПРАВЛЕНИЕ ОТОБРАЖЕНИЕМ РЕЗУЛЬТАТОВ ЗАПРОСОВ. ОБЪЕДИНЕНИЕ ТАБЛИЦ

(ПК-35)

5. 1. Изучение механизма сортировки в результатах запросов. Выражение ORDER BY. Выражение LIMIT

В предыдущих примерах изучали, как выбирать столбцы и строки, возвращаемые в виде части результатов запроса, но не говорили о том, как управлять отображением результатов. Строки таблицы выводятся без какого-либо порядка. Поэтому для вывода результатов в определенном порядке следует указывать серверу MySQL на выполнение их сортировки. Будем использовать для сортировки выражениеORDER BY. При этом необходимо помнить, что сортировка не влияет на возвращаемые результаты, а только на порядок их отображения.

Предположим, требуется получить список преступных группировок из базы данныхprestupnost, отсортированный в алфавитном порядке по значениюgruppirovka_пате. Введем следующую инструкцию (рис. 5.1):

mysql> SELECT * FROM gruppirovka ORDER BY

-> gruppirovka_name;

Рис. 5.1. Сортировка в алфавитном порядке

Выражение ORDER BY указывает, что требуется сортировка в столбце (ключ сортировки), указанным после него. В этом примере выполнена сортировка в возрастающем алфавитном порядке значений столбца gruppirovka_name. Сортировка по умолчанию нечувствительна к регистру и производится в порядке возрастания, а MySQL автоматически выполняет сортировку в алфавитном порядке, поскольку столбцы представляют символьные

51

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

Рассмотрим другой пример. На этот раз будет произведена сортировка выходных данных из таблицыprestupnik в порядке возрастания года рождения, то есть по столбцуprestupnik_god_rozhdeniya. Поскольку два или несколько преступников могут иметь одинаковый год рождения, добавим еще один ключ сортировки и определим, как разбираться с такими вопросами. В данном случае, когда год рождения одинаков, сортировка результатов будет выполняться в алфавитном порядке по значению prestupnik_пате. Введем для этого следующую инструкцию (рис. 5.2):

mysql> SELECT prestupnik_god_rozhdeniya,

-> prestupnik_name FROM prestupnik ORDER BY -> prestupnik_god_rozhdeniya, prestupnik_name;

Рис. 5.2. Сортировка в алфавитном порядке

В данном случае для устранения коллизий используется второй ключ сортировкиprestupnik_пате. Таким образом, пре-

ступник «Belov Aleksandr Petrovich» появляется перед «Petlyakov Maksim Ivanovich».

Также можете производить сортировку в порядке убывания и управлять этим процессом с помощью ключей сортировки. Предположим, что нужно выполнить сортировку группировок по алфавиту, но в порядке убывания. Для этого воспользуемся приведенной ниже инструкцией (рис. 5.3):

52

mysql> SELECT gruppirovka_name FROM gruppirovka

-> ORDER BY gruppirovka_name DESC;

Рис.5.3. Группировка в алфавитном порядке убывания

Ключевое слово DESC указывает, что в предшествующем ему столбце (в данном случае gruppirovka_пате) должна выполняться сортировка в порядке убывания. Ключевое слово ASC (используется по умолчанию) указывает на сортировку в порядке возрастания (по алфавиту). Используя несколько столбцов, вы можете смешивать порядок возрастания и убывания. Например, выполнить сортировку в порядке убывания значенияprestup-

nik_god_rozhdeniya и порядке возрастания значен prestupnik_name (рис. 5.4):

mysql> SELECT prestupnik_god_rozhdeniya,

-> prestupnik_name FROM prestupnik WHERE -> prestupnik_god_rozhdeniya>1970

-> ORDER BY prestupnik_god_rozhdeniya DESC, -> prestupnik_name ASC;

Рис. 5.4. Сортировка в порядке убывания

53

В приведенном выше примере строки отсортированы в порядке убывания значенияprestupnik_god_rozhdeniya, а в случае совпадения значений prestupnik_god_rozhdeniya — в порядке возрастания значения prestupnik_name. Здесь использовалось ключевое слово ASC для указания порядка сортировки по умолчанию. Во время выполнения сортировки в случае отсутствия в инструкции ключевого слова DESC подразумевается порядок по возрастанию. Не нужно явным образом включать ключевое словоASC,

однако вместе с ним поведение инструкции становится более очевидным. Также здесь включили в инструкцию выражение WHERE. Выражения WHERE и ORDER BY часто используются вместе, и в инструкции SELECT выражение WHERE всегда стоит перед ORDER BY.

Если возникла коллизия значений и вы не задали дополнительный ключ сортировки, то порядок сортировки будет неопределенным. Это скажется на том, что не получится упорядочить идентичные имена. Распространенным источником коллизий является игнорирование MySQL во время сортировки строк регистра символов. Так, строки John, John и JOHN рассматриваются при обработке ORDER BY как идентичные. Если необходимо выполнить сортировку с учетом регистра символов строки(порядок ASCII — верхний регистр идет перед нижним), то можете добавить в запрос ключевое слово BINARY (рис. 5.5):

mysql> SELECT * FROM gruppirovka ORDER BY

BINARY(gruppirovka_name);

Рис. 5.5. Сортировка с учетом регистра

54

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

Следует отметить, что ключевое слово BINARY можно использовать для многих целей, например для равнения строк.

Сортировка выполняется в соответствии с типом столбца. Так, если производить сортировку по датам, то строки будут организованы в порядке возрастания даты. Можно указать другое поведение сортировки, используя функцию CAST() и ключевое слово AS. Предположим, требуется отсортировать таблицу prestuplenie в порядке возрастания значения data_osvobozhdeniya,

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

Mysql> SELECT prestuplenie_name,

-> data_osvobozhdeniya FROM prestuplenie

-> ORDER BY CAST(data_osvobozhdeniya AS CHAR);

Рис. 5.6. Сортировка в порядке возрастания

55

Результаты перечислены здесь в алфавитном порядке. Функция CAST() дает указание рассматривать столбец как другой тип данных — в данном примере как символьную строку с помощью выражения AS CHAR. Можно указывать следующие выражения:

AS SIGNED — для сортировки целых чисел со знаком; AS UNSIGNED — для сортировки целых чисел без знака; AS CHAR — для сортировки символьной строки;

AS DATE — для сортировки по дате;

AS DATETIME — для сортировки по дате и времени; AS TIME — для сортировки по времени.

Выражение LIMIT используется для управления выводом строк. Его базовая форма позволяет ограничивать число строк, возвращаемых инструкцией SELECT, что очень удобно для ограничения данных, передаваемых через сеть или отображаемых на экране. Можно, например, использовать это выражение вWebприложении баз данных для поиска строк, соответствующих критерию, но отображать только первые10 строк в Web-странице. Далее представлен пример, в котором выбирается список преступников и ограничивается вывод 10 строками (рис. 5.7):

mysql> SELECT prestupnik_name FROM prestupnik LIMIT 10;

Рис. 5.7. Список с ограниченным выводом

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

56

mysql> SELECT prestupnik_name FROM prestupnik LIMIT 3,5;(рис. 5.8)

Рис. 5.8. Возврат фиксировнного количества строк

Врезультате выполнения инструкцииSELECT получим строки с 4 по 8.

Если нужно получить строки, начиная с какой-то определенной строки и до конца, но неизвестно, сколько их всего в таблице, нужно указать в выражении LIMIT число 999999999, чтобы возвратить все строки. С технической точки зрения, самым большим числом является1846744073709551615. Это максимальное из значений, что могут храниться в переменной типаBIGINT без знака сервера MySQL. При попытке использовать большее число MySQL «будет выводить сообщение об ошибке».

Существует альтернативный синтаксис, применяемый для выражения LIMIT. Вместо LIMIT 5, 10 вы можете написать LIMIT 5 OFFSET 10.

5.2.Объединение двух таблиц

Впредыдущих главах в запросах SELECT работали с одной таблицей. Однако в реляционных базах данных имеется возможность извлекать информацию из нескольких таблиц. Проанализировав таблицы БД prestupnost, вы поняли, что можете выполнять более интересные запросы. Например, получать информацию о преступлениях и совершивших их преступников. В данном разделе речь пойдет о выполнении таких запросов путемобъединения двух таблиц.

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

57

способ объединения данных из нескольких таблиц. Рассмотрим выражение INNER JOIN, которое является самым простым для изучения. Принцип его работы будет объяснен после следующего примера (рис. 5.9):

mysql> SELECT gruppirovka_name, prestupnik_name

-> FROM gruppirovka INNER JOIN prestupnik -> USING (gruppirovka_id);

Рис. 5.9. Принцип работы INNER JOIN

В результатах показаны группировки и преступники в них входящие, а именно, сколько преступников входит в каждую группировку.

Как работает выражение INNER JOIN? Оно состоит из двух частей: в первой задаются имена двух таблиц, разделенные ключевыми словами INNER JOIN, а вторая часть содержит ключевое слово USING, указывающее, какой столбец (или столбцы) связывает две таблицы. В данном примере объединены две таблицы, gruppirovka и prestupnik, что определено выражением gruppirovka INNER JOIN prestupnik (для базовой формы INNER JOIN порядок перечисления таблиц не имеет значения, так что выражение prestupnik INNER JOIN gruppirovka выдаст такой же результат).

Выражение USING (gruppirovka_id) указывает MySQL, что столбцом, связывающим таблицы, является gruppirovka_id, со-

58

гласно проекту. Из таблицы gruppirovka получаем следующие данные (рис. 5.10):

mysql> SELECT * FROM gruppirovka;

Рис. 5.10. Выражение USING

Данные из таблицы prestupnik такие (рис. 5.11): mysql> SELECT * FROM prestupnik;

Рис. 5.11. Данные из таблицы «преступник»

В ответ на этот запрос MySQL определит пары строк из таблицы gruppirovka и prestupnik с одними и теми же значениями gruppirovka_id. Для каждого значенияgruppirovka_id в таблице gruppirovka (используем одно в качестве примера, рис. 5.12).

Рис. 5.12. Пример запроса с одними и теми же значениями

59

Сервер найдет в таблице prestupnik все записи со значени-

ем artist_id =1 (рис. 5.13).

Рис. 5.13. Запрос всех записей со значением Id 1

После этого сервер может сформировать из этих двух наборов новую временную таблицу (рис. 5.14).

Рис. 5.14. Временная таблица из двух наборов

По завершении обработки всех различных значений gruppirovka_id сервер выбирает для отображения столбцы, которые запрашивали, в данном случаеgruppirovka_пате и prestupnik_пате (рис. 5.15).

Рис. 5.15. Запрашиваемые столбцы

Перед тем как использовать базовый синтаксис выражения INNER JOIN, следует ознакомиться со следующими правилами.

60

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