Sunteți pe pagina 1din 36

Administrarea bazelor de date

Limbajul SQL
Limbajul de definire a datelor (LDD)
Curs 4
Proprietăți ale unei baze de date
relaționale
• O bază de date relațională
– poate fi accesată și modificată prin execuția
de instrucțiuni SQL (SQL=structured query
language – limbaj ANSI standard pentru baze
de date relaționale)
– conține o colecție de tabele (și alte tipuri de
obiecte)
– folosește un set de operatori

2
Comunicarea cu RDBMS folosind
SQL
SELECT *
FROM departments;

SERVER

3
Clasificarea instrucțiunilor
SQL

4
Schema
• O schemă este o mulţime de structuri
logice de date numite obiecte. Ea aparţine
unui utilizator al bazei de date şi poartă
numele său.
• Dacă un tabel nu aparține utilizatorului
(activ), pentru accesarea acestuia trebuie
prefixat numele tabelului cu numele
schemei proprietarului obiectului

5
Tipuri de date
Tip de date Descriere
VARCHAR2(size) Șiruri de caractere de lungime variabilă (trebuie specificată
dimensiunea maximă; dimensiunea minimă este 1, iar cea maximă
este 4000)

CHAR [(size)] Șiruri de caractere de lungime fixă de lungime egală cu size bytes
(Dimensiunea minimă și implicită este 1, iar dimensiunea maximă
este 2000)

LONG Șiruri de caractere de lungime variabilă de dimensiuni mari (până


la 2GB)

CLOB Șiruri de caractere de până la 8TB


NUMBER [(p,s)] Numere având precizia p și scala s (Precizia este numărul total de
cifre zecimale, iar scala e numărul de cifre din dreapta punctului
zecimal; Precizia poate lua valori de la 1 la 38, iar scala poate lua
valori pâna la 127)

6
Tipuri de date (2)
DATE Valori de dată calendaristică și timp cuprinse între
January 1, 4712 B.C. și December 31, 9999 A.D.

TIMESTAMP(precizie_fractiuni_sec) Extensie a tipului DATE ce permite fracționarea unei


secunde; valorile acceptate pentru
precizie_fracţiuni_secundă sunt între 0 şi 9, iar
valoarea implicită este 6.

TIMESTAMP Cuprinde pe lângă informaţiile corespunzătoare tipului


(precizie_fracţiuni_secundă) WITH anterior şi deplasarea fusului orar.
TIME ZONE

TIMESTAMP onţine valorile tipului TIMESTAMP WITH TIME ZONE.


(precizie_fracţiuni_secundă) WITH Diferenţa constă în faptul că la stocarea în baza de
LOCAL TIME ZONE date, o dată calendaristică de acest tip este
transformată corespunzător timpului regiunii (setat la
nivelui bazei). La utilizare această valoare va fi
transformată corespunzător timpului regiunii
caracteristice sesiunii respective.
7
Tipuri de date (3)
INTERVAL Stochează o perioadă de timp specificată în ani şi luni, unde
YEAR(precizie_an) TO precizie_an reprezintă numărul de cifre din câmpul YEAR.
MONTH Valorile acceptate pentru precizie an sunt între 0 şi 9. Valoarea
implicită este 2.

INTERVAL DAY Stochează o perioadă de timp reprezentată în zile, ore, minute şi


(precizie_zi) secunde. Argumentul precizie_zi corespunde numărului maxim de
TO SECOND cifre din câmpul DAY. Valorile acceptate pentru precizie_zi sunt
(precizie_fractiuni_ între 0-9, valoarea implicită fiind 2.
secunda)

RAW Date binare de până la 2000 bytes

BLOB Date binare de până la 8TB

BFILE Date binare de până la 8TB stocate în fișiere externe

8
Dicționarul datelor
• Vederile și tabelele din dicționarul datelor conțin informații
despre:
– utilizatori și privilegiile acestora
– tabele, coloane și tipurile de date ale acestora
– privilegii acordate asupra obiectelor din baza de date
– etc.

• Datele stocate în dicționarul datelor se mai numesc ”meta-


