You are on page 1of 281

Adatbázisok

Az SQL nyelv

Salamon Gábor
gsala@cs.bme.hu
fóliák by Katona Gyula Y.

2006. október 2.
Lekérdez®nyelvek típusai, általános jellemz®ik

I Lehetnek algebrai alapúak: relációs algebrán alapuló lekérdezés,


procedurális leírás
Lekérdez®nyelvek típusai, általános jellemz®ik

I Lehetnek algebrai alapúak: relációs algebrán alapuló lekérdezés,


procedurális leírás
El®ny: lekérdezésoptimalizálásra jobb
Lekérdez®nyelvek típusai, általános jellemz®ik

I Lehetnek algebrai alapúak: relációs algebrán alapuló lekérdezés,


procedurális leírás
El®ny: lekérdezésoptimalizálásra jobb

I Lehetnek logikai alapúak: sor vagy oszlopkalkulusra épül® lekérdezés,


deklaratív leírás
Lekérdez®nyelvek típusai, általános jellemz®ik

I Lehetnek algebrai alapúak: relációs algebrán alapuló lekérdezés,


procedurális leírás
El®ny: lekérdezésoptimalizálásra jobb

I Lehetnek logikai alapúak: sor vagy oszlopkalkulusra épül® lekérdezés,


deklaratív leírás
El®ny: könnyebben átlátható
Lekérdez®nyelvek típusai, általános jellemz®ik

I Lehetnek algebrai alapúak: relációs algebrán alapuló lekérdezés,


procedurális leírás
El®ny: lekérdezésoptimalizálásra jobb

I Lehetnek logikai alapúak: sor vagy oszlopkalkulusra épül® lekérdezés,


deklaratív leírás
El®ny: könnyebben átlátható

Általában a konkrét lekérdez®nyelvek eltérnek a modellt®l (algebrai és logikai


esetben is), van amiben többet tudnak, van amiben kevesebbet, vagy csak
máshogy.
Lekérdez®nyelvek típusai, általános jellemz®ik

I Lehetnek algebrai alapúak: relációs algebrán alapuló lekérdezés,


procedurális leírás
El®ny: lekérdezésoptimalizálásra jobb

I Lehetnek logikai alapúak: sor vagy oszlopkalkulusra épül® lekérdezés,


deklaratív leírás
El®ny: könnyebben átlátható

Általában a konkrét lekérdez®nyelvek eltérnek a modellt®l (algebrai és logikai


esetben is), van amiben többet tudnak, van amiben kevesebbet, vagy csak
máshogy.
Lehetséges eltérések:

I logikai alapúakban eleve csak biztonságos kifejezéseknek megfelel®


kérdéseket lehet írni (nincsenek kvantorok)
Lekérdez®nyelvek típusai, általános jellemz®ik

I Lehetnek algebrai alapúak: relációs algebrán alapuló lekérdezés,


procedurális leírás
El®ny: lekérdezésoptimalizálásra jobb

I Lehetnek logikai alapúak: sor vagy oszlopkalkulusra épül® lekérdezés,


deklaratív leírás
El®ny: könnyebben átlátható

Általában a konkrét lekérdez®nyelvek eltérnek a modellt®l (algebrai és logikai


esetben is), van amiben többet tudnak, van amiben kevesebbet, vagy csak
máshogy.
Lehetséges eltérések:

I logikai alapúakban eleve csak biztonságos kifejezéseknek megfelel®


kérdéseket lehet írni (nincsenek kvantorok)

I aritmetika
Lekérdez®nyelvek típusai, általános jellemz®ik

I Lehetnek algebrai alapúak: relációs algebrán alapuló lekérdezés,


procedurális leírás
El®ny: lekérdezésoptimalizálásra jobb

I Lehetnek logikai alapúak: sor vagy oszlopkalkulusra épül® lekérdezés,


deklaratív leírás
El®ny: könnyebben átlátható

Általában a konkrét lekérdez®nyelvek eltérnek a modellt®l (algebrai és logikai


esetben is), van amiben többet tudnak, van amiben kevesebbet, vagy csak
máshogy.
Lehetséges eltérések:

I logikai alapúakban eleve csak biztonságos kifejezéseknek megfelel®


kérdéseket lehet írni (nincsenek kvantorok)

I aritmetika

I aggregátumok
Lekérdez®nyelvek típusai, általános jellemz®ik

I Lehetnek algebrai alapúak: relációs algebrán alapuló lekérdezés,


procedurális leírás
El®ny: lekérdezésoptimalizálásra jobb

I Lehetnek logikai alapúak: sor vagy oszlopkalkulusra épül® lekérdezés,


deklaratív leírás
El®ny: könnyebben átlátható

Általában a konkrét lekérdez®nyelvek eltérnek a modellt®l (algebrai és logikai


esetben is), van amiben többet tudnak, van amiben kevesebbet, vagy csak
máshogy.
Lehetséges eltérések:

I logikai alapúakban eleve csak biztonságos kifejezéseknek megfelel®


kérdéseket lehet írni (nincsenek kvantorok)

I aritmetika

I aggregátumok

I többszörös sorok kezelése/megengedése


Lekérdez®nyelvek típusai, általános jellemz®ik

I Lehetnek algebrai alapúak: relációs algebrán alapuló lekérdezés,


procedurális leírás
El®ny: lekérdezésoptimalizálásra jobb

I Lehetnek logikai alapúak: sor vagy oszlopkalkulusra épül® lekérdezés,


deklaratív leírás
El®ny: könnyebben átlátható

Általában a konkrét lekérdez®nyelvek eltérnek a modellt®l (algebrai és logikai


esetben is), van amiben többet tudnak, van amiben kevesebbet, vagy csak
máshogy.
Lehetséges eltérések:

I logikai alapúakban eleve csak biztonságos kifejezéseknek megfelel®


kérdéseket lehet írni (nincsenek kvantorok)

I aritmetika

I aggregátumok

I többszörös sorok kezelése/megengedése

I attribútumok sorrendje kötött


Lekérdez®nyelvek típusai, általános jellemz®ik

I Lehetnek algebrai alapúak: relációs algebrán alapuló lekérdezés,


procedurális leírás
El®ny: lekérdezésoptimalizálásra jobb

I Lehetnek logikai alapúak: sor vagy oszlopkalkulusra épül® lekérdezés,


deklaratív leírás
El®ny: könnyebben átlátható

Általában a konkrét lekérdez®nyelvek eltérnek a modellt®l (algebrai és logikai


esetben is), van amiben többet tudnak, van amiben kevesebbet, vagy csak
máshogy.
Lehetséges eltérések:

I logikai alapúakban eleve csak biztonságos kifejezéseknek megfelel®


kérdéseket lehet írni (nincsenek kvantorok)

I aritmetika

I aggregátumok

I többszörös sorok kezelése/megengedése

I attribútumok sorrendje kötött

De mindegyik relációsan teljes (esetleg bizonyos m¶veletek nehezebben mennek)


és általában van a lekérdez® funkció mellett DML és DDL is.
Példák relációs adatbáziskezel® nyelvekre

I Information System Base Language =⇒ ISBL


I relációs algebra alapú
I kifejleszt®: IBM's United Kingdom Scientic Center

I Peterlee Relational Test Vehicle

I QUEry Language =⇒ QUEL


I sorkalkulus alapú

I kifejleszt®: University of California at Berkly

I INGRES lekérdez®nyelve

I Query-By-Example =⇒ QBE
I oszlopkalkulus alapú

I kifejleszt®: IBM's Watson Research Center

I pl. MS Access

I Structured Query Language =⇒ SQL


I oszlopkalkulus-szer¶ alapjai vannak, némi sorkalkulus elemmel

I kifejleszt®: IBM's San Jose Research Laboratory

I pl. Oracle, MS SQL, IBM DB2, MySQL, PostgreSQL


A példákban használt relációs séma

nap idõ

moziID MOZI VETíT FILM filmID

név cím
város rendezõ
A példákban használt relációs séma folyt.

MOZI moziID név város

101 M¶vész Budapest


102 Uránia Pécs
.
.
.

FILM lmID cím rendez®

1 Macskajaj E. Kusturica
2 Moszkva tér Török F.
.
.
.

VETÍT moziID lmID nap id®

101 1 péntek 16:00


101 2 szombat 19:00
.
.
.
Az SQL nyelv

I Relációs nyelv
Az SQL nyelv

I Relációs nyelv

I oszlopkalkulus jelleg¶, de némi sorkalkulusos beütéssel


Az SQL nyelv

I Relációs nyelv

I oszlopkalkulus jelleg¶, de némi sorkalkulusos beütéssel

Szabványok

I SQL89 (SQL1)

I SQL92 (SQL2, mi nagyrészt ezt nézzük most)

I SQL99 (SQL3, ebb®l is pár dolog, pl. triggerek)


Az SQL nyelv

I Relációs nyelv

I oszlopkalkulus jelleg¶, de némi sorkalkulusos beütéssel

Szabványok

I SQL89 (SQL1)

I SQL92 (SQL2, mi nagyrészt ezt nézzük most)

I SQL99 (SQL3, ebb®l is pár dolog, pl. triggerek)

M¶köd® rendszerekben ezek verziói vannak (f®leg SQL2).


Fontosabb utasítások
Data Denition Language:

I CREATE - séma létrehozása

I ALTER - séma módosítása

I DROP - séma törlése


Fontosabb utasítások
Data Denition Language:

I CREATE - séma létrehozása

I ALTER - séma módosítása

I DROP - séma törlése

Data Modication Language:

I INSERT - adatok beszúrása

I UPDATE - adatok módosítása

I DELETE - adatok törlése

I SELECT - adatok lekérdezése


Fontosabb utasítások
Data Denition Language:

I CREATE - séma létrehozása

I ALTER - séma módosítása

I DROP - séma törlése

Data Modication Language:

I INSERT - adatok beszúrása

I UPDATE - adatok módosítása

I DELETE - adatok törlése

I SELECT - adatok lekérdezése

Természetesen el®bb mindig a sémát kell létrehozni, és utána dolgozhatunk vele,


de most fordítva tárgyaljuk mert eddig a lekérdez® nyelvekr®l volt szó.
SELECT
Ezzel valósítható meg a kiválasztás, vetítés és a szorzat.
Szintaxis:
SELECT <relációi >.<attrib1 >, . . . , <relációj >.<attribn >
FROM <reláció1 >, . . . , <relációm >
WHERE <kifejezés>
Relációs algebrabeli megfelel®je (de nem pontosan, mert SQL-ben SELECT nem
küszöböli ki a többszörös sorokat):

π<attrib1 >,...,<attrib n > σ<kifejezés> (<reláció1 > × · · · × <relációm >)

Példa: A budapesti mozik azonosítói és nevei


SELECT mozi.moziID, mozi.név FROM mozi WHERE mozi.város="Budapest"
Példa: A pénteken hétkor kezd®d® lmek azonosítói
SELECT vetít.lmID FROM vetít WHERE vetít.nap="péntek" AND
vetít.id®="19:00"
SELECT folyt.
Megjegyzés:

I kiértékelés: minden egyes FROM utáni relációnak megfelel egy-egy


sorváltozó, ami az egyes relációk sorain megy végig (egymásba ágyazott
ciklusokkal például). Ha találat van, azaz a WHERE feltétel igaz az
aktuális értékekre, akkor a SELECT utáni mez®k kiíródnak
SELECT folyt.
Megjegyzés:

I kiértékelés: minden egyes FROM utáni relációnak megfelel egy-egy


sorváltozó, ami az egyes relációk sorain megy végig (egymásba ágyazott
ciklusokkal például). Ha találat van, azaz a WHERE feltétel igaz az
aktuális értékekre, akkor a SELECT utáni mez®k kiíródnak

I úgy gondolhatunk a kiértékelésre, mintha el®ször vennénk a FROM utáni


relációk direkt szorzatát és aztan arra csinálnánk a kiválasztást és a vetítést.
SELECT folyt.
Megjegyzés:

I kiértékelés: minden egyes FROM utáni relációnak megfelel egy-egy


sorváltozó, ami az egyes relációk sorain megy végig (egymásba ágyazott
ciklusokkal például). Ha találat van, azaz a WHERE feltétel igaz az
aktuális értékekre, akkor a SELECT utáni mez®k kiíródnak

I úgy gondolhatunk a kiértékelésre, mintha el®ször vennénk a FROM utáni


relációk direkt szorzatát és aztan arra csinálnánk a kiválasztást és a vetítést.

I ha többszörös sorokat nem akarunk: SELECT DISTINCT (ennek ára van!!!)


SELECT folyt.
Megjegyzés:

I kiértékelés: minden egyes FROM utáni relációnak megfelel egy-egy


sorváltozó, ami az egyes relációk sorain megy végig (egymásba ágyazott
ciklusokkal például). Ha találat van, azaz a WHERE feltétel igaz az
aktuális értékekre, akkor a SELECT utáni mez®k kiíródnak

I úgy gondolhatunk a kiértékelésre, mintha el®ször vennénk a FROM utáni


relációk direkt szorzatát és aztan arra csinálnánk a kiválasztást és a vetítést.

I ha többszörös sorokat nem akarunk: SELECT DISTINCT (ennek ára van!!!)

I WHERE el is hagyható
SELECT folyt.
Megjegyzés:

I kiértékelés: minden egyes FROM utáni relációnak megfelel egy-egy


sorváltozó, ami az egyes relációk sorain megy végig (egymásba ágyazott
ciklusokkal például). Ha találat van, azaz a WHERE feltétel igaz az
aktuális értékekre, akkor a SELECT utáni mez®k kiíródnak

I úgy gondolhatunk a kiértékelésre, mintha el®ször vennénk a FROM utáni


relációk direkt szorzatát és aztan arra csinálnánk a kiválasztást és a vetítést.

I ha többszörös sorokat nem akarunk: SELECT DISTINCT (ennek ára van!!!)

I WHERE el is hagyható

I WHERE-ben mi állhat: err®l kés®bb


SELECT folyt.
Megjegyzés:

I kiértékelés: minden egyes FROM utáni relációnak megfelel egy-egy


sorváltozó, ami az egyes relációk sorain megy végig (egymásba ágyazott
ciklusokkal például). Ha találat van, azaz a WHERE feltétel igaz az
aktuális értékekre, akkor a SELECT utáni mez®k kiíródnak

I úgy gondolhatunk a kiértékelésre, mintha el®ször vennénk a FROM utáni


relációk direkt szorzatát és aztan arra csinálnánk a kiválasztást és a vetítést.

I ha többszörös sorokat nem akarunk: SELECT DISTINCT (ennek ára van!!!)

I WHERE el is hagyható

I WHERE-ben mi állhat: err®l kés®bb

I az eredmény az ORDER BY kulcsszó segítségével rendezhet®, megadható


hogy mely oszlopok szerint és hogy növ®leg vagy csökken®leg
SELECT folyt.
Megjegyzés:

I kiértékelés: minden egyes FROM utáni relációnak megfelel egy-egy


sorváltozó, ami az egyes relációk sorain megy végig (egymásba ágyazott
ciklusokkal például). Ha találat van, azaz a WHERE feltétel igaz az
aktuális értékekre, akkor a SELECT utáni mez®k kiíródnak

I úgy gondolhatunk a kiértékelésre, mintha el®ször vennénk a FROM utáni


relációk direkt szorzatát és aztan arra csinálnánk a kiválasztást és a vetítést.

I ha többszörös sorokat nem akarunk: SELECT DISTINCT (ennek ára van!!!)

I WHERE el is hagyható

I WHERE-ben mi állhat: err®l kés®bb

I az eredmény az ORDER BY kulcsszó segítségével rendezhet®, megadható


hogy mely oszlopok szerint és hogy növ®leg vagy csökken®leg

I A fenti két példa mutatja, hogy a kiválasztás és a vetítés megy, a szorzatra


a sorváltozók bevezetése után nézünk példát
SQL Sor- és oszlopváltozók
A FROM után felsorolt relációkhoz sorváltozókat rendelhetünk.
Szintaxis (FROM után <relációi > helyén): <relációi > AS <sorváltozó>
SQL Sor- és oszlopváltozók
A FROM után felsorolt relációkhoz sorváltozókat rendelhetünk.
Szintaxis (FROM után <relációi > helyén): <relációi > AS <sorváltozó>
A SELECT után elhelyezett attribútum-hivatkozásokhoz oszlopváltozókat
rendelhetünk.
Szintaxis (SELECT után <relációi >.<attribj > helyén):
<relációi >.<attribj > AS <oszlopváltozó>
SQL Sor- és oszlopváltozók
A FROM után felsorolt relációkhoz sorváltozókat rendelhetünk.
Szintaxis (FROM után <relációi > helyén): <relációi > AS <sorváltozó>
A SELECT után elhelyezett attribútum-hivatkozásokhoz oszlopváltozókat
rendelhetünk.
Szintaxis (SELECT után <relációi >.<attribj > helyén):
<relációi >.<attribj > AS <oszlopváltozó>
Így átnevezés lehetséges az eredmény megjelenítésekor:
SELECT név AS Filmszínház,
Filmszínház Hely
város AS Hely FROM mozi
.
.
.
SQL Sor- és oszlopváltozók
A FROM után felsorolt relációkhoz sorváltozókat rendelhetünk.
Szintaxis (FROM után <relációi > helyén): <relációi > AS <sorváltozó>
A SELECT után elhelyezett attribútum-hivatkozásokhoz oszlopváltozókat
rendelhetünk.
Szintaxis (SELECT után <relációi >.<attribj > helyén):
<relációi >.<attribj > AS <oszlopváltozó>
Így átnevezés lehetséges az eredmény megjelenítésekor:
SELECT név AS Filmszínház,
Filmszínház Hely
város AS Hely FROM mozi
.
.
.

