Sunteți pe pagina 1din 9

Limbaje relaţionale pentru definirea şi manipularea datelor. Limbajul SQL.

CURS 6 BAZE DE DATE


SGBD relaţionale oferă seturi de comenzi speciale pentru descrierea, respectiv pentru manipularea datelor.
Acestea pot face parte din acelaşi limbaj sau pot face parte din limbaje separate.
În funcţie de domeniul din teoria relaţională pe care se bazează, limbajele relaţionale se pot clasifica în:
◦ Limbaje bazate pe calculul relaţional: QUEL - INGRES, PostgreSQL
◦ Limbaje bazate pe algebra relaţională: ISBL (Information System Based Language)
◦ Limbaje bazate pe transformare: SQL (Structured Query Language)
◦ Limbaje bazate pe grafică: QBE (Query by Example)
Limbajul SQL
SQL (Structured Query Language) este un limbaj de descriere şi manipulare acceptat de toate sistemele de gestiune a
bazelor de date relaţionale.
Atât ANSI (American National Standards Institute), cât şi ISO (International Standards Organization) îl consideră drept
un standard pentru limbajele de interogare a bazelor de date relaţionale.
Limbajul pentru definirea datelor (LDD)
• Descrierea datelor este stocată în dicţionarul BD.
• Comenzile LDD pot fi clasificate în funcţie de nivelul
de organizare a datelor la care acţionează: nivel
conceptual
• nivel logic
• nivel fizic

Crearea tabelelor: si parametri de stocare?


În general, crearea unei tabele constă din:
◦ definirea coloanelor
◦ definirea restricţiilor de integritate
◦ specificarea parametrilor de stocare
CREATE TABLE [nume_schema.] nume_tabelă
(
nume_coloana_1 tip_date [DEFAULT expresie],

nume_coloana_2 tip_date [DEFAULT expresie]
); ◦ cu indicarea restricţiilor la nivel de
Structura unei tabele poate fi creată în coloană
următoarele moduri: ◦ cu indicarea restricţiilor la nivel de
◦ fără indicarea restricţiilor de tabelă
integritate ◦ prin copiere din altă tabelă

Notă: variantele 2 şi 3 pot fi utilizate împreună pentru crearea unei tabele


• Restricţiile de integritate:
 pot fi create odată cu tabela sau după crearea acesteia
 pot fi activate sau dezactivate în funcţie de necesităţi (implicit sunt active)
 pot fi specificate la nivel de coloană sau la nivel de tabelă (cu excepţia NOT NULL)
 au ataşat un nume intern unic (specificat explicit de utilizator sau atribuit automat de sistem)
 asigură faptul că valorile unei coloane satisfac o condiţie declarată
 previn ştergerea unei tabele dacă există dependenţe
• Restricţiile de integritate în Oracle:

• Restricţia PRIMARY KEY (col respectiva unica si not null )ataşată unui ansamblu de coloane (definirea de
cheie primară compusă) poate fi definită numai la nivel de tabelă. Daca specific 2,3 coloane primary key, nu
pot defini inline.
*Restricţia NOT NULL poate fi definită numai la nivel de coloană. Altfel, o introduc doar prin check: check nume if
not null;;;; NOT NULL- definita in linie cu coloana: fara check, la nivel de tabela: cu check, pt ca in esenta asta face
• Restricţia CHECK la nivel de coloană nu poate referi alte coloane ale aceleiaşi tabele. Definită la nivel de
tabelă, însă, restricţia poate face referire la una sau mai multe coloane.
 Restricţia FOREIGN KEY (face ref la alta tabela) poate fi definită cu opţiunile:
*ON DELETE CASCADE – ştergerea unei înregistrări din tabela parinte este autorizată şi implică ştergerea
automată a înregistrărilor corespondente din tabela copil; (sterg dep 50, se sterg si angajatii din el)
*ON DELETE SET NULL – ştergerea unei înregistrări din tabela parinte este autorizată şi implică transformarea
în valori NULL a valorilor cheii externe din înregistrările corespondente aflate în tabela copil. (sterg dep 50, angajatii
respectivi au null la dep)

