Скачиваний:
54
Добавлен:
01.04.2014
Размер:
657.92 Кб
Скачать

3.8. Язык sql

Большинство современных реляционных продуктов поддерживает один из диалектов стандартного языка SQL. Этот язык был разработан в компании IBM Research в нача­ле 1970-х годов, его впервой крупной реализацией был реляционный прототип IBM-продукта System R; впоследствии он был реализован в многочисленных коммер­ческих продуктах как компании IBM, так и других изготовителей. С того времени диалекты языка SQL стали Американским национальным стандартом (ANSI), Меж­дународным стандартом (ISO), стандартом системы UNIX (X/Open), стандартом кор­порации IBM, описывающим "общий интерфейс базы данных", который является ча­стью архитектуры системных приложений IBM (System Applications Architecture, со­кращенно SAA), федеральным стандартом обработки информации (FIPS). В этом разделе кратко рассматривается язык SQL.

CREATE TABLE DEPT

( DEPT# CHAR(2),

DNAME CHAR(20),

BUDGET DECIMAL(7), PRIMARY KEY ( DEPT# ) )

CREATE TABLE EMP

( EMP# CHAR(2),

ENAME CHAR(20),

DEPT# CHAR(2),

SALARY DECIMAL(5),

PRIMARY KEY ( EMP# ),

FOREIGN KEY ( DEPT# ) REFERENCES DEPT )

Рис. 3.6. База данных отделов и служащих (определение данных SQL)

Язык SQL используется для описания реляционных операций (т.е. операций, ко­торые определяют и обрабатывают данные в реляционной форме). Мы рассматрива­ем операции определения впервые. На рис. 3.6 показано, как определяется база дан­ных отделы-служащие (см. рис. 3.1) с помощью операций определения данных SQL.

Как видим, определение включает один оператор CREATE TABLE для каждой таблицы. Как уже упоминалось, оператор CREATE TABLE является примером операции определения данных SQL. Каждый оператор CREATE TABLE опреде­ляет имя создаваемой таблицы, имена и типы данных столбцов этой таблицы, а также первичный ключ и любые внешние ключи в таблице (некоторая возможная дополнительная информация не показана на рис. 3.6). Если вам необходимо ос­вежить в памяти информацию о первичных и внешних ключах, просмотрите этот материал выше в данной главе.

Создав таблицы, можно начинать применение операций к этим таблицам с помо­щью средств обработки данных SQL, т.е. операций SELECT, INSERT, UPDATE и DELETE. В частности, можно выполнить реляционные операции с данными SELECT, PROJECT и JOIN и во всех случаях использовать оператор обработки данных SQL SELECT. На рис. 3.7 показаны примеры операций SELECT, PROJECT и JOIN (см. рис. 3.2), сформулированные на языке SQL.

SELECT ( RESTRICT )

SELECT DEPT#, DNAME, BUDGET

FROM DEPT

WHERE BUDGET > 8M

Результат:

DEPT#

DNAME

BUDGET

D1

D2

Marketing

Development

10M

12M

PROJECT

SELECT DEPT#, BUDGET

FROM DEPT;

Результат:

DEPT#

BUDGET

D1

D2

D3

10M

12M

5M

JOIN

SELECT DEPT.DEPT#, DNAME, BUDGET, EMP#, ENAME, SALARY

FROM DEPT, EMP

WHERE DEPT.DEPT# = EMP.DEPT#;

Результат:

DEPT#

DNAME

BUDGET

EMP#

ENAME

SALARY

D1

D1

D2

D2

Marketing

Marketing

Development

Development

10M

10M

12M

12M

E1

E2

E3

E4

Lopez

Cheng

Finzi

Saito

40K

42K

30K

35K

Рис. 3.7. Примеры операций SELECT, PROJECT и JOIN на языке SQL

Замечание. Пример операции соединения на этом рисунке иллюстрирует исполь­зование точки, которая иногда необходима в уточненных именах SQL для "устранения неоднозначности" ссылок на столбцы. Если бы использовались неуточ­ненные имена, т.е. предложение WHERE было бы записано в виде "WHERE DEPT# = DEPT#", то две ссылки DEPT# порождали бы неоднозначность, т.е. было бы неясно, к какому случаю относится ссылка — к DEPT.DEPT# или к EMP.DEPT#.

Вы, наверное, заметили, что оператор SELECT языка SQL и операция SELECT реляционной модели — это не одно и то же!

Действительно, язык SQL поддерживает все три реляционные операции— SELECT, PROJECT и JOIN (и даже больше)— в операторе SELECT. Поэтому RESTRICT в качестве имени реляционной операции предпочтительнее имени SELECT, поскольку ссылка к двум разным операциям с помощью разных имен уменьшает вероятность перепутать их. (На самом деле, первоначальным именем ре­ляционной операции было имя RESTRICT (ограничение); более того, интуитивно это имя лучше, так как операция предназначена для ограничения, например, множества отделов теми, бюджет которых превышает 8 млн.)

Завершаем это краткое обсуждение языка SQL несколькими наблюдениями.

1. Операции обновления. Примеры таких операций языка SQL, как INSERT, UPDATE и DELETE, уже приводились в главе 1. Однако все примеры этой главы использовали операции для отдельных строк. Тем не менее, как и операция SELECT, операции INSERT, UPDATE и DELETE обрабатывают данные на уровне множества (некоторые упражнения и ответы в главе 1 действительно демонстри­ровали эту возможность). Вот несколько примеров обновления на уровне множе­ства для базы данных отделов и служащих:

INSERT

INTO TEMP ( ЁМР# )

SELECT ЕМР#

FROM EMP

WHERE DEPT# = 'Dl' ;

В этом примере подразумевается, что предварительно уже создана другая таблица TEMP с одним столбцом ЕМР#. Оператор INSERT вставляет в эту таблицу номера для всех служащих отдела Dl.

UPDATE EMP

SET SALARY = SALARY * 1.1

WHERE DEPT# = 'Dl' ;

Оператор UPDATE обновляет базу данных с учетом того факта, что всем сотруд­никам отдела Dl на 10% была повышена зарплата.

DELETE

FROM EMP

WHERE DEPT# = 'D2' ;

Оператор DELETE удаляет все строки таблицы EMP для служащих отдела D2.

2. Каталог. Стандарт SQL включает спецификации для стандартного каталога, кото­рый называется информационной схемой (подробности в главе 8). Однако во вре­мя написания книги немногие продукты, если они действительно были, могли реализовать информационную схему.

3. Представления. Ниже приведены аналоги SQL-оператора CREATE VIEW для представления TOPEMPS и пример запроса для сравнения с таким же представле­нием, приведенным выше в этой главе.

CREATE VIEW TOPEMPS AS

SELECT EMP#, ENAME, SALARY

FROM EMP

WHERE SALARY > 33K ;

SELECT EMP#, SALARY

FROM TOPEMPS

WHERE SALARY < 42K ;

4. Средства вызова. В большинстве продуктов SQL возможно выполнять операторы SQL двумя способами: "непосредственно", т.е. интерактивно с активного терми­нала, и как часть прикладной программы (т.е. оператор SQL может быть "встроен", а это означает, что такой оператор находится в программе вместе с операторами языка программирования). Кроме того, во втором случае программа обычно пишется на одном из базовых языков (С, COBOL, Pascal, PL/I и т.п.).

5. SQL не идеален. В этой книге приводится множество примеров SQL, поскольку этот язык является стандартом реляционного языка, очень широко используется и внедряется. Но необходимо подчеркнуть, что язык SQL весьма далек от того, что­бы быть совершенным реляционным языком. Он страдает многочисленными не­достатками, связанными с недоработками и реализацией. В главе 8 будет продол­жено обсуждение языка SQL.

Соседние файлы в папке Дейтл Введ в БД