Informatic anul II Matematic-Informatic anul III Semestrul I Horea Oros, horea.oros@gmail.com 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 Galera del gastrnomo Spain Laughing Bacchus Wine Cellars Canada Paris spcialits 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 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
Trei nregistrri, 5 cmpuri (coloane) P_Id LastName FirstName Address City 1 Hansen Ola Timoteivn 10 Sandnes 2 Svendson Tove Borgvn 23 Sandnes 3 Pettersen Kari Storgt 20 Stavanger 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
SELECT LastName,FirstName 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 LastName FirstName Hansen Ola Svendson Tove Pettersen 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
SELECT DISTINCT City 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 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
SELECT * FROM Persons WHERE City='Sandnes' P_Id LastName FirstName Address City 1 Hansen Ola Timoteivn 10 Sandnes 2 Svendson Tove Borgvn 23 Sandnes 3 Pettersen Kari Storgt 20 Stavanger P_Id LastName FirstName Address City 1 Hansen Ola Timoteivn 10 Sandnes 2 Svendson Tove Borgvn 23 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 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 mulime enumerat explicit Operatorii AND i OR Se folosesc pentru a filtra nregistrrile dup mai multe condiii
SELECT * FROM Persons WHERE FirstName='Tove AND LastName='Svendson
P_Id LastName FirstName Address City 1 Hansen Ola Timoteivn 10 Sandnes 2 Svendson Tove Borgvn 23 Sandnes 3 Pettersen Kari Storgt 20 Stavanger 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
SELECT * FROM Persons WHERE LastName='Svendson' AND (FirstName='Tove' OR FirstName='Ola') P_Id LastName FirstName Address City 1 Hansen Ola Timoteivn 10 Sandnes 2 Svendson Tove Borgvn 23 Sandnes P_Id LastName FirstName Address City 2 Svendson Tove Borgvn 23 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
SELECT * FROM Persons ORDER BY LastName
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 P_Id LastName FirstName Address City 1 Hansen Ola Timoteivn 10 Sandnes 4 Nilsen Tom Vingvn 23 Stavanger 3 Pettersen Kari Storgt 20 Stavanger 2 Svendson Tove Borgvn 23 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
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 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 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
UPDATE Persons SET Address='Nissestien 67', City='Sandnes' WHERE LastName='Tjessem' AND FirstName='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 Instruciunea UPDATE exemplu - rezultatul
UPDATE Persons SET Address='Nissestien 67', City='Sandnes' WHERE LastName='Tjessem' AND FirstName='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 Nissestien 67 Sandnes Instruciunea 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 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
DELETE FROM Persons WHERE LastName='Tjessem' AND FirstName='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 Nissestien 67 Sandnes Instruciunea DELETE exemplu - rezultatul
DELETE FROM Persons WHERE LastName='Tjessem' AND FirstName='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 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 ContactName Address City Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin Berglunds snabbkp Christina Berglund Berguvsvgen 8 Lule Centro comercial Moctezuma Francisco Chang Sierras de Granada 9993 Mxico D.F. Ernst Handel Roland Mendel Kirchgasse 6 Graz FISSA Fabrica Inter. Salchichas S.A. Diego Roel C/ Moralzarzal, 86 Madrid Galera del gastrnomo Eduardo Saavedra Rambla de Catalua, 23 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
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 3 Pettersen Kari Storgt 20 Stavanger 4 Nilsen Tom Vingvn 23 Stavanger 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 cutare ntr-o coloan Sintaxa: SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern Operatorul LIKE - exemple
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%' P_Id LastName FirstName Address City 1 Hansen Ola Timoteivn 10 Sandnes 2 Svendson Tove Borgvn 23 Sandnes 3 Pettersen Kari Storgt 20 Stavanger Operatorul LIKE caractere pentru ablon Putem folosi urmtoarele caractere pentru ablon
Caracter Descriere % nlocuiete zero sau mai multe caractere _ nlocuiete 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
SELECT * FROM Persons WHERE LastName IN ('Hansen','Pettersen') P_Id LastName FirstName Address City 1 Hansen Ola Timoteivn 10 Sandnes 2 Svendson Tove Borgvn 23 Sandnes 3 Pettersen Kari Storgt 20 Stavanger 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
SELECT * FROM Persons WHERE LastName BETWEEN 'Hansen' AND 'Pettersen' P_Id LastName FirstName Address City 1 Hansen Ola Timoteivn 10 Sandnes 2 Svendson Tove Borgvn 23 Sandnes 3 Pettersen Kari Storgt 20 Stavanger 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 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
Tabela Orders P_Id LastName FirstName Address City 1 Hansen Ola Timoteivn 10 Sandnes 2 Svendson Tove Borgvn 23 Sandnes 3 Pettersen Kari Storgt 20 Stavanger 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 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 FirstName OrderNo Hansen Ola 22456 Hansen Ola 24562 Pettersen Kari 77895 Pettersen Kari 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 FirstName OrderNo Hansen Ola 22456 Hansen Ola 24562 Pettersen Kari 77895 Pettersen Kari 44678 Svendson Tove 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
Tabela Orders P_Id LastName FirstName Address City 1 Hansen Ola Timoteivn 10 Sandnes 2 Svendson Tove Borgvn 23 Sandnes 3 Pettersen Kari Storgt 20 Stavanger 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 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 FirstName OrderNo Hansen Ola 22456 Hansen Ola 24562 Pettersen Kari 77895 Pettersen Kari 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 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 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
Employees_USA E_ID E_Name 01 Hansen, Ola 02 Svendson, Tove 03 Svendson, Stephen 04 Pettersen, Kari 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 stabilete tipul valorilor pentru coloana respectiv (tipuri de date MSMSQL) Tipuri de date MSSQL iruri de caractere Tip de date Descriere Stocare char(n) ir de caractere de dimensiune fix. Maxim 8000 de caractere n 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 Descriere Stocare nchar(n) 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 Descriere Stocare bit Permite 0, 1, sau NULL binary(n) Date binare de lungime fix. Maxim 8000 octei
varbinary(n) Date binare de lungime variabil. Maxim 8000 octei
varbinary(max) Date binare de lungime variabil. Maxim 2GB
image Date binare de lungime variabil. Maxim 2GB Tipuri de date MSSQL Tipuri numerice Tip de date Descriere Stocare tinyint Permite numere ntregi de la 0 la 255 1 octet smallint Permite numere ntregi de la -32,768 la 32,767 2 octei int Permite numere ntregi de la - 2,147,483,648 la2,147,483,647 4 octei bigint Permite numere ntregi de la - 9,223,372,036,854,775,808 la 9,223,372,036,854,775,807 8 octei Tipuri de date MSSQL Tipuri numerice Tip de date Descriere Stocare decimal(p,s) numeric(p,s) Numere cu precizie i magnitudine fix. Permite numere de la -10^38 +1 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. 5-17 octei Tipuri de date MSSQL Tipuri numerice Tip de date Descriere Stocare smallmoney Date monetare de la -214,748.3648 la 214,748.3647 4 octei money Date monetare de la - 922,337,203,685,477.5808 tla922,337,203,685,477.5807 8 octei 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. 4 sau 8 octei real Date numerice n virgul mobil de la - 3.40E + 38 la 3.40E + 38 4 octei Tipuri de date MSSQL Tipuri pentru dat/or Tip de date Descriere Stocare datetime January 1, 1753 - December 31, 9999 cu acuratee de 3.33 milisecunde 8 octei datetime2 January 1, 0001 - December 31, 9999 cu acuratee de 100 nanosecunde 6-8 octei smalldatetime January 1, 1900 - June 6, 2079 cu acuratee de 1 minut 4 octei date Stocheaz doar data. January 1, 0001 - December 31, 9999 3 octei time Stocheaz doar ora cu o acuratee de 100 nanosecunde 3-5 octei datetimeoffset La fel ca i datetime2 + are adugat time zone offset 8-10 octei Tipuri de date MSSQL Tipuri pentru dat/or Tip de date Descriere Stocare timestamp 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
Tipuri de date MSSQL Alte tipuri de date Tip de date Descriere sql_variant Stocheaz pn la 8000 de octei de date de diverse tipuri cu excepia text, ntext, i timestamp uniqueidentifier Stocheaz un globally unique identifier (GUID) xml Stocheaz date n format XML. Maximum 2GB cursor Stocheaz o referin la un cursor folosit pentru operaii cu baza de date table Stocheaz un result-set pentru procesare ulterioar 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 permite o cheie primar format din mai multe cmpuri 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) ) 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
Tabela Orders P_Id LastName FirstName Address City 1 Hansen Ola Timoteivn 10 Sandnes 2 Svendson Tove Borgvn 23 Sandnes 3 Pettersen Kari Storgt 20 Stavanger O_Id OrderNo P_Id 1 77895 3 2 44678 3 3 22456 2 4 24562 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
Vrem s adugm 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 P_Id LastName FirstName Address City DateOfBirth 1 Hansen Ola Timoteivn 10 Sandnes 2 Svendson Tove Borgvn 23 Sandnes 3 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 Descriere NOW() Data i ora curent CURDATE() Data curent CURTIME() Ora curent DATE() Extrage partea de dat dintr-o expresie de tip dat sau dat/or EXTRACT() 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() Afieaz data/ora n diverse formate Funcii SQL Server pentru dat/or Funcia Descriere GETDATE() Obine data i ora curent DATEPART() Extrage o singur parte din dat/or DATEADD() Adun sau scade un anumit interval dintr-o dat/or DATEDIFF() Calculeaz timpul dintre dou date/ore CONVERT() 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
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 P_Id LastName FirstName Address City 1 Hansen Ola Sandnes 2 Svendson Tove Borgvn 23 Sandnes 3 Pettersen Kari Stavanger NULL operatorul IS NULL Extragem nregistrrile 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 nregistrrile cu adresa completat SELECT LastName, FirstName, Address FROM Persons WHERE Address IS NOT NULL Rezultatul LastName FirstName Address Svendson Tove Borgvn 23 Funciile ISNULL(), NVL(), IFNULL() i COALESCE()
Tabela Products
SELECT ProductName, UnitPrice*(UnitsInStock+UnitsOnOrder) FROM Products Dac UnitsOnOrder este NULL rezultatul va fi NULL P_Id ProductName UnitPrice UnitsInStock UnitsOnOrder 1 Jarlsberg 10.45 16 15 2 Mascarpone 32.56 23 3 Gorgonzola 15.67 9 20 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 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 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
SELECT COUNT(Customer) AS CustomerNilsen FROM Orders WHERE Customer='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 CustomerNilsen 2 Funcia COUNT(*) exemplu Numrul de comenzi din tabela Orders o gsim astfel: SELECT COUNT(*) AS NumberOfOrders FROM Orders
Reprezint numrul total de nregistrri din tabel NumberOfOrders 6 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 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 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 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 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 2000 Nilsen 1700 Jensen 2000 Clauza GROUP BY - exemplu Dac omitem clauza GROUP BY SELECT Customer,SUM(OrderPrice) FROM Orders
Nu este ceea ce vrem Customer SUM(OrderPrice) Hansen 5700 Nilsen 5700 Hansen 5700 Hansen 5700 Jensen 5700 Nilsen 5700 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 SUM(OrderPrice) Nilsen 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 SUM(OrderPrice) Hansen 2000 Jensen 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
SELECT UCASE(LastName) as LastName,FirstName 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 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
SELECT LCASE(LastName) as LastName,FirstName 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 LastName FirstName hansen Ola svendson Tove pettersen 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 Descriere column_name Obligatoriu. Cmpul din care se extrag caractere start Obligatoriu. Specific poziia de pornire (indexat de la 1) length Opional. Numrul de caractere ce vor fi extrase. Dac lipsete, funcia extrage toate caracterele rmase Funcia MID() - exemplu Tabela Persons
SELECT MID(City,1,4) as SmallCity 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 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 Descriere column_name Obligatoriu. Cmpul care va fi rotujnit. decimals Obligatoriu. Numrul de zecimale la care se face rotunjirea. Funcia ROUND() exemplu Tabela Products
Vrem s extragem numele produsului i preul rotunjit la cel mai apropiat ntreg SELECT ProductName, ROUND(UnitPrice,0) as UnitPrice FROM Products Prod_Id ProductName Unit UnitPrice 1 Jarlsberg 1000 g 10.45 2 Mascarpone 1000 g 32.56 3 Gorgonzola 1000 g 15.67 ProductName UnitPrice Jarlsberg 10 Mascarpone 33 Gorgonzola 16 Funcia NOW() ntoarce data i ora curent a sistemului Sintaxa SELECT NOW() FROM table_name
SELECT ProductName, UnitPrice, Now() as PerDate FROM Products Prod_Id ProductName Unit UnitPrice 1 Jarlsberg 1000 g 10.45 2 Mascarpone 1000 g 32.56 3 Gorgonzola 1000 g 15.67 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 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
SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDate FROM Products Prod_Id ProductName Unit UnitPrice 1 Jarlsberg 1000 g 10.45 2 Mascarpone 1000 g 32.56 3 Gorgonzola 1000 g 15.67 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 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? 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 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