date”.
• Există câteva sute de tabele și vederi în dicționar. Cele mai
importante (pentru scopul acestui curs) sunt:
– USER_* - vederi care descriu obiectele din schema
utilizatorului
– ALL_* - vederi care descriu obiecte din schemele altor
utilizatori asupra cărora utilizatorul are privilegii
– DBA_* - vederi care descriu ”orice” din baza de date și pot
fi folosite doar de DBA
9
Dicționarul datelor (2)
• USER_TABLES – vedere ce descrie tabelele din schema utilizatorului
• USER_TAB_COLUMNS – vedere ce descrie coloanele tabelelor, vederilor
ce aparțin utilizatorului
• ALL_TABLES – vedere ce descrie tabelele la care utilizatorul are acces,
inclusiv la cele ce aparțin schemei altor utilizatori
• DBA_TABLES – vedere ce conține toate tabelele din baza de date,
indiferent cărui utilizator îi aparțin.

• Pentru a vizualiza toate vederile disponibile din dicționar se poate folosi


comanda:
SELECT *
FROM DICTIONARY;

Alte vederi ce pot fi interogate:


USER_TABLES
USER_OBJECTS
USER_CATALOG (CAT)
10
Definirea tabelelor
• Definirea tabelelor presupune:
– crearea de noi tabele (CREATE TABLE)
– modificarea structurii tabelelor (ALTER
TABLE)
– ștergerea (suprimarea) tabelelor (DROP
TABLE)
– redenumirea tabelelor (RENAME)
– trunchierea tabelelor (TRUNCATE TABLE)

11
Crearea unui tabel
• Crearea unui tabel constă în generarea
structurii sale, adică atribuirea unui nume
tabelului şi definirea caracteristicilor sale.
• Se face folosind instrucțiunea SQL
CREATE TABLE
• Necesită privilegiul CREATE TABLE și un
spațiu de stocare pentru acesta - ce
trebuie acordate de către administratorul
bazei de date

12
Crearea unui tabel prin
precizarea structurii
• Forma simplificată a instrucțiunii CREATE
TABLE:
CREATE TABLE [schema.]nume_tabel
(nume_coloana_1 tip_date [DEFAULT
expresie],
...
nume_coloana_n tip_date [DEFAULT
expresie] );
13
Exemplu
• Se creează un tabel cu numele angajati şi cu
structura cod, nume, salariu:

CREATE TABLE angajati (


cod NUMBER(4) NOT NULL,
nume VARCHAR2(15),
salariu NUMBER(10),
comision NUMBER(10)
);

14
Crearea unui tabel prin preluarea
structurii de la o tabelă existentă
CREATE TABLE tabel_nou (nume_coloana_1,
nume_coloana_2, …, nume_coloană_n)
AS (SELECT nume_coloană_1,
nume_coloană_2, …, nume_coloană_n
FROM tabel_vechi WHERE conditie);

15
Exemplu
• se creează un tabel cu structura cod,
nume, salariu având câmpurile preluate
din tabelul emp:
CREATE TABLE ang (cod, nume, salariu)
AS SELECT empno, ename, sal
FROM emp;

16
Modificarea structurii unui
tabel
• se realizează cu ajutorul comenzii ALTER
TABLE care permite:
– adăugarea unei coloane la tabelul existent
– modificarea unei coloane existente-pot fi modificate
tipul de date, dimensiunea sau valoarea implicită
– ştergerea unei coloane.
– marcarea unor coloane nefolosite fără eliberarea
spațiului de memorie
– ștergerea coloanelor marcate ca nefolosite
– activare/ dezactivare constrangeri

17
Modificarea structurii unui
tabel
ALTER TABLE [schema.]nume_tabel
ADD | MODIFY ( nume_coloana_1 tip_de_date
[DEFAULT expresie],
..., nume_coloana_n tip_de_date [DEFAULT
expresie] )
| DROP (nume _coloana)[CASCADE
CONSTRAINTS]
| SET UNUSED (coloana)
| DROP UNUSED COLUMNS
| ENABLE|DISABLE CONSTRAINT constrangere;
18
Exemple
- să se modifice structura tabelului angajati, prin adăugarea coloanei meserie:

ALTER TABLE angajati


ADD (meserie VARCHAR2(10));

