Компоненты SQL
Обратите внимание, что в некоторых столбцах табл. 3.1 имеется ограничение NOT NULL (не может быть неопределенным значением). Эти столбцы являются или первичными ключами соответствующих таблиц, или вы решили, что есть другие причины, по которым их значения обязательно должны быть определенными. Первичный ключ таблицы должен однозначно идентифицировать каждую ее строку. Значение этого ключа в каждой строке должно быть определенным. (Подробно о ключах говорится в главе 5.)
Таблицы связываются друг с другом посредством общих столбцов. Ниже описаны связи между таблицами. (Отношения таблиц представлены на рис. 3.3.)
- Таблицу CUSTOMER связывает с другой таблицей, INVOICE, отношение "один ко многим". Один клиент может сделать множество покупок, в результате чего получится множество счетов-фактур. Однако каждый счет-фактура имеет отношение к одному и только одному клиенту.
- Таблицу INVOICE связывает с таблицей INVOICE_LINE также отношение "один ко многим". Ведь в счете-фактуре может быть множество строк, но каждая строка находится в одном и только одном счете-фактуре.
- Таблицу PRODUCT с таблицей INVOICE_LINE связывает отношение "один ко многим". Каждый товар может быть во множестве строк в одном или многих счетах-фактурах. Однако каждая строка относится к одному и только одному товару.
Рис. 3.3. Структура базы данных магазина спорттоваров
Таблица CUSTOMER поддерживает отношение с таблицей INVOICE, используя их общий столбец CustomerlD. А отношение таблицы INVOICE с таблицей INVOICE_LINE поддерживается с помощью общего столбца InvoiceNumber. Отношение же таблицы PRODUCT с таблицей INVOICE_LINE поддерживается с помощью общего столбца ProductDD. В сущности эти отношения и делают саму базу реляционной, т.е. работающей на основе отношений.
Чтобы получить информацию о тех клиентах, которые купили лыжное оборудование, необходимы данные из следующих полей: FirstName, LastName, Street, City, State и Zipcode из таблицы CUSTOMER; Category – из таблицы PRODUCT; InvoiceNumber – из таблицы INVOICE, а также LineNumber– из таблицы INVOICE_LINE. Нужное представление можно создавать поэтапно, используя для этого следующие команды:
CREATE VIEW SKI_CUST1 AS SELECT FirstName, LastName, Street, City, State, Zipcode, InvoiceNumber FROM CUSTOMER JOIN INVOICE USING (CUSTOMER_ID); CREATE VIEW SKI_CUST2 AS SELECT FirstName, LastName, Street, City, State, Zipcode, ProductID FROM SKI_CUST1 JOIN INVOICE_LINE USING (InvoiceNumber); CREATE VIEW SKI_CUST3 AS SELECT FirstName, LastName, Street, City, State, Zipcode, Category FROM SKI_CUST2 JOIN PRODUCT USING (ProductID); CREATE VIEW SKI_CUST AS SELECT DISTINCT FirstName, LastName, Street, City, State, Zipcode FROM SKI_CUST3 WHERE CATEGORY = 'Ski';