[[oktatas:adatbázis-kezelés:sql|< SQL]] ====== SQL Alapok ====== * **Szerző:** Sallai András * Copyright (c) 2012, Sallai András * Szerkesztve: 2012, 2020, 2021, 2024 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Példa tábla ===== Az alábbiakban egy példatáblát látunk. Minden további lekérdezést ezen a táblán fogunk végrehajtani. ^ Szemelyek ^^^^^^ ^ az ^ nev ^ telepules ^ cim ^ szuletes ^ fizetes ^ | 1 | Nagy József | Szolnok | Tél u. 23. | 1998-05-23 | 1230000 | | 2 | Kis Mária | Szeged | Nyár u. 3. | 1985-07-22 | 1425000 | | 3 | El Kelemen | Miskolc | Domb u. 45 | 1989-01-05 | 1210000 | | 4 | Rét Gábor | Szeged | Lent u. 25. | 1988-07-22 | 1320000 | | 5 | Tronf Lajos | Szolnok | Krém u. 83. | 1981-12-01 | 1335000 | | 6 | Pék László | Szolnok | Pára u. 83. | 1971-11-05 | 1375000 | | 7 | Lót Ferenc | Szeged | Csapás u. 83. | 1981-12-01 | 1245000 | | 8 | Bél Kálmán | Miskolc | Fém u. 83. | 1991-02-08 | 1135000 | | 9 | Képes Zoltán | Szeged | Pirítós u. 83. | 1981-05-16 | 1277400 | | 10 | Ficsur János | Miskolc | Latyak u. 83. | 1980-12-20 | 1235000 | Az első példáinkban adatokat fogunk lekérdezni a Szemely táblából. A következő SQL utasításokkal hozzuk létre az adatbázist a gyakorláshoz. Az összes utasítás egyszerre bemásolható egy SQL felületen, MySQL vagy MariaDB adatbázisba. -- Adatbázis létrehozása create database SzemelyAdatbazis; -- Adatbázis használatba-vétele use SzemelyAdatbazis; -- A Szemelyek tábla elkészítése create table Szemelyek ( az int not null primary key auto_increment, nev varchar(50), telepules varchar(50), cim varchar(50), szuletes date, fizetes double ); -- Személyek beszúrása insert into Szemelyek (nev, telepules, cim, szuletes, fizetes) values ('Nagy József', 'Szolnok', 'Tél u. 23.', '1998-05-23', 1230000), ('Kis Mária', 'Szeged', 'Nyár u. 3', '1985-07-22', 1425000), ('El Kelemen', 'Miskolc', 'Domb u. 45.', '1989-01-05', 1210000), ('Rét Gábor', 'Szeged', 'Lent u. 5', '1988-07-22', 1320000), ('Tronf Lajos', 'Szolnok', 'Krém u. 83.', '1981-12-01', 1335000), ('Pék László', 'Szolnok', 'Pára u. 83.', '1971-11-05', 1375000), ('Lót Ferenc', 'Szeged', 'Csapás u. 83.', '1981-12-01', 1245000), ('Bél Kálmán', 'Miskolc', 'Fém u. 83.', '1991-02-08', 1135000), ('Képes Zoltán', 'Szeged', 'Pirítós u. 83.', '1981-05-16', 1277400), ('Ficsur János', 'Miskolc', 'Latyak u. 83.', '1980-12-20', 1235000); ===== SELECT ===== ==== Kérelmek lefordítása ==== Általában ehhez hasonló kérdések fordulnak elő. * Milyen termékeket gyártunk? * Mutasd meg a dolgozók neveit. * Kik laknak Szolnokon? * Írd ki a miskolci dolgozók neveit. Egy lekérdezés SQL nyelven a következő minta szerint néz ki: SELECT FROM Elsőként keressünk olyan kifejezéseket, mint "Milyen", "Mutasd meg", "Kik laknak", "Írd ki". Ezeket lefordíthatjuk "SELECT" névre. Most keressük meg a főneveket, majd nézzük meg, hogy ezek egy tárolót írnak-e le, amelyekben elemeket tárolunk. Ha igen, akkor helyettesítsük be a forrás helyére. Ha elemeket jelölnek a főnevek, akkor helyettesítsük be az elemek helyére. ==== Összes mező lekérdezése ==== SELECT * FROM Szemelyek; A "SELECT" szót úgy fordíthatnánk, hogy "Szelektáljuk", ez után jön, hogy mit. Utána egy csillagkaraktert látunk. Ez egy adattábla összes mezőjét jelenti. Egy adatbázisban lehet több tábla is, ezért meg kell mondanunk, melyik táblából szeretnénk lekérdezést végrehajtani. ==== Adott mezők lekérdezése ==== A példa kedvéért kérdezzük le a személyek neveit és településüket. Most a csillagkarakter helyett beírom a mezők nevét, vesszővel szeparálva azokat. SELECT nev,telepules FROM Szemely; ===== DISTINCT ===== Az ismétlődő sorok nem jelennek meg. Például ha két név egyezik, csak egyszer jelenik meg. SELECT DISTINCT nev FROM Szemely; Ha veszünk hozzá még egy mezőt és ott nem egyezést találunk, akkor nev mező hiába egyezik többször jelenik majd meg. ===== WHERE ===== A WHERE fordítása a használat tekintetében talán az "Ahol" lenne a legjobb fordítás. Például szeretnénk listázni azokat a dolgozókat, ahol a település Szolnok. Figyeljük meg az SQL mint mesterséges nyelv és a természetes nyelvek hasonlóságát. SELECT nev FROM Szemely WHERE telepules="Szolnok"; Számok és dátumok esetén használhatjuk a következő operátorokat is: | > | nagyobb mint | | < | kisebb mint | | >= | nagyobb vagy egyenlő | | <= | kisebb vagy egyenlő | ===== Dátum ===== Dátum **Access**ben: SELECT nev FROM Szemely WHERE belepes=#2006-05-01#; A dátumot írhatjuk hó, nap és év formában perjellel elválasztva: #05/01/2006# Általánosan: #hó/nap/év# Az MSO-2007 irodai programcsomagban csak angolos dátumformátummal használható. Az MSO-2013-ban használható a #2006-05-01# formátum. Dátum **MariaDB** és **MySQL** rendszeren: SELECT nev FROM Szemely WHERE belepes="2006-05-01"; A dátum adatokat kettős-kereszt helyett idézőjelbe tesszük. ===== OR ===== Ha szolnoki dolgozók mellett szeretném látni a szegedi dolgozókat is, akkor szükségünk van egy olyan utasításra, amellyel megadhatók "vagy" kapcsolatok. Az SQL-ben ez az "OR". Az SQL utasításunk ekkor így néz ki: SELECT nev FROM Szemely WHERE telepules="Szolnok" OR telepules="Szeged"; ===== AND ===== A következőkben azt szeretnénk, ha olyan szolnoki dolgozók jelenjenek meg a kimenetben, akiknek a fizetése több mit 300000 - Ft. Ekkor "és" kapcsolatra van szükség. Az SQL utasításunk ekkor így néz ki: SELECT nev FROM Szemely WHERE telepules="Szolnok" AND fizetes > 300000; ===== ORDER BY ===== A kimenetet időnként szeretnénk ábécé rendbe, vagy számok alapján, növekvő vagy csökkenő sorrendbe rendezni. Erre használhatjuk a ORDER BY direktívát. Az alábbi példában a fizetéseket szeretném rendezve kiírni: SELECT fizetes FROM Szemely ORDER BY fizetes; Fordított rendezés: SELECT fizetes FROM Szemely ORDER BY fizetes DESC; A DESC fordítja meg a rendezést, azaz azt mondja a rendezés legyen csökkenő. Az emelkedőnek is van ilyen kulcsszava, az ASC, de ez alapértelmezés, ezért azt nem kell kiírni. SELECT nev, fizetes FROM Szemely WHERE telepules="Szolnok" AND fizetes > 300000 ORDER BY fizetes; ===== Csoportosítás (GROUP BY) ===== Szeretnénk megjeleníteni, milyen települések vannak. A következő utasítás segít ebben, azonban sok a redundáns adat: SELECT telepules FROM Szemely; Ugyanaz a település többször szerepel. Ha csoportosítjuk a rekordokat, akkor minden csoportba tartozó rekord csak egyszer jelenik meg: SELECT telepules FROM Szemely GROUP BY telepules; Persze meg kell adni milyen mező szerint szeretnénk csoportosítani. Az is lehet, hogy az adott városokban akarok számításokat végezni, ekkor is nagyon hasznos a csoportosítás, viszont erről a függvényeknél lesz szó később. ===== Beágyazott SQL ===== create database konyvNagyker; use konyvNagyker create table rendelesek ( az int not null auto_increment, vevoAz int, mennyiseg int, datum date, primary key(az) ); Adatok: insert into rendelesek (vevoAz, mennyiseg, datum) values (1, 40, "2020-01-06"), (2, 20, "2020-01-06"), (3, 15, "2020-01-06"), (4, 50, "2020-01-06"), (5, 100, "2020-01-06"), (6, 30, "2020-01-06"), (7, 20, "2020-01-06") ; Szeretnénk tudni a legmagasabb rendelési számot: select max(mennyiseg) from rendelesek; Szeretnénk tudni az ehhez tartozó rendelési azonosítót. Első rossz próbálkozásunk: select az, max(mennyiseg) from rendelesek; A probléma, hogy az eredmény az "az" mezőben 1, de ez rossz válasz, mert a 5-t kellett volna megkapni. Beágyazott lekérdezést használhatunk. select az, mennyiseg from rendelesek where mennyiseg = (select max(mennyiseg) from rendelesek);