- să se modifice structura tabelului angajati, prin modificarea dimensiunii coloanei cod din
NUMBER(4) în NUMBER(5):

ALTER TABLE angajati


MODIFY (cod NUMBER(5)) ;

- să se modifice structura tabelului angajaţi prin modificarea tipului de date al coloanei


cod din numeric (NUMBER) în şir de caractere (VARCHAR2):

ALTER TABLE angajati


MODIFY (cod VARCHAR2(5));

- să se modifice structura tabelului angajati prin ştergerea coloanei comision.

ALTER TABLE angajati


DROP (comision) ;
19
Ştergerea unui tabel
Se realizează cu ajutorul comenzii DROP TABLE.
Sintaxa:

DROP TABLE [schema.]nume_tabel


[CASCADE CONSTRAINTS];

Exemplu: ştergerea tabelului ang:

DROP TABLE ang;

20
Ștergerea/refacerea tabelelor
Un tabel șters prin comanda DROP va fi mutat în
RECYCLEBIN- ul atașat fiecărei scheme.

Pot fi vizualizate obiectele din acesta prin


interogarea vederii USER_RECYCLEBIN.

Un tabel șters din greșeală poate fi ”refăcut” prin


comanda FLASHBACK TABLE.

Sintaxa:
FLASHBACK TABLE tabel TO BEFORE DROP;
21
Redenumirea tabelelor
• Redenumirea unui tabel presupune
modificarea numelui său. Această
operație poate fi realizată de proprietarul
tabelului (owner) sau de administratorul
bazei de date (DBA)
• Sintaxa:
RENAME nume_vechi_tabel
TO nume_nou_tabel;
• Exemplu:
RENAME stud TO studenti; 22
Trunchierea tabelelor
• Trunchierea unui tabel presupune ștergerea tuturor liniilor unui tabel
cu eliberarea spațiului de memorie ocupat.
• Operația de ștergere a liniilor tabelului este definitivă (nu poate fi
refăcută ștergerea)
• Această operație poate fi realizată de proprietarul tabelului (owner),
de un user care are privilegiul DROP ANY TABLE sau de
administratorul bazei de date (DBA)
• Sintaxa:
TRUNCATE TABLE nume_tabel;
• Exemplu:
TRUNCATE TABLE ang;
• Observație: ștergerea liniilor unui tabel poate fi realizată și cu ajutorul
instrucțiunii DELETE; spre deosebire de TRUNCATE TABLE,
DELETE nu eliberează spațiul de memorie ocupat și este o
instrucțiune mai lentă deoarece generează informații de refacere
23
(rollback).
Constrângeri
• O constrângere este un mecanism ce asigură faptul că
valorile unei coloane sau mulţimi de coloane satisfac o
anumită condiţie. Constrângerile implementează reguli la nivel
de tabel. Serverul Oracle utilizează constrângeri pentru a
preveni existenţa datelor invalide în tabele.
• Constrângerile sunt stocate în dicţionarul de date. Dacă
utilizatorul nu specifică un nume pentru constrângere,
serverul Oracle generează un nume de forma SYS_Cn, unde
n este un număr întreg ales astfel încât numele constrângerii
să fie unic. Constrângerile pot fi adăugate sau şterse, dar nu
pot fi modificate. Ele pot fi activate sau dezactivate în funcţie
de necesităţi.
• Constrângerile pot fi definite în momentul creeării tabelului
sau ulterior. În comanda de creare a tabelului, constrângerile
se pot specifica la nivel de coloană sau de tabel.
24
Constrângeri (2)
• Sintaxa instrucțiunii CREATE TABLE:

CREATE TABLE [schema.]nume_tabel


(nume_coloana_1 tip_date [DEFAULT expresie]
[constr_coloana_1],

nume_coloana_n tip_date [DEFAULT expresie]
[constr_coloana_n]
[ ,constr_tabel ] );

• Clauza constr_coloana prezentă în în sintaxa instrucțiunii


CREATE TABLE are următoarea formă:

[CONSTRAINT nume_constrangere]
[NOT] NULL | UNIQUE | PRIMARY KEY | REFERENCES
[schema.]{nume_vedere | nume_tabel} [(nume_coloana)]
25
Constrângeri (3)
• Sintaxa clauzei constr_tabel din instrucțiunea CREATE
TABLE este următoarea:

