Documente Academic
Documente Profesional
Documente Cultură
Sublimbajul DML
Instrucţiunea SQL SELECT
› Clauza SELECT
Predicatul DISTINCT
› Clauza FROM
Operatorul INNER JOIN
› Clauza WHERE
Operatori pentru şiruri de caractere
› Clauza ORDER BY
› Valori nule
ebautu@univ-ovidius.ro 28.03.2021 2
IBM SEQUEL language, redenumit Structured
Query Language
Majoritatea SGBD oferă SQL92, plus diferite
trăsături introduse ulterior
› Diverse caracteristici proprietare, în funcție de SGBD
Standarde ANSI și ISO
› SQL-86, SQL-89, SQL-92, SQL:1999, SQL:2003, SQL:2008
Folosit în mod interactiv la prompt sau prin
interfaţă grafică, sau embedded în
programare
Limbaj declarativ (neprocedural)
› Fundamente teoretice: Algebra relaţională (curs 8)
ebautu@univ-ovidius.ro 28.03.2021 3
DDL – Data Definition Language
› Instrucţiuni pentru crearea de scheme de baze de date
CREATE TABLE/VIEW, ALTER, DROP TABLE, RENAME …
DML – Data Manipulation Language
› Instrucţiuni pentru manipularea datelor (instanţelor)
SELECT
INSERT, UPDATE, DELETE
Alte comenzi, in fct. de SGBD :
› pentru indecsi, triggers, constraints, views, transactions,
authorization
› ORACLE:
Data Control (GRANT, REVOKE)
Transaction Control Language (COMMIT, ROLLBACK, ...)
ebautu@univ-ovidius.ro 28.03.2021 4
SELECT [DISTINCT | ALL] {* |
[expresie_coloana [AS <nume_nou>]] [,...] }
FROM <nume_tabel> [alias] [, ...]
[WHERE conditie]
[GROUP BY lista_coloane]
[HAVING conditie]
[ORDER BY exp1 [ASC/DESC] [,exp2...]]
Convenţiile de sintaxă în acest format sunt
următoarele:
› <> reprezintă o variabilă de substituţie
› | reprezintă disjuncţia (sau)
› […] reprezintă elemente opţionale
› {…|…|…} reprezintă exact un element din listă
ebautu@univ-ovidius.ro 28.03.2021 5
O interogare SQL tipică este de forma
› Ai reprezintă atribute
› ri reprezintă relații
› P este un predicat (ce reprezintă o condiție).
ebautu@univ-ovidius.ro 28.03.2021 7
ebautu@univ-ovidius.ro 28.03.2021 8
LOCALITATI JUDETE
IdJudet DenJudet CodAuto Tara Resedinta
IdLocalit DenLocal CodPost
Judet 2 Constanta CT 1 2
ate itate al
3 Bucure 4 0 4 Bucuresti B 1 3
sti 6 Vaslui Vs 1 8
4 Paris 3 75 7 Calarasi 1
5 Satu 2 907204
Nou
8 Alsace 2 7
6 Satu 2 907217
Nou
10 Dolj 1
7 Strasbo 8 67000
urg
8 Vaslui 6 731 11 Timis 1
9 Barlad 6 730
12 Lazio 6
11 Roma 12 030
ebautu@univ-ovidius.ro 28.03.2021 9
PERSOANE TARI
CodAut
IdT Capital
DenTara PrefixTel oIntern
Id ara a
ational
Pe
rs Locali 1 Romania 40 Ro 3
DataNast
o Nume Prenume tateN CNP
erii 2 Franta F 4
a astere
n
a
3 Bulgaria
1 Popescu Irina 3 12345678912 01.01.198
3 0
4 Grecia
2 Popescu Madalina 9 12312312312 02.02.199
31 0
5 Spania
3 Ionescu Vrgil 2 98765432112 03.03.201
34 0
6 Italia It 11
4 Popescu Irina 11 81231231231 04.04.201
23 5
7 Canada
ebautu@univ-ovidius.ro 28.03.2021 10
Vom considera, în cele ce urmează, tabelele de mai jos:
› PERSOANE: IdPersoana, Nume, Prenume, CNP, LocalitateNastere
LocalitateNastere este cheie straina ce referă câmpul
IdLocalitate din tabela LOCALITATI
› LOCALITATI: IdLocalitate, DenLocalitate, Judet, CodPostal
Judet este cheie straină ce referă câmpul IdJudet din JUDETE
› JUDETE: IdJudet, DenJudet, CodAuto, Tara, Resedinta
Tara este cheie străină ce referă câmpul IdTara din TARI
Resedinta este cheie straina ce refera câmpul IdLocalitate din
LOCALITATI
› TARI: IdTara, DenTara,PrefixTel, CodAutoInternational, Capitala
Capitala este cheie straină ce referă câmpul IdLocalitate din
LOCALITATI
ebautu@univ-ovidius.ro 28.03.2021 11
Listează atributele dorite în rezultatul
interogării
Observații
› SQL este case Insensitive
E.g. Nume ≡ NUME ≡ nume
ebautu@univ-ovidius.ro 28.03.2021 12
SQL admite duplicate în rezultatele interogării.
Cuvântul cheie ALL - nu se dorește
eliminarea duplicatelor (este implicit)
SELECT ALL nume
FROM PERSOANE;
ebautu@univ-ovidius.ro 28.03.2021 13
Dacă în clauza SELECT sunt listate mai multe atribute, atunci
combinația valorilor acestor atribute trebuie să fie unică
pentru ca o înregistrare să fie inclusă în rezultatul interogării.
› SELECT nume, prenume FROM PERSOANE;
› SELECT DISTINCT nume, prenume FROM PERSOANE;
Duplicatele sunt eliminate la sfarsit, inainte de executarea
ordonarii
Query1
nume prenume Query1
Popescu Irina
nume prenume
Popescu Madalina
Ionescu Vrgil Ionescu Vrgil
Popescu Madalina
ebautu@univ-ovidius.ro 28.03.2021 14
Cuvantul cheie DISTINCTROW omite
inregistrari duplicate (adica duplicatele sa
fie pe intreaga inregistrare, nu doar pe
campurile selectate)
› Eliminarea duplicatelor se efectureaza inaintea
efectuarii operatiilor de JOIN
Daca se selecteaya date dintr+o singura
tabela, cuv DISTINCTROW este ignorat
Are efect doar daca se selecteaza date
dintr+una din tabelele (care neaparat tb sa
fie mai multe) din clauza FROM
ebautu@univ-ovidius.ro 28.03.2021 15
TOP n (percent): Se obtin doar primele n
(procente) rezultate din interogare (în
ordinea dată de ORDER BY)
› Nu face distinctie intre valori egale (TOP 25
returneaza 26 de randuri daca a 26+a este
egala cu a 25-a)
Alte variante:
› MySQL: LIMIT n
› ORACLE: WHERE Rownum <n
ebautu@univ-ovidius.ro 28.03.2021 16
Un asterisc (*) în clauza SELECT înseamnă
listarea tuturor atributelor
SELECT * FROM PERSOANE;
ebautu@univ-ovidius.ro 28.03.2021 17
Clauza SELECT poate conține și expresii
aritmetice ce implică operatorii uzuali și
au ca operanzi constante sau atribute
ale relațiilor din clauza FROM
› Expresii pot conţine si funcţii oferite de SGBD
Operatori:
› Aritmetici uzuali: +, - (pentru tipurile numerice
si pt DATE/TIME), *, /
› Pentru siruri de caractere: operator de
concatenare & (|| în Oracle)
ebautu@univ-ovidius.ro 28.03.2021 18
Afisaţi lista persoanelor cu anul nasterii
fiecareia:
SELECT nume, prenume, year(DataNasterii)
as AnulNasterii
FROM PERSOANE;
ebautu@univ-ovidius.ro 28.03.2021 20
Afişaţi lista persoanelor cu varsta peste 18 ani.
SELECT Nume, (Now() – DataNasterii)/365 as Varsta
FROM PERSOANE
WHERE (Now() – DataNasterii)/365 >= 18;
ebautu@univ-ovidius.ro 28.03.2021 23
Operatorul “,” folosit în clauza
FROM înseamnă produs cartezian
între relaţiile respective
De exemplu: interogarea
următoare listează toate
perechile posibile de persoana-
localitate
ebautu@univ-ovidius.ro 28.03.2021 24
Rezultatul produsului cartezian este o mega.relaţie ce
conţine toate atributele din ambele tabele si conţine, ca
înregistrări, toate perechile posibile dintre înregistrările din
prima tabelă şi înregistrările din a doua tabelă
SELECT * FROM PERSOANE p, LOCALITATI l;
ebautu@univ-ovidius.ro 28.03.2021 25
Produsul cartezian nu este, in general, util în mod direct.
Dar este util în combinaţie cu condiţii în clauza where
Ar avea, poate, mai mult sens sa avem perechi de
tipul persoana-localitate in care s-a nascut…
Asta înseamnă că pastrăm doar acele linii din produsul
cartezian care conţin perechi dintre o persoană şi
localitatea care are IDul egal cu valoarea
LocalitateNastere
SELECT *
FROM PERSOANE p, LOCALITATI l
WHERE p.LocalitateNastere = l.IdLocalitate;
ebautu@univ-ovidius.ro 28.03.2021 26
Să afișăm o listă a localităților și a
județului din care aceste localități fac
parte.
› Fiecare localitate (inregistrare din
LOCALITATI) are atributul Judet provenit din
functia Judet, care asociaza localitatii
judetul din care provine.
› Asadar, pentru ca o pereche de tuple din
produsul cartezian LOCALITATI x JUDETE sa
contina informatii coerente, campul Judet
trebuie sa coincida cu IdJudet.
ebautu@univ-ovidius.ro 28.03.2021 27
SELECT * FROM LOCALITATI as l, JUDETE as j;
ebautu@univ-ovidius.ro 28.03.2021 28
Rezultatul operaţiei de INNER JOIN: o relaţie ce
are toate atributele relaţiilor implicate
Ca înregistrări: sunt selectate, din produsul
cartezian a doua tabele, inregistrarile care au
aceleasi valori pe doua campuri
› De obicei, campurile implicate in JOIN sunt legate prin
semnificatia de cheie straina (un camp e cheie
primara intr-o tabela si celalalt este atribut cheie
straina in cealalta)
ebautu@univ-ovidius.ro 28.03.2021 29
Instructiunea
SELECT * FROM LOCALITATI as l, JUDETE as j
WHERE l.Judet = j.IdJudet;
se scrie echivalent
SELECT *
FROM LOCALITATI as l INNER JOIN JUDETE as j
ON l.Judet = j.IdJudet;
ebautu@univ-ovidius.ro 28.03.2021 30
Multimea judetelor si resedinta lor de judet
Instructiunea
SELECT * FROM LOCALITATI as l, JUDETE as j
WHERE j.Resedinta = l.IdLocalitate;
se scrie echivalent
SELECT *
FROM LOCALITATI as l INNER JOIN JUDETE as j
ON j.Resedinta = l.IdLocalitate
ebautu@univ-ovidius.ro 28.03.2021 31
Mulţimea persoanelor cu informaţii
complete despre localitatea lor de
naştere
SELECT *
Query1
FROM PERSOANE p INNER JOIN LOCALITATI l
IdPersoan Localitate DataNast IdLocalitat DenLocali
Nume Prenume CNP Judet CodPostal
a Nastere erii e tate
ON p.LocalitateNastere = l.IdLocalitate;
1 Popesc Irina 3 1234567 01.01.19 3 Bucures 4 0
u 89123 80 ti
2 Popesc Madalin 9 1231231 02.02.19 9 Barlad 6 730
u a 231231 90
3 Ionescu Vrgil 2 9876543 03.03.20 2 Consta 2 900
211234 10 nta
4 Popesc Irina 11 8123123 04.04.20 11 Roma 12 030
u 123123 15
ebautu@univ-ovidius.ro 28.03.2021 32
Afișați mulțimea localităților și informaţii
despre județul din care acestea fac
parte.
SELECT DenLocalitate, DenJudet
FROM LOCALITATI INNER JOIN JUDETE
ON
LOCALITATI.Judet = JUDETE.IdJudet
ebautu@univ-ovidius.ro 28.03.2021 33
Aflați informații despre localitățile din județul
Vaslui.
Se cer denumirea localității și codul poștal al
acesteia.
Query1
DenLocalitate DenJudet
Vaslui Vaslui
Barlad Vaslui
ebautu@univ-ovidius.ro 28.03.2021 34
SQL permite redenumirea de relații, atribute folosind cuvântul
cheie AS (care, de altfel, este opțional și poate fi omis)
SELECT *
FROM LOCALITATI as L INNER JOIN JUDETE as J ON L.Judet =
J.IdJudet;
Echivalent cu
SELECT L.DenLocalitate Localitatea, j.DenJudet Judetul
FROM LOCALITATI L INNER JOIN JUDETE J ON L.Judet = J.IdJudet
ebautu@univ-ovidius.ro 28.03.2021 35
Unele înregistrări pot conţine câmpuri goale
(unele atribute să nu aibă valori). Acestea
se numesc valori null
› Valoare necunoscuta, temporar necunoscuta,
sau inaplicabila
Rezultatul oricărei operaţii aritmetice în
care participă un null este null.
› Exemplu: 5 * null se evaluează la null
Query1
Spania
Exemplu: Selectaţi DenTara
mulţimea ţărilor cu 11
Bulgaria
Italia
capitala necunoscută. Canada Grecia
SELECT DenTara FROM
TĂRI Spania
NULL
ebautu@univ-ovidius.ro 28.03.2021 37
Orice compaţie cu null returnează unknown
› Exemple: 5 < null sau null <> null sau null = null
Expresiile logice ce conţine unknown se evaluează
› OR: (unknown OR true) = true,
(unknown OR false) = unknown
(unknown OR unknown) = unknown
› AND: (true AND unknown) = unknown,
(false AND unknown) = false,
(unknown AND unknown) = unknown
› NOT: (NOT unknown) = unknown
În clauza WHERE, predicatele sunt tratate ca FALSE dacă se
evaluează la unknown
ebautu@univ-ovidius.ro 28.03.2021 38
Operatorul de comparație pentru șiruri de
caractere este LIKE : testează potrivirea şirurilor
de caractere cu şabloane, construite cu
› * – semnifică orice șir de caractere
› ? – semnifică un singur caracter
Dacă cele două simboluri speciale trebuiesc
interpretate ca atare se utilizează caracterul
ESCAPE: \* şi \?
ebautu@univ-ovidius.ro 28.03.2021 39
Afișați mulțimea localităților al căror nume începe cu ‘S’.
SELECT * FROM LOCALITATI WHERE DenLocalitate LIKE ‘S*’;
Query1
IdLocalitate DenLocalitate Judet CodPostal
5 Satu Nou 2 907204
6 Satu Nou 2 907217
7 Strasbourg 8 67000
ebautu@univ-ovidius.ro 28.03.2021 41
Operatorul BETWEEN …AND
› Pentru date numerice şi date calendaristice
ebautu@univ-ovidius.ro 28.03.2021 42
SELECT Nume, Prenume, DataNasterii
FROM PERSOANE
WHERE DataNasterii BETWEEN #1/1/1999#
AND #1/1/2017#;
Query1
ebautu@univ-ovidius.ro 28.03.2021 43
Operatorul IN – implementează
apartenența la o mulțime
› Atribut IN (mulțime de valori)
Exemplu
SELECT * FROM LOCALITATI
WHERE DenLocalitate IN (‘Vaslui’,
‘Iasi’);
Query1
IdLocalitate DenLocalitate Judet CodPostal
8 Vaslui 6 731
ebautu@univ-ovidius.ro 28.03.2021 44
Aflați informații despre toate localitațile din
județul Vaslui.
ebautu@univ-ovidius.ro 28.03.2021 45
Există şi SELECT * FROM LOCALITATI
operatorul WHERE DenLocalitate
combinat NOT NOT IN (‘Vaslui’,‘Iasi’);
IN
Query1
Returnează Jude
IdLocalitate DenLocalitate CodPostal
FALSE dacă t
2 Constanta 2 900
valoarea primului 3 Bucuresti 4 0
operand nu face 4 Paris 3 75
parte din lista 5 Satu Nou 2 907204
specificată de al 6 Satu Nou 2 907217
specificarea
DenLo
IdLoca CodPo IdJude DenJu CodA Resedi
calitat Judet Tara
litate stal t det uto nta
e
de criterii de 9 Barlad 6 730 6 Vaslui Vs 1 8
SELECT *
6 Satu 2 907217 2 Const CT 1 2
FROM LOCALITATI Nou anta
DESC;
ebautu@univ-ovidius.ro 28.03.2021 47
In clauza ORDER BY se listează atribute
după care se doreşte efectuarea
ordonării rezultatelor interogării
Implicit ordonarea este in ordine
crescătoare
Dacă se dorește ordine descrescătoare
se specifică prin cuvântul cheie DESC
Se pot folosi mai multe atribute în
această clauză (implică sortarea după
mai multe criterii)
ebautu@univ-ovidius.ro 28.03.2021 48
Lista localităţilor cu Query1
g
8 Vaslui 6 731 6 Vaslui Vs 1 8
ebautu@univ-ovidius.ro 28.03.2021 49
SELECT *
FROM PERSOANE
ORDER BY Nume,Prenume, DataNasterii DESC;
› Daca ar exista mai multe persoane cu același nume,
acestea ar fi ordonate alfabetic în ordine
lexicografică (De la ‘a’ la ‘z’) dupa prenume.
› Dacă ar exista mai multe persoane cu același nume și
același prenume, atunci acestea ar fi ordonate în
ordine descrescătoare a datei de naștere (cei născuți
cel mai recent vor fi listați în rezultat înaintea celor
născuți anterior lor).
Query1
LocalitateN
IdPersoana Nume Prenume CNP DataNasterii
astere
3 Ionescu Vrgil 2 9876543211 03.03.2010
234
1 Popescu Irina 3 1234567891 01.01.1980
23
2 Popescu Madalina 9 1231231231 02.02.1990
231
ebautu@univ-ovidius.ro 28.03.2021 50
In SQL sunt definite următoarele operații
cu mulțimi
› UNION, INTERSECT, EXCEPT
› Trebuie folosit între relații cu același număr de
atribute, și cu domenii compatibile ale
atributelor
› IMPORTANT În rezultatele operaţiilor cu mulţimi
sunt eliminate (implicit) duplicatele!
ebautu@univ-ovidius.ro 28.03.2021 53
Limbajul SQL
Sublimbajul DML
Instrucţiunea SQL SELECT
› Clauza SELECT
Predicatul DISTINCT
› Clauza FROM
Operatorul INNER JOIN
› Clauza WHERE
Operatori pentru şiruri de caractere
› Clauza ORDER BY
› Valori nule
ebautu@univ-ovidius.ro 28.03.2021 54
https://www.techonthenet.com/access/
functions/
“Database System Concepts”, Avi
Silberschatz, Henry F. Korth, S. Sudarshan,
McGraw-Hill, January 28, 2010.
› http://codex.cs.yale.edu/avi/db-book/
“Baze de date” – curs (Facultatea de
Informatică, Univ. Al. I. Cuza, Iași)
› Profesori: Victor Felea, Mihaela Breabăn,
Cosmin Vârlan
ebautu@univ-ovidius.ro 28.03.2021 55