Documente Academic
Documente Profesional
Documente Cultură
Informatică anul II
Matematică-Informatică anul III
Semestrul I, 2011/2012
Horea Oros, horea.oros@gmail.com
BAZE DE DATE
Limbajul SQL
Island Trading UK
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
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
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 Berguvsvägen 8 Luleå
Berglund
Centro comercial Francisco Chang Sierras de México
Moctezuma Granada 9993 D.F.
Ernst Handel Roland Mendel Kirchgasse 6 Graz
FISSA Fabrica Inter. Diego Roel C/ Moralzarzal, Madrid
Salchichas S.A. 86
Galería del Eduardo Rambla de Barcelona
gastrónomo Saavedra Cataluña, 23
Baze de date - interogări
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
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
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
Join – mai multe tipuri
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
‘Employees_USA’
E_ID E_Name
01 Turner, Sally
02 Kent, Clark
03 Svendson, Stephen
04 Scott, Stephen
Operatorul UNION - exemplu
Șiruri de caractere
Tip de date Descriere Stocare
char(n) Șir de caractere de dimensiune fixă. n
Maxim 8000 de caractere
varchar(n) Șir de caractere de lungime variabilă.
Maxim 8000 de caractere
varchar(max) Șir de caractere de lungime variabilă.
Maxim1,073,741,824 de caractere
text Șir de caractere de lungime variabilă.
Maxim 2GB de date de tip text
Tipuri de date MSSQL
Tipuri binare
Tip de date Descriere Stocare
bit Permite 0, 1, sau NULL
binary(n) Date binare de lungime fixă. Maxim
8000 octeți
varbinary(n) Date binare de lungime variabilă.
Maxim 8000 octeți
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 2 octeți
la 32,767
int Permite numere întregi de la - 4 octeți
2,147,483,648 la2,147,483,647
bigint Permite numere întregi de la - 8 octeți
9,223,372,036,854,775,808 la
9,223,372,036,854,775,807
Tipuri de date MSSQL
Tipuri numerice
Tip de date Descriere Stocare
decimal(p,s) Numere cu precizie și magnitudine 5-17
numeric(p,s) 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 4 octeți
214,748.3647
money Date monetare de la - 8 octeți
922,337,203,685,477.5808
tla922,337,203,685,477.5807
float(n) Date numerice în virgulă mobilă de la - 4 sau 8
1.79E+308 la 1.79E+308. Parametrul n octeți
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 - 4 octeți
3.40E + 38 la 3.40E + 38
Tipuri de date MSSQL
MySQL
ALTER TABLE Persons
DROP INDEX uc_PersonID
SQL Server / Oracle / MS Access
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
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
Tabela ‘Orders’
O_Id OrderNo P_Id
1 77895 3
2 44678 3
3 22456 2
4 24562 1
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
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
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 …
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
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
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
Tabela ‘Persons’
P_Id LastName FirstName Address City
1 Hansen Ola Sandnes
2 Svendson Tove Borgvn 23 Sandnes
3 Pettersen Kari Stavanger
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
OrderAverage
950
Funcția AVG() - Exemplu
NumberOfCustomers
3
Funcția FIRST()
FirstOrderPrice
1000
Funcția LAST()
OrderTotal
5700
Clauza GROUP BY
Customer SUM(OrderPrice)
Nilsen 1700
Clauza HAVING - exemplu
Customer SUM(OrderPrice)
Hansen 2000
Jensen 2000
Funcția UCASE()
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()
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()
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
SmallCity
Sand
Sand
Stav
Funcția LEN()
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