In this video you will find my Oracle Advanced SQL presentation in an event supported by Oracle Türkiye.
Özgür Macit: Oracle Analytic functions, Hierarchical Queries, Model Clause, Regular Expressions from Hasan Tonguç YILMAZ on Vimeo.
Here is the demo I present in the video:
-- tablonun yaratilmasi
DROP TABLE yas;
CREATE TABLE yas (
ad_soyad VARCHAR2(30),
yas NUMBER
);
-- tabloya verilerin eklenmesi
INSERT INTO yas ( ad_soyad, yas ) VALUES ( 'Kenan Muftu', 24 );
INSERT INTO yas ( ad_soyad, yas ) VALUES ( 'Aysegul Macit', 8 );
INSERT INTO yas ( ad_soyad, yas ) VALUES ( 'Erol Macit', 20 );
INSERT INTO yas ( ad_soyad, yas ) VALUES ( 'Erturk Diriksoy', 22 );
INSERT INTO yas ( ad_soyad, yas ) VALUES ( 'Ozgur Macit', 23 );
INSERT INTO yas ( ad_soyad, yas ) VALUES ( 'Zeynep Derelioglu', 22 );
INSERT INTO yas ( ad_soyad, yas ) VALUES ( 'Fatma Macit', 42 );
INSERT INTO yas ( ad_soyad, yas ) VALUES ( 'Emir Omer Macit', 53 );
INSERT INTO yas ( ad_soyad, yas ) VALUES ( 'Huseyin Tansu Ozer', 23 );
INSERT INTO yas ( ad_soyad, yas ) VALUES ( 'Mumin Irican', 24 );
COMMIT;
-- tablonun kontrol edilmesi
SELECT y.* FROM yas y;
-- NTILE ornegi
SELECT y.*,
NTILE(4) OVER ( ORDER BY y.yas ) grup
FROM yas y;
-- WIDTH_BUCKET ornegi
SELECT y.ad_soyad,
WIDTH_BUCKET( y.yas, 10, 30, 3 ) yukari_grup,
WIDTH_BUCKET( y.yas, 30, 10, 3 ) asagi_grup
FROM yas y;
-- tablonun dusurulmesi
DROP TABLE yas;
-- tablonun yaratilmasi
DROP TABLE dogum_gunleri;
CREATE TABLE dogum_gunleri (
ad_soyad VARCHAR2(30),
tip VARCHAR2(10),
ay NUMBER,
gun NUMBER
);
-- tabloya ornek verilerin eklenmesi
INSERT INTO dogum_gunleri ( ad_soyad, tip, ay, gun ) VALUES ( 'Kenan Muftu', 'Arkadas', 9, 9 );
INSERT INTO dogum_gunleri ( ad_soyad, tip, ay, gun ) VALUES ( 'Aysegul Macit', 'Aile', 3, 23 );
INSERT INTO dogum_gunleri ( ad_soyad, tip, ay, gun ) VALUES ( 'Erol Macit', 'Aile', 3, 23 );
INSERT INTO dogum_gunleri ( ad_soyad, tip, ay, gun ) VALUES ( 'Erturk Diriksoy' , 'Arkadas', 9, 26 );
INSERT INTO dogum_gunleri ( ad_soyad, tip, ay, gun ) VALUES ( 'Ozgur Macit', 'Aile', 5, 10 );
INSERT INTO dogum_gunleri ( ad_soyad, tip, ay, gun ) VALUES ( 'Zeynep Derelioglu', 'Arkadas', 6, 15 );
INSERT INTO dogum_gunleri ( ad_soyad, tip, ay, gun ) VALUES ( 'Fatma Macit', 'Aile', 7, 20 );
INSERT INTO dogum_gunleri ( ad_soyad, tip, ay, gun ) VALUES ( 'Emir Omer Macit', 'Aile', 3, 27 );
INSERT INTO dogum_gunleri ( ad_soyad, tip, ay, gun ) VALUES ( 'Huseyin Tansu Ozer', 'Arkadas', 8, 19 );
INSERT INTO dogum_gunleri ( ad_soyad, tip, ay, gun ) VALUES ( 'Mumin Irican', 'Arkadas', 8, 6 );
COMMIT;
-- tablonun kontrol edilmesi
SELECT dg.* FROM dogum_gunleri dg;
-- LAG ornegi
SELECT dg.ad_soyad,
LAG( dg.ad_soyad, 1, '' ) OVER ( ORDER BY dg.ay, dg.gun ) onceki
FROM dogum_gunleri dg
WHERE tip = 'Arkadas';
-- LEAD ornegi
SELECT dg.ad_soyad,
LEAD( dg.ad_soyad, 1, '' ) OVER ( ORDER BY dg.ay, dg.gun ) sonraki
FROM dogum_gunleri dg
WHERE tip = 'Arkadas';
-- Bu yil icinde arkadaslarimin dogum gunlerini hangi sirayla kutlayacagiz?
SELECT dg.ad_soyad,
dg.ay,
dg.gun,
RANK() OVER ( ORDER BY dg.ay, dg.gun) sira
FROM dogum_gunleri dg
WHERE dg.tip = 'Arkadas'
ORDER BY sira;
-- Bu yil icinde arkadaslarimin ve ailemin dogum gunlerini ayri ayri hangi sirayla kutlayacagiz?
SELECT dg.*,
RANK() OVER ( PARTITION BY dg.tip
ORDER BY dg.ay, dg.gun) sira
FROM dogum_gunleri dg
ORDER BY dg.tip,
sira;
-- Bu yil icinde herkesin dogum gunlerini hangi sirayla kutlayacagiz?
SELECT dg.*,
RANK() OVER ( ORDER BY dg.ay, dg.gun) sira
FROM dogum_gunleri dg
ORDER BY sira;
-- DENSE_RANK ornegi
SELECT dg.ad_soyad,
dg.ay,
dg.gun,
DENSE_RANK() OVER ( ORDER BY dg.ay, dg.gun) sira
FROM dogum_gunleri dg
WHERE dg.tip = 'Aile'
ORDER BY sira;
-- tablonun dusurulmesi
DROP TABLE dogum_gunleri;
-- tablonun yaratilmasi
DROP TABLE telefon_gorusmeleri;
CREATE TABLE telefon_gorusmeleri (
ad_soyad VARCHAR2(20),
yil NUMBER,
gorusme_sayisi NUMBER
);
-- tabloya verilerin eklenmesi
INSERT INTO telefon_gorusmeleri ( ad_soyad, yil, gorusme_sayisi ) VALUES ( 'Kenan Muftu', 2004, 12 );
INSERT INTO telefon_gorusmeleri ( ad_soyad, yil, gorusme_sayisi ) VALUES ( 'Kenan Muftu', 2005, 16 );
INSERT INTO telefon_gorusmeleri ( ad_soyad, yil, gorusme_sayisi ) VALUES ( 'Kenan Muftu', 2006, 28 );
INSERT INTO telefon_gorusmeleri ( ad_soyad, yil, gorusme_sayisi ) VALUES ( 'Kenan Muftu', 2007, 65 );
INSERT INTO telefon_gorusmeleri ( ad_soyad, yil, gorusme_sayisi ) VALUES ( 'Fatma Macit', 2004, 109 );
INSERT INTO telefon_gorusmeleri ( ad_soyad, yil, gorusme_sayisi ) VALUES ( 'Fatma Macit', 2005, 243 );
INSERT INTO telefon_gorusmeleri ( ad_soyad, yil, gorusme_sayisi ) VALUES ( 'Fatma Macit', 2006, 98 );
INSERT INTO telefon_gorusmeleri ( ad_soyad, yil, gorusme_sayisi ) VALUES ( 'Fatma Macit', 2007, 78 );
INSERT INTO telefon_gorusmeleri ( ad_soyad, yil, gorusme_sayisi ) VALUES ( 'Mumin Irican', 2004, 1 );
INSERT INTO telefon_gorusmeleri ( ad_soyad, yil, gorusme_sayisi ) VALUES ( 'Mumin Irican', 2005, 3 );
INSERT INTO telefon_gorusmeleri ( ad_soyad, yil, gorusme_sayisi ) VALUES ( 'Mumin Irican', 2006, 0 );
INSERT INTO telefon_gorusmeleri ( ad_soyad, yil, gorusme_sayisi ) VALUES ( 'Mumin Irican', 2007, 2 );
COMMIT;
-- tablonun kontrol edilmesi
SELECT * FROM telefon_gorusmeleri;
-- Her kisi icin her yil, o yil ve onceki yillarda toplam kac telefon gorusmesi yapmisim?
SELECT tg.ad_soyad,
tg.yil,
SUM( tg.gorusme_sayisi) OVER ( PARTITION BY tg.ad_soyad
ORDER BY tg.yil ) toplam_gs
FROM telefon_gorusmeleri tg
ORDER BY tg.ad_soyad,
tg.yil;
-- Her kisi icin her yil, o yil ve onceki yil ortalamada kac telefon gorusmesi yapmisim?
SELECT tg.ad_soyad,
tg.yil,
AVG( tg.gorusme_sayisi) OVER ( PARTITION BY tg.ad_soyad
ORDER BY tg.yil
ROWS 1 PRECEDING ) ortalama_gs
FROM telefon_gorusmeleri tg
ORDER BY tg.ad_soyad,
tg.yil;
-- ROLLUP ornegi
SELECT tg.ad_soyad,
tg.yil,
SUM ( tg.gorusme_sayisi ) toplam_gs
FROM telefon_gorusmeleri tg
WHERE tg.ad_soyad IN ( 'Fatma Macit', 'Mumin Irican' )
GROUP BY ROLLUP( tg.ad_soyad,
tg.yil );
-- CUBE ornegi
SELECT tg.ad_soyad,
tg.yil,
SUM ( tg.gorusme_sayisi ) toplam_gs
FROM telefon_gorusmeleri tg
WHERE tg.ad_soyad IN ( 'Fatma Macit', 'Mumin Irican' )
GROUP BY CUBE( tg.ad_soyad,
tg.yil );
-- tablonun dusurulmesi
DROP TABLE telefon_gorusmeleri;
-- tablonun yaratılması
DROP TABLE kaplumbaga_ailesi;
CREATE TABLE kaplumbaga_ailesi (
kimlik_no INTEGER PRIMARY KEY,
ata REFERENCES kaplumbaga_ailesi,
isim VARCHAR2(30)
);
-- tabloya verilerin girilmesi
INSERT INTO kaplumbaga_ailesi (kimlik_no, ata, isim ) VALUES ( 1, NULL, 'Dede Kaplumbaga' );
INSERT INTO kaplumbaga_ailesi (kimlik_no, ata, isim ) VALUES ( 2, 1, 'Hala Kaplumbaga' );
INSERT INTO kaplumbaga_ailesi (kimlik_no, ata, isim ) VALUES ( 3, 1, 'Baba Kaplumbaga' );
INSERT INTO kaplumbaga_ailesi (kimlik_no, ata, isim ) VALUES ( 4, 3, 'Evlat Kaplumbaga' );
INSERT INTO kaplumbaga_ailesi (kimlik_no, ata, isim ) VALUES ( 5, 4, 'Torun Kaplumbaga' );
INSERT INTO kaplumbaga_ailesi (kimlik_no, ata, isim ) VALUES ( 6, 1, 'Amca Kaplumbaga' );
INSERT INTO kaplumbaga_ailesi (kimlik_no, ata, isim ) VALUES ( 7, 6, 'Erkek Kuzen Kaplumbaga' );
INSERT INTO kaplumbaga_ailesi (kimlik_no, ata, isim ) VALUES ( 8, 6, 'Disi Kuzen Kaplumbaga' );
COMMIT;
-- tablonun kontrol edilmesi
SELECT * FROM kaplumbaga_ailesi;
-- CONNECT BY PRIOR ... START WITH ornegi
SELECT ka.isim,
ka.kimlik_no,
ka.ata
FROM kaplumbaga_ailesi ka
CONNECT BY PRIOR ka.kimlik_no = ka.ata
START WITH ka.ata IS NULL ;
-- CONNECT BY PRIOR ... START WITH ornegi
SELECT SYS_CONNECT_BY_PATH( isim, '/' ) agac
FROM kaplumbaga_ailesi ka
CONNECT BY PRIOR ka.kimlik_no = ka.ata
START WITH ka.ata IS NULL ;
-- tablonun dusurulmesi
DROP TABLE kaplumbaga_ailesi;