ПСЕВДОНИМЫ И АГРЕГИРОВАНИЕ ДАННЫХ

Псевдонимы столбцов и таблиц

Псевдонимы столбцов пригодятся для более четкого выражения запросов, снижения количества вводимых символов, а также для работы с такими языками, как РНР. Далее рассмотрим простой пример (рис. 7.1):

mysql> SELECT gruppirovkajiame AS

-> prestupnie_gruppirovki FROM gruppirovka;

! prestupnie_gruppirovki ! +

  • ? Solncevskaya
  • ? Potapovskaya

! Aleksandrovskaya

i Matveevskaya

  • ? Solopovskaya
  • ? Severnaya

! Danilovskaya

+

7 rows in set <0.00 sec)

Рис. 7.1. Столбец, обозначенный псевдонимом

Столбец gruppirovka_name обозначен псевдонимом prestupnie_gruppirovki. В выходных данных заголовок столбца gruppirovka _пате заменен псевдонимом prestupnie_gruppirovki. Преимущество такого подхода заключается в том, что псевдоним prestupnie_gruppirovki более понятен пользователям. Кроме того, хотя в данном случае это и не нужно, зато отлично иллюстрирует суть: для столбца вы добавляете ключевое слово AS, а затем по своему усмотрению вводите строку, которая будет представлять данный столбец.

Теперь применим псевдонимы столбцов для чего-нибудь действительно полезного. Далее представлен пример, в котором используется функция CONCATO и выражение ORDER BY (рис. 7.2);

mysql> SELECT CONCAT(fB преступную

-> группировку J,gruppirovka_namej

  • -> ‘ входит преступник J, prestupnikname)
  • -> AS prestupniki
  • -> FROM gruppirovka INNER JOIN prestupnik
  • -> USING (gruppirovka_id) ORDER BY prestupniki;

! prestupniki ! В преступную группировку Aleksandrovskaya входит преступник Getrov luan Gennadievich ! ' В преступную группировку Aleksandrovskaya входит преступник Kabenov Gamshut Petrovich ! ! В преступную группировку Aleksandrovskaya входит преступник Makeev Gennadiy Petrovich ! ! В преступную группировку Danilovskaya входит преступник Pomoev Artur Uladimirovich ! ! В преступную группировку Danilovskaya входит преступник Sidorov Gennadiy Ivanovich ! ! В преступную группировку Matveevskaya входит преступник Belou Aleksandr Petrovich ! ! В преступную группировку Matveevskaya входит преступник Petrov Ivan Sidorovich ! ! В преступную группировку Potapovskaya входит преступник Anisimov Uitaliy Abramovich !

* В преступную группировку Potapovskaya входит преступник Govorov Ivan Ivanovich ! ! В преступную группировку Severnaya входит преступник Balashov Semen Pavlovich ! ! В преступную группировку Severnaya входит преступник Petlyakov Maksim Ivanovich ! ! В преступную группировку Solncevskaya входит преступник Andreev Sergey Ruslanovich ! ’ В преступную группировку Solncevskaya входит преступник Ivashkin Ivan Kuzmich ' ' В преступную группировку Solncevskaya входит преступник Kravchenko Petr Ivanovich ! ! В преступную группировку Solncevskaya входит преступник Petrikin Uasiliy Sergeevich ! ! В преступную группировку Solopovskaya входит преступник Azizov Baden Pigorevich !

! В преступную группировку Solopovskaya входит преступник Kopica Ivan Petrovich !

17 rows in set <0.00 sec>

Рис. 7.2. Функция CONCATO

Функция CONCATO выполняет конкатенацию строк, являющихся параметрами. В данном случае это постоянная строка В преступную группировку, поле gruppirovka _пате, постоянная строка входит преступник и поле prestupnik_name, которые вместе выдают такой результат, как «В преступную группировку Aleksandrovskaya входит преступник Getrov Ivan Gennadievich». Для функции добавим псевдоним AS prestupniki, чтобы на протяжении запроса ссылаться на нее как на prestupniki. Сделаем это, например, в выражении ORDER BY, где MySQL указано отсортировать выходные данные по возрастанию значения prestupniki. Такой метод более удобен, и не требует вновь вводить полное имя функции CONCATO как в следующем примере (рис. 7.3);