Az oszlopváltozók valójában csak az eredményreláció attribútumainak


elnevezésére használhatók, a SELECT utasításon belül nem hivatkozhatunk
rájuk.
SQL Sor- és oszlopváltozók
A FROM után felsorolt relációkhoz sorváltozókat rendelhetünk.
Szintaxis (FROM után <relációi > helyén): <relációi > AS <sorváltozó>
A SELECT után elhelyezett attribútum-hivatkozásokhoz oszlopváltozókat
rendelhetünk.
Szintaxis (SELECT után <relációi >.<attribj > helyén):
<relációi >.<attribj > AS <oszlopváltozó>
Így átnevezés lehetséges az eredmény megjelenítésekor:
SELECT név AS Filmszínház,
Filmszínház Hely
város AS Hely FROM mozi
.
.
.

Az oszlopváltozók valójában csak az eredményreláció attribútumainak


elnevezésére használhatók, a SELECT utasításon belül nem hivatkozhatunk
rájuk.
A <relációi >. el®tag elhagyható, ha egyértelm¶, hogy melyik relációról van szó,
továbbá a <relációi >. el®tag helyett <sorváltozó>. el®tag is szerepeltethet®.
Attribútumhivatkozások
Amikor egy attribútumra akarunk hivatkozni, három lehet®ségünk van:

I <attribútum> (ha ez egyértelm¶)


Attribútumhivatkozások
Amikor egy attribútumra akarunk hivatkozni, három lehet®ségünk van:

I <attribútum> (ha ez egyértelm¶)

I <reláció>.<attribútum> (ha ez egyértelm¶  N.B.: egy reláció többször is


szerepelhet a FROM után, lesz példa)
Attribútumhivatkozások
Amikor egy attribútumra akarunk hivatkozni, három lehet®ségünk van:

I <attribútum> (ha ez egyértelm¶)

I <reláció>.<attribútum> (ha ez egyértelm¶  N.B.: egy reláció többször is


szerepelhet a FROM után, lesz példa)

I <sorváltozó>.<attribútum> (mindig használható)


Attribútumhivatkozások
Amikor egy attribútumra akarunk hivatkozni, három lehet®ségünk van:

I <attribútum> (ha ez egyértelm¶)

I <reláció>.<attribútum> (ha ez egyértelm¶  N.B.: egy reláció többször is


szerepelhet a FROM után, lesz példa)

I <sorváltozó>.<attribútum> (mindig használható)

Példa: A pénteken vetített lmek címei és rendez®i (természetes illesztés)


Attribútumhivatkozások
Amikor egy attribútumra akarunk hivatkozni, három lehet®ségünk van:

I <attribútum> (ha ez egyértelm¶)

I <reláció>.<attribútum> (ha ez egyértelm¶  N.B.: egy reláció többször is


szerepelhet a FROM után, lesz példa)

I <sorváltozó>.<attribútum> (mindig használható)

Példa: A pénteken vetített lmek címei és rendez®i (természetes illesztés)


SELECT cím, rendez® FROM lm, vetít WHERE vetít.lmID = lm.lmID
AND nap='péntek'
Attribútumhivatkozások
Amikor egy attribútumra akarunk hivatkozni, három lehet®ségünk van:

I <attribútum> (ha ez egyértelm¶)

I <reláció>.<attribútum> (ha ez egyértelm¶  N.B.: egy reláció többször is


szerepelhet a FROM után, lesz példa)

I <sorváltozó>.<attribútum> (mindig használható)

Példa: A pénteken vetített lmek címei és rendez®i (természetes illesztés)


SELECT cím, rendez® FROM lm, vetít WHERE vetít.lmID = lm.lmID
AND nap='péntek'
Példa: Azok a várospárok, ahol vannak azonos nev¶ mozik
Attribútumhivatkozások
Amikor egy attribútumra akarunk hivatkozni, három lehet®ségünk van:

I <attribútum> (ha ez egyértelm¶)

I <reláció>.<attribútum> (ha ez egyértelm¶  N.B.: egy reláció többször is


szerepelhet a FROM után, lesz példa)

I <sorváltozó>.<attribútum> (mindig használható)

Példa: A pénteken vetített lmek címei és rendez®i (természetes illesztés)


SELECT cím, rendez® FROM lm, vetít WHERE vetít.lmID = lm.lmID
AND nap='péntek'
Példa: Azok a várospárok, ahol vannak azonos nev¶ mozik
SELECT m1.város, m2.város FROM mozi AS m1, mozi AS m2 WHERE m1.név
= m2.név AND m1.város <> m2.város
Attribútumhivatkozások
Amikor egy attribútumra akarunk hivatkozni, három lehet®ségünk van:

I <attribútum> (ha ez egyértelm¶)

I <reláció>.<attribútum> (ha ez egyértelm¶  N.B.: egy reláció többször is


szerepelhet a FROM után, lesz példa)

I <sorváltozó>.<attribútum> (mindig használható)

Példa: A pénteken vetített lmek címei és rendez®i (természetes illesztés)


SELECT cím, rendez® FROM lm, vetít WHERE vetít.lmID = lm.lmID
AND nap='péntek'
Példa: Azok a várospárok, ahol vannak azonos nev¶ mozik
SELECT m1.város, m2.város FROM mozi AS m1, mozi AS m2 WHERE m1.név
= m2.név AND m1.város <> m2.város
Megjegyzés: a várospárok mindkét sorrendben megjelennek, és több azonos
nev¶ mozi esetén többször is megjelennek.
Attribútumhivatkozások
Amikor egy attribútumra akarunk hivatkozni, három lehet®ségünk van:

I <attribútum> (ha ez egyértelm¶)

I <reláció>.<attribútum> (ha ez egyértelm¶  N.B.: egy reláció többször is


szerepelhet a FROM után, lesz példa)

I <sorváltozó>.<attribútum> (mindig használható)

Példa: A pénteken vetített lmek címei és rendez®i (természetes illesztés)


SELECT cím, rendez® FROM lm, vetít WHERE vetít.lmID = lm.lmID
AND nap='péntek'
Példa: Azok a várospárok, ahol vannak azonos nev¶ mozik
SELECT m1.város, m2.város FROM mozi AS m1, mozi AS m2 WHERE m1.név
= m2.név AND m1.város <> m2.város
Megjegyzés: a várospárok mindkét sorrendben megjelennek, és több azonos
nev¶ mozi esetén többször is megjelennek.
Az els®re megoldás: <> helyett legyen <, amúgy meg DISTINCT
SELECT DISTINCT m1.város, m2.város FROM mozi AS m1, mozi AS m2
WHERE m1.név = m2.név AND m1.város < m2.város
A WHERE kifejezés
Kifejezés felépítése:

I logikai m¶veletek: AND, OR, NOT


A WHERE kifejezés
Kifejezés felépítése:

I logikai m¶veletek: AND, OR, NOT

I összehasonlítás: =, <>, >=, <=, LIKE, BETWEEN


A WHERE kifejezés
Kifejezés felépítése:

I logikai m¶veletek: AND, OR, NOT

I összehasonlítás: =, <>, >=, <=, LIKE, BETWEEN

I aritmetikai m¶veletek: +, -, *, /, MOD, POWER, LN, SIN, COS, . . .


A WHERE kifejezés
Kifejezés felépítése:

I logikai m¶veletek: AND, OR, NOT

I összehasonlítás: =, <>, >=, <=, LIKE, BETWEEN

I aritmetikai m¶veletek: +, -, *, /, MOD, POWER, LN, SIN, COS, . . .

I karakterlánc m¶veletek, összehasonlítás: CONCAT (||), LENGTH, LOWER,


SUBSRT, SOUNDEX,. . .
A WHERE kifejezés
Kifejezés felépítése:

I logikai m¶veletek: AND, OR, NOT

I összehasonlítás: =, <>, >=, <=, LIKE, BETWEEN

I aritmetikai m¶veletek: +, -, *, /, MOD, POWER, LN, SIN, COS, . . .

I karakterlánc m¶veletek, összehasonlítás: CONCAT (||), LENGTH, LOWER,


SUBSRT, SOUNDEX,. . .

I halmazba tartozás: IN (halmaz), . . .


A WHERE kifejezés
Kifejezés felépítése:

I logikai m¶veletek: AND, OR, NOT

I összehasonlítás: =, <>, >=, <=, LIKE, BETWEEN

I aritmetikai m¶veletek: +, -, *, /, MOD, POWER, LN, SIN, COS, . . .

I karakterlánc m¶veletek, összehasonlítás: CONCAT (||), LENGTH, LOWER,


SUBSRT, SOUNDEX,. . .

I halmazba tartozás: IN (halmaz), . . .

I változóhivatkozások: <sorváltozó>.<attribútum>,
<reláció>.<attribútum>, <attribútum>
A WHERE kifejezés
Kifejezés felépítése:

I logikai m¶veletek: AND, OR, NOT

I összehasonlítás: =, <>, >=, <=, LIKE, BETWEEN

I aritmetikai m¶veletek: +, -, *, /, MOD, POWER, LN, SIN, COS, . . .

I karakterlánc m¶veletek, összehasonlítás: CONCAT (||), LENGTH, LOWER,


SUBSRT, SOUNDEX,. . .

I halmazba tartozás: IN (halmaz), . . .

I változóhivatkozások: <sorváltozó>.<attribútum>,
<reláció>.<attribútum>, <attribútum>

I konstans (szám,karakterlánc): 137, 42e-3, 'füzér', . . .


A WHERE kifejezés
Kifejezés felépítése:

I logikai m¶veletek: AND, OR, NOT

I összehasonlítás: =, <>, >=, <=, LIKE, BETWEEN

I aritmetikai m¶veletek: +, -, *, /, MOD, POWER, LN, SIN, COS, . . .

I karakterlánc m¶veletek, összehasonlítás: CONCAT (||), LENGTH, LOWER,


SUBSRT, SOUNDEX,. . .

I halmazba tartozás: IN (halmaz), . . .

I változóhivatkozások: <sorváltozó>.<attribútum>,
<reláció>.<attribútum>, <attribútum>

I konstans (szám,karakterlánc): 137, 42e-3, 'füzér', . . .

I NULL érték vizsgálata: IS NULL, IS NOT NULL (kés®bb lesz)


A WHERE kifejezés
Kifejezés felépítése:

I logikai m¶veletek: AND, OR, NOT

I összehasonlítás: =, <>, >=, <=, LIKE, BETWEEN

I aritmetikai m¶veletek: +, -, *, /, MOD, POWER, LN, SIN, COS, . . .

I karakterlánc m¶veletek, összehasonlítás: CONCAT (||), LENGTH, LOWER,


SUBSRT, SOUNDEX,. . .

I halmazba tartozás: IN (halmaz), . . .

I változóhivatkozások: <sorváltozó>.<attribútum>,
<reláció>.<attribútum>, <attribútum>

I konstans (szám,karakterlánc): 137, 42e-3, 'füzér', . . .

I NULL érték vizsgálata: IS NULL, IS NOT NULL (kés®bb lesz)

I alkérdés is lehet itt: (majd err®l kés®bb)


LIKE és BETWEEN használata
LIKE használata:

I '_' egy tetsz®leges karakterre illeszkedik


LIKE és BETWEEN használata
LIKE használata:

I '_' egy tetsz®leges karakterre illeszkedik

I '%' tetsz®leges karakterláncra illeszkedik


LIKE és BETWEEN használata
LIKE használata:

I '_' egy tetsz®leges karakterre illeszkedik

I '%' tetsz®leges karakterláncra illeszkedik

BETWEEN használata: BETWEEN a AND b jelentése a ≤.≤b


LIKE és BETWEEN használata
LIKE használata:

I '_' egy tetsz®leges karakterre illeszkedik

I '%' tetsz®leges karakterláncra illeszkedik

BETWEEN használata: BETWEEN a AND b jelentése a ≤.≤b


Példa: A 150 és 200 közötti azonosítójú mozik közül azok, amelyek B-vel
kezd®d® nev¶ városban vannak, és a nevük hárombet¶s.
LIKE és BETWEEN használata
LIKE használata:

I '_' egy tetsz®leges karakterre illeszkedik

I '%' tetsz®leges karakterláncra illeszkedik

BETWEEN használata: BETWEEN a AND b jelentése a ≤.≤b


Példa: A 150 és 200 közötti azonosítójú mozik közül azok, amelyek B-vel
kezd®d® nev¶ városban vannak, és a nevük hárombet¶s.

SELECT név FROM mozi WHERE moziID BETWEEN 150 AND 200 AND
város LIKE 'B%' AND név LIKE '_ _ _'
M¶veletek relációkkal
A részeredményül kapott relációkkal (ha azok sémája lényegében azonos!)
halmazm¶veleteket (unió, metszet, különbség) végezhetünk.
M¶veletek relációkkal
A részeredményül kapott relációkkal (ha azok sémája lényegében azonos!)
halmazm¶veleteket (unió, metszet, különbség) végezhetünk.
Unió (valamely eredményrelációban szerepl® sorok):
I Szintaxis: <eredményreláció1> UNION <eredményreláció2>
M¶veletek relációkkal
A részeredményül kapott relációkkal (ha azok sémája lényegében azonos!)
halmazm¶veleteket (unió, metszet, különbség) végezhetünk.
Unió (valamely eredményrelációban szerepl® sorok):
I Szintaxis: <eredményreláció1> UNION <eredményreláció2>

I Példa: A pénteken vagy szombaton játszott lmek :


M¶veletek relációkkal
A részeredményül kapott relációkkal (ha azok sémája lényegében azonos!)
halmazm¶veleteket (unió, metszet, különbség) végezhetünk.
Unió (valamely eredményrelációban szerepl® sorok):
I Szintaxis: <eredményreláció1> UNION <eredményreláció2>

I Példa: A pénteken vagy szombaton játszott lmek :


(SELECT cím FROM lm, vetít WHERE vetít.nap = 'péntek' AND
lm.lmID = vetít.lmID)
UNION
(SELECT cím FROM lm, vetít WHERE vetít.nap = 'szombat' AND
lm.lmID = vetít.lmID)
(nem hatékony!)
M¶veletek relációkkal
A részeredményül kapott relációkkal (ha azok sémája lényegében azonos!)
halmazm¶veleteket (unió, metszet, különbség) végezhetünk.
Unió (valamely eredményrelációban szerepl® sorok):
I Szintaxis: <eredményreláció1> UNION <eredményreláció2>

I Példa: A pénteken vagy szombaton játszott lmek :


(SELECT cím FROM lm, vetít WHERE vetít.nap = 'péntek' AND
lm.lmID = vetít.lmID)
UNION
(SELECT cím FROM lm, vetít WHERE vetít.nap = 'szombat' AND
lm.lmID = vetít.lmID)
(nem hatékony!)

Metszet (mindkét eredményrelációban szerepl® sorok):


I Szintaxis: <eredményreláció1> INTERSECT <eredményreláció2>
M¶veletek relációkkal
A részeredményül kapott relációkkal (ha azok sémája lényegében azonos!)
halmazm¶veleteket (unió, metszet, különbség) végezhetünk.
Unió (valamely eredményrelációban szerepl® sorok):
I Szintaxis: <eredményreláció1> UNION <eredményreláció2>

I Példa: A pénteken vagy szombaton játszott lmek :


(SELECT cím FROM lm, vetít WHERE vetít.nap = 'péntek' AND
lm.lmID = vetít.lmID)
UNION
(SELECT cím FROM lm, vetít WHERE vetít.nap = 'szombat' AND
lm.lmID = vetít.lmID)
(nem hatékony!)

Metszet (mindkét eredményrelációban szerepl® sorok):


I Szintaxis: <eredményreláció1> INTERSECT <eredményreláció2>

I Példa: A pénteken és szombaton is játszott lmek:


M¶veletek relációkkal
A részeredményül kapott relációkkal (ha azok sémája lényegében azonos!)
halmazm¶veleteket (unió, metszet, különbség) végezhetünk.
Unió (valamely eredményrelációban szerepl® sorok):
I Szintaxis: <eredményreláció1> UNION <eredményreláció2>

