Tartalomjegyzék

< SQL

SQL haladó

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;