Sunteți pe pagina 1din 204

Curs pentru specializrile Informatic anul II Matematic-Informatic anul III Semestrul I, 2011/2012 Horea Oros, horea.oros@gmail.

com

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 Island Trading Galera del gastrnomo Laughing Bacchus Wine Cellars Paris spcialits Simons bistro Wolski Zajazd Country UK Spain Canada France Denmark 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 interogri la baza de date SQL poate extrage date din baza de date SQL poate insera nregistrri n baza de date SQL poate actualiza nregistrri n baza de date SQL poate terge nregistrri 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, funcii, triggere SQL poate crea vizualizri n baza de date SQL poate stabili permisiuni asupra entitilor din baza de date

SQL este un standard DAR


Cu toate c SQL este standard ANSI, exist

mai multe versiuni ale limbajului SQL Totui, cel puin comenzile principale (SELECT, UPDATE, INSERT, DELETE) sunt permise ntr-un mod aproape unitar de toate implementrile, 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 conine cel puin o tabel

identificat prin nume. Tabelele conin nregistrri cu date


P_Id 1 2 3 LastName Hansen Svendson Pettersen FirstName Ola Tove Kari Address Borgvn 23 Storgt 20 City Sandnes Stavanger Timoteivn 10 Sandnes

Trei nregistrri, 5 cmpuri (coloane)

Instruciuni SQL
Majoritatea operaiilor efectuate asupra

bazelor de date se fac cu comenzi/instruciuni SQL


SELECT * FROM Persons

SQL nu ine cont de diferena dintre litere

mari i mici Unele SGBD-uri necesit caracterul ; dup instruciuni. Astfel se separ instruciunile SQL pentru ca s se poat executa mai multe instruciuni 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 nregistrri 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, indeci, stabilire legturi ntre tabele, constrngeri

SQL DML i DDL (DCL, TCL) cont.


CREATE DATABASE ALTER DATABASE CREATE TABLE

ALTER TABLE
DROP TABLE

CREATE INDEX DROP INDEX

Instruciunea SELECT
Instruciunea SELECT se folosete 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 1 2 3 LastName Hansen Svendson Pettersen FirstName Ola Tove Kari Address Timoteivn 10 Borgvn 23 Storgt 20 City Sandnes Sandnes Stavanger

SELECT LastName,FirstName FROM Persons


LastName Hansen Svendson Pettersen FirstName Ola Tove Kari

Instruciunea SELECT DISTINCT


ntr-o tabel, unele coloane pot conine valori

duplicate. Asta nu e o problem, totui, uneori vrem s listm doar valorile diferite (distincte) din tabel. Cuvntul cheie DISTINCT poate fi folosit pentru aceasta. Sintaxa
SELECT DISTINCT column_name(s)

FROM table_name

Exemplu SELECT DISTINCT


Vrem s selectm valorile distincte din

coloana City
P_Id 1 2 3 LastName Hansen Svendson Pettersen FirstName Ola Tove Kari Address Timoteivn 10 Borgvn 23 Storgt 20 City Sandnes Sandnes Stavanger

SELECT DISTINCT City FROM Persons


City Sandnes Stavanger

Clauza WHERE
Folosit pentru a filtra nregistrri Folosit pentru a extrage doar nregistrrile

care ndeplinesc un anumit criteriu Sintaxa


SELECT column_name(s)

FROM table_name WHERE column_name operator value

Exemplu clauza WHERE


P_Id 1 2 3 LastName Hansen Svendson Pettersen FirstName Ola Tove Kari Address Timoteivn 10 Borgvn 23 Storgt 20 City Sandnes Sandnes Stavanger

SELECT * FROM Persons

WHERE City='Sandnes'
P_Id 1 2 LastName Hansen Svendson FirstName Ola Tove Address Timoteivn 10 Borgvn 23 City Sandnes Sandnes

Ghilimele - apostroafe
SQL folosete 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 Greit:
SELECT * FROM Persons WHERE FirstName=Tove SELECT * FROM Persons WHERE Year='1965'

Operatori pentru clauza WHERE


Operator = <> > < >= <= BETWEEN LIKE IN Descriere Egalitate Inegalitate Mai mare Mai mic Mai mare sau egal Mai mic sau egal ntr-un interval nchis La fel ca un ablon O mulime enumerat explicit

Operatorii AND i OR
Se folosesc pentru a filtra nregistrrile dup

mai multe condiii


P_Id 1 2 3 LastName Hansen Svendson Pettersen FirstName Ola Tove Kari Address Timoteivn 10 Borgvn 23 Storgt 20 City Sandnes Sandnes Stavanger

SELECT * FROM Persons WHERE

FirstName='Tove AND LastName='Svendson


P_Id 2 LastName Svendson FirstName Tove Address Borgvn 23 City Sandnes

Operatorii AND i OR (cont.)


SELECT * FROM Persons WHERE

FirstName='Tove OR FirstName='Ola
P_Id 1 2 LastName Hansen Svendson FirstName Ola Tove Address Timoteivn 10 Borgvn 23 City Sandnes Sandnes

SELECT * FROM Persons WHERE

LastName='Svendson' AND (FirstName='Tove' OR FirstName='Ola')


P_Id 2 LastName Svendson FirstName Tove Address Borgvn 23 City Sandnes

Clauza ORDER BY - sortare


Cuvntul cheie ORDER BY se folosete pentru

a sorta rezultatul dup o anumit coloan sau coloane Ordonarea/sortarea se face n mod implicit cresctor Ordonarea descresctoare DESC Sintaxa:
SELECT column_name(s)

