Скачиваний:
180
Добавлен:
02.05.2014
Размер:
2.66 Mб
Скачать

4.2. Обзор языка sql

В языке SQL имеются операции как определения данных, так и манипулирования ими. Сначала мы познакомимся с операциями определения данных. На рис. 4.1 показано, как с помощью средств языка SQL определяется база данных поставщиков и деталей (ср. с рис. 3.9 в главе 3). Как можно видеть, определение включает один оператор CREATE TABLE для каждой базовой таблицы (как указывалось в главе 3, ключевое слово TABLE в операторе CREATE TABLE обозначает именно базовую таблицу). Каждый оператор CREATE TABLE задает имя создаваемой базовой таблицы, имена и типы данных столбцов этой таблицы, а также первичный ключ таблицы и любые внешние ключи, присутствующие в ней (кроме того, может быть указана другая дополнительная информация, которая не показана на рис. 4.1). Приведем еще пару замечаний по синтаксису.

■ Обратите внимание, что символ "I", который мы часто используем в именах столбцов, на самом деле в стандарте SQL/92 недопустим. '

В качестве признака конца оператора мы здесь используем символ хотя соглас- но стандарту SQL/92 выбор используемого для этой цели символа зависит от реали- зации. Детальное рассмотрение данного вопроса выходит за рамки этой книги.

CREATE TABLE S

( Si CHAR(5),

SNAME CHAR(20), STATUS NUMERIC(5), CITY CHAR(15), PRIMARY KEY ( Si ) ) ;

CREATE TABLE P

( Pi CHAR(6),

PNAME CHAR(20), COLOR CHAR(6), WEIGHT NUMERIC(5,1), CITY CHAR(15), PRIMARY KEY ( Pi ) ) ;

CREATE TABLE SP

( Si CHAR(5),

Pi CHAR(6),

QTY NUMERIC(9), PRIMARY KEY ( Si, Pi ), FOREIGN KEY ( Si ) REFERENCES S, FOREIGN KEY ( Pi ) REFERENCES P )

Рис. 4.1. Определение базы данных поставщиков и деталей средствами языка SQL

Одно из важных отличий между рис. 4.1 и его аналогом (рис. 3.9) в главе 3 состоит в том, что на рис. 4.1 нет ничего, соответствующего определениям типов (т.е. операторов TYPE). И причина этого, конечно, заключается в следующем: в языке SQL пользователю не разрешается определять собственные типы2. Поэтому для определения столбцов мож- но использовать только встроенные (определенные системой) типы. В языке SQL под- держиваются следующие встроенные типы, которые фактически не требуют дополни- тельных разъяснений.

CHARACTER [ VARYING ] (л) INTEGER DATE

BIT [ VARYING ] (л) SMALLINT TIME

NUMERIC (p,g) FLOAT (p) TIMESTAMP

2 В языке SQL/92 разрешается определять собственные типы для так называемых доменов, однако эти "домены " на самом деле — не домены (т.е. типы) в реляционном смысле (см. подроб- ности приводятся в главе 5). Замечание. Определяемые пользователем типы данных поддержи- ваются стандартом SQL3 (приложение Б).

DECIMAL (p,g) INTERVAL

В языке SQL поддерживается множество значений, принимаемых по умолчанию, со- кращений и альтернативных написаний. Например, существует сокращение CHAR для опре- делителя CHARACTER. Квадратные скобки "[" и "]" в принятой нотации используются для указания необязательных элементов (например, CHARACTER или BIT), при отсутствии кото- рых будут использованы значения по умолчанию. (Это правило обычно подразумевается при описании в форме Бэкуса-Наура, сокращенно — BNF). И наконец, отметим, что в язы- ке SQL требуется указывать конкретную длину или точность для определенных типов (например, CHAR) в отличие от нашего гипотетического синтаксиса, использовавшегося в главе 3. Очевидно, что язык SQL рассматривает эти длины и спецификаторы точности как часть определения типа (подразумевая, например, что значения CHAR(3) и CHAR(4) задают разные типы). Однако мы считаем, что лучше расценивать их (длины и точности) как огра- ничения целостности (что мы и делаем, в частности, в главе 8, упр. 8.4).

