2017 m. spalio 19 d., ketvirtadienis

Duomenų išrinkimas (SQL SELECT sakinys)

Duomenų išrinkimas panaudojant

WHERE sakinyje nurodoma sąlyga, kurią turi tenkinti grąžinamos eilutės.
ORDER BY sakiniu nurodoma viena ar daugiau rikiavimo sąlygų.
GROUP BY sąlygoje nurodoma, kad reikia grupuoti tam tikras eilutes. Grupuojant eilutes, dažniausiai naudojamos agregatinės funkcijos maksimalioms, vidutinėms ir panašioms reikšmėms išrinkti iš grupuotų eilučių.
HAVING sakinyje nurodomas kriterijus, taikomas grupuojamoms eilutėms; šis
raktinis žodis gali būti naudojamas tik tais atvejais, jeigu užklausoje yra GROUP
BY sakinys.

1.Platesnis WHERE paragrafo panaudojimas

Duomenų išrinkimui pagal užduotą sąlygą formuojama užklausa, naudojant
paragrafą WHERE. Sąlyga gali būti pateikiama kaip aritmetinė išraiška ar kaip
simbolių eilutė, surišta per lyginimo operatorius =,>,<,>=,<=,<>.

SELECT * FROM Emp WHERE Sal>=1500;

SELECT Ename,Sal,Comm FROM Emp WHERE Sal<=Comm;
sąlygoje dalyvauja du stulpeliai, bet nenurodyta konkreti reikšmė.

*Simbolinės eilutės arba data sąlygoje turi būti pateikta tarp viengubų kabučių.

Paragrafe WHERE gali būti formuojama sąlyga, naudojant sąlygos
pateikimo būdus:

BETWEEN ... AND - kurie nurodo žemiausios ir aukščiausios reikšmių intervalą,
išrenkant duomenis iš lentelės, t.y. rezultate pateikia duomenis tam tikram
reikšmių intervalui.

SELECT Ename,Sal FROM EMP WHERE Sal BETWEEN 1000 AND 1500;
Pateikia darbuotojus, kurių alga yra intervale tarp 1000 ir 1500.

BETWEEN ..AND operatorius apima ir kraštutines reikšmes. Mažesnioji reikšmė
turi būti nurodyta pirma, didesnioji - antra.

IN (sąrašas reikšmių, kurios turi būti pateiktos užklausos rezultate,
pateikiamos per kablelį)

SELECT Empno,Ename,Sal,Mgr FROM EMP WHERE Mgr IN(7902,7566);
pateiks sąraše tik du darbuotojus.

Šią sąlygą galima būtų pateikti ir kitaip.

SELECT * FROM EMP WHERE Deptno IN(10,20);

Išves darbuotojus, kurie dirba 10 ir 20 departamentuose.


LIKE ( šablonas duomenų išrinkimui iš lentelės )

LIKE galima naudoti šabloną pagal kurį atrenkami duomenys iš lentelės.
Sąlygoje gali būti pateikiami tik simboliniai ar skaitmeniniai duomenys. Mažiausiai
turi būti du simboliai formuojant šabloną.

% - reiškia nulį arba keletą simbolių
_ reiškia vieną simbolį

SELECT Ename FROM EMP WHERE Ename LIKE ‘S%’;

parodo visus darbuotojų vardus, kurių pavardė prasideda “S” raide, bet
neparodys, kurių vardai prasidės “s” raide(mažąja). LIKE operatorius gali būti
kaip trumpinys.

SELECT Ename,Hiredate FROM EMP WHERE Hiredate LIKE ‘% 81‘;
- Visi kurie pradėjo dirbti 81 metais.

SELECT Ename FROM EMP WHERE Ename LIKE ‘_A%’;
Parodys visus darbuotojus, kurių varde bus antra raidė “A”


IS NULL - (nurodo, jog vartotoją domina tik eilutės lentelėje su neapibrėžta lauko reikšme)
NULL paragrafas gali būti naudojamas norint pateikti duomenis su NULL reikšme.

SELECT Ename,Mgr FROM EMP WHERE Mgr IS NULL;
pateiks duomenis, kur Mgr neužpildytas.

IS NULL tikrina nurodyto stulpelio reikšmę.

SELECT Ename,Job,Comm FROM EMP WHERE Comm IS NULL;
parodo visus darbuotojus, kurie negauna komisinio atlyginimo.

Sudėtinga sąlyga gali būti pateikta naudojant AND arba OR.
Tokiu būdu galima pateikti kelias sąlygas duomenų išrinkimui.

SELECT Empno,Ename,Job,Sal FROM EMP WHERE Sal>=1100 AND Job=’CLERK’;

Rezultate pasirodys visi darbuotojai, kurie užima nurodytas pareigas ir jų alga
viršija 1100.