FROM table_name ORDER BY column_name(s) ASC | DESC

Clauza ORDER BY - exemplu


P_Id 1 2 3 4 LastName FirstName Address Hansen Svendson Pettersen Nilsen Ola Tove Kari Tom Timoteivn 10 Borgvn 23 Storgt 20 Vingvn 23 City Sandnes Sandnes Stavanger Stavanger

SELECT * FROM Persons

ORDER BY LastName
P_Id 1 4 3 2 LastName FirstName Address Hansen Nilsen Pettersen Svendson Ola Tom Kari Tove Timoteivn 10 Vingvn 23 Storgt 20 Borgvn 23 City Sandnes Stavanger Stavanger Sandnes

Instruciunea INSERT INTO


O folosim pentru a insera noi nregistrri 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 1 2 3 LastName Hansen Svendson Pettersen FirstName Ola Tove Kari Address Timoteivn 10 Borgvn 23 Storgt 20 City Sandnes Sandnes Stavanger

INSERT INTO Persons

VALUES (4,'Nilsen', 'Johan', 'Bakken 2', 'Stavanger')


P_Id 1 2 3 4 LastName Hansen Svendson Pettersen Nilsen FirstName Ola Tove Kari Johan Address Timoteivn 10 Borgvn 23 Storgt 20 Bakken 2 City Sandnes Sandnes Stavanger Stavanger

Exemplu INSERT INTO


Inserare de date doar n anumite coloane
INSERT INTO Persons (P_Id, LastName,

FirstName) VALUES (5, 'Tjessem', 'Jakob')


P_Id 1 2 3 4 5 LastName Hansen Svendson Pettersen Nilsen Tjessem FirstName Ola Tove Kari Johan Jakob Address Timoteivn 10 Borgvn 23 Storgt 20 Bakken 2 City Sandnes Sandnes Stavanger Stavanger

Instruciunea UPDATE
Se folosete 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 nregistrrilor din tabel

Instruciunea UPDATE exemplu


P_Id 1 2 3 4 5 LastName Hansen Svendson Pettersen Nilsen Tjessem FirstName Ola Tove Kari Johan Jakob Address Timoteivn 10 Borgvn 23 Storgt 20 Bakken 2 City Sandnes Sandnes Stavanger Stavanger

UPDATE Persons

SET Address='Nissestien 67', City='Sandnes' WHERE LastName='Tjessem' AND FirstName='Jakob'

Instruciunea UPDATE exemplu - rezultatul


P_Id 1 2 3 4 5 LastName Hansen Svendson Pettersen Nilsen Tjessem FirstName Ola Tove Kari Johan Jakob Address Timoteivn 10 Borgvn 23 Storgt 20 Bakken 2 Nissestien 67 City Sandnes Sandnes Stavanger Stavanger Sandnes

UPDATE Persons

SET Address='Nissestien 67', City='Sandnes' WHERE LastName='Tjessem' AND FirstName='Jakob'

Instruciunea UPDATE !!!


UPDATE Persons

SET Address='Nissestien 67', City='Sandnes'


P_Id 1 2 3 4 5 LastName Hansen Svendson Pettersen Nilsen Tjessem FirstName Ola Tove Kari Johan Jakob Address Nissestien 67 Nissestien 67 Nissestien 67 Nissestien 67 Nissestien 67 City Sandnes Sandnes Sandnes Sandnes Sandnes

Instruciunea DELETE
O folosim pentru a terge nregistrri dintr-o

tabel Sintaxa:
DELETE FROM table_name

WHERE some_column=some_value

!!! Omiterea clauzei WHERE duce la tergerea

tuturor nregistrrilor din tabel

Instruciunea DELETE exemplu


P_Id 1 2 3 4 5 LastName Hansen Svendson Pettersen Nilsen Tjessem FirstName Ola Tove Kari Johan Jakob Address Timoteivn 10 Borgvn 23 Storgt 20 Bakken 2 Nissestien 67 City Sandnes Sandnes Stavanger Stavanger Sandnes

DELETE FROM Persons

WHERE LastName='Tjessem' AND FirstName='Jakob'

Instruciunea DELETE exemplu - rezultatul


P_Id 1 2 3 4 LastName Hansen Svendson Pettersen Nilsen FirstName Ola Tove Kari Johan Address Timoteivn 10 Borgvn 23 Storgt 20 Bakken 2 City Sandnes Sandnes Stavanger Stavanger

DELETE FROM Persons

WHERE LastName='Tjessem' AND FirstName='Jakob'

tergerea tuturor nregistrrilor


DELETE FROM table_name
SAU

DELETE * FROM table_name

Nu exist UNDO pentru operaia 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 Alfreds Futterkiste ContactName Maria Anders Address Obere Str. 57 City Berlin

Berglunds snabbkp Christina Berglund Centro comercial Francisco Chang Moctezuma Ernst Handel Roland Mendel FISSA Fabrica Inter. Salchichas S.A. Galera del gastrnomo Diego Roel Eduardo Saavedra

Berguvsvgen 8 Lule Sierras de Granada 9993 Kirchgasse 6 C/ Moralzarzal, 86 Rambla de Catalua, 23 Mxico D.F. Graz Madrid Barcelona

Baze de date - interogri


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 numrul de

nregistrri ce se vor returna Util cnd tabel are foarte multe nregistrri Returnarea unui numr mare de nregistrri poate afecta performana 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 1 2 3 4 LastName Hansen Svendson Pettersen Nilsen FirstName Ola Tove Kari Tom Address Timoteivn 10 Borgvn 23 Storgt 20 Vingvn 23 City Sandnes Sandnes Stavanger Stavanger