[CONSTRAINT nume_constrangere]
{ UNIQUE (nume_coloana_1 [, nume_coloana_2]…)
| CHECK (conditie)
| PRIMARY KEY (nume_coloana_1 [,nume_coloana_2]…)
| FOREIGN KEY (nume_coloana_1 [,nume_coloana_2]…)
REFERENCES [schema.]{nume_vedere | nume_tabel}
[(nume_coloana_1 [, nume_coloana_2]…)] }

26
Constrângeri de domeniu
• Constrângerile de domeniu restrâng mulţimea
valorilor ce pot fi atribuite unei coloane. Ele pot fi
de tip CHECK, UNIQUE sau NOT NULL.
• Constrângerea CHECK poate fi definită la nivel
de coloană sau tabel şi defineşte o condiţie
booleană care trebuie satisfăcută de fiecare
linie.
• Constrângerea de tip NOT NULL poate fi
specificată numai la nivel de coloană şi asigură
ca valorile acestei coloane sunt diferite de null.

27
Constrângeri de domeniu
-exemple-
CREATE TABLE angajati (
cod NUMBER(4),
nume VARCHAR2(10) NOT NULL,
functie VARCHAR2(9),
cod_sef NUMBER(4),
data_ang DATE,
sal NUMBER(7,2) CONSTRAINT sal_chk CHECK
(sal BETWEEN 200 AND 20000),
com NUMBER(7,2),
cod_dept NUMBER(7,2) NOT NULL);

28
Constrângeri de domeniu
-exemple-
• Constrângerea UNIQUE poate fi definită la nivel de coloană sau tabel şi
specifică o coloană sau o combinaţie de coloane ale căror valori trebuie să
fie unice în raport cu toate liniile tabelului. Coloana sau mulţimea de coloane
inclusă în definiţia constrângerii UNIQUE se numeşte cheie unică.

** creare tabel cu definire constrângere UNIQUE la nivel de coloană, fără


atribuire de nume constrângerii:
CREATE TABLE departamente(
cod_dept NUMBER(2),
nume_dept VARCHAR2(14) UNIQUE
locatie VARCHAR2(13) );
** creare tabel cu definire constrângere UNIQUE la nivel de coloană, cu
atribuire de nume constrângerii:

CREATE TABLE departamente(


cod_dept NUMBER(2),
nume_dept VARCHAR2(14) CONSTRAINT departamente_nume_dept_uk UNIQUE
locatie VARCHAR2(13) );
29
Constrângeri de domeniu
-exemple-
** creare table cu definire constrângere UNIQUE la nivel de tabel fără atribuire
de nume constrângerii:

CREATE TABLE departamente(


cod_dept NUMBER(2),
nume_dept VARCHAR2(14),
locatie VARCHAR2(13),
UNIQUE (nume_dept) );

** creare table cu definire constrângere UNIQUE la nivel de tabel cu atribuire


de nume constrângerii:

CREATE TABLE departamente(


cod_dept NUMBER(2),
nume_dept VARCHAR2(14),
locatie VARCHAR2(13),
CONSTRAINT nume_dept_uk UNIQUE (nume_dept));

30
Constrângerea de integritate a
entităţii (PRIMARY KEY)
• Această constrângere poate fi definită la nivel de coloană sau
tabel şi precizează cheia primară a tabelului. Cheia primară
este reprezentată de o coloană sau o mulţime de coloane
care identifică în mod unic o linie din tabel. O cheie primară
compusă poate fi definită doar la nivel de tabel.
• Constrângerea PRIMARY KEY impune unicitatea valorilor
coloanei sau combinaţiei de coloane şi asigură că nicio
coloană care face parte din cheia primară nu poate conţine
valoarea null.
• Un tabel poate avea o singură cheie primară, deci o singură
constrângere PRIMARY KEY, dar poate avea mai multe
constrângeri UNIQUE.
• Serverul Oracle creează în mod automat câte un index unic
pentru fiecare coloană a constrângerii PRIMARY KEY.

