You are on page 1of 35

Adatbáziskezelés I.

Börcsök József (JoeB)


borcsokj@sch.bme.hu
Az előadás tartalma
„ Adatbázisok alapjai (célok, feladatok)
„ Adatbázisok tervezése, ER diagramok
„ Műveletek
„ Az SQL nyelv
„ MySQL specifikumok
„ Adatbázisok elérése PHP-ból
Adatbázisok használata, célja
„ Cél: a funkciók (műveletek) és adatok
elkülönítése, műveletek hatékony
végrehajtása
„ adatok tárolása egyszerű szövegfile-okban
(saját formátumok)
„ programnyelvek formátuma (pl. Pascal
típusos file)
„ adatok tárolása erre tervezett rendszerekben:
„ adatbáziskezelő rendszerek (DBMS)
„ adattárolásra kitalált formátumok (pl. XML)
Adatbáziskezelők működése 1.
„ Jellemzők:
„ Nagy adatmennyiség
„ Gazdag struktúra
„ Hosszú élettartam

„ Kiegészítő funkciók
„ Adatvédelem
„ Adatbiztonság
„ Integritás
„ Szinkronitás
Adatbáziskezelők működése 2.
Adatbáziskezelők működése 3.
ER modell, ER diagram
„ Entity-Relationship (egyed-kapcsolat) modell
„ Elemei:
„ egyed: olyan dolog, amiről adatokat szeretnénk
tárolni
„ attribútum: egyedekhez kapcsolódó tulajdonságok
„ kapcsolat: egyedek közötti kapcsolat
„ A modell megadható szövegesen
„ Elterjedtebb a grafikus ábrázolás
„ Használata: adatbázis szerkezetének
megtervezésére
ER diagram elemei 1.
„ Egyed: téglalap
„ Attribútum: ellipszis
„ Kapcsolat: rombusz
ER diagram elemei 2.
(attribútumok)
„ Kulcs: az attribútumoknak az a halmaza,
mely egy rekordot (egy konkrét egyedet)
egyértelműen azonosít
„ Jelölés: aláhúzással
ER diagram elemei 3.
(kapcsolatok fajtái)
„ Egy-egy kapcsolat

„ Több-egy kapcsolat
ER diagram elemei 4.
(kapcsolatok fajtái)
„ Több-több kapcsolat
„ külső kulcs
Relációs adatbázisok, műveletek
„ Az adatokat R Név Szoba
táblázatszerűen
ábrázoljuk
„ A táblázatok (üresen)
alkotják az adatbázis
vázát, ez a séma
„ Az adatokkal kitöltött r Név Szoba
táblázatok neve: reláció
„ Egy sor: rekord
Aadaam 1209
„ Egy oszlop: mező Bandita 1611
(attribútum)
Domi 1710
Műveletek relációkon 1.
„ Unió
r1 A B r2 A B r A B
a b a d a b
∪ =
a c b e a c
d e a c d e
a d
b e
a c
Műveletek relációkon 2.
„ Metszet
r1 A B r2 A B r A B
a b a d a c
∩ =
a c b e
d e a c
Műveletek relációkon 3.
„ Különbség
r1 A B r2 A B r A B
a b a d a b
\ =
a c b e d e
d e a c
Műveletek relációkon 4.
„ Vetítés r1 A B C D
a e a b
a d g c
d d e e

„ Kiválasztás r1 A B C D
a e a b
a d g c
d d e e
Műveletek relációkon 5.
„ Descartes szorzat
r1 A B r2 C D E
a a × k l m =

a b k n o
r A B C D E
a a k l m
a b k l m
a a k n o
a b k n o
Műveletek relációkon 6.
„ Természetes illesztés (A = C)
r1 A B r2 C D r A B D
a b a d a b d
join =
a c b e a b c
b e a c a c d
d g a c c
b e e
Műveletek relációkon 7.
„ Theta-illesztés (A1 < A3)