SELECT TOP 2 * FROM Persons


SELECT TOP 50 PERCENT * FROM Persons
P_Id 1 2 LastName Hansen Svendson FirstName Ola Tove Address Timoteivn 10 Borgvn 23 City Sandnes Sandnes

Operatorul LIKE
Folosit n clauza WHERE pentru a specifica un

ablon de cutare ntr-o coloan Sintaxa:


SELECT column_name(s)

FROM table_name WHERE column_name LIKE pattern

Operatorul LIKE - exemple


P_Id 1 2 3 LastName Hansen Svendson Pettersen FirstName Ola Tove Kari Address Timoteivn 10 Borgvn 23 Storgt 20 City Sandnes Sandnes Stavanger

SELECT * FROM Persons

WHERE City LIKE 's%


nregistrrile n care City ncepe cu litera s

SELECT * FROM Persons

WHERE City LIKE '%s


nregistrrile n care City se termin cu litera s

SELECT * FROM Persons

WHERE City NOT LIKE '%tav%'

Operatorul LIKE caractere pentru ablon


Putem folosi urmtoarele caractere pentru

ablon
Caracter % _ [charlist] [^charlist] sau [!charlist] Descriere nlocuiete zero sau mai multe caractere nlocuiete un singur caracter Orice caracter din list 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 1 2 3 LastName Hansen Svendson Pettersen FirstName Ola Tove Kari Address Timoteivn 10 Borgvn 23 Storgt 20 City Sandnes Sandnes Stavanger

SELECT * FROM Persons

WHERE LastName IN ('Hansen','Pettersen')


P_Id 1 3 LastName Hansen Pettersen FirstName Ola Kari Address Timoteivn 10 Storgt 20 City Sandnes 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 1 2 3 LastName Hansen Svendson Pettersen FirstName Ola Tove Kari Address Borgvn 23 Storgt 20 City Sandnes Stavanger Timoteivn 10 Sandnes

SELECT * FROM Persons

WHERE LastName BETWEEN 'Hansen' AND 'Pettersen'


P_Id 1 LastName Hansen FirstName Ola Address City 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 folosii SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Hansen' AND 'Pettersen'

Alias
Se poate da un nume alias unei tabele sau

unei coloane Util cnd o tabel sau un cmp are un nume lung sau complex Util cnd vrem s dm un nume unei coloane cu valoare calculat Interogrile 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

Fr 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 relaii ntre anumite coloane din aceste tabele Cheia primar = o coloan (sau o combinaie de coloane) cu valori unice n fiecare nregistrare. Scopul este de a lega datele din mai multe tabele, fr a repeta datele din fiecare tabel

Join
Tabela Persons
P_Id 1 2 3 LastName Hansen Svendson Pettersen FirstName Ola Tove Kari Address Borgvn 23 Storgt 20 City Sandnes Stavanger Timoteivn 10 Sandnes

Tabela Orders
O_Id 1 2 3 4 5

OrderNo 77895 44678 22456 24562 34764

P_Id 3 3 1 1 15

Join mai multe tipuri


JOIN/INNER JOIN: Extrage linii cnd este cel

puin o potrivire n ambele tabele LEFT JOIN: Extrage toate liniile din tabela din stnga, 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 stnga FULL JOIN: Combinaie ntre LEFT i RIGHT

INNER JOIN
Extrage linii cnd este cel puin 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 Hansen Hansen Pettersen Pettersen FirstName Ola Ola Kari Kari OrderNo 22456 24562 77895 44678

LEFT JOIN
Extrage toate nregistrrile din table din

stnga, chiar i atunci cnd 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 numete 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 Hansen Hansen Pettersen Pettersen Svendson FirstName Ola Ola Kari Kari Tove OrderNo 22456 24562 77895 44678

RIGHT JOIN
Extrage toate nregistrrile din table din

dreapta, chiar i cele pentru care nu sunt potriviri n tabela din stnga 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 numete RIGHT OUTER

JOIN

RIGHT JOIN - exemplu


Tabela Persons
P_Id 1 2 3 LastName Hansen Svendson Pettersen FirstName Ola Tove Kari Address Timoteivn 10 Borgvn 23 Storgt 20 City Sandnes Sandnes Stavanger

Tabela Orders
O_Id OrderNo 1 2 3 4 5 77895 44678 22456 24562 34764 P_Id 3 3 1 1 15

RIGHT JOIN - exemplu


Extragem toate comenzile cu persoanele

corespunztoare
SELECT Persons.LastName, Persons.FirstName,

Orders.OrderNo FROM Persons RIGHT JOIN Orders ON Persons.P_Id=Orders.P_Id ORDER BY Persons.LastName


LastName Hansen Hansen Pettersen Pettersen FirstName Ola Ola Kari Kari OrderNo 22456 24562 77895 44678 34764

FULL JOIN
Extrage nregistrrile 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 nregistrrile din tabela din

stnga i toate nregistrrile din tabela din dreapta

FULL JOIN - exemplu


Toate persoanele cu comenzile lor i toate

comenzile cu persoanele corespunztoare


SELECT Persons.LastName, Persons.FirstName,

Orders.OrderNo FROM Persons FULL JOIN Orders ON Persons.P_Id=Orders.P_Id ORDER BY Persons.LastName


LastName Hansen Hansen Pettersen Pettersen Svendson FirstName Ola Ola Kari Kari Tove 34764 OrderNo 22456 24562 77895 44678

