Sunteți pe pagina 1din 44

SQL Curs 5

Corectare tema
Expresii SQL
• Operatorul ‘Case’:

• CASE expresie WHEN expresie1 THEN valoare1 WHEN expresie2 THEN


valoare2....ELSE valoare_final END

• CASE WHEN expresie1 THEN valoare1 WHEN expresie2 THEN valoare2


....ELSE valoare_final END
Case
• CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN conditionN THEN resultN
ELSE result
END;
• select customer_id, first_name, last_name,case when first_name
like 'MA%' then 'ER Name' when first_name like 'L%' then 'L
Name' when first_name like '%ER%' then 'ER Name' else
'No match'end as resultTextfrom customer;
Operations
• SELECT 5 BETWEEN 1 AND 5, 2 NOT BETWEEN 1 AND 3, 'Test' LIKE 'T
%’;

• SELECT 2 IN (5,8,7), 'two' IN ('one', 'two', 'three’);

• SELECT 4+5 = '9' as result, 1 IN ('1','2’);

• SELECT 3>2 AND 5>4, 58, 5>3 XOR 6>1, NOT (7>-1);
Transformare de la un tip de date la altul
• CREATE TABLE date(d DATE, t TIMESTAMP); INSERT INTO date('2009-
08-02', '2009-08-02 20:44:00'); SELECT d+0, t+0;

• Transformarile se fac direct dintr un tip de date in altul.


Functii de comparare
• Least
• Gratest
• Truncate
• Abs
• SQRT
• EXP
• TRUNCATE
Functii conditionale
• Concat
• Length
• Lpad
• Rpad
• Trim
Functii de agregare
• MIN
• MAX
• SUM
• AVG
• COUNT
• COUNT(DISTINCT)
Curs 6 sql, indecsi, subinterogari
Indexare
• Structura de date aditionala, redundanta, care atasata unei tabele va
spori viteza de cautare
• Un index se poate define pentru una sau mai multe coloane
• Informatia din coloanele alese va fi copiata intr o structura separata,
cu referinta la inregistrarea originala

• Exemplu din viata reala: Cuprinsul unei carti: Informatie redundanta,


dar foarte ajutatoare in a gasi datele
Indexare
• Fie o tabela in baza de date denumita Produse. Sa presupunem ca pe
coloanal ‘Denumire’ din tabela produse a fost adaugat un index.
• Select * from produse where denumire = ‘carte’

• Cand este folosita aceasta interogare serverul de baza de date se va


folosi de indexul atribuit coloanei denumire, va identifica toate
inregistrarile care au denimirea ‘carte’, si apoi se va folosi la referintele
pe care indexul le are catre inregistrarile din tabela pentru a returna
rezultatele.
Indexare
• Pentru query ul
• Select * from produse where pret > 2 , serverul va cauta in totalitatea
inregistrarilor din tabela, ceea ce va duce la o penalitate asupra
performantei.

• Alte instructiuni se pot folosi de index. Ex: ORDER BY


• SELECT * FROM PRODUSE ORDER BY DENUMIRE;
Tipuri de indecsi
• Index simplu: Valorile sunt indexate, fara nici o restrictie

• Index Unic: Valorile coloanei indexate trebuie sa fie unice. 2 implicatii:


• Eroare la inserarea unui duplicat, cu exceptia valorii null.
• Valorile fiind unice, algoritmul folosit de serverul MySql va fi mult mai efficient
• Instructiunea va rula pana la gasirea primei valori, indexul fiind unic, si nu vor fi parcurse toate inregistrarile indexate.
• Select * from produse where denumire = ‘carte’
• Index unic pe denumire – o singura inregistrare
• Sintaxa: UNIQUE INDEX

• Cheia primara: Index unic care nu permite null. De obicei cheia primara este un numar intreg.
• OBS: intr o tabela MySql exista o singura coloanal unde poate fi folosita functia AUTO_INCREMENT si aceea
trebuie declarata ca cheie primara
Indexare
• Crearea indecsilor:
• La crearea tabelei
• create table persoane (cnp int(13), nume varchar(30), UNIQUE (cnp));
• Show index from persoane
• Dupa crearea tabelei
• alter table <tableName> drop index <index_name>;
• create index <index_name> on <tablerName> (<columnName>);
Indexare
• Exercitii

• select * from actor;


• show index from actor;
• alter table actor drop index idx_actor_last_name;
• create index idx_actor_last_name on actor (last_name);
• select * from actor;
Indexare
• OBS: Index unic nu va permite insert in baza de date a duplicatelor pentru
coloanal respective
• Insert ignore into <> values (); nu va arunca eroare – warning
• Replace into <> values(); Daca nu exista inregistrarea – insert. Daca exista este
echivalentul a delete + insert. Va sterge intreaga inregistrare si o va insera din nou.
• Update – update <> set () on duplicate key set ()

• Dezavantaje:
• Operatiune mai lenta in cazul unui batch insert sau a multor instructiuni insert
consecutive
• Spatiul de memorie ocupat, informatiile fiind duplicate. Mai multi indecsi si multe
inregistrari cresc resursele neceare pentru alocarea indexarii.
Subinterogari
• Definitie: Instructiune select, plasata intr o alta instructiune.
• Select * from personae where dataNasterii = (select dataNasterii from
personae where name = ‘maria’)
Subinterogari
• Subinterogari
• De tip lista:
• select * from payment where rental_id in (select rental_id from payment where amount
> 10);
• De tip scala: # selectati preturile mai mari decat media
• SELECT * FROM payment where amount > (select avg(amount) from payment) ;
Subinterogari
• SQL All:
• Returneaza Boolean (true/false)
• TRUE daca ALL subinterogarile sunt adevarate

• SQL Any
• Returneaza Boolean (ture/false)
• Returneaza true daca una din subinterogari e adevarata

select * from payment where rental_id = ANY (select rental_id from payment
where amount > 10);
Curs 7 view uri
• View = interogare de tip select al carui rezultat este stocat in baza de
date si produce un set de rezultate.
• View ul este o tabela virtuala

• Exemplu:
• create view test_view asselect * from actor;
• Select * from test_view;
Views
• Utilitati:
• Memorarea in baza de date a unor rezultate care pot fi utilizate la alte interogari
• Prezentare informatii prefiltrate
• Pastarea structurii view urilor, indifierent de structura baei de date
• Definesc o structura de table fara a ocupa mult spatiu in baza de date.
• Poate fi refolosit
• Creste securitatea
• Denumiri de business

• Avem key uri? Primary / foreign key


Views
• Creare View: CREARTE OR REPLACE VIEW
• ALTER VIEW– nu poate fi schimbata structura, ci doar conditiile de
creare
• Drop view
Definire view:
• CREATE VIEW RandomPersonData (Varsta, Inaltime, Greutate) AS
SELECT FLOOR(RAND()*120), FLOOR(50+RAND()*200),
FLOOR(1+RAND()*300);

• Create view view_actor select * from actor;


• Drop
• create view view_actor as select * from actor where first_name like
'%A%';
Definire view:
• create view view_lista as SELECT c.first_name, c.last_name,
f.titleFROM customer c INNER JOIN payment P ON
C.CUSTOMER_id = P.CUSTOMER_id INNER JOIN rental r ON
p.rental_id = r.rental_id INNER JOIN inventory inv ON
inv.inventory_id = r.inventory_id INNER JOIN film f ON f.film_id =
inv.film_idORDER BY c.first_name , c.last_name , f.title;

• Lista coloanelor unui view ramane fixa chiar daca structua tabelei se
modifica.
Inserare date in tabela prin view
• create table produse2 (nume varchar(50),tip int(50));
• insert into produse2 values ('produs', 2);
• select * from produse2;
• create view test_view2 as select * from produse2 where tip > 1;
• select * from test_view2;
• insert into test_view2 values('produs',1);
• insert into test_view2 values('produs',3);
Descriere view
• Describe view2;
• show tables;
• show full tables;
Variabile definite de client – user Variables
• Definitie: Nume atribuit unor date, permitandu ne sa memoram valori
pentru folosirea lor ulterioada

• Notatie: @numevariabila @a
• SET @test = ‘1’;
• Definirea unei variabile neinitializate anterior, va lua in considerare
valoarea null;
• Rezultatele vor ave avaloarea null

• Exemplu text
• Exemplu numar

• Valoarea variabilelor va disparea in momentul deconectarii de la


server
• Exemple:
• Atribuiti valoarea maxima a unei plati din payment
• Atribuiti valoarea minima
• Atribuiti lungimea numelui
• Selectati inregistrarea unde amount are valoarea maxima
• Selectati inregistrarea unde amount are valoarea minima
• Selectati ultima inregistrare generate de AUTO_INCREMENT;
• (dorim sa inseram intr o tabela de legatura ultimul ID generat de tabela cu
primary key)
• SET @ID = LAST_INSERT_ID();
• Un user variable poate retine o singura valoarea
• Daca rezultatul are rezultate multiple, va memora ultima valoarea returnata;

• SELECT @amount := amountFROM paymentWHERE amount < 1 ORDER


BY amount desc;
• SELECT @amount;
System variables
• SHOW VARIABLES;

• Variabile predefinite, variabile de system.

• Fiecare variabila de system va avea o valoarea default

• Variabilele de system pot fi filtrate


Variabile locale
• Nu sunt prefixate cu @
• Durata de viata e exhivalenta cu folosirea in interiorul structurii in care
au fost declarate

• Se declara folosind DECLARE si DEFAULT


Declarare:
• DECLARE variable_name datatype(size) [DEFAULT default_value];

• DECLARE test varchar(50) DEFAULT ‘’;

• DECLARE poate fi intre un begin si un end - Procedura


Prepared statements – interogari precompilate
• Interogare memorata pentru a fi utilizata la diferite momente din timp
cu diferite seturi de date de intrare
• Date de intrare – valorile folosite pentru a define oepratia
Exemplu logging
• OBS: website urile vor avea sisteme de logging pentru diferite operatii
• OBS: un web service va putea trimite o instructiune unei baze de date
pentru a efectua diferite operatii
• Exemplu: INSERT INTO logs (nume, prenume, data, rezultat)
(‘popescu’, ‘ion’, datetime, ‘eroare la apelare’);
• Interogarea se va executa des, fiind vorba de logging;
• Se efectueaza traffic in retea – mai multe resurse – costuri crescute
• Instructiunea este primita, validata, transformata intr o forma executabila, si
executata de server
• La mai multe instrutiuni de logging, singurul lucru diferit sunt datele
de intrare

• Un prepared statement, permite executarea o singura data a pasilor


comuni
• Clientul creaza un prepared statement si trimite instructiunea catre serverul
SQL, specificand locuile unde vor fi parametri variabili
• Serverul asteapta executia viitoare a ei cu forma predefinita
• Clientul apeleaza interogarea pregatita de cate ori va avea nevoie
Instructiuni pentru prepared statement
• PREPARE <nume > FROM = pregatire pentru executie

• EXECUTE <nume> USING vars = executie

• DELLOCATE PREPARE <nume> = stergere


Exemplu:

• PREPARE statemetn1 FROM 'SELECT SQRT(POW(?,2) +


POW(?,2)) AS hypotenuse’;
• SET @a = 3; SET @b = 4;
• EXECUTE statement1 USING @a, @b;

• SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS


hypotenuse’;
• PREPARE statement2 FROM @s;
• SET @a = 3; SET @b = 4;
• EXECUTE statement2 USING @a, @b;
Ex:
• Creati un prepared statement care selecteaza toate coloanele cu
suma mai mare de 1;
• SELECT * FROM payment where amount > 1;
• prepare statement3 FROM 'SELECT * FROM PAYMENT WHERE AMOUNT > ?’;
• SET @a = 1;
• EXECUTE statement3 USING @a;
Exemplu: Folosire User variable pentru a stoa numele tabelului
pe care se executa stetul de instructiuni
• CREATE TABLE t1 (a INT NOT NULL);
• INSERT INTO t1 VALUES (4), (8), (11), (32),
(80);

• SET @t = 't1’;
• SET @s = CONCAT('select * FROM', @t);
• PREPARE stmt3 FROM @s;
• EXECUTE stmt3;
Proceduri si Functii, Trigger, Event

S-ar putea să vă placă și