SQL történelem 1970 Edgar F. Codd (IBM) cikke 12 szabály a relációs adatmodellekre 1979 első kereskedelmi forgalmazású relációs adatbáziskezelő 1986 az ANSI elfogadta az első SQL szabványt Mára minden jelentősebb relácós-adatbázis kezelő SQL alapú (Oracle,IBM DB2…)
Az SQL nyelv SQL= Structured Query Language (nem a fizikai tárolás, az algoritmus a fontos, hanem a feldolgozás eredményének meghatározásán van a hangsúly) A nyelvi elemeket szokásos adatdefiníciós (Data Definition Language, DDL) és adatkezelési (Data Manipulation Language, DML) részekre bontani. A nyelvben az utasításokat a pontosvessző választja el egymástól.
Adatdefiníciós utasítások (pl.) CREATE Adatbázis objektum létrehozása. CREATE TABLE Szamla ( Szamlaszam NUMERIC(24), Tulajdonos VARCHAR(60), Nyitas DATE, Allapot VARCHAR(1), PRIMARY KEY (Szamlaszam) );...
Adatkezelő utasítások SELECT Az utasítás az adatok egy halmazát válogatja ki egy táblázatba a relációs adatbázisból (az ACCESS választó lekérdezése) Záradékai (majdnem mind opcionális): FROM, WHERE, GROUP BY, HAVING, ORDER BY
SELECT A SELECT mögött az eredményhalmaz oszlopait kell itt felsorolni. Nagyon hasznos, hogy további SELECT-ek is lehetnek benne! SELECT Vevő.NÉV SELECT Vevő.* SELECT Vevő.NÉV, Vevő.LAKCÍM SELECT Csalad.GYERMEK, [meddig]-[mettől] AS hossz
FROM Meghatározza, hogy mely adatbázis-táblákból szeretnénk összegyűjteni az adatokat. SELECT * FROM Vevő SELECT Vevő. NÉV FROM Vevő Több táblánál minden sort minden sorral párosít SELECT * (Ez így persze nem jó semmire, Descartes szorzat) FROM Beteg, Kezeles
WHERE Szűrési feltételeket fogalmaz meg, amelyek szűkítik az eredményhalmazt (a Descartes-szorzathoz képest) SELECT Csalad.SZÜLŐ FROM Csalad WHERE (((Csalad.SZÜLŐ)="ENDRE")); SELECT * FROM Beteg, Kezeles WHERE Beteg.ID = Kezeles.BetegID Feltételben AND, OR, BETWEEN…
GROUP BY Egyes sorok összevonását, csoportosítását írja elő az eredménytáblában SELECT SZÜLŐ, Count(SZÜLŐ) AS Gyermekszám FROM Csalad GROUP BY Csalad.SZÜLŐ;
GROUP BY2 SELECT SZÜLŐ, Count(*) FROM Csalad GROUP BY Csalad.SZÜLŐ; SQL-es megoldás
GROUP BY3 Feltétel is megadható SELECT COUNT(*), Tulajdonos FROM Szamla WHERE Allapot = 'N‘ GROUP BY Tulajdonos A fenti példa a Tulajdonos oszlop alapján csoportosítja a sorokat. A csoportosítás előtt kivehetjük a feltételnek nem megfelelő rekordokat.
HAVING (group by megelőzi) A WHERE-hez hasonlóan itt is szűrést fogalmaz- hatunk meg, azonban itt a csoportosítás utáni eredményhalmazra. SELECT COUNT(*), Tulajdonos FROM Szamla WHERE Allapot = 'N‘ GROUP BY Tulajdonos HAVING COUNT(*) > 1 Az előző példához képest itt annyi a módosulás, hogy csak azok a csoportok jelennek meg, amelyek egynél több sorból lettek összevonva.
ORDER BY Az eredményhalmaz rendezését adja meg. SELECT Csalad.SZÜLŐ FROM Csalad ORDER BY Csalad.SZÜLŐ; Vagy csökkenőben rendezve SELECT Csalad.SZÜLŐ FROM Csalad ORDER BY Csalad.SZÜLŐ DESC;
További adatkezelő utasítások INSERT Adatokat ad hozzá egy táblához. INSERT INTO Szamla(Szamlaszam,Tulajdonos,Nyitas, Allapot) VALUES (123456, 'H. Kovács Géza', ' ', 'N'); UPDATE Módosítást hajt végre az adatokon. UPDATE Szamla SET Allapot = 'D' WHERE Szamlaszam = ; DELETE Adatokat töröl egy táblából. DELETE FROM Beteg WHERE TAJ = ' ';
Feladatok az alkalmazáshoz
A problémakör
Mi legyen ebből? A kiválasztott adatok: Név, cím, adószám, rendelés dátuma, rendelésszám, termékkód, terméknév, mennyiség, bruttó egységár, vállalt határidő Elnevezések: Név, cím, adószám, rend_dátum, rend_szám, kód, név, darab, dátum
Az adatok csoportosítása Egy bizonylaton csak egyszer fordulhat elő Rendelés rend_számkódnévdarabárdátum Egy bizonylaton többször is előfordulhat Rendelésfej névcímadószámrend_dátumrend_szám Most így állunk: RENDELÉSFEJ{rend_szám, név, cím, adószám, rend_dátum} RENDELÉS{rend_szám,kód, név, darab, ár, dátum}
További alakítások Vegyük ki a megrendelőre vonatkozó adatokat és helyettesítsük egyetlen kóddal (partner_kód) Hasonlóan vegyük ki a termékre jellemző adatokat és csak a kód-ot hagyjuk meg (kód) Tudni szeretnénk, hogy elkészült-e már a termék, ezért a RENDELÉS táblában legyen egy új mező Így tehát: PARTNER{partner_kód, név, cím, adószám} RENDELÉSFEJ{rend_szám, partner_kód, rend_dátum} RENDELÉS{rend_szám,kód, darab, dátum, kész} TERMÉK{kód, név, ár}
További alakítások 2 A PARTNER táblát a további példáinkban nem használjuk (a rendelésre koncentrálunk) Egy termék többféle anyagból készül. Tárolni szeretnénk a termékek milyen anyagokból épülnek fel (ez egy N:M kapcsolt lenne) Ezért egy új, szerkezet nevű táblát hozunk Így: TERMÉK : SZERKEZET1:N SZERKEZET : ANYAGN:1
TERMÉK : SZERKEZET : ANYAG
Nézzük az adatbázist! Az adatbázis szerkezete tehát:
A kapcsolatok (kulcsok és külső kulcsok, kettős kulcs)
Az adatok tárolása mezőnévtípus, szabály árHosszú egész, 2 tizedesjegy azonosító3 jegyű egész dátumDátum egys_árPénznem készletHosszú egész, 2 tizedesjegy kód2 nagybetű+1 szám, LL0 mennyiségHosszú egész, 2 tizedesjegy mért_egys3 karakteres szöveg név30 karakteres (indexelt, nem lehet azonos) partner_kód3 karakteres szám, 000 rend_dátumDátum rend_szám1nagybetű+1 kisbetű+’-’+4 számjegy
A feladatok (SQL)1 1.Írassuk ki azoknak az anyagoknak az azonosítóját, amelyek 2-vel kezdődnek! 2.Készítsünk listát a ‘cm’-ben és a ‘m’-ben mért anyagok azonosítójáról! 3.Keressük azokat a január 1.-re és 2.-ra vállalt rendeléseket, amelyekben ‘A’ betűvel kezdődő kódú terméket rendeltek meg. Írassuk ki a feltételnek megfelelő rendelések minden adatát a rendelés táblából!
A feladatok (SQL)2 4.Azon termékek kódját, darabszámát és megrendelésszámát keressük, amelyeket a mai naptól számítva 1 héten belül kell elkészíteni és még nincs kész! 5.Egyszerű lekérdezések 1 táblából a.Véletlen szám (FROM nélküli SELECT) b.A mértékegységek listája c.Tábla sorainak száma d.Hány anyag neve kezdődik az egyes betükkel?
A feladatok (SQL)3 e.Csak azokat a betűket írassuk ki, amelyikkel legalább 2 anyag neve kezdődik! f.Számoljuk össze, hogy az anyagok közül melyikből áll rendelkezésre 15-nél több, 15, vagy kevesebb! 6.Paraméteres lekérdezés Keressük meg, hogy egy a lekérdezés idején definiált karaktersorozattal kezdődő nevű termék van-e az adatbázisban?
A feladatok (SQL)4 7.Táblák összekapcsolása Határozzuk meg, hogy az egyes termékek mely anyagokból épülnek fel! (direktszorzat) 8. Egymásba ágyazott SELECT Keressük meg azokat a termékeket, amelyekhez kell a 113-as kódú anyag!
SELECT Rnd() AS véletlen; SELECT mért_egys FROM anyag; SELECT DISTINCT mért_egys FROM anyag; SELECT mért_egys FROM anyag GROUP BY mért_egys;
SELECT COUNT(DISTINCT mért_egys) FROM anyag; SELECT Left(neve, 1) AS első FROM anyag GROUP BY Left(neve,1) HAVING COUNT(*)>=2;