Operatorul UNION
Folosit pentru a combina dou sau mai multe

instruciuni SELECT Fiecare instruciune SELECT trebuie s aib acelai numr de coloane Coloanele corespunztoare trebuie s aib i aceleai tipuri Coloanele trebuie s fie i n aceeai 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 01 02 03 04 E_Name Hansen, Ola Svendson, Tove Svendson, Stephen Pettersen, Kari

Employees_USA
E_ID 01 02 03 04 E_Name Turner, Sally Kent, Clark Svendson, Stephen 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 stabilete tipul valorilor pentru

coloana respectiv (tipuri de date MSMSQL)

Tipuri de date MSSQL


iruri de caractere
Tip de date char(n) Descriere Stocare n 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

Tipuri de date MSSQL


iruri de caractere Unicode
Tip de date nchar(n) Descriere Stocare 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

Tipuri de date MSSQL


Tipuri binare
Tip de date bit binary(n) Descriere Permite 0, 1, sau NULL fix. Maxim variabil. variabil. variabil. Stocare

Date binare de lungime 8000 octei varbinary(n) Date binare de lungime Maxim 8000 octei varbinary(max) Date binare de lungime Maxim 2GB image Date binare de lungime Maxim 2GB

Tipuri de date MSSQL


Tipuri numerice
Tip de date tinyint smallint int bigint Descriere 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 Stocare 2 octei 4 octei 8 octei Permite numere ntregi de la 0 la 255 1 octet

Tipuri de date MSSQL


Tipuri numerice
Tip de date decimal(p,s) numeric(p,s) Descriere Stocare Numere cu precizie i magnitudine 5-17 fix. Permite numere de la -10^38 +1 octei la 10^38 1. Parametrul p indic numrul maxim de cifre ce pot fi stocate (att n partea stng ct i n partea dreapt a punctului zecimal). p trebuie s fie ntre 1 i 38. Implicit este 18. Parametrul s indic numrul 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 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 numrul de octei 4 sau 8. float(24) cmp de 4 octei, iar float(53) cmp de 8 octei. Valoarea implicit pentru n este 53. real Date numerice n virgul mobil de la 3.40E + 38 la 3.40E + 38 Stocare 4 octei 8 octei

4 sau 8 octei

4 octei

Tipuri de date MSSQL


Tipuri pentru dat/or
Tip de date datetime Descriere Stocare 8 octei 6-8 octei 4 octei 3 octei 3-5 octei 8-10 octei January 1, 1753 - December 31, 9999 cu acuratee de 3.33 milisecunde datetime2 January 1, 0001 - December 31, 9999 cu acuratee de 100 nanosecunde smalldatetime January 1, 1900 - June 6, 2079 cu acuratee de 1 minut date Stocheaz doar data. January 1, 0001 - December 31, 9999 time Stocheaz doar ora cu o acuratee de 100 nanosecunde datetimeoffset La fel ca i datetime2 + are adugat time zone offset

Tipuri de date MSSQL


Tipuri pentru dat/or
Tip de date timestamp Descriere Stocheaz un numr unic care este actualizat de fiecare dat cnd o nregistrare se creeaz sau se modific. Valoarea este bazat pe ceasul intern i nu are legtur cu ceasul real. Fiecare tabel poate avea un singur cmp de acest tip Stocare

Tipuri de date MSSQL


Alte tipuri de date
Tip de date sql_variant Descriere Stocheaz pn la 8000 de octei de date de diverse tipuri cu excepia text, ntext, i timestamp Stocheaz un globally unique identifier (GUID) Stocheaz date n format XML. Maximum 2GB Stocheaz o referin la un cursor folosit pentru operaii cu baza de date Stocheaz un result-set pentru procesare ulterioar

uniqueidentifier xml cursor 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

Constrngeri
Se folosesc pentru a limita tipul datelor care pot

ajunge n tabel Se pot specifica la crearea tabelei (n instruciunea CREATE TABLE) sau dup ce a fost creat tabela (cu instruciunea ALTER TABLE)

NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK DEFAULT

Constrngerea NOT NULL


Implicit o tabel poate conine n cmpurile

sale valori NULL NOT NULL va determina ca aceast valoare s nu fie acceptat n coloana asupra creia se aplic constrngerea Cu aceast constrngere nu se vor putea aduga nregistrri sau nu se vor putea actualiza fr a specifica o valoarea pentru cmpul respectiv

Constrngerea 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) )

Constrngerea UNIQUE
Folosit asupra unei coloane n care nu se vor

permite date duplicate UNIQUE i PRIMARY KEY ofer garania de unicitate pentru o coloan sau mulime de coloane O constrngere de tip PRIMARY KEY are ntotdeauna definit i o constrngere UNIQUE Putem avea mai multe constrngeri UNIQUE dar o singur constrngere PRIMARY KEY

Constrngerea 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) )

Constrngerea UNIQUE exemplu


Nume pentru o constrngere 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) )

Constrngerea UNIQUE cu ALTER TABLE


Definirea unei constrngeri 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 constrngeri


MySQL
ALTER TABLE Persons

DROP INDEX uc_PersonID

SQL Server / Oracle / MS Access


ALTER TABLE Persons

DROP CONSTRAINT uc_PersonID

Constrngerea PRIMARY KEY


Identific n mod unic fiecare nregistrare din

tabel Cheia primar trebuie s conin valori unice Nu poate conine valoarea NULL Fiecare tabel trebuie s aib o cheie primar i numai una

