You are on page 1of 64

Език SQL

Операциите на релационната алгебра –


типовете обработки върху РБД
Релационна алгебра –основен
формализъм на релационния модел
Език от високо ниво – операциите имат
като операнди релации
Не се използва в комерсиални СУБД
-заявка се описва с последователност
от операции – трудоемко
Изисквания към език за заявки

1. Дефиниране на релационни структури и


създаване на БД
2. Управление (манипулиране) на данните
3. Формулиране на заявки – превръщане
на данните в информация
4. Лесна за усвояване командна структура
5. Преносимост - стандартизиран
Реализации

Комерсиални СУБД
- декларативен езиков интерфейс от
високо ниво – задава се видът на
резултата от операция върху БД
- СУБД –оптимизация и стратегия за
изпълнение
SQL
Структуриран език за заявки
Основен език за работа с РБД
Описан в стандарт SQL2
Първи вариант – SEQUEL, в System R
Декларативен релационен език,
унифициран
SQL
Характеристики
1. Интегриран – езици за дефиниране и
обработка на данни
2. Вграждане – в езици за програмиране
(C, C++, Java, …)
3. Стандартизация – SQL2 (SQL’92),
SQL3 (разширение с обектно-ориентирани
понятия)
SQL
Основни понятия:
1.Таблица - Релация
Ред –n-торка
Колона – атрибут
2. Среда (environment) – съдържа
единствена БД
3. База данни – множеството на всички
схеми, дефинирани в една среда
4. Схема – таблици, потребителски
представи (views), права (privileges) на
даден потребител
SQL
Основни понятия:
5. Каталог (information schema) –
именувано множество на схемите в една
среда
6. Пространство на базата (dbspace)-
логическо заделяне на място за БД, част
от общото пространство, съставено е от
определен брой сегменти. Има
определено ниво на заключване
Създаване на схема, таблица, среда
Команди:
CREATE / DROP – създаване /
унищожаване
1. На БД
CREATE DATABASE database_name
DROP DATABASE database_name
2. На пространство
ACQUIRE [PUBLIC  PRIVATE] DBSPACE
NAMED dbspace_name [option [, option..]]
Option: LOCK = {DBSPACE  PAGE  ROW}
DROP DBSPACE dbspace_name
Създаване на схема, таблица, среда
Команди:
3. На схема
- Създадена е БД и пространство за
таблиците
- Потребителят има права за създаване на
таблици и схеми
- Базата се прави активна

USE database_name
или START database_name
Създаване на схема, таблица, среда
Команди:

SQL-схема – групиране на таблици,


ограничения за цялост, потребителски
представи, домейни и други конструкции
за едно и също приложение
Дефинира се чрез идентификатор на
права за достъп
CREATE SCHEMA schema_name
AUTHORIZATION owner_name
SQL-схема

Описание на схема – в каталога


Специална схема в каталога
(Information_schema) – елементите на
всички схеми
Предоставят се на потребители със
съответни права
SQL-схема

Премахване
DROP SCHEMA database schema_name
{CASCADE  RESTRICT}

CASCADE – схемата заедно с всички


елементи

RESTRICT – ако са премахнати


елементите й
Създаване на таблица

CREATE TABLE table_name


(имена на колоните с тип данни,
ограничения, ключове)
Типове данни:

-числови (numeric)
-символни низове (character string)
-битови низове (bit string)
-дата/час (date, time)
Типове данни
Numeric:
- цели числа с различна големина – INT,
SMALLINT
-реални числа с различна точност –
FLOAT, REAL, DOUBLE PRECISION

CHARACTER STRING:
-с фиксирана дължина – CHAR(n)
-с променлива дължина – CHAR
VARYING(n)
Типове данни
BIT STRING:
-с фиксирана дължина – BIT(n)
-с променлива дължина – BIT
VARYING(n)

DATE/ TIME
-DATE (yyyy-mm-dd)
-TIME hh:mm:ss
-TIMESTAMP – комбинация от двата
-INTERVAL –число, което може да се
добавя или изважда от трите
CREATE TABLE

NOT NULL
UNIQUE – кандидат-ключ (компонентите
на съставни кандидат-ключове, които не
са главни ключове)
PRIMARY KEY
FOREIGN KEY
CREATE TABLE table_name(
column_name datatype [null_specifier],
PRIMARY KEY (column_name [,…])
FOREIGN KEY (column_name)
REFERENCES table_name
(column_name))
Примери:

CREATE TABLE Department


