Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Умк_Базы.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
3.2 Mб
Скачать

Приложение 1. Определение данных в sql.

Создание таблиц –CREATE TABLE

Чтобы из таблицы извлекать данные, необходимо ее существование в базе данных; базовое отношение создается с помощью оператора CREATE TABLE. Синтаксис этого оператора имеет вид:

CREATE TABLE таблица

(столбец1 тип1 [(размер1)]

[,...])

В этом операторе следует указать имя поля, тип данных для него, длину (для некоторых типов данных). Например, создадим таблицу Заказ с полями: номер_заказа, ФИО_исполнителя, сумма_заказа, где номер_заказа – первичный ключ:

CREATE TABLE Заказ

(номер_заказа Integer(6) NOT NULL PRYMARY KEY,

ФИО_исполнителя CHAR (20),

Сумма_заказа Integer(4)

)

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

Оператор ALTER TABLE

Этот оператор предназначен для изменения структуры существующей таблицы; применяя его можно удалить или добавит поле к существующей таблице:

1. добавление поля

ALTER TABLE таблица ADD [COLUMN] столбец тип столбца

[(размер)]

2. удаление поля

ALTER TABLE таблица DROP [COLUMN] столбец

[(размер)]

Дополнительные ограничения

Для того чтобы указать, что данное поле должно иметь определенное значение в каждой строке таблицы, необходимо указывать ограничение NOT NULL. Это ограничение можно накладывать на любой столбец таблицы, если необходимо запретить задание неопределенных значений.

Для указания того факта, что атрибут является первичным ключом, указывается ограничение PRIMARY KEY; данное ограничение не прикрепляется к отдельному столбцу, а относится ко всей таблице в целом. Первичный ключ может распространяться более чем на один атрибут таблицы, тогда ограничения налагаются следующим образом:

CREATE TABLE Заказ