Выборка (RESTRICT): Результат: SELECT S#, Р#, QTY FROM SP

WHERE QTY < 150 ;

Проекция (PROJECT): Результат: SELECT S#, CITY FROM S ;

Определив базу данных, можно начинать выполнять в ней различные операции, зада- ваемые с помощью операторов манипулирования данными языка SQL: SELECT, INSERT, UPDATE и DELETE. В частности, можно выполнять с данными реляционные операции выбор- ки, проекции и соединения, причем во всех этих случаях следует использовать один и тот же оператор манипулирования данными языка SQL SELECT. На рис. 4.2 показаны примеры операций выборки проекции и соединения, сформулированные на языке SQL.

s#

P#

QTY

SI S2

P5 P6

100 100

S#

CITY

SI

London

S2

Paris

S3

Paris

S4

London

S5

Athens

Соединение (JOIN):

SELECT S.S#, SNAME, STATUS, CITY, P#, QTY

FROM S, SP

WHERE S.S# = SP.S# ;

s#

SNAME

STATUS

CITY

P#

QTY

SI

Smith

20

London

PI

300

SI

Smith

20

London

P2

200

SI

Smith

20

London

P3

400

S4

Clark

20

London

P5

400

Рис. 4.2. Примеры выполнения операций выборки, проекции и соединения на языке SGL 122 Часть I. Основные понятия

Замечание. Пример операции соединения на этом рисунке подтверждает, что в языке SQL иногда необходимо использовать уточненные имена (например, S.St, SP.St), по- зволяющие устранить неоднозначность при указании столбцов. Согласно общему прави- лу уточненные имена допустимы всегда, а неуточненные имена допустимы, только если при этом не возникает неоднозначности.

Отметим, что в языке SQL поддерживается сокращенная форма предложения SELECT, как показано в следующем примере.

SELECT * — или SELECT S.* (т.е. символ "*" может быть уточнен) FROM S ;

В результате выполнения этого запроса будет получена копия всей таблицы S. Символ "*" — это сокращение для списка разделенных запятыми имен всех столбцов таблицы, ука- занной в предложении FROM. Имена столбцов перечисляются слева направо в том порядке, в котором они определены в этой таблице. Кстати, обратите внимание на комментарий, ко- торый начинается двумя дефисами и заканчивается символом новой строки.

Замечание. Выражение SELECT * FROM Т, где Т— это имя таблицы, может быть со- кращено до простого выражения TABLE Т.

Значительно подробнее оператор SELECT обсуждается в главе 7 (раздел 7.7).

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

INSERT

INTO TEMP ( Pt, WEIGTH ) SELECT Pt, WEIGTH FROM P

WHERE COLOR = 'Red' ;

В этом примере подразумевается, что предварительно создана другая таблица TEMP с двумя столбцами: Pt и WEIGTH. Оператор INSERT вставляет в нее номера деталей и соот- ветствующие веса всех деталей с цветом 'Red' (красный).

UPDATE S

SET STATUS = STATUS * 2 WHERE CITY = 'Paris' ;

Приведенный выше оператор UPDATE удваивает статус всех поставщиков в Париже.

DELETE

FROM SP

WHERE Pt = 'P2' ;

Этот оператор DELETE удаляет из таблицы SP все строки с информацией о детали с номером 'Р2'.

Замечание. В язык SQL не включен прямой аналог операции реляционного при- своения. Но можно имитировать эту операцию, сначала удалив все строки из целевой таблицы, а затем выполнив для нее операции INSERT ... SELECT ... (как это сделано вы- ше, в первом примере).

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]