Baze de date

Transcription

Baze de date
Curs pentru specializările
Informatică anul II
Matematică-Informatică anul III
Semestrul I
Horea Oros, [email protected]
BAZE DE DATE
Limbajul SQL
 SQL este un limbaj standard pentru
accesarea bazelor de date
 MySQL, SQL Server, Access, Oracle, Sybase,
DB2
Sintaxa SQL
SELECT CompanyName, Country FROM Customers
WHERE Country <> 'USA‘
Company
Country
Island Trading
UK
Galería del gastrónomo
Spain
Laughing Bacchus Wine Cellars
Canada
Paris spécialités
France
Simons bistro
Denmark
Wolski Zajazd
Poland
SQL
 SQL este un limbaj standard pentru
accesarea și manipularea bazelor de date
 SQL – Structured Query Language
 SQL este un standard ANSI (American
National Standards Institute)
Ce poate face SQL










SQL poate executa interogări la baza de date
SQL poate extrage date din baza de date
SQL poate insera înregistrări în baza de date
SQL poate actualiza înregistrări în baza de date
SQL poate șterge înregistrări în baza de date
SQL poate crea noi baze de date
SQL poate crea noi tabele în baza de date
SQL poate crea proceduri stocate, funcții, triggere
SQL poate crea vizualizări în baza de date
SQL poate stabili permisiuni asupra entităților din
baza de date
SQL este un standard … DAR …
 Cu toate că SQL este standard ANSI, există
mai multe versiuni ale limbajului SQL
 Totuși, cel puțin comenzile principale
(SELECT, UPDATE, INSERT, DELETE) sunt
permise într-un mod aproape unitar de toate
implementările, pentru compatibilitate
RDBMS
 Avem nevoie de un sistem de gestiune a
bazelor de date.
 Microsoft SQL Server
 MySQL
 Oracle
 IBM DB2
 Microsoft Access
Tabele în bazele de date
 O bază de date conține cel puțin o tabelă
identificată prin nume.
 Tabelele conțin înregistrări cu date
P_Id
LastName
FirstName
Address
1
Hansen
Ola
Timoteivn 10 Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 Trei înregistrări, 5 câmpuri (coloane)
City
Instrucțiuni SQL
 Majoritatea operațiilor efectuate asupra
bazelor de date se fac cu comenzi/instrucțiuni
SQL
 SELECT * FROM Persons
 SQL nu ține cont de diferența dintre litere
mari și mici
 Unele SGBD-uri necesită caracterul ; după
instrucțiuni. Astfel se separă instrucțiunile
SQL pentru ca să se poată executa mai multe
instrucțiuni una după alta într-un singur batch
SQL DML și DDL (…DCL, TCL)
 DML - Data Manipulation Language –
comenzile pentru extragere și actualizare




SELECT - extrage date din baza de date
UPDATE - actualizează date în baza de date
DELETE - șterge înregistrări din baza de date
INSERT INTO - inserează date noi în baza de date
 DDL - Data Definition Language – comenzi
pentru creare/modificare bază de date,
tabele, indecși, stabilire legături între tabele,
constrângeri
SQL DML și DDL (…DCL, TCL)
cont.
 CREATE DATABASE
 ALTER DATABASE
 CREATE TABLE
 ALTER TABLE
 DROP TABLE
 CREATE INDEX
 DROP INDEX
Instrucțiunea SELECT
 Instrucțiunea SELECT se folosește pentru a
extrage date din baza de date
 Rezultatul este stocat într-un tabel-rezultat
numit result-set
 Sintaxa
 SELECT column_name(s) FROM table_name
SAU
 SELECT * FROM table_name
Exemplu SELECT
 SELECT * FROM Persons
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 SELECT LastName,FirstName FROM Persons
LastName
FirstName
Hansen
Ola
Svendson
Tove
Pettersen
Kari
Instrucțiunea SELECT
DISTINCT
 Într-o tabelă, unele coloane pot conține valori
duplicate. Asta nu e o problemă, totuși,
uneori vrem să listăm doar valorile diferite
(distincte) din tabelă.
 Cuvântul cheie DISTINCT poate fi folosit
pentru aceasta.
 Sintaxa
 SELECT DISTINCT column_name(s)
FROM table_name
Exemplu SELECT DISTINCT
 Vrem să selectăm valorile distincte din
coloana ‘City’
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 SELECT DISTINCT City FROM Persons
City
Sandnes
Stavanger
Clauza WHERE
 Folosită pentru a filtra înregistrări
 Folosită pentru a extrage doar înregistrările
care îndeplinesc un anumit criteriu
 Sintaxa
 SELECT column_name(s)
FROM table_name
WHERE column_name operator value
Exemplu clauza WHERE
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 SELECT * FROM Persons
WHERE City='Sandnes'
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
Ghilimele - apostroafe
 SQL folosește apostrof pentru a delimita valorile de tip
text/string
 Majoritatea SGBD-urilor acceptă și ghilimele
 Valorile numerice nu se delimitează cu
apostroafe/ghilimele
Corect:
SELECT * FROM Persons WHERE FirstName='Tove‘
SELECT * FROM Persons WHERE Year=1965
Greșit:
SELECT * FROM Persons WHERE FirstName=Tove
SELECT * FROM Persons WHERE Year='1965'
Operatori pentru clauza
WHERE
Operator
Descriere
=
Egalitate
<>
Inegalitate
>
Mai mare
<
Mai mic
>=
Mai mare sau egal
<=
Mai mic sau egal
BETWEEN
Într-un interval închis
LIKE
La fel ca un șablon
IN
O mulțime enumerată explicit
Operatorii AND și OR
 Se folosesc pentru a filtra înregistrările după
mai multe condiții
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 SELECT * FROM Persons WHERE
FirstName='Tove’ AND LastName='Svendson‘
P_Id
LastName
FirstName
Address
City
2
Svendson
Tove
Borgvn 23
Sandnes
Operatorii AND și OR (cont.)
 SELECT * FROM Persons WHERE
FirstName='Tove’ OR FirstName='Ola‘
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
 SELECT * FROM Persons WHERE
LastName='Svendson'
AND (FirstName='Tove' OR FirstName='Ola')
P_Id
LastName
FirstName
Address
City
2
Svendson
Tove
Borgvn 23
Sandnes
Clauza ORDER BY - sortare
 Cuvântul cheie ORDER BY se folosește pentru
a sorta rezultatul după o anumită coloană sau
coloane
 Ordonarea/sortarea se face în mod implicit
crescător
 Ordonarea descrescătoare – DESC
 Sintaxa:
 SELECT column_name(s)
FROM table_name
ORDER BY column_name(s) ASC | DESC
Clauza ORDER BY - exemplu
P_Id
LastName FirstName Address
City
1
Hansen
Ola
Sandnes
2
Svendson
Tove
Timoteivn
10
Borgvn 23
3
Pettersen
Kari
Storgt 20
Stavanger
4
Nilsen
Tom
Vingvn 23
Stavanger
Sandnes
 SELECT * FROM Persons
ORDER BY LastName
P_Id
LastName FirstName Address
City
1
Hansen
Ola
Sandnes
4
Nilsen
Tom
Timoteivn
10
Vingvn 23
3
Pettersen
Kari
Storgt 20
Stavanger
2
Svendson
Tove
Borgvn 23
Sandnes
Stavanger
Instrucțiunea INSERT INTO
 O folosim pentru a insera noi înregistrări într-
o tabelă
 Sintaxa (două variante)
 INSERT INTO table_name
