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

1 ... 15 16 17 [ 18 ] 19 20 21 ... 264


SELECT score.name, event.date, score.score event.type

FROM score, event

WHERE event.date = 1999-09-23

AND score.event id = event.event id

Просто ужас! Посредством объединения (связывания) записей из таблиц score и event этот запрос производит выборку имени учащегося, дать[, оценки и типа оценки. Полученный результат выглядит следующим образом.

1 name

date 1

score

type

1 Billy

1999-09-23 i

1 Missy

1999-09-23

1 Johnny

1999-09-23 1

1 Jenny

1999-09-23 1

Заметили что-то знакомое в формате этой информации? А должны были! Это похоже на структуру таблицы, показанную на рис. 1.4! Нет необходимости знать идентификатор события для того, чтобы получить этот результат. Просто читатель описывает дату, которая его интересует, и предоставляет возможность СУБД MySQL определить, какие оценки принадлежат этой дате. Удивительно куда делась вся абстракция и связанность, присущая базе данных?

Конечно, посмотрев на все это, у вас останутся вопросы. А именно; это слишком долго и сложно; неужели нельзя быстрее узнать оценки для заданной даты? К сожалению, это так. Однако существуют способы избежать ввода нескольких строк на языке SQL каждый раз, когда надо запустить запрос. Обычно такой запрос пишется один раз и потом сохраняется в файле.

Впрочем, я, кажется, немного поторопился, показав этот запрос. Это, поверьте мне, немного проще, чем то, что мы будем использовать для получения оценок. Причиной этого является то, что настало время внести еще одну поправку в структуру таблицы. Вместо хранения имени учащегося в таблице score, будем хранить там его идентификационный номер. (Т.е. столбец name будет заменен столбцом id.) Затем будет создана новая таблица student, содержащая столбцы name и student id (рис. 1.7).

Таблица student

Таблица score

Таблица event

name

student id

Billy

Missy

Johnny

Jenny

student id

event id

event id

date

type

1999-09-03

1999-09-06

1999-09-09

1999-09-16

1999-09-23

lS99-f6-0l

Рис. 1.7. Таблицы score, event и student, связанные no идентификаторам события и учащегося



Зачем делать эти изменения? Может существовать двое учащихся с одинаковым именем. Использование уникального идентификатора учащегося позволит вам получить возможность различать их оценки. (Это абсолютно аналогично тому, как мы с помощью уникального идентификатора события сможем разделять оценки, полученные за викторину, и оценки, полученные за тесты.)

Повторим запрос после сделанного изменения структуры таблиц.

SELECT student.name, event.date, score.score event.type

FROM score, event, student

WHERE event.date = 1999-09-23

AND event.event id = score.event id

AND score.student id = student.student id

He расстраивайтесь, если вы не поняли смысл этого запроса сразу. Многие не понимают. Мы вернемся к этому запросу повторно при более углубленном изучении. Но разница между сейчас и потом заключается в том, что потом вы его поймете. Конечно, я не щучу.

Вероятно, вы заметили, что я что-то изменил в таблице student, чего не было в журнале. Теперь она содержит столбец для хранения информации о поле учащегося. Это позволит производить более простые операции, например, подсчет девочек и мальчиков в классе или более сложные, такие как сравнение суммарных оценок девочек и мальчиков.

С проектом учета успеваемости учащихся мы почти закончили. Нам осталась еще одна таблица, предназначенная для фиксации посещаемости. Ее содержимое относительно несложно: идентификационный номер учащегося и дата (рис. 1.8). Каждая строка в таблице свидетельствует о том, что определенный учащийся отсутствовал в определенный день. В конце этой главы мы обратимся к вычислительным возможностям СУБД MySQL для того, чтобы узнать, сколько раз учащийся отсутствовал.

Таблица absence

student id

date

1999-09-02

1999-09-15

1999-09-20

Рис. 1.8. Таблица absence

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

Оператор create table, предназначенный для создания таблицы student, имеет следующий вид.

CREATE TABLE student (

name VARCHAR(20) NOT NULL, sex ENUM{F,M) NOT NULL,

Student id INT UNSIGNED NOT NULL AUTO INCREMENT PRIMARY KEY



Введите этот оператор, работая в mysql, или запустите из оболочки следующую команду:

% mysqi samp db < create student.sql

После этого оператор CREATE TABLE создаст таблицу student с тремя столбцами: name, sex и student id.

Столбец name является столбцом переменной длины, которая может хранить до 20 символов. Это представление имени проще, чем в случае с таблицами Исторической Лиги : один столбец используется для хранения имени и фамилии. Это потому, что я знаю наперед, что ни в одном примере запроса для базы данных контроля успеваемости не потребуется раздельная выборка имени и фамилии.

Столбец sex отражает пол учащегося. Это столбец перечисляемого типа enum, а это значит, что он может принимать одно из двух значений: F или м . Этот тип столбца полезен тогда, когда столбец принимает значения только из ограниченного диапазона. В этом случае можно использовать тип CHAR(l), но enum будет явно определять, какие значения может принимать столбец. Оператор describe tbl name для такой таблицы покажет, какие точно значения может принимать этот столбец.

Столбец student id является столбцом целого типа, в котором будет храниться уникальный идентификационный номер учащегося. Обычно идентификационные номера можно получить из какого-то центрального источника, такого как учительская. Объявление типа столбца student id состоит из нескольких частей.

ш int. Свидетельствует о том, что столбец содержит целые величины (значения не имеют дробной части).

unsigned. Принимает только положительные значения.

not null. Означает, что столбец должен быть всегда заполнен. (Учащийся не может не иметь идентификационного номера.)

auto increment. Это специальный атрибут СУБД MySQL. Он работает следующим образом. Если во время добавления новой записи значение для столбца student отсутствует (или пустое), СУБД MySQL автоматически создает уникальный номер, который больще максимального значения для этого столбца на единицу. Этот факт будет использован нами при загрузке таблицы student. Будем заполнять только значения для столбцов name и sex. СУБД MySQL сама сгенерирует для нас значения столбца student id.

primary key. Означает, что столбец является индексом и каждое значение должно быть уникальным. Он поможет нам избежать повторного использования одного и того же идентификатора по ошибке. (СУБД MySQL требует, чтобы всякий столбец с атрибутом auto iNCREMENT имел уникальный индекс.) Проще говоря, можно рассматривать ключи auto increment и primary key как



1 ... 15 16 17 [ 18 ] 19 20 21 ... 264

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