Sunteți pe pagina 1din 55

 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 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

SELECT A1, A2, ..., An


FROM r1, r2, ..., rm
WHERE P

› Ai reprezintă atribute
› ri reprezintă relații
› P este un predicat (ce reprezintă o condiție).

 Rezultatul unei interogări este o relație.


ebautu@univ-ovidius.ro 28.03.2021 6
 Toate expresiile din clauza SELECT vor
genera cate o coloana in rezultat, in
ordinea aparitiei, cu nume unice
 Expresiile din SELECT pot fi
› constante,
› coloane din tabelele incluse in clauza FROM,
sau
› expresii algebrice arbitrare bazate pe
aceste coloane sau
› chiar alte (sub)interogari

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

2 Consta 2 900 3 Ile de 2 4


nta France

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

 Exemplu: Afişaţi o listă cu numele,


prenumele și CNP-ul tuturor persoanelor
SELECT nume, prenume, CNP
FROM PERSOANE;

 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;

 Pentru a forța eliminarea duplicatelor, se folosește


predicatul DISTINCT în clauza SELECT.
› Exemplu: Aflați numele tuturor persoanelor, cu
eliminarea duplicatelor
SELECT DISTINCT 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 Irina Popescu Irina

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;

›Afisati lista persoanelor si varsta lor in ani:


SELECT Nume, (Now() – DataNasterii)/365 as
Varsta
FROM PERSOANE;

Operatorul as realizează redenumirea unui atribut


sau a unei expresii în lista clauzei SELECT.
ebautu@univ-ovidius.ro 28.03.2021 19
 Specifică condiții care trebuie
satisfăcute de tuplii ce vor fi selectați ca
rezultat al interogării
› Expresiile pot folosi operatori de comparație,
expresii aritmetice
 Operatori de comparaţie =, >, >=, <, <=, <>
› În exprimarea condițiilor se pot folosi
operatorii logici AND, OR, NOT.

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;

 Observaţie. Standardul SQL nu admite folosirea alias-


urilor pentru coloane in clauza WHERE

 Aflaţi toţi angajaţii cu salariul mai mare de 5000.


SELECT *
FROM ANGAJATI
WHERE salariu > 5000;
ebautu@univ-ovidius.ro 28.03.2021 21
 Permite specificarea relațiilor implicate în
interogare
 Poate conţine (simplu) relaţii
› Sau Expresii cu relaţii, ce folosesc operatori
pentru relații, precum reuniune, intersecție,
diferență (Union, Intersect, Except)
› Sau expresii cu operaţii specifice bazelor de
date – operatori JOIN

 Nu toţi operatorii sunt implementaţi de


toate SGBDurile.
ebautu@univ-ovidius.ro 28.03.2021 22
 Pot apărea alte instrucțiuni SELECT ca și
operanzi în FROM
› Spunem ca sunt subinterogări (subqueries)
SELECT *
FROM (SELECT p.nume, p.prenume,
year(p.DataNasterii) as AnulNasterii
FROM PERSOANE p);

 În clauza FROM tabelele pot primi aliasuri,


pentru a uşura exprimarea interogării
SELECT p.nume, p.prenume, year(p.DataNasterii)
as AnulNasterii
FROM PERSOANE p;

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

SELECT p.Nume, l.DenLocalitate


FROM PERSOANE p, LOCALITATI l;

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;

SELECT * FROM LOCALITATI as l, JUDETE as j


WHERE l.Judet = j.IdJudet;

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

 Aflați mulțimea tărilor, pentru fiecare


tară listați și capitala ei.
SELECT DenTara, DenLocalitate as
Cap
FROM TĂRI INNER JOIN LOCALITATI ON
TARI.Capitala =
LOCALITATI.IdLocalitate

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.

SELECT l.DenLocalitate, j.DenJudet


FROM LOCALITATI l INNER JOIN JUDETE j on
l.Judet = j.IdJudet
WHERE j.denJudet Like "Vaslui";

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;

SELECT L.DenLocalitate as Localitatea, j.DenJudet as Judetul


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

În ORACLE, cuvantul cheie AS se va omite.


În alte SGBD, el poate să apară sau nu (este implicit).

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

 Pentru a testa dacă o valoare este null se


foloseşte predicatul IS NULL.
ebautu@univ-ovidius.ro 28.03.2021 36
Query1
 Exemplu: Selectaţi DenTara Capitala

mulţimea tărilor şi Romania 3

capitala lor. Franta 4

SELECT DenTara, Bulgaria


Capitala
FROM TĂRI Grecia

Query1
Spania
 Exemplu: Selectaţi DenTara

mulţimea ţărilor cu 11
Bulgaria
Italia
capitala necunoscută. Canada Grecia
SELECT DenTara FROM
TĂRI Spania

WHERE Capitala IS Canada

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 \?

 Observație. În alte implementări SQL (ca de ex


Oracle), caracterele sunt procent (%),
respectiv underscore ( _ ).

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

 Afișați mulțimea localităților al căror nume are a doua litera