I Példa: A pénteken vagy szombaton játszott lmek :


(SELECT cím FROM lm, vetít WHERE vetít.nap = 'péntek' AND
lm.lmID = vetít.lmID)
UNION
(SELECT cím FROM lm, vetít WHERE vetít.nap = 'szombat' AND
lm.lmID = vetít.lmID)
(nem hatékony!)

Metszet (mindkét eredményrelációban szerepl® sorok):


I Szintaxis: <eredményreláció1> INTERSECT <eredményreláció2>

I Példa: A pénteken és szombaton is játszott lmek:


(SELECT cím FROM lm, vetít WHERE vetít.nap = 'péntek' AND
lm.lmID = vetít.lmID)
INTERSECT
(SELECT cím FROM lm, vetít WHERE vetít.nap = 'szombat' AND
lm.lmID = vetít.lmID)
M¶veletek relációkkal folyt. Különbség (az els® reláció azon sorai, melyek a
másodikban nem szerepelnek):

I Szintaxis: <eredményreláció1> MINUS <eredményreláció2>


M¶veletek relációkkal folyt. Különbség (az els® reláció azon sorai, melyek a
másodikban nem szerepelnek):

I Szintaxis: <eredményreláció1> MINUS <eredményreláció2>

I Példa: A pénteken igen, de szombaton nem játszott lmek:


M¶veletek relációkkal folyt. Különbség (az els® reláció azon sorai, melyek a
másodikban nem szerepelnek):

I Szintaxis: <eredményreláció1> MINUS <eredményreláció2>

I Példa: A pénteken igen, de szombaton nem játszott lmek:


(SELECT cím FROM lm, vetít WHERE vetít.nap = 'péntek' AND
lm.lmID = vetít.lmID)
MINUS
(SELECT cím FROM lm, vetít WHERE vetít.nap = 'szombat' AND
lm.lmID = vetít.lmID)
M¶veletek relációkkal folyt. Különbség (az els® reláció azon sorai, melyek a
másodikban nem szerepelnek):

I Szintaxis: <eredményreláció1> MINUS <eredményreláció2>

I Példa: A pénteken igen, de szombaton nem játszott lmek:


(SELECT cím FROM lm, vetít WHERE vetít.nap = 'péntek' AND
lm.lmID = vetít.lmID)
MINUS
(SELECT cím FROM lm, vetít WHERE vetít.nap = 'szombat' AND
lm.lmID = vetít.lmID)

A szabványban MINUS helyett EXCEPT szerepel, de a gyakorlatban a MINUS


használatos.
M¶veletek relációkkal folyt. Különbség (az els® reláció azon sorai, melyek a
másodikban nem szerepelnek):

I Szintaxis: <eredményreláció1> MINUS <eredményreláció2>

I Példa: A pénteken igen, de szombaton nem játszott lmek:


(SELECT cím FROM lm, vetít WHERE vetít.nap = 'péntek' AND
lm.lmID = vetít.lmID)
MINUS
(SELECT cím FROM lm, vetít WHERE vetít.nap = 'szombat' AND
lm.lmID = vetít.lmID)

A szabványban MINUS helyett EXCEPT szerepel, de a gyakorlatban a MINUS


használatos.
Relációs teljesség

Állítás
Az SQL relációsan teljes.
Relációs teljesség

Állítás
Az SQL relációsan teljes.

Bizonyítás: Most láttuk az uniót és különbséget, a többi pedig már volt, de újra:
Relációs teljesség

Állítás
Az SQL relációsan teljes.

Bizonyítás: Most láttuk az uniót és különbséget, a többi pedig már volt, de újra:

vetítés: πA 1 ,A 2 ,...,A (R )-nek


i i i
megfelel® lekérdezés: SELECT Ai1 , Ai2 , . . . , Ai
k
k

FROM R
Relációs teljesség

Állítás
Az SQL relációsan teljes.

Bizonyítás: Most láttuk az uniót és különbséget, a többi pedig már volt, de újra:

vetítés: πA 1 ,A 2 ,...,A (R )-nek


i i i
megfelel® lekérdezés: SELECT Ai1 , Ai2 , . . . , Ai
k
k

FROM R

kiválasztás: σF (R )-nek megfelel a


SELECT * FROM R WHERE F'
ahol F'az, ami F-b®l jön átírással (∧, ∨, ¬ helyett AND, OR, NOT)
Relációs teljesség

Állítás
Az SQL relációsan teljes.

Bizonyítás: Most láttuk az uniót és különbséget, a többi pedig már volt, de újra:

vetítés: πA 1 ,A 2 ,...,A (R )-nek


i i i
megfelel® lekérdezés: SELECT Ai1 , Ai2 , . . . , Ai
k
k

FROM R

kiválasztás: σF (R )-nek megfelel a


SELECT * FROM R WHERE F'
ahol F'az, ami F-b®l jön átírással (∧, ∨, ¬ helyett AND, OR, NOT)


szorzat: SELECT R .A1 , R .A2 , . . . , R .Ak , S .B1 , . . . , S .Bl FROM R,S
Multihalmazok-halmazok

I Az SQL alapértelmezésben nem tünteti el a többszörös sorokat, kivétel:


UNION, INTERSECT, EXCEPT, ennél a háromnál elt¶nnek az
ismétl®dések
Multihalmazok-halmazok

I Az SQL alapértelmezésben nem tünteti el a többszörös sorokat, kivétel:


UNION, INTERSECT, EXCEPT, ennél a háromnál elt¶nnek az
ismétl®dések

I Ha el akarjuk tüntetni az ismétl®déseket:


SELECT DISTINCT
Multihalmazok-halmazok

I Az SQL alapértelmezésben nem tünteti el a többszörös sorokat, kivétel:


UNION, INTERSECT, EXCEPT, ennél a háromnál elt¶nnek az
ismétl®dések

I Ha el akarjuk tüntetni az ismétl®déseket:


SELECT DISTINCT

I Ha a halmazm¶veleteknél mégsem akarom eltüntetni az ismétl®déseket:


UNION ALL, EXCEPT ALL, INTERSECT ALL
Multihalmazok-halmazok

I Az SQL alapértelmezésben nem tünteti el a többszörös sorokat, kivétel:


UNION, INTERSECT, EXCEPT, ennél a háromnál elt¶nnek az
ismétl®dések

I Ha el akarjuk tüntetni az ismétl®déseket:


SELECT DISTINCT

I Ha a halmazm¶veleteknél mégsem akarom eltüntetni az ismétl®déseket:


UNION ALL, EXCEPT ALL, INTERSECT ALL

I Nem (mindig) éri meg közben is törekedni arra, hogy ne legyen ismétl®dés,
elég a végén, mert:
Multihalmazok-halmazok

I Az SQL alapértelmezésben nem tünteti el a többszörös sorokat, kivétel:


UNION, INTERSECT, EXCEPT, ennél a háromnál elt¶nnek az
ismétl®dések

I Ha el akarjuk tüntetni az ismétl®déseket:


SELECT DISTINCT

I Ha a halmazm¶veleteknél mégsem akarom eltüntetni az ismétl®déseket:


UNION ALL, EXCEPT ALL, INTERSECT ALL

I Nem (mindig) éri meg közben is törekedni arra, hogy ne legyen ismétl®dés,
elég a végén, mert:
Az ismétl®dés kiküszöbölése sok munka, mert rendezni kell az egész relációt
hozzá.
Aggregátumok

I Aggregátumok számolása: SUM, MIN, MAX, AVG, COUNT,. . .


Aggregátumok

I Aggregátumok számolása: SUM, MIN, MAX, AVG, COUNT,. . .

I Az, hogy COUNT hogyan kezeli a többszörös sorokat, az rendszerfügg®.


Ha biztosra akarunk menni: COUNT (DISTINCT <attribútum>), COUNT
(ALL <attribútum>)
Aggregátumok

I Aggregátumok számolása: SUM, MIN, MAX, AVG, COUNT,. . .

I Az, hogy COUNT hogyan kezeli a többszörös sorokat, az rendszerfügg®.


Ha biztosra akarunk menni: COUNT (DISTINCT <attribútum>), COUNT
(ALL <attribútum>)

I Lehet®ségünk van bizonyos attribútumok értéke szerint csoportosítani az


eredményt, és így aggregált sorokat képezni.
Aggregátumok

I Aggregátumok számolása: SUM, MIN, MAX, AVG, COUNT,. . .

I Az, hogy COUNT hogyan kezeli a többszörös sorokat, az rendszerfügg®.


Ha biztosra akarunk menni: COUNT (DISTINCT <attribútum>), COUNT
(ALL <attribútum>)

I Lehet®ségünk van bizonyos attribútumok értéke szerint csoportosítani az


eredményt, és így aggregált sorokat képezni.

Erre az utóbbira példa a következ® reláció:

MOZI moziID név város székszám

1 Corvin Budapest 2500


2 Elit Sopron 300
3 Sopron Plaza Megaex Sopron 2000
4 Szindbád Budapest 600
5 Tabán Budapest 200
6 Uránia Pécs 500
Aggregátumok folyt.
Csoportosítsunk a város attribútum szerint:

MOZI moziID név város székszám

1 Corvin Budapest 2500


4 Szindbád Budapest 600
5 Tabán Budapest 200
6 Uránia Pécs 500
2 Elit Sopron 300
3 Sopron Plaza Megaex Sopron 2000
Aggregátumok folyt.
Csoportosítsunk a város attribútum szerint:

MOZI moziID név város székszám

1 Corvin Budapest 2500


4 Szindbád Budapest 600
5 Tabán Budapest 200
6 Uránia Pécs 500
2 Elit Sopron 300
3 Sopron Plaza Megaex Sopron 2000

Képezzük minden városra a székszámok összegét:

MOZI város össz_székszám

Budapest 3300
Pécs 500
Sopron 2300

Példa: Mindez SQL-ben


Aggregátumok folyt.
Csoportosítsunk a város attribútum szerint:

MOZI moziID név város székszám

1 Corvin Budapest 2500


4 Szindbád Budapest 600
5 Tabán Budapest 200
6 Uránia Pécs 500
2 Elit Sopron 300
3 Sopron Plaza Megaex Sopron 2000

Képezzük minden városra a székszámok összegét:

MOZI város össz_székszám

Budapest 3300
Pécs 500
Sopron 2300

Példa: Mindez SQL-ben


SELECT város, SUM(székszám) AS össz_székszám FROM mozi GROUP BY
város
Aggregátumok folyt. Példa: Az egyes városok legkisebb és legnagyobb
mozijának mérete
Aggregátumok folyt. Példa: Az egyes városok legkisebb és legnagyobb
mozijának mérete
SELECT város, MIN(székszám), MAX(székszám) FROM mozi GROUP BY
város
Aggregátumok folyt. Példa: Az egyes városok legkisebb és legnagyobb
mozijának mérete
SELECT város, MIN(székszám), MAX(székszám) FROM mozi GROUP BY
város
Példák, ahol nincs csoportosítás:
Példa: A létez® legnagyobb és a legkisebb székszám
Aggregátumok folyt. Példa: Az egyes városok legkisebb és legnagyobb
mozijának mérete
SELECT város, MIN(székszám), MAX(székszám) FROM mozi GROUP BY
város
Példák, ahol nincs csoportosítás:
Példa: A létez® legnagyobb és a legkisebb székszám
SELECT MIN(székszám), MAX(székszám) FROM mozi
Aggregátumok folyt. Példa: Az egyes városok legkisebb és legnagyobb
mozijának mérete
SELECT város, MIN(székszám), MAX(székszám) FROM mozi GROUP BY
város
Példák, ahol nincs csoportosítás:
Példa: A létez® legnagyobb és a legkisebb székszám
SELECT MIN(székszám), MAX(székszám) FROM mozi
Példa: Az összes székszám
Aggregátumok folyt. Példa: Az egyes városok legkisebb és legnagyobb
mozijának mérete
SELECT város, MIN(székszám), MAX(székszám) FROM mozi GROUP BY
város
Példák, ahol nincs csoportosítás:
Példa: A létez® legnagyobb és a legkisebb székszám
SELECT MIN(székszám), MAX(székszám) FROM mozi
Példa: Az összes székszám
SELECT SUM(székszám) FROM mozi
Aggregátumok folyt.

I Kiértékelés: Vesszük a FROM utáni relációk direkt szorzatát (egy reláció


szerepelhet többször is a szorzatban, ha sorváltozókat adtunk meg hozzá),
Aggregátumok folyt.

I Kiértékelés: Vesszük a FROM utáni relációk direkt szorzatát (egy reláció


szerepelhet többször is a szorzatban, ha sorváltozókat adtunk meg hozzá),
a WHERE feltételt teljesít® eseteket a GROUP BY szerint csoportosítjuk,
Aggregátumok folyt.

I Kiértékelés: Vesszük a FROM utáni relációk direkt szorzatát (egy reláció


szerepelhet többször is a szorzatban, ha sorváltozókat adtunk meg hozzá),
a WHERE feltételt teljesít® eseteket a GROUP BY szerint csoportosítjuk,
majd kiszámoljuk minden csoportra az aggregátumot és kiírjuk.
Aggregátumok folyt.

I Kiértékelés: Vesszük a FROM utáni relációk direkt szorzatát (egy reláció


szerepelhet többször is a szorzatban, ha sorváltozókat adtunk meg hozzá),
a WHERE feltételt teljesít® eseteket a GROUP BY szerint csoportosítjuk,
majd kiszámoljuk minden csoportra az aggregátumot és kiírjuk.

I Amennyiben aggregátumokat képzünk a GROUP BY segítségével, akkor


csak azokra az attribútumokra hivatkozhatunk közvetlenül a SELECT-ben,
ami szerint csoportosítottunk.
Aggregátumok folyt.

I Kiértékelés: Vesszük a FROM utáni relációk direkt szorzatát (egy reláció


szerepelhet többször is a szorzatban, ha sorváltozókat adtunk meg hozzá),
a WHERE feltételt teljesít® eseteket a GROUP BY szerint csoportosítjuk,
majd kiszámoljuk minden csoportra az aggregátumot és kiírjuk.

I Amennyiben aggregátumokat képzünk a GROUP BY segítségével, akkor


csak azokra az attribútumokra hivatkozhatunk közvetlenül a SELECT-ben,
ami szerint csoportosítottunk. Ezen attribútumok értékei ugyanis egy
aggregátumon belül jól meghatározottak. A többi attribútum az
aggregátumon belül többféle értéket is felvehet. Ezért rájuk csak
oszlopfüggvényeken (aggregátumokon) keresztül hivatkozhatunk.
Aggregátumok folyt.

I Kiértékelés: Vesszük a FROM utáni relációk direkt szorzatát (egy reláció


szerepelhet többször is a szorzatban, ha sorváltozókat adtunk meg hozzá),
a WHERE feltételt teljesít® eseteket a GROUP BY szerint csoportosítjuk,
majd kiszámoljuk minden csoportra az aggregátumot és kiírjuk.

I Amennyiben aggregátumokat képzünk a GROUP BY segítségével, akkor


csak azokra az attribútumokra hivatkozhatunk közvetlenül a SELECT-ben,
ami szerint csoportosítottunk. Ezen attribútumok értékei ugyanis egy
aggregátumon belül jól meghatározottak. A többi attribútum az
aggregátumon belül többféle értéket is felvehet. Ezért rájuk csak
oszlopfüggvényeken (aggregátumokon) keresztül hivatkozhatunk.

I Lehet több oszlop szerint is GROUP BY, ekkor azok a sorok lesznek egy
csoportban, ahol mindegyik GROUP BY után felsorolt oszlop értéke
megegyezik.
Aggregátumok folyt.

I Lehet GROUP BY aggregátum nélkül is

Példa:
SELECT város FROM mozi GROUP BY város
Aggregátumok folyt.

I Lehet GROUP BY aggregátum nélkül is

Példa:
SELECT város FROM mozi GROUP BY város

Kiírja az összes várost (pontosan egyszer), ahol van mozi.


Aggregátumok folyt.

I Lehet GROUP BY aggregátum nélkül is

Példa:
SELECT város FROM mozi GROUP BY város

Kiírja az összes várost (pontosan egyszer), ahol van mozi.


Ugyanaz, mint a
SELECT DISTINCT város FROM mozi
Feltétel a csoportokra  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.
Feltétel a csoportokra  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.
Példa: Azokra a városokra számolunk csak legkisebb és legnagyobb mozit, ahol
van legalább 2 mozi
Feltétel a csoportokra  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.
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), MAX(székszám) FROM mozi GROUP BY
város HAVING COUNT(név)>1
Feltétel a csoportokra  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.
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), MAX(székszám) FROM mozi GROUP BY
város HAVING COUNT(név)>1

I a csoportra vonatkozó feltételt a HAVING kulcsszó vezeti be