VALUES (value1, value2, value3,...)
 INSERT INTO table_name (column1, column2,
column3,...)
VALUES (value1, value2, value3,...)
Exemplu INSERT INTO
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 INSERT INTO Persons
VALUES (4,'Nilsen', 'Johan', 'Bakken 2',
'Stavanger')
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
4
Nilsen
Johan
Bakken 2
Stavanger
Exemplu INSERT INTO
 Inserare de date doar în anumite coloane
 INSERT INTO Persons (P_Id, LastName,
FirstName) VALUES (5, 'Tjessem', 'Jakob')
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
4
Nilsen
Johan
Bakken 2
Stavanger
5
Tjessem
Jakob
Instrucțiunea UPDATE
 Se folosește pentru actualizarea unor date
dintr-o tabelă
 Sintaxa:
 UPDATE table_name
SET column1=value, column2=value2,...
WHERE some_column=some_value
 !!! Omiterea clauzei WHERE duce la
actualizarea tuturor înregistrărilor din tabelă
Instrucțiunea UPDATE exemplu
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
4
Nilsen
Johan
Bakken 2
Stavanger
5
Tjessem
Jakob
 UPDATE Persons
SET Address='Nissestien 67', City='Sandnes'
WHERE LastName='Tjessem' AND
FirstName='Jakob'
Instrucțiunea UPDATE –
exemplu - rezultatul
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
4
Nilsen
Johan
Bakken 2
Stavanger
5
Tjessem
Jakob
Nissestien 67
Sandnes
 UPDATE Persons
SET Address='Nissestien 67', City='Sandnes'
WHERE LastName='Tjessem' AND
FirstName='Jakob'
Instrucțiunea UPDATE – !!!
 UPDATE Persons
SET Address='Nissestien 67', City='Sandnes'
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Nissestien 67
Sandnes
2
Svendson
Tove
Nissestien 67
Sandnes
3
Pettersen
Kari
Nissestien 67
Sandnes
4
Nilsen
Johan
Nissestien 67
Sandnes
5
Tjessem
Jakob
Nissestien 67
Sandnes
Instrucțiunea DELETE
 O folosim pentru a șterge înregistrări dintr-o
tabelă
 Sintaxa:
 DELETE FROM table_name
WHERE some_column=some_value
 !!! Omiterea clauzei WHERE duce la ștergerea
tuturor înregistrărilor din tabelă
Instrucțiunea DELETE exemplu
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
4
Nilsen
Johan
Bakken 2
Stavanger
5
Tjessem
Jakob
Nissestien 67
Sandnes
 DELETE FROM Persons
WHERE LastName='Tjessem' AND
FirstName='Jakob'
Instrucțiunea DELETE –
exemplu - rezultatul
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
4
Nilsen
Johan
Bakken 2
Stavanger
 DELETE FROM Persons
WHERE LastName='Tjessem' AND
FirstName='Jakob'
Ștergerea tuturor
înregistrărilor
 DELETE FROM table_name
 SAU
 DELETE * FROM table_name
 Nu există UNDO pentru operația de ștergere
Baze de date
 Northwind
 Adventure Works
 World
 Limbaje de modelare
 SQL Server Management Studio
 Diagrame pentru baze de date
 IDEF1X
Baze de date
 Customers - Northwind
CompanyName
ContactName
Address
City
Alfreds Futterkiste
Maria Anders
Obere Str. 57
Berlin
Berglunds snabbköp Christina
Berglund
Centro comercial
Francisco Chang
Moctezuma
Ernst Handel
Roland Mendel
Berguvsvägen 8 Luleå
Sierras de
Granada 9993
Kirchgasse 6
México
D.F.
Graz
FISSA Fabrica Inter.
Salchichas S.A.
Galería del
gastrónomo
C/ Moralzarzal,
86
Rambla de
Cataluña, 23
Madrid
Diego Roel
Eduardo
Saavedra
Barcelona
Baze de date - interogări
 SELECT * FROM customers
 SELECT CompanyName, ContactName FROM
customers
 SELECT * FROM customers WHERE
companyname LIKE 'a%‘
 SELECT CompanyName, ContactName
FROM customers
WHERE CompanyName > 'a‘
 SELECT CompanyName, ContactName
FROM customers
WHERE CompanyName > 'g'
AND ContactName > 'g'
Clauza TOP
 Folosită pentru a specifica numărul de




înregistrări ce se vor returna
Util când tabel are foarte multe înregistrări
Returnarea unui număr mare de înregistrări
poate afecta performanța
Nu este suportat de toate SGBD-urile
Sintaxa MSSQL
 SELECT TOP number | percent column_name(s)
FROM table_name
Clauza TOP - echivalent
 MySQL
 SELECT column_name(s)
FROM table_name
LIMIT number
 SELECT * FROM Persons LIMIT 5
 Oracle
 SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number
 SELECT * FROM Persons WHERE ROWNUM <=5
Clauza TOP - Exemplu
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
4
Nilsen
Tom
Vingvn 23
Stavanger
 SELECT TOP 2 * FROM Persons
 SELECT TOP 50 PERCENT * FROM Persons
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
Operatorul LIKE
 Folosit în clauza WHERE pentru a specifica un
șablon de căutare într-o coloană
 Sintaxa:
 SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern
Operatorul LIKE - exemple
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 SELECT * FROM Persons
WHERE City LIKE 's%‘
 Înregistrările în care ‘City’ începe cu litera s
 SELECT * FROM Persons
WHERE City LIKE '%s‘
 Înregistrările în care ‘City’ se termină cu litera s
 SELECT * FROM Persons
WHERE City NOT LIKE '%tav%'
Operatorul LIKE – caractere
pentru șablon
 Putem folosi următoarele caractere pentru
șablon
Caracter
Descriere
%
Înlocuiește zero sau mai multe caractere
_
Înlocuiește un singur caracter
[charlist]
Orice caracter din listă
[^charlist] sau
[!charlist]
Orice caracter care nu este în listă
Operatorul LIKE – Exemple
 SELECT * FROM Persons WHERE City LIKE 'sa%‘
 SELECT * FROM Persons




WHERE City LIKE '%nes%‘
SELECT * FROM Persons
WHERE FirstName LIKE '_la‘
SELECT * FROM Persons
WHERE LastName LIKE 'S_end_on‘
SELECT * FROM Persons
WHERE LastName LIKE '[bsp]%‘
SELECT * FROM Persons
WHERE LastName LIKE '[!bsp]%'
Operatorul IN
 Folosit pentru a specifica o listă de valori în
clauza WHERE
 Sintaxa:
 SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)
Operatorul IN - exemplu
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 SELECT * FROM Persons
WHERE LastName IN ('Hansen','Pettersen')
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
Operatorul BETWEEN
 Folosit în clauza WHERE pentru a stabili un
interval de valori după care se va face filtrarea
datelor
 Capetele intervalului pot fi numere, text sau
date calendaristice
 Sintaxa:
 SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2
Operatorul BETWEEN - exemplu
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10 Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 SELECT * FROM Persons
WHERE LastName
BETWEEN 'Hansen' AND 'Pettersen'
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10 Sandnes
Operatorul BETWEEN - !!!
 Tratat diferit de diverse SGBD-uri
 (value1, value2)
 [value1, value2]
 [value1, value2)
 Trebuie verificat comportamentul pentru
SGBD-ul pe care îl folosiți
 SELECT * FROM Persons
WHERE LastName
NOT BETWEEN 'Hansen' AND 'Pettersen'
Alias
 Se poate da un nume alias unei tabele sau
unei coloane
 Util când o tabelă sau un câmp are un nume
lung sau complex
 Util când vrem să dăm un nume unei coloane
cu valoare calculată
 Interogările devin mai simplu de scris și de
citit
Alias
 Sintaxa pentru tabele
 SELECT column_name(s)
FROM table_name
AS alias_name
 Sintaxa pentru coloane
 SELECT column_name AS alias_name
FROM table_name
Alias - exemple
 Cu alias
 SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p,
Product_Orders AS po
WHERE p.LastName='Hansen' AND p.FirstName='Ola‘
 Fără alias
 SELECT Product_Orders.OrderID, Persons.LastName,
