Sie sind auf Seite 1von 118

Új adatbázis + nézet

 New Blank Database Create

 Kétféle View (nézet):

 Váltsunk Design View-ba a táblázat szerkesztéséhez


Táblák
 Váltásnál kéri a tábla nevét
 Legyen ez a Mozi tábla

 Field Name: ez lesz az oszlopnév!


 Data Type: milyen típusú adat (szöveg, szám…)
Kulcs
 moziID alapból kulcsként jelenik meg.
 Ha másik kulcsot szeretnénk választani, akkor ki kell
jelölni a sort, és Primary Key ikonra kattintani.
 Több oszlopot is kiválaszthatunk kulcsnak: Ctrl+kattintás
Egyéb módosítások
 Sor beillesztése, törlése

 Property Sheetben további beállítások

 + lent a Field propertiesben


Mentés

 Mindent be kell csukni, hogy menteni tudjunk


 Fájl név beírása
 Engedélyezük
 Options – enable

 Tábláknál: 2x katt a Mozi táblára


 Megnyílik a lementett tábla

 Automatikusan Datasheet Viewban vagyunk (tudjuk a


táblázatunk sorait szerkeszteni)
 Ha még szeretnénk új oszlopokat
 (attribútumokat) létrehozni, akkor a
 View –nál tehetjük meg

 Datasheet: sorok szerkesztése


 Design View: oszlopok szerkesztése
Mozi tábla - Adatok bevitele
 Vigyünk be néhány adatot a Mozi táblába
Design 
 Hasonlóan, mint az office programokban itt is tudunk
fontot változtatni, Boldolni, színezni, ABC sorrendbe
rakni…
Új tábla készítése
 Create – Table

 Válsunk megint Design View-ba, hogy az oszlopok neveit


meg tudjuk adni, ehhez el kell menteni megint a táblát
Film néven.
 Az oszlopnevek és típusok megadása után váltsunk vissza
Datasheet View-ra, és írjunk be néhány sort.
Film tábla
Adatbázis link
 http://esztelecki.on.neobee.net/01.accdb
By Szénási Eszter
Vetit tábla
 Két kulcs: moziID és filmID
Kapcsolatok
 Database Tools – Relationships

 Show table-nél mind a 3at


 bejelöljük és Add.
 Kapcsolatok kialakításához be kell csukni a megnyitott
táblákat!

 Új kapcsolat felépítéséhez húzzuk a hivatkozandó tábla


kapcsolódó mezőjét a hivatkozott tábla kapcsolódó
mezőjére.
 Tehát esetünkben a Vetit.moziID-t a Mozi.moziID-re
 És a Vetit.filmID-t a Film.filmID-re.
 Ekkor felugrik egy ablak

 Itt állíthatjuk be a kapcsolatokat

 Be lehet pipázni a hivatkozási integritás megőrzése box-ot,


ekkor az Access biztosítja, hogy a kapcsolódó adatokat ne
lehessen véletlenül egymástól függetlenül módosítani vagy
törölni. (Most ne jelöljük be)

 Create – a kapcsolat létrehozásához


Kapcsolat változtatása

 2x kattintás a kapcsolat vonalra a változtatáshoz


SQL parancsok futtatása
 Create – Query design

 Egy új Query fül jön létre, ahol a lekérdezéseket tudjuk


végrehajtani.

 SQL view-re váltunk


 Itt ki tudjuk próbálni az SQL utasításokat
 Pl:

 Run-nal hajtjuk végre


 Az eredménytáblánk Query1 néven lesz elérhető

 Ha a Query fülre kattintunk jobb gombbal, akkor vissza


tudunk váltani SQL nézetbe.
 Save-vel ezt is el tudjuk menteni
 Ha újabb Query-t szeretnénk, akkor ismét a Create –
Query design –re kell kattintani
Az SQL története
 Az SQL, a Structured Query Language angol
elnevezésből származtatott mozaikszó
 Magyar fordítása Strukturált Lekérdező Nyelv, ám a
nyelv valójában komplett adatbázis-kezelő nyelv (tehát
nem csak lekérdezések, hanem adatmanipulációk is)
 1974-75-ben az IBM fejlesztette ki a SEQUEL
(Structured English Query Language) egységesített
lekérdező nyelvet egy kísérleti adatbázishoz. Ez a név
későbbiekben a ma használatos SQL névre változott

 Bővebben: SQL tortenete.docx