Constrngerea 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) )

Constrngerea 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) )

Constrngerea PRIMARY KEY


Pentru a da un nume constrngerii i pentru a
CREATE TABLE Persons

permite o cheie primar format din mai multe cmpuri folosim sintaxa:
( 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) )

Constrngerea PRIMARY KEY


Crearea unei constrngeri 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 nct s nu accepte valoarea NULL

Constrngerea PRIMARY KEY


Eliminarea unei constrngeri de cheie

primar MySQL
ALTER TABLE Persons

DROP PRIMARY KEY

SQL Server / Oracle / MS Access


ALTER TABLE Persons

DROP CONSTRAINT pk_PersonID

Constrngerea FOREIGN KEY


O cheie strin dintr-o tabel pointeaz la o

cheie primar din alt tabel


Tabela Persons
P_Id
1

LastName
Hansen

FirstName
Ola

Address
Timoteivn 10

City
Sandnes

2 3

Svendson Pettersen

Tove Kari

Borgvn 23 Storgt 20

Sandnes Stavanger

Tabela Orders
O_Id 1 2 3
4

OrderNo 77895 44678 22456


24562

P_Id 3 3 2
1

Constrngerea 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 Constrngerea de tip FOREIGN KEY este folosit pentru a preveni aciuni care ar distruge legturile dintre cele dou tabele De asemenea mpiedic introducerea de date invalide ce nu se regsesc n cheia primar

Constrngerea 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) )

Constrngerea 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) )

Constrngerea FOREIGN KEY


Pentru a stabili un nume pentru constrngere

i pentru a defini constrngerea 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) )

Constrngerea FOREIGN KEY


Adugarea constrngerii dup crearea tabelei
ALTER TABLE Orders

ADD FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)

Stabilirea unui nume pentru constrngere i

definire constrngere pe mai multe cmpuri


ALTER TABLE Orders

ADD CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)

Constrngerea FOREIGN KEY


Eliminarea unei constrngeri MySQL
ALTER TABLE Orders

DROP FOREIGN KEY fk_PerOrders

SQL Server / Oracle / MS Access


ALTER TABLE Orders

DROP CONSTRAINT fk_PerOrders

Constrngerea 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

Constrngerea 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) )

Constrngerea 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) )

Constrngerea CHECK
Pentru a stabili un nume pentru o

constrngere i pentru a defini o constrngere 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) )

Constrngerea CHECK
Stabilirea unei constrngeri dup crearea

tabelei
ALTER TABLE Persons

ADD CHECK (P_Id>0)

Stabilirea unui nume pentru constrngere i

crearea unei constrngeri pe mai multe coloane


ALTER TABLE Persons

ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')

Constrngerea CHECK
Eliminarea unei constrngeri SQL Server / Oracle / MS Access
ALTER TABLE Persons

DROP CONSTRAINT chk_Person

Constrngerea DEFAULT
Folosit pentru a insera o valoare implicit

ntr-o coloan Valoarea implicit va fi adugat la toate nregistrrile noi, dac nu se specific o alt valoare Poate fi folosit i pentru a insera valori sistem obinute prin apelul unor funcii

Constrngerea 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' )

Constrngerea DEFAULT exemplu


CREATE TABLE Orders

( O_Id int NOT NULL, OrderNo int NOT NULL, P_Id int, OrderDate date DEFAULT GETDATE() )

Constrngerea DEFAULT
Adugarea unei constrngeri 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'

Constrngerea DEFAULT
Eliminarea unei constrngeri de valoare

implicit MySQL
ALTER TABLE Persons

ALTER City DROP DEFAULTSQL

Server / Oracle / MS Access


ALTER TABLE Persons

ALTER COLUMN City DROP DEFAULT

Instruciunea CREATE INDEX


Folosit pentru a crea indeci pe tabele Rolul indecilor este de a permite gsirea

rapid i eficient a datelor, fr a citi ntreg tabelul Actualizarea unei tabele ce conine indeci este mai lent pentru c trebuie actualizai i indecii Indecii trebuie creai doar pentru coloane pe care se vor face cutri frecvente

Instruciunea CREATE INDEX


Sintaxa:
CREATE INDEX index_name

ON table_name (column_name)

Aici se permit valori duplicate


Creare de indeci unici valorile duplicate nu

sunt permise
CREATE UNIQUE INDEX index_name

ON table_name (column_name)

Sintaxa poate diferi ntre SGBD-uri

Instruciunea CREATE INDEX


Exemplu
CREATE INDEX PIndex

ON Persons (LastName)

Creare de index pe o combinaie de coloane


CREATE INDEX PIndex

ON Persons (LastName, FirstName)

Instruciunea 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

Instruciunea 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 nregistrrile

dintr-o tabel
TRUNCATE TABLE table_name

Instruciunea ALTER TABLE


Folosit pentru a aduga, modifica, terge,

coloane dintr-o tabel Adugarea 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

Instruciunea ALTER TABLE exemplu


P_Id 1 2
3

LastName Hansen Svendson


Pettersen

FirstName Ola Tove


Kari

Address Timoteivn 10 Borgvn 23


Storgt 20

City Sandnes Sandnes


Stavanger

Vrem s adugm o nou coloan


ALTER TABLE Persons

ADD DateOfBirth date


P_Id LastName 1
2

FirstName Ola
Tove

Address Timoteivn 10
Borgvn 23

City Sandnes
Sandnes

DateOfBirth

Hansen
Svendson

Pettersen

Kari

Storgt 20

Stavanger

Instruciunea ALTER TABLE exemplu