Persons.FirstName
FROM Persons,
Product_Orders
WHERE Persons.LastName='Hansen' AND
Persons.FirstName='Ola'
Join
 Se folosesc pentru a extrage date într-un
result-set din două sau mai multe tabele, pe
baza unei relații între anumite coloane din
aceste tabele
 Cheia primară = o coloană (sau o combinație
de coloane) cu valori unice în fiecare
înregistrare. Scopul este de a lega datele din
mai multe tabele, fără a repeta datele din
fiecare tabelă
Join
 Tabela ‘Persons’
P_Id
LastName
FirstName
Address
1
Hansen
Ola
Timoteivn 10 Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 Tabela ‘Orders’
City
O_Id
OrderNo
P_Id
1
77895
3
2
44678
3
3
22456
1
4
24562
1
5
34764
15
Join – mai multe tipuri
 JOIN/INNER JOIN: Extrage linii când este cel
puțin o potrivire în ambele tabele
 LEFT JOIN: Extrage toate liniile din tabela din
stânga, chiar dacă nu au potriviri în tabela din
dreapta
 RIGHT JOIN: Extrage toate liniile din tabela
din dreapta, chiar dacă nu au potriviri în
tabela din stânga
 FULL JOIN: Combinație între LEFT și RIGHT
INNER JOIN
 Extrage linii când este cel puțin o potrivire în
ambele tabele
 Sintaxa:
 SELECT column_name(s)
FROM table_name1 INNER JOIN table_name2
ON table_name1.column_name =
table_name2.column_name
 Dacă sunt linii în prima tabelă care nu au
corespondent în a doua atunci ele nu sunt
extrase
INNER JOIN - exemplu
 Vrem să extragem persoanele care au
comenzi
 SELECT Persons.LastName, Persons.FirstName,
Orders.OrderNo FROM Persons
INNER JOIN Orders ON Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName
LastName
FirstName
OrderNo
Hansen
Ola
22456
Hansen
Ola
24562
Pettersen
Kari
77895
Pettersen
Kari
44678
LEFT JOIN
 Extrage toate înregistrările din table din
stânga, chiar și atunci când nu sunt potriviri în
tabela din dreapta
 Sintaxa:
 SELECT column_name(s)
FROM table_name1 LEFT JOIN table_name2
ON table_name1.column_name =
table_name2.column_name
 În unele SGBD-uri se numește LEFT OUTER
JOIN
LEFT JOIN - exemplu
 Vrem să extragem toate persoanele
indiferent dacă au comenzi sau nu
 SELECT p.LastName, p.FirstName, po.OrderNo
FROM Persons AS p LEFT JOIN Orders AS po
ON p.P_Id=po.P_Id
ORDER BY p.LastName
LastName
FirstName
OrderNo
Hansen
Ola
22456
Hansen
Ola
24562
Pettersen
Kari
77895
Pettersen
Kari
44678
Svendson
Tove
RIGHT JOIN
 Extrage toate înregistrările din table din
dreapta, chiar și cele pentru care nu sunt
potriviri în tabela din stânga
 Sintaxa:
 SELECT column_name(s) FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name =
table_name2.column_name
 În unele SGBD-uri se numește RIGHT OUTER
JOIN
RIGHT JOIN - exemplu
 Tabela ‘Persons’
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 Tabela ‘Orders’
O_Id OrderNo
P_Id
1
77895
3
2
44678
3
3
22456
1
4
24562
1
5
34764
15
RIGHT JOIN - exemplu
 Extragem toate comenzile cu persoanele
corespunzătoare
 SELECT Persons.LastName, Persons.FirstName,
Orders.OrderNo FROM Persons
RIGHT JOIN Orders ON Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName
LastName
FirstName
OrderNo
Hansen
Ola
22456
Hansen
Ola
24562
Pettersen
Kari
77895
Pettersen
Kari
44678
34764
FULL JOIN
 Extrage înregistrările pentru care este o
potrivire într-una din cele două tabele
 Sintaxa:
 SELECT column_name(s) FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name =
table_name2.column_name
 Extrage toate înregistrările din tabela din
stânga și toate înregistrările din tabela din
dreapta
FULL JOIN - exemplu
 Toate persoanele cu comenzile lor și toate
comenzile cu persoanele corespunzătoare
 SELECT Persons.LastName, Persons.FirstName,
Orders.OrderNo FROM Persons FULL JOIN Orders
ON Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName
LastName
FirstName
OrderNo
Hansen
Ola
22456
Hansen
Ola
24562
Pettersen
Kari
77895
Pettersen
Kari
44678
Svendson
Tove
34764
Operatorul UNION
 Folosit pentru a combina două sau mai multe
instrucțiuni SELECT
 Fiecare instrucțiune SELECT trebuie să aibă
același număr de coloane
 Coloanele corespunzătoare trebuie să aibă și
aceleași tipuri
 Coloanele trebuie să fie și în aceeași ordine
Operatorul UNION - sintaxa
 Doar valorile distincte
 SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
 Permite valori duplicate
 SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
 Numele coloanelor din result-set vor fi
numele coloanelor din primul SELECT
Operatorul UNION - exemplu
 ‘Employees_Norway’
E_ID
E_Name
01
Hansen, Ola
02
Svendson, Tove
03
Svendson, Stephen
04
Pettersen, Kari
 ‘Employees_USA’
E_ID
E_Name
01
Turner, Sally
02
Kent, Clark
03
Svendson, Stephen
04
Scott, Stephen
Operatorul UNION - exemplu
 SELECT E_Name FROM Employees_Norway
UNION
SELECT E_Name FROM Employees_USA
E_Name
Hansen, Ola
Svendson, Tove
Svendson, Stephen
Pettersen, Kari
Turner, Sally
Kent, Clark
Scott, Stephen
SELECT INTO
 Folosit pentru a crea copii backup ale
tabelelor
 Sintaxa:
 SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_tablename
 SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename
SELECT INTO - exemplu
 SELECT * INTO Persons_Backup FROM Persons
 Putem folosi clauza ‘IN’ pentru a copia tabela
într-o altă bază de date
 SELECT * INTO Persons_Backup IN 'Backup.mdb'
FROM Persons
 Se poate crea un backup doar pentru o parte
din date
 SELECT LastName,Firstname
INTO Persons_Backup
FROM Persons WHERE City='Sandnes'
SELECT INTO – exemplu 2
 Putem extrage date din două tabele legate
 SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons INNER JOIN Orders
ON Persons.P_Id=Orders.P_Id
CREATE DATABASE
 Folosit pentru a crea o nouă bază de date
 Sintaxa:
 CREATE DATABASE database_name
 Exemplu:
 CREATE DATABASE my_db
 Tabele se vor crea cu CREATE TABLE
CREATE TABLE
 Folosit pentru a crea tabele
 Sintaxa:
 CREATE TABLE table_name
(
column_name1 data_type,
column_name2 data_type,
column_name3 data_type,
....
)
 Tipul de date stabilește tipul valorilor pentru
coloana respectivă (tipuri de date MSMSQL)
Tipuri de date MSSQL
 Șiruri de caractere
Tip de date
char(n)
Descriere
Șir de caractere de dimensiune fixă.
Maxim 8000 de caractere
varchar(n)
Șir de caractere de lungime variabilă.
Maxim 8000 de caractere
varchar(max) Șir de caractere de lungime variabilă.
Maxim1,073,741,824 de caractere
text
Șir de caractere de lungime variabilă.
Maxim 2GB de date de tip text
Stocare
n
Tipuri de date MSSQL
 Șiruri de caractere Unicode
Tip de date
nchar(n)
Descriere
Date Unicode de lungime fixă. Maxim
4000 caractere
nvarchar(n)
Date Unicode de lungime variabilă.
Maxim 4000 caractere
nvarchar (max) Date Unicode de lungime variabilă.
Maxim 536,870,912 caractere
ntext
Date Unicode de lungime variabilă.
Maxim 2GB de date text
Stocare
Tipuri de date MSSQL
 Tipuri binare