SELECT
SELECT <relációi >.<attrib1>, . . . , <relációj>.<attribn>
FROM <reláció1>, . . . , <relációm>
WHERE <kifejezés>
 Pl.: A budapesti mozik azonosítói és nevei

SELECT mozi.moziID, mozi.név


FROM mozi
WHERE mozi.város="Budapest"

 SELECT-nél mozi.moziID helyett írhatunk csak moziID-t


is, mert egyértelműen azonosít (nincs másik moziID)
 Pl..: A pénteken négykor kezdődő filmek azonosítói

SELECT vetit.filmID
FROM vetit
WHERE vetit.nap="péntek" AND vetit.idő= "16:00"
 Pl.: Kusturica által rendezett filmek ID-jei
 2. lépés: a filmcímeket is írasd ki hozzá
SELECT film.filmID
FROM film
WHERE film.rendező=„Emir Kusturica"
 Pl.: Szombaton mikor vetítik a 2-es ID-jű filmet?
SELECT vetít.idő
FROM vetít
WHERE vetit.nap= " szombat " AND vetít.filmID=2
Többszörös sorok
megszüntetése
 Pl: Írassuk ki az összes rendező nevét
SELECT film.rendező
FROM film

 Ez mit fog kiírni?


 Előfordulhat-e, hogy egy rendező többször szerepel az
eredményben?
DISTINCT
 Ha nem akarunk többszörös sorokat:

 SELECT DISTINCT

SELECT DISTINCT film.rendező


FROM film

 Kiírja a rendezőket, de mindegyiket csak egyszer


 Pl: Kiíratni az összes várost, ahol van mozi (pontosan
egyszer)
 SELECT DISTINCT város
 FROM mozi
*
 Ha kíváncsiak vagyunk egy táblázat minden
attribútumának értékére, akkor nem szükséges az összes
attribútumot felsorolni a SELECT után, hanem elegendő a
* (csillag) karaktert használni

SELECT *
FROM film

 A teljes film táblázatot adja vissza


 Pl: Kiíratni minden adatot a filmekről, amelyeknek a
rendezője Steven Spielberg!
 SELECT *
 FROM film
 WHERE film.rendező="Steven Spielberg"
Átnevezés
 AS

SELECT mozi.név AS filmszínház, mozi.város AS hely


FROM mozi
 Pl: Nevezd át a film táblázatban a rendező oszlopot
directorra a címet pedig titlere, és csak azok az esetek
legyenek kiírva, ahol a rendező Robert Zemeckis.
 Where-ben marad a film.rendező
 SELECT film.cím AS title, film.rendező AS director
 FROM film
 WHERE film.rendező="Robert Zemeckis"
WHERE
 Logikai műveletek: AND, OR, NOT

 Összehasonlítás: =, < , >, >=, <=, LIKE, BETWEEN

 Ha nincs szükség WHERE feltételekre, akkor


kihagyhatjuk a kifejezést.
BETWEEN
 BETWEEN a AND b jelentése a ≤ . ≤ b
 Pl.: A 103 és 107 közötti azonosítójú mozik nevei
SELECT név
FROM mozi
WHERE moziID BETWEEN 103 AND 107
LIKE
 '_' egy tetszőleges karakterre illeszkedik. ACCESS: '?'
 '%' tetszőleges karakterláncra illeszkedik. ACCESS: '*'
 Pl.: Azok a mozik, amelyek B-vel kezdődő nevű városban
vannak.
SELECT név
FROM mozi
WHERE város LIKE 'B*'
 Pl.: Azok a mozik, amelyek a nevük ötbetűs.
SELECT név
FROM mozi
WHERE név LIKE '?????'
 Pl.: Azok a mozik, amelyek B-vel kezdődő nevű városban
vannak, és a nevük ötbetűs.
SELECT *
FROM mozi
WHERE város LIKE 'B*' AND név LIKE '?????'
 Pl.: A 103 és 107 közötti azonosítójú mozik közül azok,
amelyek B-vel kezdődő nevű városban vannak, és a nevük
ötbetűs.
SELECT *
FROM mozi
WHERE moziID BETWEEN 103 AND 107 AND
város LIKE 'B*' AND név LIKE '?????'
ORDER BY –
Rekordok rendezése
 A lekérdezés eredményét rendezni tudjuk valamilyen
tulajdonságérték alapján.
 Kulcsszava: ORDER BY

 Módjai:
 ASC – növekvő sorrend
 DESC – csökkenő sorrend

 ASC-t nem írjuk ki, az az alapértelmezett


 WHERE feltétel után következik
 Pl: A 103 és 107 közti ID-jű mozik kiíratása a mozi neve