(номер_товара NOT NULL ,

цена NOT NULL,

PRYMARY KEY (номер_товара, цена)

Существует ограничение на уникальность атрибутов, не являющихся первичным ключом отношения – UNIQUE. Это ограничение можно использовать, если есть необходимость определить потенциальные ключи отношения.

Для реляционной модели данных существенным является указания внешнего ключа. При объявлении внешних ключей необходимо наложить соответствующие ограничения на столбец. Например, в таблице Счета клиентов существует два внешних ключа «номер_счета» и «номер_клиента». Они задаются следующим образом:

CREATE TABLE Счета_клиентов

(номер_счета NOT NULL REFERENCES Счет,

номер_клиента NOT NULL RFERENCES Клиент,

PRYMARY KEY (номер_счета, номер_клиента)

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

CREATE TABLE Товар

(номер_товара INTEGER (5) NOT NULL PRIMARY KEY,

категория_товара CHAR (1)

CHECK (категория_товара = ‘A’ OR категория_товара=’D’

);

При таком задании ограничения атрибута «категория_товара» любая попытка ввести значения, отличные от ‘А’ и ‘D’ будет отклонена.

Выбор данных.

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

SELECT столбцы (или *)

FROM отношение (я)

[WHERE ограничение(я)]

[ORDER BY столбец];

Операторы SELECT должны содержать слова SELECT и FROM. Другие ключевые слова, такие как WHERE или ORDER, являются необязательными.

За ключевым словом SELECT следуют сведения о том, какие именно поля необходимо включить в результирующий набор данных. Звездочка (*) означает, что в набор данных попадают все поля таблицы. Если выбор данных осуществляется из нескольких таблиц одновременно, и при этом выбираются одноименные поля, необходимо указывать на имена таблиц для полной идентификации полей, включаемых в результирующий набор данных.

SELECT Поставщики.наименование_компании, Клиенты.наименование компании

Предложение FROM

Для указания имен таблиц, из которых выбираются записи, применяется ключевое слово FROM, например:

SELECT *

FROM Поставщики.

Этот запрос возвратит все поля из таблицы Поставщики.

Предложение WHERE

Для фильтрации результатов, возвращаемых оператором SELECT, можно использовать предложение WHERE, синтаксис которого имеет вид:

WHERE выражение1 [{AND êOR} выражение 2 […] ].

В предложении WHERE можно использовать различные выражения:

SELECT *

FROM Поставщики

WHERE Адрес_город= «Москва» AND Дата_договора =1998

или

SELECT наименование, цена

FROM Товар

WHERE скидка IS NOT NULL

Выражение IS NOT NULL означает, что соответствующая колонка результирующего набора данных не должна иметь пустых значений. В предложении WHERE могут использоваться как простые, так и специальные операторы сравнения (см. таблицу 1.5).

Операторы сравнения. Таблица 1.5.

Оператор

Описание

>,<,=, <=,>=,<>

Больше, меньше, меньше или равно, больше или равно, не равно

ALL

Применяется совместно с операторами сравнения при сравнении со списком значений

BETWEEN

Применяется при поверке нахождения значения внутри заданного интервала (включая границы)

IN

Применяется для проверки значения в списке

LIKE

Применяется при проверке соответствия значений заданной маске

Примеры применения вышеуказанных операторов:

SELECT наименование, цена

FROM Товар

WHERE наименование BETWEEN ‘К ‘AND ‘Н’

Выбирает наименование товара, начинающегося с букв от К до Н.

SELECT наименование, цена

FROM Товар

WHERE наименование_производителя LIKE ‘%гидро%’

Выбирает наименование товара, в названии производителя которого содержится подстрока «гидро».

Предложение ORDER BY (сортировка)

Это предложение является необязательным и применяется для сортировки результирующего набора данных по одной ил нескольким колонкам. Для определения направления сортировки используются ключевые слова ASC (по возрастанию) или DESC (по убыванию). По умолчанию сортировки производится по возрастанию.

Синтаксис предложения имеет вид:

ORDER BY столбец 1 [{ASC êDESC}] [,столбец2 [{ASC êDESC}] [,..]

SELECT наименование, цена

FROM Товар

WHERE наименование BETWEEN ‘К ‘AND ‘Н’

ORDER BY цена

Связывание таблиц

При помощи операторов языка SQL можно извлекать данные более чем из одной таблицы. Одна из возможностей сделать это заключается в связывании таблиц по одному общему полю. Однако даже без связывания таблиц в результате оператора получится набор данных, содержащий все возможные комбинации строк каждой из исходных таблиц (декартово произведение):

SELECT наименование_продукта, категория_продукта

FROM Продукт, Категория

Запрос, показанный ниже, указывает, какой категории принадлежит данный продукт:

SELECT наименование_продукта, категория_продукта

FROM Продукт, Категория

WHERE Продукт.категория_номер=Категория.категория_номер

Присутствующее в операторе ограничение указывает, что из связываемых таблиц извлекаются только те строки, в которых атрибуты «номер» имеют одинаковое значение. Название столбца указывается только вместе с названием таблицы; в противном случае оператор будет неоднозначным.

Можно использовать другие типы связывания таблиц: оператор INNER JOIN (внутреннее соединение) обеспечивает присутствие в результирующем наборе записей, значения в связанных полях которых совпадают. Внешние соединения (OUTER JOIN) позволяют включить в результат запроса все строки из одной таблицы и соответствующие им строки из другой, например:

SELECT наименование_продукта, категория_продукта

FROM Продукт LEFT OUTER JOIN Категория

WHERE Продукт.категория_номер=Категория.категория_номер

Предложения GROUP BY

Для вычисления суммарных значений на основе данных одной или нескольких таблиц можно использовать предложение GROUP BY, имеющее следующий синтаксис:

GROUP BY {столбец1} [,..]

В этом случае результаты, возвращенные функцией, будут сгруппированы по одинаковым значениям атрибута группировки. Можно использовать как агрегатные функции, так и строковые математические функции для проведения операций группировки данных. Так, сумму баллов, полученных абитуриентом на экзамене можно получить с помощью следующего запроса:

SELECT DISTINCTROW Оценки. номер абитуриента, Sum(Оценки. полученный балл) AS Sum_Полученный балл

FROM Оценки

GROUP BY Оценки.номер абитуриента;

Предложение GROUP BY сообщает системе, что надо разбить заданное отношение на группы кортежей с одинаковыми значениями атрибута «номер абитуриента». В результате для каждой группы будет возвращена строка, представляющая суммарный балл с определенным значением номера абитуриента. В первой строке необходимо указывать атрибут, по которому будет производиться группировка. При использовании функций не разрешается (!) в верхней строке оператора (в предложении SELECT) указывать имена атрибутов, не входящих в предложение GROUP BY. В одном операторе можно указывать несколько функций.

На создаваемые подгруппы можно накладывать ограничения с помощью предложения HAVING. в следующем примере оператор возвратит только строки, у которых суммарный балл больше 12.

SELECT DISTINCTROW Оценки. номер абитуриента, Sum(Оценки. полученный балл) AS Sum_Полученный балл

FROM Оценки

GROUP BY Оценки.номер абитуриента;

HAVING Sum (Оценки.полученный балл) > 12

Ключевые слова ALL и DISTINCT

Эти ключевые слова управляют выводом дублирующих строк результирующего набора записей. Ключевое слово DISTINCT указывает, что строки результирующего набора должны быть уникальны, в то время как ключевое слово ALL указывает, что возвращать необходимо все строки.

Вложенные последовательности запросов.

В SQL можно создавать вложенные последовательности запросов. Например, в результате выполнения следующего запроса будут перечислены все номера клиентов, имеющих счета в филиале «Бауманский»:

SELECT номер_клиента

FROM Счета_клиентов

WHERE номер_счета IN

(SELECT номер_счета

FROM Счета

WHERE филиал= «Бауманский»)

В данном случае подзапрос возвращает множество кортежей, состоящих из номеров_счетов отношения Счета, которые обрабатывает филиал «Бауманский». Он вложен во внешний запрос, который сравнивает номера-счетов каждого кортежа отношения Счета_клиентов с возвращенным внутренним запросом множеством номеров счетов. Если рассматриваемый номер счета есть в указанном множестве, будет возвращен номер_клиента этого кортежа. Для проверки принадлежности к множеству используется оператор IN.

Существуют определенные типы запросов, которые лучше реализовывать с помощью подзапросов; преимущественно это так называемые проверки существования. Предположим, что требуется получить данные о клиентах, которые не имеют счетов. Можно создать следующий запрос с вложенным подзапросом:

SELECT *

FROM Клиенты

WHERE номер_клиента NOT IN

(SELECT номер_клиента

FROM Клиенты_счета)

Если будет возвращено пустое множество, то это означает лишь одно – у каждого клиента есть, по крайней мере, один счет.