mysql> SELECT CONCAT(fB преступную

  • - группировку J,gruppirovka name,
  • -> 'входит преступник^, prestupnikname)
  • -> FROM gruppirovka INNER JOIN prestupnik
  • -> USING (gruppirovka_id) ORDER BY
  • -> CONCAT(fB преступную группировку',
  • -> gruppirovka name, ‘входит преступник', -> prestupnik_name);

CONCATCB преступную группировку ',gruppirovka_name, ' входит преступник *, prestupnik_name> !

В преступную группировку Aleksandrovskaya входит преступник Getrov Ivan Gennadievich В преступную группировку Aleksandrovskaya входит преступник Kabenov Gamshut Petrovich В преступную группировку Aleksandrovskaya входит преступник Makeev Gennadiy Petrovich В преступную группировку Danilovskaya входит преступник Pomoev Artur Uladimirovich В преступную группировку Danilovskaya входит преступник Sidorov Gennadiy Ivanovich В преступную группировку Matveevskaya входит преступник Belov Aleksandr Petrovich В преступную группировку Matveevskaya входит преступник Petrov Ivan Sidorovich В преступную группировку Potapovskaya входит преступник Anisimov Uitaliy Abramovich В преступную группировку Potapovskaya входит преступник Govorov Ivan Ivanovich В преступную группировку Severnaya входит преступник Balashov Semen Pavlovich В преступную группировку Severnaya входит преступник Petlyakov Maksim Ivanovich В преступную группировку Solncevskaya входит преступник Andreev Sergey Ruslanovich В преступную группировку Solncevskaya входит преступник Ivashkin Ivan Kuzmich В преступную группировку Solncevskaya входит преступник Kravchenko Petr Ivanovich В преступную группировку Solncevskaya входит преступник Petrikin Uasiliy Sergeevich В преступную группировку Solopovskaya входит преступник Azizov Baden Pigorevich В преступную группировку Solopovskaya входит преступник Kopica Ivan Petrovich

7 rows in set <0.00 sec)

Рис. 7.3. Сортировка выходных данных по возрастанию

При использовании полных имен повышается риск неправильно ввести выражение ORDER BY и получить ошибочные результаты.

Существуют ограничения на применение псевдонимов. Так, нельзя их использовать в выражении WHERE, а также в USING и ON. Это означает, что запросы нельзя записывать таким образом:

mysql> SELECT gruppirovka_name AS a

  • -> FROM gruppirovka WHERE a = "Andreev Sergey
  • -> Ruslanovich";

ERROR 1054 (42S22): Unknown column 'a' in 'where clause'

Причина состоит в том, что MySQL не всегда знает значение столбца перед выполнением выражения WHERE. Тем не менее, можно использовать псевдонимы для столбцов в утверждении ORDER BY, а также в выражениях GROUP BY и HAVING, описанных далее.

Ключевое слово AS является опциональным. По этой причине два следующих запроса идентичны (рис. 7.4):

mysql> SELECT gruppirovka_id AS id

  • -> FROM gruppirovka
  • -> WHERE gruppirovka_name = "Potapovskaya";

mysql> SELECT gruppirovka_id id FROM gruppirovka

-> WHERE gruppirovka_name = "Potapovskaya";

id I

  • ----+ 2 :
  • + row in set <0.00 sec)

Рис. 7.4. Идентичные запросы

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

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

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

Представленный ниже базовый пример с псевдонимами таблиц наглядно демонстрирует, как можно экономить время на вводе данных (рис. 7.5):

mysql> SELECT gr.gruppirovka_id,

  • -> pr.prestupnik_name_, gr.gruppirovka_name
  • -> FROM gruppirovka AS gr INNER JOIN prestup-nik

-> AS pr USING (gruppirovka_id) -> WHERE pr.prestupnik_name = -> "Belov Aleksandr Petrovich";

*?----------------+-

! gruppirouka_id !

prestupn ik_name

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

! gruppirouka_name !

: 4 !

Below Aleksandr Petrouich

! Matueeuskaya !

1 row in set <0.00

sec)

Рис. 7.5. Псевдонимы таблиц