‘a’:
SELECT * FROM LOCALITATI WHERE DenLocalitate LIKE ‘?a*’;
Query1
IdLocalitate DenLocalitate Judet CodPostal
4 Paris 3 75
5 Satu Nou 2 907204
6 Satu Nou 2 907217
8 Vaslui 6 731
ebautu@univ-ovidius.ro
9 Barlad 28.03.2021 6 730 40
 Șabloanele (cu care se fac comparaţii în
where) sunt case sensitive.
 Exemple
› ‘Intro*’ se potrivește cu orice șir care începe cu
“Intro”.
› ‘*Comp*’ se potrivește cu orice șir care conține
textul Comp ca subșir
› Șirul ‘???’ se potriveşte cu orice șir de exact 3
caractere
› Șirul ‘???*’ se potriveşte cu orice șir de cel puțin 3
caractere
 Operatori pentru șiruri de caractere
› Concatenare: & (în Oracle este || )

ebautu@univ-ovidius.ro 28.03.2021 41
 Operatorul BETWEEN …AND
› Pentru date numerice şi date calendaristice

X BETWEEN a AND b TRUE dacă a <= x <=b

› Operator ternar ce returnează TRUE dacă


primul operand satisface simultan >=a şi <=b,
unde a şi b sunt ceilalţi 2 operanzi

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

Nume Prenume DataNasterii

Ionescu Vrgil 03.03.2010


Popescu Irina 04.04.2015

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.

SELECT * FROM LOCALITATI


WHERE IdLocalitate IN (
SELECT IdLocalitate
FROM LOCALITATI INNER JOIN JUDETE
on Judet=IdJudet
WHERE DenJudet LIKE ‘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

doilea operand. 7 Strasbourg 8 67000


9 Barlad 6 730
11 Roma 12 030
ebautu@univ-ovidius.ro 28.03.2021 46
 Permite Query1

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

ordonare a 8 Vaslui 6 731 6 Vaslui Vs 1 8

tuplelor din 11 Roma 12 030 12 Lazio 6

rezultat 4 Paris 3 75 3 Ile de


France
2 4

SELECT *
6 Satu 2 907217 2 Const CT 1 2
FROM LOCALITATI Nou anta

INNER JOIN JUDETE 5 Satu


Nou
2 907204 2 Const
anta
CT 1 2

ON 2 Const 2 900 2 Const CT 1 2


anta anta
LOCALITATI.Judet 3 Bucure 4 0 4 Bucure B 1 3
= JUDETE.IdJudet sti sti
7 Strasb 8 67000 8 Alsace 2 7
ORDER BY DenJudet ourg

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

informaţii despre IdLocalit


ate
DenLoca
litate
Judet
CodPost
al
IdJudet
DenJude
t
CodAuto Tara
Resedint
a

judeţul în care se 9 Barla


d
6 730 6 Vaslu Vs
i
1 8

găsesc. Rezultatele 3 Bucu 4 0 4 Bucu B 1 3


sunt afişate în ordine resti resti

alfabetică dupa 2 Cons


tanta
2 900 2 Cons CT
tanta
1 2

DenLocaliţăţii. 4 Paris 3 75 3 Ile de 2 4


Fran
SELECT * ce
FROM LOCALITATI INNER 11 Rom 12 030 12 Lazio 6
a
JOIN JUDETE ON
LOCALITATI.Judet = 6 Satu 2 9072 2 Cons CT 1 2
Nou 17 tanta
JUDETE.IdJudet
5 Satu 2 9072 2 Cons CT 1 2
ORDER BY Nou 04 tanta
DenLocalitate; 7 Stras
bour
8 6700
0
8 Alsac
e
2 7

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!

› În MsAccess este implementat doar UNION


ebautu@univ-ovidius.ro 28.03.2021 51
 Dacă se doreşte păstrarea duplicatelor,
se vor folosi operatorii împreuna cu ALL:
UNION ALL, INTERSECT ALL, EXCEPT ALL

 Dacă un tuplu apare de m ori în r și n ori


în s, atunci:
› Tuplul apare de m + n ori în r union all s
› Tuplul apare de min(m,n) ori în r intersect all s
› Tuplul apare de max(0, m – n) ori în r except
all s
ebautu@univ-ovidius.ro 28.03.2021 52
Mulţimea localităţilor care au ca Query1
a doua literă pe ‘a’ sau pe ‘t’.
DenLocalitate
SELECT DenLocalitate Barlad
FROM LOCALITATI
WHERE Paris
(((LOCALITATI.[DenLocalitate Satu Nou
]) Like '?a*'))
UNION Strasbourg
SELECT DenLocalitate Vaslui
FROM LOCALITATI
WHERE
(((LOCALITATI.[DenLocalitate
]) Like '?t*'));

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

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