1. Fără indicarea restricţiilor de integritate 2. Cu indicarea restricţiilor de integritate la nivel de


CREATE TABLE angajati coloană
( CREATE TABLE angajati
marca NUMBER(4), (
nume VARCHAR2(20), marca NUMBER(4) CONSTRAINT pkAng PRIMARY KEY,
prenume VARCHAR2(20), nume VARCHAR2(20) NOT NULL,
email VARCHAR2(20), prenume VARCHAR2(20) NOT NULL,
data_angajare DATE DEFAULT SYSDATE, email VARCHAR2(20) CONSTRAINT uqMail UNIQUE
salariu NUMBER(8,2), CONSTRAINT ckMail CHECK (email
id_departament NUMBER(3) LIKE '%@%.%'),
); data_angajare DATE DEFAULT SYSDATE,
salariu NUMBER(8,2), ON DELETE CASCADE
id_departament NUMBER(3) CONSTRAINT );
fkDep REFERENCES departamente (id_departament)

3. Cu indicarea restricţiilor de integritate la nivel de tabelă


CREATE TABLE angajati ( CONSTRAINT uqMail UNIQUE (email),
marca NUMBER(4), CONSTRAINT ckMail CHECK (email LIKE '%@%.%'),
nume VARCHAR2(20), CONSTRAINT nnNume CHECK (nume IS NOT NULL),
prenume VARCHAR2(20), CONSTRAINT nnPrenume CHECK (prenume IS NOT
email VARCHAR2(20), NULL),
data_angajare DATE DEFAULT SYSDATE, CONSTRAINT fkDep FOREIGN KEY(id_departament)
salariu NUMBER(8,2), REFERENCES departamente (id_departament)
id_departament NUMBER(3), ON DELETE CASCADE );
CONSTRAINT pkAng PRIMARY KEY (marca),

4. Prin copierea structurii și a înregistrărilor din altă tabelă


CREATE TABLE angajati_noi
AS
SELECT * FROM angajati
WHERE data_angajare>TO_DATE ('01.01.2010', 'DD.MM.YYYY');
Notă: restricţiile de integritate existente în tabela angajaţi nu se păstrează şi în noua tabelă

Limbajul SQL-Oracle. Modificarea structurii tabelelor


Modificarea structurii unei tabele (ALTER TABLE) constă din:
◦ adăugarea unor coloane noi într-o tabelă existentă (eventual cu indicarea de restricţii sau de valori
implicite)
◦ modificarea coloanelor unei tabele
◦ specificarea unor restricţii pentru coloane existente
◦ activarea, dezactivarea sau suprimarea unor restricţii de integritate
◦ redenumiri ale coloanelor sau redenumirea tabelei

create table ang2 as select * from angajati where 4=67; copiaza coloane fara inreg
COPIA NU PASTREAZA RESTRICTII

Select * from user_constraints; --vad restrictiile

ALTER TABLE nume_tabela DROP (nume_coloana_1, nume_coloana_2);


ADD (nume_coloana_1 tip_data restrictie, ALTER TABLE nume_tabela
... nume_coloana_2 tip_data restrictie); ADD CONSTRAINT nume_restrictie tip_restrictie ….;
ALTER TABLE nume_tabela ALTER TABLE nume_tabela
MODIFY (nume_coloana_1 tip_data restrictie, DROP CONSTRAINT nume_restrictie;
... nume_coloana_2 tip_data restrictie); ALTER TABLE nume_tabela
ALTER TABLE nume_tabela DISABLE CONSTRAINT nume_restricţie;
RENAME COLUMN nume_coloana TO ALTER TABLE nume_tabela
nume_nou_coloana; ENABLE CONSTRAINT nume_restricţie;
ALTER TABLE nume_tabela ALTER TABLE nume_tabela
DROP COLUMN nume_coloana; RENAME TO nume_nou_tabelă;
ALTER TABLE nume_tabela

