[[oktatas:adatbázis-kezelés:sql|< SQL]] ====== SQL haladó ====== * **Szerző:** Sallai András * Copyright (c) Sallai András, 2012, 2021 * Licenc: GNU Free Documentation License 1.3 * Web: https://szit.hu ===== TOP vagy LIMIT ===== ==== 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;