Tip de date
Descriere
bit
Permite 0, 1, sau NULL
binary(n)
Date binare de lungime
8000 octeți
varbinary(n)
Date binare de lungime
Maxim 8000 octeți
varbinary(max) Date binare de lungime
Maxim 2GB
image
Date binare de lungime
Maxim 2GB
Stocare
fixă. Maxim
variabilă.
variabilă.
variabilă.
Tipuri de date MSSQL
 Tipuri numerice
Tip de date
Descriere
tinyint
Permite numere întregi de la 0 la 255 1 octet
smallint
Permite numere întregi de la -32,768
la 32,767
Permite numere întregi de la 2,147,483,648 la2,147,483,647
Permite numere întregi de la 9,223,372,036,854,775,808 la
9,223,372,036,854,775,807
int
bigint
Stocare
2 octeți
4 octeți
8 octeți
Tipuri de date MSSQL
 Tipuri numerice
Tip de date
Descriere
Stocare
decimal(p,s)
numeric(p,s)
Numere cu precizie și magnitudine
5-17
fixă. Permite numere de la -10^38 +1 octeți
la 10^38 –1.
Parametrul p indică numărul maxim
de cifre ce pot fi stocate (atât în
partea stângă cât și în partea dreaptă
a punctului zecimal). p trebuie să fie
între 1 și 38. Implicit este 18.
Parametrul s indică numărul maxim de
cifre stocate în dreapta punctului
zecimal. s trebuie să fie de la 0 la p.
Implicit este 0.
Tipuri de date MSSQL
 Tipuri numerice
Tip de date Descriere
Stocare
smallmoney Date monetare de la -214,748.3648 la
214,748.3647
money
Date monetare de la 922,337,203,685,477.5808
tla922,337,203,685,477.5807
float(n)
Date numerice în virgulă mobilă de la 1.79E+308 la 1.79E+308. Parametrul n
indică numărul de octeți 4 sau 8.
float(24) câmp de 4 octeți, iar float(53)
câmp de 8 octeți. Valoarea implicită
pentru n este 53.
real
Date numerice în virgulă mobilă de la 3.40E + 38 la 3.40E + 38
4 octeți
8 octeți
4 sau 8
octeți
4 octeți
Tipuri de date MSSQL
 Tipuri pentru dată/oră
Tip de date
datetime
Descriere
January 1, 1753 - December 31, 9999
cu acuratețe de 3.33 milisecunde
datetime2
January 1, 0001 - December 31, 9999
cu acuratețe de 100 nanosecunde
smalldatetime January 1, 1900 - June 6, 2079 cu
acuratețe de 1 minut
date
Stochează doar data.
January 1, 0001 - December 31, 9999
time
Stochează doar ora cu o acuratețe de
100 nanosecunde
datetimeoffset La fel ca și datetime2 + are adăugat
time zone offset
Stocare
8 octeți
6-8 octeți
4 octeți
3 octeți
3-5 octeți
8-10
octeți
Tipuri de date MSSQL
 Tipuri pentru dată/oră
Tip de date
Descriere
timestamp
Stochează un număr unic care este
actualizat de fiecare dată când o
înregistrare se creează sau se modifică.
Valoarea este bazată pe ceasul intern și
nu are legătură cu ceasul real. Fiecare
tabelă poate avea un singur câmp de
acest tip
Stocare
Tipuri de date MSSQL
 Alte tipuri de date
Tip de date
Descriere
sql_variant
uniqueidentifier
Stochează până la 8000 de octeți de date de
diverse tipuri cu excepția text, ntext, și
timestamp
Stochează un globally unique identifier (GUID)
xml
Stochează date în format XML. Maximum 2GB
cursor
Stochează o referință la un cursor folosit
pentru operații cu baza de date
Stochează un result-set pentru procesare
ulterioară
table
CREATE TABLE - exemplu
 CREATE TABLE Persons
(
P_Id int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
P_Id
LastName FirstName Address
City
Constrângeri
 Se folosesc pentru a limita tipul datelor care pot
ajunge în tabelă
 Se pot specifica la crearea tabelei (în
instrucțiunea CREATE TABLE) sau după ce a fost
creată tabela (cu instrucțiunea ALTER TABLE)






NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT
Constrângerea NOT NULL
 Implicit o tabelă poate conține în câmpurile
sale valori NULL
 NOT NULL va determina ca această valoare
să nu fie acceptată în coloana asupra căreia se
aplică constrângerea
 Cu această constrângere nu se vor putea
adăuga înregistrări sau nu se vor putea
actualiza fără a specifica o valoarea pentru
câmpul respectiv
Constrângerea NOT NULL exemplu
 CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
Constrângerea UNIQUE
 Folosită asupra unei coloane în care nu se vor
permite date duplicate
 UNIQUE și PRIMARY KEY oferă garanția de
unicitate pentru o coloană sau mulțime de
coloane
 O constrângere de tip PRIMARY KEY are
întotdeauna definită și o constrângere
UNIQUE
 Putem avea mai multe constrângeri UNIQUE
dar o singură constrângere PRIMARY KEY
Constrângerea UNIQUE exemplu
 MySQL
 CREATE TABLE Persons(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255), City varchar(255),
UNIQUE (P_Id) )
 SQL Server / Oracle / MS Access
 CREATE TABLE Persons(
P_Id int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255), City varchar(255) )
Constrângerea UNIQUE exemplu
 Nume pentru o constrângere de unicitate
definită pe mai multe coloane
 MySQL / SQL Server / Oracle / MS Access
 CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
)
Constrângerea UNIQUE – cu
ALTER TABLE
 Definirea unei constrângeri de unicitate după
ce tabela a fost creată
 MySQL / SQL Server / Oracle / MS Access
 ALTER TABLE Persons
ADD UNIQUE (P_Id)
 ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE
(P_Id,LastName)
Eliminarea unei constrângeri
 MySQL
 ALTER TABLE Persons
DROP INDEX uc_PersonID
 SQL Server / Oracle / MS Access
 ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
Constrângerea PRIMARY KEY
 Identifică în mod unic fiecare înregistrare din
tabelă
 Cheia primară trebuie să conțină valori unice
 Nu poate conține valoarea NULL
 Fiecare tabelă trebuie să aibă o cheie primară
și numai una
Constrângerea PRIMARY KEY
 Sintaxa:
 MySQL
 CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
Constrângerea PRIMARY KEY
 Sintaxa:
 SQL Server / Oracle / MS Access
 CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
Constrângerea PRIMARY KEY
 Pentru a da un nume constrângerii și pentru a
permite o cheie primară formată din mai multe
câmpuri folosim sintaxa:
 CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY
(P_Id,LastName)
)
Constrângerea PRIMARY KEY
 Crearea unei constrângeri de cheie primară
după crearea tabelei
 ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)
 În acest caz coloanele ce fac parte din cheia
primară trebuie să fi fost definite anterior
astfel încât să nu accepte valoarea NULL
Constrângerea PRIMARY KEY
 Eliminarea unei constrângeri de cheie
primară
 MySQL
 ALTER TABLE Persons
DROP PRIMARY KEY
 SQL Server / Oracle / MS Access
 ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
Constrângerea FOREIGN KEY
 O ‘cheie străină’ dintr-o tabelă pointează la o
cheie primară din altă tabelă
 Tabela ‘Persons’
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 Tabela ‘Orders’
O_Id
OrderNo
P_Id
1
77895
3
2
44678
3
3
22456
2
4
24562
1
Constrângerea FOREIGN KEY
 Coloana ‘P_id’ din tabela ‘Orders’ pointează la