Schimbarea tipului de date pentru coloane

DateofBirth n tabela Persons


ALTER TABLE Persons

ALTER COLUMN DateOfBirth year

Eliminarea coloanei adugate anterior


ALTER TABLE Persons

DROP COLUMN DateOfBirth

Auto increment
Permite generarea automat a unui numr

unic atunci cnd se insereaz o nou nregistrare n tabel De regul cnd cheia primar este de tip numeric i e format dintr-un singur cmp, 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 pornete de la 1 i crete cu 1 Altfel


ALTER TABLE Persons AUTO_INCREMENT=100

Auto increment
Dac vrem s adugm o nou nregistrare n

tabel nu mai trebuie s specificm cmpul 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 pornete de la 1 i crete cu 1 Altfel


IDENTITY(10,5)

Pentru a aduga 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 interogri Conine linii i coloane la fel ca i o tabel real Cmpurile unui view sunt cmpurile uneia sau a mai multor tabele din baza de date Putem aduga funcii SQL, clauza WHERE i JOIN i s prezentm 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 instruciunea SELECT de fiecare dat cnd 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

Interogri
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 ncercm s o inserm

trebuie s se potriveasc cu formatul coloanei de tip dat din tabel Atunci cnd apare i partea de timp/or lucrurile se complic Exist o serie de funcii predefinite pentru procesarea informaiile legate de dat/or

Funcii MySQL pentru dat/or


Funcia NOW() CURDATE() CURTIME() DATE() EXTRACT() DATE_ADD() DATE_SUB() DATEDIFF() DATE_FORMAT() Descriere Data i ora curent Data curent Ora curent Extrage partea de dat dintr-o expresie de tip dat sau dat/or Extrage o singur parte din dat/or Adaug un anumit interval de timp unei date Scade un anumit interval de timp dintr-o dat Calculeaz intervalul dintre dou date Afieaz data/ora n diverse formate

Funcii SQL Server pentru dat/or


Funcia GETDATE() DATEPART() DATEADD() DATEDIFF() CONVERT() Descriere Obine data i ora curent Extrage o singur parte din dat/or Adun sau scade un anumit interval dintr-o dat/or Calculeaz timpul dintre dou date/ore Afieaz data/ora n diverse formate

NULL
Reprezint date lips/necunoscute/inaplicabile Implicit o coloan poate conine valoarea NULL Operatori pentru NULL:
IS NULL IS NOT NULL

Cnd valoarea unei coloane este opional

putem aduga o nregistrare sau o putem actualiza fr 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 folosete ca un marcator pentru date necunoscute/inaplicabile NULL i 0 (zero) nu sunt echivalente sau comparabile

NULL
Tabela Persons
P_Id 1 2 3 LastName Hansen Svendson Pettersen FirstName Address Ola Tove Kari Borgvn 23 City Sandnes Sandnes Stavanger

Coloana Address este opional Se va salva NULL dac nu specificm o adres Nu putem folosi operatorii relaionali sau de

egalitate pentru a testa valorile NULL

NULL operatorul IS NULL


Extragem nregistrrile cu adresa NULL
SELECT LastName, FirstName, Address FROM

Persons WHERE Address IS NULL

Rezultatul
LastName Hansen Pettersen FirstName Address Ola Kari

NULL operatorul IS NOT NULL


Extragem nregistrrile cu adresa completat
SELECT LastName, FirstName, Address FROM

Persons WHERE Address IS NOT NULL

Rezultatul
LastName Svendson FirstName Address Tove Borgvn 23

Funciile ISNULL(), NVL(), IFNULL() i COALESCE()


Tabela Products
P_Id ProductName 1
2

UnitPrice 10.45
32.56

UnitsInStock 16
23

UnitsOnOrder 15 20

Jarlsberg
Mascarpone

Gorgonzola

15.67

SELECT ProductName,

UnitPrice*(UnitsInStock+UnitsOnOrder) FROM Products

Dac UnitsOnOrder este NULL rezultatul va

fi NULL

Funciile ISNULL(), NVL(), IFNULL() i COALESCE()


Funcia ISNULL() (Microsoft) ne permite s

specificm modul n care dorim s tratm valorile NULL NVL(), IFNULL(), COALESCE() pot fi folosite pentru a realiza acelai 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

Funciile ISNULL(), NVL(), IFNULL() i COALESCE()


Oracle nu are funcia ISNULL() Putem folosi funcia NVL()
SELECT ProductName,

UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0)) FROM Products

MySQL are funcia ISNULL() dar funcioneaz

puin diferit. Putem folosi IFNULL()


SELECT ProductName,

UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0)) FROM Products

Funciile ISNULL(), NVL(), IFNULL() i COALESCE()


MSSQL Coalesce
SELECT ProductName, UnitPrice*(UnitsInStock+

COALESCE(UnitsOnOrder,0)) FROM Products

Funcii SQL
SQL are multe funcii pentru a efectua calcule

asupra datelor Funcii de agregare calculeaz o valoare pe baza valorilor din coloanele tabelei

AVG() Calculeaz o valoare medie COUNT() ntoarce numrul de nregistrri FIRST() ntoarce prima valoare LAST() ntoarce ultima valoare MAX() ntoarce cea mai mare valoare MIN() - ntoarce cea mai mic valoare SUM() Calculeaz suma

Funcii SQL
Funcii scalare calculeaz o singur valoare pe

baza unei valori de intrare