SELECT Empno,Ename,Job,Sal FROM EMP WHERE Sal>1100 OR Job=’CLERK’;

Rezultate pasirodys visi darbuotojai, kurie užima nurodytas pareigas arba jų alga viršija 1100.

Su kiekvienu sąlygos paragrafu gali būti naudojamas ir paragrafas
NOT, kuris reiškia sąlygos neigimą.

SELECT * FROM EMP WHERE Comm IS NOT NULL;
Rezultate parodo visus darbuotojus, kurie gauna komisinį atlyginimą.

... WHERE NOT Job IN (“CLERK’,’MANAGER’)
... WHERE Sal NOT BETWEEN 1000 AND 1500



SELECT Ename,Job,Sal FROM EMP WHERE job=’SALESMAN’
OR job=’PRESIDENT’ AND sal>1500;

Dvi sąlygos nurodant pareigas su atlyginimu, kai pareigos pateikiamos taip pat per sąlygą OR (arba) t.y. kai pareigos gali turėti skirtingas reikšmes, bet abiem atvejais atlyginimui keliami tie patys reikalavimai.

SELECT Ename,Job,Sal FROM EMP WHERE (job=’SALESMAN’
OR job=’PRESIDENT’) AND sal>1500;

Irgi dvi sąlygos, bet tikrinama pirma pareigybes ir jei yra viena iš nurodytų,
toliau tikrinamas atlyginimas.

Rūšiavimas ORDER BY

Normaliai išvedant duomenis iš lentelės į ekraną, duomenų tvarka yra tokia, kaip jie buvo suvesti į lentelę. Norint pakeisti duomenų atvaizdavimo tvarką operatoriuje SELECT galima naudoti paragrafą ORDER BY, kuriame nustatome, kaip turi būti pateikti duomenys užklausos rezultate. Standartiniu būdu, naudojant ORDER BY, duomenų vaizdavimas vyksta pagal alfabetą nuo A iki Z arba skaičių
didėjimo tvarka. 
Norint pakeisti duomenų atvaizdavimo tvarką atvirkščiai, prie paragrafo ORDER BY naudojame papildomą žodį DESC. Jei naudojame paragrafą ORDER BY, jis turi būti nurodomas operatoriaus SELECT gale.

SELECT * FROM EMP ORDER BY Hiredate; 
rūšiuoja pagal priėmimo į darbą datą

SELECT * FROM EMP ORDER BY Hiredate DESC;
rūšiuoja taip pat pagal datą, bet atvirkštine tvarka, T.y. vėliausia priimti į darbą pasirodys užklausos
rezultate.


LOWER(stulpelis|reikšmė) 

 Bet kokiam formate parašytus simbolius rezultate pateikia mažosiomis raidėmis. Labai naudinga nurodant sąlygą užklausoje kai reikia suvienodinti informacijos formatą duomenų atrinkimo metu. Be to ji naudinga aplikacijose pateikiant informaciją vienodam pavidale, jei ji yra suvesta skirtingam formate.

SELECT LOWER(VARDAS) FROM DARBUOTOJAS

UPPER(stulpelisėlė|reikšmė)

Bet kokiam formate parašytus simbolius rezultate pateikia didžiosiomis raidėmis. Labai naudinga nurodant sąlygą užklausoje kai reikia suvienodinti informacijos formatą duomenų atrinkimo metu. Be to ji naudinga aplikacijose pateikiant informaciją vienodam pavidale, jei ji yra suvesta skirtingam formate.

SELECT UPPER(VARDAS) FROM DARBUOTOJAS

Funkcijos Visai Grupei (Grupinės)

Šios funkcijos veikia per visą lentelę arba per lentelės sritį ir tik tada pateikia bendrą rezultatą kiekvienai grupei atskirai arba visai lentelei. Pagal nutylėjimą visos lentelės eilutės skaitomos kaip viena grupė, jei nenurodyta kitaip. Paragrafas GROUP BY komandoje SELECT gali būti naudojamas sudalinti lentelę į grupes. Grupinėse funkcijose NULL reikšmė ignoruojama. Grupinėms funkcijoms galima priskirti
funkcijas:

AVG() - nustato vidurkį grupei
COUNT() - nustato eilučių, kurių išraiška yra apibrėžta, kiekį lentelėje
MAX() -nustato didžiausią reikšmę
MIN() - nustato mažiausią reikšmę
SUM() - nustato bendrą sumą, ignoruojant neapibrėžtas reikšmes

