Felhasználói eszközök

Eszközök a webhelyen


oktatas:adatbazis-kezeles:sql:alapok

< SQL

SQL Alapok

  • Szerző: Sallai András
  • Copyright © 2012, Sallai András
  • Szerkesztve: 2012, 2020, 2021, 2024
  • Licenc: CC BY-SA 4.0

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.

SzemelyAdatbazis.sql
-- 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 <elem> FROM <forrás>

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 Accessben:

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);
oktatas/adatbazis-kezeles/sql/alapok.txt · Utolsó módosítás: 2024/06/28 07:56 szerkesztette: admin