szerint rendezve
SELECT *
FROM mozi
WHERE mozi.moziID BETWEEN 103 AND 107
ORDER BY mozi.név
 Pl: A 103 és 107 közti ID-jű mozik kiíratása a mozi városa
szerint rendezve fordított ABC sorrendben
SELECT *
FROM mozi
WHERE mozi.moziID BETWEEN 103 AND 107
ORDER BY mozi.város DESC
 A rendezést több tulajdonság alapján is végezhetjük.
Ilyenkor az első tulajdonság szerint rendezi az eredményt,
és ha hasonlóság van, akkor az azonos elemeket a második
tulajdonsággal rendezi, és így tovább.

 ORDER BY valami1, valami2


Aggregátumok számolása
 MIN - minimumérték
 MAX - maximumérték
 AVG - átlagérték
 SUM – összeg
 COUNT – darabszám

 Pl: legnagyobb film ID. Célszerű átnevezni!

SELECT MAX (filmID) AS maxfilmid


FROM film
 Pl: moziID-k átlaga
SELECT AVG (moziID) AS moziidatlag
FROM mozi
 Pl: Írasd ki, hogy hány darab film van a film táblázatban!
Az eredmény filmdarab néven jelenjen meg.
SELECT COUNT (*) AS filmdarab
FROM film

 De akár lehetne:

SELECT COUNT (rendező) AS filmdarab


FROM film
JOIN
 Belső összekapcsolás: R INNER JOIN S
 Megj: MySQL-ben csak R JOIN S

 R-nek és S-nek csak azon sorai kerülnek az


eredményrelációba, melyekhez van kapcsolódó sor S-ben,
illetve R-ben
JOIN
Szeretnénk megtudni a bizonyos időben vetített filmeknek a címét
(nem az ID-jét).
Az ID-t ki tudnánk olvasni a Vetít táblából, de mivel a címre van
szükség, így össze kell kapcsolni a Vetít táblát a Film táblával:

SELECT *
FROM Film INNER JOIN Vetit ON Film.filmID=Vetit.filmID

Megj: így a filmID kétszer fog szerepelni a táblázatunkban,


megkülönböztetve: Film.filmID és Vetit.filmID.
 Helyette szűkítsünk:

SELECT cím, nap, idő, Film.filmID


FROM Film INNER JOIN Vetit ON Film.filmID=Vetit.filmID

Ha SELECT-ben olyan attribútumra hivatkozunk, amelyik több


táblázatban is szerepel (filmID), akkor a táblázat nevét is oda
kell írni (Film.filmID vagy Vetit.filmID)
 Ehhez hasonlóan JOIN-oljuk össze a Vetit táblát a Mozi
táblával. A kapott táblában az alábbi attribútumok
jelenjenek meg: nap, idő, név, filmID
SELECT nap, idő, név, filmID
FROM Vetit INNER JOIN Mozi ON
Vetit.moziID=Mozi.moziID
Kettőnél több tábla JOIN-olása
 Az előző eredménytáblában a csak a vetítendő filmID-je
szerepelt, de, ha szeretnénk megtudni a film címét is,
akkor az előző eredménytáblához hozzá kell csatolni a
Film táblát is.
 Tehát az alábbi attribútumok szerepeljenek: nap, idő, név,
cím

 Próbáljátok meg önállóan!


SELECT nap, idő, név, cím
FROM (Vetit INNER JOIN Mozi ON
Vetit.moziID=Mozi.moziID) INNER JOIN Film ON
Vetit.filmID=Film.filmID
 Ennél egy kicsivel egyszerűbb, és átláthatóbb megoldás, ha az
előzőleg megkapott Query eredménytáblát is ugyanúgy
kezeljük, mint a többi táblázatot, és ahhoz JOIN-oljuk hozzá a
Film táblát:

SELECT nap, idő, név, cím


FROM Query2 INNER JOIN Film ON
Query2.filmID=Film.filmID

 Itt viszont vigyázni kell, ha hivatkozunk az előző


eredménytáblára!
 Ennél még júzerfrendlibb megoldás  ha már Microsoftos
programról van szó:
 Amikor új lekérdezést készítünk, akkor mind a 3
táblázatot bejelöljük, majd a SELECT-be beírjuk a
szükséges attribútumokat.
 FONTOS! A kapcsolatokat meg kell
előtte adni a Relationshipsben
JOIN - feltétellel
 Csak a szombaton vetített filmekről szeretnénk megtudni a
film címét:

SELECT cím, nap, idő


FROM Film INNER JOIN Vetit ON Film.filmID=Vetit.filmID
WHERE vetit.nap='szombat';
 Szeretnénk megtudni, hogy melyik napon, milyen időben,
milyen nevű moziban, melyik ID-jű filmet vetítik
Budapesten. Ellenőrzésképp írjuk ki a város nevét is!
SELECT nap, idő, név, város, filmID
FROM Vetit INNER JOIN Mozi ON
Vetit.moziID=Mozi.moziID
WHERE város = 'Budapest'
 Az előző lekérdezésünket bővítsük ki úgy, hogy csak azok
a filmek szerepeljenek benne, amelyeknek a címe S-el
kezdődik. Ellenőrzésképpen írassuk ki a filmek címét is!
SELECT nap, idő, név, cím, város
FROM (Vetit INNER JOIN Mozi ON
Vetit.moziID=Mozi.moziID) INNER JOIN Film ON
Vetit.filmID=Film.filmID
WHERE város = 'Budapest' AND cím LIKE 'S*'
OUTER JOIN
 Bal oldali külső összekapcsolás: R LEFT OUTER JOIN S
 R-nek azon sorai is bekerülnek az eredményrelációba,
melyekhez nem kapcsolódik S-beli sor.
 Ezekben a csak S-ben szereplő mezők NULL értéket kapnak.

 Jobb oldali külső összekapcsolás: R RIGHT OUTER JOIN S


 Mint a LEFT OUTER JOIN, de R és S szerepe megcserélődik.
 Tehát azokat a R-beli sorokat is
tartalmazza, amelyekhez nincs S-beli
megfelelő. Vagyis azok a filmek is benne
lesznek az eredménytáblában,
amelyekhez nem tartozik vetítési adat
 Azok a vetítési idők is bekerülnek
az eredménytáblába, amikhez nincs
adat a film táblából.
OUTER JOIN
SELECT cím, nap, idő
FROM Film LEFT OUTER JOIN Vetit
ON Film.filmID=Vetit.filmID;

 Látható, hogy a The Polar Express c. filmet nem vetítik,


így a nap és az idő mezők NULL értéket kapnak.

 RIGHT OUTER JOIN is ugyanígy működik


 Tulajdonképpen R LEFT OUTER JOIN S ugyanazt az
eredményt adja, mint S RIGHT OUTER JOIN R, csak az
oszlopok sorrendje lesz más.
Halmazműveletek - UNION
 Emir Kusturica által rendezett filmek „összeúniózva” Robert
Zemeckis filmjeivel:

(SELECT cím FROM Film WHERE rendező='Emir Kusturica')


UNION
(SELECT cím FROM Film WHERE rendező='Robert Zemeckis')

 További halmazműveletek: INTERSECT (metszet) és MINUS


(különbség). Ezek ACCESS-ben nem támogatottak, MySQL-
ben viszont működnek.
GROUP BY

 Egyes sorok összevonását, csoportosítását írja elő az


eredménytáblában
 Bővítsük ki a Mozi táblát a székek száma attribútummal,
hogy legyen mi alapján csoportosítani!
 Pl: Képezzük minden városra a székszámok összegét
SELECT város, SUM(székszám) AS össz_székszám
FROM mozi
GROUP BY város
 Pl: Az egyes városok legkisebb és legnagyobb mozijának
mérete
SELECT város, MIN(székszám) AS minszekszam,
MAX(székszám) AS maxszekszam
FROM mozi
GROUP BY város
GROUP BY - HAVING
 A csoportosítással együtt tehetünk feltételt a csoportokra.
Ebben az esetben csak azokra a csoportokra számolódik ki
az aggregátum, amik a feltételnek eleget tesznek.
 A csoportra vonatkozó feltételt a HAVING kulcsóval tudjuk
megfogalmazni
 Csak akkor használhatunk HAVING-et, ha van GROUP BY

 Példa:
 Azokra a városokra számolunk csak legkisebb és