r1 A B r2 C D r A B C D
a b a d a b b e
join =
a c b e a c b e
b e a c
d g
ER modell relációkká alakítása 1.
„ Egyed -> reláció (táblázat)
„ Attribútum -> mező (oszlop)
„ Több-több kapcsolat -> külön reláció külső
kulcsokkal
„ Egy-több kapcsolat: külső kulcs felvétele a
több oldalon (pl. könyveknél a regény
rekordjában tároljuk az íróját)
„ Egy-egy kapcsolat: külső kulcs felvétele
valamelyik oldalon
ER modell relációkká alakítása 2.
„ Példa több-több kapcsolatra

Tagság Sz.Név Sz.SzemIg Cs.Név Tags.kezd Tags.vég

„ Példa több-egy kapcsolatra

Regény Cím ISBN Megjelenés Kiadó Szerző Szerző


neve szül.nap
Séma létrehozása
„ Táblák létrehozása
CREATE TABLE users ( CREATE TABLE groups (
usr_id integer NOT NULL, grp_id integer NOT NULL,
usr_loginname text NOT NULL, grp_name text NOT NULL,
usr_name text, grp_description text,
usr_email text, grp_founded integer,
usr_password varchar(32), grp_maillist text,
usr_description text, PRIMARY KEY (grp__id),
PRIMARY KEY (usr_id), UNIQUE (grp_name)
UNIQUE (usr_loginname) );
);

CREATE TABLE grp_members (


usr_id integer NOT NULL, grp_id integer NOT NULL,
membership_stert date NOT NULL, membership_end date,
FOREIGN KEY (usr_id) REFERENCES users (usr_id) ON DELETE
CASCADE ON UPDATE CASCADE,
FOREIGN KEY (grp_id) REFERENCES groups (grp_id) …
);
Típusok
„ Szám: integer, double
„ Szöveg: char, varchar, text
„ Logikai: boolean
„ Felsorolás: enum
„ Idő: date, time, timestamp, datetime
Kényszerek
„ NOT NULL: nem lehet NULL értékű
„ DEFAULT {érték}: alapértelmezett érték,
ha nincs megadva a rekord beszúrásakor
„ CHECK {feltétel}: ez nem mezőkhöz,
hanem táblához tartozik, {feltétel}-nek fenn
kell állnia (pl. megrendelés dátuma <
szállítás dátuma)
„ FOREGIN KEY: külső kulcs megadása
Séma módosítása
„ Táblák módosítása
ALTER TABLE users ADD usr_logintime timestamp;
ALTER TABLE users ADD usr_room integer;
ALTER TABLE users ADD usr_is_a_girl boolean;

ALTER TABLE users RENAME usr_logintime TO usr_lastlogin;


ALTER TABLE users ALTER usr_lastlogin SET DEFAULT
CURRENT_TIME;

ALTER TABLE users DROP COLUMN usr_room;


Táblák feltöltése adatokkal
„ Egyszerű beszúrás
INSERT INTO users (usr_id, usr_loginname, usr_name,
usr_email, usr_password) VALUES (1, ’JoeB’, ’Börcsök József’,
’borcsokj@sch.bme.hu’, ’a80384230022aa5cbb114acb4aefe7ad’);

„ Automatikus növelés esetén


„ Ekkor a users tábla usr_id mezőjénél MySQL alatt
szerepelni kell az AUTO_INCREMENT kulcsszónak
INSERT INTO users (usr_loginname, usr_name, usr_email,
usr_password) VALUES (’Domi’, ’Domonkos Balázs’,
’domi@sch.bme.hu’, ’a563cce8134faa8456c24565baac899a’);

„ Lekérdezett adatokból
INSERT INTO users (usr_loginname, usr_name, usr_email,
usr_password) (SELECT …);
Adatok lekérdezése 1.
„ Lekérdezés egyetlen táblából:
„ kik szerepelnek a felhasználó táblában és milyen e-
mail címmel?
SELECT usr_name, usr_email FROM users;

„ Lekérdezés egyetlen táblából:


„ a tábla teljes tartalmának lekérdezése
SELECT * FROM users;

„ Lekérdezés más mezőnév megjelenítésével:


„ az első példa, name és email nevekkel
SELECT usr_name AS name, usr_email AS email FROM users;
Adatok lekérdezése 2.
„ Ismert személy keresése:
„ a 2-es azonosítójú (usr_id = 2) felhasználó
keresése
SELECT * FROM users WHERE usr_id = 2;

