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