Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
conspect.pdf
Скачиваний:
376
Добавлен:
17.03.2016
Размер:
27.86 Mб
Скачать

Базы данных

БГУИР, ПОИТ

 

 

6.1.10.SELECT: FROM table_references

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

Как правило, выборка производится из одной таблицы.

Исходная таблица

Запрос

Результат

SELECT `id`, `name`, `money`

FROM `payment`

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

JOIN (самый часты случай).

UNION (как правило, в случае обращения к т.н. «операционной» и «архивной» таблицам).

Рассмотрим пример обращения к двум таблицам с использованием JOIN:

Исходные таблицы и схема

Запрос

Результат

SELECT `r_name`, `c_inv`

FROM `rooms`

JOIN `computers`

ON `r_id`=`c_room`

Стр: 152/248

Базы данных

БГУИР, ПОИТ

 

 

Рассмотрим пример обращения к двум таблицам с использованием UNION. В операционной таблице хранятся данные только за последний месяц, а всё остальное перенесено в архивную:

Исходные таблицы и схема

Запрос

Результат

SELECT `name`

FROM `payment_operational`

UNION DISTINCT SELECT `name`

FROM `payment_archive`

Q: Может ли одна и та же таблица несколько раз встречаться в выражении

FROM?

A: Да. В UNION (хотя это очень редкий случай) и JOIN (проецирование дерева в таблицу, сложное агрегирование).

Пример случая, когда одна и та же таблица встречается в контексте UNION. Например, мы хотим одним запросом выяснить, кто за последний месяц выполнил самый большой и самый маленький платёж:

Исходная таблица

 

Запрос

 

Результат

 

 

(SELECT 'MAX' AS `type`,

 

 

 

 

`name`, `money`

 

 

 

 

FROM `payment_operational`

 

 

 

 

ORDER BY `money` DESC LIMIT 1)

 

 

 

 

UNION ALL

 

 

 

 

(SELECT 'MIN' AS `type`,

 

 

 

 

`name`, `money`

 

 

 

 

FROM `payment_operational`

 

 

 

 

ORDER BY `money` ASC LIMIT 1)

 

 

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

Исходная таблица

 

Запрос

Результат

и структура

 

 

 

 

 

 

 

 

 

 

 

 

 

SELECT `level1`.`p_name`

 

 

 

 

 

AS `parent`,

 

 

 

 

 

`level2`.`p_name` AS

 

 

 

 

 

`name` FROM `pages` AS

 

 

 

 

 

`level1` RIGHT JOIN `pages`

 

 

 

 

 

AS `level2`

 

 

 

 

 

ON `level1`.`p_id` =

 

 

 

 

 

`level2`.`p_parent`

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Стр: 153/248

Базы данных

БГУИР, ПОИТ

 

 

И третий пример: когда JOIN и UNION встречаются вместе. Допустим, нам нужно показать все комнаты (включая те, где нет компьютеров) и все компьютеры (даже те, что не поставлены ещё ни в одну комнату):

Исходные таблицы и схема

Запрос

Результат

(SELECT `r_name`, `c_inv` FROM `rooms` LEFT OUTER JOIN `computers` ON `r_id`=`c_room`)

UNION DISTINCT

(SELECT `r_name`, `c_inv` FROM `rooms` RIGHT OUTER JOIN `computers` ON `r_id`=`c_room`)

Стр: 154/248

Базы данных

БГУИР, ПОИТ

 

 

6.1.11.SELECT: [WHERE where_condition]

Указание простого или составного условия выборки. В случае использования WHERE все параметры условия должны быть такими, чтобы их можно было вы-

числить к моменту применения. Иначе надо использовать HAVING. Операции с WHERE оптимизируются на уровне СУБД.

В руководстве сказано…

Значение where_condition вычисляется как TRUE или FALSE для каждого ряда выборки. С WHERE можно использовать любые функции и операторы MySQL

кроме агрегатных функций.

См. подробности здесь: http://dev.mysql.com/doc/refman/5.5/en/expressions.html http://dev.mysql.com/doc/refman/5.5/en/functions.html

1) Элементарные примеры применения WHERE

Исходная таблица

 

Запрос

 

Результат

 

 

 

Простое условие:

 

 

 

 

 

SELECT * FROM `payment_archive`

 

 

 

 

 

WHERE `money`>65

 

 

 

 

 

 

 

 

 

 

 

Составное условие:

 

 

 

 

 

SELECT * FROM `payment_archive`

 

 

 

 

 

WHERE `name`='John'

 

 

 

 

 

AND `money`<60

 

 

2) Условие с подзапросом

 

 

 

 

 

 

 

 

Исходная таблица

 

 

Запрос

 

Результат

 

 

 

 

 

 

 

 

SELECT * FROM `payment_archive`

 

 

 

 

WHERE `money`=

 

 

 

 

(SELECT MAX(`money`)

 

 

 

 

FROM `payment_archive`)

 

 

 

 

 

 

 

 

Стр: 155/248

Базы данных

БГУИР, ПОИТ

 

 

Ситуация, в которой нельзя применить WHERE – это выполнение запроса, в котором условие выборки не может быть вычислено на момент своего применения (т.е. оно станет известно только после окончания выполнения запроса).

Для начала добавим в нашу таблицу ещё одну строку и выполним запрос на показ плательщика, СУММА платежей которого больше некоторого числа:

Исходная таблица

 

Запрос

 

Результат

 

 

 

 

Ошибка. Запрос

 

 

SELECT `name`, SUM(`money`) AS `s`

 

 

FROM `payment_archive` GROUP BY

 

не выполнен.

 

 

`name` WHERE `s`>100

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SELECT `name`, SUM(`money`) AS `s`

 

 

 

 

FROM `payment_archive` GROUP BY

 

 

 

 

`name` HAVING `s`>100

 

 

 

 

 

 

 

Стр: 156/248

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