UCASE() convertete n litere mari LCASE() convertete n litere mici MID() extrage caractere dintr-un cmp de tip text LEN() calculeaz lungimea unui cmp de tip text ROUND() rotunjete un cmp numeric la numrul de zecimale specificat NOW() ntoarce data i ora curent din sistem FORMAT() stabilete modul n care este afiat un cmp

Funcia AVG()
Calculeaz valoarea medie pe o coloan Sintaxa
SELECT AVG(column_name) FROM table_name

Funcia AVG() - Exemplu


Calculm media pe coloana OrderPrice
SELECT AVG(OrderPrice) AS OrderAverage FROM

Orders
O_Id 1 2 3 4 5 6 OrderDate OrderPrice Customer 2008/11/12 1000 2008/10/23 1600 2008/09/02 700 2008/09/03 300 2008/08/30 2000 2008/10/04 100 Hansen Nilsen Hansen Hansen Jensen Nilsen

OrderAverage 950

Funcia AVG() - Exemplu


Vrem s aflm clienii care au valoarea

OrderPrice mai mare dect media


SELECT Customer FROM Orders

WHERE OrderPrice> (SELECT AVG(OrderPrice) FROM Orders)


Customer Hansen Nilsen Jensen

Funcia COUNT()
Calculeaz numrul de nregistrri care

respect un anumit criteriu Valorile NULL nu vor fi numrate Sintaxa


SELECT COUNT(column_name) FROM

table_name

Pentru a afla numrul de nregistrri din

tabel
SELECT COUNT(*) FROM table_name

Funcia COUNT()
Numrul de valori distincte dintr-o coloan se

calculeaz astfel:
SELECT COUNT(DISTINCT column_name) FROM

table_name

Funcia COUNT() exemplu


Numrul de comenzi ale clientului Nilsen
O_Id 1 2
3

OrderDate 2008/11/12 2008/10/23


2008/09/02

OrderPrice 1000 1600


700

Customer Hansen Nilsen


Hansen

4 5 6

2008/09/03 2008/08/30 2008/10/04

300 2000 100

Hansen Jensen Nilsen

SELECT COUNT(Customer) AS CustomerNilsen

FROM Orders WHERE Customer='Nilsen'


CustomerNilsen 2

Funcia COUNT(*) exemplu


Numrul de comenzi din tabela Orders o

gsim astfel:
SELECT COUNT(*) AS NumberOfOrders FROM

Orders
NumberOfOrders 6

Reprezint numrul total de nregistrri din

tabel

Funcia COUNT(DISTINCT) exemplu


Vrem s gsim numrul de clieni unici
SELECT COUNT(DISTINCT Customer) AS

NumberOfCustomers FROM Orders


NumberOfCustomers 3

Funcia FIRST()
ntoarce prima valoare din coloana indicat Sintaxa
SELECT FIRST(column_name) FROM table_name

Tabela Orders
O_Id 1 2 3 4 5 6

OrderDate OrderPrice Customer 2008/11/12 1000 2008/10/23 1600 2008/09/02 700 2008/09/03 300 2008/08/30 2000 2008/10/04 100 Hansen Nilsen Hansen Hansen Jensen Nilsen

Funcia FIRST() - exemplu


Prima valoare din coloana OrderPrice
SELECT FIRST(OrderPrice) AS FirstOrderPrice

FROM Orders

Dac funcia nu exist n SGBD atunci:


SELECT OrderPrice

FROM Orders ORDER BY O_Id LIMIT 1


FirstOrderPrice 1000

Funcia LAST()
ntoarce ultima valoare din coloana indicat Sintaxa
SELECT LAST(column_name) FROM table_name
O_Id 1 2 3 4 5 6 OrderDate OrderPrice Customer 2008/11/12 1000 2008/10/23 1600 2008/09/02 700 2008/09/03 300 2008/08/30 2000 2008/10/04 100 Hansen Nilsen Hansen Hansen Jensen Nilsen

Funcia LAST()
Dac SGBD-ul nu are aceast funcie
SELECT OrderPrice FROM Orders ORDER BY O_Id

DESC LIMIT 1

Rezultatul
FirstOrderPrice 1000

Funcia 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

Funcia 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

Funcia 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 funciile 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 aflm totalul comenzilor pentru

fiecare client
SELECT Customer,SUM(OrderPrice) FROM Orders

GROUP BY Customer
Customer SUM(OrderPrice) Hansen Nilsen Jensen 2000 1700 2000

Clauza GROUP BY - exemplu


Dac omitem clauza GROUP BY
SELECT Customer,SUM(OrderPrice) FROM Orders
Customer Hansen Nilsen Hansen Hansen Jensen Nilsen SUM(OrderPrice) 5700 5700 5700 5700 5700 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 obine 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 funciile 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 gsim clienii cu comenzi totale mai

mici de 2000
SELECT Customer,SUM(OrderPrice) FROM Orders

GROUP BY Customer HAVING SUM(OrderPrice)<2000


Customer Nilsen SUM(OrderPrice) 1700

Clauza HAVING - exemplu


Vrem s aflm 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 Hansen Jensen SUM(OrderPrice) 2000 2000

Funcia UCASE()
Convertete n litere mari Sintaxa
SELECT UCASE(column_name) FROM

table_name

Sintaxa pentru MS SQL Server


SELECT UPPER(column_name) FROM

table_name

Funcia UCASE() - exemplu


Tabela Persons
P_Id 1 2 3 LastName Hansen Svendson Pettersen FirstName Ola Tove Kari Address Timoteivn 10 Borgvn 23 Storgt 20 City Sandnes Sandnes Stavanger

SELECT UCASE(LastName) as