coloana ‘P_id’ din tabela ‘Persons’
Coloana ‘P_id’ din tabela ‘Orders’ este FOREIGN
KEY
Coloana ‘P_id’ din tabela ‘Persons’ este
PRIMARY KEY
Constrângerea de tip FOREIGN KEY este folosită
pentru a preveni acțiuni care ar distruge
legăturile dintre cele două tabele
De asemenea împiedică introducerea de date
invalide ce nu se regăsesc în cheia primară
Constrângerea FOREIGN KEY
 Sintaxa - MySQL
 CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)
Constrângerea FOREIGN KEY
 Sintaxa - SQL Server / Oracle / MS Access
 CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES
Persons(P_Id)
)
Constrângerea FOREIGN KEY
 Pentru a stabili un nume pentru constrângere
și pentru a defini constrângerea pe mai multe
coloane
 CREATE TABLE Orders(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id) )
Constrângerea FOREIGN KEY
 Adăugarea constrângerii după crearea tabelei
 ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
 Stabilirea unui nume pentru constrângere și
definire constrângere pe mai multe câmpuri
 ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
Constrângerea FOREIGN KEY
 Eliminarea unei constrângeri
 MySQL
 ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders
 SQL Server / Oracle / MS Access
 ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders
Constrângerea CHECK
 Folosită pentru a limita intervalul de valori ce
pot fi introduse într-o coloană
 Se poate defini pe o coloană caz în care se
limitează valorile ce pot fi introduse în
coloana respectivă
 Se poate defini pe întreaga tabelă caz în care
se pot limita valorile ce se introduce într-o
coloană pe baza valorilor din alte coloane
Constrângerea CHECK
 MySQL
 CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0)
)
Constrângerea CHECK
 SQL Server / Oracle / MS Access
 CREATE TABLE Persons
(
P_Id int NOT NULL CHECK (P_Id>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
Constrângerea CHECK
 Pentru a stabili un nume pentru o
constrângere și pentru a defini o
constrângere pe mai multe coloane
 CREATE TABLE Persons(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255), City varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND
City='Sandnes‘) )
Constrângerea CHECK
 Stabilirea unei constrângeri după crearea
tabelei
 ALTER TABLE Persons
ADD CHECK (P_Id>0)
 Stabilirea unui nume pentru constrângere și
crearea unei constrângeri pe mai multe
coloane
 ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (P_Id>0
AND City='Sandnes')
Constrângerea CHECK
 Eliminarea unei constrângeri
 SQL Server / Oracle / MS Access
 ALTER TABLE Persons
DROP CONSTRAINT chk_Person
Constrângerea DEFAULT
 Folosită pentru a insera o valoare implicită
într-o coloană
 Valoarea implicită va fi adăugată la toate
înregistrările noi, dacă nu se specifică o altă
valoare
 Poate fi folosită și pentru a insera valori
sistem obținute prin apelul unor funcții
Constrângerea DEFAULT exemplu
 CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
Constrângerea DEFAULT exemplu
 CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
OrderDate date DEFAULT GETDATE()
)
Constrângerea DEFAULT
 Adăugarea unei constrângeri de valoarea
implicită după crearea tabelei
 MySQL
 ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES‘
 SQL Server / Oracle / MS Access
 ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'
Constrângerea DEFAULT
 Eliminarea unei constrângeri de valoare
implicită
 MySQL
 ALTER TABLE Persons
ALTER City DROP DEFAULTSQL
 Server / Oracle / MS Access
 ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
Instrucțiunea CREATE INDEX
 Folosită pentru a crea indecși pe tabele
 Rolul indecșilor este de a permite găsirea
rapidă și eficientă a datelor, fără a citi întreg
tabelul
 Actualizarea unei tabele ce conține indecși
este mai lentă pentru că trebuie actualizați și
indecșii
 Indecșii trebuie creați doar pentru coloane pe
care se vor face căutări frecvente
Instrucțiunea CREATE INDEX
 Sintaxa:
 CREATE INDEX index_name
ON table_name (column_name)
 Aici se permit valori duplicate
 Creare de indecși unici – valorile duplicate nu
sunt permise
 CREATE UNIQUE INDEX index_name
ON table_name (column_name)
 Sintaxa poate diferi între SGBD-uri
Instrucțiunea CREATE INDEX
 Exemplu
 CREATE INDEX PIndex
ON Persons (LastName)
 Creare de index pe o combinație de coloane
 CREATE INDEX PIndex
ON Persons (LastName, FirstName)
Instrucțiunea DROP …
 DROP INDEX - șterge un index dintr-o tabelă
 MS Access
 DROP INDEX index_name ON table_name
 MSSQL
 DROP INDEX table_name.index_name
 DB2/Oracle
 DROP INDEX index_name
 MySQL
 ALTER TABLE table_name DROP INDEX index_name
Instrucțiunea DROP …
 DROP TABLE - șterge o tabelă
 DROP TABLE table_name
 DROP DATABASE - șterge toată baza de date
 DROP DATABASE database_name
 TRUNCATE TABLE - șterge doar înregistrările
dintr-o tabelă
 TRUNCATE TABLE table_name
Instrucțiunea ALTER TABLE
 Folosită pentru a adăuga, modifica, șterge,
coloane dintr-o tabelă
 Adăugarea unei coloane
 ALTER TABLE table_name
ADD column_name datatype
 Ștergerea unei coloane
 ALTER TABLE table_name
DROP COLUMN column_name
 Schimbarea tipului de date pentru o coloană
 ALTER TABLE table_name
ALTER COLUMN column_name datatype
Instrucțiunea ALTER TABLE exemplu
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 Vrem să adăugăm o nouă coloană
 ALTER TABLE Persons
ADD DateOfBirth date
P_Id LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
DateOfBirth
Instrucțiunea ALTER TABLE exemplu
 Schimbarea tipului de date pentru coloane
‘DateofBirth’ în tabela ‘Persons’
 ALTER TABLE Persons
ALTER COLUMN DateOfBirth year
 Eliminarea coloanei adăugate anterior
 ALTER TABLE Persons
DROP COLUMN DateOfBirth
Auto increment
 Permite generarea automată a unui număr
unic atunci când se inserează o nouă
înregistrare în tabelă
 De regulă când cheia primară este de tip
numeric și e formată dintr-un singur câmp,
are acest atribut
Auto increment
 Sintaxa MySQL
 CREATE TABLE Persons(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255), City varchar(255),
PRIMARY KEY (P_Id))
 Implicit pornește de la 1 și crește cu 1
 Altfel
 ALTER TABLE Persons AUTO_INCREMENT=100
Auto increment
 Dacă vrem să adăugăm o nouă înregistrare în
tabelă nu mai trebuie să specificăm câmpul ce
are atribut AUTO_INCREMENT
 Se va genera o valoare unică automat
 INSERT INTO Persons (FirstName,LastName)
VALUES ('Lars', 'Monsen')
Auto increment
 Sintaxa SQL Server
 CREATE TABLE Persons(
P_Id int PRIMARY KEY IDENTITY,
LastName varchar(255) NOT NULL,
FirstName varchar(255), Address varchar(255),
City varchar(255) )
 Implicit pornește de la 1 și crește cu 1
 Altfel
 IDENTITY(10,5)
 Pentru a adăuga o nouă înregistrare
 INSERT INTO Persons (FirstName,LastName)
VALUES ('Lars','Monsen')
Auto increment
 Sintaxa Oracle
 CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10
 INSERT INTO Persons
(P_Id,FirstName,LastName)
VALUES (seq_person.nextval,'Lars','Monsen')
VIEW
 Un view este o tabelă virtuală bazată pe
result-set-ul unei interogări
 Conține linii și coloane la fel ca și o tabelă
reală
 Câmpurile unui view sunt câmpurile uneia sau
a mai multor tabele din baza de date
 Putem adăuga funcții SQL, clauza WHERE și