В этом примере для таблиц gruppirovka и prestupnik заданы соответственно псевдонимы gr и рг с использованием ключевого слова AS. Таким образом, выражаются имена столбцов в более компактном виде, например gr.gruppirovka_id. В данном случае название столбца начинается с названия таблицы и отделяется точкой. Обратите также внимание, что в отличие от псевдонимов столбцов можно применять псевдонимы таблиц в выражении WHERE. В отношении использования псевдонимов таблиц в запросах ограничений не существует. В данном примере ссылка на псевдонимы таблиц дается еще до их определения.

Как и в случае с псевдонимами столбцов, ключевое слово AS является опциональным. Инструкция:

gruppirovka AS gr INNER JOIN prestupnik AS pr

идентична инструкции:

gruppirovka gr INNER JOIN prestupnik pr

Тем не менее, мы предпочитаем использовать AS, поскольку так запрос будет легче понимать. Ограничения псевдонимов таблиц по длине такие же, как и для псевдонимов столбцов, и наши рекомендации по выбору псевдонимов остаются теми же.

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

mysql> SELECT * FROM prestupnik WHERE

  • -> prestupnik_name =
  • -> prestupnik_name;

Однако такой запрос не имеет смысла, поскольку в результатах будут представлены все преступники (рис. 7.6).

t-----------------r---------------

! gruppirovka_id ! prestupnik_id

?t-----------------------------+ -

! prestupnik_name !

---------------------------t

prestupnik_god_rozhdeniya !

! 1 !

1

! Andreev Sergey Ruslanovich !

1959 !

1 1 1

2

! Kravchenko Petr Ivanovich 1

1981 !

! 1 :

3

! Ivashkin Ivan Kuzmich !

1964 !

1 1 1

4

i Petrikin Uasiliy Sergeevich 1

1957 !

1 2 1

1

! Anisimov Uitaliy Abramovich !

1972 !

! 2 !

2

! Govorov Ivan Ivanovich !

1968 :

! 3 !

1

! Getrov Ivan Gennadievich !

1973 !

1 3 1

2

1 Kabenov Gamshut Petrovich !

1983 !

: 4 :

1

! Petrov Ivan Sidorovich !

1969 !

: 4 :

2

! Belov Aleksandr Petrovich !

1977 !

1 5 1

1

! Azizov Baden Pigorevich !

1981 1

! 5 !

2

! Kopica Ivan Petrovich !

1966 !

! 6 !

1

! Balashov Semen Pavlovich !

1987 :

1 6 1

2

! Petlyakov Maksim Ivanovich 1

1977 !

1 3 1

3

1 Makeev Gennadiy Petrovich !

1985 !

: ? :

1

! Pomoev Artur Uladimirovich !

1970 !

: ? :

2

! Sidorov Gennadiy Ivanovich !

1955 !

17 rows in set <0.00 sec)

Рис. 7.6. Определение одинаковых фамилий

Как это сделать в одном запросе? Метод состоит в том, чтобы присвоить таблице два разных псевдонима, а затем сопоставить строки из таблиц, имеющих один и другой псевдоним: mysql> SELECT pl.prestupnik_name

  • -> FROM prestupnik AS pl, prestupnik AS p2
  • ->WHERE pl.prestupnik_name=p2.prestupnik_name;(pnc. 7.7)

! prestupnik_name ! Andreev Sergey Ruslanovich !

! Kravchenko Petr Ivanovich !

! Ivashkin Ivan Kuzmich

! Petrikin Uasiliy Sergeevich !

! Anisimov Uitaliy Abramovich !

! Govorov Ivan Ivanovich

! Getrov Ivan Gennadievich !

! Kabenov Gamshut Petrovich !

! Petrov Ivan Sidorovich

! Belov Aleksandr Petrovich !

? Azizov Baden Pigorevich !

! Kopica Ivan Petrovich

! Balashov Semen Pavlovich !

! Petlyakov Maksim Ivanovich !

! Makeev Gennadiy Petrovich !

! Pomoev Artur Uladimirovich !

I Sidorov Gennadiy Ivanovich I

17 rows in set <0.00 sec)

Рис. 7.7. Сопоставление фамилий

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

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

mysql> SELECT pl.prestupnik_name

  • -> FROM prestupnik AS pl, prestupnik AS p2
  • -> WHERE pl.prestupnik_name=p2.prestupnik_name
  • -> AND pl.gruppirovka_id <> p2.gruppirovka_id;

Empty set (0.00 sec)

Теперь видно, что в базе данных нет преступников, входящих в разные преступные группировки.

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