|
Объединение таблиц заключается в приравнивании колонок двух таблиц:
SELECT book, title, author, name
FROM author, book
WHERE book, author = author, id
Рассмотрим базу данных, в которой таблица book имеет вид, как в таблице 6-3.
Таблица 6-3. Таблица книг
IDTitleAuthorPages1The Green Mile48942Guards, Guards!2302
IDTitleAuthorPages3Imzadi33544Gold14055Howling Mad3294А таблица авторов author
имеет вид таблицы 6-4.
Таблица 6-4. Таблица авторов
IDNameCitizen1Isaac AsimovUS2Terry PratchetUK3Peter Davidus4Stephen Kingus5Neil
GaimanUKВ результате внутреннего объединения создается таблица, в которой
объединяются поля обеих таблиц для строк, удовлетворяющих запросу в обеих
таблицах. В нашем примере запрос указывает, что поле author в таблице book
должно совпадать с полем id таблицы author. Результат выполнения этого запроса
представлен в таблице 6-5.
Таблица 6-5. Результаты запроса с внутренним объединением
Book TitleAuthor NameThe Green MileStephen KingGuards, Guards!Terry Pratchet
ImzadiPeter DavidGoldIsaac AsimovHowling MadPeter DavidВ этих результатах нет
автора с именем Neil Gaiman, поскольку его author, id не найден в таблице book,
author. Внутреннее объединение содержит только те строки, которые точно
соответствуют запросу. Позднее в этой главе мы обсудим понятие внешнего
объединения, которое оказывается полезным в случае, когда в базу данных внесен
писатель, у которого нет в этой базе книг.
Псевдонимы
Полные имена, содержащие имена таблиц и колонок, зачастую весьма громоздки.
Кроме того, при использовании функций SQL, о которых мы будем говорить ниже,
может оказаться затруднительным ссы-
латься на одну и ту же функцию более одного раза в пределах одной команды.
Псевдонимы, которые обычно короче и более выразительны, могут использоваться
вместо длинных имен внутри одной команды SQL, например:
# Псевдоним колонки
SELECT long_field_names_are_annoying AS myfield
FROM table_name
WHERE myfield = 'Joe'
# Псевдоним таблицы в MySQL
SELECT people.names, tests.score
FROM tests, really_long_people_table_name AS people
# Псевдоним таблицы в mSQL
SELECT people.names, tests.score
FROM tests, really_long_people_table_name=people
mSQL полностью поддерживает псевдонимы для таблиц, но не поддерживает
псевдонимы для колонок.
Группировка и упорядочение
По умолчанию порядок, в котором появляются результаты выборки, не определен. К
счастью, SQL предоставляет некоторые средства наведения порядка в этой
случайной последовательности. Первое средство -упорядочение - есть и в MySQL, и
в mSQL. Вы можете потребовать от базы данных, чтобы выводимые результаты были
упорядочены по некоторой колонке. Например, если вы укажете, что запрос должен
упорядочить результаты по полю last_name , то результаты будут выведены в
алфавитном порядке по значению поля last_name . Упорядочение осуществляется с
помощью предложения ORDER BY:
SELECT last_name, first_name, age
FROM people
ORDER BY last_name, first_name
В данном случае упорядочение производится по двум колонкам. Можно проводить
упорядочение по любому числу колонок, но все они должны быть указаны в
предложении SELECT. Если бы в предыдущем примере мы не выбрали поле last_name ,
то не смогли бы упорядочить по нему.
Группировка — это средство ANSI SQL, реализованное в MySQL, но не в mSQL.
Поскольку в mSQL нет агрегатных функций, то группировка просто не имеет смысла.
Как и предполагает название, группировка позволяет объединять в одну строки с
аналогичными значениями с целью их совместной обработки. Обычно это делается
для применения к результатам агрегатных функций. О функциях мы поговорим
несколько позднее.
Рассмотрим пример:
mysql> SELECT name, rank, salary FROM people\g
5 rows in set (0.01 sec)
После группировки по званию (rank) выдача изменяется:
mysql> SELECT rank FROM people GROUP BY rank\g
3 rows in set (0.01 sec)
После применения группировки можно, наконец, найти среднюю зарплату (salary)
для каждого звания. О функциях, используемых в этом примере, мы поговорим
позднее.
mysql> SELECT rank, AVG(salary) FROM people GROUP BY rank\g
3 rows in set (0.04 sec)
Мощь упорядочения и группировки в сочетании с использованием функций SQL
|
|