(DNAME VARCHAR (15) NOT NULL,
DNUMBER INT NOT NULL,
MGRSSN CHAR(9) NOT NULL,
PRIMARY KEY (DNUMBER)
FOREIGN KEY (MGRSSN) REFERENCES
EMPLOYEE (SSN));
Примери:
CREATE TABLE Employee
(FNAME VARCHAR (15) NOT NULL,
LNAME VARCHAR (15) NOT NULL,
SSN CHAR(9),
BDATE CHAR(9),
ADDRESS VARCHAR (30),
Sex CHAR(1),
SALARY INTEGER,
CHECK (SALARY >=300),
SUPERSSN CHAR(9),
DNO INTEGER;
PRIMARY KEY (SSN)
FOREIGN KEY (DNO) REFERENCES
DEPARTMENT);
Ограничения за цялост

Constraint <const_name> <type>(column)

Constraint А1 primary key (SSN)

Constraint A2 foreign key (DNO)


references DEPARTMENT (DNUM)
Ограничения за цялост
върху чужд ключ

Валидни са при изтриване или


обновяване на редове с главен ключ
съвпадащ с чуждия
Указват операции с чуждия ключ
on delete cascade
on update cascade
on delete set default – при изтриване на
ред от таблицата с главния ключ на
чуждия се дава стойност:
user, system user, no action
Ограничения за цялост
върху чужд ключ

on update set default- обновяване на


главен ключ – същата стойност се
присвоява и на чуждия
on delete set null - при изтриване на ред
от таблицата с главния ключ на чуждия се
дава стойност null
Таблици с CREATE TABLE

Основни, базови
Виртуални (CREATE VIEW)

DROP TABLE table_name


Описанието се изтрива от каталога
ALTER TABLE

Промяна на структурата на схемата


-добавяне/премахване на колона
-промяна дефиницията на колона
-добавяне/промяна на ограничения
върху таблицата

Добавяне на колона – не се допуска


ограничение Not Null,там по подразбиране
се записва Null

ALTER TABLE Employee ADD Job


VARCHAR (12)
Основни характеристики на SQL

1. Единствен оператор за извличане на


данни SELECT
Различава се от селекция на
релационната алгебра
2. Допуска съществуването на
идентични редове
3. Съществуват опции и команди за
осигуряване на различимост на
редовете
Основен елемент на SQL

SELECT-FROM-WHERE

SELECT <списък от колони>


FROM <списък от таблици>
WHERE <критерий>
Основни заявки
1. С единствена таблица

Q1:SELECT BDATE, ADDRESS


FROM EMPLOYEE
WHERE FNAME=‘abc’ AND
LNAME=‘ABC’;

С операции от релационната алгебра:


