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):
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
Az
összesítő függvények a tábla valamelyik oszlopa alapján egyetlen értéket
számolnak ki.
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
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
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
SELECT IF( 4 > 3, 'rendben', 'baj van')
SELECT LEFT('Berzsenyi Dániel Gimázium', 9)
-> 'Berzsenyi'
|
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
Az átnevezésre akkor is szükség lehet, ha egy lekérdezésben egy
táblát önmagával kell összekapcsolni.
|
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.
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'
|
ORDER BY, LIMIT és TOP
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:
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ő.
Tekintsük
a következő táblákat:
Diák(név,of)
Tanár(sor,név)
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.
Ö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
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
Adattípusok
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 |
Tankönyvrendelés
A
középiskolás diákok részére tanáraik minden év kora tavaszán megrendelik a
következő évben használt tankönyveket. A rendeléshez kapcsolódó
adatokat adatbázisban rögzítik. Az adatbázis néhány évre vonatkozóan
tartalmaz kitalált adatokat.
A következő feladatok megoldásánál a lekérdezéseket és a jelentést a
zárójelben olvasható néven mentse! Ügyeljen arra, hogy a megoldásban
pontosan a kívánt mezők, kifejezések szerepeljenek, felesleges mezőt ne
jelenítsen meg!
|
Nincsenek megjegyzések:
Megjegyzés küldése