kategória | ||||||||||
| ||||||||||
| ||
|
||||||||||
Az utóbbi években nagyon elterjedt az adatbázisok használata az interneten. Számos olyan fontos alkalmazás van, amely ilyen adatbázisokat használ. Például:
Elektronikus vásárlás: olyan alkalmazások, amelyek segítségével bizonyos cégek felkínálják és eladják a termékeiket. Ebben az esetben az adatbázisok tartalmazzák egyfelöl a tudnivalókat a termékekröl, másfelöl pedig a vásárlók rendeléseit és adatait. Az elektronikus vásárlás elönye hatalmas mert egyáltalán nincs üzlethelyiség fenntartásából adodó kiadás és mert nem helyhez kötött, gyakorlatilag az egész világon bárhol kerülhet vevö.
Elektronikus szavazás: olyan alkalmazások, amelyek segítségével megtudható a látogatók véleménye egy adott kérdésben (valamilyen témával kapcsolatban). Ezeknél az alkalmazásoknál igen fontos, hogy egyetlen látogató csak egyszer szavazhasson ezért adatbázisba kerül a látogatók IP címe.
Komunikáció: olyan alklmazások, amelyek segítségével egy bizonyos site látogatói megvitatnak egy adott témát - különbözö forumok. Ebben az esetben az adatbázisba információkat rögzítenek azokról akik hozzászólnak az adott témához (általában egyszer fel kell íratkozni) és magukat a hozzászólásokat is adatbázisban tárolják.
Egy adott site látogatottságának a mérése: ezek az alkalmazások pontos képet nyujtanak arról, hogy hányan léptek be az illetö sitera, vagy bizonyos oldalakat hányan néztek meg. A szavazáshoz hasonlóan szükség van az IP címek tárolására, ami szintén adatbázisba kerül.
Folytathatnánk a sort a keresö alkalmazásokkal, különbözö tvk, ujságok website-val.... Éppen azért mert ennyire elterjedt lássuk hogyan lehet ilyen adatbázisokat létrehozni és használni.
Mi az SQL ? A relációs adatbázisok létrehozásának és felhasználásának gyakorlatba ültetése szükségessé tette egy olyan standard nyelv létezését, amely lehetövé teszi ezen müveletek elvégzését. Így jelent meg az SQL-Structured Query Language. A nyelvet jóváhagyta az ANSI standardizáló bizotság. Ez nem egy adott céghez tartozó nyelv. Számos adatbáziskezelö rendszer használja: Microsoft Access, Oracle, Microsoft SQL Server és természetesen a MySql.
Mi a MySql ? A MySQL egy többfelhasználós, többszálú, SQL-alapú relációs adatbázis-kezelö szerver. A szoftver fejlesztöje a svéd MySQLAB cég, amely kettös licenceléssel teszi elérhetövé a MySQL-t; választható módon vagy a GPL, vagy egy kereskedelmi licenc érvényes a felhasználásra. 2008 januárjában a Sun felvásárolta a céget. Az MySQL az egyik legelterjedtebb adatbázis-kezelö, aminek egyik oka lehet, hogy a teljesen nyílt forráskódú LAMP (Linux-Apache-MySQL-PHP) összeállítás részeként költséghatékony és egyszerüen beállítható megoldást ad dinamikus webhelyek szolgáltatására. A MySQL adatbázisok adminisztrációjára a mellékelt parancssori eszközöket ( mysql és mysqladmin) használhatjuk.
A MySQL honlapjáról grafikus felületü adminisztráló eszközök is letölthetök: MySQL Administrator és MySQL Query Browser. Széles körben elterjedt és népszerü adminisztrációs eszköz a PHP nyelven írt, nyitott forráskódú phpMyAdmin. A phpMyBackupPro (amelyet szintén PHP-ban írtak) adatbázisok (akár idözített, ismétlödö) mentésére szolgál eszközül.
MySqlben egy adatbázist a
CREATE DATABASE adatbazis_neve;
paranccsal hozunk létre. Ha már létezik ilyen nevü adatbázis, akkor hibaüzenetet kapunk és az adatbázis nem jön létre.
USE adatbazis_neve;
paranccsal megnyítunk egy adatbázist. Ha nem létezik ilyen nevü adatbázis, akkor hibaüzenetet kapunk.
DROP DATABASE adatbazis_neve;
paranccsal kitörlünk egy adatbázist. Ha nem létezik ilyen nevü adatbázis, akkor hibaüzenetet kapunk.
SHOW DATABASES
paranccsal megkapjuk a létezö adatbázisok listáját.
Adattípusok
A Mysql nyelvben megtalálhatóak a következö típusok:
a) Szöveg típusok(Karakterlánc).
b) Numerikus típusok.
c) Dátum és idö típusok.
a) Szöveg típusok.
Típus |
Leírás |
CHAR |
1 és 255 karakter közötti, meghatározott hosszúságú szöveg esetén használható. A fennmaradó terület jobbról szóközökkel lesz feltöltve. A hossz meghatározása nem kötelező, de ajánlott mivel az alapértelmezett érték 1. |
VARCHAR |
1 és 255 közötti eltérő karakterhossz érhető el, itt kötelező megadni a használni kívánt karakterek számát. |
TINYTEXT |
Ugyanaz mint fennebb csak nem adunk meg hosszt. |
TEXT |
Legfeljebb 65535 karakter hosszúságú szöveg esetén használható. |
MEDIUMTEXT |
16777215 karakterhosszúsággal rendelkezik, itt sem kell megadnunk a hosszt. |
LONGTEXT |
Legfeljebb 4294967295 karakter hosszúságú szöveg esetén használható. |
ENUM |
Tulajdonképpen egy felsorolás, ahol megadhatjuk a lehetséges értékeket. Maximálisan 65537 félét. Egy ilyen típusú mezö a felsorolt értékek közül egyet tartalmazhat. |
SET |
Tulajdonképpen egy felsorolás, ahol megadhatjuk a lehetséges értékeket. Egy ilyen típusú mezö a felsorolt értékek közül egyet, vagy többet tartalmazhat |
b) Numerikus típusok
Típus |
Leírás |
TINYINT |
Nagyon kis értékeket foglal magába. Előjel használata esetén -128 és 127 közötti értékeket tartalmazhat, ha nem használunk előjeleket, akkor 0 - 255-ig. |
SMALLINT |
Az előzővel megegyező feltételek vonatkoznak rá, csak a megengedett intervallum tér el. Előjel esetén -32768 - 32767-ig, ha nem használunk előjeleket akkor 0-65535-ig. |
MEDIUMINT |
Közepes méretű számértékeket tartalmazhat. Előjel használata esetén -8388608 - 8388607-ig, ha nem használunk előjeleket akkor 0 -16777215-ig. |
INT |
Ez egy normál méretű egész szám lehet, amiben ha használunk előjeleket, akkor -2147483-2147483-ig, ha nem használunk előjeleket 0-4294967295-ig terjedhet. |
BIGINT |
Nagy méretű szám, ami szintén lehet előjeles vagy előjel nélküli. Értéke lehet -2147486648-2147486647-ig, vagy 0-18446744073709551615-ig. |
FLOAT(M,D) |
Lebegőpontos szám, ami nem lehet előjel nélküli. Megadható az ábrázolási hosszúság (M) és a tízedesek száma (D). Ezek megadása nem kötelező, alapértelmezetten 10,2, ahol a 2 a tízedesek számát jelzi. A FLOAT pontossága 24 tízedesig terjedhet. |
DOUBLE (M,D) |
Megegyezik az előző (FLOAT) típus lehetőségeivel csak az alapértelmezett 16,4 és a tizedesek száma 53-ig terjedhet. |
DECIMAL (M,D) |
A NUMERIC és a DECIMAL jelentése megegyezik. Tömörítetlen lebegőpontos szám, ahol minden helyiértékhez egy bájt tartozik. Az ábrázolási hosszúság (M) és a tízedesek számának (D) megadása kötelező. |
c) Dátum és idö típusok.
Típus |
Leírás |
YEAR |
Az évet tárolja két vagy négy számjegyen. Kétjegyű hosszúság esetén a megengedett intervallum 1970-2069-ig. (70-69-ig). Ha a négyjegyű formát használjuk 1901-2155-ig vehet fel értékeket. |
TIME |
Az időt tárolja ÓÓ:PP:MM formátumban. |
DATE |
Dátum tárolására alkalmas a következő formában: ÉÉÉÉ-HH-NN. 1000-01-01 és 9999-12-31 közötti értékeket vehet fel |
DATETIME |
Dátum és idő kombinációját képes tárolni a következő formában: ÉÉÉÉ-HH-NN ÓÓ:PP:MM. 1000-01-01 00:00:00 és 9999-12-31 23:59:59 közötti értékeket vehet fel. |
Müveletek
A legfontosabb müveletek a proirításuk szerinti növekvö sorrendben:
1. ||, OR, XOR
2. &&, AND
3. BETWEEN, CASE WHEN THEN ELSE
4. ==, >=, <=, <, >, !=, <>, IS, LIKE, IN
5.
6. &
7. <<, >>
8. -, +(bináris müv.)
9. *, /, DIV, %, MOD
10.
11. -, +(unáris müv.)
12. !, NOT
a) Arítmetikai müveletek
MŰVELET |
LEÍRÁS |
PÉLDA |
|
összeadás |
2+3 =>5 |
|
kivonás |
2-3 =>-1 |
|
szorzás |
3.5*2=>7 |
|
osztás |
5/2 =>2.5 |
DIV |
osztás egész része |
5 DIV 2 =>2 -5 DIV 2 =>-2 |
MOD vagy % |
osztás maradéka |
5 MOD 2 =>1 -5 MOD 2=>-1 5 %2=>1 |
-,+(unáris müv.) |
|
--1=>1 |
b) Összehasonlítási müveletek
Összehasonlíthatunk két számot illetve két karakterláncot. Karakterláncok hasonlítása esetén a MySQL nem tesz különbséget a nagy- és kisbetük között. Az összehasonlítás eredménye 1 ha igaz és 0 ha hamis
MŰVELET |
LEÍRÁS |
PÉLDA |
< |
kisebb |
2<1 => 0; 'ab'<'b' =>1 |
<= |
kisebb vagy egyenlö |
2<=2 =>1; 'bb'<='b' =>0 |
> |
nagyobb |
3>2 =>1; 'B'>'ab' =>1 |
>= |
nagyobb vagy egyenlö |
7>=7 =>1; 'B'>='b' =>1 |
|
egyenlö |
7=7 =>1; 'egy'='EGY' =>1 |
<> vagy != |
nemegyenlö |
1<>2 =>1;1!=1 =>0 |
Megj: két DATE vagy TIME típusú adatot is össze tudunk hasonlítani, ebben a sorrendben is mint a karakterláncok esetében lexikográfikus soorrend számít.
c) Logikai müveletek:
MŰVELET |
LEÍRÁS |
PÉLDA |
|| vagy OR |
Logikai vagy, ha mindkét operándus értéke 0 akkor az eredmény 0 különben 1. |
2||1 => 1 1||0 =>0 0||0 =>0 |
&& vagy AND |
Logikai és, ha mindkét operándus értéke 0 akkor az eredmény 0 különben 1. |
2&&1 =>1 2&&0 =>0 0&&0 =>0 |
NOT |
tagadás |
NOT 3 =>0 NOT 1 =>0 NOT 0 =>1 |
XOR |
kizáró vagy, ha a két operándus értéke megegyezik akkor az eredmény 0 különben 1. |
7XOR 0 =>1 0XOR0 =>0 2XOR 3 =>0 |
d) Logikai müveletek bitekre. Bit eltolási müveletek:
Az egész típusú adatokra alkalmazzuk, és a bitenkénti ábrázolással operálnak.
MŰVELET |
LEÍRÁS |
PÉLDA |
|
vagy bitekre, ha mindkét bit 0 az eredmény 0 különben 1. |
2|1 =>3 |
& |
és bitekre, ha mindkét bit 0-tól különbözö az eredmény 1 különben 0. |
2&1 =>0 |
|
kizáró vagy bitekre, ha a bitek különbözöek az eredmény 1 különben 0. |
10^3 =>9 (1010^ 0011 =>1001) |
|
tagadás bitekre, 0-s bitböl 1 lesz 1-es bitböl 0. |
|
<< |
eltolás balra a baloldali operándus bitjeit k pozicióval tolja balra ha k a jobboldali operándus. |
1<<2 =>4 |
>> |
eltolás jobbra a baloldali operándus bitjeit k pozicióval tolja jobbra ha k a jobboldali operándus. |
4>>2 =>1 |
e) Más müveletek:
IS NULL, IS NOT NULL: ellenörzi, hogy egy érték NULL(lásd 3.5.2 fejezet) vagy sem.
Pl.:1 IS NULL =>0; NULL IS NULL =>1; 1 IS NOT NULL =>1; NULL IS NOT NULL =>0
IN, NOT IN: ellenörzi, hogy egy érték hozzátartozik vagy sem egy halmazhoz. Az érték lehet numerikus vagy karakterlánc típusú.
Pl.: 1 IN(1,2,3,4) =>1; 5 IN(1,2,3,4) =>0; 'abc1' IN('abc1','abc2','abc3','abc4') =>1; '1abc' IN('abc1','abc2','abc3','abc4') =>0
LIKE, NOT LIKE: ellenörzi, hogy egy bizonyos karakterláncra teljesülnek bizonyos feltételek vagy sem. Ha egy bizonyos részkaraktersor(%) vagy egy bizonyos karakter(_) megtalálható a karakterlánc elején végén vagy középen.
Pl. marika' LIKE 'mar%' =>1 ; 'marika' LIKE 'mam%' =>0; 'marika' NOT LIKE 'mar%' =>0
BETWEEN min AND max: ellenörzi, hogy egy adott érték egy adott minimális érték és agy adott maximális érték között van vagy sem. Használható számokra de karakterláncokra és Date vagy Time tipusú adatokra is.
Pl.: 1 BETWEEN 0 AND 4 =>1; 'mama' BETWEEN 'min' AND 'lin' =>1; 2 BETWEEN 2 AND 2 =>1; ! BETWEEN 2 AND 4 =>0; '1999-10-31' BETWEEN '1989-12-10' AND '2000-01-01' =>1
CASE WHEN THEN ELSE : két formája van:
CASE v
WHEN v1 THEN e1
[WHEN v2 THEN e2]
[WHEN vn THEN en]
[ELSE en+1]
END
Kiszámolja a v értékét és ha megegyezik ei-vel, akkor a visszatérített érték ei lesz. Ha a v egyetlen vi-vel sem egyezik meg akkor a visszatérített érték en+1 lesz.
CASE
WHEN felt1 THEN e1
[WHEN felt2 THEN e2]
[WHEN feltn THEN en]
ELSE en+1
END
Ebben az esetben ha a felti teljesül akkor ei -t téríti vissza. Ha egyik feltétel sem teljesül akkor az en+1 -t téríti vissza.
Pl.: Case 2
When 1 then 'egy'
When 2 then 'ketto'
When 3 then 'harom'
Else 'mas ertek'
End;
Vagy
Case
When 1<2 then 'igaz'
Else 'hamis'
End;
Függvények
Mivel a Mysql nyelv függvényei hasonlítanak a többi programozási nyelvekben használt függvényekhez rövid leírást adok rólluk:
MATEMATIKAI FÜGGVÉNYEK |
||
FÜGGVÉNY |
LEÍRÁS |
PÉLDA |
ABS(x) |
Modulusz x. |
abs(-2) =>2; abs(5) =>5 |
CEIL(x) |
A legkisebb egész ami nagyobb vagy egyenlö x-nél. |
ceil(1.7) =>2 ceil(-1.7) =>-1 |
FLOOR(x) |
A legnagyobb egész ami kisebb vagy egyenlö x-nél. |
floor(1.7) =>1 floor(-1.7) =>-2 |
EXP(x) |
ex |
exp(1) =>2.7182. |
LOG(b,x) |
logbx |
log(2,4) =>2 |
PI() |
p |
pi() =>3.141593 |
POW(x,y) |
xy |
pow(2,3) =>8 |
ROUND(x) |
x-hez legközelebbi egész |
round(2.3) =>2; round(-2.8) => -3 |
SIN(x) |
sin(x) |
sin(pi()/2) =>1 |
COS(x) |
cos(x) |
cos(0) =>1 |
SIGN(x) |
x elöjele: -1 ha x<0, 0 ha x=0, 1 ha x>0. |
sign(2) =>1 sign(-2) =>-1 sign(0) =>0 |
SQRT(x) |
x |
sqrt(4) =>2 |
KARAKTER LÁNCOKKAL KAPCSOLATOS FÜGGVÉNYEK |
||
LENGTH(x) |
Az x sor hossza. |
length('abc') =>3 |
CONCAT(x1, x2,.) |
Összeragasztja az x1, x2,. sorokat. |
concat('abc','cd') =>'abccd' |
INSTR(x,y) |
Megkeresi, hogy az y részsor benne van-e x ben, ha igen visszatéríti a poziciót ahol kezdödik (az elsö pozició 1), ha nem 0-t. |
instr('abc','b') =>2 instr('abc',bd') =>0 |
SUBSTRING(x,p,l) |
Azt a részsort téríti vissza x-böl, amely a p.-ik pozición kezdödik és a hossza l. |
substring('abc',2,2) =>'bc' |
RTRIM(x) |
Az x-böl levágja a jobboldali szóközöket. |
rtrim('egy') =>'egy' |
LTRIM(x) |
Az x-böl levágja a baloldali szóközöket. |
ltrim(' egy') =>'egy' |
TRIM(x) |
Az x-böl levágja a jobb- és baloldali szóközöket. |
trim(' egy') =>'egy' |
UPPER(x) |
Az x sor minden betüje nagybetü lesz. |
upper('Egy') =>'EGY' |
LOWER(x) |
Az x sor minden betüje kisbetü lesz. |
lower('Egy') =>'egy' |
FIND_IN_SET(x,'s1, s2,. sn') |
Megkeresi, hogy az x sor benne van-e az s1, s2,. sn sorozatban, ha igen visszatéríti, hogy hányadik pozición (az elsö pozició 1), ha nem 0-t. |
find_in_set('b','a,b,c') =>2 |
FORMAT(x,d) |
Átalakítja az x valós számot egy karakterlánccá, úgy, hogy pontosan d tízedest vesz és a legutolsó pozición kerekít. |
format(1.789,2) =>'1.79' |
STRCMP(x,y) |
Összehasonlítja az x és y sorokat: ha x<y, akkor -1-et , ha x=y akkor 0-t, ha x>y akkor 1-et térít vissza. |
strcmp('ma','mama') =>-1 |
D TUM ÉS ÓRÁVAL KAPCSOLATOS FÜGGVÉNYEK |
||
NOW() |
A rendszer dátumot és órát téríti vissza, a yyyy-mm-dd hh:mm:ss formában. |
now() => |
YEAR(x) |
Az x dátumból visszatéríti az évet. |
year(now()) =>2009 |
DAY(x) |
Az x dátumból visszatéríti a napot. |
day(now()) =>29 |
MONTH(x) |
Az x dátumból visszatéríti a hónapot. |
month(now()) =>7 |
TIME(x) |
Az x dátum-ból visszatéríti a pontos idöt. |
time(now()) =>15:17:15 |
HOUR(x) |
Az x dátum-ból visszatéríti az órát mint 0 és 23 közötti érték. |
hour(now()) =>15 |
MINUTE(x) |
Az x dátum-ból visszatéríti a percet |
minute(now()) => 17 |
DATEDIFF(x,y) |
Az x és y dátumok között eltelt napok számát téríti vissza. |
datediff(now(),'2009:07:20') =>9 |
DATE_ADD(d, INTERVAL nr x ) |
Azt a dátumot számolja ki, ami a d dátumtól nr intervallumra lesz. Az x azt határozza meg, hogy a nr napot, hónapot vagy évet jelent. Az értéke lehet: DAY, MONTH vagyYEAR . |
date_add(now(), interval 5 DAY) =>2009-08-03 |
DATE_SUB(d, INTERVAL nr x ) |
Azt a dátumot számolja ki, ami a d dátum elött nr intervallumra volt. Az x azt határozza meg, hogy a nr napot, hónapot vagy évet jelent. Az értéke lehet: DAY, MONTH vagyYEAR . |
date_sub( now(), interval 2 month) =>2009-02-29 |
MÁS FÜGGVÉNYEK
IF: IF(kif1, kif2 ,kif3): a kif1 egész tipusú, ha különbözik 0-tól, akkor az eredmény a kif2 ha egyenlö 0-val akkor az eredmény kif3..
Pl. IF(1>2, 'igaz','hamis') =>'igaz'
IFNULL:IFNULL(kif1, kif2): ha a kif1 nem NULL akkor az eredmény a kif1 különben az eredmény a kif2.
A legfontosabb elemek mehatározásai: táblák, mezők, rekordok, kulcsok és indexek
Táblák Az adatbázisok legnagyobb alkotórészei. A táblákat közvetlenül az adatbázisok után hozzuk létre. Amikor egy adatbázisban új táblát hozunk létre három különböző állomány jön létre. Ezek tárolják a tábla meghatározását, a benne tárolt adatokat és az indexeket. A létrehozott táblát törölhetjük, vagy lekérdező parancsokkal módosíthatjuk. A tábla szerkezeti felépítésére oda kell figyelnünk mert ha egy 200 karakter befogadására képes mezőt 100 karakteresre módosítunk akkor a fennmaradó karakterek levágásra kerülnek.
Mezők Egy MySQL tábla maximálisan 3398 mezőt tartalmazhat, azonban érdemes megfontolnunk hogy elrontottunk-e valamit ha ezt a lehetőséget maximálisan kihasználtuk, ugyanis ekkora mennyiségre csak nagyon ritkán van szükség. Három lényeges dolgot kell új mező létrehozásánál megadnunk: a mező nevét a mezö típusát és a mező hosszát. A mezők pontos megadása kiemelkedően fontos. Gondoljunk csak bele, hogy egy megrendelőlapon nem adunk elegendő hosszúságot a címnek, így nem töltheti ki a megrendelő megfelelően. Ebben az esetben eleshetünk a bevételtől.
Rekordok A rekord egy bejegyzés a táblában. A rekord lehet teljesen kitöltött (complete), vagy kitöltetlen (incomplete). Az hogy egy rekord incomplete az nem jelenti feltétlenül azt hogy a rekord üres. Egy mezőhöz rendelhetünk alapértelmezett beállítást is, például az ország esetében beállíthatjuk hogy ha nem ad meg a felhasználó értéket akkor az legyen "RO". Fontos hogy lehetőség szerint teljesen kitöltött rekodokkal rendelkezzünk.
Kulcsok A kulcsok MySQL tábláink és rekordjaink hatékony elemei lehetnek. Segítségükkel összekapcsolhatjuk tábláinkat. Két típusát különböztetjük meg. Vannak egyedi (unique) és elsődleges (primary) kulcsok. Amikor egy mezőt egyedinek adunk meg, akkor egyféle adatot csak egyszer vihetünk fel egyetlen rekordba (sorba). Ha például a tejet "a01" azonosítóval rögzítjük, akkor nem adhatjuk meg ugyanezt az azonosítót a cukornak is. Az elsődleges kulcs összekötő elemként működik egy vagy több tábla között. Egy tábla csak egy elsődleges kulccsal és több egyedi kulccsal rendelkezhet.
Indexek Az adatbázisok indexei segítenek abban hogy gyorsabban megtaláljuk amit keresünk. Amikor az adatbázis által indexelt rekordokat válogatunk ki, sokkal gyorsabban lefut a lekérdezés, és így az eredményt is hamarabb megkapjuk, mintha ezt egy nem indexelt táblában tennénk. Hátránya viszont hogy ha egy indexelt táblába szúrunk be rekordot az kicsit lassúbb, tehát a legtöbb esetben inkább az olvasott mint írt táblákhoz érdemes ezt a lehetőséget használni.
3.5.1 Alapmüveletek táblákkal: tábla létrehozása, adatsor beszúrása , kiírás, számított oszlopok
A tábák létrehozása a következö paranccsal történik
CREATE TABLE táblaneve (mezö1_neve tipus [tulajdonságok], mezö2_neve tipus [tulajdonságok],... mezön_neve tipus [tulajdonságok]);
A tulajdonságok a kulcsokra, az alapértelmezett értékekre, a NULL érték lehetségességére stb. vonatkoznak (lásd a következö fejezetekben).
Feladat: készítsünk egy három oszloppal rendelkezö táblát egy anyagraktár részére , ahol az elsö oszlop az anyag azonosítója legyen (legtöbb 5 karakterböl állhat), a második az anyag neve (legtöbb 5 karakterböl állhat ), a harmadik pedig a mennyiség mindenik anyagból (darabban kifejezve, legtöbb 3 számjegyü természetes szám).
Megoldás
CREATE TABLE anyagok (kod char(5), nev char(20), mennyiség int(3))
Új rekord(bejegyzés) hozzáadása a táblához a következö paranccsal történik:
INSERT INTO táblaneve VALUES (adat1, adat2,... adatn,);
Mivel a fenti parancs hib hoz vezethet, abban az esetben ha elrontjuk az adatok sorrendjét és így hibás adtok kerülhetnek a táblába, gyakrabban használjuk a következö formát még akkor is, ha egy kicsit többet kell írni.
INSERT INTO táblaneve (mezö1_neve , mezö2_neve ,... mezön_neve) VALUES (adat1, adat2,... adatn,);
Feladat: a fenti anyagok táblába szúrjunk be két rekordot.
Megoldás
INSERT INTO anyagok VALUES('001','papir',78
INSERT INTO anyagok (kod, nev, mennyiseg) VALUES('007','rajzszeg',54
A tábla tartalmának a kiírása a következö paranccsal történik:
SELECT * FROM táblaneve;
Feladat: a fenti anyagok tábla esetén:
Megoldás:
SELECT * FROM anyagok;
Az erdmény pedig:
Lehetöség van arra is, hogy ne írjuk ki a tábla valamennyi oszlopát, ebben az esetben a fenti parancs következö formáját használjuk:
SELECT mezö1_neve , mezö2_neve ,... mezön_neve FROM táblaneve;
Abban az esetben ha azt szeretnénk, hogy a kiírt táblázat fejlécében valamelyik oszlop esetén más jelenjen meg, ne a mezö neve a fenti parancs következö formáját használjuk:
SELECT mezö1_neve AS oszlop1, mezö2_neve AS oszlop2,... mezön_neve AS oszlopn, FROM táblaneve;
Egy adatbázisban levö összes táblát megnézhatjük
SHOW TABLES [FROM adatbazisneve];
Egy adatb zis mezöinek nevét, tipusát és tulajdonságait megnézhetjük
SHOW COLUMNS FROM táblaneve;
Feladat: a fenti anyagok táblába esetén:
Megoldás:
SHOW COLUMNS FROM anyagok;
Az eredmény:
Az táblák megtervezésénél és létrehozásánál mindig oda kell figyelni arra, hogy egy táblában olyan adatokat örizzünk meg amelyeket nem lehet kiszámítani. Ellenkezö esetben a táblák mérete nagy lesz. Lássuk hogyan tudunk kiszámítani bizonyos adatokat a táblák adatait felhasználva.
SELECT mezö1_neve , mezö2_neve ,... mezön_neve, kifejezes1 AS oszlop1, kifejezes2 AS oszlop2, ... kifejezesk AS oszlopk FROM táblaneve;
Feladat: Vegyük a következö termekek táblát amely egy raktárban levö termékeket tart nyilván. Minden termék esetén megörizzük a nevet (nev),a mennyisget az illetö termékböl(mennyiseg) és az egységárát(egyseg_ar). Szertnénk kilistázni azt, hogy milyen értéket képviselnek az egyes termékek. Tudjuk azt, hogy az értéket a mennyiség és az egysegár szorzata adja. Ebben az esetben a tábla adatainak kiírásánál beteszünk egy ujabb oszlopot amelybe az mennyiseg*egyseg_ar fog kerülni az oszlop neve pedig ertek lesz.
Megoldás:
SELECT nev, mennyiseg, egyseg_ar, mennyiseg*egyseg_ar AS ertek FROM termekek
Ha a termekek tábla így néz ki :
A kiírás után a következö eredményt kapjuk:
Mysql-ben létezik egy különleges érték a NULL, aminek az értelme: érték nélküli. Amikor létrehozunk egy táblát a tábla mezöi automatikusan megkapják a NULL tulajdonságot, de megadhatjuk a NOT NULL tulajdonságot is.
Ha egy oszlopnál a NULL érték van beállítva és amikor megadunk egy bejegyzést és az illetö oszlophoz nem rendelünk értéket, akkor oda a NULL érték fog bekerülni bármilyen típusú is legyen az illetö oszlop.
Ha egy oszlopnál a NOT NULL érték van beállítva és amikor megadunk egy bejegyzést és az illetö oszlophoz nem rendelünk értéket, akkor oda a :
0 kerül, ha az oszlop numerikus típusú
üres karakterlánc, ha karakterlánc tipusú
a sorozat elsö azaz 0-ik sorszámú tagja, ha ENUM típusú
üres halmaz ha SET típusú
Feladat: létrehozzuk a teszt1 nevü táblát:
CREATE TABLE teszt1 (o1 int , o2 int not null)
Ha megn zzük ezután a teszt1 tábla szerkezetét, az így néz ki:
Beszúrunk három bejegyzést:
INSERT INTO teszt1 VALUES (10,15)
INSERT INTO teszt1 (o2) VALUES (13)
INSERT INTO teszt1 (o1)VALUES (17)
És az eredményt SELECT * FROM teszt1; paranccsal megnézhetjük:
3.5.3 Az Alapértelmezett ( DEFAULT) érték
A valóságban nem mindig ismerjük az adtokat. Ebben az esetben ha bizonyos oszlopok értékeit nem ísmerjük ezeket állíthatjuk NULL-ra, de állíthatjuk egy kedvezöen megválasztott kezdöértékre.
Ha van egy táblánk a tanulók vizsgajegyeivel és egy tanuló nem vesz részt a vizsgán az ö jegye 1-es legyen. (se nem NULL se nem 0). Ezt a DEFAULT kezdo_ertek formában adjuk meg amikor a táblát létrehozzuk.
Megj. Kezdöértéket csak a meghatározott hosszusággal rendelkezö mezökhez rendelhetünk pl ha a mezö típusa CHAR(20) akkor kaphat kezdöértéket de ha TEXT a típusa akkor nem.
Feladat: Legyen egy teszt2 táblánk, amely bizonyos személyek nevét (nev) és szülövárosát (szul_varos) tartalmazza, azt kívánjuk, hogy azoknál a személyeknél ahol nem adjuk meg a szülövárost az ismeretlen' szó jelenjen meg.
Megoldás:
CREATE TABLE teszt2 (nev CHAR(25), szul_varos CHAR(30) DEFAULT 'ismeretlen'
Ha megn zzük ezután a teszt2 tábla szerkezetét, az így néz ki:
Utánna beteszünk a táblába két bejegyzést, ugy hogy az egyiknek nem adjuk meg a szuletési városát.
INSERT INTO teszt2 (nev) VALUES ('Balint Bela'
INSERT INTO teszt2 VALUES ('Daniel Richard', 'Marosvasarhely'
Az eredmény:
3.5.4 Az elsödleges (PRIMARY) kulcs és az egyedi (UNIQUE) kulcs
Az elsödleges kulcs -PRIMARY KEY, egy vagy több mezöböl állhat és a következö feltételeket kell teljesítse:
o Az adatok abban az oszlopban amely az elsödleges kulcs föltétlenül különbözöek kell legyenek. Abban az esetben ha az elsödleges kulcs több mezöböl áll, az értékek a kulcsot alkotó mezök közül legalább egyik mezöben eltéröek kell legyenek Ha a táblába olyan bejegyzést akarunk beírni aminek az elsödleges kulcsa megegyezik valamelyik másik bejegyzés elsödleges kulcsával hibát kapunk.
o Azok a mezök amelyek elsödleges kulcsot alkotnak föltétlenül meghatározott hosszuságuak kell legyenek. (Nem lehet TEXT tipusú.)
Az elsödleges kulcs szerepe abban áll, hogy nagyon meggyorsítja a keresést adott kulcs szerint. Tudnunk kell, hogy Mysql-ben a bejegyzések a bevitel sorrendjében tárolódnak el a táblában. Ha egy táblánál beállítunk egy egyedi kulcsot, akkor a tábla mellett létrejön egy segédtábla, (a felhasználó számára láthatatlan) amely a kulcs értékét tartalmazza és azt a poziciót, amelyet az illetö bejegyzés elfoglalna, ha a kulcsok értéke szerint növekvö sorrendbe rendeznénk az adtokat. Ily modon a keresés egy rendezetlen tábla helyett rendezett táblában történik, és egy sokkal gyorsabb algoritmust: pl. bináris keresést használja.
Ahhoz, hogy egy mezö elsödleges kulcs legyen, a tábla létrehozásakor az illetö mezö neve és típusa után beírjuk a PRIMARY KEY tulajdonságot. Ha több mezöböl álló elsödleges kulcsot akarunk létrehozni akkor a tábla létrehozásakkor a mezök leírása után felsoroljuk az elsödleges kulcsban résztvevö mezöket, ugy hogy : PRIMARY KEY(mezö1_neve, mezö2_neve, ...). Vegyük a következö feladatot a 3.5.1 fejezetböl
Feladat: készítsünk egy három oszloppal rendelkezö táblát egy anyagraktár részére , ahol az elsö oszlop az anyag azonosítója legyen (legtöbb 5 karakterböl állhat), a második az anyag neve (legtöbb 5 karakterböl állhat ), a harmadik pedig a mennyiség mindenik anyagból (darabban kifejezve, legtöbb 3 számjegyü természetes szám). Állítsuk be a kod-ot elsödleges kulcsnak.
Megoldás:
CREATE TABLE anyagok (kod char(5) PRIMARY KEY, nev char(20), mennyiség int(3))
Az erdmény:
Két mezöböl álló elsödleges kulcsra példa a lenti tábla:
CREATE TABLE teszt3 (c1 INT, c2 CHAR(10), c3 TEXT, PRIMARY KEY(c1,c2))
Amire a következö táblát kapjuk:
Az egyedi kulcsot akkor használjuk ha azt kivánjuk elérni, hogy egy vagy több oszlopban csak különbözö értékek legyenek. Ugyanugy a tábla létrehozásánál amelyik mezök után odaírjuk az UNIQUE KEY tulajdonságot, azokból a mezökböl egyedi kulcs lesz. Ha egy bejegyzésnél egy ilyen mezönek olyan értéket probálunk adni ami már volt az illetö oszlopban, hibát kapunk. Azok a mezök amelyek egyedi kulcsot alkotnak föltétlenül meghatározott hosszuságuak kell legyenek.(Nem lehet TEXT tipusú).
Feladat: Hozzuk létre a teszt4 táblát két egyedi kulccsal
CREATE TABLE teszt4 (c1 INT UNIQUE KEY,c2 CHAR(10) UNIQUE KEY)
Amire a következö táblát kapjuk:
3.5.5 Az AUTOINCREMENT tulajdonság
Gyakran készítünk olyan táblát amiben a bejegyzéseket sorszámozzuk A Mysql lehetöséget nyújt olyan mezö létrehozására, amely autómatikusan sorszámozza a bejegyzéseket. Ahhoz, hogy ilyen mezöt tegyünk egy táblába szükséges a tábla létrehozásakkor ezt a mezöt INT típusúra állítani, azért hogy az értékek ne ismétlödhessenek szükséges elsödleges vagy egyedi kulcsot csinálni belöle ( lásd a 3.5.3 fejezetet), a mezö létrehozásakkor használjuk az AUTO_INCREMENT tulajdonságot amit a mezö neve tipusa és egyéb tulajdonságai után írunk.
Feladat: Hozzuk létre a teszt5 táblát aminek legyen egy sorszám mezöje.
CREATE TABLE teszt5 (sorszam INT UNIQUE KEY AUTO_INCREMENT, nev CHAR(20))
És utánna beszurunk két bejegyzést:
INSERT INTO teszt5 (nev) VALUES ('Piroska') ;
INSERT INTO teszt5 (nev) VALUES ('Marci') ;
És az eredmény:
Az is lehetséges, hogy egy ilyen sorszámozó mezönek mi adjunk értéket, ebben az estben a további sorszámozást az adott értéktöl fogja folytatni a mysql.
Szúrjuk be az alábbi két sort és vizsgáljuk meg a táblánkat.
INSERT INTO teszt5 VALUES (7,'Annacska') ;
INSERT INTO teszt5 (nev) VALUES ('Jancsika')
És az eredmény:
3.5.6 Tábla adatainak rendezése
Sokszor szükség van arra, hogy egy tábla adatait egyik vagy másik oszlopa szerint (esetenként több oszlop szerint is) növekvö vagy csökkenö sorrendbe rendezzük. A parancs amivel ezt elérhetjük:
SELECT * FROM táblaneve ORDER BY mezö1_neve [DESC], mezö2_neve [DESC],... mezön_neve [DESC];
Feladatok:
Vegyük a következö táblát:
SELECT * FROM rendezes ORDER BY nev;
Az eredmény:
Megj.: autómatikusan növekvö sorrendbe rendez, ha csökkenö sorrendet akarunk akkor használnunk kell a DESC tulajdonságot.
SELECT * FROM rendezes ORDER BY szul_datum DESC
Az eredmény:
Tehát ha a fenti táblára a :
SELECT * FROM rendezes ORDER BY nev, szul_datum DESC;
Az eredmény:
(Észrevehetjük, hogy ahol a név megeggyezett a Miklós esetében a két sor felcserélödött a szül_datum szerinti csökkenö sorrend szerint).
Bizonyos esetekben nem érdekel a tábla valamennyi adata, csak azokra a sorokra vagyunk kiváncsiak, amelyekre teljesülnek bizonyos feltételek. Ezt a müveletet nevezzük szürésnek. Ezt úgy tudjuk elérni, hogy a SELECT parancs végére beírjunk egy WHERE feltétel, megjegyzést. Ebben az esetben csak azokat a bejegyzéseket írjuk ki amelyekre a feltétel teljesül. Abban az esetben ha a szürt adatokat rendezve szeretnénk kiírni a parancs végére a WHERE után fogjuk odaírni az ORDER BY megjegyzést.
Feladatok
Vegyük a következö táblát:
SELECT nev FROM tanulok WHERE matek >=8;
Az eredmény:
SELECT nev FROM tanulok WHERE matek >=8 ORDER BY nev;
Akkor az eredmény:
SELECT nev, (matek+angol+info)/3 AS altalanos FROM tanulok WHERE matek >4 AND angol>4 AND info>4 ;
Az eredmény:
3.5.8 Tábla adatainak módosítása
A. A tábla bejegyzéseinek a módosítása
Bejegyzés beszúrását láttuk már a 3.5.1. fejezetben
INSERT INTO táblaneve (mezö1_neve , mezö2_neve ,... mezön_neve) VALUES (adat1, adat2,... adatn,);
Ha egy tábla bejegyzéseit egy másik táblából akarjuk átvenni, azt az alábbi paranccsal tudjuk megtenni:
INSERT INTO [DISTINCT] tábla1 (mezö1_neve , mezö2_neve ,... mezön_neve) SELECT mezö1 , mezö2 ,... mezön FROM tábla2 ;
Megj:
Ha a DISTINCT megjegyzés jelen van, csak azokat a sorokat veszi át, amelyek nem ismétlödnek.
Ha nem szeretnénk a tábla2 összes sorát átvenni csak bizonyos sorokat használhatjuk a WHERE megjegyzést.
Feladat: legyen a két alábbi tábla a teszt2 és a teszt6, másoljuk be a teszt6 táblából a teszt2 táblába azokat a bejegyzéseket, amelyeknek szülövárosa 'Marosvasarhely'
A teszt2:
A teszt6:
Megoldás:
INSERT INTO teszt2 (nev,szul_varos) SELECT nev, szul_varos FROM teszt6 WHERE szul_varos='Marosvasarhely'
Az eredmény:
Ha egy táblában egy vagy több oszlop adatait akarjuk módosítani azt az alábbi paranccsal tudjuk megtenni:
UPDATE táblaneve SET oszlop1=kifejezes1, oszlop2=kifejezes2,... oszlop3=kifejezes3 [WHERE kifejezes]
Feladat: Vegyük az elöbbi teszt2 táblát. Módosítsuk a tábla adatait úgy, hogy minden 'B' betüvel kezdödö nevü személy szul_varosa 'Kolozsvar' legyen.
Megoldás:
UPDATE teszt2 SET szul_varos='Kolozsvar' WHERE substring(nev,1,1)='B'
Az eredmény:
Ha egy táblából egy vagy több sort szeretnénk törülni azt az alábbi paranccsal tudjuk megtenni:
DELETE FROM táblaneve [WHERE kifejezes
Figyelem ! Ha a WHERE megjegyzés hiányzik az összes bejegyzést kitörli a táblából.
Feladat: Vegyük az elöbbi teszt2 táblát. Törüljük a táblából mindazokat akiknek szülövárossa 'Marosvasarhely'.
Megoldás:
DELETE FROM teszt2 WHERE szul_varos= 'Marosvasarhely'
Az eredmény:
B. A tábla nevének és felépítésének a módosítása.
Ha egy táblát át akarunk nevezni :
RENAME TABLE réginév TO újnév
Ha ki akarjuk törülni egy tábla egyik oszlopát, akkor is ha vannak benne adatok:
ALTER TABLE táblaneve DROP COLUMN oszlopneve
Ha egy ujabb oszlopot akarunk hozzáadni a táblához:
ALTER TABLE táblaneve ADD oszlopneve tipus
Az ujoszlop tipusa az lesz amit megadunk a parancs végén az oszlop neve után.
3.5.9 Statisztikai függvények
Az összes számítás amit eddig végeztünk a tábla egyetlen sorának mezöire vonatkoztak. Szükségünk van olyan függvényekre, amelyek segítségével egy oszlop adataiból számíthatunk ki bizonyos információkat. Ezek a függvények a statisztikai függvények.
FÜGGVÉNY |
LEÍRÁS |
COUNT() |
Ha COUNT(*)-ként használjuk, a tábla bejegyzéseinek számát téríti. Ha COUNT(oszlopneve)-ként használjuk, akkor az illetö oszlop NULL-tól különbözö értékeinek számát adja vissza. |
MIN() |
MIN(oszlopneve), az oszlop legkisebb értékét téríti vissza. A NULL értéket nem veszi figyelembe. |
MAX() |
MAX(oszlopneve), az oszlop legnagyobb értékét téríti vissza. A NULL értéket nem veszi figyelembe. |
SUM() |
SUM(oszlopneve), az oszlop értékeinek az összegét számolja ki. A NULL értéket nem veszi figyelembe. |
AVG() |
AVG(oszlopneve), az oszlop értékeinek a számtani középarányosát számolja ki. A NULL értéket nem veszi figyelembe. |
Feladat: Vegyük a következö tanulok táblát:
SELECT COUNT(*) AS tanulok_szama FROM tanulok
SELECT AVG(info) AS info_altalanos FROM tanulok
SELECT COUNT(angol) AS tizes_angol FROM tanulok WHERE angol=10
SELECT COUNT(nev) AS nyolcas_folottiek FROM tanulok WHERE (matek+angol+info)/3>8;
Minden olyan eredmény amit egy táblából a SELECT parancsot használva kapunk meg lekérdezés. Ilyen értelemben a szürés is tulajdonképpen a lekérdezések sajátos esete. Általánosan egy lekérdezés eredménye lehet
A. Egyetlen sor egy vagy több oszloppal.
B. Több sor egy vagy több oszloppal(egy tábla).
Lehetöség van arra, hogy egy adott lekérdezés eredményét felhasználva egy újabb lekérdezést fogalmazzunk meg. Ebben az esetben az elsö lekérdezés alárendelt lekérdezés. Az ö eredményét felhasználjuk.
Az alárendelt lekérdezés egyetlen sort térít vissza:
Feladatok: Vegyük a következö tanulok táblát:
SELECT nev, matek FROM tanulok WHERE matek=(SELECT MAX(matek) FROM tanulok)
Az eredmény:
Ilyen esetben elöször mindig az alárendelt lekérdezés hajtódik végre.
SELECT nev,(matek+info)/2 as altalanos FROM tanulok WHERE (matek+info)/2=(SELECT MAX((matek+info)/2) FROM tanulok)
SELECT nev,(matek+angol+info)/3 as altalanos FROM tanulok WHERE (matek+angol+info)/3>(SELECT AVG((matek+angol+info)/3) FROM tanulok) ORDER BY altalanos DESC
Az eredmény:
SELECT nev FROM tanulok WHERE matek=(SELECT matek FROM tanulok WHERE nev='Peter Maria')
Az eredmény:
Az alárendelt lekérdezés egy táblát térít vissza(több sort):
Ebben az esetben az alárendelt lekérdezés által visszatérített táblának nevet kell adni. Ez lehetséges ha használjuk az AS megjegyzést. A fö lekérdezés használja ennek a táblának az oszlopait, ez ugy lehetséges, hogy tábla_neve.oszlop_neve.
Feladat Vegyük a következö tanulók táblát:
SELECT AVG(seged.matek) AS matek_atlag ,AVG(seged.info) AS info_atlag FROM (SELECT matek,info FROM tanulok WHERE matek>=8 OR info>=8) AS seged;
Az eredmény:
3.5.11 Tábla adatainak csoportosítása
Egy tábla adatait csoportosíthatjuk egy adott oszlop értékei szerint. Ha vesszük a következö táblát:
Dátum |
Termék |
Ár |
2006-03-15 |
Cukor |
12 |
2006-03-15 |
Olaj |
18 |
2006-03-15 |
Cukor |
28 |
2006-03-16 |
Liszt |
100 |
2006-03-16 |
Cukor |
15 |
2006-03-16 |
Vaj |
300 |
2006-03-17 |
Olaj |
14 |
2006-03-17 |
Olaj |
21 |
2006-03-17 |
Olaj |
125 |
2006-03-17 |
Liszt |
18 |
2006-03-18 |
Borso |
128 |
2006-03-18 |
Liszt |
5 |
NULL |
Liszt |
5 |
NULL |
Cukor |
20 |
és a dátum szerint csoportosítjuk akkor a következö csoportokat kapjuk:
Dátum |
NULL |
2006-03-15 |
2006-03-16 |
2006-03-17 |
2006-03-18 |
A statisztikai függvények segítségével mindenik csoportról megkaphatunk különbözö információkat. Egy tábla adatainak a csoportosítása a GROUP BY oszlop_neve megjegyzéssel történik, amit a SELECT parancsba a tábla neve után kell tenni.
Feladatok:
SELECT datum,COUNT(*) AS eladasok_szama FROM tabla GROUP BY datum;
Az eredmény:
SELECT datum,SUM(ertek) AS napi_osszeg FROM tabla GROUP BY datum;
Az eredmény:
Készitünk egy segéd táblát, amely az elöbbihez hasonlóan csoportosítja dátum szeint az eredeti táblát és napi összeget számol. Ezt a táblát seged-nek neveztük el.
CREATE TABLE seged AS SELECT datum,SUM(ertek) AS osszeg FROM tabla GROUP BY datum ;
A kapott táblára készítünk egy lekérdezést. Az alárendelt lekérdezés megadja a legnagyobb összeget, és utánna a fölekérdezés megmondja, hogy melyik a megfelelö dátum.
SELECT datum, osszeg FROM seged WHERE osszeg=(SELECT MAX(osszeg) from seged) ;
Az eredmény:
3.5.12 Táblák összekapcsolása -JOIN.
Az adatbázis kezelésben fontos szerepet játszik a táblák összekapcsolása. Az összekapcsolásban egy vagy több tábla vehet részt, olyan táblák, amelyek között kapcsolat van. Leggyakrabban a kapcsolatot a két (vagy több) tábla egy-egy oszlopában levö értékek képezik. A használt táblák kapnak egy aliast(egy új nevet) , ugy, hogy: ...FROM tabla_neve AS alias , ezeket az aliasokat használjuk utánna a SELECT-ben ha hívatkozni akarunk egy bizonyos tábla mezöire. A hivatkozás úgy történik, hogy : alias.mezö_neve.
Az alias használatának elönyei:
Feladat: Vegyük a termékek és az adatok táblákat ahol a termékek táblának két oszlopa van a kód és a mennyiség, míg az adatok táblának három oszlopa van a kód a név és a termelö. Természetesen a két tábla közötti kapcsolatot a kód oszlop adja. Vagyis ha megadjuk egy termék kódját a termékek táblából az illetö termék mennyisége mellett elérhetö a termék neve és a termelö az adatok táblából.
Vegyük tehát a két táblát:
termekek
adatok
Mindenik termékre, amelyröl vannak adatok az adtok táblában írjuk ki a nevét és a mennyiségét.
SELECT B.nev, A.mennyiseg FROM termekek AS A, adatok AS B WHERE A.kod=B.kod;
Az eredmény:
Feladat:. Vegyük az elöbbi példát:
SELECT B.nev, A.mennyiseg FROM termekek AS A INNER JOIN adatok AS B ON A.kod=B.kod;
Ebben az esetben az eredmény ugyanaz lesz mint fennebb.
Feladat.: A fenti példa esetén:
SELECT B.nev, A.mennyiseg FROM termekek AS A LEFT OUTER JOIN adatok AS B ON A.kod=B.kod
Az eredmény:
Feladat.: A fenti példa esetén:
SELECT B.nev, A.mennyiseg FROM termekek AS A RIGHT OUTER JOIN adatok AS B ON A.kod=B.kod
Az eredmény:
Feladat: Ha ki akarjuk írni a termékek tábla azon adatait, amik nincsenek benne az adatok táblában:
SELECT kod FROM termek WHERE kod NOT IN (SELECT kod FROM adatok)
és forditva: az adatok táblából ami nincs benne a termékek táblában:
SELECT kod FROM adatok WHERE kod NOT IN (SELECT kod FROM termek) ;
Találat: 1799