LastName,FirstName FROM Persons


LastName FirstName HANSEN Ola SVENDSON Tove PETTERSEN Kari

Funcia LCASE()
Convertete n litere mici Sintaxa
SELECT LCASE(column_name) FROM

table_name

Sintaxa pentru MS SQL Server


SELECT LOWER(column_name) FROM

table_name

Funcia LCASE() - exemplu


Tabela Persons
P_Id 1 2 3 LastName Hansen Svendson Pettersen FirstName Ola Tove Kari Address Timoteivn 10 Borgvn 23 Storgt 20 City Sandnes Sandnes Stavanger

SELECT LCASE(LastName) as

LastName,FirstName FROM Persons


LastName FirstName hansen svendson pettersen Ola Tove Kari

Funcia MID()
Folosit pentru a extrage caractere dintr-un

cmp de tip text Sintaxa


SELECT MID(column_name,start[,length]) FROM

table_name
Parametru column_name start length Descriere Obligatoriu. Cmpul din care se extrag caractere Obligatoriu. Specific poziia de pornire (indexat de la 1) Opional. Numrul de caractere ce vor fi extrase. Dac lipsete, funcia extrage toate caracterele rmase

Funcia MID() - exemplu


Tabela Persons
P_Id 1 2 3 LastName Hansen Svendson Pettersen FirstName Ola Tove Kari Address Timoteivn 10 Borgvn 23 Storgt 20 City Sandnes Sandnes Stavanger

SELECT MID(City,1,4) as SmallCity FROM Persons


SmallCity Sand Sand Stav

Funcia LEN()
Calculeaz lungimea unui cmp de tip text Sintaxa
SELECT LEN(column_name) FROM table_name

Exemplu
SELECT LEN(Address) as LengthOfAddress FROM

Persons
LengthOfAddress 12 9 9

Funcia ROUND()
Folosit pentru a rotunji un numr la numrul

de zecimale specificat Sintaxa


SELECT ROUND(column_name,decimals) FROM

table_name
Parametru column_name decimals Descriere Obligatoriu. Cmpul care va fi rotujnit. Obligatoriu. Numrul de zecimale la care se face rotunjirea.

Funcia ROUND() exemplu


Tabela Products
Prod_Id 1 2
3

ProductName Jarlsberg Mascarpone


Gorgonzola

Unit 1000 g 1000 g


1000 g

UnitPrice 10.45 32.56


15.67

Vrem s extragem numele produsului i

preul rotunjit la cel mai apropiat ntreg


SELECT ProductName, ROUND(UnitPrice,0) as
ProductName
Jarlsberg

UnitPrice FROM Products


UnitPrice
10

Mascarpone Gorgonzola

33 16

Funcia NOW()
ntoarce data i ora curent a sistemului Sintaxa
SELECT NOW() FROM table_name
Prod_Id 1 2 3 ProductName Jarlsberg Mascarpone Gorgonzola Unit 1000 g 1000 g 1000 g UnitPrice 10.45 32.56 15.67

SELECT ProductName, UnitPrice, Now() as

PerDate FROM Products


ProductName Jarlsberg Mascarpone Gorgonzola UnitPrice 10.45 32.56 15.67 PerDate 10/7/2008 11:25:02 AM 10/7/2008 11:25:02 AM 10/7/2008 11:25:02 AM

Funcia FORMAT()
Folosit pentru a stabili modul n care este

afiat un cmp Sintaxa


SELECT FORMAT(column_name, format) FROM

table_name

Funcia FORMAT() - exemplu


Prod_Id ProductName Unit UnitPrice

1 2 3

Jarlsberg Mascarpone Gorgonzola

1000 g 1000 g 1000 g

10.45 32.56 15.67

SELECT ProductName, UnitPrice,

FORMAT(Now(),'YYYY-MM-DD') as PerDate FROM Products


ProductName Jarlsberg Mascarpone Gorgonzola UnitPrice 10.45 32.56 15.67 PerDate 2008-10-07 2008-10-07 2008-10-07

SQL QUIZ

1. Ce reprezint SQL?
a) Structured Question Language b) Structured Query Language c) Strong Question Language

2. Care instruciune SQL este folosit pentru a extrage date dintr-o baz de date?
a) EXTRACT
b) GET c) SELECT d) OPEN

3. Care instruciune SQL este folosit pentru a actualiza date n baza de date?
a) UPDATE b) SAVE c) SAVE AS d) MODIFY

4. Care instruciune SQL este folosit pentru a terge date n baza de date?
a) REMOVE b) COLLAPSE c) DELETE

5. Care instruciune 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 Personspentru 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 afieaz nregistrrile pentru care oricare din condiii este adevrat. Operatorul AND afieaz nregistrrile pentru care toate condiiile sunt adevrate.
a) Adevrat
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?
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'
a) SELECT * FROM Persons

12. Care instruciune SQL este folosit pentru a extrage doar valori distincte?
a) SELECT DISTINCT b) SELECT UNIQUE

c) SELECT DIFFERENT

14. Care cuvnt cheie SQL este folosit pentru a sorta rezultatul?
a) ORDER BY b) SORT c) ORDER d) SORT BY

15. Cum se pot extrage toate nregistrrile din tabela Persons ordonate descresctor 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 nregistrrile 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 obine numrul de nregistrri din tabela Persons?


a) SELECT COUNT() FROM Persons b) SELECT COLUMNS() FROM Persons

c) SELECT COLUMNS(*) FROM Persons


d) SELECT COUNT(*) FROM Persons