• Vizualizarea structurii unei tabele se realizează prin comanda: DESCRIBE nume_tabela;


Ştergerea restricţiei de cheie primară se poate realiza prin comanda: ALTER TABLE nume_tabela DROP PRIMARY KEY;
• În cazul în care se încearcă ştergerea unei chei primare referite de o cheie externă dintr-o tabelă copil,
această ştergere nu se poate efectua decât dacă în comanda ALTER apare opţiunea CASCADE:
ALTER TABLE nume_tabela DROP PRIMARY KEY CASCADE;
• Schimbarea definiţiei unei coloane din NULL în NOT NULL se poate realiza doar dacă există siguranţa că
fiecare linie a coloanei respective este NOT NULL sau dacă tabela nu are date.
• Reducerea dimensiunii unei coloane sau schimbarea tipului de dată al acesteia se pot efectua numai dacă
respectiva coloană nu conţine valori sau conţine doar valori NULL.

• Ştergerea unei tabele (DROP TABLE) presupune:


• ştergerea definiţiei sale din dicţionarul BD
• ştergerea indecşilor asociaţi tabelei
• ştergerea privilegiilor conferite în legătură cu tabela
• eliberarea spaţiului de memorie ocupat
• invalidarea funcţiilor, procedurilor, tabelelor virtuale, sinonimelor referitoare la tabelă
DROP TABLE nume_tabela;
Pentru a se permite ştergerea unei tabele referite într-o altă tabelă se utilizează comanda DROP cu opţiunea
CASCADE CONSTRAINTS, în scopul suprimării restricţiilor de referenţialitate:
DROP TABLE nume_tabela CASCADE
CONSTRAINTS;
O tabelă ștearsă se poate recupera
prin FLASHBACK
FLASHBACK TABLE nume_tabela TO BEFORE
DROP;

Utilizarea pseudocoloanelor în comenzile SQL:


ROWNUM, ROWID SELECT ROWNUM, id_angajat, nume, salariul
SELECT ROWNUM, id_angajat, nume, salariul FROM angajati
FROM angajati; ORDER BY salariul;
ROWNUM ID_ANGAJAT NUME SALARIUL ROWNUM ID_ANGAJAT NUME
---------- ---------- ------------------------- ---------- SALARIUL
1 100 King 24000,00 ---------- ---------- ------------------------- ----------
2 101 Kochhar 17000,00 33 132 Olson 2100,00
.............. 29 128 Markle 2200,00
.............

Utilizarea expresiilor în comenzile SQL:


◦ Pe lângă specificarea coloanelor, într-o comandă SELECT pot fi incluse şi expresii
◦ O expresie poate contine operatori, funcţii SQL
◦ Se poate asocia un alias pentru o expresie

SELECT id_angajat, nume, salariul


, salariul * 0.7 as salariul_brut
FROM angajati
WHERE comision IS NOT NULL
ORDER BY nume;
INTEROGAREA DATELOR
Utilizarea expresiilor în comenzile SQL este permisă în:
◦ lista de coloane a unei comenzi SELECT
◦ clauzele WHERE, HAVING şi ORDER BY dintr-o comandă SELECT
◦ clauza VALUES a unei comenzi INSERT
◦ clauzele SET şi WHERE ale unei comenzi UPDATE
◦ clauza WHERE a unei comenzi DELETE
SELECT id_angajat, nume, salariul, salariul * 0.7
FROM angajati
WHERE comision IS NOT NULL
AND salariul*0.7>16000
ORDER BY salariul*0.7 desc; ;;alias ul e recunoscut doar in order by

SELECT id_angajat, nume, salariul, salariul * 0.7 salariul_brut, nume ||’ ‘||prenume nume_complet
FROM angajati
WHERE comision IS NOT NULL
AND salariul*0.7>16000
ORDER BY nume; ;;alias ul e recunoscut doar in order by