Feltétel a csoportokra  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.
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), MAX(székszám) FROM mozi GROUP BY
város HAVING COUNT(név)>1

I a csoportra vonatkozó feltételt a HAVING kulcsszó vezeti be

I olyan feltételt írunk ide, ami csoportra vonatkozik (különben WHERE-be


írnánk)
Feltétel a csoportokra  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.
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), MAX(székszám) FROM mozi GROUP BY
város HAVING COUNT(név)>1

I a csoportra vonatkozó feltételt a HAVING kulcsszó vezeti be

I olyan feltételt írunk ide, ami csoportra vonatkozik (különben WHERE-be


írnánk)

I csak GROUP BY-jal együtt használható


Feltétel a csoportokra  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.
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), MAX(székszám) FROM mozi GROUP BY
város HAVING COUNT(név)>1

I a csoportra vonatkozó feltételt a HAVING kulcsszó vezeti be

I olyan feltételt írunk ide, ami csoportra vonatkozik (különben WHERE-be


írnánk)

I csak GROUP BY-jal együtt használható

I a kiértékelés során a csoportosítás után minden egyes csoportra megnézzük


a feltételt és eldobjuk azokat a csoportokat, amikre a feltétel nem áll és a
maradékkal dolgozunk tovább
Feltétel a csoportokra  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.
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), MAX(székszám) FROM mozi GROUP BY
város HAVING COUNT(név)>1

I a csoportra vonatkozó feltételt a HAVING kulcsszó vezeti be

I olyan feltételt írunk ide, ami csoportra vonatkozik (különben WHERE-be


írnánk)

I csak GROUP BY-jal együtt használható

I a kiértékelés során a csoportosítás után minden egyes csoportra megnézzük


a feltételt és eldobjuk azokat a csoportokat, amikre a feltétel nem áll és a
maradékkal dolgozunk tovább

I HAVING megkerülhet®, mindent, amit lehet HAVING-gel, lehet máshogy is


( majd lesz err®l szó az alkérdéseknél)
A hat alapkulcsszó

I SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY


A hat alapkulcsszó

I SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY

I Ebben a sorrendben jönnek


A hat alapkulcsszó

I SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY

I Ebben a sorrendben jönnek

I SELECT és FROM kell, a többi opcionális


A hat alapkulcsszó

I SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY

I Ebben a sorrendben jönnek

I SELECT és FROM kell, a többi opcionális

I HAVING csak GROUP BY-jal


Alkérdések

I Az alkérdés eredménye mindig egy reláció, szintaxisa pedig a lekérdezés


szintaxisával azonos.
Alkérdések

I Az alkérdés eredménye mindig egy reláció, szintaxisa pedig a lekérdezés


szintaxisával azonos.

I Tipikusan WHERE feltételében áll, ezáltal sokkal összetettebb kiválasztási


feltételek jönnek létre, mint a relációs algebrában.
Alkérdések

I Az alkérdés eredménye mindig egy reláció, szintaxisa pedig a lekérdezés


szintaxisával azonos.

I Tipikusan WHERE feltételében áll, ezáltal sokkal összetettebb kiválasztási


feltételek jönnek létre, mint a relációs algebrában.

Alkérdés FROM záradékban


Alkérdések

I Az alkérdés eredménye mindig egy reláció, szintaxisa pedig a lekérdezés


szintaxisával azonos.

I Tipikusan WHERE feltételében áll, ezáltal sokkal összetettebb kiválasztási


feltételek jönnek létre, mint a relációs algebrában.

Alkérdés FROM záradékban


A kiválasztáshoz használt relációk lehetnek alkérdés által származtatott relációk
is.
Alkérdések

I Az alkérdés eredménye mindig egy reláció, szintaxisa pedig a lekérdezés


szintaxisával azonos.

I Tipikusan WHERE feltételében áll, ezáltal sokkal összetettebb kiválasztási


feltételek jönnek létre, mint a relációs algebrában.

Alkérdés FROM záradékban


A kiválasztáshoz használt relációk lehetnek alkérdés által származtatott relációk
is.
Példa: A lmek címe, rendez®je és a rendez® lmjeinek száma
Alkérdések

I Az alkérdés eredménye mindig egy reláció, szintaxisa pedig a lekérdezés


szintaxisával azonos.

I Tipikusan WHERE feltételében áll, ezáltal sokkal összetettebb kiválasztási


feltételek jönnek létre, mint a relációs algebrában.

Alkérdés FROM záradékban


A kiválasztáshoz használt relációk lehetnek alkérdés által származtatott relációk
is.
Példa: A lmek címe, rendez®je és a rendez® lmjeinek száma
SELECT f1.cím, f1.rendez®, f2.lmszám FROM
lm AS f1,
(SELECT rendez®, COUNT(*) AS lmszám FROM lm GROUP BY rendez®)
AS f2
WHERE f1.rendez® = f2.rendez®
Alkérdések

I Az alkérdés eredménye mindig egy reláció, szintaxisa pedig a lekérdezés


szintaxisával azonos.

I Tipikusan WHERE feltételében áll, ezáltal sokkal összetettebb kiválasztási


feltételek jönnek létre, mint a relációs algebrában.

Alkérdés FROM záradékban


A kiválasztáshoz használt relációk lehetnek alkérdés által származtatott relációk
is.
Példa: A lmek címe, rendez®je és a rendez® lmjeinek száma
SELECT f1.cím, f1.rendez®, f2.lmszám FROM
lm AS f1,
(SELECT rendez®, COUNT(*) AS lmszám FROM lm GROUP BY rendez®)
AS f2
WHERE f1.rendez® = f2.rendez®
Vigyázat! Itt nem jött létre f2 nev¶ reláció, csak annyi történik, hogy az f2 nev¶
sorváltozó befutja az alkérdés eredményéül kapott reláció sorait. Egyszer
kiszámolódik az alkérdés és ennek eredményét használjuk a továbbiakban.
Alkérdések folyt. Alkérdés WHERE záradékban
Alkérdések folyt. Alkérdés WHERE záradékban
Az alkérdés eredményét valamely attribútumok értékeivel hasonlítjuk össze a
kiválasztáshoz.
Alkérdések folyt. Alkérdés WHERE záradékban
Az alkérdés eredményét valamely attribútumok értékeivel hasonlítjuk össze a
kiválasztáshoz.
Ezeknek az attribútumok számában meg kell egyezniük az alkérdés
eredményének oszlopszámával.
Alkérdések folyt. Alkérdés WHERE záradékban
Az alkérdés eredményét valamely attribútumok értékeivel hasonlítjuk össze a
kiválasztáshoz.
Ezeknek az attribútumok számában meg kell egyezniük az alkérdés
eredményének oszlopszámával.

I Egyenl®ség vizsgálata
Csak akkor lehetséges, ha az alkérdés egysoros relációt ír le (azaz az
eredménye egyetlen érték vagy érték-vektor).
Alkérdések folyt. Alkérdés WHERE záradékban
Az alkérdés eredményét valamely attribútumok értékeivel hasonlítjuk össze a
kiválasztáshoz.
Ezeknek az attribútumok számában meg kell egyezniük az alkérdés
eredményének oszlopszámával.

I Egyenl®ség vizsgálata
Csak akkor lehetséges, ha az alkérdés egysoros relációt ír le (azaz az
eredménye egyetlen érték vagy érték-vektor).
Az egyenl®ség fennáll, ha az adott attribútumok értékei megegyeznek az
alkérdés által adott reláció megfelel® attribútumainak értékével.
Alkérdések folyt. Alkérdés WHERE záradékban
Az alkérdés eredményét valamely attribútumok értékeivel hasonlítjuk össze a
kiválasztáshoz.
Ezeknek az attribútumok számában meg kell egyezniük az alkérdés
eredményének oszlopszámával.

I Egyenl®ség vizsgálata
Csak akkor lehetséges, ha az alkérdés egysoros relációt ír le (azaz az
eredménye egyetlen érték vagy érték-vektor).
Az egyenl®ség fennáll, ha az adott attribútumok értékei megegyeznek az
alkérdés által adott reláció megfelel® attribútumainak értékével.
Szintaxis:
SELECT . . . FROM . . .
WHERE (<attrib11 >, . . . , <attrib1n >) = (SELECT <attrib21 >, . . . ,
<attrib2n > FROM . . . )
A nem egyenl®ség vizsgálatára a <> használandó.
Alkérdések folyt. Alkérdés WHERE záradékban
Az alkérdés eredményét valamely attribútumok értékeivel hasonlítjuk össze a
kiválasztáshoz.
Ezeknek az attribútumok számában meg kell egyezniük az alkérdés
eredményének oszlopszámával.

I Egyenl®ség vizsgálata
Csak akkor lehetséges, ha az alkérdés egysoros relációt ír le (azaz az
eredménye egyetlen érték vagy érték-vektor).
Az egyenl®ség fennáll, ha az adott attribútumok értékei megegyeznek az
alkérdés által adott reláció megfelel® attribútumainak értékével.
Szintaxis:
SELECT . . . FROM . . .
WHERE (<attrib11 >, . . . , <attrib1n >) = (SELECT <attrib21 >, . . . ,
<attrib2n > FROM . . . )
A nem egyenl®ség vizsgálatára a <> használandó.
Példa: A legnagyobb mozik nevei
Alkérdések folyt. Alkérdés WHERE záradékban
Az alkérdés eredményét valamely attribútumok értékeivel hasonlítjuk össze a
kiválasztáshoz.
Ezeknek az attribútumok számában meg kell egyezniük az alkérdés
eredményének oszlopszámával.

I Egyenl®ség vizsgálata
Csak akkor lehetséges, ha az alkérdés egysoros relációt ír le (azaz az
eredménye egyetlen érték vagy érték-vektor).
Az egyenl®ség fennáll, ha az adott attribútumok értékei megegyeznek az
alkérdés által adott reláció megfelel® attribútumainak értékével.
Szintaxis:
SELECT . . . FROM . . .
WHERE (<attrib11 >, . . . , <attrib1n >) = (SELECT <attrib21 >, . . . ,
<attrib2n > FROM . . . )
A nem egyenl®ség vizsgálatára a <> használandó.
Példa: A legnagyobb mozik nevei
SELECT név FROM mozi
WHERE mozi.székszám = (SELECT MAX(székszám) FROM mozi)
Alkérdések folyt.

I Tartalmazás vizsgálata
Több sort adó alkérdésre is értelmezett.
Alkérdések folyt.

I Tartalmazás vizsgálata
Több sort adó alkérdésre is értelmezett.
A tartalmazás fennáll, ha a vizsgált attribútumok értéke megegyezik az
alkérdés eredményének valamely sorával.
Alkérdések folyt.

I Tartalmazás vizsgálata
Több sort adó alkérdésre is értelmezett.
A tartalmazás fennáll, ha a vizsgált attribútumok értéke megegyezik az
alkérdés eredményének valamely sorával.
Szintaxis:
SELECT . . . FROM . . .
WHERE (<attrib11 >, . . . , <attrib1n >) IN (SELECT <attrib21 >, . . . ,
<attrib2n > FROM . . . )
Alkérdések folyt.

I Tartalmazás vizsgálata
Több sort adó alkérdésre is értelmezett.
A tartalmazás fennáll, ha a vizsgált attribútumok értéke megegyezik az
alkérdés eredményének valamely sorával.
Szintaxis:
SELECT . . . FROM . . .
WHERE (<attrib11 >, . . . , <attrib1n >) IN (SELECT <attrib21 >, . . . ,
<attrib2n > FROM . . . )
A nem tartalmazás vizsgálatára a NOT IN használandó.

Példa: A nem vetített lmek címe és rendez®je


Alkérdések folyt.

I Tartalmazás vizsgálata
Több sort adó alkérdésre is értelmezett.
A tartalmazás fennáll, ha a vizsgált attribútumok értéke megegyezik az
alkérdés eredményének valamely sorával.
Szintaxis:
SELECT . . . FROM . . .
WHERE (<attrib11 >, . . . , <attrib1n >) IN (SELECT <attrib21 >, . . . ,
<attrib2n > FROM . . . )
A nem tartalmazás vizsgálatára a NOT IN használandó.

Példa: A nem vetített lmek címe és rendez®je


SELECT cím, rendez® FROM lm AS f1
WHERE f1.lmID NOT IN (SELECT v1.lmID FROM vetít AS v1)
Alkérdések folyt.

I Alkérdés valamely vagy minden sorának vizsgálata


Tipikusan több sort szolgáltató alkérdés esetén, valamilyen összehasonlító
operátorral együtt használatosak az ANY és az ALL kulcsszavak.
Alkérdések folyt.

I Alkérdés valamely vagy minden sorának vizsgálata


Tipikusan több sort szolgáltató alkérdés esetén, valamilyen összehasonlító
operátorral együtt használatosak az ANY és az ALL kulcsszavak.
Az ANY -t (ALL-t) tartalmazó feltétel teljesül, ha a vizsgált attribútumok
értéke és az alkérdés valamely (minden) sorára az összehasonlító operátor
igaz értéket ad.
Alkérdések folyt.

I Alkérdés valamely vagy minden sorának vizsgálata


Tipikusan több sort szolgáltató alkérdés esetén, valamilyen összehasonlító
operátorral együtt használatosak az ANY és az ALL kulcsszavak.
Az ANY -t (ALL-t) tartalmazó feltétel teljesül, ha a vizsgált attribútumok
értéke és az alkérdés valamely (minden) sorára az összehasonlító operátor
igaz értéket ad.
Szintakszis:
SELECT . . . FROM . . .
WHERE (<attrib11 >, . . . , <attrib1n >) <op> [ ANY | ALL ] (SELECT
<attrib21 >, . . . , <attrib2n > FROM . . . )
Alkérdések folyt.

I Alkérdés valamely vagy minden sorának vizsgálata


Tipikusan több sort szolgáltató alkérdés esetén, valamilyen összehasonlító
operátorral együtt használatosak az ANY és az ALL kulcsszavak.
Az ANY -t (ALL-t) tartalmazó feltétel teljesül, ha a vizsgált attribútumok
értéke és az alkérdés valamely (minden) sorára az összehasonlító operátor
igaz értéket ad.
Szintakszis:
SELECT . . . FROM . . .
WHERE (<attrib11 >, . . . , <attrib1n >) <op> [ ANY | ALL ] (SELECT
<attrib21 >, . . . , <attrib2n > FROM . . . )
A semelyik, illetve a nem mind leírására a NOT ANY , illetve a NOT
ALL használatosak.
Alkérdések folyt.

I Alkérdés valamely vagy minden sorának vizsgálata


Tipikusan több sort szolgáltató alkérdés esetén, valamilyen összehasonlító
operátorral együtt használatosak az ANY és az ALL kulcsszavak.
Az ANY -t (ALL-t) tartalmazó feltétel teljesül, ha a vizsgált attribútumok
értéke és az alkérdés valamely (minden) sorára az összehasonlító operátor
igaz értéket ad.
Szintakszis:
SELECT . . . FROM . . .
WHERE (<attrib11 >, . . . , <attrib1n >) <op> [ ANY | ALL ] (SELECT
<attrib21 >, . . . , <attrib2n > FROM . . . )
A semelyik, illetve a nem mind leírására a NOT ANY , illetve a NOT
ALL használatosak.

Példa: Ismét a legnagyobb mozi(k)


Alkérdések folyt.

I Alkérdés valamely vagy minden sorának vizsgálata


Tipikusan több sort szolgáltató alkérdés esetén, valamilyen összehasonlító
operátorral együtt használatosak az ANY és az ALL kulcsszavak.
Az ANY -t (ALL-t) tartalmazó feltétel teljesül, ha a vizsgált attribútumok
értéke és az alkérdés valamely (minden) sorára az összehasonlító operátor
igaz értéket ad.
Szintakszis:
SELECT . . . FROM . . .
WHERE (<attrib11 >, . . . , <attrib1n >) <op> [ ANY | ALL ] (SELECT
<attrib21 >, . . . , <attrib2n > FROM . . . )
A semelyik, illetve a nem mind leírására a NOT ANY , illetve a NOT
ALL használatosak.

Példa: Ismét a legnagyobb mozi(k)


SELECT m2.város, m2.név, m2.székszám FROM mozi AS m2
WHERE m2.székszám >= ALL (SELECT m1.székszám FROM mozi AS m1)
Alkérdések folyt.

I Alkérdés ürességének vizsgálata


Az EXISTS kulcsszóval megvizsgálhatjuk, hogy van-e egyáltalán sora az
alkérdés által leírt relációnak.
Alkérdések folyt.

I Alkérdés ürességének vizsgálata


Az EXISTS kulcsszóval megvizsgálhatjuk, hogy van-e egyáltalán sora az
alkérdés által leírt relációnak.
Az ezt tartalmazó feltétel teljesül, ha van legalább egy sor.
Szintakszis:
SELECT . . . FROM . . .
WHERE EXISTS (SELECT <attrib1 >, . . . , <attribn > FROM . . . )
Alkérdések folyt.

