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

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


student id, присутствующего в таблицах score и student. Получим запрос следующего вида.

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

1 name

1 date 1

score

1 type

1 Megan

+ +

1 1999-09-23 1

1 Joseph

1 1999-09-23 1

1 Kyle

1 1999-09-23 1

1 Abby

1 1999-09-23 1

1 Nathan

1 1999-09-23 1

Этот запрос отличается от предьщущего следующими аспектами.

В предложение FROM добавляется таблица student. Она необходима в дополнение к таблицам event и score.

Теперь столбец studentid без упоминания имени таблицы становится неоднозначным. Необходима нотация score. studentid или student. student id, чтобы конкретизировать столбец. (Это справедливо, даже если читатель имеет привычку не именовать таблицы в запросах-объединениях.)

В предложении WHERE добавлено условие соответствия записей таблиц score и student по значениям столбцов student id:

WHERE ... score.student id = student.student id;

Запрос выводит имя учащегося, а не его идентификатор. (Конечно, при желании можно выводить оба поля сразу.)

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

Еще одной задачей проекта учета успеваемости является учет посещаемости. Отсутствие учащихся на занятиях pernt фируется по идентификатору учащихся и дате, хранящимся в таблице absence. Для того чтобы пол\чить имена >чащихся (а не только их идентификаторы), нам необходимо объединить таблицы absence и student. Это можно сделать по значению studentid. Вот запрос, выводящий идентификатор учащихся и их имена вместе с суммой занятий, пропущенных >чащимися:

mysql> SELECT student.id, student.name, ->COUNT(absence.date) as absences ->FROM student, absence

->WHERE student.student id = absence.student id;



->GROUP BY student.student id;

1 student id

name

-+-+

1 absences

1 3

Kyle

1 1 1

1 5

Abby

1 1 1

1 10

Peter

1 2 1

1 17

Will

1 1 1

1 20

Avrey

1 1 1

I Совет

& Несмотря на то, что здесь в предложении group by указано имя таблицы, это совсем не обязательно. Предложение group by имеет отношение к

f; столбцам, указанным в списке выборки (на первых двух строках запроса). А

i там указан только один столбец student id, поэтому СУБД MySQL знает ,

0 какая таблица имеется в виду. Это правило справедливо также и для столб-

\ цов, перечисленных в предложениях order by.

Этот запрос выдает отличный результат тогда, когда мы стремимся узнать имена учашихся, которые имеют пропуски занятий. Но если такой список предоставить педагогическому совету, то может последовать совершенно естественный вопрос: А как же остальные учашиеся? Нам необходимо оценить результаты и оставшихся учеников . Это совсем другой вопрос. Это значит, что необходимо получить количество пропушен-ных занятий даже для учашихся, которые пропусков не имеют. Этот запрос отличается от предыдущего.

Для того чтобы на него ответить, воспользуемся конструкцией left join в предложении where. Она указывает СУБД MySQL делать выборку всех строк из таблицы, указанной в предложении слева (слева от слов left join). Назвав сначала таблицу student, мы получим перечень всех учащихся, даже тех, кто не представлен в таблице absence. Теперь запрос будет выглядеть следующим образом:

mysql> SELECT student.id, student.name, ->COUNT(absence.date) as absences ->FROM student LEFT JOIN absence

->WHERE student.student id = absence.student id; ->GROUP BY student.student id;

1 student id

1 name

1 absences

1 1

1 Megan

1 0

1 2

1 Joseph

1 0

1 3

1 Kyle

1 1

1 4

1 Katie

1 0

1 5

1 Abby

1 1

i 6

1 Nathan

i 0

1 7

1 Liesl

1 0

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



содержащейся в таблице score. Результат этого запроса содержал идентификатор события, но не мог содержать дату получения результата теста или его тип. Теперь мы уже знаем, каким образом можно объединить таблицы score и event, чтобы получить даты и типы результатов.

mysql> SELECT

-> event.date, event.type, ->MIN(score.score) AS minimum, ->MAX(score.score) AS maximum,

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

->SUM(score.score) AS total,

->AVG(score.score) AS average,

->COUNT(score.score) AS count

->FROM score, event

->WHERE score.event = event.event

->GROUP BY event date,-

1 date 1

typel

minimum

maximum

range

total

average

1 count 1

H--y~

11999-09-031

Q (

15.1379

1 +

1 29 1

11999-09-061

Q 1

14.1667

1 30 1

11999-09-091

T 1

2425

78.2258

1 31 1

11999-09-161

Q 1

14.0370

1 27 1

11999-09-231

Q 1

14.1852

1 27 1

11999-10-011 H-+-

T 1

2325

80.1724

1 29 1 H-+

Для получения суммарных значений на основании данных из столбцов различных таблиц можно также воспользоваться афегатными функциями count () и avg (). Вот запрос, который определяет число результатов и их среднеарифметическое для всех комбинаций дат событий и пола учащихся.

mysql> SELECT event.date, student.sex,

->COUNT(score) AS count, AVG(score) AS average,

->FROM event, score, student

->WHERE event.event id = score.event

->AND score.student id = student.student id

->GROUP BY event date, student.sex;

1 date

1 sex

count

1---1-

average I

1 1999-09-03

1 F

6429 1

1 1999-09-03

1 M

6000 1

1 1999-09-06

1 F

7143 1

1 1999-09-06

1 M

6875 1

1 1999-09-09

1 F

4000 1

1 1999-09-09

1 M

0000 1

1 1999-09-16

1 F

3077 1

1 1999-09-16

1 M

8571 1

1 1999-10-01

1 F

7857 1

1 1999-09-23

1 M

4000 1

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



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

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