„ Lekérdezés feltétel alapján:


„ a lányok teljes listája
SELECT * FROM users WHERE usr_is_a_girl ORDER BY usr_name;

„ a Kovács nevűek listája


SELECT * FROM users WHERE usr_name LIKE ’Kovács %’;
Adatok lekérdezése 3.
„ Hány Kovács vezetéknevű felhasználó szerepel?
SELECT COUNT(usr_id) AS cnt
FROM users
WHERE usr_name LIKE ’Kovács%’;

„ Létezik egy nézet (view, users_full, mely tartalmazza


az emberek életkorát. Átlagosan mennyi idősek a
felhasználók?
SELECT AVG(usr_age) AS age
FROM users;
„ Milyen néven hányszor vannak regisztrálva a
rendszerben?
SELECT usr_name AS name, COUNT(usr_name) AS cnt
FROM users
GROUP BY usr_name;
Adatok lekérdezése 4.
„ Milyen nevű felhasználóból van 1-nél több? (Esetleg
dupla regisztráció?)
SELECT usr_name AS name
FROM users
GROUP BY usr_name
HAVING COUNT(usr_name) > 1;

„ Ki hány egységnek tagja?

SELECT usr_id, usr_name, COUNT(grp_id) AS cnt


FROM users JOIN grp_members USING (usr_id)
GROUP BY usr_id, usr_name;
Adatok lekérdezése 5.
„ Létezik egy nézet (view, users_full, mely tartalmazza
az emberek életkorát. Átlagosan mennyi idősek a
felhasználók?
-- 1. megoldás:
SELECT usr_name, grp_id FROM users JOIN grp_members USING
(usr_id);

-- 2. megoldás:
SELECT usr_name, grp_id FROM users JOIN grp_members ON
(users.usr_id = grp_members.usr_id);

„ Teljes lista a tagságokról


SELECT *
FROM grp_members JOIN users USING (usr_id) JOIN groups USING
(grp_id)
ORDER BY usr_name, grp_name;
MySQL specifikumok
„ Felhasználók felvétele:
GRANT ALL PRIVIELGES ON webtanfolyam_joeb.* TO joeb@localhost
IDENTIFIED BY ’jelszó’ WITH GRANT OPTION;

„ Jelszó megváltoztatása:
SET PASSWORD FOR joeb = PASSWORD (’újjelszó’);

„ Adatbázis elérése konzolon:


$ mysql webtanfolyam_joeb –u joeb –p
Enter password:

„ Összehasonlítás más RDBMS-sel következő alkalommal


Elérés PHP-ból
„ mysql_connect(): kapcsolódás az
adatbázishoz
„ mysql_close(): kapcsolat lezárása
„ mysql_query(): SQL parancs futtatása
„ mysql_fetch_array(): eredmények
változóba töltése
„ mysql_free_result(): eredmények
felszabadítása
<?php
// Csatlakozás, adatbázis kiválasztása
$kapcsolat = mysql_connect('mysql_hoszt', 'mysql_azonosito',
'mysql_jelszo')
or die('Nem tudok csatlakozni: ' . mysql_error());
echo 'A kapcsolódás sikerült';
mysql_select_db('az_en_adatbazisom') or die('Nem sikerült
kiválasztanom az adatbázist');
// SQL kérés végrehajtása
$keres = 'SELECT * FROM az_en_tablam';
$eredmeny = mysql_query($keres) or die('Hiba a kérésben: ' .
mysql_error());
// Az eredmény kiírása HTML-ben
echo "<table>\n";
while ($line = mysql_fetch_array($eredmeny, MYSQL_ASSOC)) {
echo "\t<tr>\n";
foreach ($sor as $egy_oszlop) {
echo "\t\t<td>$egy_oszlop</td>\n";
}
echo "\t</tr>\n";
}
echo "</table>\n";
// Eredményhalmaz felszabadítása
mysql_free_result($result);
// Kapcsolat lezárása
mysql_close($kapcsolat);
?>
Köszönöm a figyelmet!

You might also like