7.1.Въведение
SQL:
-
конкретна реализация на релационния модел;
-
стандарт за релационни езици;
-
поддържа се от повечето развойни системи, които са днес на пазара;
-
огромен език, стандартната му документация е над 600 страници.
Ще разгледаме едно ядро на езика, което съдържа основните му аспекти, като имаме предвид, че ще разгледаме съвременния стандарт на езика, познат като SQL/92. Официалното му име - International Standard Database Language SQL (1992).
-
никой продукт не поддържа пълния SQL/92;
-
в SQL се използват понятията:
-
таблица (за релация);
-
ред (за запис);
-
колона (за атрибут).
7.2.Дефиниране на данни
В този раздел ще се запознаем с DDL-операторите на езика SQL. DDL (Data Definition Language) - компонент на SQL за дефиниране на базовите обекти от данни. От гледна точка на потребителите основните DDL-оператори са следните:
-
CREATE TABLE
-
CREATE DOMAIN
-
ALTER DOMAIN
-
ALTER TABLE
-
DROP TABLE
-
DROP DOMAIN
7.2.1.Домейни
SQL домейните се различават значително от тези на релационния модел - единственото предназначение на домейните в SQL е да разрешават една проста спецификация на типовете данни, така че веднъж дефинирани да могат да се използват за различни колони в различни таблици.
Основни разлики между РМ-домейн и SQL-домейн:
-
SQL-домейн - синтактично съкращение;
-
не се изисква непременно да се използват SQL-домейни. Колоните могат да се дефинират директно;
-
в SQL не се поддържа домейн върху домейн - SQL-домейн съдържа само елементи от системните типове на данни;
-
SQL не поддържа възможност за дефиниране на операции, които се прилагат върху даден домейн;
-
SQL не поддържа концепцията за:
-
подтипове;
-
супертипове;
-
наследяване.
Синтаксис на оператора:
Обяснение:
-
SQL поддържа следните скаларни типове данни:
-
CHARACTER [VARYING]
-
BIT [VARYING]
-
NUMERIC
-
DECIMAL
-
INTEGER
-
SMALLINT
-
FLOAT
-
REAL
-
DOUBLE PRECISION
-
DATE
-
TIME
-
TIMESTAMP
-
INTERVAL
Типовете данни CHARACTER и CHARACTER VARYING са наричани типове данни за последователност от символи.
BIT и BIT VARYING са за последователност от битове.
NUMERIC, DECIMAL, INTEGER, и SMALLINT са типове за числа с определена точност.
FLOAT, REAL, и DOUBLE PRECISION са типове за числа с приблизителна точност (закръгление).
DATE, TIME, и TIMESTAMP са типове за дата и час.
INTERVAL е тип данни за интервал от време.
-
default-definition (опционална) - стойност по подразбиране, която се приема за всяка колона, дефинирана върху областта. Задава се като :
DEFAULT default
където default може да бъде:
-
литерал;
-
стандартна функция без аргументи - напр. CURRENT_TIME;
-
NULL.
-
domain constraint definitions - множества от ограничения за цялостност, които се прилагат върху всяка колона, дефинирана върху домейна. Обикновено е изброяване на стойности.
Във всеки ред:
-
стойност по подразбиране за атрибута COLOR - ‘Син’;
-
при въвеждане стойност, която не е елемент от VALID_COLORS ограничението, системата отчита грешка.
Един съществуващ домейн може да бъде променян по всяко време с помощта на оператора
ALTER DOMAIN
който добавя нови или изтрива стари стойности по подразбиране и/или ограничения.
Един съществуващ домейн може да бъде изтриван посредством
RESTRICT - операцията е грешна, ако домейнът се използва
CASCADE - изтрива се навсякъде
7.2.2.Базови таблици
Една базова таблица е един (важен) специален случай на по-общата концепция "таблица".
За създаване на таблици общият формат на оператора е следният:
CREATE TABLE base-table (base-table-element-commalist);
base-table-element ::= column-definition | base-table-constraint-definition
column-definition ::= column representation [default-definition]
column representation ::= тип данни или домейн
default-definition ::= препокрива, ако има такива за домейна
base-table-constraint-definition:
-
дефиниция на ключ-кандидат
-
UNIQUE (column-commalist);
-
PRIMARY KEY (column-commalist)
-
дефиниция на външен ключ;
FOREIGN KEY (column-commalist)
REFERENCES base-table [ (column-commalist) ]
[ ON DELETE option ]
[ ON UPDATE option ]
option ::= NO ACTION | CASCADE | SET NULL | SET DEFAULT
кореспондиращи съответно с режимите:
NO ACTION – RESTRICTED
CASCADE – CASCADES
SET NULL – NULLIFIES
SET DEFAULT - стойности по подразбиране
-
дефиниция на check constraints
CHECK (conditional-expression)
Съществуващите базови таблици могат да бъдат променяни по всяко време:
-
добавяне на нова колона;
-
нова стойност по подразбиране за съществуваща колона;
-
изтриване на съществуваща стойност по подразбиране;
-
изтриване на съществуваща колона;
-
специфициране на ново ограничение за цялостност;
-
изтриване на съществуващо ограничение.
Пример: ALTER TABLE LECTURER ADD COLUMN YEARS_WORD INTEGER DEFAULT 0;
Съществуваща базова таблица може да бъде изтрита:
DROP TABLE base-table option;
option ::= RESTRICT | CASCADE
RESTRICT – операцията не се извършва ако таблицата се реферира в дефиниции на VIEW или в ограничение;
CASCADE – изтрива се навсякъде.
Вторият компонент на SQL е Data ManipulationManipulation Language (DML). SQL поддържа 4 DML-опрератора:
-
SELECT
-
UPDATE
-
DELETE
-
INSERT
Операциите за извличане на данни са релационни изрази с различна сложност.
Общата форма на оператора е:
Ще ги демонстрираме с помощта на различни примери, в които ще демонстрираме оператори за сравнение в SQL - { =, <>, <, >, <=, >= }.
Най-общо, в оператора SELECT могат да се използват изрази, включващи имена на полета, константи и основните аритметични оператори (+,-,*,/), при които могат да се използват и скоби.
SQL поддържа едно множество от агрегиращи функции:
-
COUNT;
-
SUM;
-
AVG;
-
MAX;
-
MIN.
Ограничения към тях:
-
аргументът на функциите може да бъде опционно предшестван от ключовата дума DISTINCT, за да се изиска дубликатите да бъдат елиминирани преди да се приложи функцията;
-
за функцията COUNT(*) - DUSTINCT не е разрешена;
-
нулевите стойности на аргументите винаги се елиминират преди да се приложат функциите, независимо от това дали е зададен DISTINCT.
7.4.Update оператори
Това са операторите:
7.4.1.INSERT
INSERT
INTO table [ ( field [, field] ... ) ]
VALUES ( constant [, constant ] ... );
или
INSERT
INTO table [ ( field [, field ] .. ) ]
SELECT ... FROM ... WHERE ... ;
7.4.2.UPDATE
UPDATE table
SET field = expr
[, field = expr ] ...
[ WHERE predicate ];
Всички записи от "table", които удовлетворяват "predicate", се модифицират посредством присвояването "field = expr".
Забележка: не е възможно да се промени повече от една таблица в един оператор.
7.4.3.DELETE
DELETE
FROM table
[ WHERE predicate ];
Всички записи, които удовлетворяват "predicate" се изтриват.
7.5.Индекси
Аналогично на базовите таблици индексите могат да се създават и изтриват с помощта на SQL-оператори за дефиниране на данни.
CREATE [ UNIQUE ] INDEX index-name
ON base-table-name ( column-name [ order ]
[, column-name [order ]] ... )
[ CLUSTER ];
Опцията CLUSTER означава, че индексът е групов. Дадена базова таблица може да има в един момент максимално един групов индекс.
Всеки "order" специфицира ASC (ascending) или DESC (descending), по подразбиране се приема ASC.
Пример: CREATE INDEX X ON T (P, Q DESC, R) създава индекс (обикновено В-дърво) с име X върху комбинацията от колони (P,Q,R) на базовата таблица Т. Входните точки се подреждат в нарастващи R-стойности вътре в намаляващи Q-стойности вътре в нарастващи P-стойности. За колоните P,Q,R не се изисква да бъдат:
-
съседни;
-
от един и същ тип;
-
с еднаква дължина.
Индексите се актуализират автоматично при всяка промяна в базовата таблица.
Опцията UNIQUE специфицира, че не се разрешава в индексната таблица да се поддържат две еднакви стойности за два различни записа.
Както вече казахме, индексите могат да се създават и изтриват по всяко време. Въпреки това, желателно е в горния пример те да бъдат създадени заедно с базовите таблици.
За една базова таблица могат да се създадат повече от един индекс.
Операторът за изтриване на индекси е следният:
DROP INDEX index-name;
7.6.Вграден SQL (Embedded SQL)
SQL - операторите могат да се използват:
-
интерактивно;
-
като част от приложна програма – SQL - операторите физически се вграждат в първичния код на програмата.
До сега разгледахме интерактивното използване на езика.
Като език за програмиране SQL обикновено не съществува самостоятелно, а е вграден в друг език за програмиране (приемник). Напр., вграден SQL/PL1, SQL/FORTRAN, SQL/C,...
Основен принцип на SQL - изразните му средства в интерактивен режим могат да се използват без ограничения в програмния режим.
Интерпретация:
-
вградените SQL оператори се маркират така, че те могат да бъдат различени от езика-приемник (host-language);
-
изпълним SQL - оператор може да се запише там, където се допуска изпълним оператор на базовия език;
-
SQL - операторите могат да включват обръщения към host-променливи;
-
host-променливите трябва да имат съвместими типове със съответните им SQL-полета.
Нека разгледаме случая, когато SELECT избира група записи, а не само един. Това поражда известни проблеми при вградените SQL езици - езици като C, PL/1, COBOL,... не поддържат средства за обработка на повече от един запис в даден момент. От това следва, че е необходим механизъм, който позволява достъп до единичните записи от избраното множество. CURSORS доставят такъв механизъм. Те представляват структури, които съхраняват резултатния набор и когато искаме да извлечем данни от определен запис трябва да позиционираме указателя им на желания запис, след което да извлечем стойностите от полетата му. Курсорите обикновено се обхождат в цикъл.
Сподели с приятели: |