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

Автор работы: Пользователь скрыл имя, 19 Ноября 2013 в 00:35, курсовая работа

Краткое описание

При написании данной работы была рассмотрена структура языка SQL, а так же одна из большинства групп операторов SQL. При рассмотрении были, по возможности, приведены примеры для баз данных. Показаны: область применения и основные функции языка.
SQL является непроцедурным языком, построенным на использовании обычных английских слов (таких как SELECT, INSERT, DELETE). Он может применяться как профессионалами, так и рядовыми пользователями. Этот язык формально и фактически стал стандартным языком определения и манипулирования реляционными базами данных.

Содержание

ВВЕДЕНИЕ 3
ОСНОВНАЯ ЧАСТЬ 6
1 ЯЗЫК SQL - ОСНОВНЫЕ ФУНКЦИИ И ВОЗМОЖНОСТИ 6
1.1 ИСТОРИЯ ЯЗЫКА SQL 6
1.2 СТАНДАРТИЗАЦИЯ УПРАВЛЕНИЯ И ОБМЕНА ДАННЫМИ 9
2 СТРУКТУРА ЯЗЫКА SQL 14
2.1 ТАБЛИЦЫ SQL 14
2.2 СТРУКТУРА ЗАПРОСОВ SQL 15
2.3 ОПЕРАТОРЫ SQL 21
2.4 ТРАНЗАКЦИИ В SQL 27
ЗАКЛЮЧЕНИЕ 29
ГЛОССАРИЙ 31
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 33

Вложенные файлы: 1 файл

Базы данных .docx

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

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

Существуют  так же и другие предикаты, например BETWEEN, IN, LIKE.

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

Например, запрос:

SELECT ram AS Mb, hd Gb

FROM Pc

WHERE cd = '24x';

переименует столбец ram в Mb (мегабайты), а столбец hd в Gb (гигабайты). Этот запрос возвратит объемы оперативной памяти и жесткого диска для тех компьютеров, которые имеют 24-скоростной CD-ROM.

Получение итоговых значений:

Существует возможность получения  итоговых (агрегатных) функций. Стандартом предусмотрены следующие агрегатные функции:

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;

Результатом будет единственная строка, содержащая агрегатные значения.

Для просмотра данных наиболее удобно использовать совместно значения оператора COUNT - счетчик (позволяет узнать количество записей в запросе), и  оператора CURSOR - позволяет принимать  не все записи сразу а по одной (указанной пользователем).

2.3 Операторы SQL

Язык манипуляции данными (DML - Data Manipulation Language) помимо оператора SELECT, осуществляющего извлечение информации из базы данных, включает операторы, изменяющие состояние данных. Этими операторами являются:

INSERT - авление записей (строк) в таблицу БД

UPDATE - Обновление данных в столбце  таблицы БД

DELETE - Удаление записей из таблицы  БД

1) Оператор INSERT.

Оператор INSERT вставляет новые строки в таблицу. При этом значения столбцов могут представлять собой литеральные  константы либо являться результатом  выполнения подзапроса. В первом случае для вставки каждой строки используется отдельный оператор INSERT; во втором случае будет вставлено столько строк, сколько возвращается подзапросом.

Синтаксис оператора:

INSERT INTO <имя таблицы>[(<имя столбца>,...)]

{VALUES (< значение столбца>,…)}

| <выражение запроса>

| {DEFAULT VALUES};

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

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

Если столбец допускает NULL-значение, то его можно указать в явном  виде. Кроме того, можно заменить имеющееся значение на значение по умолчанию (DEFAULT) для данного столбца.

Ссылка на "выражение" может  относиться к текущим значениям  в изменяемой таблице. Например, мы можем уменьшить все цены ПК-блокнотов  на 10 процентов с помощью следующего оператора:

UPDATE Laptop SET price=price*0.9

Разрешается также значения одних  столбцов присваивать другим столбцам. Пусть, например, требуется заменить жесткие диски менее 10 Гб в ПК-блокнотах. При этом емкость новых дисков должна составлять половину объема RAM, имеющейся в данных устройствах. Эту задачу можно решить следующим образом:

UPDATE Laptop SET hd=ram/2 WHERE hd

Естественно, типы данных столбцов hd и ram должны быть совместимы. Для приведения типов может использоваться выражение cast.

Если требуется изменять данные в зависимости от содержимого  некоторого столбца, можно воспользоваться  выражением case.

Если, скажем, нужно поставить жесткие  диски объемом 20 Гб на ПК-блокноты с  памятью менее 128 Мб и 40 гигабайтные - на остальные ПК-блокноты, то можно  написать такой запрос:

UPDATE Laptop

SET hd = CASE WHEN ram<128 THEN 20 ELSE 40 END

Для вычисления значений столбцов допускается  также использование подзапросов. Например, требуется укомплектовать все ПК-блокноты самыми быстрыми процессорами из имеющихся. Тогда можно написать:

UPDATE Laptop

SET speed = (SELECT MAX(speed) FROM Laptop)

Необходимо сказать несколько  слов об автоинкрементируемых столбцах. Если столбец code в таблице Laptop определен как IDENTITY(1,1), то поступают следующим образом. Сначала необходимо вставить нужную строку, используя SET IDENTITY_INSERT, после чего удалить старую строку:

SET IDENTITY_INSERT Laptop ON

INSERT INTO Laptop_ID(code, model, speed, ram, hd, price, screen)

SELECT 5, model, speed, ram, hd, price, screen

FROM Laptop_ID WHERE code=4

DELETE FROM Laptop_ID WHERE code=4

Разумеется, другой строки со значением  code=5 в таблице быть не должно.

В Transact-SQL оператор UPDATE расширяет стандарт за счет использования необязательного предложения FROM. В этом предложении специфицируется таблица, обеспечивающая критерий для операции обновления. Дополнительную гибкость здесь дает использование операций соединения таблиц.

Пример. Требуется удалить из таблицы Laptop все ПК-блокноты с размером экрана менее 12 дюймов.

DELETE FROM Laptop

WHERE screen

Все блокноты можно удалить с  помощью оператора

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