Автор работы: Пользователь скрыл имя, 25 Мая 2013 в 05:07, курсовая работа
Целью разработки было создание простого непроцедурного языка, которым мог воспользоваться любой пользователь, даже не имеющий навыков программирования. Собственно разработкой языка запросов занимались Дональд Чэмбэрлин (Donald D. Chamberlin) и Рэй Бойс (Ray Boyce). Пэт Селинджер (Pat Selinger) занималась разработкой стоимостного оптимизатора (англ. cost-based optimizer), Рэймонд Лори (Raymond Lorie) занимался компилятором запросов.
Введение…………………………………………………………………………5
Основная часть…………………………………………………………………..8
1.SQL……………………………………………………………………………..8
1.1 Идентификаторы языка SQL……………………………………………10
1.2 Скалярные типы данных языка SQL……………………………………10
1.3 Логические данные (тип boolean)………………………………………11
1.4 Символьные данные (тип character)…………………………………….11
1.5 Битовые данные (тип bit)………………………………………………..12
1.6 Точные числовые данные (тип exact numeric)…………………………12
1.7 Округленные числовые данные (тип approximate numeric)…………..13
1.8 Дата и время (тип datetime)…………………………………………….14
1.9 Интервальный тип данных interval…………………………………….15
2. Структура языка SQL………………………………………………………..16
2.1 Структура запросов SQL…………………………………………………17
2.2 Операторы модификации данных………………………………………..26
2.3 Транзакции в SQL…………………………………………………………34
2.4 Защита данных…………………………………………………………….34
2.5 Обработка ошибок………………………………………………………...36
3. Таблицы SQL………………………………………………………………….38
3.1 Создание баз данных……………………………………………………...39
3.2 Создание таблиц (оператор CREATE TABLE)…………………………40
3.3 Удаление таблиц (оператор DROP TABLE)……………………………42
Заключение………………………………………………………………………43
Глоссарий………………………………………………………………………..46
Список используемой литературы…………………………………………….47
Приложение А…………………………………………………………………..48
Так если требуется упорядочить результирующий набор по объему оперативной памяти в порядке убывания, можно записать:
SELECT DISTINCT speed, ram
FROM Pc
ORDER BY ram DESC
или
SELECT DISTINCT speed, ram
FROM Pc
ORDER BY 2 DESC
Результат, приведенный ниже, будет одним и тем же.
Таблица 4 – 2-й результат запроса SELECT DISTINCT speed
speed |
ram |
600 |
128 |
750 |
128 |
900 |
128 |
450 |
64 |
500 |
64 |
450 |
32 |
500 |
32 |
Сортировку можно проводить по возрастанию (параметр ASC принимается по умолчанию) или по убыванию (параметр DESC). Сортировка по двум полям:
SELECT DISTINCT speed, ram
FROM Pc
ORDER BY ram DESC, speed DESC
даст следующий результат:
Таблица 5 – 3-й результат запроса SELECT DISTINCT speed
speed |
ram |
900 |
128 |
750 |
128 |
600 |
128 |
500 |
64 |
450 |
64 |
500 |
32 |
450 |
32 |
Горизонтальную выборку
Предикаты представляют собой выражения, принимающие истинностное значение. Они могут представлять собой как одно выражение, так и любую комбинацию из неограниченного количества выражений, построенную с помощью булевых операторов AND, OR или NOT. Кроме того, в этих комбинациях может использоваться SQL-оператор IS, а также круглые скобки для конкретизации порядка выполнения операций [3, с.209].
Предикат в языке SQL может принимать одно из трех значений TRUE (истина), FALSE (ложь) или UNKNOWN (неизвестно). Исключение составляют следующие предикаты: NULL (отсутствие значения), EXISTS (существование), UNIQUE (уникальность) и MATCH (совпадение), которые не могут принимать значение UNKNOWN.
Правила комбинирования всех трех истинностных значений легче запомнить, обозначив TRUE как 1, FALSE как 0 и UNKNOWN как 1/2 (где то между истинным и ложным).
AND с двумя истинностными значениями дает минимум этих значений. Например, TRUE AND UNKNOWN будет равно UNKNOWN.
OR с двумя истинностными
Отрицание истинностного значения равно 1 минус данное истинностное значение. Например, NOT UNKNOWN будет равно UNKNOWN.
Помимо этого используются предикаты сравнения.
Предикат сравнения
Данные типа NUMERIC (числа) сравниваются в соответствии с их алгебраическим значением.
Данные типа CHARACTER STRING (символьные строки) сравниваются в соответствии с их алфавитной последовательностью. Если a1a2…an и b1b2…bn - две последовательности символов, то первая "меньше" второй, если а1<b1, или а1=b1 и а2<b2 и т.д. Считается также, что а1а2…аn<b1b2…bm, если n<m и а1а2…аn=b1b2…bn, т.е. если первая строка является префиксом второй. Например, 'folder'<'for', т.к. первые две буквы этих строк совпадают, а третья буква строки 'folder' предшествует третьей букве строки 'for'. Также справедливо неравенство 'bar' < 'barber', поскольку первая строка является префиксом второй.
Данные типа DATETIME (дата/время) сравниваются в хронологическом порядке.
Данные типа INTERVAL (временной интервал)
преобразуются в
Пример. Получить информацию о компьютерах, имеющих частоту процессора не менее 500 Мгц и цену ниже $800:
SELECT * FROM Pc
WHERE speed >= 500 AND price < 800;
Запрос возвращает следующие данные:
Таблица 6 – Пример информационного запроса
code |
model |
speed |
ram |
hd |
cd |
price |
1 |
1232 |
500 |
64 |
5 |
12x |
600.0 |
3 |
1233 |
500 |
64 |
5 |
12x |
600.0 |
7 |
1232 |
500 |
32 |
10 |
12x |
400.0 |
10 |
1260 |
500 |
32 |
10 |
12x |
350.0 |
Существуют так же и другие предикаты, например BETWEEN, IN, LIKE …
Имена столбцов, указанные в предложении SELECT, можно переименовать. Это делает результаты более читабельными, поскольку имена полей в таблицах часто сокращают с целью упрощения набора. Ключевое слово AS, используемое для переименования, согласно стандарту можно и опустить, т.к. оно неявно подразумевается.
Например, запрос:
SELECT ram AS Mb, hd Gb
FROM Pc
WHERE cd = '24x';
переименует столбец ram в Mb (мегабайты), а столбец hd в Gb (гигабайты). Этот запрос возвратит объемы оперативной памяти и жесткого диска для тех компьютеров, которые имеют 24-скоростной CD-ROM:
Таблица 7 – Пример запроса SELECT AS
Mb |
Gb |
64 |
8 |
32 |
10 |
Получение итоговых значений:
Существует возможность
Таблица 8 – Описание (агрегатных) функции
Функция |
Описание |
COUNT(*) |
Возвращает количество строк источника записей. |
COUNT() |
Возвращает количество значений в указанном столбце. |
SUM() |
Возвращает сумму значений в указанном столбце. |
AVG() |
Возвращает среднее значение в указанном столбце. |
MIN() |
Возвращает минимальное значение в указанном столбце. |
MAX() |
Возвращает максимальное значение в указанном столбце. |
Все эти функции возвращают единственное значение. При этом функции COUNT, MIN и MAX применимы к любым типам данных, в то время как SUM и AVG используются только для числовых полей. Разница между функцией COUNT(*) и COUNT() состоит в том, что вторая при подсчете не учитывает NULL-значения.
Пример. Найти минимальную и максимальную цену на персональные компьютеры:
SELECT MIN(price) AS Min_price, MAX(price) AS Max_price
FROM PC;
Результатом будет единственная строка, содержащая агрегатные значения:
Таблица 8 – Строка содержащая (агрегатные) значения
Min_price |
Max_price |
350.0 |
980.0 |
Для просмотра данных наиболее удобно использовать совместно значения оператора COUNT - счетчик (позволяет узнать количество записей в запросе), и оператора CURSOR - позволяет принимать не все записи сразу а по одной (указанной пользователем).
Язык манипуляции данными (DML - Data Manipulation Language) помимо оператора SELECT, осуществляющего извлечение информации из базы данных, включает операторы, изменяющие состояние данных. Этими операторами являются:
INSERT Добавление записей (строк) в таблицу БД
UPDATE Обновление данных в столбце таблицы БД
DELETE Удаление записей из таблицы БД
1) Оператор INSERT.
Оператор INSERT вставляет новые строки в таблицу. При этом значения столбцов могут представлять собой литеральные константы либо являться результатом выполнения подзапроса. В первом случае для вставки каждой строки используется отдельный оператор INSERT; во втором случае будет вставлено столько строк, сколько возвращается подзапросом.
Синтаксис оператора:
INSERT INTO <имя таблицы>[(<имя столбца>,...)]
{VALUES (< значение столбца>,…)}
| <выражение запроса>
| {DEFAULT VALUES};
Как видно из представленного синтаксиса, список столбцов не является обязательным. В том случае, если он отсутствует, список вставляемых значений должен быть полный, т.е. обеспечивать значения для всех столбцов таблицы. При этом порядок значений должен соответствовать порядку столбцов, заданному оператором CREATE TABLE для таблицы, в которую вставляются строки. Кроме того, каждое из этих значений должно быть того же типа (или приводиться к нему), что и тип, определенный для соответствующего столбца в операторе CREATE TABLE [3, с.248].
В качестве примера рассмотрим вставку строки в таблицу Product, созданную следующим оператором CREATE TABLE:
CREATE TABLE [dbo].[product] (
[maker] [char] (1) NOT NULL ,
[model] [varchar] (4) NOT NULL ,
[type] [varchar] (7) NOT NULL )
Пусть требуется добавить в эту таблицу модель ПК 1157 производителя B. Это можно сделать следующим оператором:
INSERT INTO Product VALUES ('B', 1157, 'PC');
Если задать список столбцов, то можно изменить "естественный" порядок их следования:
INSERT INTO Product (type, model, maker) VALUES ('PC', 1157, 'B');
Казалось бы, это совершенно излишняя возможность, которая делает конструкцию только более громоздкой. Однако она становится выигрышной, если столбцы имеют значения по умолчанию. Рассмотрим следующую структуру таблицы:
CREATE TABLE [product_D] (
[maker] [char] (1) NULL ,
[model] [varchar] (4) NULL ,
[type] [varchar] (7) NOT NULL DEFAULT 'PC' )
Отметим, что здесь значения всех столбцов имеют значения по умолчанию (первые два - NULL, а последний столбец - type - 'PC'). Теперь мы могли бы написать:
INSERT INTO Product_D (model, maker) VALUES (1157, 'B');
В этом случае отсутствующее значение при вставке строки будет заменено значением по умолчанию - 'PC'. Заметим, что если для столбца в операторе CREATE TABLE не указано значение по умолчанию и не указано ограничение NOT NULL, запрещающее использование NULL в данном столбце таблицы, то подразумевается значение по умолчанию NULL.
Возникает вопрос: а можно ли не указывать список столбцов и, тем не менее, воспользоваться значениями по умолчанию? Ответ положительный. Для этого нужно вместо явного указания значения использовать зарезервированное слово DEFAULT:
INSERT INTO Product_D VALUES ('B', 1158, DEFAULT);
Поскольку все столбцы имеют значения по умолчанию, для вставки строки со значениями по умолчанию можно было бы написать:
INSERT INTO Product_D VALUES (DEFAULT, DEFAULT, DEFAULT);
Однако для этого случая предназначена
специальная конструкция DEFAULT VALUES (смотри
синтаксис оператора), с помощью
которой вышеприведенный
INSERT INTO Product_D DEFAULT VALUES;
Заметим, что при вставке строки
в таблицу проверяются все
ограничения, наложенные на данную таблицу.
Это могут быть ограничения первичного
ключа или уникального индекса,
проверочные ограничения типа CHECK,
ограничения ссылочной
Рассмотрим теперь случай использования подзапроса. Пусть нам требуется вставить в таблицу Product_D все строки из таблицы Product, относящиеся к моделям персональных компьютеров (type = 'PC'). Поскольку необходимые нам значения уже имеются в некоторой таблице, то формирование вставляемых строк вручную, во-первых, является неэффективным, а, во-вторых, может допускать ошибки ввода. Использование подзапроса решает эти проблемы:
INSERT INTO Product_D SELECT * FROM Product WHERE type = 'PC';
Использование в подзапросе символа "*" является в данном случае оправданным, т.к. порядок следования столбцов является одинаковым для обеих таблиц. Если бы это было не так, следовало бы использовать список столбцов либо в операторе INSERT, либо в подзапросе, либо в обоих местах, который приводил бы в соответствие порядок следования столбцов.
Преодолеть ограничение на вставку одной строки в операторе INSERT при использовании VALUES позволяет искусственный прием использования подзапроса, формирующего строку с предложением UNION ALL. Так если нам требуется вставить несколько строк при помощи одного оператора INSERT, можно написать:
INSERT INTO Product_D
SELECT 'B' AS maker, 1158 AS model, 'PC' AS type
UNION ALL
SELECT 'C', 2190, 'Laptop'
UNION ALL
SELECT 'D', 3219, 'Printer';
Использование UNION ALL предпочтительней UNION даже, если гарантировано отсутствие строк-дубликатов, т.к. в этом случае не будет выполняться проверка для исключения дубликатов.
2) Оператор UPDATE.
Оператор UPDATE изменяет имеющиеся данные в таблице. Команда имеет следующий синтаксис
UPDATE
SET {имя столбца = {выражение для вычисления значения столбца
| NULL
| DEFAULT},...}
[ {WHERE }];
С помощью одного оператора могут быть заданы значения для любого количества столбцов. Однако в одном и том же операторе UPDATE можно вносить изменения в каждый столбец указанной таблицы только один раз. При отсутствии предложения WHERE будут обновлены все строки таблицы.