JOIN și să prezentăm datele ca și cum ar veni
dintr-o singură tabelă
VIEW
 Sintaxa pentru creare VIEW
 CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
 Un view întotdeauna va prezenta date
actualizate
 Motorul bazei de date va recrea datele
folosind instrucțiunea SELECT de fiecare dată
când un view este interogat
VIEW - exemplu
 Northwind
 CREATE VIEW [Current Product List] AS
SELECT ProductID, ProductName
FROM Products
WHERE Discontinued=No
 Interogarea
 SELECT * FROM [Current Product List]
VIEW - exemplu
 Northwind
 CREATE VIEW [Products Above Average Price] AS
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM
Products)
 Interogarea
 SELECT * FROM [Products Above Average Price]
VIEW - exemplu
 Northwind
 CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT
CategoryName,Sum(ProductSales) AS
CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName
 Interogări
 SELECT * FROM [Category Sales For 1997]
 SELECT * FROM [Category Sales For 1997]
WHERE CategoryName = 'Beverages'
VIEW - actualizare
 Actualizarea unui view
 CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
 Exemplu
 CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No
VIEW - ștergere
 DROP VIEW view_name
Date calendaristice
 Forma datei pe care încercăm să o inserăm
trebuie să se potrivească cu formatul coloanei
de tip dată din tabelă
 Atunci când apare și partea de timp/oră
lucrurile se complică
 Există o serie de funcții predefinite pentru
procesarea informațiile legate de dată/oră
Funcții MySQL pentru
dată/oră
Funcția
Descriere
NOW()
Data și ora curentă
CURDATE()
Data curent
CURTIME()
Ora curentă
DATE()
EXTRACT()
Extrage partea de dată dintr-o expresie de tip
dată sau dată/oră
Extrage o singură parte din dată/oră
DATE_ADD()
Adaugă un anumit interval de timp unei date
DATE_SUB()
Scade un anumit interval de timp dintr-o dată
DATEDIFF()
Calculează intervalul dintre două date
DATE_FORMAT()
Afișează data/ora în diverse formate
Funcții SQL Server pentru
dată/oră
Funcția
Descriere
GETDATE()
Obține data și ora curentă
DATEPART()
Extrage o singură parte din dată/oră
DATEADD()
DATEDIFF()
Adună sau scade un anumit interval dintr-o
dată/oră
Calculează timpul dintre două date/ore
CONVERT()
Afișează data/ora în diverse formate
NULL
 Reprezintă date lipsă/necunoscute/inaplicabile
 Implicit o coloană poate conține valoarea NULL
 Operatori pentru NULL:
 IS NULL
 IS NOT NULL
 Când valoarea unei coloane este opțională
putem adăuga o înregistrare sau o putem
actualiza fără a specifica o valoare pentru
coloana respectivă
 În acest caz se va salva valoarea NULL
NULL
 Valoarea NULL este tratată diferit față de
restul valorilor
 Se folosește ca un marcator pentru date
necunoscute/inaplicabile
 NULL și 0 (zero) nu sunt echivalente sau
comparabile
NULL
 Tabela ‘Persons’
P_Id
LastName
FirstName Address
City
1
Hansen
Ola
Sandnes
2
Svendson
Tove
3
Pettersen
Kari
Borgvn 23
Sandnes
Stavanger
 Coloana ‘Address’ este opțională
 Se va salva NULL dacă nu specificăm o adresă
 Nu putem folosi operatorii relaționali sau de
egalitate pentru a testa valorile NULL
NULL – operatorul IS NULL
 Extragem înregistrările cu adresa NULL
 SELECT LastName, FirstName, Address FROM
Persons
WHERE Address IS NULL
 Rezultatul
LastName
FirstName Address
Hansen
Ola
Pettersen
Kari
NULL – operatorul IS NOT NULL
 Extragem înregistrările cu adresa completată
 SELECT LastName, FirstName, Address FROM
Persons
WHERE Address IS NOT NULL
 Rezultatul
LastName
FirstName Address
Svendson
Tove
Borgvn 23
Funcțiile ISNULL(), NVL(),
IFNULL() și COALESCE()
 Tabela ‘Products’
P_Id ProductName
UnitPrice
UnitsInStock
UnitsOnOrder
1
Jarlsberg
10.45
16
15
2
Mascarpone
32.56
23
3
Gorgonzola
15.67
9
20
 SELECT ProductName,
UnitPrice*(UnitsInStock+UnitsOnOrder)
FROM Products
 Dacă ‘UnitsOnOrder’ este NULL rezultatul va
fi NULL
Funcțiile ISNULL(), NVL(),
IFNULL() și COALESCE()
 Funcția ISNULL() (Microsoft) ne permite să
specificăm modul în care dorim să tratăm
valorile NULL
 NVL(), IFNULL(), COALESCE() pot fi folosite
pentru a realiza același obiectiv
 În interogarea precedentă vrem ca valorile NULL
să fie tratate ca zero
 SQL Server / MS Access
 SELECT ProductName,
UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
Funcțiile ISNULL(), NVL(),
IFNULL() și COALESCE()
 Oracle nu are funcția ISNULL()
 Putem folosi funcția NVL()
 SELECT ProductName,
UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products
 MySQL are funcția ISNULL() dar funcționează
puțin diferit. Putem folosi IFNULL()
 SELECT ProductName,
UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products
Funcțiile ISNULL(), NVL(),
IFNULL() și COALESCE()
 MSSQL Coalesce
 SELECT ProductName, UnitPrice*(UnitsInStock+
COALESCE(UnitsOnOrder,0))
FROM Products
Funcții SQL
 SQL are multe funcții pentru a efectua calcule
asupra datelor
 Funcții de agregare – calculează o valoare pe
baza valorilor din coloanele tabelei







AVG() – Calculează o valoare medie
COUNT() – Întoarce numărul de înregistrări
FIRST() – Întoarce prima valoare
LAST() – Întoarce ultima valoare
MAX() – Întoarce cea mai mare valoare
MIN() - Întoarce cea mai mică valoare
SUM() – Calculează suma
Funcții SQL
 Funcții scalare – calculează o singură valoare pe
baza unei valori de intrare





UCASE() – convertește în litere mari
LCASE() – convertește în litere mici
MID() – extrage caractere dintr-un câmp de tip text
LEN() – calculează lungimea unui câmp de tip text
ROUND() – rotunjește un câmp numeric la numărul de
zecimale specificat
 NOW() – întoarce data și ora curentă din sistem
 FORMAT() – stabilește modul în care este afișat un
câmp
Funcția AVG()
 Calculează valoarea medie pe o coloană
 Sintaxa
 SELECT AVG(column_name) FROM table_name
Funcția AVG() - Exemplu
 Calculăm media pe coloana OrderPrice
 SELECT AVG(OrderPrice) AS OrderAverage FROM
Orders
O_Id
OrderDate OrderPrice Customer
1
2008/11/12 1000
Hansen
2
2008/10/23 1600
Nilsen
3
2008/09/02 700
Hansen
4
2008/09/03 300
Hansen
5
2008/08/30 2000
Jensen
6
2008/10/04 100
Nilsen
OrderAverage
950
Funcția AVG() - Exemplu
 Vrem să aflăm clienții care au valoarea
‘OrderPrice’ mai mare decât media
 SELECT Customer FROM Orders
WHERE OrderPrice> (SELECT AVG(OrderPrice)
FROM Orders)
Customer
Hansen
Nilsen
Jensen
Funcția COUNT()
 Calculează numărul de înregistrări care
respectă un anumit criteriu
 Valorile NULL nu vor fi numărate
 Sintaxa
 SELECT COUNT(column_name) FROM
table_name
 Pentru a afla numărul de înregistrări din
tabelă
 SELECT COUNT(*) FROM table_name
Funcția COUNT()
 Numărul de valori distincte dintr-o coloană se
calculează astfel:
 SELECT COUNT(DISTINCT column_name) FROM