31
Constrângerea de integritate a
entităţii (PRIMARY KEY) - exemple
**se creează tabelul stud care are coloana nr_matricol cu atributul de cheie primară (cu
numele nr_matricol_pk) definită la nivel de coloană:

CREATE TABLE stud (


nr_matricol NUMBER(4) CONSTRAINT nr_matricol_pk PRIMARY KEY,
nume VARCHAR2(10),
adresa VARCHAR2(20));

**se creează tabelul stud care are coloana nr_matricol cu atributul de cheie primară (cu
numele nr_matricol_pk) definită la nivel de tabel:

CREATE TABLE stud (


nr_matricol NUMBER(4),
nume VARCHAR2(10),
adresa VARCHAR2(20),
CONSTRAINT nr_matricol_pk PRIMARY KEY(nr_matricol));

32
Constrângerea de integritate
referenţială (cheie străină)
• Această constrângere poate fi definită la nivel de
coloană sau tabel şi asigură coerenţa între cheile
primare şi cheile străine corespunzătoare.
• Constrângerea FOREIGN KEY desemnează o coloană
sau o combinaţie de coloane drept cheie străină
(externă) şi stabileşte relaţia cu o cheie primară sau o
cheie unică din acelaşi tabel sau din altul. O cheie
străină (externă) compusă poate fi definită doar la nivel
de tabel.
• Cheia externă se defineşte în tabelui „copil”, iar tabelul
care conţine coloana referită reprezintă tabelul „parinte”.
• Valoarea unei chei externe trebuie să fie egală cu o
valoare existentă în coloana cu care se face referirea din
tabelul „părinte” sau să fie null. 33
Constrângerea de integritate
referenţială- exemple
**se creează tabelul note care are coloana nr_matricol cu atributul de cheie
străină (cu numele nr_matricol_fk) definită la nivel de tabel:

CREATE TABLE note (


nr_matricol NUMBER(4),
disciplina VARCHAR2(10),
nota NUMBER(2),
CONSTRAINT nr_matricol_fk FOREIGN KEY(nr_matricol) REFERENCES
stud(nr_matricol));

**se creează tabelul note care are coloana nr_matricol cu atributul de cheie
străină (cu numele nr_matricol_fk) definită la nivel de coloana:

CREATE TABLE note2 (


nr_matricol NUMBER(4) CONSTRAINT nr_matricol_fk REFERENCES
stud(nr_matricol),
disciplina VARCHAR2(10),
nota NUMBER(2) );
34
Vizualizarea constrângerilor
Definiţiile şi numele constrângerilor definite pot fi consultate prin
interogarea vederilor USER_CONSTRAINTS şi ALL_CONSTRAINTS
din dicţionarul datelor.

**afişarea numelui, tipului de constrângere şi a condiţiilor de căutare


corespunzătoare constrângerilor definite asupra tabelului angajaţi
creeat mai sus :
SELECT constraint_name, constraint_type, search_condition
FROM USER_CONSTRAINTS
WHERE table_name='ANGAJATI';

**afişarea numelor constrângerilor şi a coloanelor asociate acestora:

SELECT CONSTRAINT_NAME, COLUMN_NAME


FROM USER_CONS_COLUMNS
WHERE table_name='ANGAJATI';
35
Adăugarea constrângerilor în
ALTER TABLE
Adăugarea/ eliminarea unei constrângeri poate fi făcută şi cu ajutorul
comenzii ALTER TABLE.

ALTER TABLE nume_tabel


ADD [CONSTRAINT nume_constrangere] tip_constrangere(nume_coloana);

ALTER TABLE nume_tabel


DROP PRIMARY KEY | UNIQUE (nume_coloana) | CONSTRAINT
nume_constrangere;

Constrângerea NOT NULL poate fi introdusă asupra unei coloane


existente folosind clauza MODIFY a comenzii ALTER TABLE. Această
constrângere poate fi impusă numai atunci când tabelul este vid
sau când coloana respectivă conţine valori pe toate liniile tabelului.
Activarea sau dezactivarea unei constrângeri poate fi făcută tot cu
ajutorul comenzii ALTER TABLE:
ALTER TABLE nume_tabel
ENABLE | DISABLE CONSTRAINT nume_constrangere; 36

S-ar putea să vă placă și