ORDINE: from, where, select, order

Tabela DUAL
◦ tabelă existentă în orice BD Oracle, publica
◦ are o singură coloană: DUMMY de tip VARCHAR2(1)
◦ are o singură linie, conţinând valoarea x
◦ utilizată pentru testarea unor comenzi SELECT care nu fac referiri neapărat la o tabelă dintr-o BD
SELECT 1000* 1.5 FROM dual;
SELECT SYSDATE FROM dual;

Funcţii SQL
--care manipulează şiruri de caractere
SELECT UPPER('oracle'), LOWER('oracle'), INITCAP('oracle')
FROM dual;
UPPER('ORACLE') LOWER('ORACLE') INITCAP('ORACLE')
--------------- --------------- -----------------
ORACLE oracle Oracle
SELECT SUBSTR('oracle database',1,3), SUBSTR('oracle
database',-8,4)
FROM dual;
SUBSTR('ORACLEDATABASE',1,3) SUBSTR('ORACLEDATABASE',-8,4)
---------------------------- -----------------------------
ora data

SELECT CONCAT('Oracle ' ,'Database'),


LPAD('Oracle',15,'*'), RTRIM('Oracle****','*'),
TRIM(BOTH '*' FROM '**Oracle****'), LENGTH('Oracle'),
INSTR('Oracle Database','a',1,3)
FROM dual;
CONCAT('ORACLE','DATABASE') LPAD('ORACLE',15,'*') RTRIM('ORACLE****','*')
--------------------------- --------------------- -----------------------
Oracle Database *********Oracle Oracle
TRIM(BOTH'*'FROM'**ORACLE****' LENGTH('ORACLE')
------------------------------ ----------------
Oracle 6
INSTR('ORACLEDATABASE','A',1,3
------------------------------
11

SELECT REPLACE('oracle database','a'),


REPLACE('oracle database','a','*')
FROM dual;
REPLACE('ORACLEDATABASE','A') REPLACE('ORACLEDATABASE','A','
----------------------------- ------------------------------
orcle dtbse or*cle d*t*b*se

SELECT ROUND(3.148,2), TRUNC(3.148,2), MOD(11,3)


FROM dual;
ROUND(3.148,2) TRUNC(3.148,2) MOD(11,3)
-------------- -------------- ----------
3,15 3,14 2

SELECT SYSDATE, ROUND(SYSDATE,'MM'), ROUND(SYSDATE,'YY'), TRUNC(SYSDATE,'MM'), TRUNC(SYSDATE,'YY')


FROM dual;
SYSDATE ROUND(SYSDATE,'MM') ROUND(SYSDATE,'YY')
----------- ------------------- -------------------
21.11.2020 01.12.2020 01.01.2021
TRUNC(SYSDATE,'MM') TRUNC(SYSDATE,'YY')
------------------- -------------------
01.11.2020 01.01.2020
SELECT EXTRACT (YEAR FROM SYSDATE)
FROM dual;
EXTRACT(YEARFROMSYSDATE)
------------------------
2020
SELECT SYSDATE, NEXT_DAY(SYSDATE, 'Monday'),
LAST_DAY(SYSDATE)
FROM dual;
SYSDATE NEXT_DAY(SYSDATE,'VINERI') LAST_DAY(SYSDATE)
----------- -------------------------- -----------------
06.11.2020 09.11.2020 30.11.2020
SELECT ADD_MONTHS(SYSDATE,4),
MONTHS_BETWEEN(ADD_MONTHS(SYSDATE,4),SYSDATE)
FROM dual;
ADD_MONTHS(SYSDATE,4) MONTHS_BETWEEN(ADD_MONTHS(SYSD
--------------------- ------------------------------
06.03.2021 09:19:10 4

SELECT TO_NUMBER('$17,000.23', '$999,999.99')


FROM dual;
TO_NUMBER('$17,000.23','$999,99.99')
------------------------------------
17000,23
SELECT TO_CHAR(198, '$999,999.99')
FROM dual;
TO_CHAR(198,'$999,999.99')
--------------------------
$198.00

SELECT TO_CHAR(SYSDATE,'DAY, DD MONTH YYYY')


FROM dual;
TO_CHAR(SYSDATE,'DAY,DDMONTHYYYY')
----------------------------------
JOI , 21 NOIEMBRIE 2013
SELECT TO_CHAR(SYSDATE,'DD-MON-YYYY HH:MI:SS')
FROM dual;
TO_CHAR(SYSDATE,'DD-MON-YYYYHH
------------------------------
21-NOI-2013 01:11:02

SELECT TO_DATE('23-10-2010','DD-MM-YYYY')
FROM dual;
TO_DATE('23-10-2010','DD-MM-YY’)
---------------------------------
23.10.2010

SELECT 14+NULL-4, NVL(NULL,0), 14-NVL(NULL,0)-4


FROM dual;
14+NULL-4 NVL(NULL,0) 14-NVL(NULL,0)-4
---------- ----------- ----------------
0 10

SELECT nume, salariul+comision "Venit total"


FROM angajati
WHERE comision IS NULL;
NUME Venit total
------------------------- -----------
King
Kochhar
...
SELECT nume, salariul+NVL(comision,0) "Venit total"
FROM angajati
WHERE comision IS NULL;
NUME Venit total
------------------------- -----------
King 24000
Kochhar 17000
...

SELECT pret_lista, pret_min, NULLIF(pret_lista,pret_min)


FROM produse;
PRET_LISTA PRET_MIN NULLIF(PRET_LISTA,PRET_MIN)
---------- ---------- ---------------------------
221,00 180,00 221
73,00 73,00
299,00 244,00 299
399,00 355,00 399

SELECT denumire_produs,pret_lista,
CASE
WHEN pret_lista < 100 THEN 'pret mic '
WHEN pret_lista BETWEEN 100 AND 200 THEN 'pret mediu '
ELSE 'pret mare'
END Calificativ
FROM produse;
DENUMIRE_PRODUS PRET_LISTA CALIFICATIV
------------------------------------------------- ---------- -----------
DIMM - 128 MB 305,00 pret mare
DIMM - 16 MB 124,00 pret mediu
DIMM - 1GB 599,00 pret mare
Battery - EL 44,00 pret mic
.......

SELECT denumire_produs, categorie, pret_lista,


(CASE LOWER(categorie)
WHEN 'hardware4' THEN 0.2
WHEN 'hardware2' THEN 0.15
ELSE 0
END) * pret_lista Majorare_pret
FROM produse
WHERE LOWER(categorie) LIKE 'h%' ;
DENUMIRE_PRODUS CATEGORIE PRET_LISTA MAJORARE_PRET
--------------------- ------------------- ---------- -------------
DIMM - 128 MB hardware4 305,00 61
DIMM - 16 MB hardware2 124,00 24,8
.......

SELECT denumire_produs, categorie, pret_lista,


DECODE(LOWER(categorie),'hardware4' ,0.2,'hardware2' ,0.15,0)
* pret_lista Majorare_pret
FROM produse
WHERE LOWER(categorie) LIKE 'h%' ;
DENUMIRE_PRODUS CATEGORIE PRET_LISTA MAJORARE_PRET
--------------------- ------------------- ---------- -------------
DIMM - 128 MB hardware4 305,00 61
DIMM - 16 MB hardware2 124,00 24,8
.......

SELECT COUNT(*)
FROM angajati;
COUNT(*)
----------
107
SELECT COUNT(comision)
FROM angajati;
COUNT(COMISION)
---------------
35

SELECT COUNT(id_angajat)
FROM angajati;
COUNT(ID_ANGAJAT)
-----------------
107
SELECT COUNT(distinct comision)
FROM angajati;
COUNT(distinct COMISION)
---------------
7

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