table_name
Funcția COUNT() – exemplu
 Numărul de comenzi ale clientului ‘Nilsen’
O_Id
OrderDate
OrderPrice
Customer
1
2008/11/12
1000
Hansen
2
2008/10/23
1600
Nilsen
3
2008/09/02
700
Hansen
4
2008/09/03
300
Hansen
5
2008/08/30
2000
Jensen
6
2008/10/04
100
Nilsen
 SELECT COUNT(Customer) AS CustomerNilsen
FROM Orders
WHERE Customer='Nilsen'
CustomerNilsen
2
Funcția COUNT(*) – exemplu
 Numărul de comenzi din tabela ‘Orders’ o
găsim astfel:
 SELECT COUNT(*) AS NumberOfOrders FROM
Orders
NumberOfOrders
6
 Reprezintă numărul total de înregistrări din
tabelă
Funcția COUNT(DISTINCT) –
exemplu
 Vrem să găsim numărul de clienți unici
 SELECT COUNT(DISTINCT Customer) AS
NumberOfCustomers FROM Orders
NumberOfCustomers
3
Funcția FIRST()
 Întoarce prima valoare din coloana indicată
 Sintaxa
 SELECT FIRST(column_name) FROM table_name
 Tabela ‘Orders’
O_Id
OrderDate OrderPrice Customer
1
2008/11/12 1000
Hansen
2
2008/10/23 1600
Nilsen
3
2008/09/02 700
Hansen
4
2008/09/03 300
Hansen
5
2008/08/30 2000
Jensen
6
2008/10/04 100
Nilsen
Funcția FIRST() - exemplu
 Prima valoare din coloana ‘OrderPrice’
 SELECT FIRST(OrderPrice) AS FirstOrderPrice
FROM Orders
 Dacă funcția nu există în SGBD atunci:
 SELECT OrderPrice
FROM Orders ORDER BY O_Id LIMIT 1
FirstOrderPrice
1000
Funcția LAST()
 Întoarce ultima valoare din coloana indicată
 Sintaxa
 SELECT LAST(column_name) FROM table_name
O_Id
OrderDate OrderPrice Customer
1
2008/11/12 1000
Hansen
2
2008/10/23 1600
Nilsen
3
2008/09/02 700
Hansen
4
2008/09/03 300
Hansen
5
2008/08/30 2000
Jensen
6
2008/10/04 100
Nilsen
Funcția LAST()
 Dacă SGBD-ul nu are această funcție
 SELECT OrderPrice FROM Orders ORDER BY O_Id
DESC LIMIT 1
 Rezultatul
FirstOrderPrice
1000
Funcția MAX()
 Determină cea mai mare valoare dintr-o
coloană
 Sintaxa:
 SELECT MAX(column_name) FROM table_name
 Exemplu
 SELECT MAX(OrderPrice) AS LargestOrderPrice
FROM Orders
LargestOrderPrice
2000
Funcția MIN()
 Determină cea mai mică valoare dintr-o
coloană
 Sintaxa:
 SELECT MIN(column_name) FROM table_name
 Exemplu
 SELECT MIN(OrderPrice) AS
SmallestOrderPrice FROM Orders
SmallestOrderPrice
100
Funcția SUM()
 Calculează suma pe o coloană numerică
 Sintaxa:
 SELECT SUM(column_name) FROM table_name
 Exemplu
 SELECT SUM(OrderPrice) AS OrderTotal FROM
Orders
OrderTotal
5700
Clauza GROUP BY
 De cele mai multe ori funcțiile de agregare
folosesc clauza GROUP BY
 Ar e rolul de a grupa datele dintr-una sau mai
multe coloane
 Sintaxa:
 SELECT column_name,
aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
Clauza GROUP BY - exemplu
 Vrem să aflăm totalul comenzilor pentru
fiecare client
 SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
Customer SUM(OrderPrice)
Hansen
2000
Nilsen
1700
Jensen
2000
Clauza GROUP BY - exemplu
 Dacă omitem clauza GROUP BY
 SELECT Customer,SUM(OrderPrice) FROM Orders
Customer
SUM(OrderPrice)
Hansen
5700
Nilsen
5700
Hansen
5700
Hansen
5700
Jensen
5700
Nilsen
5700
 Nu este ceea ce vrem
Clauza GROUP BY - exemplu
 SUM(OrderPrice) - calculează o singură valoare
 ‘Customer’ – va genera șase valori
 Prin urmare nu vom obține rezultatul dorit
 Putem grupa și după mai multe coloane
 SELECT Customer, OrderDate, SUM(OrderPrice)
FROM Orders
GROUP BY Customer, OrderDate
Clauza HAVING
 E nevoie de această clauză pentru ca WHERE
nu poate fi folosită cu funcțiile de agregare
 Sintaxa
 SELECT column_name,
aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name)
operator value
Clauza HAVING - exemplu
 Vrem să găsim clienții cu comenzi totale mai
mici de 2000
 SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
Customer
SUM(OrderPrice)
Nilsen
1700
Clauza HAVING - exemplu
 Vrem să aflăm dacă totalul comenzilor lui
“Hansen” sau “Jensen” este mai mare de 1500
 SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Hansen' OR
Customer='Jensen'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500
Customer
SUM(OrderPrice)
Hansen
2000
Jensen
2000
Funcția UCASE()
 Convertește în litere mari
 Sintaxa
 SELECT UCASE(column_name) FROM
table_name
 Sintaxa pentru MS SQL Server
 SELECT UPPER(column_name) FROM
table_name
Funcția UCASE() - exemplu
 Tabela ‘Persons’
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 SELECT UCASE(LastName) as
LastName,FirstName FROM Persons
LastName FirstName
HANSEN
Ola
SVENDSON Tove
PETTERSEN Kari
Funcția LCASE()
 Convertește în litere mici
 Sintaxa
 SELECT LCASE(column_name) FROM
table_name
 Sintaxa pentru MS SQL Server
 SELECT LOWER(column_name) FROM
table_name
Funcția LCASE() - exemplu
 Tabela ‘Persons’
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 SELECT LCASE(LastName) as
LastName,FirstName FROM Persons
LastName FirstName
hansen
Ola
svendson
Tove
pettersen
Kari
Funcția MID()
 Folosită pentru a extrage caractere dintr-un
câmp de tip text
 Sintaxa
 SELECT MID(column_name,start[,length]) FROM
table_name
Parametru
Descriere
column_name
Obligatoriu. Câmpul din care se extrag
caractere
Obligatoriu. Specifică poziția de pornire
(indexat de la 1)
Opțional. Numărul de caractere ce vor fi
extrase. Dacă lipsește, funcția extrage
toate caracterele rămase
start
length
Funcția MID() - exemplu
 Tabela ‘Persons’
P_Id
LastName
FirstName
Address
City
1
Hansen
Ola
Timoteivn 10
Sandnes
2
Svendson
Tove
Borgvn 23
Sandnes
3
Pettersen
Kari
Storgt 20
Stavanger
 SELECT MID(City,1,4) as SmallCity FROM Persons
SmallCity
Sand
Sand
Stav
Funcția LEN()
 Calculează lungimea unui câmp de tip text
 Sintaxa
 SELECT LEN(column_name) FROM table_name
 Exemplu
 SELECT LEN(Address) as LengthOfAddress FROM
Persons
LengthOfAddress
12
9
9
Funcția ROUND()
 Folosită pentru a rotunji un număr la numărul
de zecimale specificat
 Sintaxa
 SELECT ROUND(column_name,decimals) FROM
table_name
Parametru
Descriere
column_name
Obligatoriu. Câmpul care va fi rotujnit.
decimals
Obligatoriu. Numărul de zecimale la care
se face rotunjirea.
Funcția ROUND() – exemplu
 Tabela ‘Products’
