[[oktatas:adatbázis-kezelés:sql|< SQL]]
====== SQL haladó ======
* **Szerző:** Sallai András
* Copyright (c) 2012, Sallai András
* Szerkesztve: 2012, 2021, 2024
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]]
* Web: https://szit.hu
===== TOP vagy LIMIT =====
Túl sok adat jelenik meg, és szeretnénk korlátozni a megjelenő rekordok mennyiségét. Ez rendszerenként eltérő módon szokták megvalósítani. Itt most 3 rendszerre mutatunk példát.
==== Access ====
Csak az adott számú legelső rekord jelenik meg.
SELECT TOP 1 nev
FROM Szemely;
==== MySQL, Mariadb ====
SELECT nev
FROM Szemely
LIMIT 2;
==== Oracle ====
SELECT nev
FROM Szemely
WHERE ROWNUM <= 2;
===== LIKE =====
Minta alapján keresünk egy mezőben.
SELECT nev
FROM Szemely
WHERE nev LIKE 'N%';
| Like "b%" | Bármely érték, amely b betűvel kezdődik |
| Like "%b" | Bármely érték, amely b betűvel végződik |
| Like "%b%" | Bármely érték, amely b betűt tartalmaz |
| Like "b_" | Bármely 2 hosszú érték, amely b betűvel kezdődik és utána egy számjegy |
| Not Like "b%" | Bármely érték, amely nem b betűvel kezdődik |
| Not Like "%b" | Bármely érték, amely nem b betűvel végződik |
| Not Like "%b%" | Bármely érték, amely nem tartalmaz b betűt |
| Not Like "b_" | Bármely 2 hosszú érték, amely nem b betűvel kezdődik és utána egy számjegy |
Az MS Access a "%" jel helyett "*" karaktert használ helyettesítőkarakternek.
| Like "b*" | Bármely érték, amely b betűvel kezdődik |
| Like "*b" | Bármely érték, amely b betűvel végződik |
| Like "*b*" | Bármely érték, amely b betűt tartalmaz |
| Like "b?" | Bármely 2 hosszú érték, amely b betűvel kezdődik és utána egy betű |
| Like "b#" | Bármely 2 hosszú érték, amely b betűvel kezdődik és utána egy számjegy |
| Not Like "b*" | Bármely érték, amely nem b betűvel kezdődik |
| Not Like "*b" | Bármely érték, amely nem b betűvel végződik |
| Not Like "*b*" | Bármely érték, amely nem tartalmaz b betűt |
| Not Like "b?" | Bármely 2 hosszú érték, amely nem b betűvel kezdődik és utána egy betű |
| Not Like "b#" | Bármely 2 hosszú érték, amely nem b betűvel kezdődik és utána egy számjegy |
===== between =====
select 3 between 3 and 5;
Eredménye: 1
select 2 between 3 and 5;
Eredménye: 0
select 2 not between 3 and 5;
Eredménye: 1
select '2021-03-15' between '2021-02-01' and '2021-03-15';
Eredménye 1
select '2021-03-15' between '2021-02-01' and '2021-03-14';
Eredménye: 0
===== Rekord másik táblába =====
Az alábbiakban több lehetőséget is látunk másolásra:
INSERT INTO `új_tábla` VALUES (SELECT * FROM `régi_tábla`)
INSERT INTO `új_tábla` SELECT * FROM `régi_tábla`
INSERT INTO `új_tábla` SELECT * FROM `régi_tábla` WHERE mező1 = 'a'
INSERT INTO `új_tábla` (mező1, mező2, mező3)
SELECT mező1, mező2, mező3
FROM `régi_tábla` WHERE mező0 == az
INSERT INTO új_tábla
SELECT mező1, mező2, ..., mezőN, CURRENT_DATE()
FROM régi_tábla
WHERE id = 5;
===== Előző és következő rekord =====
Az azonosító mező ha szám, akkor általában automatikusan növekvő
mezőtípusnak van megadva. Ha ezekből a rekordokból törlünk egyet,
vagy többet, akkor az azonosítók sorszáma nem lesz folyamatos.
A 8 azonosító előtt nem biztos, hogy 7-s azonosító van. Vagy
a 8-as után nem biztos, hogy 9-s jön. Néha pont ezekre az azonosítokra
van szükségünk. Az alábbiakban erre látunk SQL-ben megoldást.
A 8-s előtti és utáni azonosító megkeresése:
Előző rekord:
SELECT * FROM tablanev WHERE id = (SELECT MAX(id) FROM tablanev WHERE id < 8)
Következő rekord:
SELECT * FROM tablanev WHERE id = (SELECT MIN(id) FROM tablanev WHERE id > 8)
===== Mező másolása szomszédos mezőbe =====
update teachers set
consultingRoom = room
===== Névmező felbontása =====
Egyik tábla minden elemét a másik táblába másoljuk, de nevet felbontjuk két részre.
Vezetéknév és keresztnév. Az új tábla ennek megfelelően név helyett vnev és knev
mezőket tartalmaz.
insert ujtabla
select az,
SUBSTRING_INDEX(SUBSTRING_INDEX(nev, ' ', 1), ' ', -1),
SUBSTRING_INDEX(SUBSTRING_INDEX(nev, ' ', 2), ' ', -1),
telepules, lakcim, fizetes, szuletes
from dolgozok
===== in operátor =====
Az in operátor lehetővé teszi több érték vizsgálatát where direktívában.
Legyen például egy dolgozókat tartalmazó tábla, dolgozok néven:
^ dolgozok ^^^^
^ az ^ nev ^ telepules ^ fizetes ^
| 1 | Penti Attila | Szolnok | 3850000 |
| 2 | Csendes Béla | Szeged | 2750000 |
| 3 | Lenti István | Hatvan | 2750000 |
| 4 | Rendes László | Nyíregyháza | 2750000 |
| 5 | Fényes Ilona | Szeged | 2750000 |
| 6 | Csili Gábor | Szolnok | 2750000 |
SQL scriptek:
create table dolgozok(
az int not null primary key auto_increment,
nev varchar(50),
telepules varchar(50),
fizetes double
);
insert into dolgozok
(nev, telepules, fizetes)
values
('Penti Attila', 'Szolnok', 3850000),
('Csendes Béla', 'Szeged', 2750000),
('Lenti István', 'Hatvan', 2750000),
('Rendes László', 'Nyíregyháza', 2750000),
('Fényes Ilona', 'Szeged', 2750000),
('Csili Gábor', 'Szolnok', 2750000);
Kérdezzük le a szolnoki, hatvani és szegedi dolgozók nevét:
select nev
from dolgozok
where telepules in ('Szolnok', 'Hatvan', 'Szeged');
Kérdezzük le, azoknak a dolgozóknak a neveit, akik nem szolnokiak,
hatvaniak vagy szegediek.
select nev
from dolgozok
where telepules not in ('Szolnok', 'Hatvan', 'Szeged');
===== NULL érték =====
Tábla:
dolgozok = (az, nev, telepules, fizetes)
A NULL érték beszúrása:
insert into dolgozok
(nev, telepules, fizetes)
values
('Lati Ádám', null, 3220000);
A PhpMyAdmin felületen a beviteli mező helyett a NULL jelölőnégyzetet kell bejelölni.
NULL értéket a where direktívában az is vagy is not operátorral vizsgálhatunk.
Jelenítsük meg azokat a neveket és településeket, ahol a település nem ismert,
vagyis NULL értékkel rendelkeznek:
select nev, telepules
from dolgozok
where telepules is null;
Most jelenítsük meg azokat neveket és településeket, ahol a település ismert,
vagyis nem NULL:
select nev, telepules
from dolgozok
where telepules is not null;
Null érték frissítésben:
update dolgozok
set telepules = null
where az = 2;