legnagyobb mozit, ahol van legalább 2 mozi
SELECT város, MIN(székszám) AS minszekszam,
MAX(székszám) AS maxszekszam
FROM mozi
GROUP BY város
HAVING COUNT (név)>1
De minden lekérdezés ilyen
rövid? 
SELECT gb_log.id AS logid, gb_users.id AS userid, date, time,
user, name, username, action, ip, cast(concat(concat(date,' '),
time) as datetime) as aa
FROM gb_log LEFT OUTER JOIN gb_users ON gb_log.user
= gb_users.id
WHERE date BETWEEN '$listdatefr' AND '$listdateto' AND
action LIKE '%$scrollactionsel%' AND username LIKE
'%$username1' AND concat(concat(date,' '),time) between
'$listdatefrtime' and '$listdatetotime' OR (date BETWEEN
'$listdatefr' AND '$listdateto' AND action LIKE
'%$scrollactionsel%' AND user=0 AND concat(concat(date,'
'),time) between '$listdatefrtime' and '$listdatetotime' ) ORDER
BY date LIMIT 200
SELECT product_name, product_full_image, product_s_desc, product_sku,
product_full_image, jos_vm_product.product_id, product_price,
jos_vm_product_category_xref.category_id AS catid, category_name

FROM ((jos_vm_product JOIN jos_vm_product_price ON


jos_vm_product.product_id = jos_vm_product_price.product_price_id)
JOIN jos_vm_product_category_xref ON
jos_vm_product.product_id = jos_vm_product_category_xref.product_id)
JOIN jos_vm_category ON
jos_vm_product_category_xref.category_id = jos_vm_category.category_id

WHERE product_full_image LIKE '_%'


Táblázat létrehozása
CREATE TABLE Auto (
Tul NUMBER,
Tip CHAR );

 Lehet további paramétereket adni, de ezzel nem


foglalkozunk
Adatok bevitele
INSERT INTO Auto VALUES (3, 'xcxc');

 Ha üres mezőt is szeretnénk bevinni:


INSERT INTO Auto VALUES (3, NULL);
Táblázat törlése
 DROP TABLE Auto;
Ismétlés
 Következő óra: feladatmegoldás jegyre

 Átismételjük az Access használatát, és az SQL


parancsokat:
 Új táblázat létrehozás, kulcsok beállítása
 Kapcsolatok létrehozása
 SQL parancsok megírása és végrehajtása
 Példa: Reptér
 Nyilván tartjuk, hogy melyik napon, melyik időben repül
melyik repülő melyik reptérről.

 Reptér tulajdonságai: reptérID, név, város


 Repülő tulajdonságai: repülőID, méret, tipus

Hány táblázat lesz, és milyen adatokkal?


Készítsd el Access-ben a táblázatokat!
Reptér
Repülő
Repül
Kapcsolatok
Adatbázis link
 http://esztelecki.on.neobee.net/Repter.accdb
SQL
 1. Minden adat a repülőtérről
 2. Repülőtér neve és város
 3. Kiíratni az összes repülőtípust
 4. Szombaton milyen ID-jű reptérről megy repülő?
 5. Repülők, amiknek a mérete 110-nél nagyobb
 6. RepülőID 202 és 205 közt van, és a méret nagyobb,
mint 150
 7. Repterek, amelyiknek a nevük H-val kezdődik
 8. Repülők, aminek a típusa 6 betűs
 9. A repterekből a név és város attribútumokat az
eredménytáblában úgy jelenjenek meg, mint name és city
 10. Hasonlóan az előző példához, name és city legyen a
fejlécben, és a táblázatban csak azok a repterek
szerepeljenek, aminek a neve S-el kezdődik.
 11. Repülők átlagmérete
 12. Repülők átlagmérete, de úgy, hogy az oszlop neve az
legyen, hogy átlagméret
 13. Csak azon repülőkre számítsuk ki az átlagméretet,
amelyek nagyobbak, mint 130
 14.201 és 205 közti ID-jű repülőgépek ABC sorrendbe rakva
 15. Tipus, nap, idő kiíratása
 16. Melyik repülőtipus mikor repül – azok a tipusok is
benne legyenek a listában, amelyekhez nincs repülési
adatunk!
 17. Melyik repülőtípus repül kedden, és mikor?
 18. Milyen típusú és méretű gép mikor indul milyen nevű
repülőtérről és melyik városból? (mehet *-al)
 19. Készíts olyan táblázatot, amiben szerepel a típus
méret, nap, idő, név, város.
 20. Ezek közül kiíratni csak azokat, amelyek olyan
városból indulnak, amelyiknek a neve B betűvel kezdődik,
és nyolc betűs összesen!
 21. Készíts összegzést: a táblázatban az szerepeljen, hogy
az egyes városokból induló repülőknek mennyi az össz
méretük!
 22. Ugyanezt az összegzést készítsd el úgy, hogy csak
azokat a repülőket vegyük figyelembe, melyeknek a
mérete nagyobb, mint 120

Das könnte Ihnen auch gefallen