(BDATE, ADDRESS) ( (FNAME=‘abc’ AND LNAME=‘ABC’)
(EMPLOYEE)

SELECT * FROM EMPLOYEE;


SELECT curtime();
Основни заявки

2. С две таблици - съединение

Q2:SELECT FNAME, LNAME, ADDRESS


FROM EMPLOYEE, DEPARTMENT
WHERE DNAME=‘xyz’ AND
DNUMBER=DN

С операции от релационната алгебра:


, , 
Условия след WHERE:
- За избор - DNAME=‘xyz’
- За съединение - DNUMBER=DN
Основни заявки

3. Съединение с няколко таблици -

Q3:SELECT PNUM, DNUM, LNAME,


ADDRESS
FROM PROJECT, DEPARTMENT
EMPLOYEE
WHERE DNUM=DNUMBER AND
MGRSSN=SSN AND PLOC=‘SOFIA’

Условия за съединение
- DNUM=DNUMBER
- MGRSSN=SSN
Основни заявки

Допускат се колони с еднакви имена в


различни таблици

DEPARTMENT.DNUMBER=EMPLOYEE.DN
UMBER
Основни заявки

4. С използване на една таблица


няколко пъти (рекурсивна връзка
между редовете)
Алтернативни имена (синоними)

Извеждане на имената на служител и на


ръководителя му
Q4: SELECT E.FNAME, E.LNAME,
S.LNAME
FROM EMPLOYEE E S
WHERE E.SUPERSSN=S.SSN
Основни заявки

Синоними  две копия на таблицата и


съединяването им (self-join)

Копие E – служители като подчинени


Копие S – служители като
ръководители

Ниво на рекурсия = 1
SQL разрешава произволно, но известно
ниво на рекурсия
Основни заявки

Синоними за по-кратък запис

SELECT E.FNAME, E.LNAME, S.LNAME


FROM EMPLOYEE AS E, EMPLOYEE AS
S
WHERE E.SUPERSSN=S.SSN
Основни заявки

5. Елиминиране на идентични редове

SELECT SALARY
FROM EMPLOYEE
Повторения

SELECT DISTINCT SALARY


FROM EMPLOYEE
Основни заявки

6. Включване на множествена операция

UNION
(резултатът не съдържа дублирани
редове)

В някои версии – сечение и разлика

Съвместимост по обединение!

Извеждане на проекти, в които ‘AAA’ е


проектант или ръководител на отдел
Основни заявки

Q6. (SELECT PNAME


FROM PROJECT, DEPARTMENT,
EMPLOYEE
WHERE DNUM=DNUMBER AND
MGRSSN=SSN AND LNAME=‘AAA’)
UNION
(SELECT PNAME
FROM PROJECT, WORKS_ON,
EMPLOYEE
WHERE PNUMBER=PNO AND ESSN=SSN
AND LNAME=‘AAA’)
Основни заявки

7. Множества в булев израз

Q7. SELECT DISTINCT ESSN


FROM WORKS_ON
WHERE PNO IN (1, 2, 3)
Основни заявки

8. Проверка за липсващи стойности


(null)
IS Null, IS NOT Null

Q8. SELECT FNAME, LNAME


FROM EMPLOYEE
WHERE SUPERSSN IS NULL
Основни заявки

9. Сравняване на части от низ или


търсене на подниз
LIKE
‘%’ ( или ‘*’) за произволен брой
символи; ‘_’ – за един символ

Q9. SELECT FNAME, LNAME


FROM EMPLOYEE
WHERE ADDRESS LIKE
‘%SOFIA,MLADOST%’
Вложени заявки

След WHERE на основната заявка


Произволно ниво на влагане

SELECT <attr1, attr2, …, attrn>


FROM <Table1, Table2, …>
WHERE <bool> SELECT <attr1, attr2, …,
attrn>
FROM <Table1, Table2, …>
WHERE <bool> SELECT……….
Вложени заявки

Q10: SELECT FNAME, LNAME


FROM EMPLOYEE
WHERE DNO IN (SELECT DNUMBER
FROM DEPARTMENT
WHERE DNAME=‘DDD’

Множеството със стойности за сравнение


– неявно.
Външна и вложена заявка –
некорелирани
Вложени заявки

Корелирани външна и вложена заявка:


Имена на служители, които имат деца
съименници

Q11: SELECT E.FNAME, E.LNAME


FROM EMPLOYEE AS E
WHERE E.SSN IN (SELECT ESSN
FROM DEPENDENT
WHERE ESSN=E.SSN AND
E.PNAME=DEPENDENT_NAME)
(за намиране на съименници със
собствените деца, а не на кои да са!)
Вложени заявки

Корелирани външна и вложена заявка:


Имена на служители, които имат деца
съименници

Вложената се изпълнява за всеки ред или


комбинация от редове на външната
заявка:
За всеки ред на EMPLOYEE – вложената
– от DEPENDENT – редовете с номера и
имена  с тези от реда на EMPLOYEE
Вложени заявки

Трансформиране в линейна чрез


съединение:

Q12: SELECT E.FNAME, E.LNAME


FROM EMPLOYEE E AND DEPENDENT D
WHERE E.SSN = D.ESSN AND
E.FNAME=D.DEPENDENT_NAME
Вложени заявки
Сравняване на множества – CONTAINS

Имена на служители, работещи по всички


проекти на отдел 1:
Q13: SELECT PNAME, LNAME
FROM EMPLOYEE
WHERE ((SELECT PNO
FROM WORKS_ON
WHERE SSN=ESSN)
CONTAINS
(SELECT PNUMBER
FROM PROJECT
WHERE DNUM=1))
Вложени заявки
Проверка за съдържание на редове във
вложена и корелирана заявка – Exists
Имена на служители без деца
Q14: SELECT FNAME, LNAME
FROM EMPLOYEE
WHERE NOT EXISTS (SELECT *
FROM DEPENDENT
WHERE SSN=ESSN)
Вложената – всички редове на
DEPENDENT, свързани с ред от
EMPLOYEE
Няма такива редове – запис на реда от
EMPLOYEE в резултата
Агрегатни функции

COUNT, SUM, MAX, MIN, AVG


Приложение – върху единствена колона
Първо се изключват null
COUNT(*) – брой редове, независимо от
съществуващите null

Само в SELECT или HAVING

Q15: SELECT SUM(SALARY),


MAX(SALARY), MIN(SALARY)
FROM EMPLOYEE
Агрегатни функции

Q15: SELECT SUM(SALARY),


MAX(SALARY), MIN(SALARY)
FROM EMPLOYEE
WHERE DNO=DNUMBER AND
DNAME=‘R1’
Агрегатни функции

Q16: SELECT COUNT(*)


FROM EMPLOYEE

SELECT COUNT(*)
FROM EMPLOYEE, DEPARTMENT
WHERE DNO=DNUMBER AND
DNAME=‘R1’
Агрегатни функции

Преброяване на различните стойности:

Q17: SELECT COUNT(DISTINCT SALARY)


FROM EMPLOYEE
Групиране и сортиране

Предварително групиране и прилагане


на агрегатна функция върху групата:
GROUP BY
Колоните в GROUP BY се изброяват и в
SELECT !

Q18: SELECT PNUMBER, PNAME,


COUNT(*)
FROM PROJECT, WORKS_ON
WHERE PNUMBER=PNO
GROUP BY PNUMBER, PNAME
Групиране и сортиране

Условие върху групата:


HAVING

Q19: SELECT PNUMBER, PNAME,


COUNT(*)
FROM PROJECT, WORKS_ON
WHERE PNUMBER=PNO
GROUP BY PNUMBER, PNAME
HAVING COUNT(*) > 2
Групиране и сортиране

Сортиране:
ORDER BY
ASC – подразбира се, DESC - явно
Q20: SELECT DNAME, LNAME, FNAME,
PNAME
FROM DEPARTMENT, EMPLOYEE,
WORKS_ON, PROJECT
WHERE DNUMBER=DNO AND SSN=ESSN
AND PNO=PNUMBER
ORDER BY DNAME, LNAME
Заявка SELECT на SQL

SELECT <attr, …>


FROM <Table_Name / Alias_Name, …>
[WHERE <bool>]
[GROUP BY<attr, …>]
[HAVING <bool>]
[ORDER BY <attr, …>]

Изпълнение:
1. WHERE
2. GROUP BY
3. HAVING
Избягване на влагане и сортировка!
Обновяване на базата

1. INSERT
2. DELETE
3. UPDATE
Вмъкване на данни в таблица

INSERT INTO <Table_Name>


VALUES (NULL, ‘AAA’,’BBB’, 125, ….) – -
създава се ред и се въвеждат стойности
на атрибутите
брой стойности = брой атрибути

INSERT INTO <Table_Name>


SET attr1=‘AAA’,
attr2 = ‘BBB’
attr3 = 125,
……..;
брой стойности  брой атрибути
Изтриване на данни

DELETE FROM <Table_Name>

DELETE FROM <Table_Name> WHERE


<Bool>

DELETE FROM EMPLOYEE


WHERE DNO IN (SELECT DNUMBER
FROM DEPARTMENT
WHERE DNAME=‘R1’)
Обновяване на данни

UPDATE <Table_Name>
SET <Column_Name> = Value

UPDATE <Table_Name>
SET <Column_Name> = Value
WHERE <Bool>

UPDATE EMPLOYEE
SET SALARY=SALARY*1.1
WHERE DNO IN (SELECT DNUMBER
FROM DEPARTMENT
WHERE DNAME=‘R1’)
Допълнителни възможности на SQL

1. Задаване на потребителски
представи –
CREATE VIEW EMPLOYEE1 AS
SELECT FNAME, LNAME, ADDRESS
FROM EMPLOYEE
Допълнителни възможности на SQL

2. Разрешаване / отмяна на права

GRANT SELECT, INSERT, UPDATE,


DELETE, CREATE, DROP
ON DB.*
TO USER@LOCALHOST
IDENTIFIED BY ‘PASSWORD’

REVOKE CREATE, DROP ON DB.* FROM


USER@LOCALHOST
Допълнителни възможности на SQL

Явно задаване на операция


съединение:
1. Общ вид –theta
2. Естествено - natural
3. Ляво външно – left outer join
4. Дясно външно – right outer join
5. Пълно (cross-join) – декартово
произведение
Допълнителни възможности на SQL

Q2:SELECT E.FNAME, E.LNAME,


S.PNAME, S.LNAME
FROM EMPLOYEE E S
WHERE E.SUPERSSN= S.SSN

SELECT E.FNAME, E.LNAME, S.PNAME,


S.LNAME
FROM (EMPLOYEE E LEFT OUTER JOIN
EMPLOYEE S
ON E.SUPERSSN= S.SSN)
Допълнителни възможности на SQL

SELECT FNAME, LNAME, ADDRESS


FROM EMPLOYEE, DEPARTMENT
WHERE DNAME=‘xyz’ AND
DNUMBER=DN

SELECT FNAME, LNAME, ADDRESS


FROM (EMPLOYEE JOIN DEPARTMENT
ON DNUMBER=DN)
WHERE DNAME=‘xyz’
Допълнителни възможности на SQL
SELECT PNUM, DNUM, LNAME,
ADDRESS
FROM PROJECT, DEPARTMENT
EMPLOYEE
WHERE DNUM=DNUMBER AND
MGRSSN=SSN AND PLOC=‘SOFIA’

SELECT PNUM, DNUM, LNAME,


ADDRESS
FROM (PROJECT JOIN DEPARTMENT ON
DNUM=DNUMBER) JOIN EMPLOYEE ON
MGRSSN=SSN )
WHERE PLOC=‘SOFIA’
Комерсиални СУБД

Допълнителни команди за:

- параметри на физическата база


- структура на файловете
- пътища за достъп - индекси

You might also like