Программирование >>  Программный интерфейс приложений 

1 ... 24 25 26 [ 27 ] 28 29 30 ... 264


Кроме count {), существуют и другие агрегирующие функции. Функции min (), мах (), sum () и avg {) Предназначены для вычисления минимума, максимума, суммы и среднего значений столбца соответственно. Их можно использовать одновременно. Вот запрос, который позволит производить подсчеты различных характеристик для любого теста или викторины. Здесь видно, как много подсчетов можно произвести по любому из значений. (Некоторые учащиеся отсутствуют и их оценки не попадают в подсчеты.)

mysql> SELECT

->event id,

->MIN(score) AS minimum,

->MAX(score) AS maximum,

->MAX(score) - MIN(score) + 1 AS range,

->SUM(score) AS total,

->AVG(score) AS average,

->COUNT(score) AS count

->FROM score

->GROUP BY event id;

+-+-

1 event id

minimum

maximum

range

total

average

count 1

1 1 1

20 1

15.1379

29 1

1 2 1

8 1

19 1

14.1667

30 1

1 3 1

97 i

2425

78.2258

31 1

1 4 1

20 1

14.0370

27 1

1 5 1

14.1852

27 1

i 6 1

100 1

2325

80.1724

29 1

Конечно, информация может быть более осмысленной, когда известно, откуда получены значения - из викторины или из теста. Для получения этой информации необходимо также обратиться к таблице event table. Мы вернемся к этому запросу в разделе Выборка данных из нескольких таблиц .

Работать с агрегирующими функциями очень просто, так как они достаточно мощны. Но можно легко получить ошибочный результат. Рассмотрим следующий запрос.

mysql> SELECT

->state AS State,

->AVG(TO DAYS (death) - TO DAYS (birth) )/365) AS Age, ->FROM president WHERE death IS NOT Nm,L ->GROUP BY state ORDER BY Age;

1 state

1 KY

208219

1 VT

852055

1 NC

141096

1 OH

866145

1 NH

917808

1 NY

342466

1 NJ

1 71

315068

1 TX

476712



1 MA

1 72

642009

1 VA

1 72

822945

1 PA

i 77

158904

1 SC

1 78

284932

1 CA

1 81

336986

1 MO

1 88

693151

i lA

1 90

254795

Этот запрос производит выборку умерших президентов, группирует их по дате рождения, определяет их возраст на момент смерти, вычисляет средний возраст по штату, а затем сортирует пол>ченные результаты по среднему возрасту. Другими словами, запрос определяет средний возраст по штатам на момент смерти для всех президентов США, которых уже нет в живых.

Что же он показывает? Он показывает только то, что вы умеете писать запросы. И ничего больше. Не все операции, которые можно осуше-ствлять с базами данных, имеют смысл. Однако люди иногда впадают в состояние эйфории, когда вдруг понимают, что они могут вытворять с базами данных. В результате этого последние годы особенно бросается в глаза бешеный рост экзотерической (и совершенно бесцельной) спортивной статистики. Спортивные статистики с помошью своих баз данных вытягивают на свет все что нужно и не нужно знать о спортивных клубах. Неужели кого-то действительно может заинтересовать рекорд по перехватам мяча правого полузашитника в момент, когда его клуб вел с разницей в два мяча?

Выборка данных из нескольких таблиц

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

При выборке информации из нескольких таблиц пользователь производит операцию, которая называется объединение (Join). Такой термин здесь применяется из-за того, что результат такого запроса получен в результате объединения информации, взятой из одной таблицы, с информацией, взятой из другой таблицы.

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

На первом этапе создадим запрос выборки результатов тестов для определенной даты:



mysql> SELECT student id, date, score, type ->FKOM event, score ->WHERE date = 1999-09-23 ->AND event.event id = score, event id;

+-+-

1 student id !

date

score

-+-+

1 type 1

1 1 1

1999-09-23

1 Q 1

1 2 1

1999-09-23

i Q 1

1 3 1

1999-09-23

1 Q 1

1 5 1

1999-09-23

1 Q 1

1 6 1

1999-09-23

1 Q 1

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

Этот запрос отличается от всех уже записанных нами двумя важными аспектами.

Поиск производится из нескольких таблиц и в предложении from перечислено две таблицы.

FROM event, score

В предложении where определено, что таблицы event и score объединяются по значениям event id.

WHERE ... event.event id = score. event id;

Обратите внимание на синтаксис обращения к столбцу вида tbl name.col name. В нем обязательно указано имя таблицы. (Столбец event id присутствует в обеих таблицах, поэтому здесь упоминание имени столбца без имени таблицы приводит к неоднозначности.)

Другие столбцы, участвующие в запросе (date, score, type), можно указывать без имени таблицы. Для этого запроса они уникальны и их упоминание не вызовет неоднозначности. Однако я предпочитаю указывать имена таблиц в запросах. Это делает его более прозрачным. В полностью квалифицированном запросе мы получим:

mysql> SELECT score.student id, event.date, score.score, event.type ->FROM event, score ->WHERE event.date = 1999-09-23 ->AND event.event id = score.event id;

С этого момента будет использоваться полностью квалифицированная форма.

Потом доработаем запрос таким образом, чтобы он выбирал имя учащегося из таблицы student. (Результат первого запроса выводит нам только идентификатор учащегося (поле student id), но имя учащегося более информативно.) Это можно осуществить с помощью столбца



1 ... 24 25 26 [ 27 ] 28 29 30 ... 264

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика