2020. május 27., szerda

SQL lekérdezés variációi

 Az SQL lekérdezések sémája
Az SQL lekérdezések a következő részekből állnak:

SELECT oszlopkifejezés,...
FROM tábla,...
WHERE sorfeltétel
GROUP BY csoportosítás
HAVING csoportfeltétel
ORDER BY rendezési szempont

A hat rész funkciója röviden (részletek a következő fejezetben):

    SELECT : a válaszban megjelenítendő oszlopok és kifejezések listája
    FROM : melyik táblából vagy táblákból várjuk az eredményeket
    WHERE : milyen feltételeknek megfelelő sorokat jelenítsünk meg a válaszban
    GROUP BY : az eredmény rekordjait csoportosíthatjuk valamilyen oszlopkifejezés lehetséges értékei szerint
    HAVING : a létrehozott csoportokat is megszűrhetjük
    ORDER BY : a válasz rendezése a táblák oszlopai alapján

Nem része a szabványnak, de már sok SQL megvalósításban szerepel a következő kiegészítés:

SELECT ...
...
LIMIT megjelenítendő sorok száma

 SELECT
A SELECT után soroljuk fel a megjelenítendő oszlopokat és oszlopkifejezéseket. A "SELECT * " minden oszlopot megmutat.
 
SELECT *
FROM sorozatok

SELECT cim,nemzet
FROM sorozatok

Az oszlopokra mezőnevekkel hivatkozhatunk. Az oszlopkifejezések aritmetikai műveletekkel és függvényekkel képezhetők. Az eredménytábla oszlopai átnevezhetők az AS paranccsal. MySql-ben ékezet nélküli mezőneveket és táblaneveket használunk.

 
SELECT név, fizetés + jutalom
FROM bérek
  
SELECT AVG( fizetés)
FROM bérek
  
SELECT AVG( fizetés ) AS átlagfizetés
FROM bérek

Összesítő függvények
Az összesítő függvények a tábla valamelyik oszlopa alapján egyetlen értéket számolnak ki.

    összeg : SUM
    átlag : AVG
    darabszám : COUNT
    minimum : MIN
    maximum : MAX

A COUNT nem számolja a NULL értékeket. A COUNT(DISTINCT mezőnév) azt adja meg, hány különböző érték szerepel az oszlopban.

SELECT SUM( bevétel), SUM( kiadás )
FROM könyvelés

SELECT COUNT(DISTINCT rendező )
FROM filmek

SELECT AVG( jegy ) AS osztályátlag
FROM dolgozatok

Kifejezések a SELECT záradékban

Aritmetika
SELECT 2+2

-> 4

SELECT 2*3
  
-> 6

SELECT POW(2, 5)
  
-> 32

SELECT 8 / 5
  
-> 0.60

SELECT 8 DIV 5
  
-> 1

SELECT MOD(8, 5)
  
-> 3
Dátumkezelés
SELECT NOW()
 
-> 2010-01-08 08:26:24

SELECT YEAR( NOW() )
  
-> 2010

SELECT DATE_ADD( NOW(), INTERVAL 100 DAY )
  
-> 2010-04-18 08:28:24
Logika
SELECT IF( 4 > 3, 'rendben', 'baj van')


 FROM
A FROM után soroljuk fel, hogy melyik táblákat használjuk a lekérdezésben. Ha egynél több táblát használunk, össze kell kapcsolni őket. Ha egy mezőnév több táblában is előfordul, akkor kötelező minősített névvel hivatkozni rá. A minősített név alakja. táblanév.mezőnév. Ha egyértelmű, hogy melyik táblához tartozik egy mező, akkor nem kell kiírni a tábla nevét.

SELECT *
FROM sorozatok
  
SELECT cim,nev
FROM sorozatok, szereplok
WHERE sorozatok.id = szereplok.sorozat
  
A használt táblák (rövidítés céljából) az AS paranccsal átnevezhetők.

SELECT cim,nev
FROM sorozatok AS s, szereplok AS sz
WHERE s.id = sz.sorozat

 WHERE
A WHERE után adjuk meg annak feltételét, hogy melyik sorok kerüljenek az eredménybe. Egy feltételben mezők és konstanskifejezések értékét hasonlíthatjuk össze. Összetett feltételek logikai műveletekkel képezhetők.

    "és" : AND
    "vagy" : OR
    "nem" : NOT


SELECT cim
FROM sorozatok
WHERE kezdet < 2000
  
SELECT cim
FROM sorozatok
WHERE nemzet = 'magyar'
      
SELECT nev
FROM szereplok
WHERE (sorozat = 1) AND (fo = 'i')
  
Karakterláncok esetében használhatunk dzsóker karaktereket. Ekkor az egyenlőség helyett a LIKE parancsot használjuk.

%    0 vagy több tetszőleges karakter
_    egy tetszőleges karakter
(MS-W alatt '*' és '?')

SELECT cim,web
FROM sorozatok
WHERE web LIKE '%.hu'

Rendezés
Az ORDER BY a választábla sorait rendezi. Azokat az oszlopokat (vagy sorszámukat) kell felsorolni, ami szerint rendezni szeretnénk a választ. Ha több oszlopot is megadunk, a második (,harmadik,...) csak akkor számít, ha az első (korábbi) szempont szerint "egyenlő" a két sor.

A rendezés iránya alapból növekvő, ha csökkenő sorrendet szeretnénk, a DESC módosítót kell alkalmazni.
Példák
SELECT név, fizetés
FROM bérek
ORDER BY fizetés DESC

SELECT osztály, név
FROM tanulók
ORDER BY 1, 2

SELECT termék, ár
FROM katalógus
ORDER BY ár*(1+áfa)

Rendezhetünk olyan oszlop (vagy oszlopkifejezés) szerint is, ami nem szerepel a SELECT után. Viszont ha az oszlop sorszámát adjuk meg a rendezésnél, az a SELECT után felsorolt kifejezések közötti sorszámot jelenti.
Választábla részének kiválasztása
Előfordulhat, hogy a választábla egy részét akarjuk megjeleníteni.
Első néhány sor kiírása
SELECT ...
FROM ...
WHERE ...
LIMIT 10
Rész kiválasztása
SELECT ...
FROM ...
WHERE ...
LIMIT 100,20

Első néhány sor kiírása máshogy
SELECT TOP 10 előadó
FROM slágerlista
WHERE ...

 GROUP BY
Példák
SELECT név, SUM(befizetés)
FROM könyvelés
GROUP BY név


SELECT név, SUM(befizetés) - SUM(kifizetés) AS "egyenleg"
FROM könyvelés
GROUP BY név


SELECT név, SUM(befizetés) - SUM(kifizetés) AS "egyenleg"
FROM könyvelés
GROUP BY név, azonosító

 HAVING
Példák
SELECT diák, AVG(jegy) AS "tanulmányi átlag"
FROM napló
GROUP BY diák
HAVING AVG(jegy) >= 4.0
ORDER BY 2 DESC

 Táblák összekapcsolása
Jól megtervezett (normalizált) adatbázisokban az összetartozó információk sokszor több táblába vannak szétosztva. Ezzel elkerülhető a redundancia, továbbá az adatok módosításnál vagy törlésénél így egyszerűbb elkerülni bizonyos hibákat (inkozisztens adatok, információvesztés).

Amikor lekérdezünk az adatbázisból, össze kell szednünk az összetartozó adat-töredékeket. Erre szolgál a táblák összekapcsolása. Alapvetően kétféle összekapcsolást használunk:

    belső összekapcsolás (INNER JOIN)
    külső összekapcsolás (OUTER JOIN)

Az összekapcsolás lényege, hogy több táblából egyet csinál oly módon, hogy az eredmény tábla sorai az eredeti táblák megfelelő sorainak egymás mellé írásával keletkeznek. Hogy mit jelent a "megfelelő", az az összekapcsolás feltételében adható meg. Ez leggyakrabban abból áll, hogy az egyik tábla rekordjaiban található valamelyik mező meg kell egyezzen a másik tábla rekordjának egy mezőjével. Itt tipikusan a feltételben szereplő egyik mező kulcs szokott lenni, de ez nem kötelező.
Példa

Tekintsük a következő táblákat:
Diák(név,of)
név     of
Aladár     1
Bori     2
Csilla     2
Tanár(sor,név)
sor     név
1     Kiss Lenke
2     Gálos László
3     Konta Gyula

Ha a Diák tábla "of" mezőjét rendeljük a Tanát tábla "sor" mezőjéhez, akkor a következő összekapcsolt táblát kapjuk.
Diák.név     of     sor     Tanár.név
Aladár     1     1     Kiss Lenke
Bori     2     2     Gálos László
Csilla     2     2     Gálos László
Belső összekapcsolása

Összekapcsolás a "WHERE" záradékban
SELECT *
FROM T1, T2
WHERE T1.kulcs = T2.kulcs

Összekapcsolás a "FROM" záradékban
SELECT *
FROM T1 INNER JOIN T2 ON T1.kulcs = T2.kulcs

Több tábla összekapcsolása

SELECT *
FROM T1, T2, T3
WHERE T1.ka = T2.ka AND T2.kb = T3.kb

SELECT *
FROM (T1 INNER JOIN T2 ON T1.ka=T2.ka) INNER JOIN  T3 ON T2.kb=T3.kb
Külső összekapcsolás

Asszimetrikus, lehet jobb (RIGHT) vagy bal (LEFT).
SELECT *
FROM T1 LEFT OUTER JOIN T2 ON T1.kulcs=T2.kulcs

Ha a T1 tábla adott rekordjához nincs "pár" T2-ben, akkor is bekerül az eredmény táblába, és T2 mezői "NULL" értéket kapnak.

 Allekérdezések
Példák
SELECT név
FROM emberek
WHERE város = (SELECT város FROM emberek WHERE név="Jeffrey D. Ullman")


SELECT név
FROM dolgozók
WHERE fizetés < ALL (SELECT fizetés FROM dolgozók WHERE szakma="tanár")

 Halmazműveletek
Unió
Az unió műveletével különböző táblákból kinyert adatokat egyesíthetünk egy közös választáblában.

SELECT név
FROM 11C
WHERE matematika_jegy >= 4

UNION

SELECT név
FROM 11A
WHERE (magyar_jegy >= 4) AND (történelem_jegy >= 4)

Módosítás

 Beszúrás
Új rekordok beszúrása táblába. Megadhatjuk az összes mező értékét, és az is lehet, hogy csak néhány mezőt töltünk ki.

INSERT INTO tábla
VALUES (érték1, érték2, ...)

INSERT INTO tábla (mező1, mező2, ...)
VALUES (érték1, érték2, ...)

 Módosítás
Meglévő adatrekordok módosítása.

UPDATE tábla
SET mező1 = kifejezés1, mező2 = kifejezés2, ...
WHERE feltétel
 Törlés
Valamilyen feltételnek megfelelő sorokat törölhetünk egy táblából.

DELETE FROM tábla
WHERE feltétel
Hogyan lehet táblát létrehozni Base-ben lekérdezés alapján?

Szintén az Eszközök / Sql... menüből elérhető parancsablakban:
SELECT mező1, mező2, ... INTO újTábla FROM ... WHERE ...

A 4.2.3-as Libre Office Base alatt az volt a tapasztalatom, hogy a parancs létrehozza a táblát, de az nem jelenik meg automatikusan a felsorolt táblák között. Mentés, bezárás és ismételt megnyitás után viszont már látszott.
Lehet-e táblákat összekapcsolni egy adatmódosító lekérdezésben?

A Base által használt HSQL motor idevonatkozó oldala alapján BASE-ben nem:
<update utasítás> ::= UPDATE <cél tábla> SET <set kifejezések listája> [ WHERE <sorfeltétel> ]

MYSQL-ben lehetséges, és az összekapcsolása kerülhet a FROM záradékba (JOIN), illetve a WHERE feltételbe is. Például:

UPDATE T1, T2
SET T1.mező1  = 2* T2.mező2
WHERE T1.id = T2.id AND további feltételek

Nincsenek megjegyzések:

Megjegyzés küldése