Prod_Id
ProductName
Unit
UnitPrice
1
Jarlsberg
1000 g
10.45
2
Mascarpone
1000 g
32.56
3
Gorgonzola
1000 g
15.67
 Vrem să extragem numele produsului și
prețul rotunjit la cel mai apropiat întreg
 SELECT ProductName, ROUND(UnitPrice,0) as
UnitPrice FROM Products
ProductName
UnitPrice
Jarlsberg
10
Mascarpone
33
Gorgonzola
16
Funcția NOW()
 Întoarce data și ora curentă a sistemului
 Sintaxa
 SELECT NOW() FROM table_name
Prod_Id
ProductName
Unit
UnitPrice
1
Jarlsberg
1000 g
10.45
2
Mascarpone
1000 g
32.56
3
Gorgonzola
1000 g
15.67
 SELECT ProductName, UnitPrice, Now() as
PerDate FROM Products
ProductName
UnitPrice
PerDate
Jarlsberg
10.45
10/7/2008 11:25:02 AM
Mascarpone
32.56
10/7/2008 11:25:02 AM
Gorgonzola
15.67
10/7/2008 11:25:02 AM
Funcția FORMAT()
 Folosită pentru a stabili modul în care este
afișat un câmp
 Sintaxa
 SELECT FORMAT(column_name, format) FROM
table_name
Funcția FORMAT() - exemplu
Prod_Id
ProductName
Unit
UnitPrice
1
Jarlsberg
1000 g
10.45
2
Mascarpone
1000 g
32.56
3
Gorgonzola
1000 g
15.67
 SELECT ProductName, UnitPrice,
FORMAT(Now(),'YYYY-MM-DD') as PerDate
FROM Products
ProductName
UnitPrice
PerDate
Jarlsberg
10.45
2008-10-07
Mascarpone
32.56
2008-10-07
Gorgonzola
15.67
2008-10-07
SQL QUIZ
1. Ce reprezintă SQL?
a) Structured Question Language
b) Structured Query Language
c) Strong Question Language
2. Care instrucțiune SQL
este folosită pentru a
extrage date dintr-o bază de
date?
a) EXTRACT
b) GET
c) SELECT
d) OPEN
3. Care instrucțiune SQL
este folosită pentru a
actualiza date în baza de
date?
a) UPDATE
b) SAVE
c) SAVE AS
d) MODIFY
4. Care instrucțiune SQL
este folosită pentru a
șterge date în baza de date?
a) REMOVE
b) COLLAPSE
c) DELETE
5. Care instrucțiune SQL
este folosită pentru a
insera date noi în baza de
date?
a) ADD NEW
b) INSERT INTO
c) ADD RECORD
d) INSERT NEW
6. În SQL, cum se extrage o
coloană numită ‘FirstName’
dintr-o tabelă numită
‘Persons’?
a) SELECT Persons.FirstName
b) SELECT FirstName FROM Persons
c) EXTRACT FirstName FROM Persons
7. Cum se extrag toate
coloanele dintr-o tabelă cu
numele ‘Persons’?
a) SELECT * FROM Persons
b) SELECT [all] FROM Persons
c) SELECT PersonsSELECT *.Persons
8. Cum se extrag toate
coloanele dintr-o tabelă cu
numele ‘Persons’pentru care
valoarea coloanei ‘FirstName’
este ‘Peter’?
a) SELECT * FROM Persons
WHERE FirstName = 'Peter‘
b) SELECT [all] FROM Persons
WHERE FirstName LIKE 'Peter‘
c) SELECT * FROM Persons
WHERE FirstName<>'Peter‘
d) SELECT [all] FROM Persons
WHERE FirstName='Peter'
9. Cum se extrag toate
coloanele dintr-o tabelă cu
numele ‘Persons’ pentru care
valoarea coloanei ‘FirstName’
începe cu ‘a’?
a) SELECT * FROM Persons WHERE FirstName='a‘
b) SELECT * FROM Persons
WHERE FirstName LIKE '%a‘
c) SELECT * FROM Persons
WHERE FirstName='%a%‘
d) SELECT * FROM Persons WHERE
FirstName LIKE 'a%'
10. Operatorul OR afișează
înregistrările pentru care
oricare din condiții este
adevărată. Operatorul AND
afișează înregistrările pentru
care toate condițiile sunt
adevărate.
a) Adevărat
b) Fals
11. Cum se extrag toate coloanele
dintr-o tabelă cu numele ‘Persons’
pentru care valoarea coloanei
‘FirstName’ este ‘Peter’ și
valoarea coloanei ‘LastName’ este
‘Jackson’?
a) SELECT FirstName='Peter',
LastName='Jackson' FROM Persons
b) SELECT * FROM Persons WHERE
FirstName<>'Peter' AND LastName<>'Jackson‘
c) SELECT * FROM Persons WHERE
FirstName='Peter' AND LastName='Jackson'
11. Cum se extrag toate coloanele
dintr-o tabelă cu numele ‘Persons’
pentru care ‘LastName’ este
alfabetic cuprins (inclusiv) între
‘Hansen’ și ‘Pettersen’?
a) SELECT * FROM Persons
WHERE LastName BETWEEN 'Hansen' AND
'Pettersen‘
b) SELECT LastName>'Hansen' AND
LastName<'Pettersen' FROM Persons
c) SELECT * FROM Persons
WHERE LastName>'Hansen' AND
LastName<'Pettersen'
12. Care instrucțiune SQL
este folosită pentru a
extrage doar valori
distincte?
a) SELECT DISTINCT
b) SELECT UNIQUE
c) SELECT DIFFERENT
14. Care cuvânt cheie SQL
este folosit pentru a sorta
rezultatul?
a) ORDER BY
b) SORT
c) ORDER
d) SORT BY
15. Cum se pot extrage toate
înregistrările din tabela
‘Persons’ ordonate descrescător
după ‘FirstName’?
a) SELECT * FROM Persons
SORT BY 'FirstName' DESC
b) SELECT * FROM Persons
ORDER FirstName DESC
c) SELECT * FROM Persons
SORT 'FirstName' DESC
d) SELECT * FROM Persons
ORDER BY FirstName DESC
16. Cum se poate insera o
nouă înregistrare în tabela
‘Persons’?
a) INSERT INTO Persons VALUES ('Jimmy',
'Jackson')
b) INSERT ('Jimmy', 'Jackson') INTO Persons
c) INSERT VALUES ('Jimmy', 'Jackson') INTO
Persons
17. Cum se poate insera
‘Olsen’ ca ‘LastName’ în
tabela ‘Persons’?
a) INSERT INTO Persons ('Olsen') INTO
LastName
b) INSERT ('Olsen') INTO Persons (LastName)
c) INSERT INTO Persons (LastName) VALUES
('Olsen')
18. Cum se schimbă numele
‘Hansen’ în ‘Nilsen’ în
coloana ‘LastName’ a tabelei
‘Persons’?
a) UPDATE Persons SET LastName='Hansen' INTO
LastName='Nilsen‘
b) MODIFY Persons SET LastName='Nilsen'
WHERE LastName='Hansen‘
c) MODIFY Persons SET LastName='Hansen' INTO
LastName='Nilsen
d) UPDATE Persons SET LastName='Nilsen'
WHERE LastName='Hansen'
19. Cum se pot șterge
înregistrările pentru care
‘FirstName’ este ‘Peter’ în
tabela ‘Persons’?
a) DELETE FirstName='Peter' FROM Persons
b) DELETE FROM Persons
WHERE FirstName = 'Peter‘
c) DELETE ROW FirstName='Peter' FROM
Persons
20. Cum se poate obține
numărul de înregistrări din
tabela ‘Persons’?
a) SELECT COUNT() FROM Persons
b) SELECT COLUMNS() FROM Persons
c) SELECT COLUMNS(*) FROM Persons
d) SELECT COUNT(*) FROM Persons

Similar documents