I Alkérdés ürességének vizsgálata


Az EXISTS kulcsszóval megvizsgálhatjuk, hogy van-e egyáltalán sora az
alkérdés által leírt relációnak.
Az ezt tartalmazó feltétel teljesül, ha van legalább egy sor.
Szintakszis:
SELECT . . . FROM . . .
WHERE EXISTS (SELECT <attrib1 >, . . . , <attribn > FROM . . . )
A nem létezés vizsgálatára a NOT EXISTS használandó.
Alkérdések folyt.

I Alkérdés ürességének vizsgálata


Az EXISTS kulcsszóval megvizsgálhatjuk, hogy van-e egyáltalán sora az
alkérdés által leírt relációnak.
Az ezt tartalmazó feltétel teljesül, ha van legalább egy sor.
Szintakszis:
SELECT . . . FROM . . .
WHERE EXISTS (SELECT <attrib1 >, . . . , <attribn > FROM . . . )
A nem létezés vizsgálatára a NOT EXISTS használandó.

Példa: Azok a városok, ahol van legalább két mozi


Alkérdések folyt.

I Alkérdés ürességének vizsgálata


Az EXISTS kulcsszóval megvizsgálhatjuk, hogy van-e egyáltalán sora az
alkérdés által leírt relációnak.
Az ezt tartalmazó feltétel teljesül, ha van legalább egy sor.
Szintakszis:
SELECT . . . FROM . . .
WHERE EXISTS (SELECT <attrib1 >, . . . , <attribn > FROM . . . )
A nem létezés vizsgálatára a NOT EXISTS használandó.

Példa: Azok a városok, ahol van legalább két mozi


SELECT m1.város FROM mozi AS m1
WHERE EXISTS (SELECT * FROM mozi AS m2 WHERE m1.város
=m2.város AND m1.név<>m2.név)
Alkérdések folyt.

I Alkérdés ürességének vizsgálata


Az EXISTS kulcsszóval megvizsgálhatjuk, hogy van-e egyáltalán sora az
alkérdés által leírt relációnak.
Az ezt tartalmazó feltétel teljesül, ha van legalább egy sor.
Szintakszis:
SELECT . . . FROM . . .
WHERE EXISTS (SELECT <attrib1 >, . . . , <attribn > FROM . . . )
A nem létezés vizsgálatára a NOT EXISTS használandó.

Példa: Azok a városok, ahol van legalább két mozi


SELECT m1.város FROM mozi AS m1
WHERE EXISTS (SELECT * FROM mozi AS m2 WHERE m1.város
=m2.város AND m1.név<>m2.név)

Ez úgy nevezett korrelált alkérdés:


ennek kiértékelése során minden egyes lehetséges értékére az m1
sorváltozónak lefut az alkérdés és kiírás van, ha az alkérdés eredménye nem
üres.
A korábbi esetekben csak egyszer kellett kiértékelni az alkérdést, itt
annyiszor, ahány sora a mozi-nak van.
HAVING megkerülése alkérdéssel
Nézzük egy példán, de általában is így megy:
HAVING-gel:

Azokra a városokra számolunk legkisebb és legnagyobb mozit, ahol van legalább


2 mozi
SELECT város, MIN(székszám), MAX(székszám)
FROM mozi
GROUP BY város
HAVING COUNT(*)>1
HAVING megkerülése alkérdéssel
Nézzük egy példán, de általában is így megy:
HAVING-gel:

Azokra a városokra számolunk legkisebb és legnagyobb mozit, ahol van legalább


2 mozi
SELECT város, MIN(székszám), MAX(székszám)
FROM mozi
GROUP BY város
HAVING COUNT(*)>1

HAVING nélkül, alkérdéssel:


HAVING megkerülése alkérdéssel
Nézzük egy példán, de általában is így megy:
HAVING-gel:

Azokra a városokra számolunk legkisebb és legnagyobb mozit, ahol van legalább


2 mozi
SELECT város, MIN(székszám), MAX(székszám)
FROM mozi
GROUP BY város
HAVING COUNT(*)>1

HAVING nélkül, alkérdéssel:

SELECT város, minszékszám, maxszékszám


FROM (SELECT város, MIN(székszám) AS minszékszám, MAX(székszám)
AS maxszékszám, COUNT(*) AS darab
FROM mozi
GROUP BY város)
WHERE darab >1
NULL érték az SQL-ben
Az SQL-ben az ismeretlen vagy nem létez® értéket a NULL érték jelképezi.
A NULL használatakor ügyelni kell rá, hogy az aritmetikai és összehasonlító
operátorok speciálisan értelmezettek rá.
NULL érték az SQL-ben
Az SQL-ben az ismeretlen vagy nem létez® értéket a NULL érték jelképezi.
A NULL használatakor ügyelni kell rá, hogy az aritmetikai és összehasonlító
operátorok speciálisan értelmezettek rá.
Például:

NULL * 0 értéke nem 0, hanem NULL.


NULL érték az SQL-ben
Az SQL-ben az ismeretlen vagy nem létez® értéket a NULL érték jelképezi.
A NULL használatakor ügyelni kell rá, hogy az aritmetikai és összehasonlító
operátorok speciálisan értelmezettek rá.
Például:

NULL * 0 értéke nem 0, hanem NULL.


rendez® = NULL értéke nem IGAZ, nem HAMIS, hanem a logikai
ISMERETLEN érték
=⇒ UN.
Háromérték¶ logika

¬
I H

H I

UN UN
Háromérték¶ logika

¬ ∨ I H UN

I H I I I I

H I H I H UN

UN UN UN I UN UN
Háromérték¶ logika

¬ ∨ I H UN ∧ I H UN

I H I I I I I I H UN

H I H I H UN H H H H

UN UN UN I UN UN UN UN H UN
Háromérték¶ logika

¬ ∨ I H UN ∧ I H UN

I H I I I I I I H UN

H I H I H UN H H H H

UN UN UN I UN UN UN UN H UN

Tehát egy állítás nem csak igaz vagy hamis lehet, hanem ismeretlen is és egy
WHERE-beli állításnál természetesen csak az számit találatnak, ha igaz az
állítás, az ismeretlen nem lesz jó.
Háromérték¶ logika

¬ ∨ I H UN ∧ I H UN

I H I I I I I I H UN

H I H I H UN H H H H

UN UN UN I UN UN UN UN H UN

Tehát egy állítás nem csak igaz vagy hamis lehet, hanem ismeretlen is és egy
WHERE-beli állításnál természetesen csak az számit találatnak, ha igaz az
állítás, az ismeretlen nem lesz jó.
Furán viselkedik ez a logika:

SELECT moziID, lmID


FROM vetít
WHERE id®>12:00 OR id® <=12:00
Háromérték¶ logika

¬ ∨ I H UN ∧ I H UN

I H I I I I I I H UN

H I H I H UN H H H H

UN UN UN I UN UN UN UN H UN

Tehát egy állítás nem csak igaz vagy hamis lehet, hanem ismeretlen is és egy
WHERE-beli állításnál természetesen csak az számit találatnak, ha igaz az
állítás, az ismeretlen nem lesz jó.
Furán viselkedik ez a logika:

SELECT moziID, lmID


FROM vetít
WHERE id®>12:00 OR id® <=12:00
Az lenne jó, ha ez minden lmet felsorol, de sajnos aminek nincs ideje, azt nem
sorolja fel.
Háromérték¶ logika

¬ ∨ I H UN ∧ I H UN

I H I I I I I I H UN

H I H I H UN H H H H

UN UN UN I UN UN UN UN H UN

Tehát egy állítás nem csak igaz vagy hamis lehet, hanem ismeretlen is és egy
WHERE-beli állításnál természetesen csak az számit találatnak, ha igaz az
állítás, az ismeretlen nem lesz jó.
Furán viselkedik ez a logika:

SELECT moziID, lmID


FROM vetít
WHERE id®>12:00 OR id® <=12:00
Az lenne jó, ha ez minden lmet felsorol, de sajnos aminek nincs ideje, azt nem
sorolja fel.
=⇒ A ∨ ¬A 6= I a háromérték¶ logikában, azaz nem teljesül az, amit
megszoktunk, hogy vagy az állítás vagy a tagadása igaz lesz.
Háromérték¶ logika
Hasonlóan: egy mez® értéke nem hasonlítható össze a szokásos módon a NULL
értékkel (mivel NULL nem egy konstans).
Háromérték¶ logika
Hasonlóan: egy mez® értéke nem hasonlítható össze a szokásos módon a NULL
értékkel (mivel NULL nem egy konstans).
Erre az IS NULL, illetve az IS NOT NULL használatosak.
Háromérték¶ logika
Hasonlóan: egy mez® értéke nem hasonlítható össze a szokásos módon a NULL
értékkel (mivel NULL nem egy konstans).
Erre az IS NULL, illetve az IS NOT NULL használatosak.
Példa: Azon lmek címe és rendez®je, melyeknek ismerjük a rendez®jét.
SELECT cím, rendez® FROM lm WHERE rendez® IS NOT NULL
Relációk összekapcsolása (join) SQL2-ben
A következ®kben ismertetett nyelvi elemek egy része csak szintaktikai
édesít®szer, kifejezhet® a
SELECT <attribútumok> FROM R, S WHERE <feltételek>
segítségével.
Relációk összekapcsolása (join) SQL2-ben
A következ®kben ismertetett nyelvi elemek egy része csak szintaktikai
édesít®szer, kifejezhet® a
SELECT <attribútumok> FROM R, S WHERE <feltételek>
segítségével.
Relációk összekapcsolásakor meg kell adni az összekapcsolás módját (bels® vagy
küls®) és a sorok összekapcsolásának feltételét.
Az összekapcsolás módja

I Bels® összekapcsolás: R INNER 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 (azaz a másik relációban). (Az,
hogy mikor kapcsolódó két sor, az majd a kapcsolódás feltételeinél derül ki.)
Az összekapcsolás módja

I Bels® összekapcsolás: R INNER 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 (azaz a másik relációban). (Az,
hogy mikor kapcsolódó két sor, az majd a kapcsolódás feltételeinél derül ki.)

I 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.
Az összekapcsolás módja

I Bels® összekapcsolás: R INNER 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 (azaz a másik relációban). (Az,
hogy mikor kapcsolódó két sor, az majd a kapcsolódás feltételeinél derül ki.)

I 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.

I Jobb oldali küls® összekapcsolás: R RIGHT [OUTER] JOIN S


Mint a LEFT OUTER JOIN, de R és S szerepe megcserél®dik.

I Teljes küls® összekapcsolás: R FULL [OUTER] JOIN S


Mind R, mind S azon sorai is bekerülnek az eredményrelációba, melyekhez
nem kapcsolódik sor a másik relációból.
Az ezáltal üresen maradó mez®k itt is NULL értéket kapnak.
Az összekapcsolás módja

I Bels® összekapcsolás: R INNER 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 (azaz a másik relációban). (Az,
hogy mikor kapcsolódó két sor, az majd a kapcsolódás feltételeinél derül ki.)

I 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.

I Jobb oldali küls® összekapcsolás: R RIGHT [OUTER] JOIN S


Mint a LEFT OUTER JOIN, de R és S szerepe megcserél®dik.

I Teljes küls® összekapcsolás: R FULL [OUTER] JOIN S


Mind R, mind S azon sorai is bekerülnek az eredményrelációba, melyekhez
nem kapcsolódik sor a másik relációból.
Az ezáltal üresen maradó mez®k itt is NULL értéket kapnak.

A direkt szorzat létrehozására az R CROSS JOIN S alak használható, ilyenkor


nincs feltétele a sorok összekapcsolásának.
Ez az alapértelmezés (R , S)
A sorok összekapcsolásának feltételei

I Természetes illesztés: R NATURAL [INNER | LEFT | RIGHT |


FULL] JOIN S
R és S azon sorai illeszt®dnek, ahol az azonos nev¶ attribútumok értéke is
megegyezik.
Ez az alapértelmezés.
A sorok összekapcsolásának feltételei

I Természetes illesztés: R NATURAL [INNER | LEFT | RIGHT |


FULL] JOIN S
R és S azon sorai illeszt®dnek, ahol az azonos nev¶ attribútumok értéke is
megegyezik.
Ez az alapértelmezés.

I Illesztés azonos nev¶ attribútumokkal: R [INNER | LEFT | RIGHT |


FULL] JOIN S USING (<attribútumok>)
R és S azon sorai illeszt®dnek, ahol az azonos nev¶ és <attribútumok>-ban
felsorolt attribútumok értéke is megegyezik.
A sorok összekapcsolásának feltételei

I Természetes illesztés: R NATURAL [INNER | LEFT | RIGHT |


FULL] JOIN S
R és S azon sorai illeszt®dnek, ahol az azonos nev¶ attribútumok értéke is
megegyezik.
Ez az alapértelmezés.

I Illesztés azonos nev¶ attribútumokkal: R [INNER | LEFT | RIGHT |


FULL] JOIN S USING (<attribútumok>)
R és S azon sorai illeszt®dnek, ahol az azonos nev¶ és <attribútumok>-ban
felsorolt attribútumok értéke is megegyezik.

