Структура языка SQL

Автор работы: Пользователь скрыл имя, 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

Файлы: 1 файл

Структура языка SQL.doc

— 262.00 Кб (Скачать файл)

Так если требуется упорядочить  результирующий набор по объему оперативной  памяти в порядке убывания, можно записать:

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


 

Горизонтальную выборку реализует  предложение WHERE , которое записывается после предложения FROM. При этом в результирующий набор попадут только те строки из источника записей, для каждой из которых значение предиката равно TRUE. То есть предикат проверяется для каждой записи.

Предикаты представляют собой выражения, принимающие истинностное значение. Они могут представлять собой как одно выражение, так и любую комбинацию из неограниченного количества выражений, построенную с помощью булевых операторов 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 с двумя истинностными значениями  дает максимум этих значений. Например, FALSE OR UNKNOWN будет равно UNKNOWN.

Отрицание истинностного значения равно 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 (временной интервал) преобразуются в соответствующие  типы, а затем сравниваются как  обычные числовые значения типа NUMERIC.

Пример. Получить информацию о компьютерах, имеющих частоту процессора не менее 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 - позволяет принимать не все записи сразу а по одной (указанной пользователем).

 

2.2 Операторы модификации данных

 

 

Язык манипуляции данными (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 будут обновлены все строки таблицы.

Информация о работе Структура языка SQL