Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány) 23/1 B IT v: 2018.10.31 MAN
DML adatokon műveletet végző utasítások DML Data Manipulation Language Rekordok (sorok) beszúrása (felvitele) Mezők értékének módosítása Rekordok törlése 23/2
Rekordok beszúrása INSERT INTO táblanév [(oszloplista)] VALUES (értéklista); INSERT INTO Autó VALUES ('AKT-392', 'Trabant', 'Kék', 32); Rendszám Típus Szín Kor GBC-765 Opel Fehér 6 JED-123 Nissan Ezüst 5 Az oszloplista elhagyható, de ekkor az összes mező értékét meg kell adni, a megfelelő sorrendben! INSERT INTO Autó (Rendszám, Típus, Kor) VALUES ('ASD-602', 'Mazda', 7); INSERT INTO Autó VALUES ('ALM-332', 'Renault', Null, 8); INSERT INTO Autó VALUES ('IJK-222', 'Lada', Default, 25); 23/3 Ha van megadott default érték!
Rekordok beszúrása Kod Nev Szido 1 Kis Béla 2018.10.31 2 Nagy Éva 2018.10.03 select sysdate from dual 10/31/2018 insert into emberek values (1, 'Kis Béla', '10/31/2018'); insert into emberek values (2, 'Nagy Éva', to_date('2018.10.03', 'YYYY.MM.DD'); to_date dátummá alakítja a szöveget a megadott formátum mellett: YYYY év 4 számjeggyel MM hónap 2 számjeggyel DD nap, 2 számjeggye 23/4
Mezők értékének módosítása UPDATE táblanév SET mező = kifejezés,..., mező = kifejezés [ WHERE feltétel ]; A feltételnek eleget tevő mezők módosulnak, Where feltétel nélkül minden mezőt módosít! UPDATE Autó SET Kor=10 WHERE Rendszám='JED-123'; UPDATE Autó SET Szín= 'Barna'; UPDATE Autó SET Kor=10, Szín='Kék' WHERE Rendszám='JED-123'; A mezőben lévő aktuális érték is felhasználható: UPDATE Autó SET Ár = Ár * 1.2 WHERE Ár<1000000; 23/5
Mezők értékének módosítása Kod Nev Szido 1 Kis Béla 2018.10.31 2 Nagy Éva 2018.10.03 update emberek set szido=szido+1 where kod=1; 1 Kis Béla 2018.11.01 update emberek set szido= add_month(szido, 3) where kod=1; 1 Kis Béla 2019.02.01 23/6
Rekordok törlése DELETE FROM táblanév [ WHERE feltétel ]; Where feltétel nélkül minden sor törlődik! DELETE FROM Autó WHERE Kor>15; Az összes rekord törlésére használható: TRUNCATE TABLE Autó; delete from autó; 23/7
Nyomkövetési feladat 23/8
Órai feladat (1) Kövesd a parancsokat! create sequence st_seq; Szekvencia: automatikusan növekvő érték. Paraméterek nélkül 1-ről indulva egyesével növekszik. create table Student( ID int default st_seq.nextval primary key, Name varchar(30), BirthDay date, EntryDate date default sysdate, Score number(5), TelNo varchar(12), Email varchar(40)); Student nextval: következő érték lekérése a szekvenciából ID Name BirthDay EntryDate Score TelNo Email 23/9
Órai feladat (2) Student ID Name BirthDay EntryDate Score TelNo Email ALTER TABLE student ADD CONSTRAINT stc1 CHECK (score < 1000); ALTER TABLE student ADD CONSTRAINT stc2 CHECK (regexp_like (telno,'^(\d{2}-\d{3}-\d{2}-\d{2})$')); ALTER TABLE student ADD CONSTRAINT stc3 CHECK (email like ' %@%. %'); 3 db aláhúzás jel 2 db aláhúzás jel Jelentése: kötelező karakter TelNo formai ellenőrzése: 2számjegy 3számjegy 2számjegy 2számjegy Email formai ellenőrzése: Min. 3 karakter, aztán @, aztán karakterek, pont, és min 2 karakter a végén 23/10
Órai feladat (3) Student ID Name BirthDay EntryDate Score TelNo Email Melyik parancs nem működik, és miért nem? 1. 2. 3. 4. 5. 6. insert into student values (default,'kis Géza','05/30/1998',default,300, '30-566-23-48','abc@bolt.hu'); insert into student values (3,'Theo Dóra','02/29/1996',default,175, '70-555-30-30','t.dora@gmail.com'); insert into student values (default,'dugó Béla','12/12/1997','10/16/2017',120, '30-985-55-34','dugo@bela.com'); insert into student values(2,'pró Balázs','07/16/1999',default,211, '46-755-655','probali@gmail.com'); insert into student values(1,'bó Nóra','01/22/1999',default,166, '20-666-11-15','bonora@gmail.com'); insert into student values(default,'bor Virág','03/08/1999',default,199, '30-300-60-90','bor.virag@piasok.com'); 23/11
Órai feladat (4) Student ID Name BirthDay EntryDate Score TelNo Email Melyik parancs nem működik, és miért nem? 7. 8. 9. 10. 11. insert into student (id,name,birthday,entrydate) values (null,'nagy Emil','08/20/1999',default); insert into student (id,name) values(default,'null'); insert into student (id,name) values(default,'maci Laci'); insert into student (name,birthday) values ('Nagy Judit',TO_DATE('1996.05.15', 'YYYY.MM.DD')); insert into student (name,birthday,email) values ('Kovács Lajos','05/18/1997','ab@retek.hu'); 23/12
Órai feladat (5) Állítson be a TelNo mezőre új ellenőrzési feltételt: A telefonszám lehessen 2számjegy 3számjegy 3számjegy alakú is! regexp_like (telno,'^(\d{2}-\d{3}-\d{2}-\d{2} \d{2}-\d{3}-\d{3})$') W Jelentése: vagy Javasolt törölni a meglévő megszorítást, aztán beszúrni az újat! Alter table student drop constraint stc2; ALTER TABLE student ADD CONSTRAINT stc2 CHECK (regexp_like (telno,'^(\d{2}-\d{3}-\d{2}-\d{2} \d{2}-\d{3}-\d{3})$')); Ha kész az új megszorítás, szúrja be újra a 4. rekordot. 23/13
Órai feladat (6) Javítsuk ki a 7. rekord beszúrás parancsát: insert into student (name,birthday,entrydate) values ('Nagy Emil','08/20/1999',default); Javítsuk ki a 11. rekord beszúrás parancsát: insert into student (name,birthday,email) values ('Kovács Lajos','05/18/1997','abc@retek.hu'); Írassuk ki a Student tábla tartalmát Select * from student; 23/14
Órai feladat (7) 23/15
Órai feladat (8) Student ID Name BirthDay EntryDate Score TelNo Email Adjuk meg Nagy Emil hiányzó telefonszámát: UPDATE student SET telno='70-233-45-56' where name='nagy Emil'; Adjuk meg Nagy Emil további hiányzó adatait: update student set score=320, email='emil@posta.hu' where name='nagy Emil'; Adjuk meg Maci Laci születési dátumát: update student set birthday=to_date('1998.07.14', 'YYYY.MM.DD') where name='maci Laci'; Legyen az eredmény 150, mindenkinél, akinél nincs megadva: update student set score=150 where score is null; A 8. rekord beszúrásakor a név null érték lett. Javítsuk ki: update student set name='hó Fehérke' where name is null; Ellenőrizd! Működik a parancs? Miért nem? Javítsd! update student set name='hó Fehérke' where name='null'; 23/16
Órai feladat (9) Student ID Name BirthDay EntryDate Score TelNo Email Hó Fehérkének, Maci Lacinak, és Nagy Juditnak ugyanaz az email címe, javítsuk ki, egyetlen paranccsal! Ehhez keresd ki mindhármuk ID-jét! (más lesz mint itt) update student set email='john@anim.com' where id in(101,102,103); Hó Fehérke és Maci Laci ledoktorált. Tegyük a nevük elé a Dr.-t! update student set name = 'Dr. ' name where id in (101, 102); Funkciója: sztringek összefűzése Akinek 200 pontnál kevesebb van, annak növeljük a pontszámát 50-el! update student set score=score+50 where score < 200; Dr. Hó Fehérke épp 18 éve született. Írjuk be a születési dátumát! update student set birthday= add_months(sysdate,-18*12) where id=101 W 23/17
Órai feladat (10) Student ID Name BirthDay EntryDate Score TelNo Email City Néhány hallgatónak nincs mobilja. Ők egy cégtől kapnak telefont. A számok 70-777-22-25-ről indulnak, és rendre 26-, 27-, 28-ra végződnek. Frissítse a telefonszámokat! create sequence bd_seq start with 25 increment by 1 update student set telno='70-777-22-' bd_seq.nextval where telno is null Szúrjon be egy City nevű mezőt (20 karakter) alter table student ADD city varchar(20); Az első három rekordban javítsa ki a várost MISKOLC-ra! update student set city='miskolc' where city is null and rownum < 4 Újabb három rekordban javítsa ki a várost miskolc-ra! update student set city='miskolc' where city is null and rownum < 4 A többi rekordban javítsa ki a várost miskolc-ra! update student set city='miskolc' where city is null Javítsa ki az összes várost nagy kezdőbetűs Miskolc-ra! update student set city=initcap(city) 23/18
Órai feladat (11) Student ID Name BirthDay EntryDate Score TelNo Email City Age Szúrjunk be egy új oszlopot, melynek neve Age. alter table student ADD Age number(3); Határozzuk meg a hallgatók korát, és módosítsuk az Age mező értékét! Először írassuk ki a hallgatók korát: select name, floor((sysdate-birthday)/365) from student; Módosítsuk az Age mező tartalmát: update student set Age=floor((sysdate-birthday)/365); Töröljük ki Dr. Maci Laci email címét update student set email=null where id=102 Funkciója: egész rész Módosítsuk Kis Géza ID-jét 42-re! update student set id=42 where name='kis Géza' Működik, de elsődleges kulcs értékét veszélyes módosítani! 23/19
Órai feladat (12) Student ID Name BirthDay EntryDate Score TelNo Email City Age Kövesd a parancsokat! CREATE TABLE stud2 AS SELECT name, email FROM student WHERE 1=0; create sequence s2_seq; alter table stud2 ADD sid int default s2_seq.nextval primary key; insert into stud2 (name) select name from student; Stud2 Name Email Stud2 Name Email SID 23/20 Stud2 Name Pró Balázs Nagy Emil Bó Nóra Email SID 1 2 3
Órai feladat (13) Student ID Name BirthDay EntryDate Score TelNo Email City Age Kövesd a parancsokat! update stud2 set email=(select email from student where stud2.name=student.name) Stud2 Name Pró Balázs Nagy Emil Bó Nóra Email probali@gmail.com emil@posta.hu bonora@gmail.com SID 1 2 3 23/21
23/22
VÉGE VÉGE 23/23