Nume de tabele
Cuvântul cheie FROM este folosit pentru a specifica tabelul pe care va funcționa comanda. Acest nume de tabel poate fi folosit ca identificator. În primele exemple simple, prefixarea numelor de coloane cu identificatorul numelui tabelului poate fi folosită, dar nu este necesară. În comanda ulterioară, mai complexă, identificatorul numelui tabelului este o caracteristică necesară.
SELECT person.firstname, person.lastname
FROM person;
-- Definiți un alias pentru numele tabelului (analogic cu numele coloanelor). Pentru a păstra o privire de ansamblu, de obicei
-- abreviați tabelele după primul caracter al numelui lor.
SELECT p.firstname, p.lastname
FROM person AS p; -- Sugestie: nu toate sistemele acceptă cuvântul cheie „AS” cu aliasuri de tabel. Omiteți-l în aceste cazuri!
-- Cuvântul cheie „AS” este din nou opțional.
SELECT p.firstname, p.lastname
FROM person p;
Restricție (specificați rândurile rezultate)
În clauza WHERE, specificăm câteva „condiții de căutare” care se găsesc printre tabelele sau vizualizările numite. Evaluarea acestui criteriu este – de cele mai multe ori – unul dintre primele lucruri în timpul executării unei comenzi SELECT. Înainte ca orice rând să poată fi sortat sau afișat, acesta trebuie să îndeplinească condițiile din clauză.
Dacă omitem clauza, toate rândurile tabelului sunt preluate. În caz contrar, numărul de rânduri va fi redus conform criteriilor specificate. Dacă specificăm „greutate < 70”, de exemplu, sunt preluate doar acele rânduri în care coloana de greutate stochează o valoare mai mică de 70. Restricțiile acționează asupra rândurilor de tabele prin evaluarea valorilor coloanelor (uneori acţionează asupra altor lucruri precum existenţa rândurilor, dar pentru moment ne concentrăm pe principii de bază). Ca rezultat, ne putem imagina că evaluarea „clauza where” produce o listă de rânduri. Această listă de rânduri va fi procesată în pași suplimentari, cum ar fi sortarea, gruparea sau afișarea anumitor coloane (proiecție).
Comparații
Comparăm între ele variabilele, valorile constante și rezultatele apelurilor de funcții în același mod în care am proceda în diferite limbaje de programare. Singura diferență este că folosim nume de coloane în loc de variabile. Operatorii de comparare trebuie să se potrivească cu tipurile de date date pe care trebuie să opereze. Rezultatul comparației este o valoare booleană. Dacă este „adevărat”, rândul corespunzător va fi procesat în continuare. Cateva exemple:
- „’weight = 70” compară coloana „weight” cu valoarea constantă „70”, dacă coloana este egală cu valoarea constantă.
- „70 = ‘weight”: la fel ca înainte.
- „firstname = lastname” compară două coloane – fiecare pe același rând – pentru egalitate. Nume precum „Frederic Frederic” se evaluează drept adevărate.
- „firstname < lastname” este o comparație corectă a două coloane în funcție de ordinea lexicală a șirurilor.
- „LENGTH(firstname) < 5” compară rezultatul unui apel de funcție cu valoarea constantă „5”. Funcția LENGTH() operează pe șiruri de caractere și returnează un număr.
Logica booleană
Adesea dorim să specificăm mai mult decât un singur criteriu de căutare, de exemplu, există persoane născute în San Francisco cu numele Baker? Pentru a face acest lucru, specificăm fiecare comparație necesară independent de următoarea și le unim împreună cu operatorii booleeni ȘI respectiv SAU.
SELECT *
FROM person
WHERE place_of_birth = 'San Francisco'
AND lastname = 'Baker';
Rezultatul unei comparații este un boolean. Poate fi comutat între „adevărat” și „fals” de către operatorul unar NU.
SELECT *
FROM person
WHERE place_of_birth = 'San Francisco'
AND NOT lastname = 'Baker'; -- toate cu excepția 'Baker'
-- pentru clarificare: NOT din exemplul anterior este o „operație unară” asupra rezultatului
-- comparație. Nu este o completare la AND.
SELECT *
FROM person
WHERE place_of_birth = 'San Francisco'
AND (NOT (lastname = 'Baker')); -- la fel ca înainte, dar explicit notat cu paranteze
Precedența comparațiilor și a logicii booleene este următoarea:
- toate comparatiile
- Operator NU
- Operator ȘI
- Operator SAU
-- AND (născut în SF și numele Baker; 1 hit ca rezultat intermediar) va fi procesat înainte
-- OR (persoana Yorgos; 1 hit)
-- 1 + 1 ==> 2 rânduri
SELECT *
FROM person
WHERE place_of_birth = 'San Francisco' -- 4 hits SF
AND lastname = 'Baker' -- 1 hit Baker
OR firstname = 'Yorgos' -- 1 hit Yorgos
;
-- Același exemplu cu paranteze adăugate pentru a explicita precedența.
-- AND este procesată înainte de OR.
-- resultate ==> aceleași 2 rânduri ca mai sus
SELECT *
FROM person
WHERE (place_of_birth = 'San Francisco' -- 4 hits SF
AND lastname = 'Baker') -- 1 hit Baker
OR firstname = 'Yorgos' -- 1 hit Yorgos
;
-- AND (persoana Yorgos Baker; nicio lovitură ca rezultat intermediar) va fi procesată înainte
-- OR (născut în SF; 4 hits)
-- 0 + 4 ==> 4 rânduri
SELECT *
FROM person
WHERE place_of_birth = 'San Francisco' -- 4 hits SF
OR firstname = 'Yorgos' -- 1 hit Yorgos
AND lastname = 'Baker' -- 1 hit Baker
;
-- Același exemplu cu paranteze adăugate pentru a explicita precedența.
-- AND este procesată înainte de OR.
-- resultate ==> aceleași 4 rânduri ca mai sus
SELECT *
FROM person
WHERE place_of_birth = 'San Francisco' -- 4 hits SF
OR (firstname = 'Yorgos' -- 1 hit Yorgos
AND lastname = 'Baker') -- 1 hit Baker
;
-- Putem modifica succesiunea evaluărilor prin specificarea parantezelor.
-- La fel ca și primul exemplu, adăugând paranteze, un rând.
SELECT *
FROM person
WHERE place_of_birth = 'San Francisco' -- 4 hits SF
AND (lastname = 'Baker' -- 1 hit Baker
OR firstname = 'Yorgos') -- 1 hit Yorgos
;
Două abrevieri
Uneori scurtăm sintaxa folosind cuvântul cheie BETWEEN. Acesta definește o limită inferioară și superioară și este utilizat în principal pentru valori numerice și date, dar și aplicabil șirurilor.
SELECT *
FROM person
WHERE weight >= 70
AND weight <= 90;
-- O formulare echivalentă mai scurtă și mai expresivă
SELECT *
FROM person
WHERE weight BETWEEN 70 AND 90; -- BETWEEN include cele două margini
Pentru compararea unei coloane sau a unei funcții cu mai multe valori, putem folosi expresia scurtă IN.
SELECT *
FROM person
WHERE lastname = 'de Winter'
OR lastname = 'Baker';
-- O formulare echivalentă mai scurtă și mai expresivă
SELECT *
FROM person
WHERE lastname IN ('de Winter', 'Baker');
FETCH: Selectează și alege anumite rânduri
Uneori nu ne interesează toate rândurile rezultate, de exemplu: putem dori să vedem doar primele 3 sau 10 rânduri. Acest lucru poate fi realizat cu clauzele OFFSET și FETCH. OFFSET specifică numărul de rânduri care trebuie sărite (numărând de la începutul setului de rezultate), iar FETCH specifică numărul de rânduri după care livrarea rândurilor se va opri.
SELECT *
FROM person
WHERE place_of_birth = 'San Francisco'
ORDER BY firstname
FETCH FIRST 2 ROWS ONLY -- doar primele două rțnduri
;
SELECT *
FROM person
ORDER BY id -- clauza WHERE (și clauza ORDER BY) sunt opâionale
OFFSET 5 ROWS
FETCH FIRST 2 ROWS ONLY -- doar al 6-lea și al 7-lea rând (conform lui ORDER BY)
;
Vă rugăm să rețineți că clauzele OFFSET și FETCH sunt părți separate ale comenzii SELECT. Unele implementări gestionează această funcționalitate ca parte a clauzei WHERE sau cu cuvinte cheie diferite (ROWNUM, START, SKIP, LIMIT).
Funcționalitatea OFFSET și FETCH poate fi realizată de asemenea prin funcții de fereastră cu sintaxa lor mai generală.
(Include texte din Wikibooks traduse și adaptate de Nicolae Sfetcu)
Lasă un răspuns