Bet kuriuo atveju funkcijos taikomos visai grupei, bet jei nurodyta DISTINCT (MIN(DISTINCT SAL)), tai funkcija taikoma tik skirtingoms reikšmėms, t.y. pasikartojančios reikšmės yra ignoruojamos. Visais atvejais, jei yra NULL reikšmė, tai įrašas ignoruojamas, išskyrus funkciją COUNT, kai naudojama ‘*’.

  • SELECT MAX(SAL),MIN(SAL),AVG(SAL) FROM Emp;
  • SELECT COUNT(*) from EMP where DEPTNO=20;
Norint sugrupuoti įrašus lentelėje, naudojam paragrafą GROUP BY

SELECT AVG(SAL) FROM Emp;
SELECT AVG(SAL) FROM Emp GROUP BY JOB;



Kiekvienai pareigybei išvedamas darbo užmokesčio vidurkis, tačiau toks atvaizdavimo būdas nėra akivaizdus, todėl rekomenduojama šalia spausdinti ir pareigybę:

SELECT JOB,AVG(SAL) FROM Emp GROUP BY JOB;
SELECT JOB, AVG(SAL) FROM Emp WHERE JOB=‘MANAGER’ GROUP BY JOB ;

Duomenys lentelėje sugrupuojami pagal darbą, ir dar po to galima išrinkti konkrečiai nurodytą darbą ir suskaičiuoti atlyginimo vidurkį.

Viduje vienos grupės galima dar grupuoti smulkiau. Tarkime skirtinguose departamentuose, norime
grupuoti informaciją pagal pareigybes :

SELECT JOB, AVG(SAL) FROM Emp WHERE JOB=‘MANAGER’ GROUP BY DEPTN,JOB ;
SELECT Deptno,Job,Sum(sal) FROM EMP GROUP BY Deptno,Job;

Pateikiant rezultatą pirmiausia duomenys grupuojami pagal departamento numerį, o po to
jo viduje dar grupuojama pagal darbo pobūdį. Taip sutvarkius, sumuojamas bendras
atlyginimas suformuotose grupėse.

Grupinėse funkcijose yra svarbu išvedant duomenis, užklausą formuoti taip, kad nebūtų individualių laukų, kurie nėra įtraukti į paragrafą GROUP BY

SELECT DEPTN,MIN(SAL) FROM EMP; - klaidinga užklausa, nes funkcija MIN yra grupinė, o laukas DEPTNO yra kiekvienam įraše ir tai nesuderinama.

Teisingai atrodytų: 
SELECT DEPTN,MIN(SAL) FROM EMP GROUP BY DEPTNO;

Dabar DEPTNO jau yra grupės pavadinimas ir nebėra individualus laukas.

Gali būti grupuojami duomenys, pateikiant juos kaip grupę grupėje. Naudojant grupines funkcijas yra galimybė išjungti arba įjungti iš rezultato atskiras duomenų grupes. Tam galime naudoti paragrafą HAVING, kuris panaudojamas po GROUP BY.
Turi tokią pačią prasmę kaip ir operatorius WHERE, tačiau kuris yra negalimas grupinėse funkcijose.

Bendru atveju sintaksė būtų tokia

SELECT stulpelis, grupinė_funkcija
FROM lentelė
[WHERE Sąlyga]
[GROUP BY sąrašas_grupavimui]
[HAVING grupės sąlyga]
[ORDER BY rūšiavimo sąlyga]
SELECT Job,Sum(Sal) Benbra_Suma FROM EMP
WHERE Job NOT LIKE ‘SALES%’
GROUP BY Job
HAVING Sum(Sal)>5000
ORDER BY Sum(Sal)

Rūšiuoja pagal gautą sumą grupėse. Bendra_Suma formuoja naują stulpelio antraštę
Skaičiuoja visiems darbuotojams, išskyrus “SALES

Norint parodyti vidutinį atlyginimą darbuotojams, pagal sąlygą, jog mus domina tik departamentai, kuriuose dirba daugiau nei trys žmonės, formuosime užklausą:

SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING COUNT(*)>3;

Norint parodyti tik darbus, kurių didžiausias atlyginimas yra >=$3000, formuosim užklausą:

SELECT JOB,MAX(SAL) FROM EMP HAVING GROUP BY JOB MAX(SAL)>=3000;

Nesant grupavimo, geriau atrankos sąlygai užduoti naudoti paragrafą WHERE.
Žemiau pateikiamas pavyzdys yra neteisingas, nes grupinei funkcija naudojama poroje su
paragrafu WHERE

SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO WHERE AVG(SAL)>2000;

Teisingai būtų taip:
SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL)>2000;

SELECT Max(Avg(Sal)) FROM EMP GROUP BY Deptno;

Pirma suskaičiuoja atlyginimo vidurkį departamente, o po to išrenka didžiausią
vidurkį tarp departamentų.

Komentarų nėra:

Rašyti komentarą

Etiketės