[[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);