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

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

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

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

mysql> SELECT * FROM gruppirovka ORDER BY

- > gruppirovka_name;__________________

! gruppirovka_id 1 gruppirovka_name

! 3 I Aleksandrovsкара

4 I Matueevskaya

! 2 I Potapovskaya

! 6 ! Severnaya

! 1 ! Solncevskaya

! 5 ! Solopovskaya

> rows in set <0.00 sec)

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

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

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

mysql> SELECT prestupnik_god_rozhdeniya_,

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

+---------------------------+-

! prestupnik_god_rozhdeniya !

-----------------------------+

prestupnik_name !

! 1957 !

Petrikin Uasiliy Sergeevich !

! 1959 !

Andreev Sergey Ruslanovich !

: 1964 :

Ivashkin Ivan Kuzmich !

! 1966 !

Kopica Ivan Petrovich !

: 1968 :

Govorov Ivan Ivanovich !

! 1969 !

Petrov Ivan Sidorovich !

! 1972 !

Anisimov Uitaliy Abramovich !

: 1973 :

Getrov Ivan Gennadievich !

! 1977 !

Belov Aleksandr Petrovich !

: 1977 :

Petlyakov Maksim Ivanovich !

! 1981 !

Azizov Baden Pigorevich !

! 1981 !

Kravchenko Petr Ivanovich !

: 1983 :

Kabenov Gamshut Petrovich !

! 1985 !

Makeev Gennadiy Petrovich !

: 198? :

Balashov Semen Pavlovich !

15 rows in set <0.02 sec)

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

В данном случае для устранения коллизий используется второй ключ сортировки prestupnik_name. Таким образом, преступник «Belov Aleksandr Petrovich» появляется перед «Petlyakov Maksim Ivanovich».

Также можете производить сортировку в порядке убывания и управлять этим процессом с помощью ключей сортировки. Предположим, что нужно выполнить сортировку группировок по алфавиту, но в порядке убывания. Для этого воспользуемся приведенной ниже инструкцией (рис. 5.3): mysql> SELECT gruppirovka_name FROM gruppirovka -> ORDER BY gruppirovka name DESC;

! gruppirovka_name !

i Solopovskaya

! Solnceuskaya

! Severnaya

i Potapovskaya

! Matveevskaya

! Aleksandrovskaya !

6 rows in set <0.00 sec)

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

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

mysql> SELECT prestupnik_god_rozhdeniya,

  • -> prestupnik_name FROM prestupnik WHERE
  • -> prestupnik_god_rozhdeniya>
  • -> ORDER BY prestupnik_god_rozhdeniya DESC,
  • -> prestupnik_name ASC;

+---------------------------

? prestupnik_god_rozhdeniya

- +-----------------------------+

! prestupnik—name !

! 1987

i Balashov Semen Paulovich !

! 1985

! Makeev Gennadiy Petrovich !

! 1983

! Kabenov Gamshut Petrovich !

: 1981

! Azizov Baden Pigorevich 1

: 1981

! Kravchenko Petr Ivanovich !

! 1977

! Belov Aleksandr Petrovich !

! 1977

! Petlyakov Maksim Ivanovich !

! 1973

! Getrov Ivan Gennadievich !

! 1972

! Anisimov Uitaliy Abramovich !

9 rows in set <0.00 sec)

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

В приведенном выше примере строки отсортированы в порядке убывания значения prestupnik_god_rozhdeniya, а в случае совпадения значений prestupnik_god_rozhdeniya — в порядке возрастания значения prestupnik_n&me. Здесь использовалось ключевое слово 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);_______________________

! gruppirouka_id ! gruppirouka_name ! +----------------+------------------+

  • ? 3 ! Aleksandrovskaya !
  • ? 4 i Matueeuskaya ! ! 2 i Potapouskaya ! i 6 ! Seuernaya ! ! 1 ! Solnceuskaya !
  • ? 5 ! Solopouskaya ! +----------------+------------------+ 6 rows in set <0.00 sec)

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

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

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

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

Mysql> SELECT prestuplenie_name_,

  • -> data_osvobozhdeniya FROM prestuplenie
  • -> ORDER BY CAST(data_osvobozhdeniya AS CHAR);

L.

! prestuplenie_name

! data_osuobozhdeniya

! Moshennichestuo

! 1986-06-09

! Moshennichestuo

! 1989-02-27

! Razboynoe napadenie

! 1992-05-12

! Ubiystuo

! 1992-10-23

! Reyderstuo

! 1995-04-23

! Ugon automobilya

! 1998-06-28

! Kuartirnaya krazha

! 1998-08-17

! Kuartirnaya krazha

! 1999-01-07

! Ubiystuo

! 1999-01-15

! Moshennichestuo

! 2001-01-23

! Kuartirnaya krazha

! 2001-10-24

! Razboynoe napodenie

! 2001-11-26

! Ograblenie magazina

! 2002-04-19

! Razboynoe napadenie

! 2003-07-11

! Uooruzhennoe napadenie na sotrudnika policii

! 2004-02-18

! Razboynoe napadenie

: 2004-07-11

! Ugon automobilya

! 2004-09-29

! Razboy

! 2005-10-21

! Razboynoe napadenie

! 2008-03-17

! Ograblenie banka

! 2008-06-12

! Skupka ugnannih autonobileq

! 2008-11-17

! Ubiystuo

! 2009-10-18

! legalizaciya ugnannih automobiley

: 2009-11-17

! Moshennichestuo

! 2009-12-18

! Ograblenie banka

! 2010-06-12

! Ubiystuo

! 2011-04-03

! Ubiystuo 2 i bolee lie

! 2011-04-30

! Iznasilouanie

! 2011-11-12

28 rows in set <0.02 sec)

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

Результаты перечислены здесь в алфавитном порядке. Функция 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;

i prestupnik_name

+

? Andreev Sergey Ruslanovich ?

! Kravchenko Petr Ivanovich ! ! Ivashkin Ivan Kuzmich _

! Petrikin Uasiliy Sergeevich ! ! Anisimov Uitaliy Abramovich ! ! Govorov Ivan Ivanovich

  • ? Getrov Ivan Gennadievich i ! Kabenov Gamshut Petrovich !
  • ? Petrov Ivan Sidorovich i ! Belov Aleksandr Petrovich !

+-----------------------------+

10 rows in set <0.00 sec)

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

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

LIMIT 3,5;(рис. 5.8) __

i prestupnik_name ! +-----------------------------+ i Petrikin Uasiliy Sergeeuich ! i Anisimou Vitaliy Abramovich !

i Govorov Ivan luanouich !

i Getrov Ivan Gennadievich ! i Kabenov Gamshut Petrovich ! +-----------------------------+

5 rows in set <0.00 sec)

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

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

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

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

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ ОРИГИНАЛ   След >