I Illesztés tetsz®leges feltétellel (θ -join): R [INNER | LEFT | RIGHT |


FULL] JOIN S ON (<feltétel>)
R és S azon sorai illeszt®dnek, melyek attribútumai eleget tesznek a
megadott feltételnek.
Példák relációk összekapcsolására
Példa: Kusturica vetített lmjei és vetítési id®pontjaik
Példák relációk összekapcsolására
Példa: Kusturica vetített lmjei és vetítési id®pontjaik
SELECT cím, nap, id® FROM lm INNER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példák relációk összekapcsolására
Példa: Kusturica vetített lmjei és vetítési id®pontjaik
SELECT cím, nap, id® FROM lm INNER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Kusturica összes lmje és vetítési id®pontjaik (ha van)
Példák relációk összekapcsolására
Példa: Kusturica vetített lmjei és vetítési id®pontjaik
SELECT cím, nap, id® FROM lm INNER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Kusturica összes lmje és vetítési id®pontjaik (ha van)
SELECT cím, nap, id® FROM lm LEFT OUTER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példák relációk összekapcsolására
Példa: Kusturica vetített lmjei és vetítési id®pontjaik
SELECT cím, nap, id® FROM lm INNER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Kusturica összes lmje és vetítési id®pontjaik (ha van)
SELECT cím, nap, id® FROM lm LEFT OUTER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Vetített lmek címe, rendez®je és vetítési id®pontjaik
Példák relációk összekapcsolására
Példa: Kusturica vetített lmjei és vetítési id®pontjaik
SELECT cím, nap, id® FROM lm INNER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Kusturica összes lmje és vetítési id®pontjaik (ha van)
SELECT cím, nap, id® FROM lm LEFT OUTER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Vetített lmek címe, rendez®je és vetítési id®pontjaik
SELECT cím, rendez®, nap, id® FROM lm NATURAL INNER JOIN vetít
Példák relációk összekapcsolására
Példa: Kusturica vetített lmjei és vetítési id®pontjaik
SELECT cím, nap, id® FROM lm INNER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Kusturica összes lmje és vetítési id®pontjaik (ha van)
SELECT cím, nap, id® FROM lm LEFT OUTER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Vetített lmek címe, rendez®je és vetítési id®pontjaik
SELECT cím, rendez®, nap, id® FROM lm NATURAL INNER JOIN vetít
Példa: ugyanez USING használatával
Példák relációk összekapcsolására
Példa: Kusturica vetített lmjei és vetítési id®pontjaik
SELECT cím, nap, id® FROM lm INNER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Kusturica összes lmje és vetítési id®pontjaik (ha van)
SELECT cím, nap, id® FROM lm LEFT OUTER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Vetített lmek címe, rendez®je és vetítési id®pontjaik
SELECT cím, rendez®, nap, id® FROM lm NATURAL INNER JOIN vetít
Példa: ugyanez USING használatával
SELECT cím, rendez®, nap, id® FROM lm INNER JOIN vetít USING (lmID)
Példák relációk összekapcsolására
Példa: Kusturica vetített lmjei és vetítési id®pontjaik
SELECT cím, nap, id® FROM lm INNER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Kusturica összes lmje és vetítési id®pontjaik (ha van)
SELECT cím, nap, id® FROM lm LEFT OUTER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Vetített lmek címe, rendez®je és vetítési id®pontjaik
SELECT cím, rendez®, nap, id® FROM lm NATURAL INNER JOIN vetít
Példa: ugyanez USING használatával
SELECT cím, rendez®, nap, id® FROM lm INNER JOIN vetít USING (lmID)
Példa: Összes lm címe, rendez®je és vetítési id®pontja (ha van)
Példák relációk összekapcsolására
Példa: Kusturica vetített lmjei és vetítési id®pontjaik
SELECT cím, nap, id® FROM lm INNER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Kusturica összes lmje és vetítési id®pontjaik (ha van)
SELECT cím, nap, id® FROM lm LEFT OUTER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Vetített lmek címe, rendez®je és vetítési id®pontjaik
SELECT cím, rendez®, nap, id® FROM lm NATURAL INNER JOIN vetít
Példa: ugyanez USING használatával
SELECT cím, rendez®, nap, id® FROM lm INNER JOIN vetít USING (lmID)
Példa: Összes lm címe, rendez®je és vetítési id®pontja (ha van)
SELECT cím, rendez®, nap, id® FROM lm NATURAL LEFT OUTER JOIN
vetít
Példák relációk összekapcsolására
Példa: Kusturica vetített lmjei és vetítési id®pontjaik
SELECT cím, nap, id® FROM lm INNER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Kusturica összes lmje és vetítési id®pontjaik (ha van)
SELECT cím, nap, id® FROM lm LEFT OUTER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Vetített lmek címe, rendez®je és vetítési id®pontjaik
SELECT cím, rendez®, nap, id® FROM lm NATURAL INNER JOIN vetít
Példa: ugyanez USING használatával
SELECT cím, rendez®, nap, id® FROM lm INNER JOIN vetít USING (lmID)
Példa: Összes lm címe, rendez®je és vetítési id®pontja (ha van)
SELECT cím, rendez®, nap, id® FROM lm NATURAL LEFT OUTER JOIN
vetít
Példa: Az összes lm-mozi pár
Példák relációk összekapcsolására
Példa: Kusturica vetített lmjei és vetítési id®pontjaik
SELECT cím, nap, id® FROM lm INNER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Kusturica összes lmje és vetítési id®pontjaik (ha van)
SELECT cím, nap, id® FROM lm LEFT OUTER JOIN vetít ON rendez®='E.
Kusturica' AND lm.lmID=vetít.lmID
Példa: Vetített lmek címe, rendez®je és vetítési id®pontjaik
SELECT cím, rendez®, nap, id® FROM lm NATURAL INNER JOIN vetít
Példa: ugyanez USING használatával
SELECT cím, rendez®, nap, id® FROM lm INNER JOIN vetít USING (lmID)
Példa: Összes lm címe, rendez®je és vetítési id®pontja (ha van)
SELECT cím, rendez®, nap, id® FROM lm NATURAL LEFT OUTER JOIN
vetít
Példa: Az összes lm-mozi pár
SELECT * FROM lm CROSS JOIN mozi
DML utasítások  INSERT
Sorokat a relációba az INSERT utasítással szúrhatunk be.
Szintakszis: INSERT INTO <reláció> (<attrib1 >, . . . , <attribn >) VALUES
(<érték1 >, . . . , <értékn >)
DML utasítások  INSERT
Sorokat a relációba az INSERT utasítással szúrhatunk be.
Szintakszis: INSERT INTO <reláció> (<attrib1 >, . . . , <attribn >) VALUES
(<érték1 >, . . . , <értékn >)
Hatása: a <reláció> relációba egy új sor kerül, amiben <attrib1 > attribútum
értéke <érték1 >, stb. A nem meghatározott érték¶ attribútumok a reláció
létrehozásakor az attribútumhoz rendelt alapértelmezett értéket veszik fel.
DML utasítások  INSERT
Sorokat a relációba az INSERT utasítással szúrhatunk be.
Szintakszis: INSERT INTO <reláció> (<attrib1 >, . . . , <attribn >) VALUES
(<érték1 >, . . . , <értékn >)
Hatása: a <reláció> relációba egy új sor kerül, amiben <attrib1 > attribútum
értéke <érték1 >, stb. A nem meghatározott érték¶ attribútumok a reláció
létrehozásakor az attribútumhoz rendelt alapértelmezett értéket veszik fel.
Példa: Egy új lm felvétele
INSERT INTO lm (cím, rendez®) VALUES ('Egy csodálatos elme', 'Ron
Howard')
DML utasítások  INSERT
Sorokat a relációba az INSERT utasítással szúrhatunk be.
Szintakszis: INSERT INTO <reláció> (<attrib1 >, . . . , <attribn >) VALUES
(<érték1 >, . . . , <értékn >)
Hatása: a <reláció> relációba egy új sor kerül, amiben <attrib1 > attribútum
értéke <érték1 >, stb. A nem meghatározott érték¶ attribútumok a reláció
létrehozásakor az attribútumhoz rendelt alapértelmezett értéket veszik fel.
Példa: Egy új lm felvétele
INSERT INTO lm (cím, rendez®) VALUES ('Egy csodálatos elme', 'Ron
Howard')
Megjegyzés:

I a lmID mez® az alapértelmezett értékét kapja, de egy trigger (kés®bb lesz)


segítségével akár automatikusan növekv® számozást is létrehozhatunk.
DML utasítások  INSERT
Sorokat a relációba az INSERT utasítással szúrhatunk be.
Szintakszis: INSERT INTO <reláció> (<attrib1 >, . . . , <attribn >) VALUES
(<érték1 >, . . . , <értékn >)
Hatása: a <reláció> relációba egy új sor kerül, amiben <attrib1 > attribútum
értéke <érték1 >, stb. A nem meghatározott érték¶ attribútumok a reláció
létrehozásakor az attribútumhoz rendelt alapértelmezett értéket veszik fel.
Példa: Egy új lm felvétele
INSERT INTO lm (cím, rendez®) VALUES ('Egy csodálatos elme', 'Ron
Howard')
Megjegyzés:

I a lmID mez® az alapértelmezett értékét kapja, de egy trigger (kés®bb lesz)


segítségével akár automatikusan növekv® számozást is létrehozhatunk.

I Ha az összes attribútum értékét megadjuk, akkor nem kell ®ket felsorolni,


ebben az esetben a beadott értékek a default attribútumsorrend szerint
lesznek hozzárendelve az attribútumokhoz
DML utasítások  INSERT folyt.

I a beszúrt adatokat egy alkérdésb®l is vehetjük:


Ha van egy lmregi(lmID, cím, rendez®) tábla és azokat az adatokat
szeretnénk átvinni a lm táblába, amik ott nem szerepelnek:
DML utasítások  INSERT folyt.

I a beszúrt adatokat egy alkérdésb®l is vehetjük:


Ha van egy lmregi(lmID, cím, rendez®) tábla és azokat az adatokat
szeretnénk átvinni a lm táblába, amik ott nem szerepelnek:
INSERT INTO lm
SELECT lmregi.lmID, lmregi.cím, lmregi.rendez®
FROM lmregi
WHERE lmregi.lmID NOT IN
(SELECT lmID FROM lm)
DML utasítások  UPDATE
Sorokat a relációban az UPDATE utasítással módosíthatunk.
Szintakszis: UPDATE <reláció> SET <attrib1 >=<érték1 >, . . . ,
<attribn >=<értékn > WHERE <feltétel>
DML utasítások  UPDATE
Sorokat a relációban az UPDATE utasítással módosíthatunk.
Szintakszis: UPDATE <reláció> SET <attrib1 >=<érték1 >, . . . ,
<attribn >=<értékn > WHERE <feltétel>
Hatása: a <reláció> reláció minden sorában, amelyik illeszkedik a <feltétel>
feltételre <attribi > értéke <értéki > lesz.
DML utasítások  UPDATE
Sorokat a relációban az UPDATE utasítással módosíthatunk.
Szintakszis: UPDATE <reláció> SET <attrib1 >=<érték1 >, . . . ,
<attribn >=<értékn > WHERE <feltétel>
Hatása: a <reláció> reláció minden sorában, amelyik illeszkedik a <feltétel>
feltételre <attribi > értéke <értéki > lesz.
Példa: Az el®bb beszúrt rendez® nevének átírása rövidített alakba
DML utasítások  UPDATE
Sorokat a relációban az UPDATE utasítással módosíthatunk.
Szintakszis: UPDATE <reláció> SET <attrib1 >=<érték1 >, . . . ,
<attribn >=<értékn > WHERE <feltétel>
Hatása: a <reláció> reláció minden sorában, amelyik illeszkedik a <feltétel>
feltételre <attribi > értéke <értéki > lesz.
Példa: Az el®bb beszúrt rendez® nevének átírása rövidített alakba
UPDATE lm SET rendez®='R. Howard' WHERE rendez®='Ron Howard'
DML utasítások  DELETE
Sorokat egy relációból a DELETE utasítással törölhetünk.
Szintakszis: DELETE FROM <reláció> WHERE <feltétel>
DML utasítások  DELETE
Sorokat egy relációból a DELETE utasítással törölhetünk.
Szintakszis: DELETE FROM <reláció> WHERE <feltétel>
Hatása: a <reláció> reláció feltételre illeszked® sorait törli.
DML utasítások  DELETE
Sorokat egy relációból a DELETE utasítással törölhetünk.
Szintakszis: DELETE FROM <reláció> WHERE <feltétel>
Hatása: a <reláció> reláció feltételre illeszked® sorait törli.
Megjegyzés: a WHERE <feltétel> rész elhagyása esetén a reláció összes sorát
törli.
DML utasítások  DELETE
Sorokat egy relációból a DELETE utasítással törölhetünk.
Szintakszis: DELETE FROM <reláció> WHERE <feltétel>
Hatása: a <reláció> reláció feltételre illeszked® sorait törli.
Megjegyzés: a WHERE <feltétel> rész elhagyása esetén a reláció összes sorát
törli.
Példa: Azon lmek törlése, amiknek a rendez®je E. K. monogrammú
DELETE FROM lm WHERE rendez® LIKE 'E.% K%'
SQL Data Denition Language

I Séma létrehozása

I Séma törlése

I Séma módosítása
SQL Data Denition Language

I Séma létrehozása

I Séma törlése

I Séma módosítása

I Indexek létrehozása és kezelése (az indexekr®l kés®bb lesz szó részletesen)


SQL Data Denition Language

I Séma létrehozása

I Séma törlése

I Séma módosítása

I Indexek létrehozása és kezelése (az indexekr®l kés®bb lesz szó részletesen)

I Nézetek létrehozása
SQL Data Denition Language

I Séma létrehozása

I Séma törlése

I Séma módosítása

I Indexek létrehozása és kezelése (az indexekr®l kés®bb lesz szó részletesen)

I Nézetek létrehozása

I Kényszerek létrehozása
SQL Data Denition Language

I Séma létrehozása

I Séma törlése

I Séma módosítása

I Indexek létrehozása és kezelése (az indexekr®l kés®bb lesz szó részletesen)

I Nézetek létrehozása

I Kényszerek létrehozása

I Triggerek (kicsit)

A triggerek már az SQL3-hoz tartoznak, a triggerek segítségével az adatbázis


valamely változásakor egy tárolt eljárást hajthatunk végre.
Relációk létrehozása
Relációk létrehozására a CREATE TABLE használandó.
Minden attribútumnak típust és a reláción belül egyedi nevet kell adni.
Relációk létrehozása
Relációk létrehozására a CREATE TABLE használandó.
Minden attribútumnak típust és a reláción belül egyedi nevet kell adni.
Szükség esetén megadható alapértelmezett érték is (DEFAULT kulcsszóval),
melyeket az attribútum azon sorokban vesz fel, ahol a beszúráskor nem adtuk
meg a konkrét értékét.
Relációk létrehozása
Relációk létrehozására a CREATE TABLE használandó.
Minden attribútumnak típust és a reláción belül egyedi nevet kell adni.
Szükség esetén megadható alapértelmezett érték is (DEFAULT kulcsszóval),
melyeket az attribútum azon sorokban vesz fel, ahol a beszúráskor nem adtuk
meg a konkrét értékét.
Lehet®ség van arra is, hogy kényszereket deniáljunk az attribútumokra (pl.
attribútum nem NULL, els®dleges kulcs, idegen kulcs, stb.), ezekr®l kés®bb lesz
szó.
Relációk létrehozása
Relációk létrehozására a CREATE TABLE használandó.
Minden attribútumnak típust és a reláción belül egyedi nevet kell adni.
Szükség esetén megadható alapértelmezett érték is (DEFAULT kulcsszóval),
melyeket az attribútum azon sorokban vesz fel, ahol a beszúráskor nem adtuk
meg a konkrét értékét.
Lehet®ség van arra is, hogy kényszereket deniáljunk az attribútumokra (pl.
attribútum nem NULL, els®dleges kulcs, idegen kulcs, stb.), ezekr®l kés®bb lesz
szó.
Szintakszis:
CREATE TABLE <relációnév> (
<attrib1 > <adattípus1 > [DEFAULT <érték>], . . .
<attribn > <adattípusn > [DEFAULT <érték>]
)
Relációk létrehozása folyt.
Példa: Film reláció létrehozása
CREATE TABLE lm(
lmID number(5),
cím varchar(50),
rendez® char(30),
év number(4),
hossz number(3) DEFAULT 90)
Relációk létrehozása folyt.
Példa: Film reláció létrehozása
CREATE TABLE lm(
lmID number(5),
cím varchar(50),
rendez® char(30),
év number(4),
hossz number(3) DEFAULT 90)
A lehetséges adattípusok függenek az adatbáziskezel®t®l.
Relációk létrehozása folyt.
Példa: Film reláció létrehozása
CREATE TABLE lm(
lmID number(5),
cím varchar(50),
rendez® char(30),
év number(4),
hossz number(3) DEFAULT 90)
A lehetséges adattípusok függenek az adatbáziskezel®t®l.
A f®bb típusok:
char(n) n hosszú karaktersorozat
varchar(n) maximum n hosszú karaktersorozat
number(n,m) n hosszú, m tizedesjegy¶ szám
date dátum
Relációk törlése, módosítása
Relációk törlésére a DROP TABLE használandó.
Szintaxis: DROP TABLE <relációnév>
Relációk törlése, módosítása
Relációk törlésére a DROP TABLE használandó.
Szintaxis: DROP TABLE <relációnév>
Példa: Film reláció törlése :-(
DROP TABLE lm
Relációk törlése, módosítása
Relációk törlésére a DROP TABLE használandó.
Szintaxis: DROP TABLE <relációnév>
Példa: Film reláció törlése :-(
DROP TABLE lm
Relációk módosítására az ALTER TABLE használandó.
Relációk törlése, módosítása
Relációk törlésére a DROP TABLE használandó.
Szintaxis: DROP TABLE <relációnév>
Példa: Film reláció törlése :-(
DROP TABLE lm
Relációk módosítására az ALTER TABLE használandó.
Lehet®ség van új attribútum deniálására (ADD), attribútum törlésére
(DROP), attribútum adattípusának módosítására (MODIFY ), kényszerek
módosítására, alapértelmezett érték megadására.
Mindezek csak a jelenlegi adatokkal konzisztensen végezhet®k el.
Például nem törölhet® olyan attribútum, amire még van hivatkozás.
Relációk törlése, módosítása
Relációk törlésére a DROP TABLE használandó.
Szintaxis: DROP TABLE <relációnév>
Példa: Film reláció törlése :-(
DROP TABLE lm
Relációk módosítására az ALTER TABLE használandó.
Lehet®ség van új attribútum deniálására (ADD), attribútum törlésére
(DROP), attribútum adattípusának módosítására (MODIFY ), kényszerek
módosítására, alapértelmezett érték megadására.
Mindezek csak a jelenlegi adatokkal konzisztensen végezhet®k el.
Például nem törölhet® olyan attribútum, amire még van hivatkozás.
Szintaxis: ALTER TABLE <relációnév> <opciók>
Relációk törlése, módosítása
Relációk törlésére a DROP TABLE használandó.
Szintaxis: DROP TABLE <relációnév>
Példa: Film reláció törlése :-(
DROP TABLE lm
Relációk módosítására az ALTER TABLE használandó.
Lehet®ség van új attribútum deniálására (ADD), attribútum törlésére
(DROP), attribútum adattípusának módosítására (MODIFY ), kényszerek
módosítására, alapértelmezett érték megadására.
Mindezek csak a jelenlegi adatokkal konzisztensen végezhet®k el.
Például nem törölhet® olyan attribútum, amire még van hivatkozás.
Szintaxis: ALTER TABLE <relációnév> <opciók>
Példa: Vetít relációhoz helyár hozzáadása
ALTER TABLE vetít ADD helyár number(4)
Relációk törlése, módosítása
Relációk törlésére a DROP TABLE használandó.
Szintaxis: DROP TABLE <relációnév>
Példa: Film reláció törlése :-(
DROP TABLE lm
Relációk módosítására az ALTER TABLE használandó.
Lehet®ség van új attribútum deniálására (ADD), attribútum törlésére
(DROP), attribútum adattípusának módosítására (MODIFY ), kényszerek
módosítására, alapértelmezett érték megadására.
Mindezek csak a jelenlegi adatokkal konzisztensen végezhet®k el.
Például nem törölhet® olyan attribútum, amire még van hivatkozás.
Szintaxis: ALTER TABLE <relációnév> <opciók>
Példa: Vetít relációhoz helyár hozzáadása
ALTER TABLE vetít ADD helyár number(4)
Példa: Mozi relációból a város eltávolítása
ALTER TABLE mozi DROP város
Relációk törlése, módosítása
Relációk törlésére a DROP TABLE használandó.
Szintaxis: DROP TABLE <relációnév>
Példa: Film reláció törlése :-(
DROP TABLE lm
Relációk módosítására az ALTER TABLE használandó.
Lehet®ség van új attribútum deniálására (ADD), attribútum törlésére
(DROP), attribútum adattípusának módosítására (MODIFY ), kényszerek
módosítására, alapértelmezett érték megadására.
Mindezek csak a jelenlegi adatokkal konzisztensen végezhet®k el.
Például nem törölhet® olyan attribútum, amire még van hivatkozás.
Szintaxis: ALTER TABLE <relációnév> <opciók>
Példa: Vetít relációhoz helyár hozzáadása
ALTER TABLE vetít ADD helyár number(4)
Példa: Mozi relációból a város eltávolítása
ALTER TABLE mozi DROP város
Példa: Ha a helyárakat ezentúl dollárban számoljuk . . .
ALTER TABLE vetít MODIFY helyár number(4,2)
Indexek
Egy reláció bizonyos attribútumaira indexet készíttethetünk: ez egy
adatszerkezetet jelent, ami olyan sorok gyors keresését teszi lehet®vé amelyek az
adott attribútumokon valami adott értékeket vesznek fel.
Indexek
Egy reláció bizonyos attribútumaira indexet készíttethetünk: ez egy
adatszerkezetet jelent, ami olyan sorok gyors keresését teszi lehet®vé amelyek az
adott attribútumokon valami adott értékeket vesznek fel.
SQL2-nek sem része, de gyakori, ezért tanuljuk.
Szintaxis: CREATE INDEX <indexnév> ON <relációnév>(attribútumok listája)
Indexek
Egy reláció bizonyos attribútumaira indexet készíttethetünk: ez egy
adatszerkezetet jelent, ami olyan sorok gyors keresését teszi lehet®vé amelyek az
adott attribútumokon valami adott értékeket vesznek fel.
SQL2-nek sem része, de gyakori, ezért tanuljuk.
Szintaxis: CREATE INDEX <indexnév> ON <relációnév>(attribútumok listája)

Példa: index a lmcím, rendez® párra


CREATE INDEX cím-rend ON lm(cím, rendez®)
Indexek
Egy reláció bizonyos attribútumaira indexet készíttethetünk: ez egy
adatszerkezetet jelent, ami olyan sorok gyors keresését teszi lehet®vé amelyek az
adott attribútumokon valami adott értékeket vesznek fel.
SQL2-nek sem része, de gyakori, ezért tanuljuk.
Szintaxis: CREATE INDEX <indexnév> ON <relációnév>(attribútumok listája)

Példa: index a lmcím, rendez® párra


CREATE INDEX cím-rend ON lm(cím, rendez®)

Ha meguntuk, el lehet dobni: DROP INDEX cím-rend


Indexek
Egy reláció bizonyos attribútumaira indexet készíttethetünk: ez egy
adatszerkezetet jelent, ami olyan sorok gyors keresését teszi lehet®vé amelyek az
adott attribútumokon valami adott értékeket vesznek fel.
SQL2-nek sem része, de gyakori, ezért tanuljuk.
Szintaxis: CREATE INDEX <indexnév> ON <relációnév>(attribútumok listája)

Példa: index a lmcím, rendez® párra


CREATE INDEX cím-rend ON lm(cím, rendez®)

Ha meguntuk, el lehet dobni: DROP INDEX cím-rend

I el®ny: gyors keresés lehetséges az index segítségével


Indexek
Egy reláció bizonyos attribútumaira indexet készíttethetünk: ez egy
adatszerkezetet jelent, ami olyan sorok gyors keresését teszi lehet®vé amelyek az
adott attribútumokon valami adott értékeket vesznek fel.
SQL2-nek sem része, de gyakori, ezért tanuljuk.
Szintaxis: CREATE INDEX <indexnév> ON <relációnév>(attribútumok listája)

Példa: index a lmcím, rendez® párra


CREATE INDEX cím-rend ON lm(cím, rendez®)

Ha meguntuk, el lehet dobni: DROP INDEX cím-rend

I el®ny: gyors keresés lehetséges az index segítségével

I hátrány: az adatszerkezetet karban kell tartani, így lassítja a beszúrást,


törlést, módosítást
Indexek
Egy reláció bizonyos attribútumaira indexet készíttethetünk: ez egy
adatszerkezetet jelent, ami olyan sorok gyors keresését teszi lehet®vé amelyek az
adott attribútumokon valami adott értékeket vesznek fel.
SQL2-nek sem része, de gyakori, ezért tanuljuk.
Szintaxis: CREATE INDEX <indexnév> ON <relációnév>(attribútumok listája)

Példa: index a lmcím, rendez® párra


CREATE INDEX cím-rend ON lm(cím, rendez®)

Ha meguntuk, el lehet dobni: DROP INDEX cím-rend

I el®ny: gyors keresés lehetséges az index segítségével

I hátrány: az adatszerkezetet karban kell tartani, így lassítja a beszúrást,


törlést, módosítást

I az a fontos, hogy mib®l van több, módosításból vagy lekérdezésb®l?


Indexek
Egy reláció bizonyos attribútumaira indexet készíttethetünk: ez egy
adatszerkezetet jelent, ami olyan sorok gyors keresését teszi lehet®vé amelyek az
adott attribútumokon valami adott értékeket vesznek fel.
SQL2-nek sem része, de gyakori, ezért tanuljuk.
Szintaxis: CREATE INDEX <indexnév> ON <relációnév>(attribútumok listája)

Példa: index a lmcím, rendez® párra


CREATE INDEX cím-rend ON lm(cím, rendez®)

Ha meguntuk, el lehet dobni: DROP INDEX cím-rend

I el®ny: gyors keresés lehetséges az index segítségével

I hátrány: az adatszerkezetet karban kell tartani, így lassítja a beszúrást,


törlést, módosítást

I az a fontos, hogy mib®l van több, módosításból vagy lekérdezésb®l?

I néha a rendszer magától létrehoz indexet (lásd kulcsok)


Nézetek létrehozása
Permanensen létez®, származtatott relációt hoz létre, amire hivatkozhatunk
lekérdezésekkor is.
Nézetek létrehozása
Permanensen létez®, származtatott relációt hoz létre, amire hivatkozhatunk
lekérdezésekkor is.

Szintaxis: CREATE VIEW <új reláció neve> AS <lekérdezés>


Nézetek létrehozása
Permanensen létez®, származtatott relációt hoz létre, amire hivatkozhatunk
lekérdezésekkor is.

Szintaxis: CREATE VIEW <új reláció neve> AS <lekérdezés>

Példa: Csináljunk egy nézetet Almodovar lmjeib®l


CREATE VIEW Almodovarlm AS
SELECT lmID, cím
FROM lm
WHERE rendez®='P. Almodovar'
Nézetek létrehozása
Permanensen létez®, származtatott relációt hoz létre, amire hivatkozhatunk
lekérdezésekkor is.

Szintaxis: CREATE VIEW <új reláció neve> AS <lekérdezés>

Példa: Csináljunk egy nézetet Almodovar lmjeib®l


CREATE VIEW Almodovarlm AS
SELECT lmID, cím
FROM lm
WHERE rendez®='P. Almodovar'

I A VIEW-val létrehozott reláció aszerint változik, ahogyan a lm tábla


változik
Nézetek létrehozása
Permanensen létez®, származtatott relációt hoz létre, amire hivatkozhatunk
lekérdezésekkor is.

Szintaxis: CREATE VIEW <új reláció neve> AS <lekérdezés>

Példa: Csináljunk egy nézetet Almodovar lmjeib®l


CREATE VIEW Almodovarlm AS
SELECT lmID, cím
FROM lm
WHERE rendez®='P. Almodovar'

I A VIEW-val létrehozott reláció aszerint változik, ahogyan a lm tábla


változik (a nézettábla nem lesz alapreláció, nem olyan, mintha CREATE
TABLE-vel csináltam volna és utána feltöltöttem volna adatokkal)
Nézetek létrehozása
Permanensen létez®, származtatott relációt hoz létre, amire hivatkozhatunk
lekérdezésekkor is.

Szintaxis: CREATE VIEW <új reláció neve> AS <lekérdezés>

Példa: Csináljunk egy nézetet Almodovar lmjeib®l


CREATE VIEW Almodovarlm AS
SELECT lmID, cím
FROM lm
WHERE rendez®='P. Almodovar'

I A VIEW-val létrehozott reláció aszerint változik, ahogyan a lm tábla


változik (a nézettábla nem lesz alapreláció, nem olyan, mintha CREATE
TABLE-vel csináltam volna és utána feltöltöttem volna adatokkal)

I de változtathatók az adatok korlátozottan a nézettáblán keresztül is


Nézetek létrehozása folyt.

I Lekérdezésben használható, ugyanúgy ahogy az alaprelációk:


Nézetek létrehozása folyt.

I Lekérdezésben használható, ugyanúgy ahogy az alaprelációk:


Példa: Milyen Almodovar lmeket vetítenek most?
SELECT cím FROM Almodovarlm NATURAL INNER JOIN vetít
Nézetek létrehozása folyt.

I Lekérdezésben használható, ugyanúgy ahogy az alaprelációk:


Példa: Milyen Almodovar lmeket vetítenek most?
SELECT cím FROM Almodovarlm NATURAL INNER JOIN vetít

I Egy ilyen kérdés kiértékelésekor az Almodovarlm nézettábla helyére a


lekérdezésfeldolgozó berakja az ®t deniáló SELECT-et
Nézetek létrehozása folyt.

I Lekérdezésben használható, ugyanúgy ahogy az alaprelációk:


Példa: Milyen Almodovar lmeket vetítenek most?
SELECT cím FROM Almodovarlm NATURAL INNER JOIN vetít

I Egy ilyen kérdés kiértékelésekor az Almodovarlm nézettábla helyére a


lekérdezésfeldolgozó berakja az ®t deniáló SELECT-et

I Lehet új attribútumnevet adni a nézettáblában


Nézetek létrehozása folyt.

I Lekérdezésben használható, ugyanúgy ahogy az alaprelációk:


Példa: Milyen Almodovar lmeket vetítenek most?
SELECT cím FROM Almodovarlm NATURAL INNER JOIN vetít

I Egy ilyen kérdés kiértékelésekor az Almodovarlm nézettábla helyére a


lekérdezésfeldolgozó berakja az ®t deniáló SELECT-et

I Lehet új attribútumnevet adni a nézettáblában

Megszüntetése: DROP VIEW Almodovarlm


Nézetek létrehozása folyt.

I Lekérdezésben használható, ugyanúgy ahogy az alaprelációk:


Példa: Milyen Almodovar lmeket vetítenek most?
SELECT cím FROM Almodovarlm NATURAL INNER JOIN vetít

I Egy ilyen kérdés kiértékelésekor az Almodovarlm nézettábla helyére a


lekérdezésfeldolgozó berakja az ®t deniáló SELECT-et

I Lehet új attribútumnevet adni a nézettáblában

Megszüntetése: DROP VIEW Almodovarlm

Ezután már nem lehet olyan lekérdezést írni, amiben ez szerepel.


Kényszerek
Kényszerek csoportosítása
Kényszer típusa szerint

I Els®dleges kulcs (PRIMARY KEY )

I Egyérték¶ségi megszorítások (UNIQUE)

I Hivatkozási épség, idegen kulcs (FOREIGN KEY )

I NULL érték tiltása (NOT NULL)


Kényszerek
Kényszerek csoportosítása
Kényszer típusa szerint

I Els®dleges kulcs (PRIMARY KEY )

I Egyérték¶ségi megszorítások (UNIQUE)

I Hivatkozási épség, idegen kulcs (FOREIGN KEY )

I NULL érték tiltása (NOT NULL)

I Értékkészlet (CHECK)
I attribútumra vonatkozó feltétel
I sorra vonatkozó feltétel
I globális feltétel
Els®dleges kulcs, egyediség
Attribútum(ok) els®dleges kulccsá tétele: PRIMARY KEY
Attribútum(ok) egyediségének megkövetelése: UNIQUE
Els®dleges kulcs, egyediség
Attribútum(ok) els®dleges kulccsá tétele: PRIMARY KEY
Attribútum(ok) egyediségének megkövetelése: UNIQUE
Mindkét esetben az adott attribútumoknak egyértelm¶en azonosítaniuk kell a
sort.
Els®dleges kulcs, egyediség
Attribútum(ok) els®dleges kulccsá tétele: PRIMARY KEY
Attribútum(ok) egyediségének megkövetelése: UNIQUE
Mindkét esetben az adott attribútumoknak egyértelm¶en azonosítaniuk kell a
sort.
Különbség: PRIMARY KEY csak egy lehet, idegen kulcs csak erre hivatkozhat,
sok rendszer automatikusan indexet hoz rá létre.
Els®dleges kulcs, egyediség
Attribútum(ok) els®dleges kulccsá tétele: PRIMARY KEY
Attribútum(ok) egyediségének megkövetelése: UNIQUE
Mindkét esetben az adott attribútumoknak egyértelm¶en azonosítaniuk kell a
sort.
Különbség: PRIMARY KEY csak egy lehet, idegen kulcs csak erre hivatkozhat,
sok rendszer automatikusan indexet hoz rá létre.
Szintaxis:
a tábla létrehozásakor, az attribútum deníciójában:
<attribútum> <típus> { PRIMARY KEY | UNIQUE }
Els®dleges kulcs, egyediség
Attribútum(ok) els®dleges kulccsá tétele: PRIMARY KEY
Attribútum(ok) egyediségének megkövetelése: UNIQUE
Mindkét esetben az adott attribútumoknak egyértelm¶en azonosítaniuk kell a
sort.
Különbség: PRIMARY KEY csak egy lehet, idegen kulcs csak erre hivatkozhat,
sok rendszer automatikusan indexet hoz rá létre.
Szintaxis:
a tábla létrehozásakor, az attribútum deníciójában:
<attribútum> <típus> { PRIMARY KEY | UNIQUE }

relációdeníción belül, önállóan, külön sorban:


{ PRIMARY KEY | UNIQUE } (<attrib1 >,. . . ,<attribk > )
Els®dleges kulcs, egyediség
Attribútum(ok) els®dleges kulccsá tétele: PRIMARY KEY
Attribútum(ok) egyediségének megkövetelése: UNIQUE
Mindkét esetben az adott attribútumoknak egyértelm¶en azonosítaniuk kell a
sort.
Különbség: PRIMARY KEY csak egy lehet, idegen kulcs csak erre hivatkozhat,
sok rendszer automatikusan indexet hoz rá létre.
Szintaxis:
a tábla létrehozásakor, az attribútum deníciójában:
<attribútum> <típus> { PRIMARY KEY | UNIQUE }

relációdeníción belül, önállóan, külön sorban:


{ PRIMARY KEY | UNIQUE } (<attrib1 >,. . . ,<attribk > )

Ilyenkor (<attrib1 >, . . . ,<attribk > ) együtt a kulcs. Ha egy kulcs több
attribútumból áll, akkor csak így lehet megadni.
Els®dleges kulcs, egyediség
Attribútum(ok) els®dleges kulccsá tétele: PRIMARY KEY
Attribútum(ok) egyediségének megkövetelése: UNIQUE
Mindkét esetben az adott attribútumoknak egyértelm¶en azonosítaniuk kell a
sort.
Különbség: PRIMARY KEY csak egy lehet, idegen kulcs csak erre hivatkozhat,
sok rendszer automatikusan indexet hoz rá létre.
Szintaxis:
a tábla létrehozásakor, az attribútum deníciójában:
<attribútum> <típus> { PRIMARY KEY | UNIQUE }

relációdeníción belül, önállóan, külön sorban:


{ PRIMARY KEY | UNIQUE } (<attrib1 >,. . . ,<attribk > )

Ilyenkor (<attrib1 >, . . . ,<attribk > ) együtt a kulcs. Ha egy kulcs több
attribútumból áll, akkor csak így lehet megadni.
A kulcsfeltételeket a rendszer minden beszúrás és módosítás el®tt ellen®rzi, ezért
van automatikusan index rájuk. És persze emiatt óvatosan kell a kulcsok
megadásával bánni, mert nagyon lelassíthatják az adatmódosításokat.
Idegen kulcs
A hivatkozási épség f® eszköze az SQL-ben.
Idegen kulcs
A hivatkozási épség f® eszköze az SQL-ben.
Másik reláció els®dleges kulcsára hivatkozás. Kulcsszavak: FOREIGN KEY,
REFERENCES
Idegen kulcs
A hivatkozási épség f® eszköze az SQL-ben.
Másik reláció els®dleges kulcsára hivatkozás. Kulcsszavak: FOREIGN KEY,
REFERENCES
Szintaxis:
attribútum deníciójában:
<attribútum> <típus> REFERENCES <hivatkozott reláció>(<hivatkozott
attribútum>)
Idegen kulcs
A hivatkozási épség f® eszköze az SQL-ben.
Másik reláció els®dleges kulcsára hivatkozás. Kulcsszavak: FOREIGN KEY,
REFERENCES
Szintaxis:
attribútum deníciójában:
<attribútum> <típus> REFERENCES <hivatkozott reláció>(<hivatkozott
attribútum>)
relációdeníción belül, önállóan, külön sorban:
FOREIGN KEY <attribútumok>
REFERENCES <hivatkozott reláció>(<hivatkozott
attribútumok>)
Idegen kulcs
A hivatkozási épség f® eszköze az SQL-ben.
Másik reláció els®dleges kulcsára hivatkozás. Kulcsszavak: FOREIGN KEY,
REFERENCES
Szintaxis:
attribútum deníciójában:
<attribútum> <típus> REFERENCES <hivatkozott reláció>(<hivatkozott
attribútum>)
relációdeníción belül, önállóan, külön sorban:
FOREIGN KEY <attribútumok>
REFERENCES <hivatkozott reláció>(<hivatkozott
attribútumok>)
A FOREIGN KEY kulcsszó után álló attribútumokat nevezzük idegen
kulcsoknak.
A fenti deklaráció jelentése: ha létezik egy sor a relációban, ahol az idegen
kulcsban lev® attribútumok valami adott értékeket vesznek fel, akkor léteznie
kell a hivatkozott relációban is egy olyan sornak, ahol a hivatkozott
attribútumok értékei ugyanezek.
Idegen kulcs folyt.
Kell, hogy a hivatkozott attribútumok els®dleges kulcsot alkossanak a
hivatkozott relációban.
Idegen kulcs folyt.
Kell, hogy a hivatkozott attribútumok els®dleges kulcsot alkossanak a
hivatkozott relációban.
Az idegen kulcs deklarálása után záradékban megadható, mi történjen, ha a
hivatkozott mez® megváltozik, törl®dik, illetve ha a hivatkozó mez®
megváltozna. Lehet®ség van a változás/törlés megtiltására vagy a hivatkozó
mez® kijavítására is.
NULLitás
A NOT NULL kulcsszóval megtilthatjuk egy attribútum esetében a NULL
(ismeretlen, nem létez®) érték megadását.
Ezt használva mindenképpen valamilyen érték kerül az attribútum valamennyi
sorába, ezért csak kötelez®en megadandó attribútumok esetén használjuk!
NULLitás
A NOT NULL kulcsszóval megtilthatjuk egy attribútum esetében a NULL
(ismeretlen, nem létez®) érték megadását.
Ezt használva mindenképpen valamilyen érték kerül az attribútum valamennyi
sorába, ezért csak kötelez®en megadandó attribútumok esetén használjuk!
Szintaxis: az attribútum deníciójában:
<attribútum> <típus> NOT NULL
Értékkészlet meghatározása
Attribútum által felvehet® értékek halmazát a CHECK kulcsszóval
korlátozhatjuk.
Értékkészlet meghatározása
Attribútum által felvehet® értékek halmazát a CHECK kulcsszóval
korlátozhatjuk.
Szintaxis:
attribútumra vonatkozó feltétel: <attribútum> <típus> CHECK
(<feltétel>)
Értékkészlet meghatározása
Attribútum által felvehet® értékek halmazát a CHECK kulcsszóval
korlátozhatjuk.
Szintaxis:
attribútumra vonatkozó feltétel: <attribútum> <típus> CHECK
(<feltétel>)
sorra vonatkozó feltétel, relációdenícióban: CHECK (<feltétel>)
Értékkészlet meghatározása
Attribútum által felvehet® értékek halmazát a CHECK kulcsszóval
korlátozhatjuk.
Szintaxis:
attribútumra vonatkozó feltétel: <attribútum> <típus> CHECK
(<feltétel>)
sorra vonatkozó feltétel, relációdenícióban: CHECK (<feltétel>)
több relációra vonatkozó globális feltétel:
CREATE ASSERTION <kényszernév> CHECK(<feltétel>)
Értékkészlet meghatározása
Attribútum által felvehet® értékek halmazát a CHECK kulcsszóval
korlátozhatjuk.
Szintaxis:
attribútumra vonatkozó feltétel: <attribútum> <típus> CHECK
(<feltétel>)
sorra vonatkozó feltétel, relációdenícióban: CHECK (<feltétel>)
több relációra vonatkozó globális feltétel:
CREATE ASSERTION <kényszernév> CHECK(<feltétel>)
Tipikus attribútumra vonatkozó feltételek lehetnek:
értékkészlet felsorolása: <attribútum> IN (<érték1>, . . . , <értékn>)
Értékkészlet meghatározása
Attribútum által felvehet® értékek halmazát a CHECK kulcsszóval
korlátozhatjuk.
Szintaxis:
attribútumra vonatkozó feltétel: <attribútum> <típus> CHECK
(<feltétel>)
sorra vonatkozó feltétel, relációdenícióban: CHECK (<feltétel>)
több relációra vonatkozó globális feltétel:
CREATE ASSERTION <kényszernév> CHECK(<feltétel>)
Tipikus attribútumra vonatkozó feltételek lehetnek:
értékkészlet felsorolása: <attribútum> IN (<érték1>, . . . , <értékn>)
intervallum megadása: <attribútum> BETWEEN <alsó határ> AND <fels®
határ>
Értékkészlet meghatározása
Attribútum által felvehet® értékek halmazát a CHECK kulcsszóval
korlátozhatjuk.
Szintaxis:
attribútumra vonatkozó feltétel: <attribútum> <típus> CHECK
(<feltétel>)
sorra vonatkozó feltétel, relációdenícióban: CHECK (<feltétel>)
több relációra vonatkozó globális feltétel:
CREATE ASSERTION <kényszernév> CHECK(<feltétel>)
Tipikus attribútumra vonatkozó feltételek lehetnek:
értékkészlet felsorolása: <attribútum> IN (<érték1>, . . . , <értékn>)
intervallum megadása: <attribútum> BETWEEN <alsó határ> AND <fels®
határ>
De bármi állhat itt, ami WHERE után szerepelhet, akár alkérdés is.
Értékkészlet meghatározása
Attribútum által felvehet® értékek halmazát a CHECK kulcsszóval
korlátozhatjuk.
Szintaxis:
attribútumra vonatkozó feltétel: <attribútum> <típus> CHECK
(<feltétel>)
sorra vonatkozó feltétel, relációdenícióban: CHECK (<feltétel>)
több relációra vonatkozó globális feltétel:
CREATE ASSERTION <kényszernév> CHECK(<feltétel>)
Tipikus attribútumra vonatkozó feltételek lehetnek:
értékkészlet felsorolása: <attribútum> IN (<érték1>, . . . , <értékn>)
intervallum megadása: <attribútum> BETWEEN <alsó határ> AND <fels®
határ>
De bármi állhat itt, ami WHERE után szerepelhet, akár alkérdés is.
Például a vetít tábla létrehozásakor beírhatunk egy ilyen sort:
CHECK (lmID IN (SELECT lm.lmID FROM lm))
Értékkészlet meghatározása
Attribútum által felvehet® értékek halmazát a CHECK kulcsszóval
korlátozhatjuk.
Szintaxis:
attribútumra vonatkozó feltétel: <attribútum> <típus> CHECK
(<feltétel>)
sorra vonatkozó feltétel, relációdenícióban: CHECK (<feltétel>)
több relációra vonatkozó globális feltétel:
CREATE ASSERTION <kényszernév> CHECK(<feltétel>)
Tipikus attribútumra vonatkozó feltételek lehetnek:
értékkészlet felsorolása: <attribútum> IN (<érték1>, . . . , <értékn>)
intervallum megadása: <attribútum> BETWEEN <alsó határ> AND <fels®
határ>
De bármi állhat itt, ami WHERE után szerepelhet, akár alkérdés is.
Például a vetít tábla létrehozásakor beírhatunk egy ilyen sort:
CHECK (lmID IN (SELECT lm.lmID FROM lm))
Ebben az esetben a vetít tábla minden egyes változásakor leellen®rizzük, hogy
létezik-e a megfelel® lm a lm táblában.
Értékkészlet meghatározása
Attribútum által felvehet® értékek halmazát a CHECK kulcsszóval
korlátozhatjuk.
Szintaxis:
attribútumra vonatkozó feltétel: <attribútum> <típus> CHECK
(<feltétel>)
sorra vonatkozó feltétel, relációdenícióban: CHECK (<feltétel>)
több relációra vonatkozó globális feltétel:
CREATE ASSERTION <kényszernév> CHECK(<feltétel>)
Tipikus attribútumra vonatkozó feltételek lehetnek:
értékkészlet felsorolása: <attribútum> IN (<érték1>, . . . , <értékn>)
intervallum megadása: <attribútum> BETWEEN <alsó határ> AND <fels®
határ>
De bármi állhat itt, ami WHERE után szerepelhet, akár alkérdés is.
Például a vetít tábla létrehozásakor beírhatunk egy ilyen sort:
CHECK (lmID IN (SELECT lm.lmID FROM lm))
Ebben az esetben a vetít tábla minden egyes változásakor leellen®rizzük, hogy
létezik-e a megfelel® lm a lm táblában.
Baj ezzel: csak akkor ellen®rzi, ha a vetít táblával történik valami, azt simán
hagyja, hogy a lm táblából töröljek, pedig ilyenkor is elromolhat.
Értékkészlet meghatározása folyt. Erre megoldás az ASSERTION:

CREATE ASSERTION vetít-lm CHECK (


vetít.lmID IN (SELECT lm.lmID FROM lm) )
Értékkészlet meghatározása folyt. Erre megoldás az ASSERTION:

CREATE ASSERTION vetít-lm CHECK (


vetít.lmID IN (SELECT lm.lmID FROM lm) )

Ezt a rendszer minden olyan alkalommal ellen®rzi, ha vagy a vetít vagy a lm
változik.
Értékkészlet meghatározása folyt. Erre megoldás az ASSERTION:

CREATE ASSERTION vetít-lm CHECK (


vetít.lmID IN (SELECT lm.lmID FROM lm) )

Ezt a rendszer minden olyan alkalommal ellen®rzi, ha vagy a vetít vagy a lm
változik.
Megjegyzések:

a kényszerek a CONSTRAINT kulcsszó segítségével elnevezhet®ek (a


PRIMARY KEY, CHECK elé írva)
Értékkészlet meghatározása folyt. Erre megoldás az ASSERTION:

CREATE ASSERTION vetít-lm CHECK (


vetít.lmID IN (SELECT lm.lmID FROM lm) )

Ezt a rendszer minden olyan alkalommal ellen®rzi, ha vagy a vetít vagy a lm
változik.
Megjegyzések:

a kényszerek a CONSTRAINT kulcsszó segítségével elnevezhet®ek (a


PRIMARY KEY, CHECK elé írva)
új kényszer hozzáadására, meglév® törlésére az ALTER TABLE . . . {ADD
| DROP} CONSTRAINT ad lehet®séget.
Példák kényszerekre
A lm és a vetít relációk kényszerekkel kiegészített létrehozása:
CREATE TABLE lm(
lmID number(5) PRIMARY KEY,
cím varchar(50) NOT NULL,
rendez® char(30) NOT NULL,
év number(4) CHECK (év >= 1900),
hossz number(3) DEFAULT 90 CHECK (hossz BETWEEN 1 AND 300),
szinkronizált char(1) DEFAULT 'N' CHECK (szinkronizált IN ('I','N')),
UNIQUE(cím, rendez®)
)
Példák kényszerekre
A lm és a vetít relációk kényszerekkel kiegészített létrehozása:
CREATE TABLE lm(
lmID number(5) PRIMARY KEY,
cím varchar(50) NOT NULL,
rendez® char(30) NOT NULL,
év number(4) CHECK (év >= 1900),
hossz number(3) DEFAULT 90 CHECK (hossz BETWEEN 1 AND 300),
szinkronizált char(1) DEFAULT 'N' CHECK (szinkronizált IN ('I','N')),
UNIQUE(cím, rendez®)
)
CREATE TABLE vetít(
lmID number(5) REFERENCES lm(lmID),
moziID number(3) REFERENCES mozi(moziID),
nap char(9),
id® char(5) NOT NULL,
CHECK (nap IN ('hétf®', 'kedd', 'szerda', 'csütörtök', 'péntek', 'szombat',
'vasárnap'))
)
Triggerek
SQL2: mindenféle, elég összetett CHECK feltételek, de a rendszerbe bele van
építve, hogy mikor kell ellen®riznie valami feltételt
Triggerek
SQL2: mindenféle, elég összetett CHECK feltételek, de a rendszerbe bele van
építve, hogy mikor kell ellen®riznie valami feltételt

SQL3-as szemlélet: lehet®ség van arra, hogy mi mondjuk meg, mikor legyen
ellen®rzés

Trigger:

I Mikor legyen ellen®rzés (adott relációba való beszúráskor, törléskor,


módosításkor, tranzakció végén)
Triggerek
SQL2: mindenféle, elég összetett CHECK feltételek, de a rendszerbe bele van
építve, hogy mikor kell ellen®riznie valami feltételt

SQL3-as szemlélet: lehet®ség van arra, hogy mi mondjuk meg, mikor legyen
ellen®rzés

Trigger:

I Mikor legyen ellen®rzés (adott relációba való beszúráskor, törléskor,


módosításkor, tranzakció végén)

I Mi legyen a feltétel, amit ekkor ellen®rzünk?


Triggerek
SQL2: mindenféle, elég összetett CHECK feltételek, de a rendszerbe bele van
építve, hogy mikor kell ellen®riznie valami feltételt

SQL3-as szemlélet: lehet®ség van arra, hogy mi mondjuk meg, mikor legyen
ellen®rzés

Trigger:

I Mikor legyen ellen®rzés (adott relációba való beszúráskor, törléskor,


módosításkor, tranzakció végén)

I Mi legyen a feltétel, amit ekkor ellen®rzünk?

I Ha a feltétel teljesül, akkor mit csináljunk? (akadályozzunk meg valamit,


csináljunk vissza valamit, vagy bármi más)
Triggerek
SQL2: mindenféle, elég összetett CHECK feltételek, de a rendszerbe bele van
építve, hogy mikor kell ellen®riznie valami feltételt

SQL3-as szemlélet: lehet®ség van arra, hogy mi mondjuk meg, mikor legyen
ellen®rzés

Trigger:

I Mikor legyen ellen®rzés (adott relációba való beszúráskor, törléskor,


módosításkor, tranzakció végén)

I Mi legyen a feltétel, amit ekkor ellen®rzünk?

I Ha a feltétel teljesül, akkor mit csináljunk? (akadályozzunk meg valamit,


csináljunk vissza valamit, vagy bármi más)

Paraméternek adható meg, hogy a kiváltó esemény el®tt/helyett/után történjen


a cselekvés és még sok más is.
Példa triggerre
Séma: GyártásIrányító(név, cím, azonosító, nettóBevétel)
Példa triggerre
Séma: GyártásIrányító(név, cím, azonosító, nettóBevétel)
CREATE TRIGGER NetBevétTrigger
AFTER UPDATE OF nettóBevétel ON GyártásIrányító
REFERENCING
OLD AS RégiSor
NEW AS Újsor
WHEN (RégiSor.nettóBevétel > Újsor.nettóBevétel)
SET nettóBevétel=Régisor.nettóBevétel
WHERE azonosító=Újsor.azonosító
FOR EACH ROW
Példa triggerre
Séma: GyártásIrányító(név, cím, azonosító, nettóBevétel)
CREATE TRIGGER NetBevétTrigger
AFTER UPDATE OF nettóBevétel ON GyártásIrányító
REFERENCING
OLD AS RégiSor
NEW AS Újsor
WHEN (RégiSor.nettóBevétel > Újsor.nettóBevétel)
SET nettóBevétel=Régisor.nettóBevétel
WHERE azonosító=Újsor.azonosító
FOR EACH ROW
=⇒ Ha valakinek csökkenne a bevétele, nem hagyjuk!
Példa triggerre
ID generálása:
CREATE TRIGGER ÚjID
AFTER INSERT ON lm
REFERENCING
NEW AS Újsor
SET Újsor.lID = 1+(SELECT MAX(lmID) FROM lm MINUS Újsor))
WHERE azonosító=Újsor.azonosító
FOR EACH ROW

You might also like