├── .gitignore
├── Belgeler
└── .NET_Postgres_connection.pdf
├── DersTanitimi.md
├── LICENSE
├── OrnekVeritabanlari
├── NorthWind.backup
├── NorthWind.sql
├── NorthWind.sql.zip
└── dvdrental.zip
├── README.md
├── SSS.md
├── Sekiller
├── 10
│ ├── NorthWind.png
│ └── a.png
├── 11
│ ├── Donguler.png
│ ├── KosulluIfadeler.png
│ ├── Tetikleyici.png
│ └── WebUygulamaMimarisi.png
├── 12
│ ├── BirinciNormalForm_1.png
│ ├── BirinciNormalForm_2.png
│ ├── FonksiyonelBagimlilik.png
│ ├── IkinciNormalForm_1.png
│ ├── IkinciNormalForm_2.png
│ ├── IkinciNormalForm_3.png
│ ├── IyilestirilmisTasarim.png
│ ├── IyilestirilmisTasarim1.png
│ ├── Ornek2.png
│ ├── Ornek_1.png
│ ├── UcuncuNormalForm_1.png
│ ├── UcuncuNormalForm_2.png
│ ├── UcuncuNormalForm_3.png
│ ├── VeriGirisindeTutarsizlik_1.png
│ ├── VeriGirisindeTutarsizlik_2.png
│ ├── VeriGuncellemedeTutarsizlik_1.png
│ ├── VeriSilmedeTutarsizlik_1.png
│ └── VeriTekrarininZararlari_1.png
├── 01
│ ├── AlgilayiciVerileri.png
│ ├── BuyukResim.png
│ ├── DosyaYapisi.png
│ ├── ETicaret.png
│ ├── GitVerileri.png
│ ├── IliskiselSema.png
│ ├── VeritabaniSiniflariTablo.png
│ ├── VeritabaniSistemi.png
│ └── VeritabaniVeDosyaSistemi.png
├── 02
│ ├── AgModeli.png
│ ├── BirBirBagintisi.png
│ ├── BirCokBagintisi.png
│ ├── ChenGosterimi.png
│ ├── CokCokBagintisi.png
│ ├── CokCokBagintisi2.png
│ ├── CokluDeger.png
│ ├── DahiliModel.png
│ ├── DosyaYapisi.png
│ ├── ETicaret.png
│ ├── HariciModel1.png
│ ├── HariciModel2.png
│ ├── HiyerarsikModel.png
│ ├── IkiliBaginti.png
│ ├── IliskiselSema.png
│ ├── KavramsalModel.png
│ ├── ModelTablosu.png
│ ├── TekliBaginti.png
│ ├── UcluBaginti.png
│ ├── VarOlmaBagimliligi.png
│ ├── VarOlmaBagimliligi2.png
│ ├── VarolmaBagimliligiTanimlamaBagintisi.png
│ ├── YasamDongusu.png
│ └── ZayifGucluBagintilar.png
├── 03
│ ├── AracUreticisi.png
│ ├── Kitabevi.png
│ ├── UBSTablo.png
│ └── UBSVBDiyagrami.png
├── 04
│ ├── AracUreticisi.png
│ ├── BirBirBagintisi.png
│ ├── BirCokBagintisi.png
│ ├── ButunlukKurallari.png
│ ├── CokCokBagintisi.png
│ ├── E-TicaretTablo.png
│ ├── ETicaret_Kucuk.png
│ ├── Iliski.png
│ ├── Indeks.png
│ ├── Tablo.png
│ ├── TekliBaginti.png
│ ├── TemelKavramlar.png
│ ├── VarOlmaBagimliligi.jpg
│ ├── VarOlmaBagimliligi.png
│ ├── VekilBirincilAnahtar.png
│ ├── YabanciAnahtar.png
│ └── YabanciAnahtar2.png
├── 05
│ ├── Birlesim.png
│ ├── Birlesim2.png
│ ├── Bolme.png
│ ├── Bolme2.png
│ ├── DogalBirlestirme.png
│ ├── DogalBirlestirme2.png
│ ├── ETicaret.png
│ ├── ETicaretKumeleme1.png
│ ├── ETicaretKumeleme2.png
│ ├── Fark.png
│ ├── Fark2.png
│ ├── KalitimPersonel.png
│ ├── Kartezyen.png
│ ├── Kartezyen2.png
│ ├── Kesisim_1.png
│ ├── Kesisim_2.png
│ ├── Kisi1.png
│ ├── Projeksiyon.png
│ ├── Projeksiyon2.png
│ ├── Projeksiyon3.png
│ ├── SagDisBirlestirme.png
│ ├── SagDisBirlestirme2.png
│ ├── Select.png
│ ├── Select2.png
│ ├── Select3.png
│ ├── Select4.png
│ ├── SolDisBirlestirme.png
│ ├── SolDisBirlestirme2.png
│ ├── Soru1.png
│ ├── Soru2.png
│ ├── Soru3.png
│ ├── Soru4.png
│ ├── Soru5.png
│ ├── Soru6.png
│ └── Urun1.png
├── 06
│ ├── DogalBirlestirme.png
│ ├── SagDisBirlestirme.png
│ ├── SolDisBirlestirme.png
│ └── YapisalSorgulamaDili.png
├── 07
│ └── YabanciAnahtar.png
├── 08
│ ├── PersonelKalitim.png
│ └── TekliBaginti.png
├── BirinciNormalForm_1.png
├── BirinciNormalForm_2.png
├── Ornek2.png
└── Ornek_1.png
├── Semboller
├── Disjoint1.svg
├── Disjoint2.svg
├── Overlap1.svg
└── Overlap2.svg
├── VYS01.md
├── VYS02.md
├── VYS03.md
├── VYS04.md
├── VYS05_1.md
├── VYS05_2.md
├── VYS06.md
├── VYS07.md
├── VYS08.md
├── VYS10.md
├── VYS11.md
├── VYS12_1.md
├── VYS12_2.md
└── VYS14.md
/.gitignore:
--------------------------------------------------------------------------------
1 | *.info
2 | *.info.sql
3 | *.info.pdf
4 |
--------------------------------------------------------------------------------
/Belgeler/.NET_Postgres_connection.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Belgeler/.NET_Postgres_connection.pdf
--------------------------------------------------------------------------------
/DersTanitimi.md:
--------------------------------------------------------------------------------
1 |
2 | # Ders Tanıtımı
3 |
4 | Ek bilgi için https://ebs.sabis.sakarya.edu.tr adresine bakabilirsiniz.
5 |
6 | ## Konular
7 |
8 | * Dersin Amaçları
9 | * Değerlendirme
10 | * Kaynaklar
11 | * Çalışma Ortamı
12 | * Ders Takibi ve İletişim
13 | * Dersi Verenler
14 | * Sıkça Sorulan Sorular
15 | * Bilgisayar Mühendisliği Etiği
16 | * Bilgisayar Mühendisliği
17 |
18 | ## Dersin Amaçları
19 |
20 | * Bilgi çağı
21 | + Veri yönetimi, organizasyonların en temel etkinliklerinden birisi.
22 | + Doğru, ilgili ve zamanında elde edilebilen bilgi önemli.
23 | + Karar verme süreçlerinde çok etkili.
24 | + Kuruluşların yaşamını sürdürebilmesi açısından son derece önemli.
25 | * Çözüm: Veri Tabanı Yönetim Sistemi
26 | * Veri Tabanı Yönetim Sistemi
27 | + Verilerin saklanması, erişilmesi, düzenlenmesi.
28 | * Amacımız
29 | + Veritabanı Yönetim Sistemleri hakkında beceriler kazandırmak.
30 |
31 |
32 | 
33 |
34 | ## Değerlendirme
35 |
36 | * Yıl içi çalışmalar
37 |
38 | + Proje/Tasarım - %50
39 | + Ara sınav (vize) - %50
40 |
41 | * Yıl sonu
42 | + Yıl içi çalışmalar - %55
43 | + Yarıyıl sonu (final) sınavı - %45
44 |
45 |
46 | ## Kaynaklar
47 |
48 | * SABİS
49 | * GitHub Deposu
50 | + https://github.com/celalceken/DatabaseManagementSystems
51 | * Database Systems: Design, Implementation, and Management; Carlos Coronel, Steven Morris, Peter Rob; Cengage Learning
52 | * https://www.postgresql.org/docs/manuals/
53 | * https://www.draw.io
54 |
55 | ## Çalışma Ortamı
56 |
57 | ### PostgreSQL
58 |
59 | * Lisans ücreti gerektirmez
60 | * Açık kaynak
61 | * Gelişmiş bir ilişkisel veritabanı yönetim sistemi
62 | * Çok sayıda işletim sisteminde çalışır (Çoklu platform desteği)
63 | * https://www.postgresql.org
64 |
65 | ### pgAdmin
66 | + İstemci Yazılımı
67 | + pgAdmin 4
68 | + PostgreSQL ile dağıtılıyor.
69 | ### Valentina Studio
70 | + İstemci Yazılımı
71 | + https://www.valentina-db.com/en/valentina-studio-overview
72 | ### NorthWind veritabanı
73 | + https://code.google.com/archive/p/northwindextended/downloads
74 | ### Pagila veritabanı
75 | + http://www.postgresqltutorial.com/postgresql-sample-database
76 |
77 |
78 | ## Ders Takibi ve İletişim
79 |
80 | * Derse bizzat iştirak etmek öğrenme açısından önemlidir.
81 | * SABİS’i ve öğrenci e-posta adreslerinizi düzenli olarak kontrol ediniz.
82 | * Ödev duyuru ve bilgilendirmeleri SABİS sisteminden de gerçekleştirilir .
83 | * Diğer duyurular için bazen SABİS sistemi de kullanılabilir.
84 | * GitHub deposunu sürekli kontrol ediniz.
85 | * GitHub deposundaki ders notları, uygulamalar vb. içerikler sürekli güncellenmektedir.
86 | * https://github.com/celalceken/DatabaseManagementSystems
87 |
88 | ### Ders Sorumluları
89 |
90 | * Celal ÇEKEN
91 | + celalceken@sakarya.edu.tr - Oda No: 1156
92 | * İsmail ÖZTEL
93 | + ioztel@sakarya.edu.tr - Oda No: 1160
94 | * Mustafa Alp Eren KILIÇ
95 | + mustafakilic@sakarya.edu.tr - Oda No: 1206
96 |
97 | ## Ders Akışı
98 |
99 | 1. Veritabanı Sistemleri,
100 | 2. Veri Modelleri, Varlık Bağıntı Modeli
101 | 3. Varlık Bağıntı Modeli Uygulamaları
102 | 4. İlişkisel Veritabanı Modeli
103 | 5. Genişletilmiş Varlık Bağıntı Modeli, İlişkisel Cebir,
104 | 6. Yapısal Sorgulama Dili (Structured Query Language, SQL), Temel SQL Komutları (SQL DML Komutları; SELECT, JOIN, INSERT, UPDATE, DELETE)
105 | 7. Temel SQL (SQL DDL Komutları; CREATE, ALTER, DROP, ADD, SET, CONSTRAINTS)
106 | 8. Temel SQL (SQL DDL Komutları; İndeks (Index), Kalıtım, Tekli Bağıntı, SQL DML Komutları; Görünüm (View), Çoklu Satır Fonksiyonları, Gruplama)
107 | 9. Ara sınav
108 | 10. SQL Programlama
109 | 11. İleri SQL
110 | 12. Normalizasyon ve Başarım İyileştirme
111 | 13. Veritabanı Güvenliği, Diğer Veritabanı Modelleri
112 |
113 | ## Sıkça Sorulan Sorular
114 |
115 | * Derse geç kaldım. Girebilir miyim?
116 | + Ders düzenini bozmadan evet.
117 | * Ders esnasında acil bir işim çıktı. Çıkabilir miyim?
118 | + Ders düzenini bozmadan evet.
119 | * Ders esnasında cep telefonumu kullanabilir miyim?
120 | + Hayır. İhtiyaç durumunda dersten çıkarak telefon görüşmelerinizi yapabilirsiniz.
121 | * Derse bilgisayarımı getirmeli miyim?
122 | + Mümkünse evet. Ders esnasında sık sık uygulama gerçekleştirilecek. Bu uygulamaları dinlerken aynı zamanda bizzat geliştirmeniz öğrenmenize oldukça yardımcı olacaktır.
123 | * Ödevimi geç teslim edebilir miyim?
124 | + Hayır. Ödevler muhakkak son teslim zamanından önce teslim edilmelidir. Geç teslim edilen ödevlerde mazeret kabul edilmez.
125 | * Ara sınava katılamadım. Ne yapmalıyım?
126 | + Yönetmeliğe bakınız.
127 | * Final sınavına katılamadım. Ne yapmalıyım?
128 | + Yönetmeliğe bakınız.
129 | * Sınavımın yanlış değerlendirildiğini düşünüyorum. Ne yapabilirim?
130 | + Bizlerle iletişime geçebilirsiniz.
131 | * Ders esnasında ses, görüntü vb. kayıt işlemi gerçekleştirebilir miyim, fotoğraf çekebilir miyim?
132 | + Öncesinde bilgi verip izin almanız gerekmektedir.
133 | * İnternet üzerinden nasıl iletişim kurabilirim?
134 | + E-posta adreslerimize kimliğiniz belli olacak şekilde e-posta atabilirsiniz.
135 | * İnternette bulduğum bir çalışmanın tamamını veya bir kısmını ödev olarak verdim. Puan alamadım. Neden?
136 | + Ödevleriniz, kendi cümlelerinizle, kodlarınızla yazılmış kendi özgün çalışmalarınız olmalı.
137 | + Yararladığınız kaynakları, kaynakça kısmında belirtmeli ve o kaynaklardan edindiğiniz bilgileri referans göstererek kendi cümlelerinizle yazmalısınız.
138 | * Arkadaşımın yaptığı çalışmayı ödev olarak verdim. Puan alamadım. Neden?
139 | + Yukarıdaki maddeye bakınız.
140 | * Dersi farklı şubeden takip edebilir miyim?
141 | + Derslerinizi kayıt olduğunuz şubeden takip etmelisiniz.
142 | + Yoklamayı muhakkak imzalamalısınız.
143 | + Eğer yoklama size ulaşmadıysa ders sonunda beni bilgilendirmelisiniz.
144 | + Gayri resmi olarak farklı şubemizdeki bir derse veya vermiş olduğumuz başka bir derse katılmanızda sakınca yoktur.
145 |
146 |
147 | ## Bilgisayar Mühendisliği Etiği
148 |
149 | * Geliştirdiğin ürünler çevreye, doğaya ve insana zarar vermesin.
150 | * Projelerinde öncelikli hedefin toplum faydası olsun.
151 | * Kendi ürünlerinin telif haklarını al ve koru.
152 | * Başkalarının ürünlerinin telif haklarını ihlal etme.
153 | * Korsan yazılım, kitap vb. kullanma; kullananları bilinçlendir.
154 | * Kendi dokümantasyonunu kendin yaz.
155 | * Kendi kodunu kendin yaz.
156 | + Senin olmayan kodu kullanmadan önce lisansını incele.
157 | + Eğer lisansı izin veriyorsa izin verdiği ölçüde ve şekilde kullan. Lisansı izin vermiyorsa kullanma.
158 | * Her durumda yararlandığın çalışmanın sahibine referans ver.
159 | * Lisans ne demek?
160 | + Bir eserin kullanımına, düzenlenmesine ve dağıtımına ilişkin kuralları belirleyen metin.
161 | * Eser ne demek?
162 | + Yazılım, Kaynak Kod, Fotoğraf, Resim, Kitap vb. her şey.
163 | * Özgür yazılım lisansı
164 | + GPL, BSD, Apache, PostgreSQL, MIT vb.
165 |
166 |
167 | ## Bilgisayar Mühendisliği
168 |
169 | ### İlgili Meslekler
170 |
171 | * Bilgisayar Mühendisliği (Computer Engineering)
172 | * Bilgisayar Bilimleri (Computer Science)
173 | * Elektrik-Elektronik Mühendisliği (Electrical and Electronics Engineering)
174 | * Yazılım Mühendisliği (Software Engineering)
175 | * Bilişim Sistemleri Mühendisliği (Information Systems Engineering)
176 |
177 | ### Tanımlar
178 |
179 | * **Bilgisayar mühendisi:** Geleceğin bilgisayarını tasarlayan ve geliştiren kişidir.
180 | * **Bilgisayar mühendisliği:** Geleceğin bilgisayar sistemlerinin donanım ve yazılım bileşenlerinin tasarımı, gerçeklenmesi ve idamesinin icra edildiği meslek. Bilgisayar bilimleri ve elektrik-elektronik mühendisliğinin birleşimi.
181 |
182 | ### Bazı Çalışma Alanları
183 |
184 | * Donanım tasarımı ve inşası
185 | * Entegre devre tasarımı ve gerçeklenmesi (VLSI, FPGA vb.)
186 | * Yerleşik yazılım (firmware) tasarımı ve gerçeklenmesi
187 | * İşletim sistemi tasarımı ve gerçeklenmesi
188 | * Sistem ve uygulama programlarının tasarımı ve gerçeklenmesi
189 |
190 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2016 Celal Ceken & Veysel Harun Sahin
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/OrnekVeritabanlari/NorthWind.backup:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/OrnekVeritabanlari/NorthWind.backup
--------------------------------------------------------------------------------
/OrnekVeritabanlari/NorthWind.sql.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/OrnekVeritabanlari/NorthWind.sql.zip
--------------------------------------------------------------------------------
/OrnekVeritabanlari/dvdrental.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/OrnekVeritabanlari/dvdrental.zip
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Bilgi çağının yaşandığı günümüzde veri yönetimi, organizasyonların en temel etkinliklerinden biridir. Doğru, ilgili ve zamanında elde edilebilen bilgi, karar verme süreçlerinde çok etkilidir ve kuruluşların yaşamını sürdürebilmesi açısından son derece önemlidir. Burada yer alan içerikler, verilerin saklanması ve etkin olarak erişilmesi amacıyla kullanılan veritabanlarının tasarlanması ve yönetilmesi konularında beceriler kazandırmayı hedeflemektedir.
2 |
3 | Notlar içerisinde yer alan konular; Veritabanı Sistemleri, Veri Modelleri, Varlık Bağıntı Modeli, Genişletilmiş Varlık Bağıntı Modeli, İlişkisel Veritabanı Modeli, İlişkisel Cebir, Yapısal Sorgulama Dili (SQL), İleri SQL, Normalizasyon ve Başarım İyileştirme, SQL Programlama, Veritabanı Güvenliği, Diğer Veritabanı Modelleri.
4 |
5 | Bu depoda yer alan içerikler Veysel Harun Şahin, İsmail Öztel, Gözde Yolcu Öztel ve Celal Çeken tarafından hazırlanmıştır.
6 |
--------------------------------------------------------------------------------
/SSS.md:
--------------------------------------------------------------------------------
1 |
2 | # Sıkça Sorulan Sorular ve İstekler
3 |
4 | ### AraSınav (Vize) / YarıyılSonu (Final) beklediğimden düşük geldi. Ne yapabilirim?
5 | Yanlışlık yapılma ihtimalinin çok yüksek olduğunu düşünüyorsanız ve notlara son hal verilmemiş ise, sınav kağıdınıza kendiniz gelerek bakabilirsiniz. Notlara son hal verilmiş ise bölüme dilekçe vererek kağıdınızın incelenmesini isteyebilirsiniz.
6 |
7 |
8 | ### Harf notları aralıkları nelerdir? Not aralığımı değiştirebilir misiniz?
9 |
10 | Kişiye özel bir uygulama kesinlikle yapılamamaktadır.
11 |
12 |
13 | ### Notumu yükseltebilir misiniz?
14 |
15 | Aldığınız not, yaptıklarınızın karşılığıdır. Bir hata olmadığı sürece değiştirilemez.
16 |
17 |
18 | ### Ödev notum beklediğimden düşük geldi inceleyebilir misiniz?
19 |
20 | Ödev değerlendirmesini dersin yardımcısı olan araştırma görevlileri yapmaktadır. Sorunlarınızı onlarla paylaşmalısınız.
21 |
22 |
23 | ### Ödev ile ilgili sorularım var.
24 |
25 | Ödev değerlendirmesini dersin yardımcısı olan araştırma görevlileri yapmaktadır. Sorunlarınızı onlarla paylaşmalısınız.
26 |
27 |
28 | ### Ödevimi zamanında gönderemedim. Şimdi göndersem kabul edermisiniz?
29 |
30 | Ödevler için yeterince süre verilmektedir. Yaptığınız kadarıyla zamanında gönderiniz. Geciktirilen ödevler kesinlikle değerlendirilmemektedir.
31 |
--------------------------------------------------------------------------------
/Sekiller/01/AlgilayiciVerileri.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/01/AlgilayiciVerileri.png
--------------------------------------------------------------------------------
/Sekiller/01/BuyukResim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/01/BuyukResim.png
--------------------------------------------------------------------------------
/Sekiller/01/DosyaYapisi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/01/DosyaYapisi.png
--------------------------------------------------------------------------------
/Sekiller/01/ETicaret.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/01/ETicaret.png
--------------------------------------------------------------------------------
/Sekiller/01/GitVerileri.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/01/GitVerileri.png
--------------------------------------------------------------------------------
/Sekiller/01/IliskiselSema.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/01/IliskiselSema.png
--------------------------------------------------------------------------------
/Sekiller/01/VeritabaniSiniflariTablo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/01/VeritabaniSiniflariTablo.png
--------------------------------------------------------------------------------
/Sekiller/01/VeritabaniSistemi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/01/VeritabaniSistemi.png
--------------------------------------------------------------------------------
/Sekiller/01/VeritabaniVeDosyaSistemi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/01/VeritabaniVeDosyaSistemi.png
--------------------------------------------------------------------------------
/Sekiller/02/AgModeli.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/AgModeli.png
--------------------------------------------------------------------------------
/Sekiller/02/BirBirBagintisi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/BirBirBagintisi.png
--------------------------------------------------------------------------------
/Sekiller/02/BirCokBagintisi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/BirCokBagintisi.png
--------------------------------------------------------------------------------
/Sekiller/02/ChenGosterimi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/ChenGosterimi.png
--------------------------------------------------------------------------------
/Sekiller/02/CokCokBagintisi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/CokCokBagintisi.png
--------------------------------------------------------------------------------
/Sekiller/02/CokCokBagintisi2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/CokCokBagintisi2.png
--------------------------------------------------------------------------------
/Sekiller/02/CokluDeger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/CokluDeger.png
--------------------------------------------------------------------------------
/Sekiller/02/DahiliModel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/DahiliModel.png
--------------------------------------------------------------------------------
/Sekiller/02/DosyaYapisi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/DosyaYapisi.png
--------------------------------------------------------------------------------
/Sekiller/02/ETicaret.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/ETicaret.png
--------------------------------------------------------------------------------
/Sekiller/02/HariciModel1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/HariciModel1.png
--------------------------------------------------------------------------------
/Sekiller/02/HariciModel2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/HariciModel2.png
--------------------------------------------------------------------------------
/Sekiller/02/HiyerarsikModel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/HiyerarsikModel.png
--------------------------------------------------------------------------------
/Sekiller/02/IkiliBaginti.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/IkiliBaginti.png
--------------------------------------------------------------------------------
/Sekiller/02/IliskiselSema.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/IliskiselSema.png
--------------------------------------------------------------------------------
/Sekiller/02/KavramsalModel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/KavramsalModel.png
--------------------------------------------------------------------------------
/Sekiller/02/ModelTablosu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/ModelTablosu.png
--------------------------------------------------------------------------------
/Sekiller/02/TekliBaginti.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/TekliBaginti.png
--------------------------------------------------------------------------------
/Sekiller/02/UcluBaginti.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/UcluBaginti.png
--------------------------------------------------------------------------------
/Sekiller/02/VarOlmaBagimliligi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/VarOlmaBagimliligi.png
--------------------------------------------------------------------------------
/Sekiller/02/VarOlmaBagimliligi2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/VarOlmaBagimliligi2.png
--------------------------------------------------------------------------------
/Sekiller/02/VarolmaBagimliligiTanimlamaBagintisi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/VarolmaBagimliligiTanimlamaBagintisi.png
--------------------------------------------------------------------------------
/Sekiller/02/YasamDongusu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/YasamDongusu.png
--------------------------------------------------------------------------------
/Sekiller/02/ZayifGucluBagintilar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/02/ZayifGucluBagintilar.png
--------------------------------------------------------------------------------
/Sekiller/03/AracUreticisi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/03/AracUreticisi.png
--------------------------------------------------------------------------------
/Sekiller/03/Kitabevi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/03/Kitabevi.png
--------------------------------------------------------------------------------
/Sekiller/03/UBSTablo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/03/UBSTablo.png
--------------------------------------------------------------------------------
/Sekiller/03/UBSVBDiyagrami.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/03/UBSVBDiyagrami.png
--------------------------------------------------------------------------------
/Sekiller/04/AracUreticisi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/AracUreticisi.png
--------------------------------------------------------------------------------
/Sekiller/04/BirBirBagintisi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/BirBirBagintisi.png
--------------------------------------------------------------------------------
/Sekiller/04/BirCokBagintisi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/BirCokBagintisi.png
--------------------------------------------------------------------------------
/Sekiller/04/ButunlukKurallari.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/ButunlukKurallari.png
--------------------------------------------------------------------------------
/Sekiller/04/CokCokBagintisi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/CokCokBagintisi.png
--------------------------------------------------------------------------------
/Sekiller/04/E-TicaretTablo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/E-TicaretTablo.png
--------------------------------------------------------------------------------
/Sekiller/04/ETicaret_Kucuk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/ETicaret_Kucuk.png
--------------------------------------------------------------------------------
/Sekiller/04/Iliski.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/Iliski.png
--------------------------------------------------------------------------------
/Sekiller/04/Indeks.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/Indeks.png
--------------------------------------------------------------------------------
/Sekiller/04/Tablo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/Tablo.png
--------------------------------------------------------------------------------
/Sekiller/04/TekliBaginti.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/TekliBaginti.png
--------------------------------------------------------------------------------
/Sekiller/04/TemelKavramlar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/TemelKavramlar.png
--------------------------------------------------------------------------------
/Sekiller/04/VarOlmaBagimliligi.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/VarOlmaBagimliligi.jpg
--------------------------------------------------------------------------------
/Sekiller/04/VarOlmaBagimliligi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/VarOlmaBagimliligi.png
--------------------------------------------------------------------------------
/Sekiller/04/VekilBirincilAnahtar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/VekilBirincilAnahtar.png
--------------------------------------------------------------------------------
/Sekiller/04/YabanciAnahtar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/YabanciAnahtar.png
--------------------------------------------------------------------------------
/Sekiller/04/YabanciAnahtar2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/04/YabanciAnahtar2.png
--------------------------------------------------------------------------------
/Sekiller/05/Birlesim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Birlesim.png
--------------------------------------------------------------------------------
/Sekiller/05/Birlesim2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Birlesim2.png
--------------------------------------------------------------------------------
/Sekiller/05/Bolme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Bolme.png
--------------------------------------------------------------------------------
/Sekiller/05/Bolme2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Bolme2.png
--------------------------------------------------------------------------------
/Sekiller/05/DogalBirlestirme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/DogalBirlestirme.png
--------------------------------------------------------------------------------
/Sekiller/05/DogalBirlestirme2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/DogalBirlestirme2.png
--------------------------------------------------------------------------------
/Sekiller/05/ETicaret.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/ETicaret.png
--------------------------------------------------------------------------------
/Sekiller/05/ETicaretKumeleme1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/ETicaretKumeleme1.png
--------------------------------------------------------------------------------
/Sekiller/05/ETicaretKumeleme2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/ETicaretKumeleme2.png
--------------------------------------------------------------------------------
/Sekiller/05/Fark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Fark.png
--------------------------------------------------------------------------------
/Sekiller/05/Fark2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Fark2.png
--------------------------------------------------------------------------------
/Sekiller/05/KalitimPersonel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/KalitimPersonel.png
--------------------------------------------------------------------------------
/Sekiller/05/Kartezyen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Kartezyen.png
--------------------------------------------------------------------------------
/Sekiller/05/Kartezyen2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Kartezyen2.png
--------------------------------------------------------------------------------
/Sekiller/05/Kesisim_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Kesisim_1.png
--------------------------------------------------------------------------------
/Sekiller/05/Kesisim_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Kesisim_2.png
--------------------------------------------------------------------------------
/Sekiller/05/Kisi1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Kisi1.png
--------------------------------------------------------------------------------
/Sekiller/05/Projeksiyon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Projeksiyon.png
--------------------------------------------------------------------------------
/Sekiller/05/Projeksiyon2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Projeksiyon2.png
--------------------------------------------------------------------------------
/Sekiller/05/Projeksiyon3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Projeksiyon3.png
--------------------------------------------------------------------------------
/Sekiller/05/SagDisBirlestirme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/SagDisBirlestirme.png
--------------------------------------------------------------------------------
/Sekiller/05/SagDisBirlestirme2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/SagDisBirlestirme2.png
--------------------------------------------------------------------------------
/Sekiller/05/Select.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Select.png
--------------------------------------------------------------------------------
/Sekiller/05/Select2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Select2.png
--------------------------------------------------------------------------------
/Sekiller/05/Select3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Select3.png
--------------------------------------------------------------------------------
/Sekiller/05/Select4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Select4.png
--------------------------------------------------------------------------------
/Sekiller/05/SolDisBirlestirme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/SolDisBirlestirme.png
--------------------------------------------------------------------------------
/Sekiller/05/SolDisBirlestirme2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/SolDisBirlestirme2.png
--------------------------------------------------------------------------------
/Sekiller/05/Soru1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Soru1.png
--------------------------------------------------------------------------------
/Sekiller/05/Soru2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Soru2.png
--------------------------------------------------------------------------------
/Sekiller/05/Soru3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Soru3.png
--------------------------------------------------------------------------------
/Sekiller/05/Soru4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Soru4.png
--------------------------------------------------------------------------------
/Sekiller/05/Soru5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Soru5.png
--------------------------------------------------------------------------------
/Sekiller/05/Soru6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Soru6.png
--------------------------------------------------------------------------------
/Sekiller/05/Urun1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/05/Urun1.png
--------------------------------------------------------------------------------
/Sekiller/06/DogalBirlestirme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/06/DogalBirlestirme.png
--------------------------------------------------------------------------------
/Sekiller/06/SagDisBirlestirme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/06/SagDisBirlestirme.png
--------------------------------------------------------------------------------
/Sekiller/06/SolDisBirlestirme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/06/SolDisBirlestirme.png
--------------------------------------------------------------------------------
/Sekiller/06/YapisalSorgulamaDili.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/06/YapisalSorgulamaDili.png
--------------------------------------------------------------------------------
/Sekiller/07/YabanciAnahtar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/07/YabanciAnahtar.png
--------------------------------------------------------------------------------
/Sekiller/08/PersonelKalitim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/08/PersonelKalitim.png
--------------------------------------------------------------------------------
/Sekiller/08/TekliBaginti.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/08/TekliBaginti.png
--------------------------------------------------------------------------------
/Sekiller/10/NorthWind.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/10/NorthWind.png
--------------------------------------------------------------------------------
/Sekiller/10/a.png:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Sekiller/11/Donguler.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/11/Donguler.png
--------------------------------------------------------------------------------
/Sekiller/11/KosulluIfadeler.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/11/KosulluIfadeler.png
--------------------------------------------------------------------------------
/Sekiller/11/Tetikleyici.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/11/Tetikleyici.png
--------------------------------------------------------------------------------
/Sekiller/11/WebUygulamaMimarisi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/11/WebUygulamaMimarisi.png
--------------------------------------------------------------------------------
/Sekiller/12/BirinciNormalForm_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/BirinciNormalForm_1.png
--------------------------------------------------------------------------------
/Sekiller/12/BirinciNormalForm_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/BirinciNormalForm_2.png
--------------------------------------------------------------------------------
/Sekiller/12/FonksiyonelBagimlilik.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/FonksiyonelBagimlilik.png
--------------------------------------------------------------------------------
/Sekiller/12/IkinciNormalForm_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/IkinciNormalForm_1.png
--------------------------------------------------------------------------------
/Sekiller/12/IkinciNormalForm_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/IkinciNormalForm_2.png
--------------------------------------------------------------------------------
/Sekiller/12/IkinciNormalForm_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/IkinciNormalForm_3.png
--------------------------------------------------------------------------------
/Sekiller/12/IyilestirilmisTasarim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/IyilestirilmisTasarim.png
--------------------------------------------------------------------------------
/Sekiller/12/IyilestirilmisTasarim1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/IyilestirilmisTasarim1.png
--------------------------------------------------------------------------------
/Sekiller/12/Ornek2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/Ornek2.png
--------------------------------------------------------------------------------
/Sekiller/12/Ornek_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/Ornek_1.png
--------------------------------------------------------------------------------
/Sekiller/12/UcuncuNormalForm_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/UcuncuNormalForm_1.png
--------------------------------------------------------------------------------
/Sekiller/12/UcuncuNormalForm_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/UcuncuNormalForm_2.png
--------------------------------------------------------------------------------
/Sekiller/12/UcuncuNormalForm_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/UcuncuNormalForm_3.png
--------------------------------------------------------------------------------
/Sekiller/12/VeriGirisindeTutarsizlik_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/VeriGirisindeTutarsizlik_1.png
--------------------------------------------------------------------------------
/Sekiller/12/VeriGirisindeTutarsizlik_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/VeriGirisindeTutarsizlik_2.png
--------------------------------------------------------------------------------
/Sekiller/12/VeriGuncellemedeTutarsizlik_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/VeriGuncellemedeTutarsizlik_1.png
--------------------------------------------------------------------------------
/Sekiller/12/VeriSilmedeTutarsizlik_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/VeriSilmedeTutarsizlik_1.png
--------------------------------------------------------------------------------
/Sekiller/12/VeriTekrarininZararlari_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/12/VeriTekrarininZararlari_1.png
--------------------------------------------------------------------------------
/Sekiller/BirinciNormalForm_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/BirinciNormalForm_1.png
--------------------------------------------------------------------------------
/Sekiller/BirinciNormalForm_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/BirinciNormalForm_2.png
--------------------------------------------------------------------------------
/Sekiller/Ornek2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/Ornek2.png
--------------------------------------------------------------------------------
/Sekiller/Ornek_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/celalceken/DatabaseManagementSystems/37fff2bd2dfce12dca010533a166228b3c54d1eb/Sekiller/Ornek_1.png
--------------------------------------------------------------------------------
/Semboller/Disjoint1.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Semboller/Disjoint2.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Semboller/Overlap1.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Semboller/Overlap2.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/VYS01.md:
--------------------------------------------------------------------------------
1 |
2 | BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
3 |
4 | ## Ders Tanıtımı
5 |
6 | Ders tanıtımı için aşağıdaki bağlantıları inceleyiniz.
7 |
8 | * https://ebs.sabis.sakarya.edu.tr
9 | * https://github.com/celalceken/DatabaseManagementSystems/blob/master/DersTanitimi.md
10 |
11 | # Veritabanı Sistemleri
12 |
13 | ## Konular
14 |
15 | * Büyük Resim
16 | * Niçin Veritabanı?
17 | * Veri ve Bilgi Kavramları
18 | * Klasik Dosya Yapıları
19 | * Klasik Dosya Sistemlerinin Zayıflıkları
20 | * Veritabanı Sistemi
21 | * Veritabanı Sistemi Ortamı
22 | * Veritabanı Yönetim Sistemi Kullanmanın Yararları - VTYS ile Dosya Sisteminin Karşılaştırılması
23 | * Örnek Bir Veritabanı
24 | * Veritabanı Sınıfları
25 | * Kaynaklar
26 |
27 |
28 | ## Büyük Resim
29 |
30 | 
31 |
32 | ## Niçin Veritabanı
33 |
34 | * Dosyalarda depolanan birbiriyle ilişkili veri topluluklarına veri tabanı denir .
35 | * Günümüz verileri; terabayt (1024 gigabayt), petabayt, ekzabayt, zetabayt, yotabayt boyutlarında.
36 | * Çin'in otuz futbol sahası büyüklüğündeki dev teleskobu ile saniyede 38 gigabyte veri toplanmaktadır. (2020)
37 | * Google, saniyede ortalama 40.000 aramayı işliyor (günlük ortalama 3,5 milyar, toplam günlük arama 5 milyar. Arama sonuçlarının hızlı bir şekilde kullanıcıya getirilmesi sağlanabiliyor. (2018)
38 | * Facebook kullanıcı sayısı 2 milyar. Günlük ortalama 1,5 milyar kullanıcı aktif. (2018)
39 | * Her dakika; 4.146.600 YouTube videosu izleniyor, 456.000 tweet atılıyor, Instagram’a 46.740 fotoğraf yükleniyor, Facebook’a 510.000 yorum ekleniyor. (2018)
40 | * Sprint, AT&T gibi mobil telefon operatörleri trilyonlarca konuşmayı saklamak/yönetmek zorundadır. Saniyede 70.000 konuşma eklenmektedir. (2007)
41 | * Bu verilerin saklanması/yönetilmesinin yanı sıra istenen bilgiye hızlı bir şekilde ulaşılması da gereklidir.
42 | * Bir jet uçağı 30 dakikada 10 terabaytlık algılayıcı verisi topluyor. (2012)
43 | * Nesnelerin interneti. 2020 yılında 50 milyar (bazı kaynaklara göre 200 Milyar) algılayıcının internete bağlanacağı öngörülüyor.
44 | * Bu kadar büyük boyuttaki verilerin saklanması, yönetilmesi ve hızlı bir şekilde istenen bilgilere ulaşılabilmesi için veritabanlarının kullanımı zorunludur.
45 | * Veritabanı, günümüzde birçok farklı sektörde ve kurumda yaygın olarak kullanılmaktadır.
46 | + Finans
47 | + Eğitim
48 | + Ulaşım
49 | + Taşımacılık
50 | + İletişim
51 | + Medya
52 | + Sağlık
53 | + Bilişim
54 | + Üretim
55 |
56 |
57 | ## Veri ve Bilgi Kavramları
58 |
59 | * İşlenerek anlam kazandırılmamış ham gerçeklere veri denir.
60 | * Veriler işlenerek bilgi oluşturulur
61 | * Bilgi, verinin anlamını göstermek için kullanılır.
62 | * Doğru, ilgili ve zamanında elde edilebilen bilgi, karar verme süreçlerinde çok etkilidir.
63 | * Doğru karar verme, kuruluşların yaşamını sürdürebilmesi açısından son derece önemlidir.
64 | * Veri yönetimi, organizasyonların en temel aktivitelerindendir.
65 | * **Veri yönetimi** verinin uygun bir şekilde üretimi, saklanması ve erişilmesiyle ilgilenen disiplindir.
66 |
67 | 
68 |
69 | 
70 |
71 |
72 | ## Klasik Dosya Yapısı
73 |
74 | * Veriler, kayıtlar halinde klasik dosya yapısı kullanılarak saklanır.
75 | * Örnek bir dosya yapısı aşağıda verilmiştir.
76 |
77 | 
78 |
79 |
80 | ## Veritabanı Sistemi
81 |
82 | * Veritabanı Sistemi = Veritabanı + VTYS + Kullanıcılar
83 | * Dosyalarda depolanan birbiriyle ilişkili veri topluluklarına veritabanı denir .
84 | + Veritabanı = HamVeri + ÜstVeri/Metadata (İlişkiler+Veri Karakteristikleri)
85 | * Veritabanı yapısını yöneten ve verilere erişimi sağlayan yazılımlara Veritabanı Yönetim Sistemi adı verilir.
86 |
87 | 
88 |
89 |
90 | ## Veritabanı Sistemi Ortamı
91 |
92 | * Donanım
93 | + Suncular, iş istasyonları, ağ ortamı, depolama cihazları, raid vb.
94 | * Yazılım
95 | + İşletim Sistemleri
96 | + VTYS (PostgreSQL, MySQL, DB2, Oracle, MSSQL, Cassandra, MongoDB, Redis vb.)
97 | + Uygulama programları ve yardımcı programlar
98 | * Kişiler
99 | + Sistem yöneticisi, veritabanı yöneticisi, veritabanı tasarımcısı, uygulama programcısı, kullanıcı
100 | * Veri
101 |
102 |
103 | ## Veritabanı Yönetim Sistemi Kullanmanın Yararları
104 | ### VTYS ile Dosya Sisteminin Karşılaştırılması
105 |
106 | * **Veri Tümleştirme (Data Integration):** Verilerin tekrarsız olarak etkin bir şekilde saklanması garanti edilebilir.
107 | * **Veri Bütünlüğü (Data Integrity):** Verilerin bozulmadan ve tutarlı olarak saklanması sağlanabilir. Kısıtlar eklenerek veri tutarsızlığı önlenebilir (key constraints, integrity rules).
108 | * **Veri Güvenliği (Data Security):** Sistem hataları karşısında ya da saldırıya rağmen verilerin kaybolmaması ve tutarlılığının korunması sağlanabilir (transaction, raid sistemler, kurtarma mekanizmaları, gelişmiş yetkilendirme yapısı vb.).
109 | * **Veri Soyutlama (Data Abstraction):** Kullanıcıya, karmaşık yapıdaki fiziksel veri yapısı yerine anlaşılabilirliği ve yönetilebilirliği daha kolay olan mantıksal model sunulur.
110 |
111 |
112 | 
113 |
114 |
115 | ### VTYS ile Dosya Sisteminin Karşılaştırılması
116 |
117 | * Klasik dosyadan okuma işlemi
118 |
119 | ```java
120 | String dosya = "Ogrenciler.dat";
121 | try {
122 | FileReader fileReader = new FileReader(dosya);
123 | BufferedReader bufferedReader = new BufferedReader(fileReader);
124 |
125 | String satir = null;
126 | while ((satir = bufferedReader.readLine()) != null) {
127 | System.out.println(satir);
128 | }
129 | bufferedReader.close();
130 | } catch (IOException e) {
131 | e.printStackTrace();
132 | }
133 | ```
134 |
135 | * VTYS (SQL) ile okuma işlemi
136 |
137 | ```sql
138 | SELECT * FROM Ogrenciler;
139 | ```
140 |
141 |
142 | ## Örnek Bir Veritabanı (Varlık Bağıntı Modeli)
143 |
144 | 
145 |
146 |
147 | ## Örnek Bir Veritabanı (İlişkisel Model)
148 |
149 | 
150 |
151 |
152 | ## Veritabanı Sınıfları
153 |
154 | * Kullanım Amacı
155 | + **Operasyonel:** Veriler üzerinde sürekli değişiklikler yapılır. (OLTP: Online Transaction Processing)
156 | + **Veri Ambarı:** Veriler raporlama ve karar destek amaçlarıyla kullanılır. (OLAP: Online Analytical Processing)
157 |
158 | 
159 |
160 |
161 | ## Kaynaklar
162 |
163 | * Carlos Coronel, Steven Morris, and Peter Rob, Database Systems: Design, Implementation, and Management, Cengage Learning.
164 | * http://www.digitalinformationworld.com/2015/02/fascinating- social-networking-stats-2015.html
165 | * https://www.forbes.com/sites/bernardmarr/2018/05/21/how- much-data-do-we-create-every-day-the-mind-blowing-stats- everyone-should-read/#230ac18d60ba
166 | * Apache Spark Tutorial | Spark Tutorial for Beginners | Apache Spark Training | Edureka
167 | + https://www.youtube.com/watch?v=9mELEARcxJo
168 |
--------------------------------------------------------------------------------
/VYS02.md:
--------------------------------------------------------------------------------
1 |
2 | BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
3 |
4 | # İş Kuralları, Veri Modelleri, Varlık Bağıntı Modeli
5 |
6 | ## Konular
7 |
8 | * Veritabanı Geliştirme Yaşam Döngüsü
9 | * İş Kuralları (Business Rules)
10 | * Veri Modeli Temel Bileşenleri
11 | * İş Kurallarını Veri Modeline Dönüştürme
12 | * Veri Modellerinin Gelişimi
13 | * Dosya Sistemi
14 | * Hiyerarşik Model
15 | * Ağ Modeli
16 | * İlişkisel Model
17 | * Varlık Bağıntı Modeli
18 | * Nesne Yönelimli Model
19 | * Yeni Veri Modelleri
20 | * Veri Soyutlama
21 | * Varlık Bağıntı Modeli
22 | * Temel Kavramlar
23 | * Varlıklar Arası Bağıntılar
24 | * Var Olma Bağımlılığı (Existence Dependency)
25 | * Zayıf/Güçlü Bağıntılar
26 | * Bağıntı Dereceleri
27 | * Varlık Bağıntı Modeli (VBM/ERM) ile Tasarım
28 | * Kaynaklar
29 |
30 |
31 | ## Veritabanı Geliştirme Yaşam Döngüsü
32 |
33 | 
34 |
35 |
36 | ## İş Kuralları (Business Rules)
37 |
38 | * Veritabanı (varlık, nitelik, bağıntı ve kısıtlar) oluşturulurken iş kurallarına bakılır.
39 | * **İş kuralı:** Veritabanı tasarımı yapılacak organizasyon ile ilgili işleyiş, kural ya da yönetmeliğin özetlenmiş şekline iş kuralları denilebilir. İş kuralları ihtiyaç listesine benzer.
40 | * Örnek iş kuralları:
41 | + Bir müşteri çok sayıda sipariş verebilir.
42 | + Her müşterinin adı, soyadı, telefon numarası vs. istenir.
43 | + Öğrenciler bir ara sınav ve bir yarıyıl sonu sınavına girerler.
44 | * İş kurallarının kaynağı, son kullanıcılar, yöneticiler, kural koyucular ve yazılı dokümanlar (standart, yönetmelik vs.) olabilir.
45 | * İş kurallarını oluşturmak için doğrudan son kullanıcılarla görüşmek oldukça etkili bir çözümdür.
46 | * Veritabanı tasarımı açısından iş kurallarının önemi;
47 | + Kullanıcılar ile tasarımcılar arasındaki iletişimi sağlar.
48 | + Tasarımcının verinin doğasını, önemini ve kapsamını anlamasını sağlar.
49 | + Tasarımcının iş süreçlerini anlamasını sağlar.
50 | + Tasarımcının doğru bir veri modeli geliştirmesine yardım eder (veriler arası ilişkiler ve kısıtların kolayca belirlenmesini sağlar).
51 | + Kuruluşun veriye bakışını standart haline getirir.
52 | * İş kuralları oluşturulduktan sonra, gerçekleştirilecek veritabanının modellenmesi aşamasına geçilir.
53 |
54 |
55 | ## Veri Modeli
56 |
57 | * **Veri modeli:** Karmaşık gerçek dünya veri yapılarının basit olarak gösterilmesi (genellikle grafiksel) için kullanılan araca veri modeli ismi verilir.
58 | * Veri modeli, veritabanı tasarımcıları, uygulama programcıları ve son kullanıcılar arasındaki iletişimi kolaylaştırır.
59 | * Veri modelleri sayesinde veritabanı tasarımını gerçekleştirmek daha kolay olur.
60 | * Veri modelleme yinelemeli (iterative) bir işlemdir. Önce basit model oluşturulur. Daha sonra ayrıntılar eklenir. En sonunda veritabanı tasarımında kullanılan şablon (blueprint) elde edilir.
61 |
62 |
63 | ## Veri Modelinin Temel Bileşenleri
64 |
65 | * **Varlık (Entity):** Hakkında veri toplanan ve saklanan her şey (öğrenci, ders, personel vb.). Gerçek dünyadaki nesneleri ifade eder. Var olan ve benzerlerinden ayırt edilebilen her şey.
66 | * **Varlık kümesi (Entity set):** Aynı türden varlıkların oluşturduğu kümeye denir (Öğrenciler, Dersler vb.).
67 | * **Nitelik (Attribute):** Varlığın sahip olduğu özellikler.
68 | * **Bağıntı (Relationship):** Varlıklar arasındaki ilişkiyi ifade eder.
69 | + Bir-Çok (One to Many 1:M)
70 | + Bir müşteri çok sayıda sipariş verebilir.
71 | + Her sipariş yalnızca bir müşteri tarafından verilir.
72 | + Çok-Çok (Many to Many M:N)
73 | + Bir öğrenci çok sayıda ders alabilir.
74 | + Her ders çok sayıda öğrenci tarafından alınabilir.
75 | + Bir-Bir (One to One 1:1)
76 | + Bir mağaza bir personel tarafından yönetilir.
77 | + Bir personel bir mağazayı yönetir.
78 | * **Kısıtlar (Constraints):** Veri üzerindeki sınırlamalardır. Veri bütünlüğünün sağlanması açısından önemlidir. Örneğin;
79 | + Öğrenci notunun 0-100 arasında olması
80 | + T.C. kimlik numarasının 11 karakter olması
81 | + Aynı ürünün birden fazla kayıt edilememesi
82 |
83 |
84 | ## Veri Modellerinin Gelişimi
85 |
86 | * Dosya Sistemi
87 | * Hiyerarşik Model
88 | * Ağ Modeli
89 | * İlişkisel model
90 | * Varlık Bağıntı modeli
91 | * Nesne Yönelimli Model
92 | * Yeni Veri Modelleri
93 |
94 |
95 | ## Dosya Sistemi
96 |
97 | * 1960-1970 lerde çoğunlukla IBM ana çatı (mainframe) sistemlerde kullanılmıştır
98 | * Dosyalar arasında ilişki yoktur.
99 | * Veri tekrarı ve sıralı tarama gibi sorunları bulunmaktadır.
100 | * Örnek bir dosya yapısı aşağıda görünmektedir.
101 |
102 | 
103 |
104 |
105 | ## Hiyerarşik Model
106 |
107 | * 1960’larda büyük miktardaki verileri yönetebilmek için geliştirilmiştir.
108 | * Veriler ağaç yapısı şeklinde organize edilir.
109 | * Ana-çocuk (parent-child) arasında 1:M ilişkisi vardır. Kayıtların sadece 1 ana (parent) kaydı vardır.
110 |
111 | 
112 |
113 |
114 | ## Ağ Modeli
115 |
116 | * 1970’lerde geliştirilmiştir. Veritabanı başarımını artırmak üzere daha karmaşık ilişkilere izin verilir.
117 | * Hiyerarşik modelden farklı olarak kayıtların birden fazla ana (parent) kayıtları olabilir.
118 | * Ağ modeliyle birlikte ortaya çıkan ve hala kullanılan bazı kavramlar aşağıdadır.
119 | + **Şema:** Tüm veritabanının, veritabanı yöneticisi tarafından görünen kavramsal organizasyonu.
120 | + **Alt şema:** Veritabanının istenen bilgiyi üreten uygulama programı tarafından görünen kısmı.
121 | + **Veri işleme dili (data manipulation language, DML):** Veritabanında bulunan verilerin, sorgulama işlemleri yapılarak güncellenmesi, yeni verilerin eklenmesi ve olan verilerin silinme işlemlerinin yapılmasını sağlayan dil.
122 | + **Veri tanımlama dili (data definition language, DDL):** Veritabanında bulunan verilerin tip, yapı ve kısıtlamalarının tanımlanmasını sağlayan dil.
123 | + **Anlık sorgu (ad hoc query):** Yazılımlarla birlikte gelmeyen kullanıcının kendi oluşturduğu sorgulara verilen isimdir.
124 | * Ağ modelinin dezavantajı, çok basit sorgular için bile karmaşık program kodlarının kullanımını gerektirmesidir.
125 |
126 | 
127 |
128 |
129 | ## İlişkisel Model
130 |
131 | * 1970’de E. F. Codd tarafından ortaya atılmıştır (A Relational Model of Data for Large Shared Databanks, Communications of the ACM, June 1970, pp. 377−387).
132 | * İlişkisel Veritabanı Yönetim Sistemleri (Relational Database Management Systems, RDBMS) tarafından kullanılır.
133 | * RDBMS’nin en önemli özelliklerinden birisi ilişkisel modelin karmaşık yapısını kullanıcıdan gizlemesidir.
134 | * Kullanıcı, ilişkisel modeli, verileri içeren tablolardan oluşan bir yapı gibi görür.
135 | * Tablolar birbirlerine ortak alanlarla bağlanırlar.
136 | * İlişkisel şema, varlıklar, varlıkların nitelikleri ve aralarındaki bağlantıların gösteriminden oluşur.
137 |
138 | 
139 |
140 | * İlişkisel veritabanı modelinin en güçlü yanlarından birisi, verileri yönetmek için yapısal sorgulama dili (structured query language, SQL) dilinin kullanılıyor olmasıdır.
141 | * SQL dili nasıl yapılması gerektiğini anlatmak yerine ne yapılması gerektiğinin ifade edildiği basit bir dildir.
142 | * Bu nedenle, SQL kullanılarak veri tabanlarının tasarımı ve yönetimi daha kolaydır.
143 | * İlişkisel bir veritabanı yönetim sistemi 3 temel bileşenden oluşur.
144 | + Verilerin saklandığı veritabanı
145 | + SQL komutlarını derleyerek istenenleri gerçekleştiren SQL Motoru (SQL Engine)
146 | + Kullanıcılarla iletişimi sağlayan arayüzler.
147 |
148 |
149 | ## Varlık Bağıntı Modeli
150 |
151 | * İlişkisel model daha önceki modellere göre çok daha kullanışlı olmasına rağmen veritabanı tasarımı için ilişkisel modelin grafiksel gösterimi olan varlık bağıntı modeli (VBM) (entity relationship model, ERM) daha sık kullanılır.
152 | 1976’da Peter Chen tarafından önerilmiştir.
153 | * İlişkisel modelinin tamamlayıcısı olduğu için kullanımı oldukça yaygınlaşmıştır.
154 | * i) Chen gösterimi ve ii) Crow’s Foot gösterimi sıkça kullanılan gösterim şekillerindendir.
155 | * Ders kapsamında Crow’s Foot gösterimi kullanılacaktır.
156 |
157 | ### Chen Gösterimi
158 |
159 | 
160 |
161 |
162 | ### Crow’s Foot Gösterimi
163 |
164 | 
165 |
166 |
167 |
168 | ## Nesne Yönelimli Model
169 |
170 | * Nesne yönelimli programlama paradigmasından esinlenerek geliştirilen modeldir.
171 | * Varlık bağıntı (VB - ER) modelindeki varlık (entity) bu modelde nesne olarak adlandırılır.
172 | * Nesne hakkındaki bilgi, VB modelindeki niteliklere karşılık gelir.
173 | * Varlık kümesi sınıf olarak adlandırılır.
174 | * VB modelinden farklı olarak sınıflar üye fonksiyonlara da sahiptirler. Kisi ara, Ad listele vb.
175 |
176 | 
177 |
178 |
179 |
180 | ## Yeni Veri Modelleri
181 |
182 | * Nesne İlişkisel Model (Object/Relational Model)
183 | + İlişkisel modelle nesne yönelimli modelin birleştirilmesi sonucu ortaya çıkmıştır.
184 | * Genişletilebilir İşaretleme Dili (Extensible Markup Language, XML)
185 | + Çoğunlukla, farklı platformlar arası veri değişimi için kullanılan veri tanımlama standardıdır. Yapısal olmayan verileri tanımlamak için de kullanılır.
186 | * JavaScript Nesne Gösterimi (JavaScript Object Notation, JSON)
187 | + Çoğunlukla, farklı platformlar arası veri değişimi için kullanılan veri tanımlama standardıdır. Yapısal olmayan verileri tanımlamak için de kullanılır.
188 | * NoSQL
189 | + İlişkisel modelin yetersiz kaldığı büyük hacimli verilerin yönetimi için tercih edilir.
190 |
191 |
192 | ## Veri Soyutlama
193 |
194 | Veri modellerinin daha iyi anlaşılabilmesini sağlamak amacıyla ANSI-SPARC, 1970’lerin başında, veri soyutlamanın 3 düzeyini tanımlamıştır. (ANSI-SPARC: American National Standards Institute, Standards Planning and Requirements Committee.)
195 |
196 | * Harici Model (External Model)
197 | * Kavramsal Model (Conceptual Model)
198 | * Dahili Model (Internal Model)
199 |
200 |
201 | ### Harici Model (External Model)
202 |
203 | * Veritabanının son kullanıcılar açısından görünen kısmı. Veritabanının sadece kullanıcıyla ilgili alt bölümlerini ifade eder.
204 |
205 | 
206 |
207 | 
208 |
209 |
210 | ### Kavramsal Model (Conceptual Model)
211 |
212 | * Veritabanının veritabanı tasarımcısı açısından görünen kısmı. Veritabanının tüm alt bölümlerini birleştirerek global olarak görünmesini sağlar.
213 | * Varlık Bağıntı Diyagramı (VBD – ERD) ile gösterilir. Kullanılan yazılım (DBMS) ve donanımdan bağımsızdır. Donanım ya da yazılım değişikliği kavramsal model tasarımını etkilemez.
214 | * Kavramsal model mantıksal görünüş olarak da kullanılır.
215 |
216 | 
217 |
218 |
219 |
220 | ### Dahili Model (Internal Model)
221 |
222 | * Veritabanının, Veritabanı Yönetim Sistemi tarafından görünen kısmı.
223 | * Dahili model = ilişkisel model
224 | * Donanım bağımsız, yazılım bağımlı.
225 |
226 | 
227 |
228 |
229 |
230 | ## Varlık Bağıntı Modeli
231 |
232 | Bu bölümde varlık bağıntı modeli detaylı bir şekilde anlatılmaktadır.
233 |
234 |
235 | ## Giriş
236 |
237 | * Varlık Bağıntı Diyagramı (VBD, Entity Relationship Diagram (ERD)) veritabanının kavramsal olarak modellenmesini sağlayan yazılım ve donanımlardan tamamen bağımsız gösterim şekilleridir.
238 | * Farklı kullanıcılar arasında haberleşmeyi sağlamak için kullanılır.
239 | * VB modeline bakarak veri tabanının tasarımını gerçekleştirmek daha kolaydır.
240 | * VBD, veritabanının temel bileşenleri olan varlık, nitelik (özellik), varlıklar arası bağıntılar (relationship) ve kısıtlardan meydana gelen çizelgelerdir.
241 | * Chen notasyonu kavramsal modellemeyi ön plana çıkartır.
242 | * Crow's Foot notasyonu ise daha çok uygulama (implementasyon) yönelimli yaklaşımı ön plana çıkartır.
243 | * UML notasyonu, hem kavramsal hem de uygulama (implementasyon) modelleme yöntemleri için kullanılabilir.
244 |
245 | ## İş Kurallarını Varlık Bağıntı Modeline Dönüştürme
246 |
247 | * Genel olarak iş kurallarındaki isimler varlık, fiiller ise varlıklar arasındaki bağıntı olma adayıdır.
248 | * Hakkında bilgi bulunan isim ya da isim tamlamaları varlık adayı iken, bilgi bulunmayanlar varlığa ait nitelik adayıdır.
249 | + _Müşterinin_ **ad, soyad, numara, adres** bilgileri saklanır.
250 | + Bir _müşteri_ çok sayıda _fatura_ **_üretir_**.
251 | * Bağıntılar iki yönlüdür.
252 | + **1 öğretim üyesi çok** sayıda (4) **ders** verebilir
253 | + **1 ders** sadece **1 öğretim üyesi** tarafından verilebilir.
254 | + **1 kişi 1 bölüme** yönetici olabilir.
255 | + **1 bölüm** sadece **1 kişi** tarafından yönetilebilir.
256 | + **1 öğrenci çok** sayıda **derse** kayıt yaptırabilir
257 | + **1 ders çok** sayıda **öğrenci** tarafından alınabilir.
258 | * İsimlendirme kuralları
259 | * Kodlama türleri
260 | + Linux Coding Style, Linus Torvalds
261 | + Hungarian Notation,
262 | + GNU Coding Standards
263 | + Java Coding Style Guide
264 |
265 | * Birincil anahtar (primary key): Bir varlık kümesindeki herbir varlığı eşsiz bir şekilde tanımlamıza olanak tanıyan nitelik(ler).
266 | + Tek bir nitelik (alan) olabileceği gibi birden fazla niteliğin birleşiminden de oluşabilir.
267 | + urunKodu
268 | + dersKodu + ogrenciNo
269 | * Birleşik nitelikler:
270 | + adres: cadde, şehir, ülke, posta kodu vb.
271 | + Detaylı sorgular için basit özellikli alanlara dönüştürülmeliler.
272 | * Basit nitelikler
273 | + yaş, ad, soyad, cinsiyet vb.
274 | * Türetilmiş nitelikler
275 | + Değeri diğer özellikler kullanılarak oluşturulan özellikler.
276 | ~~~~sql
277 | SELECT AVG(AGE(dogumTarihi)) FROM Kisiler
278 | ~~~~
279 | + Saklanmalı mı, hesaplanmalı mı?
280 |
281 |
282 | * Saklanması Durumunda:
283 | + Avantaj: Az işlemci gücü gerekir, veriye daha hızlı erişim, geçmiş bilgisi için kullanılabilir
284 | + Dezavantaj: Güncel değer için sürekli denetlenmelidir, fazladan yer kaplar
285 | * Hesaplanması Durumunda:
286 | + Avantaj: Yer tasarrufu sağlar. Her an güncel değer olur.
287 | + Dezavantaj: Çok işlemci gücü gerekir, veriye daha yavaş erişim olur, sorgular daha karmaşık olur.
288 |
289 | ## Varlıklar Arası Bağıntılar
290 | ### Bir - Çok Bağıntısı
291 | * **1 derslik** sadece **1 binada** bulunabilir.
292 | * **1 binada çok** sayıda **derslik** bulunabilir.
293 |
294 | 
295 |
296 | * Normal şartlarda tablo içerisindeki kayıt sayısı sınırlanamaz. Bunun için uygulama yazılımları ya da tetikleyiciler (trigger) kullanılabilir.
297 | * Kayıt sayılarının gösterilmesi uygulama yazılımı geliştirilirken çok faydalıdır. (Sınıfın açılabilmesi için en az 10 kayıt, en fazla 30 kayıt gereklidir. Bir doktor bir günde en fazla 30 reçete yazabilir...)
298 | * Sayılar iş kurallarına bakılarak belirlenir.
299 |
300 | ### Çok - Çok Bağıntısı
301 | * **1 öğrenci çok** sayıda **derse** kayıt yaptırabilir
302 | * **1 ders çok** sayıda **öğrenci** tarafından alınabilir.
303 |
304 | 
305 |
306 |
307 | 
308 |
309 | ### Bir - Bir Bağıntısı
310 |
311 | * **1 öğretim üyesi 1 bölüm** yönetebilir
312 | * **1 bölüm 1 öğretim üyesi** tarafından yönetilebilir.
313 |
314 | 
315 |
316 | ### Var Olma Bağımlılığı (Existence Dependency)
317 |
318 | * Bir site yönetim sisteminde Apartman ve Daire varlık kümeleri olsun.
319 | * Böyle bir sistemde «**bir apartmana bağlı olmayan daire olamaz**» kuralı mevcuttur.
320 | * Örneğin Daire varlık kümesine hiçbir apartmana ait olmayan bir dairenin kaydını yapamayız, yapmamalıyız.
321 | * Bu örnekte, Apartman ve Daire arasında var olma bağımlılığı vardır denir.
322 | * Bu durumda Apartman üstün varlık, Daire ise bağımlı varlıktır.
323 |
324 |
325 | 
326 |
327 | Bir personel bilgi sisteminde Personel ve Bagimli (Personele bagimli olan kişiler. Örneğin çocuk, eş vb.) varlık kümelerini düşünelim. Böyle bir sistemde «**bir personele bağlı olmayan bagimli varlığı olamaz**» kuralı mevcuttur. Örneğin bagimli varlık kümesine hiçbir personele ait olmayan bir çocuğun kaydını yapamayız, yapmamalıyız. Bu örnekte, bagimli ve personel arasında var olma bağımlılığı vardır denir. Bu durumda personel **üstün varlık**, bagimli ise **bağımlı varlıktır**.
328 |
329 | 
330 |
331 | * Var olma Bağımlılığı, Tanımlama Bağıntısı
332 |
333 | 
334 |
335 | ### Zayıf/Güçlü Bağıntılar
336 |
337 | * Bağıntı kurulan varlığın birincil anahtarı içerisinde, bağıntı kuran varlığın birincil anahtar bilgisi yer almıyorsa “iki varlık arasında zayıf bağıntı vardır” denir.
338 | * Bağıntı kurulan varlığın birincil anahtarı içerisinde, bağıntı kuran varlığın birincil anahtarı yer alıyorsa “iki varlık arasında güçlü bağıntı vardır” denir.
339 |
340 | 
341 |
342 | ### Bağıntı Dereceleri
343 |
344 | * Tekli (Unary) Bağıntı
345 | * İkili (Binary) Bağıntı
346 | * Üçlü (Ternary) Bağıntı
347 |
348 | ### Tekli Bağıntı
349 |
350 | * **Tekli (Unary) Bağıntı:** Bir varlık kendisi ile bağıntılı (ilişkili) ise bu tür bir bağıntıya tekli bağıntı adı verilir.
351 | * Örneğin, Personel tablosu içerisindeki bir personel, sıfır veya daha fazla personelin aynı zamanda yöneticisidir. Bir personelin sıfır ya da bir yöneticisi olmalıdır.
352 |
353 | 
354 |
355 | ### İkili Bağıntı
356 |
357 | * **İkili (Binary) Bağıntı:** İki varlığın bağıntısına (ilişkisine) ikili bağıntı denir.
358 |
359 | 
360 |
361 | ### Üçlü Bağıntı
362 |
363 | * **Üçlü (Ternary) Bağıntı:** Aynı anda 3 varlık birbirine bağlanıyorsa, bu tür bağıntıya üçlü bağıntı adı verilir.
364 | * Kavramsal tasarımda her ne kadar 3 varlık mevcut ise de bunu gerçekleştirebilmek için 4. bir varlığa gereksinim duyulur.
365 |
366 | 
367 |
368 | ### Varlık Bağıntı Modeli (VBM/ERM) ile Tasarım
369 |
370 | * Veritabanı tasarımı, lineer ya da ardışıl (yazılım geliştirmedeki şelale modeli gibi) olmaktan çok tekrarlı (yazılım geliştirmedeki spiral model ya da iteratif model gibi) bir süreçtir.
371 | * Tekrar fiili, “tekrar tekrar yap” anlamındadır. Tekrarlı bir süreç, süreçlerin ve prosedürlerin tekrarlanması temeline dayanır.
372 | * Bir varlık bağıntı diyagramının geliştirilmesi genellikle aşağıdaki adımları içermektedir.
373 | + Organizasyonun (kurumun) işlerinin (operasyonlarının) tanımını içeren detaylı bir senaryo (hikaye) oluşturulur. Senaryo özellikle organizasyon içerisindeki rol temsilcilerine danışılarak oluşturulursa çok daha gerçekçi ve etkili olur.
374 | + Senaryoda geçen işlerin tanımları baz alınarak iş kuralları oluşturulur.
375 | + İş kuralları baz alınarak ana varlıklar ve varlıklar arasındaki bağıntılar oluşturulur.
376 | + İlk varlık bağıntı diyagramı geliştirilir.
377 | + Varlıkları net bir şekilde tanımlayan nitelikleri ve birincil anahtarları oluşturulur.
378 | + Varlık Bağıntı Diyagramı gözden geçirilerek gerekirse yukarıdaki adımlar, istenilen duruma gelininceye kadar tekrarlanır.
379 |
380 |
381 | ### Kaynaklar
382 |
383 | * Carlos Coronel, Steven Morris, and Peter Rob, Database Systems: Design, Implementation, and Management, Cengage Learning.
384 |
--------------------------------------------------------------------------------
/VYS03.md:
--------------------------------------------------------------------------------
1 |
2 | BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
3 |
4 | # Varlık Bağıntı Modeli - Örnek Uygulamalar
5 |
6 |
7 | ## Konular
8 |
9 | * Varlık Bağıntı Modeli (VBM/ERM) ile Tasarım
10 | * Örnek Uygulama – Araç Üreticisi
11 |
12 | * Örnek Uygulama – Üniversite Bilgi Sistemi
13 | * Kaynaklar
14 |
15 |
16 | ## Varlık Bağıntı Modeli (VBM/ERM) ile Tasarım
17 |
18 | Veritabanı tasarımı, lineer ya da ardışık olmaktan çok tekrarlı bir süreçtir. Tekrar fiili, “tekrar tekrar yap” anlamındadır ve tekrarlı bir süreç, süreçlerin ve prosedürlerin tekrarlanması temeline dayanır. Bir varlık bağıntı diyagramının geliştirilmesi genellikle aşağıdaki adımları içermektedir:
19 | 1. Organizasyonun (kurumun), işlerinin (operasyonlarının) tanımını içeren detaylı bir senaryo (hikaye) oluşturulur. (Hikaye özellikle organizasyon içerisindeki rol temsilcilerine danışılarak oluştrulursa çok daha gerçekçi ve etkili olur)
20 | 2. Senaryoda geçen işlerin tanımları baz alınarak iş kuralları oluşturulur.
21 | 3. İş kuralları baz alınarak ana varlıklar ve varlıklar arasındaki bağıntılar oluşturulur.
22 | 4. İlk varlık bağıntı diyagramı geliştirilir.
23 | 5. Varlıkları net bir şekilde tanımlayan özellikleri ve birincil anahtarları oluşturulur.
24 | 6. Varlık Bağıntı diyagramı gözden geçirilerek gerekirse yukarıdaki adımlar, istenilen duruma gelininceye kadar, tekrarlanır.
25 |
26 |
27 | ## Örnek Uygulama - Araç Üreticisi
28 |
29 | ### Senaryo
30 |
31 | Bir araç üreticisi, farklı modellerde araçlar üretmektedir. Ürettiği araçlar, araçlarda kullanılan malzemeler, tedarikçiler vb. bilgilerini saklamak ve yönetmek istediği bir yazılım sistemi talep etmektedir.
32 |
33 | ### İş Kuralları
34 |
35 | * Üretilen her bir aracın şasi numarası, renk, tür (otomobil, kamyon, minibüs vb.), model ve üretim tarihi bilgileri mevcuttur. Araçlar birbirinden şasi numarası ile ayırt edilir.
36 | * Araç türlerinin kodu ve adı bilgileri mevcuttur.
37 | * Araç modellerinin kodu, adı, ağırlık ve yolcu sayısı bilgileri mevcuttur.
38 | * Malzemelerin kodu, adı, stok miktarı bilgileri mevcuttur.
39 | * Malzemeler tedarikçi şirketlerden satın alınmaktadır.
40 | * Tedarikçi şirketlerin kodu, adı, vergi dairesi, vergi numarası bilgileri mevcuttur.
41 | * Bir tedarikçi hiçbir malzeme tedarik etmeyebileceği gibi bir veya daha fazla malzeme de tedarik edebilir. Bir malzeme yalnızca bir tedarikçi tarafından temin edilir.
42 | * Bir araç çok sayıda malzemeden oluşur. En az bir adet malzemeden oluşmak zorundadır. Bir malzeme birden fazla araçta kullanılabilir. Ancak henüz hiçbir araçta kullanılmamış da olabilir.
43 | * Araçlar farklı miktarda ve farklı türlerde malzemelerden üretilir. Bu bilgiler de kaydedilmelidir.
44 | * Bir araç yalnızca bir türe sahip olur. Bir türe ait hiçbir araç olmayabileceği gibi çok sayıda araç da olabilir.
45 | * Bir araç yalnızca bir modele sahip olur. Bir modele ait hiçbir araç olmayabileceği gibi çok sayıda araç da olabilir.
46 |
47 | ### Varlık Bağıntı Diyagramı
48 |
49 | 
50 |
51 |
52 |
76 |
77 | ## Örnek Uygulama - Üniversite Bilgi Sistemi
78 |
79 |
80 | ### Senaryo
81 |
82 | Üniversite bilgi sisteminde, bir üniversiteye ait bilgilerin depolanması ve yönetilmesi istenmektedir. Daha özelde fakültelerin, bölümlerinin, bölümlerin sunduğu derslerin, öğretim üyelerinin, açılan derslerin, açılan derslerin dersliklerinin, öğrencilerin, öğrencilerin açılan derslere yaptıkları kayıtların, üniversitedeki binaların ve binalardaki dersliklerin bilgilerinin saklanması istenmektedir.
83 |
84 |
85 | ### İş Kuralları
86 |
87 | * Üniversite fakültelerden oluşur.
88 | * Üniversite yöneticileri (rektör) ve fakülte yöneticileri (dekan) öğretim üyelerinden seçilir.
89 | * Fakülteler bölümlerden oluşur. Bölümün adı ve öğretim üyelerinden seçilen bir başkanı bulunur.
90 | * Öğretim üyesi bilgileri içerisinde kimlik numarası, adı, soyadı, ve bağlı bulunduğu (görev yaptığı) bölüm bilgileri bulunmalıdır.
91 | * Bölümlerin sunduğu dersler (katalog dersler) bilgileri içerisinde ders kodu, ders adı, kredisi ve dersi sunan bölümün bilgisi olmalıdır.
92 | * Açılan dersler bilgileri içerisinde açılan dersin kodu, katalog ders bilgisi (kodu), bölümü, şube bilgisi, dersi veren öğretim üyesi ve dersin yapıldığı dersliğin bilgisi olmalıdır.
93 | * Öğrenci bilgileri içerisinde öğrenci numarası, bölüm numarası, adı, soyadı ve danışman hocasının bilgisi yer almalıdır.
94 | * Öğrencilerin açılan derslere yaptıkları kayıtlar, kayıt tarihleri ve o derslerden aldıkları notlar da saklanmalıdır.
95 | * Bina bilgileri içerisinde bina adı ve yeri bilgileri bulunmalıdır.
96 | * Derslik bilgileri içerisinde derslik kodu ve dersliğin hangi binada bulunduğuna ilişkin bilgiler bulunmalıdır.
97 | * Bir fakültenin yalnızca bir tane dekanı (öğretim üyeleri içerisinden) olmak zorundadır. Bir öğretim üyesi en fazla bir fakültenin dekanı olabilir.
98 | * Bir fakültenin en az bir bölümü olmak zorundadır ancak birden fazla bölümü de olabilir. Bir bölüm ise yalnızca bir fakültenin altında yer alabilir.
99 | * Bir öğretim üyesi yalnızca bir bölüme bağlıdır. Bir bölümün en az bir öğretim üyesi olmak zorundadır ancak birden fazla öğretim üyesi da olabilir.
100 | * Bir bölüm yalnızca bir öğretim üyesi tarafından yönetilmek zorundadır. Bir öğretim üyesi ise en fazla bir bölümün yöneticiliğini yapabilir.
101 | * Bir öğretim üyesi çok sayıda öğrencinin danışman hocası olabilir. Bir öğrencinin danışmanlığını yalnızca bir tane öğretim üyesi yapabilir.
102 | * Bir bölümün çok sayıda öğrencisi mevcuttur. Bir öğrenci, yalnızca bir tane bölümün öğrencisidir.
103 | * Bir öğretim üyesi birden fazla (açılan) ders verebilir. Bir (açılan) ders yalnızca bir öğretim üyesi tarafından verilmelidir.
104 | * Bir bölüm çok sayıda katalog ders sunabilir. Bir katalog ders yalnızca bir bölüm tarafından sunulur.
105 | * Bir katalog dersin çok sayıda açılan dersi (şubesi) olabilir. Bir açılan dersin yalnızca bir tane katalog dersi olmalıdır.
106 | * Bir öğrenci birden fazla derse kayıt yaptırabilir. Bir derse birden fazla öğrenci kayıt olabilir.
107 | * Bir açılan ders yalnızca bir derslikte işlenir. Bir derslikte çok sayıda açılan ders işlenebilir.
108 | * Bir derslik yalnızca bir binada bulunur. Bir binada çok sayıda derslik bulunabilir.
109 |
110 |
111 | ### Varlık Bağıntı Diyagramı
112 |
113 | 
114 | 
115 |
116 |
117 | ### Örnek Tablolar
118 |
119 | 
120 |
--------------------------------------------------------------------------------
/VYS04.md:
--------------------------------------------------------------------------------
1 | BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
2 |
3 | # İlişkisel Model
4 |
5 | ## Konular
6 |
7 | * Veritabanı Tasarım Aşamaları
8 | * Temel Kavramlar
9 | * Tablo
10 | * Anahtar
11 | * Bütünlük Kuralları
12 | * Birincil Anahtar Özellikleri
13 | * Vekil Birincil Anahtar
14 | * Varlık Bağıntı Modelinin İlişkisel Modele Dönüştürülmesi
15 | * İndeks
16 | * Veri Sözlüğü (Sistem Kataloğu)
17 | * Örnek Uygulama - Araç Üreticisi
18 | * Örnek Uygulama – Elektronik Ticaret Sistemi
19 | * Kaynaklar
20 |
21 | ## Veritabanı Geliştirme Yaşam Döngüsü
22 |
23 | 
24 |
25 | ## Temel Kavramlar
26 |
27 | * **Varlık (Entity):** Varolan ve benzerlerinden ayırt edilebilen herşey.
28 | * **Varlık Kümesi (Entity set):** Benzer varlıkların oluşturduğu kümeye denir. Varlık kümelerinin ayrık kümeler olması gerekmez. Bunlar iç içe, kesişen ya da ayrık kümeler olabilir. Örnek olarak, Öğrenciler, Kız öğrenciler, Yurt öğrencileri, Açılan Dersler, Doktorlar vb. sayabiliriz.
29 | * **Nitelik (Attribute):** Bir varlık kümesindeki nesnelerin özelliklerini göstermek ve varlıkları birbirinden ayırt etmek için kullanılır. Tablo (table) içerisindeki “sütunlara (column)” karşılık gelir. “Alan” ismi de verilir.
30 | * **Değer Alanı (Domain):** Bir niteliğin alabileceği değerler uzayına ilgili niteliğin değer alanı denir.
31 | * **İlişki (Relation):** Satır ve sütunlardan oluşan bir tablo.
32 | + İlişki = Tablo
33 | * **Kayıt (Tuple):** Bir tablodaki kayıt veya satırlar.
34 | + Bir ilişki (tablo), satırlar ya da kayıtlar kümesi olarak düşünülebilir (tüm satırlar farklıdır).
35 | * **Sütun Sayısı (Degree):** İlişkideki (tablodaki) sütun sayısı.
36 | * **Satır Sayısı (Cardinality):** İlişkideki (tablodaki) satır (kayıt) sayısı.
37 | * **Birincil Anahtar (Primary Key):** Tek tanımlayıcı.
38 |
39 | 
40 |
41 | * **İlişkisel Veritabanı (Relational Database):** İlişkiler (tablolar) kümesi. Satır ve sütunlardan meydana gelen tablolar topluluğu.
42 | * **İlişkisel Şema (Relational Schema):** İlişkinin (tablonun) adını ve ek olarak her bir sütunun adını ve tipini belirtir. Metin ile ifade edilebileceği gibi diyagram kullanılarak da gösterilebilir.
43 | + Örneğin Ogrenciler isminde bir ilişkinin (tablonun) ilişkisel şeması (metinsel olarak) aşağıda verilmiştir.
44 | + Ogrenciler(**ogrenciNo: string**, adi: string, soyadi: string, yas: integer, ortalama: real)
45 |
46 | ## Tablo
47 |
48 | ### Tablo Karakteristikleri
49 |
50 | * Bir tablo (table), satır (row) ve sütunlardan (column) oluşan iki boyutlu bir yapı olarak algılanır.
51 | * Her tablo satırı (kayıt/tuple), varlık kümesi (entity set) içerisindeki tek bir varlık (entity) oluşumunu temsil eder.
52 | * Her tablo sütunu bir niteliği (attribute) temsil eder ve her bir sütun farklı bir isme sahiptir.
53 | * Her satır-sütun kesişimi tek bir veri değerini temsil eder.
54 | * Bir sütun içerisinde yer alan tüm değerler aynı veri tipine sahip olmalıdır.
55 | * Her sütun, nitelik değer alanı (attribute domain) olarak bilinen kesin bir değerler aralığına sahiptir.
56 | * Satır ve sütunların sırası Veritabanı Yönetim Sistemi (VTYS/DBMS) tarafından bakıldığında önemsizdir.
57 | * Her tablo, her bir satırını eşsiz bir şekilde tanımlayan bir niteliğe veya nitelik birleşimine sahip olmak zorundadır. Buna birincil anahtar ismi verilir.
58 |
59 | 
60 |
61 | * Ogrenciler tablosu, 17 satır (kayıt) ve 15 sütundan (nitelik) oluşan bir iki boyutlu yapı olarak görülür.
62 | * Ogrenciler tablosundaki her satır, varlık kümesindeki bir varlığı tanımlar (Varlık kümesi, Ogrenciler tablosu ile temsil edilir).
63 | + Örneğin 1. satır, Ayşe Demir ismindeki bir öğrenciyi tanımlar.
64 | * Her sütun, bir niteliği temsil eder ve her sütunun ayrı bir ismi mevcuttur.
65 | * Bir sütundaki tüm değerler, niteliğin karakteristikleri ile uyumludur.
66 | + Örneğin, dogumTarihi sütunu, tüm satırlar için doğum tarihi bilgilerini içerir.
67 | * Veriler, biçimine ve fonksiyonuna göre sınıflandırılmalıdır. VTYS’lerin desteklediği temel veri tipleri:
68 | + Nümerik (Numeric): Üzerinde anlamlı aritmetik işlemler yapılabilen veri. Örneğin not ortalamasının saklandığı bir alan nümerik tiptedir.
69 | + Karakter (Character): Metin verisi, karakter dizisi. Aritmetik işlemler için tanımlanmamış olan karakter ve semboller. Örneğin adı, soyadı, telefon numarası vb. bilgilerin saklandığı alanlar.
70 | + Tarih, Zaman (Date, Time): Tarih, zaman verisi için kullanılır. Örneğin; doğum tarihi, sisteme son giriş zamanı vb. alanlar.
71 | + Mantıksal (Logical): Doğru ya da yanlış (evet veya hayır - boolean) değerleri.
72 | * Bir sütun için izin verilen değerler aralığına, o sütunun değer alanı (domain) adı verilir.
73 | + Örneğin tablodaki öğrenci not bilgileri 0-4 aralığında sınırlandırılmış olduğundan ötürü, bu sütunun değer aralığı [0,4] olarak ifade edilir.
74 | * ogrenciNo alanı birincil anahtardır.
75 |
76 |
77 | ## Anahtar
78 |
79 | ### Fonksiyonel Bağımlılık
80 |
81 | * **Anahtar:** Kayıtların ayırt edilebilmesini (süper, aday, birincil, ikincil ve vekil anahtarlar) ve/veya tablolar arasında ilişki kurulabilmesini (birincil, yabancı anahtarlar) sağlayan yapı.
82 | * Anahtarlar belirlenirken **fonksiyonel bağımlılık** kavramının bilinmesi gerekir.
83 | * Örnekte, ogenciNo alanı kullanılarak öğrenci adı belirlenebilir. Tersi doğru değildir.
84 | * Bu durumda:
85 | + ogrenciNo alanı, ogrenciAdi alanını belirler.
86 | + ogrenciAdi alanı, ogrenciNo alanına **fonksiyonel bağımlıdır**.
87 | + ogrenciNo → ogrenciAdi şeklinde gösterilir.
88 |
89 |
90 | ### Anahtar Çeşitleri
91 |
92 | * **Süper Anahtar:** Herbir satırı eşsiz olarak tanımlayabilen anahtara süper anahtar denir. Bir ya da birden çok alanı içerebilir.
93 | + ogrenciNo
94 | + ogrenciNo, adi
95 | + ogrenciNo, adi, soyadi , ...
96 | + eposta
97 | + kimlikNo
98 | ...
99 | * **Aday Anahtar:** Herbir satırı eşsiz olarak tanımlayabilen ve en az sayıda alana sahip olan süper anahtara aday anahtar denir.
100 | + “ogrenciNo, adi” ikilisi süper anahtardır. Sadece ogrenciNo alanı kayıtları eşsiz olarak tanımlayabildiğinden dolayı bu ikili aday anahtar değildir.
101 | * **Birincil Anahtar (Primary Key, PK):** Herbir satırı eşsiz olarak tanımlayabilen ve aday anahtarlar içerisinden seçilen anahtar.
102 | + Birincil anahtar eşsiz değerlere sahip olmalıdır, NULL değerler alamaz.
103 | + ogrenciNo, kimlikNo, pasaportNo alanları aday anahtarlardır. Her biri birincil anahtar olarak seçilebilir (sadece biri seçilmelidir).
104 | * **Vekil Birincil Anahtar:**
105 | + Uygulamada çoğunlukla vekil birincil anahtarlar kullanılır. Ayrıntılar "Vekil Birincil Anahtar" başlıklı bölümde verilmektedir.
106 | * **İkincil/Alternatif Anahtar:** Birincil anahtar olarak seçilmeyen diğer aday anahtarlara ikincil/alternatif anahtar denir.
107 | * **Yabancı Anahtar (Foreign Key, FK):** Bağıntı kurulan tablo içerisinde yer alan ve bağıntı kuran tablodaki birincil anahtarın değerlerine benzeyen değerler içeren alan.
108 | + İki tablo arasında bağıntı kurulurken bağıntı kuran tablonun birincil anahtarı ile bağıntı kurulan tablonun yabancı anahtarı kullanılır. Dolayısıyla iki anahtar da aynı tipte olmalıdır.
109 | * Aşağıda yabancı anahtar örneği görülmektedir.
110 |
111 | 
112 | 
113 |
114 |
115 | ## Bütünlük Kuralları
116 |
117 | * **Varlık Bütünlüğü (Entity Integrity):** Varlık bütünlüğünün sağlanabilmesi için her tabloda birincil anahtar (PK) olmalıdır.
118 | + Her varlığın "not null" kısıtını sağlayan eşsiz ("unique" kısıtı) bir tanımlayıcısı olması garanti edilir.
119 | + Varlık bütünlüğü kullanılarak, örneğin; aynı öğrenci numarasına sahip çok sayıda öğrencinin ya da öğrenci numarası olmayan öğrencinin bulunamaması garanti edilir.
120 | * **Referans Bütünlüğü (Referential Integrity):** Referans bütünlüğünün sağlanabilmesi için yabancı anahtar(FK)tanımlanır.
121 | + Yabancı anahtar alanı ya NULL olabilir ya da bağıntı kuran tablodaki birincil anahtar alanı değerlerinden biri olabilir.
122 | + Her yabancı anahtar değerinin diğer tablonun birincil anahtarı değeriyle tutarlı olması garanti edilir.
123 | + Referans bütünlüğü kullanılarak, örneğin; öğrencinin açılmayan bir dersi alması, derse kayıtlı bir öğrencinin okuldan kaydının silinmesi, olmayan bir ürünün sipariş edilmesi vs. önlenir.
124 | 
125 | + **Referans Bütünlüğü Uygulama Notu**
126 | + Referans bütünlüğünün sağlanması için yabancı anahtar alanının NULL olabileceği de söylenmişti.
127 | + NULL değer sorgularda sorunlara neden olabileceğinden genellikle NULL değer yerine özel değerler tercih edilir.
128 | + Örneğin; il bilgisi olarak NULL yerine “00: Bilinmiyor” verilebilir. Bu durumda İller tablosunda 00, Bilinmiyor değerlerine sahip bir satır bulunmalıdır. Kisiler tablosundaki il alanının varsayılan değeri de 00 yapılabilir. Böylece, kişinin il bilgisi girilmediği zaman varsayılan olarak bilinmiyor bilgisi atanmış olur.
129 |
130 | * **NOT NULL (Boş Olamaz):** Alan içerisine değer yazılmasını zorlamak istiyorsak NOT NULL yapabiliriz. Örneğin, kişinin adının zorunlu olarak girilmesini bu şekilde sağlatabiliriz.
131 | * **UNIQUE (Eşsiz):** Alan içerisine yazılan değerlerin her satır için eşsiz olmasını istiyorsak kullanılır. Örneğin, kişilerin TC Kimlik numaralarının aynı yazılamamasını bu şekilde garanti etmiş oluruz.
132 |
133 |
134 | ## Birincil Anahtar Özellikleri
135 |
136 | * UNIQUE (kayıtları eşsiz olarak tanımlayabilmesi) ve NOT NULL (boş olmaması) bütünlük kurallarını sağlamalı.
137 | * Zamanla değişme ihtimali olan alanlar tercih edilmemeli.
138 | * Mümkün olduğunca tek bir alandan oluşmalı.
139 | + Çok alandan oluşursa bağıntıları kurmak, sorguları yazmak karmaşıklaşır. Gecikme ve kaynak kullanımı artar.
140 | * Sayısal alanlar tercih edilmeli.
141 | + İşlem hızı ve otomatik artma (auto increment) desteği sağlanabilir.
142 | * Güvenlik riski bulunan alanlar tercih edilmemeli.
143 | + Yazılımlarda yoğun olarak birincil anahtar değeri kullanılır.
144 |
145 | ## Vekil Birincil Anahtar
146 | * Birincil anahtar fonksiyonlarını yerine getirmek için eklenen alandır.
147 |
148 | 
149 |
150 |
151 | ## Varlık Bağıntı Modelinin İlişkisel Modele Dönüştürülmesi
152 |
153 | * Her varlık için bir tablo (ilişki/relation) oluşturulur.
154 |
155 | 
156 |
157 | * **İlişkisel Şema (Metinsel Gösterim)**
158 | + Ogrenci(**ogrenciNo: String**, bolumNo: Integer, adi: String, soyadi: String)
159 |
160 | ### Bir-Bir Bağıntısı
161 |
162 | * 1 öğretim üyesi **en çok** ***1*** bölüm yönetebilir.
163 | * 1 bölüm yalnızca **en çok** ***1*** öğretim üyesi tarafından yönetilebilir.
164 |
165 | 
166 |
167 | * Yalnızca 1 tarafının (en az 1 - en çok 1) varlığının (OgretimUyesi) birincil anahtarı (sicilNo) diğer varlığa yabancı anahtar alan (bolumBaskani) olarak eklenir.
168 |
169 | * **İlişkisel Şema (Metinsel Gösterim)**
170 |
171 | + OgretimUyesi(**sicilNo: String**, TCKimlikNo: Char(11), bolumNo: Integer, ad: String, soyad: String)
172 | + Bolum(**bolumNo: Integer**, fakulteNo: Integer, bolumBaskani: String, bolumAdi: String)
173 |
174 | ### Bir-Çok Bağıntısı
175 |
176 | * 1 derslik **en çok** ***1*** binada bulunur.
177 | * 1 binada **en çok** ***çok*** sayıda derslik bulunur.
178 |
179 | 
180 |
181 | * 1 tarafının varlığının (Bina) birincil anahtarı (binaNo) diğer varlığa yabancı anahtar alan (binaNo) olarak eklenir
182 |
183 | * **İlişkisel Şema (Metinsel Gösterim)**
184 | + Derslik(**derslikNo: Integer**, binaNo: Integer, derslikAdi: String)
185 | + Bina(**binaNo: Integer**, binaAdi: String, adres: String)
186 |
187 | ### Bir-Çok Bağıntısı / Varolma Bağımlılığı, Tanımlama Bağıntısı
188 |
189 | * 1 apartmanda **en çok** ***çok*** sayıda daire bulunur. En az bir daire bulunmak zorundadır.
190 | * 1 daire **en çok** ***1*** apartmanda (**en az 1 – en çok 1**) bulunmak zorundadır.
191 |
192 | 
193 |
194 | * 1 tarafının (Apartman) birincil anahtarı (apartmanNo) diğer varlığa hem yabancı anahtar hem de birincil anahtarın parçası (apartmanNo) olarak eklenir.
195 | * **İlişkisel Şema (Metinsel Gösterim)**
196 | + Apartman(**apartmanNo: Integer**, apartmanAdi: String, adres: String)
197 | + Daire(**daireNo: Integer**, **apartmanNo: Integer**, daireAdi: String)
198 |
199 | * Var olma Bağımlılığı, Tanımlama Bağıntısı
200 |
201 | 
202 |
203 |
204 | ### Çok-Çok Bağıntısı
205 |
206 | * 1 öğrenci **en çok** ***çok*** sayıda derse kayıt yaptırabilir.
207 | * 1 ders **en çok** ***çok*** sayıda öğrenci tarafından alınabilir.
208 |
209 | 
210 |
211 | * **İlişkisel Şema (Metinsel Gösterim)**
212 | + Ogrenci(**ogrenciNo: String**, bolumNo: Integer, danisman: String, ad: String, soyad: String)
213 | + Kayit(**aDersKodu: String**, **ogrenciNo: String**, kayitTarihi: Date, not: Float)
214 | + AcilanDers(**aDersKodu: String**, dersKodu: String, ogretimUyesi: String, derslikNo: Integer, sube: Char(1))
215 |
216 | ### Tekli Bağıntı
217 |
218 | * 1 personele **en çok** ***1*** personel liderlik yapar.
219 | * 1 personel **en çok** ***çok*** sayıda personele liderlik yapar.
220 |
221 | 
222 |
223 | * **İlişkisel Şema (Metinsel Gösterim)**
224 | + Personel(**sicilNo: String**, ad: String, soyad: String, takimLideri: String)
225 |
226 | ## İndeks
227 |
228 | * **İndeks:** Arama, listeleme işlemlerini hızlandırmak için kullanılan nesne.
229 | * Aranan bilginin konumunun, anahtar değerinden yararlanılarak bulunabilmesini sağlar.
230 | * Bir indeks, diğer indeksleri etkilemeksizin yok edilebilir ya da oluşturulabilir.
231 | * Genelde aramaların sık yapıldığı özellikler indeks yapılır.
232 | * İndeks alanlarla yapılan aramalar çok hızlı olurken kayıt ekleme ve silme (INSERT, DELETE) işlemleri nispeten yavaş olur.
233 | * İndeks alanlar sıralı olarak listelenir.
234 | * Birincil anahtar (primary key) alanlar otomatik olarak eşsiz indeks (unique index) olurlar.
235 | * Bir tabloda çok sayıda indeks tanımlanabilir. Her indeks yalnızca bir tabloya ait olabilir.
236 | * Birden fazla alan beraber indeks olarak tanımlanabilir.
237 |
238 | 
239 |
240 | ## Veri Sözlüğü (Sistem Kataloğu)
241 |
242 | * **Veri Sözlüğü (Sistem Kataloğu):** Üst verilerin (metadata) saklandığı veritabanıdır.
243 | * Veritabanı Yönetim Sistemi tarafından yönetilir.
244 | * Oluşturulan tüm veritabanlarına ait üst veriler (tablolar, tablo alanları, alan tipleri, değer aralıkları, anahtarlar, indeksler, bağıntılar, kısıtlar vb.) burada saklanır.
245 | * Kullanıcı tarafından sorgulanabilir.
246 |
247 |
248 | ## Örnek Uygulama - Araç Üreticisi
249 |
250 | ### Senaryo
251 |
252 | Bir araç üreticisi, farklı modellerde araçlar üretmektedir. Ürettiği araçlar, araçlarda kullanılan malzemeler, tedarikçiler vb. bilgilerini saklamak ve yönetmek istediği bir yazılım sistemi talep etmektedir.
253 |
254 |
255 | ### İş Kuralları
256 |
257 | * Üretilen her bir aracın şasi numarası, renk, tür (otomobil, kamyon, minibüs vb.), model ve üretim tarihi bilgileri mevcuttur. Araçlar birbirinden şasi numarası ile ayırt edililir.
258 | * Araç türlerinin kodu ve adı bilgileri mevcuttur.
259 | * Araç modellerinin kodu, adı, ağırlık ve yolcu sayısı bilgileri mevcuttur.
260 | * Araçlar farklı miktarda ve farklı türlerde malzemelerden üretilir. Bu bilgiler de kaydedilmelidir.
261 | * Malzemeler tedarikçi şirketlerden satın alınmaktadır.
262 | * Malzemelerin kodu, adı, stok miktarı bilgileri mevcuttur.
263 | * Tedarikçi şirketlerin kodu, adı, vergi dairesi, vergi numarası bilgileri mevcuttur.
264 | * Bir tedarikçi hiçbir malzeme tedarik etmeyebileceği gibi bir veya daha fazla malzeme de tedarik edebilir. Bir malzeme yalnızca bir tedarikçi tarafından temin edilir.
265 | * Bir araç çok sayıda malzemeden oluşur. En az bir adet malzemeden oluşmak zorundadır. Bir malzeme birden fazla araçta kullanılabilir. Ancak henüz hiçbir araçta kullanılmamış da olabilir.
266 | * Bir araç yalnızca bir türe sahip olur. Bir türe ait hiçbir araç olmayabileceği gibi çok sayıda araç da olabilir.
267 | * Bir araç yalnızca bir modele sahip olur. Bir modele ait hiçbir araç olmayabileceği gibi çok sayıda araç da olabilir.
268 |
269 |
270 | ### Varlık Bağıntı Diyagramı
271 |
272 | 
273 |
274 | ### İlişkisel Şema (Metinsel Gösterim)
275 |
276 | * Arac(**sasiNo:char**, renk: varchar, modelKodu: char, turKodu: char, uretimTarihi: date)
277 | * AracMalzeme(**sasiNo: char**, **malzemeKodu: char**, miktar: int)
278 | * Malzeme(**malzemeKodu: char**, adi: varchar, stokMiktari: int, tedarikciKodu: char)
279 | * Tur(**turKodu: char**, ad: varchar)
280 | * Model(**modelKodu: char**, ad: varchar, agirlik: real, yolcuSayisi: int)
281 | * Tedarikci(**tedarikciKodu: char**, ad: varchar, vergiDairesi: varchar, vergiNo: char)
282 |
283 |
284 |
285 | ## Örnek Uygulama – Elektronik Ticaret Sistemi
286 |
287 | ### Senaryo
288 |
289 | Elektornik ticaret yazılımının ihtiyacı olan verilerin yönetimi için bir veritabanı geliştirilmesi isteniyor. İş kuralları verilen bu veritabanının VB diyagramını ve ilişkisel şemasını oluşturunuz.
290 |
291 | ### İş Kuralları
292 |
293 | * Bu veritabanında her müşteriye bir numara verilerek müşterinin TC Kimlik numarası, adı, soyadı, yaşadığı ili saklanması düşünülüyor.
294 | * İllerin plaka numarası ve adı saklanır.
295 | * Her siparişe bakan bir satış temsilcisi mevcuttur. Satış temsilcilerinin TCKimlikNo, ad ve soyad bilgileri mevcuttur.
296 | * Ürünlerin (kişisel bilgisayar, telefon vb.) kodu, adı, fiyatı ve stok miktarlarının saklanması gerekmektedir.
297 | * Ürünlerin kategorileri (bilgisayar, ev elektroniği, kozmetik vb.) mevcuttur.
298 | * Müşterilerin ürün siparişleri saklanarak her bir siparişe bir fatura kesilmesi sağlanmalıdır.
299 | * Her siparişin eşsiz bir sipariş numarası ve sipariş tarihi mevcuttur.
300 | * Sipariş edilen bir ürünün sipariş adedi ve birim fiyatı (kişiye özel indirim v.s. nedeniyle ürün tablosundaki fiyattan farklılık gösterebilir) da kaydedilmelidir.
301 | * Faturaların fatura numarası, tarih ve fatura adresi bilgileri saklanmalıdır. (Toplam fiyat hesaplanabilir ya da saklanabilir).
302 | * Siparişler bir kargo firması tarafından iletilir. Kargo firmasının kodu, adı, adresi bilgileri yer alır. Her kargo firmasında siparişlerden sorumlu bir yetkili yer alır.
303 | * Bir ürünün yalnızca bir kategorisi mevcuttur. Bir kategori çok sayıda ürünün kategorisi olabilir.
304 | * Bir siparişte en az bir ürün bulunur. Ancak çok sayıda ürün de bulunabilir. Bir ürün çok sayıda siparişte yer alabilir.
305 | * Bir müşteri çok sayıda sipariş verebilir. Bir sipariş yalnızca bir müşteri tarafından verilebilir.
306 | * Bir siparişin yalnızca bir faturası olabilir. Bir fatura yalnızca bir siparişin faturası olabilir.
307 | * Bir sipariş ile yalnızca bir satış temsilcisi ilgilenir. Bir satış temsilcisi çok sayıda sipariş ile ilgilenebilir.
308 | * Bir müşteri yalnızca bir ilde yaşayabilir. Bir ilde çok sayıda müşteri yaşayabilir.
309 | * Bir sipariş yalnızca bir kargo firması tarafından iletilir. Bir kargo firması çok sayıda sipariş iletebilir.
310 |
311 |
312 | 
313 |
314 | 
315 |
316 | ### İlişkisel Şema (Metinsel Gösterim)
317 |
318 | * SatisTemsilcisi(**sicilNo: char**, TCKimlikNo: char, ad: varchar, soyad: varchar)
319 | * KargoFirması(**kod: char**, ad: varchar, adres: varchar, temsilci: varchar)
320 | * Musteri(**musteriNo: char**, TCKimlikNo: char, ad: varchar, soyad: varchar, yasadıgıIl: varchar)
321 | * Siparis(**siparisNo: char**, siparisTarihi: date, toplamTutar: real, kargoFirması: char, faturaNo: char, musteriNo: char, satisTemsilciNo: char)
322 | * SiparisUrun(**kayitNo: int**, siparisNo: char, urunKodu: char, birimFiyati: real, miktar: int)
323 | * Kategori(**kategoriKodu: char**, adi: varchar)
324 | * İller(**plakaNo: varchar**, ilAdi: varchar)
325 | * Fatura(**faturaNo: char**, tarih: date)
326 | * Urun(**urunKodu: char**, adi: varchar, stokMiktari: int, birimFiyati: real, kategoriKodu: char)
327 |
328 |
329 | ## Kaynaklar
330 |
331 | * Carlos Coronel, Steven Morris, and Peter Rob, Database Systems: Design, Implementation, and Management, Cengage Learning.
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
--------------------------------------------------------------------------------
/VYS05_1.md:
--------------------------------------------------------------------------------
1 | BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
2 |
3 | # Genişletilmiş Varlık Bağıntı Modeli
4 |
5 | ## Konular
6 |
7 | * Genelleme (Kalıtım)
8 | + Çakışan (Overlap)
9 | + Ayrık (Disjoint)
10 | + Kısmi Bütünlük (Partial Completeness)
11 | + Toplam Bütünlük (Total Completeness)
12 | * Kümeleme
13 |
14 |
15 | ## Genelleme (Kalıtım)
16 |
17 | * Bir veritabanı içerisinde benzer özelliklere sahip varlıklar için ortak alanları içeren temel bir varlık oluşturulabilir ve diğer varlıklar bu temel varlıktan türetilebilir.
18 | * Bunun çeşitli avantajları vardır.
19 | * Değişikliklerin kolay yapılabilmesi
20 | * Hızlı tasarım
21 | * Anlaşılabilirliğin artması vb.
22 | * NYP paradigmasındaki kalıtım özelliğine benzer.
23 |
24 | ### Temel Kavramlar
25 |
26 | * **Çakışan (Overlap)**
27 | * **Gösterim: O**
28 | * Aynı temel varlıkla ilgili birden fazla çocuk varlık olabilir.
29 | * Örneğin öğrenci bilgi sistemindeki bir kişinin hem personel hem de öğrenci olabilmesi.
30 | * **Ayrık (Disjoint)**
31 | * **Gösterim: D**
32 | * Aynı temel varlıkla ilgili tek bir çocuk varlık olabilir.
33 | * Örneğin e-ticaret uygulamasındaki bir kişinin ya müşteri ya da personel olabilmesi, her ikisi birden olamaması.
34 | * **Kısmi Bütünlük (Partial Completeness)**
35 | * **Gösterim: Tek Çizgi**
36 | * Üst tip (supertype) kayıtlar, alt tip (subtype) kayıtlar olmadan da mevcut olabilir.
37 | * **Toplam Bütünlük (Total Completeness)**
38 | * **Gösterim: Çift Çizgi**
39 | * Her üst tip (supertype) kaydın, mutlaka en az bir alt tip (subtype) kaydı olmalı.
40 |
41 | ### Örnek 1
42 |
43 | 
44 |
45 | ### Örnek 2
46 |
47 | 
48 |
49 |
50 | ### Örnek 3
51 |
52 | 
53 |
54 |
55 | ### Örnek 4
56 |
57 | 
58 |
59 |
60 | ## Kümeleme
61 |
62 | * VB diyagramlarını basitleştirmek ve okunabilirliğini artırmak için, çok sayıda varlık ve bağıntıları yerine sanal varlık kullanılamsı işine kümeleme denir.
63 |
64 |
65 | 
66 |
67 |
68 | 
69 |
70 |
71 | ## Kaynaklar
72 |
73 | * Carlos Coronel, Steven Morris, and Peter Rob, Database Systems: Design, Implementation, and Management, Cengage Learning.
74 |
--------------------------------------------------------------------------------
/VYS05_2.md:
--------------------------------------------------------------------------------
1 | BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
2 |
3 | # İlişkisel Cebir
4 |
5 | ## Konular
6 |
7 | * Biçimsel Sorgulama Dilleri
8 | * İlişkisel Cebir
9 | * İlişkisel Cebir İşlemleri
10 | * Seçme (selection) işlemi
11 | * Projeksiyon (projection) işlemi
12 | * Küme birleşimi (set union) işlemi
13 | * Küme kesişimi (set intersection) işlemi
14 | * Küme farkı (set difference) işlemi
15 | * Kartezyen çarpım (Cartesian product) işlemi
16 | * Birleştirme (join) işlemi
17 | * Bölme (division) işlemi
18 | * Uygulamalar
19 |
20 | ## Biçimsel Sorgulama Dilleri
21 |
22 | * Sorgular sembollerle ifade edilir.
23 | * İlişkisel modelde sıklıkla kullanılan iki biçimsel sorgulama dili vardır: İlişkisel Cebir (Relational Algebra) ve İlişkisel Hesap (Relational Calculus).
24 | + Bu diller biçimseldir. Herhangi bir yorumlayıcı veya derleyici yoktur.
25 | + Bu diller, SQL (Structured Query Language) ve QBE (Query By Example) dillerinin temelini oluştururlar.
26 | * **İlişkisel Cebir (Relational Algebra):** Prosedüreldir (procedural) ve sorguların hangi adımlardan oluştuğu açıkça ifade edilir.
27 | + Öğrenciler ve İller tablosunu birleştir.
28 | + İli Sakarya olan öğrencileri seç.
29 | + Bu öğrencilerin numara, ad ve soyad bilgilerini göster.
30 | * **İlişkisel Hesap (Relational Calculus):** Prosedürel değildir. Bildirimseldir (declarative). Kullanıcıların ne istediklerini bildirmelerine olanak tanır. Nasıl hesaplanması gerektiği bildirilmez.
31 | + Sakarya’da kayıtlı öğrencilerin, numara, ad ve soyadı bilgilerini göster.
32 |
33 | ## İlişkisel Cebir
34 |
35 | * İlişkisel Veritabanı Yönetim Sistemlerinde temel yapı ilişkidir (ilişki yerine tablo ifadesi daha çok kullanılır). İlişkisel modelde kullanıcılar tablolar cinsinden düşünür, tablolar üzerinde işlem yaparlar ve sonuçlar da tablo yapısında elde edilir.
36 | * İliskisel cebir, biçimsel sorgulama dilidir.
37 | * İlişkisel cebir yardımıyla, veritabanının nasıl sorgulanabileceği yorumlanır.
38 | * Sorgular SQL’den farklı olarak biçimseldir. Herhangi bir yorumlayıcı veya derleyici yoktur.
39 |
40 | * Seçme (selection) işlemi
41 | * Projeksiyon (projection) işlemi
42 | * Küme birleşimi (set union) işlemi
43 | * Küme kesişimi (set intersection) işlemi
44 | * Küme farkı (set difference) işlemi
45 | * Kartezyen çarpım (Cartesian product) işlemi
46 | * Birleştirme (join) işlemi
47 | * Bölme (division) işlemi
48 |
49 | ## Seçme (Selection) İşlemi
50 |
51 | * Bir tablodan bir veya daha fazla kritere göre kayıtları seçme işlemidir.
52 | * Gösterim:
53 |
54 | 
55 |
56 | * Seçim kriterlerinde kullanılan semboller:
57 |
58 | 
59 |
60 | * Ogrenciler tablosundan ogrenciNo bilgisi 1512B10010 olan öğrenciyi seç.
61 |
62 | 
63 |
64 | * Kisiler tablosundan cinsiyeti Erkek olan ve yaşı 18’den büyük olan kayıtları seç.
65 |
66 | 
67 |
68 |
69 |
70 | ## Projeksiyon (Projection) İşlemi
71 |
72 |
73 | * Bir tablodan yalnızca belirli niteliklere ait bilgiler seçilerek gösterilir.
74 | * Tekrar eden satırlar bir kere gösterilir.
75 | * Gösterim:
76 |
77 | 
78 |
79 | * Birden fazla nitelik varsa nitelikler birbirlerinden virgül ile ayrılır.
80 | * Ogrenciler tablosundaki tüm kayıtların ogrenciNo, ad ve soyad bilgilerini göster.
81 |
82 | 
83 |
84 | * Ogrenciler tablosundan fakülte numarası 12 olan tüm kayıtların ad ve soyad bilgilerini göster.
85 |
86 | 
87 |
88 | ## Küme Birleşimi (Set Union) İşlemi
89 |
90 | * İki tablonun küme birleşimi alınarak gösterilir.
91 | * Tabloların nitelik sayısı aynı olmalı.
92 | * Tabloların aynı sıradaki niteliklerinin değer alanları aynı olmalı.
93 | * Küme birleşimi işlemi sonrasında birbirinin aynısı olan satırlar bir kez getirilir.
94 | * Gösterim:
95 |
96 | 
97 |
98 | * BilgisayarToplulugu ve SiberToplulugu tablolarındaki kayıtların ogrenciNo, ad ve soyad alanlarındaki bilgileri birleştir ve göster.
99 |
100 | 
101 |
102 | ## Küme Kesişimi (Set Intersection) İşlemi
103 |
104 | * İki tablonun küme kesişimi alınarak gösterilir.
105 | * Tabloların nitelik sayısı aynı olmalı.
106 | * Tabloların aynı sıradaki niteliklerinin değer alanları aynı olmalı.
107 | * Gösterim:
108 |
109 | 
110 |
111 | * BilgisayarToplulugu ve SiberToplulugu tablolarındaki kayıtların ogrenciNo, ad ve soyad alanlarındaki bilgileri aynı olan kayıtların bu alanlardaki bilgilerini seç ve göster.
112 |
113 | 
114 |
115 |
116 | ## Küme Farkı (Set Difference) İşlemi
117 |
118 |
119 | * İki tablonun küme farkı alınarak gösterilir.
120 | * Tabloların nitelik sayısı aynı olmalı.
121 | * Tabloların aynı sıradaki niteliklerinin değer alanları aynı olmalı.
122 | * Gösterim:
123 |
124 | 
125 |
126 | + BilgisayarToplulugu ve SiberToplulugu tablolarındaki kayıtların ogrenciNo, ad ve soyad alanlarındaki bilgileri seç ve bu bilgilere göre karşılaştırma yap.
127 | + BilgisayarTopluluğu tablosunda olup da SiberToplulugu tablosunda olmayan öğrencilerin bu bilgilerini göster.
128 |
129 | 
130 |
131 |
132 | ## Kartezyen Çarpım (Cartesian Product) İşlemi
133 |
134 | * İki tablonun kartezyen çarpımı gerçekleştirilir.
135 | * Farklı iki tabloya uygulanır.
136 | * Gösterim:
137 |
138 | 
139 |
140 |
141 | 
142 |
143 |
144 | ## Doğal Birleştirme/İç Birleştirme (Natural Join/Inner Join) İşlemi
145 |
146 |
147 | * İki tablonun kartezyen çarpımının alt kümesi elde edilir.
148 | * Kartezyen çarpım soncuna seçme işlemi uygulanır.
149 | * Aynı niteliğe ait bilgileri aynı olan kayıtlar seçilerek gösterilir.
150 | * Gösterim:
151 |
152 | 
153 |
154 |
155 | 
156 |
157 |
158 | ## Sol Dış Birleştirme (Left Outer Join) İşlemi
159 |
160 |
161 | * İki tabloya uygulanır.
162 | * Sol taraftaki tablodaki tüm kayıtlar alınır.
163 | * Sağ taraftaki tablodan aynı niteliğe ait bilgileri aynı olan kayıtlar seçilir, bilgileri sol taraftaki tablodan alınan bilgilere eklenerek gösterilir.
164 | * Sağ taraftaki tabloda eşleşen kayıt yoksa bunların yeri boş bırakılır (NULL).
165 | * Gösterim:
166 |
167 |
168 | 
169 |
170 |
171 | 
172 |
173 |
174 | ## Sağ Dış Birleştirme (Right Outer Join) İşlemi
175 |
176 |
177 | * İki tabloya uygulanır.
178 | * Sağ taraftaki tablodaki tüm kayıtlar alınır.
179 | * Sol taraftaki tablodan aynı niteliğe ait bilgileri aynı olan kayıtlar seçilir, bilgileri sağ taraftaki tablodan alınan bilgilere eklenerek gösterilir.
180 | * Sol taraftaki tabloda eşleşen kayıt yok ise bunların yeri boş bırakılır (NULL).
181 | * Gösterim:
182 |
183 | 
184 |
185 | 
186 |
187 |
188 | ## Bölme (Divison) İşlemi
189 |
190 | * İki tabloya uygulanır.
191 | * İki tablonun bir ortak niteliği olması gerekir.
192 | * Gösterim:
193 |
194 | 
195 |
196 | 
197 |
198 |
199 | ## Uygulama
200 |
201 | * Üçüncü hafta ders notlarında geliştirilen Üniversite Bilgi Sistemine ait veritabanının ilişkisel şeması (alt şema) aşağıdaki gibidir. İstenen sorgulara ait biçimsel ifadeleri ilişkisel cebir ile yapınız.
202 |
203 | ### İlişkisel Şema
204 | * Bolum (**bolumNo: int**, ad: varchar(20))
205 | * Ogrenci (**ogrenciNo: char(10)**, ad: varchar(20), soyad: varchar(20), dogumTarihi: date, dogumYeri: varchar(16), cinsiyet: char(1), bolumNo: int)
206 | * AcilanDers (**dersNo: char(6)**, dersKodu: char(5), donem: varchar(10), sicilNo: char(7), bolumNo: int)
207 | * Kayit (**kayitNo: int**, dersNo: char(6), ogrenciNo: char(10), vize: numeric, final: numeric, ortalama: numeric)
208 | * OgretimUyesi (**sicilNo: char(7)**, ad: varhcar(20), soyad: varchar(20), dogumTarihi: date, dogumYeri: char(16), unvan: varchar(20))
209 |
210 | ### Sorular
211 | * Soru 1: Bütün öğrencilerin öğrenci numarası, ad ve soyadlarını listeleyen ilişkisel cebir ifadesini yazınız.
212 | * Soru 2: Sakarya ilinde doğan öğrencilerin adını ve soyadını listeleyen ilişkisel cebir ifadesini yazınız.
213 | * Soru 3: Bilgisayar Mühendisliği bölümünde ders veren öğretim üyelerinin ad ve soyadlarını listeleyen ilişkisel cebir ifadesini yazınız.
214 | * Soru 4: 2016-2017 eğitim öğretim döneminde hiçbir dersi olmayan öğretim üyelerinin sicil numarası, ad ve soyadlarını listeleyen ilişkisel cebir ifadesini yazınız.
215 | * Soru 5: Makine Mühendisliği bölümünde okuyan veya cinsiyeti kız olan öğrencilerin ad ve soyadlarını listeleyen ilişkisel cebir ifadesini yazınız.
216 | * Soru 6: Çevre Mühendisliği bölümünde okuyan ve not ortalaması 3’ün üzerinde olan öğrencilerin öğrenci numarası bilgilerini listeleyen ilişkisel cebir ifadesini yazınız.
217 |
218 | ### Cevaplar
219 |
220 | * Soru1: Bütün öğrencilerin öğrenci numarası, ad ve soyadlarını listeleyen ilişkisel cebir ifadesini yazınız.
221 |
222 | 
223 |
224 | * Soru 2: Sakarya ilinde doğan öğrencilerin adını ve soyadını listeleyen ilişkisel cebir ifadesini yazınız.
225 |
226 | 
227 |
228 | * Soru 3: Bilgisayar Mühendisliği bölümünde ders veren öğretim üyelerinin ad ve soyadlarını listeleyen ilişkisel cebir ifadesini yazınız.
229 |
230 | 
231 |
232 | * Soru 4: 2016-2017 eğitim öğretim döneminde hiçbir dersi olmayan öğretim üyelerinin sicil numarası, ad ve soyadlarını listeleyen ilişkisel cebir ifadesini yazınız.
233 |
234 | 
235 |
236 | * Soru 5: Makine Mühendisliği bölümünde okuyan veya cinsiyeti kız olan öğrencilerin ad ve soyadlarını listeleyen ilişkisel cebir ifadesini yazınız.
237 |
238 | 
239 |
240 | * Soru 6: Çevre Mühendisliği bölümünde okuyan ve not ortalaması 3’ün üzerinde olan öğrencilerin öğrenci numarası bilgilerini listeleyen ilişkisel cebir ifadesini yazınız.
241 |
242 |
243 | 
244 |
245 |
246 |
247 |
248 |
249 |
250 |
--------------------------------------------------------------------------------
/VYS06.md:
--------------------------------------------------------------------------------
1 |
2 | BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
3 |
4 | # Yapısal Sorgulama Dili (Structured Query Language, SQL)
5 |
6 |
7 | ## Konular
8 |
9 | * Çalışma Ortamının Hazırlanması
10 | * Yapısal Sorgulama Dili (Structured Query Language, SQL)
11 | * Temel SQL Komutları (SQL DML Komutları; SELECT, JOIN, INSERT, UPDATE, DELETE)
12 | * Uygulama Programları ile VYS İşlemleri
13 |
14 |
15 | ## Çalışma Ortamının Hazırlanması
16 |
17 | * PostgreSQL kurulumu
18 | + PostgreSQL
19 | + https://www.postgresql.org/download
20 | * pgAdmin kurulumu
21 | + pgAdmin
22 | + PostgreSQL ile dağıtılıyor.
23 | * Valentina Studio
24 | + https://www.valentina-db.com/en/valentina-studio-overview
25 | * NorthWind örnek veritabanının içe aktarılması, dışa verilmesi
26 | + VS ile içe aktaracağınız veritabanını buradan indirebilirsiniz
27 | + pgAdmin ile içe aktaracağınız veritabanını buradan indirebilirsiniz
28 | * Pagila örnek veritabanı
29 | + pgAdmin ile içe aktaracağınız veritabanını buradan indirebilirsiniz
30 |
31 |
32 | ## Yapısal Sorgulama Dili (SQL)
33 |
34 | * SQL Fonksiyonları 2 bölüme ayrılabilir:
35 | * Veri Tanımlama Dili (Data Definition Language, DDL)
36 | + Yapısal Komutlar
37 | + Veritabanı, tablo, ilişki vs. oluşturma, değiştirme, silme vs.
38 | * Veri İşleme Dili (Data Manipulation Language, DML)
39 | + Veri ekleme, silme, güncelleme, sorgulama vs.
40 |
41 | 
42 |
43 |
44 |
45 | ## Temel SQL Komutları (SQL DML Komutları; SELECT, JOIN, INSERT, UPDATE, DELETE)
46 |
47 |
48 | * Aşağıdaki sorgular **NorthWind** Örnek Veritabanını Kullanmaktadır.
49 |
50 |
51 | ### SELECT
52 |
53 | * Select Komutu veritabanından veri almak (arama/listeleme) için kullanılır.
54 |
55 | ~~~sql
56 | SET search_path TO schema,public;
57 |
58 | SELECT * FROM "customers";
59 |
60 | SELECT "CompanyName", "ContactName" FROM "customers";
61 | ~~~
62 |
63 | ### WHERE
64 |
65 | * İstenilen koşula uyan kayıtların listelenmesi için WHERE komutu kullanılır.
66 |
67 | ~~~sql
68 | SELECT * FROM "customers" WHERE "Country" = 'Argentina';
69 |
70 | SELECT * FROM "customers" WHERE "Country" != 'Brazil';
71 |
72 | SELECT * FROM "customers" WHERE "Country"='Brazil' AND "Region" = 'SP';
73 |
74 | SELECT * FROM "customers" WHERE "Country" = 'Türkiye' OR "Country" = 'Japan';
75 |
76 | SELECT * FROM "order_details" WHERE "UnitPrice" = 14;
77 |
78 | SELECT * FROM "order_details" WHERE "UnitPrice" < 14;
79 |
80 | SELECT * FROM "order_details" WHERE "UnitPrice" <= 14;
81 |
82 | SELECT * FROM "order_details" WHERE "UnitPrice" >= 14;
83 |
84 | SELECT * FROM "order_details" WHERE "UnitPrice" > 14;
85 | ~~~
86 |
87 |
88 | ### DISTINCT
89 |
90 | * Sorgu sonucunda yer alan tekrarlı kayıtların (satırların), tek kayıt
91 | olarak getirilmesini sağlar.
92 |
93 | * Kaç farklı şehirden müşteri bulunmaktadır?
94 |
95 | ~~~sql
96 | SELECT DISTINCT "City" from "customers";
97 | ~~~
98 |
99 | ~~~sql
100 | SELECT DISTINCT "OrderID", "Discount" FROM "order_details" ORDER BY "OrderID"
101 | ~~~
102 |
103 |
104 | ### ORDER BY
105 |
106 | * Sorgular sonucunda listelenen kayıtların belirli alanlara göre alfabetik
107 | veya sayısal olarak artan ya da azalan şeklinde sıralanması için
108 | "ORDER BY" komutu kullanılır.
109 |
110 | ~~~sql
111 | SELECT * FROM "customers" ORDER BY "ContactName" ASC;
112 |
113 | SELECT * FROM "customers" ORDER BY "ContactName" DESC;
114 |
115 | SELECT * FROM "customers" ORDER BY "ContactName" DESC, "CompanyName";
116 |
117 | SELECT * FROM "customers" ORDER BY "Country", "ContactName";
118 | ~~~
119 |
120 |
121 | ### LIKE / NOT LIKE
122 |
123 | * Veriler içerisindeki belirli desenin aranması için WHERE ile birlikte kullanılır
124 |
125 | ~~~sql
126 | SELECT * FROM "customers" WHERE "Country" LIKE 'P%';
127 |
128 | SELECT * FROM "customers" WHERE "Country" NOT LIKE 'P%'; # NULL olanlar getirilmez
129 |
130 | SELECT * FROM "customers" WHERE "Country" LIKE '%e';
131 |
132 | SELECT * FROM "customers" WHERE "Country" LIKE '_a%';
133 |
134 | SELECT * FROM "customers" WHERE "Country" LIKE '%pa%';
135 |
136 | SELECT * FROM "customers" WHERE "Country" LIKE '%pa_';
137 | ~~~
138 |
139 |
140 | ### BETWEEN
141 |
142 | ~~~sql
143 | SELECT * FROM "products" WHERE "UnitPrice" BETWEEN 10 AND 20;
144 |
145 | SELECT * FROM "products" WHERE "ProductName" BETWEEN 'C' AND 'M';
146 | ~~~
147 |
148 |
149 | ### IN
150 |
151 | ~~~sql
152 | SELECT * FROM "customers"
153 | WHERE "public"."customers"."Country" IN ('Türkiye', 'Kuzey Kıbrıs Türk Cumhuriyeti');
154 | ~~~
155 |
156 |
157 | ### NULL ve NULL olmayan içeriğe sahip alanların sorgulanması.
158 |
159 | ~~~sql
160 | SELECT * FROM "customers" WHERE "Region" IS NOT NULL;
161 |
162 | SELECT * FROM "customers" WHERE "Region" IS NULL;
163 | ~~~
164 |
165 |
166 | ### AS
167 |
168 | * AS ifadesi ile alanlara/tablolara takma isim verilir.
169 |
170 | ~~~sql
171 | SELECT "CompanyName" AS "musteriler" FROM "customers";
172 |
173 | SELECT "UnitPrice", "UnitPrice" * 1.18 AS "KDVliTutar" FROM "products";
174 |
175 | SELECT "OrderID" AS "siparisNo",
176 | "ShipPostalCode" || ',' || "ShipAddress" AS "gonderiAdresi"
177 | FROM "orders"
178 | WHERE "OrderDate" BETWEEN '07/04/1996' AND '07/09/1996';
179 | ~~~
180 |
181 |
182 |
183 | ### Tablo Birleştirme İşlemleri
184 |
185 | * Birleştirme (join) işlemi, farklı tablolardaki kayıtları birleştirip yeni veri kümeleri oluşturmak için kullanılır.
186 |
187 |
188 | #### Doğal/İç Birleştirme (Natural/Inner Join)
189 |
190 |
191 | ~~~sql
192 | SELECT * FROM "Muzisyenler" INNER JOIN "Iller"
193 | ON "Muzisyenler"."ilKodu" = "Iller"."ilKodu"
194 | ~~~
195 |
196 | 
197 |
198 | ~~~sql
199 | SELECT
200 | "public"."orders"."OrderID",
201 | "public"."customers"."CompanyName",
202 | "public"."customers"."ContactName",
203 | "public"."orders"."OrderDate"
204 | FROM "orders"
205 | INNER JOIN "customers" ON "orders"."CustomerID" = "customers"."CustomerID"
206 | ~~~
207 |
208 |
209 | * "INNER JOIN" yerine "JOIN" ifadesi de kullanılabilir.
210 |
211 | ~~~sql
212 | SELECT
213 | "public"."orders"."OrderID",
214 | "public"."customers"."CompanyName",
215 | "public"."customers"."ContactName",
216 | "public"."orders"."OrderDate"
217 | FROM "orders"
218 | JOIN "customers" ON "orders"."CustomerID" = "customers"."CustomerID"
219 | ~~~
220 |
221 |
222 | ~~~sql
223 | SELECT
224 | "public"."orders"."OrderID",
225 | "public"."customers"."CompanyName",
226 | "public"."customers"."ContactName",
227 | "public"."orders"."OrderDate"
228 | FROM "orders"
229 | INNER JOIN "customers" ON "orders"."CustomerID" = "customers"."CustomerID"
230 | WHERE "public"."customers"."Country" LIKE 'A%'
231 | ORDER BY "public"."customers"."CompanyName" DESC;
232 | ~~~
233 |
234 | ~~~sql
235 | SELECT
236 | "orders"."OrderID" AS "siparisNo",
237 | "customers"."CompanyName" AS "sirket",
238 | "orders"."OrderDate" AS "siparisTarihi"
239 | FROM "orders"
240 | INNER JOIN "customers" ON "orders"."CustomerID" = "customers"."CustomerID";
241 | ~~~
242 |
243 |
244 | * Aşağıdaki kullanım biçimi de INNER JOIN gibidir.
245 |
246 | ~~~sql
247 | SELECT
248 | "orders"."OrderID" AS "siparisNo",
249 | "customers"."CompanyName" AS "sirket",
250 | "orders"."OrderDate" AS "siparisTarihi"
251 | FROM "orders", "customers"
252 | WHERE "orders"."CustomerID" = "customers"."CustomerID"
253 | ~~~
254 |
255 | ~~~sql
256 | SELECT
257 | "orders"."OrderID",
258 | "orders"."OrderDate",
259 | "customers"."CompanyName",
260 | "employees"."FirstName",
261 | "employees"."LastName"
262 | FROM "orders"
263 | INNER JOIN "customers" ON "orders"."CustomerID" = "customers"."CustomerID"
264 | INNER JOIN "employees" ON "orders"."EmployeeID" = "employees"."EmployeeID";
265 | ~~~
266 |
267 | ~~~sql
268 | SELECT
269 | "orders"."OrderID",
270 | "products"."ProductName"
271 | FROM "order_details"
272 | INNER JOIN "orders" ON "order_details"."OrderID" = "orders"."OrderID"
273 | INNER JOIN "products" ON "order_details"."ProductID" = "products"."ProductID";
274 | ~~~
275 |
276 |
277 |
278 | #### Sol Dış Birleştirme (Left Outer Join)
279 |
280 | ~~~sql
281 | SELECT * FROM "Muzisyenler" LEFT OUTER JOIN "Iller"
282 | ON "Muzisyenler"."ilKodu" = "Iller"."ilKodu"
283 | ~~~
284 |
285 | 
286 |
287 | ~~~sql
288 | SELECT
289 | "orders"."OrderID" AS "siparisNo",
290 | "customers"."CompanyName" AS "sirket",
291 | "orders"."OrderDate" AS "siparisTarihi"
292 | FROM "customers"
293 | LEFT OUTER JOIN "orders" ON "orders"."CustomerID" = "customers"."CustomerID"
294 | ORDER BY "OrderID" DESC;
295 | ~~~
296 |
297 | * Aşağıdaki sorgu eşdeğerdir.
298 |
299 | ~~~sql
300 | SELECT
301 | "orders"."OrderID" AS "siparisNo",
302 | "customers"."CompanyName" AS "sirket",
303 | "orders"."OrderDate" AS "siparisTarihi"
304 | FROM "customers"
305 | LEFT JOIN "orders" ON "orders"."CustomerID" = "customers"."CustomerID"
306 | ORDER BY "OrderID" DESC;
307 | ~~~
308 |
309 |
310 |
311 | #### Sağ Dış Birleştirme (Right Outer Join)
312 |
313 | ~~~sql
314 | SELECT * FROM "Muzisyenler" RIGHT OUTER JOIN "Iller"
315 | ON "Muzisyenler"."ilKodu" = "Iller"."ilKodu"
316 | ~~~
317 |
318 | 
319 |
320 | ~~~sql
321 | SELECT
322 | "orders"."OrderID" AS "siparisNo",
323 | "employees"."FirstName" AS "satisTemsilcisiAdi",
324 | "employees"."LastName" AS "satisTemsilcisiSoyadi",
325 | "orders"."OrderDate" AS "siparisTarihi"
326 | FROM "orders"
327 | RIGHT OUTER JOIN "employees" ON "orders"."EmployeeID" = "employees"."EmployeeID"
328 | ORDER BY "OrderID" DESC;
329 | ~~~
330 |
331 | ~~~sql
332 | INSERT INTO "employees" ("EmployeeID","FirstName", "LastName")
333 | VALUES (10, 'Melih', 'Can');
334 | ~~~
335 |
336 | * Aşağıdaki sorgu yukarıdaki birleştirme sorgusuna eşdeğerdir.
337 |
338 | ~~~sql
339 | SELECT
340 | "orders"."OrderID" AS "siparisNo",
341 | "employees"."FirstName" AS "satisTemsilcisiAdi",
342 | "employees"."LastName" AS "satisTemsilcisiSoyadi",
343 | "orders"."OrderDate" AS "siparisTarihi"
344 | FROM "orders"
345 | RIGHT JOIN "employees" ON "orders"."EmployeeID" = "employees"."EmployeeID"
346 | ORDER BY "OrderID" DESC;
347 | ~~~
348 |
349 | ### "CROSS JOIN" ve "FULL OUTER JOIN" türleri de mevcuttur.
350 |
351 | ### SELECT ... INTO
352 |
353 | * Bir tablodan alınan verileri, yeni bir tabloya kopyalamak için kullanılır.
354 | * Yeni tablonun mevcut olmaması gerekir.
355 |
356 | ~~~sql
357 | SELECT "CompanyName", "ContactName" INTO "MusteriYedek" FROM "customers";
358 | ~~~
359 |
360 |
361 |
362 | ### INSERT
363 |
364 | * INSERT komutu tabloya yeni kayıt eklemek için kullanılır.
365 | * Ekleme işlemlerinde veri bütünlüğü kısıtları göz önüne alınır.
366 | * Yalnızca bazı sütunlara veri eklememiz mümkündür.
367 | * Veri eklenmeyen sütunlar NULL (boş) gözükecektir.
368 |
369 | ~~~sql
370 | INSERT INTO "customers"
371 | ("CustomerID", "CompanyName", "ContactName","Address", "City", "PostalCode", "Country")
372 | VALUES ('ZZA', 'Zafer', 'Ayşe', 'Serdivan', 'Sakarya', '54400', 'Türkiye');
373 | ~~~
374 |
375 | ~~~sql
376 | INSERT INTO "public"."categories" ( "CategoryID", "CategoryName", "Description")
377 | VALUES (9, 'Sağlık', 'Sağlık Ürünleri' ),
378 | (10, 'Temizlik', 'Temizlik Ürünleri' );
379 | ~~~
380 |
381 | ### INSERT INTO ... SELECT
382 |
383 | * Bir tablodan alınan verileri, varolan bir tabloya kopyalamak için kullanılır.
384 |
385 | ~~~sql
386 | INSERT INTO "MusteriYedek" SELECT "CompanyName", "ContactName" FROM "customers";
387 | ~~~
388 |
389 |
390 | ### UPDATE
391 |
392 | * UPDATE komutu tablodaki kayıt(lar)ın değiştirilmesini sağlar.
393 | * Güncelleme işlemlerinde veri bütünlüğü kısıtları göz önüne alınır.
394 |
395 | ~~~sql
396 | UPDATE "customers" SET "ContactName" = 'Mario Pontes', "City" = 'Rio de Janeiro'
397 | WHERE "CompanyName" = 'Familia Arquibaldo';
398 | ~~~
399 |
400 |
401 | * WHERE ifadesi kullanılmazsa tüm satırlar değiştirilir.
402 |
403 |
404 | ### DELETE
405 |
406 | * DELETE ifadesi tablodaki kayıt veya kayıtların silinmesini sağlar.
407 | * Silme işlemlerinde veri bütünlüğü kısıtları göz önüne alınır.
408 |
409 | ~~~sql
410 | DELETE FROM "customers"
411 | WHERE "CompanyName" = 'LINO-Delicateses' AND "ContactName" = 'Felipe Izquierdo';
412 | ~~~
413 |
414 |
415 | * Tabloyu silmeden tablodaki bütün kayıtları silmek mümkündür.
416 | * Aşağıdaki komut tablodaki bütün kayıtları silmeye yarar.
417 |
418 | ~~~sql
419 | DELETE FROM "customers";
420 | ~~~
421 |
422 |
423 | ## Uygulama Programları ile VYS İşlemleri
424 |
425 | Uygulama programları ile veritabanı işlemleri yapılabilmesi için, programlama dili ile kullanılan veritabanı arasında iletişimi sağlayacak sürücülere ihtiyaç vardır.
426 |
427 | ### Java ile PostgreSQL İşlemleri
428 |
429 | PostgreSQL jdbc sürücüsü https://jdbc.postgresql.org bağlantısından indirilebilir.
430 |
431 | Sürücüler aşağıdaki temel fonksiyonları sağlar:
432 |
433 | * bağlantı kurulumu
434 | * sorgu çalıştırma
435 | * bağlantı sonlandırma
436 |
437 | Aşağıdaki Java kodunun uygulanmasına yardımcı olabilecek örnek bir video https://youtu.be/aPEx1RexoCY bağlantısından izlenebilir.
438 |
439 | ~~~java
440 | package edu.sau.vys.vys1;
441 |
442 | /***** Veritabanı sürücüsü *****/
443 | import java.sql.*;
444 |
445 | public class VeritabaniIslemleri {
446 |
447 | public static void main(String[] args)
448 | {
449 | try
450 | { /***** Bağlantı kurulumu *****/
451 | Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/Northwind",
452 | "postgres", "LecturePassword");
453 | if (conn != null)
454 | System.out.println("Veritabanına bağlandı!");
455 | else
456 | System.out.println("Bağlantı girişimi başarısız!");
457 |
458 |
459 | String sql= "SELECT \"CustomerID\", \"CompanyName\", \"Country\" FROM \"customers\"";
460 |
461 | /***** Sorgu çalıştırma *****/
462 | Statement stmt = conn.createStatement();
463 | ResultSet rs = stmt.executeQuery(sql);
464 |
465 | /***** Bağlantı sonlandırma *****/
466 | conn.close();
467 |
468 | String musteriNo= null;
469 | String sirketAdi=null;
470 | String ulke;
471 |
472 | while(rs.next())
473 | {
474 | /***** Kayda ait alan değerlerini değişkene ata *****/
475 | musteriNo = rs.getString("CustomerID");
476 | sirketAdi = rs.getString("CompanyName");
477 | ulke = rs.getString("Country");
478 |
479 | /***** Ekrana yazdır *****/
480 | System.out.print("Sıra No:"+ musteriNo);
481 | System.out.print(", Şirket Adı:" + sirketAdi);
482 | System.out.println(", Ulke:" + ulke);
483 | }
484 |
485 | /***** Kaynakları serbest bırak *****/
486 | rs.close();
487 | stmt.close();
488 |
489 | } catch (Exception e) {
490 | e.printStackTrace();
491 | }
492 | }
493 | }
494 | ~~~
495 |
496 |
497 | ### .net ile PostgreSQL İşlemleri
498 |
499 | [.net platformu ile Postgresql işlemleri için buraya bakınız](https://github.com/celalceken/DatabaseManagementSystems/blob/master/Belgeler/.NET_Postgres_connection.pdf)
500 |
501 | ### Ekleme/Silme/Değiştirme/Arama İşlemlerini İçeren Örnek Uygulama
502 |
503 | Örnek Uygulamanın kaynak kodları ve anlatımını içeren videolara erişmek için: https://github.com/celalceken/NesneYonelimliAnalizVeTasarimDersiUygulamalari/tree/master/Ders9
504 |
505 |
--------------------------------------------------------------------------------
/VYS07.md:
--------------------------------------------------------------------------------
1 | BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
2 |
3 |
4 | # Temel SQL (SQL DDL Komutları; CREATE, ALTER, DROP, ADD, SET, CONSTRAINTS)
5 |
6 | ## Konular
7 |
8 | * Nesne oluşturma, silme, düzenleme
9 | * SQL Kısıtları (CONSTRAINTS)
10 |
11 |
12 | ## Nesne oluşturma, silme, düzenleme
13 |
14 | ### CREATE
15 |
16 | * Nesne (veritabanı, şema, tablo, view, fonksiyon vb.) oluşturmak için kullanılır
17 |
18 |
19 | ### CREATE DATABASE
20 | * Veritabanı oluşturmak için kullanılır.
21 |
22 | ~~~sql
23 | CREATE DATABASE "AlisVerisUygulamasi"
24 | ENCODING='UTF-8'
25 | LC_COLLATE='tr_TR.UTF-8'-- Bu özellik sonradan değiştirilemez (sıralama (karşılaştırma) işlemleri için)
26 | LC_CTYPE='tr_TR.UTF-8' -- Bu özellik sonradan değiştirilemez (büyük küçük harf dönüşümü, bir veri harf mi? vb.)
27 | OWNER postgres
28 | TEMPLATE=template0;
29 | ~~~
30 |
31 |
42 |
43 |
44 | ### CREATE SCHEMA
45 |
46 | * Veritabanını mantıksal olarak bölümlere ayırmak için kullanılır.
47 | * Sabit disklerdeki klasör yapısına benzetilebilir. Bu sayede veritabanı daha kolay yönetilir. Çok sayıda kişinin aynı projede çalışabilmesi (isim uzayı) ve güvenlik kolaylaşır.
48 |
49 | ~~~sql
50 | CREATE SCHEMA "sema1";
51 | ~~~
52 |
53 |
54 |
55 | ### CREATE TABLE
56 |
57 | * Tablo oluşturmak için kullanılır.
58 |
59 | * Tablo oluşturulurken sütunlarının veri tipi bildirilir.
60 | * PostgreSQL'deki veri tiplerine aşağıdaki sayfadan erişilebilir.
61 | + https://www.postgresql.org/docs/10/static/datatype.html
62 | * Sütunlar için uygun veri tipinin seçilmesi önemlidir. Bu yapıldığı takdirde;
63 | + Hız artar, kaynaklar etkin kullanılır.
64 | + Veriler tutarlı olarak saklanır (doğrulama).
65 | + Bazı saldırılara karşı önlem alınmış olur.
66 |
67 | ~~~sql
68 | CREATE TABLE "sema1"."Urunler" (
69 | "urunNo" SERIAL,
70 | "kodu" CHAR(6) NOT NULL,
71 | "adi" VARCHAR(40) NOT NULL,
72 | "uretimTarihi" DATE DEFAULT '2019-01-01',
73 | "birimFiyati" MONEY,
74 | "miktari" SMALLINT DEFAULT 0,
75 | CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
76 | CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
77 | CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
78 | );
79 | ~~~
80 |
81 |
82 | ### DROP TABLE
83 |
84 | ~~~sql
85 | DROP TABLE "sema1"."Urunler";
86 | ~~~
87 |
88 |
89 | ### DROP SCHEMA
90 |
91 | ~~~sql
92 | DROP SCHEMA "sema1";
93 | ~~~
94 |
95 |
96 |
97 | ### DROP DATABASE
98 |
99 | ~~~sql
100 | DROP DATABASE "AlisVerisUygulamasi";
101 | ~~~
102 |
103 |
104 |
105 | ### TRUNCATE TABLE
106 |
107 | * Bir tablonun içindeki tüm verileri silmek için kullanılır. Yapısal bir komuttur. Veriler gerçek anlamda silinir ve böylece işgal edilen yer sistem tarafından kullanılabilir hale gelir (Vacuum).
108 |
109 | ~~~sql
110 | CREATE TABLE "Urunler" (
111 | "urunNo" SERIAL,
112 | "kodu" CHAR(6) NOT NULL,
113 | "adi" VARCHAR(40) NOT NULL,
114 | "uretimTarihi" DATE DEFAULT '2019-01-01',
115 | "birimFiyati" MONEY,
116 | "miktari" SMALLINT DEFAULT 0,
117 | CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
118 | CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
119 | CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
120 | );
121 | ~~~
122 |
123 | ~~~sql
124 | INSERT INTO "Urunler"
125 | ("kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
126 | VALUES
127 | ('ELO001', 'TV', 1300, '2019-10-30', 5);
128 |
129 | INSERT INTO "Urunler"
130 | ("kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
131 | VALUES
132 | ('ELO002', 'TV', 1300, '2019-10-30', 5);
133 | ~~~
134 |
135 | ~~~sql
136 | TRUNCATE TABLE "Urunler";
137 | ~~~
138 |
139 |
140 |
141 | ### ALTER TABLE
142 | * Tablonun yapısını düzenlemek için kullanılır.
143 |
144 | ~~~sql
145 | CREATE TABLE "Urunler" (
146 | "urunNo" SERIAL,
147 | "kodu" CHAR(6) NOT NULL,
148 | "adi" VARCHAR(40) NOT NULL,
149 | "uretimTarihi" DATE DEFAULT '2019-01-01',
150 | "birimFiyati" MONEY,
151 | "miktari" SMALLINT DEFAULT 0,
152 | CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
153 | CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
154 | CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
155 | );
156 | ~~~
157 |
158 | ~~~sql
159 | ALTER TABLE "Urunler" ADD COLUMN "uretimYeri" VARCHAR(30);
160 | ~~~
161 |
162 | ~~~sql
163 | ALTER TABLE "Urunler" DROP COLUMN "uretimYeri";
164 | ~~~
165 |
166 | ~~~sql
167 | ALTER TABLE "Urunler" ADD "uretimYeri" VARCHAR(30);
168 | ~~~
169 |
170 | ~~~sql
171 | ALTER TABLE "Urunler" ALTER COLUMN "uretimYeri" TYPE CHAR(20);
172 | ~~~
173 |
174 |
175 | ### SEQUENCE Nesnesi ve Değeri Otomatik Olarak Artan Alanlar
176 |
177 | * Otomatik artım örneği - SERIAL kullanımı.
178 |
179 | ~~~sql
180 | CREATE TABLE "Urunler" (
181 | "urunNo" SERIAL,
182 | "kodu" CHAR(6) NOT NULL,
183 | "adi" VARCHAR(40) NOT NULL,
184 | "uretimTarihi" DATE DEFAULT '2019-01-01',
185 | "birimFiyati" MONEY,
186 | "miktari" SMALLINT DEFAULT 0,
187 | CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
188 | CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
189 | CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
190 | );
191 | ~~~
192 |
193 | ~~~sql
194 | INSERT INTO "Urunler"
195 | ("kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
196 | VALUES
197 | ('ELO004', 'TV', 1300, '2019-10-30', 5);
198 | ~~~
199 |
200 |
201 | * Otomatik artım örneği - SEQUENCE Kullanımı 1
202 |
203 | ~~~sql
204 | CREATE TABLE "Urunler" (
205 | "urunNo" INTEGER,
206 | "kodu" CHAR(6) NOT NULL,
207 | "adi" VARCHAR(40) NOT NULL,
208 | "uretimTarihi" DATE DEFAULT '2019-01-01',
209 | "birimFiyati" MONEY,
210 | "miktari" SMALLINT DEFAULT 0,
211 | CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
212 | CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
213 | CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
214 | );
215 | ~~~
216 |
217 | ~~~sql
218 | CREATE SEQUENCE "sayac";
219 | ~~~
220 |
221 | ~~~sql
222 | ALTER SEQUENCE "sayac" OWNED BY "Urunler"."urunNo";
223 | ~~~
224 |
225 | ~~~sql
226 | INSERT INTO "Urunler"
227 | ("urunNo", "kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
228 | VALUES
229 | (NEXTVAL('"public"."sayac"'), 'ELO004', 'TV', 1300, '2019-10-30', 5);
230 | ~~~
231 |
232 |
233 | * SEQUENCE nesnesinin bir sonraki değerini NEXTVAL kullanarak elde edebiliriz.
234 | * SEQUENCE işleme fonksiyonlarını aşağıdaki bağlantıdan öğrenebiliriz.
235 | * https://www.postgresql.org/docs/10/static/functions-sequence.html
236 |
237 | ~~~sql
238 | SELECT NEXTVAL('sayac');
239 | ~~~
240 |
241 | ~~~sql
242 | SELECT CURRVAL('sayac');
243 | ~~~
244 |
245 |
246 | * Otomatik artım örneği - SEQUENCE Kullanımı 2
247 | + Tablo oluşturulurken de SEQUENCE kullanabiliriz.
248 |
249 | ~~~sql
250 | CREATE SEQUENCE "sayac";
251 | ~~~
252 |
253 | ~~~sql
254 | CREATE TABLE "Urunler" (
255 | "urunNo" INTEGER DEFAULT NEXTVAL('sayac'),
256 | "kodu" CHAR(6) NOT NULL,
257 | "adi" VARCHAR(40) NOT NULL,
258 | "uretimTarihi" DATE DEFAULT '2019-01-01',
259 | "birimFiyati" MONEY,
260 | "miktari" SMALLINT DEFAULT 0,
261 | CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
262 | CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
263 | CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
264 | );
265 | ~~~
266 |
267 | ~~~sql
268 | INSERT INTO "Urunler"
269 | ("urunNo", "kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
270 | VALUES
271 | (NEXTVAL('sayac'), 'ELO004', 'TV', 1300, '2019-10-30', 5);
272 | ~~~
273 |
274 | ~~~sql
275 | INSERT INTO "Urunler"
276 | ("kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
277 | VALUES
278 | ('ELO004', 'TV', 1300, '2019-10-30', 5);
279 | ~~~
280 |
281 |
282 |
283 | ## SQL Kısıtları (CONSTRAINTS)
284 |
285 | * Veri bütünlüğünün korunmasına yardımcı olur.
286 |
287 |
288 |
289 | ### NOT NULL
290 | * Tanımlandığı alan boş olamaz. Veri girilmek zorundadır.
291 |
292 | ~~~sql
293 | CREATE TABLE "Urunler" (
294 | "urunNo" SERIAL,
295 | "kodu" CHAR(6) NOT NULL,
296 | "adi" VARCHAR(40) NOT NULL,
297 | "uretimTarihi" DATE DEFAULT '2019-01-01',
298 | "birimFiyati" MONEY,
299 | "miktari" SMALLINT DEFAULT 0,
300 | CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
301 | CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
302 | CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
303 | );
304 | ~~~
305 |
306 | * "kodu" alanına veri girilmediği zaman hata alırız.
307 |
308 | ~~~sql
309 | INSERT INTO "Urunler"
310 | ("adi", "birimFiyati", "uretimTarihi", "miktari")
311 | VALUES
312 | ('TV', 1300, '2019-10-30', 5);
313 | ~~~
314 |
315 | ~~~sql
316 | ALTER TABLE "Urunler" ALTER COLUMN "kodu" DROP NOT NULL;
317 | ~~~
318 |
319 | ~~~sql
320 | ALTER TABLE "Urunler" ALTER "kodu" SET NOT NULL;
321 | ~~~
322 |
323 |
324 |
325 | ### DEFAULT
326 |
327 | * Tanımlandığı alana değer girilmemesi durumunda varsayılan bir değerin atanmasını sağlar.
328 |
329 | ~~~sql
330 | CREATE TABLE "Urunler" (
331 | "urunNo" SERIAL,
332 | "kodu" CHAR(6) NOT NULL,
333 | "adi" VARCHAR(40) NOT NULL,
334 | "uretimTarihi" DATE DEFAULT '2019-01-01',
335 | "birimFiyati" MONEY,
336 | "miktari" SMALLINT DEFAULT 0,
337 | CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
338 | CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
339 | CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
340 | );
341 | ~~~
342 |
343 | ~~~sql
344 | INSERT INTO "Urunler"
345 | ("kodu", "adi", "birimFiyati", "miktari")
346 | VALUES
347 | ('ELO004', 'TV', 1300, 5);
348 | ~~~
349 |
350 | ~~~sql
351 | ALTER TABLE "Urunler" ALTER "uretimTarihi" DROP DEFAULT;
352 | ~~~
353 |
354 | ~~~sql
355 | ALTER TABLE "Urunler" ALTER COLUMN "uretimTarihi" SET DEFAULT '2019-01-01';
356 | ~~~
357 |
358 |
359 |
360 | ### UNIQUE
361 |
362 | * Tanımlandığı alandaki verilerin eşsiz (tekil, benzersiz) olmasını sağlar.
363 |
364 |
365 | ~~~sql
366 | CREATE TABLE "Urunler" (
367 | "urunNo" SERIAL,
368 | "kodu" CHAR(6) NOT NULL,
369 | "adi" VARCHAR(40) NOT NULL,
370 | "uretimTarihi" DATE DEFAULT '2019-01-01',
371 | "birimFiyati" MONEY,
372 | "miktari" SMALLINT DEFAULT 0,
373 | CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
374 | CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
375 | CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
376 | );
377 | ~~~
378 |
379 | ~~~sql
380 | ALTER TABLE "Urunler" DROP CONSTRAINT "urunlerUnique";
381 | ~~~
382 |
383 | ~~~sql
384 | ALTER TABLE "Urunler" ADD CONSTRAINT "urunlerUnique" UNIQUE ("kodu");
385 | ~~~
386 |
387 |
388 | * İki alanlı UNIQUE örneği
389 |
390 | ~~~sql
391 | CREATE TABLE "Urunler" (
392 | "urunNo" SERIAL,
393 | "kodu" CHAR(6) NOT NULL,
394 | "adi" VARCHAR(40) NOT NULL,
395 | "uretimTarihi" DATE DEFAULT '2019-01-01',
396 | "birimFiyati" MONEY,
397 | "miktari" SMALLINT DEFAULT 0,
398 | CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
399 | CONSTRAINT "urunlerUnique" UNIQUE("kodu", "adi"),
400 | CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
401 | );
402 | ~~~
403 |
404 | ~~~sql
405 | ALTER TABLE "Urunler" DROP CONSTRAINT "urunlerUnique";
406 | ~~~
407 |
408 | ~~~sql
409 | ALTER TABLE "Urunler" ADD CONSTRAINT "urunlerUnique" UNIQUE ("kodu", "adi");
410 | ~~~
411 |
412 | ~~~sql
413 | INSERT INTO "Urunler"
414 | ("kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
415 | VALUES
416 | ('ELO004', 'TV', 1300, '2016-10-24', 5);
417 | ~~~
418 |
419 | ~~~sql
420 | INSERT INTO "Urunler"
421 | ("kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
422 | VALUES
423 | ('ELO005', 'Bilgisayar', 1500, '2019-10-20', 5);
424 | ~~~
425 |
426 |
427 |
428 | ### CHECK
429 |
430 | * Tanımlandığı alandaki değer aralığını sınırlamada kullanılır.
431 |
432 |
433 | ~~~sql
434 | CREATE TABLE "Urunler" (
435 | "urunNo" SERIAL,
436 | "kodu" CHAR(6) NOT NULL,
437 | "adi" VARCHAR(40) NOT NULL,
438 | "uretimTarihi" DATE DEFAULT '2019-01-01',
439 | "birimFiyati" MONEY,
440 | "miktari" SMALLINT DEFAULT 0,
441 | CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
442 | CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
443 | CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0)
444 | );
445 | ~~~
446 |
447 | ~~~sql
448 | ALTER TABLE "Urunler" DROP CONSTRAINT "urunlerCheck";
449 | ~~~
450 |
451 | ~~~sql
452 | ALTER TABLE "Urunler" ADD CONSTRAINT "urunlerCheck" CHECK ("miktari" >= 0);
453 | ~~~
454 |
455 | ~~~sql
456 | INSERT INTO "Urunler"
457 | ("kodu", "adi", "birimFiyati", "uretimTarihi", "miktari")
458 | VALUES
459 | ('ELO004', 'Bilgisayar', 1300, '2016-04-05', -3);
460 | ~~~
461 |
462 |
463 | ### Birincil Anahtar (PRIMARY KEY)
464 |
465 | ~~~sql
466 | CREATE TABLE "Urunler" (
467 | "urunNo" SERIAL,
468 | "kodu" CHAR(6) NOT NULL,
469 | "adi" VARCHAR(40) NOT NULL,
470 | "uretimTarihi" DATE DEFAULT '2019-01-01',
471 | "birimFiyati" MONEY,
472 | "miktari" SMALLINT DEFAULT 0,
473 | CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo")
474 | );
475 | ~~~
476 |
477 | ~~~sql
478 | ALTER TABLE "Urunler" DROP CONSTRAINT "urunlerPK";
479 | ~~~
480 |
481 | ~~~sql
482 | ALTER TABLE "Urunler" ADD CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo");
483 | ~~~
484 |
485 |
486 |
487 | * İki alanlı birincil anahtar örneği.
488 |
489 | ~~~sql
490 | CREATE TABLE "Urunler1" (
491 | "urunNo" SERIAL,
492 | "kodu" CHAR(6) NOT NULL,
493 | "adi" VARCHAR(40) NOT NULL,
494 | "uretimTarihi" DATE DEFAULT '2019-01-01',
495 | "birimFiyati" MONEY,
496 | "miktari" SMALLINT DEFAULT 0,
497 | CONSTRAINT "urunlerPK1" PRIMARY KEY("urunNo", "kodu")
498 | );
499 | ~~~
500 |
501 | ~~~sql
502 | ALTER TABLE "Urunler1" DROP CONSTRAINT "urunlerPK1";
503 | ~~~
504 |
505 | ~~~sql
506 | ALTER TABLE "Urunler1" ADD CONSTRAINT "urunlerPK1" PRIMARY KEY("urunNo", "kodu");
507 | ~~~
508 |
509 |
510 |
511 | ### Yabancı Anahtar (FOREIGN KEY)
512 |
513 | 
514 |
515 | ~~~sql
516 | CREATE TABLE "UrunSinifi" (
517 | "sinifNo" SERIAL,
518 | "adi" VARCHAR(30) NOT NULL,
519 | CONSTRAINT "urunSinifiPK" PRIMARY KEY("sinifNo")
520 | );
521 | ~~~
522 |
523 | ~~~sql
524 | CREATE SEQUENCE "sayac";
525 | ~~~
526 |
527 | ~~~sql
528 | CREATE TABLE "Urunler" (
529 | "urunNo" INTEGER DEFAULT NEXTVAL('sayac'),
530 | "kodu" CHAR(6) NOT NULL,
531 | "adi" VARCHAR(40) NOT NULL,
532 | "sinifi" INTEGER NOT NULL,
533 | "uretimTarihi" DATE DEFAULT '2019-01-01',
534 | "birimFiyati" MONEY,
535 | "miktari" SMALLINT DEFAULT 0,
536 | CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
537 | CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
538 | CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0),
539 | CONSTRAINT "urunSinifiFK1" FOREIGN KEY("sinifi") REFERENCES "UrunSinifi"("sinifNo")
540 | );
541 | ~~~
542 |
543 |
544 | * Bu ifade yukarıdaki ile aynıdır. ON DELETE ve ON UPDATE durumunda ne yapılacağı belirtilmediğinde varsayılan olarak NO ACTION olur.
545 |
546 | ~~~sql
547 | CREATE TABLE "Urunler" (
548 | "urunNo" SERIAL,
549 | "kodu" CHAR(6) NOT NULL,
550 | "adi" VARCHAR(40) NOT NULL,
551 | "sinifi" INTEGER NOT NULL,
552 | "uretimTarihi" DATE DEFAULT '2019-01-01',
553 | "birimFiyati" MONEY,
554 | "miktari" SMALLINT DEFAULT 0,
555 | CONSTRAINT "urunlerPK" PRIMARY KEY("urunNo"),
556 | CONSTRAINT "urunlerUnique" UNIQUE("kodu"),
557 | CONSTRAINT "urunlerCheck" CHECK("miktari" >= 0),
558 | CONSTRAINT "urunSinifiFK1" FOREIGN KEY("sinifi") REFERENCES "UrunSinifi"("sinifNo") ON DELETE NO ACTION ON UPDATE NO ACTION
559 | );
560 | ~~~
561 |
562 |
563 | * Oluşturulan bağlantının destekleyebileceği davranış şekilleri: NO ACTION (varsayılan), RESTRICT, CASCADE, SET NULL, SET DEFAULT
564 |
565 | ~~~sql
566 | ALTER TABLE "Urunler" DROP CONSTRAINT "urunSinifiFK1";
567 | ~~~
568 |
569 | ~~~sql
570 | ALTER TABLE "Urunler"
571 | ADD CONSTRAINT "urunSinifiFK1" FOREIGN KEY("sinifi")
572 | REFERENCES "UrunSinifi"("sinifNo")
573 | ON DELETE NO ACTION
574 | ON UPDATE NO ACTION;
575 | ~~~
576 |
577 | ~~~sql
578 | ALTER TABLE "Urunler"
579 | ADD CONSTRAINT "urunSinifiFK1" FOREIGN KEY("sinifi")
580 | REFERENCES "UrunSinifi"("sinifNo")
581 | ON DELETE RESTRICT
582 | ON UPDATE RESTRICT;
583 | ~~~
584 |
585 | ~~~sql
586 | ALTER TABLE "Urunler"
587 | ADD CONSTRAINT "urunSinifiFK1" FOREIGN KEY("sinifi")
588 | REFERENCES "UrunSinifi"("sinifNo")
589 | ON DELETE CASCADE
590 | ON UPDATE CASCADE;
591 | ~~~
592 |
--------------------------------------------------------------------------------
/VYS08.md:
--------------------------------------------------------------------------------
1 | BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
2 |
3 |
4 | # Temel SQL (SQL DDL Komutları; İndeks (Index), Kalıtım, Tekli Bağıntı, SQL DML Komutları; Görünüm (View), Çoklu Satır Fonksiyonları, Gruplama)
5 |
6 | ## Konular
7 |
8 | * İndeks (Index)
9 | * Kalıtım
10 | * Tekli Bağıntı / Özyineli Birleştirme
11 | * Görünüm (View)
12 | * Çoklu Satır Fonksiyonları
13 | * Gruplama
14 |
15 |
16 | ## İndeks
17 | * Ayrıntılar için https://github.com/celalceken/DatabaseManagementSystems/blob/master/VYS04.md bağlantısına bakınız.
18 | ~~~sql
19 | CREATE TABLE "Musteriler" (
20 | "musteriNo" SERIAL NOT NULL,
21 | "adi" CHARACTER VARYING(40) COLLATE "pg_catalog"."default" NOT NULL,
22 | "soyadi" CHARACTER VARYING(40) COLLATE "pg_catalog"."default" NOT NULL,
23 | CONSTRAINT "musteriNoPK" PRIMARY KEY ("musteriNo")
24 | );
25 | ~~~
26 |
27 | ~~~sql
28 | SHOW lc_collate;
29 | ~~~
30 |
31 | ~~~sql
32 | CREATE INDEX "musterilerAdiIndex" ON "Musteriler" ("adi");
33 | ~~~
34 |
35 | ~~~sql
36 | CREATE INDEX "musterilerSoyadiIndex" ON "Musteriler" USING btree ("soyadi");
37 | ~~~
38 |
39 | ~~~sql
40 | DROP INDEX "musterilerAdiIndex";
41 | ~~~
42 |
43 | ### Örnek Uygulama
44 |
45 | * Örnek Ek Veritabanı
46 |
47 | ~~~sql
48 | CREATE DATABASE "TestVeritabani"
49 | ENCODING='UTF-8'
50 | LC_COLLATE='tr_TR.UTF-8'
51 | LC_CTYPE='tr_TR.UTF-8'
52 | OWNER postgres
53 | TEMPLATE=template0;
54 |
55 | CREATE TABLE "Kisiler" (
56 | "kisiNo" SERIAL,
57 | "adi" VARCHAR(40) NOT NULL,
58 | "soyadi" VARCHAR(40) NOT NULL,
59 | "kayitTarihi" TIMESTAMP DEFAULT '2019-01-01 01:00:00',
60 | CONSTRAINT "urunlerPK1" PRIMARY KEY("kisiNo")
61 | );
62 | ~~~
63 |
64 |
84 | ~~~sql
85 | CREATE OR REPLACE FUNCTION "veriGir"(kayitSayisi integer)
86 | RETURNS VOID
87 | AS
88 | $$
89 | BEGIN
90 | IF kayitSayisi > 0 THEN
91 | FOR i IN 1 .. kayitSayisi LOOP
92 | INSERT INTO "Kisiler" ("adi","soyadi", "kayitTarihi")
93 | VALUES(
94 | substring('ABCÇDEFGĞHIiJKLMNOÖPRSŞTUÜVYZ' from ceil(random()*10)::smallint for ceil(random()*20)::SMALLINT),
95 | substring('ABCÇDEFGĞHIiJKLMNOÖPRSŞTUÜVYZ' from ceil(random()*10)::smallint for ceil(random()*20)::SMALLINT),
96 | NOW() + (random() * (NOW()+'365 days' - NOW()))
97 | );
98 | END LOOP;
99 | END IF;
100 | END;
101 | $$
102 | LANGUAGE 'plpgsql' SECURITY DEFINER;
103 | ~~~
104 |
105 | ~~~sql
106 | SELECT "veriGir"(100000);
107 | ~~~
108 |
109 | ~~~sql
110 | EXPLAIN ANALYZE
111 | SELECT * FROM "Kisiler"
112 | WHERE "adi"='DENEME';
113 | -- Satırlardan birinin adi alanı "DENEME" olarak değiştirilmeli
114 | ~~~
115 |
116 | + Execution time: 10.274 ms
117 |
118 | ~~~sql
119 | CREATE INDEX "adiINDEX" ON "public"."Kisiler" USING btree( "adi" Asc NULLS Last );
120 | ~~~
121 |
122 | ~~~sql
123 | EXPLAIN ANALYZE
124 | SELECT * FROM "Kisiler"
125 | WHERE "adi"='DENEME';
126 | -- Satırlardan birinin adi alanı "DENEME" olarak değiştirilmeli
127 | ~~~
128 |
129 | + Execution time: 0.086 ms
130 |
131 |
132 |
133 | ## Kalıtım
134 |
135 |
136 | ~~~sql
137 | CREATE DATABASE "AlisVerisUygulamasi"
138 | ENCODING='UTF-8'
139 | LC_COLLATE='tr_TR.UTF-8'
140 | LC_CTYPE='tr_TR.UTF-8'
141 | OWNER postgres
142 | TEMPLATE=template0;
143 | ~~~
144 |
156 |
157 | 
158 |
159 |
160 | ~~~sql
161 | CREATE SCHEMA "personel";
162 | ~~~
163 |
164 | ~~~sql
165 | CREATE TABLE "personel"."Personel" (
166 | "personelNo" SERIAL,
167 | "adi" CHARACTER VARYING(40) NOT NULL,
168 | "soyadi" CHARACTER VARYING(40) NOT NULL,
169 | "personelTipi" CHARACTER(1) NOT NULL,
170 | CONSTRAINT "personelPK" PRIMARY KEY ("personelNo")
171 | );
172 | ~~~
173 |
174 | ~~~sql
175 | CREATE TABLE "personel"."Danisman" (
176 | "personelNo" INT,
177 | "sirket" CHARACTER VARYING(40) NOT NULL,
178 | CONSTRAINT "danismanPK" PRIMARY KEY ("personelNo")
179 | );
180 | ~~~
181 |
182 | ~~~sql
183 | CREATE TABLE "personel"."SatisTemsilcisi" (
184 | "personelNo" INT,
185 | "bolge" CHARACTER VARYING(40) NOT NULL,
186 | CONSTRAINT "satisTemsilcisiPK" PRIMARY KEY ("personelNo")
187 | );
188 | ~~~
189 |
190 |
191 | * Temel tablo ile çocuk tablo arasında bağıntı kurulumu. "CASCADE" kullanımının en uygun olduğu yer
192 | ~~~sql
193 | ALTER TABLE "personel"."Danisman"
194 | ADD CONSTRAINT "DanismanPersonel" FOREIGN KEY ("personelNo")
195 | REFERENCES "personel"."Personel" ("personelNo")
196 | ON DELETE CASCADE
197 | ON UPDATE CASCADE;
198 | ~~~
199 |
200 | * Temel tablo ile çocuk tablo arasında bağıntı kurulumu. "CASCADE" kullanımının en uygun olduğu yer
201 | ~~~sql
202 | ALTER TABLE "personel"."SatisTemsilcisi"
203 | ADD CONSTRAINT "SatisTemsilcisiPersonel" FOREIGN KEY ("personelNo")
204 | REFERENCES "personel"."Personel" ("personelNo")
205 | ON DELETE CASCADE
206 | ON UPDATE CASCADE;
207 | ~~~
208 |
209 | * Kalıtım kullanıldığında verilerin eklenmesi
210 | ~~~sql
211 | INSERT INTO "personel"."Personel"("adi","soyadi","personelTipi")
212 | VALUES ('Mert','Şen','D' )
213 |
214 | INSERT INTO "personel"."Danisman"("personelNo","sirket")
215 | VALUES (currval('"personel"."Personel_personelNo_seq"'),'Şen Ltd.');
216 | ~~~
217 |
218 | ~~~sql
219 | -- Fonksiyon tanımı içerisinde
220 | $$
221 | DECLARE personelNo integer;
222 |
223 | BEGIN
224 |
225 | INSERT INTO "personel"."Personel"("adi","soyadi","personelTipi")
226 | VALUES ('Mert','Şen','D' ) RETURNING "personelNo" INTO personelNo;
227 |
228 | INSERT INTO "personel"."Danisman"("personelNo","sirket")
229 | VALUES (personelNo,'Şen Ltd.');
230 |
231 | END
232 | $$;
233 | ~~~
234 | * Kalıtım kullanıldığında verilerin alınması
235 | ~~~sql
236 | SELECT * FROM "personel"."Personel"
237 | INNER JOIN "personel"."SatisTemsilcisi"
238 | ON "personel"."Personel"."personelNo" = "personel"."SatisTemsilcisi"."personelNo";
239 | ~~~
240 |
241 | ~~~sql
242 | SELECT * FROM "personel"."Personel"
243 | INNER JOIN "personel"."Danisman"
244 | ON "personel"."Personel"."personelNo" = "personel"."Danisman"."personelNo";
245 | ~~~
246 |
247 | * Sorguların hızlandırılması için temel tabloya eklenen alan
248 | ~~~sql
249 | SELECT "adi", "soyadi" FROM "personel"."Personel"
250 | WHERE "personelTipi"='S';
251 | ~~~
252 |
253 | ~~~sql
254 | SELECT "adi", "soyadi" FROM "personel"."Personel"
255 | WHERE "personelTipi"='D';
256 | ~~~
257 |
258 | ~~~sql
259 | SELECT "adi", "soyadi" FROM "personel"."Personel"
260 | INNER JOIN "personel"."Danisman"
261 | ON "Personel"."personelNo" = "Danisman"."personelNo";
262 | ~~~
263 |
264 |
265 |
266 | ## Tekli Bağıntı / Özyineli Birleştirme
267 |
268 | 
269 |
270 | ~~~sql
271 | CREATE TABLE "Personel" (
272 | "personelNo" SERIAL,
273 | "adi" CHARACTER VARYING(40) NOT NULL,
274 | "soyadi" CHARACTER VARYING(40) NOT NULL,
275 | "yoneticisi" INTEGER,
276 | CONSTRAINT "personelPK" PRIMARY KEY ("personelNo"),
277 | CONSTRAINT "personelFK" FOREIGN KEY ("yoneticisi") REFERENCES "Personel" ("personelNo")
278 | );
279 | ~~~
280 |
281 | ~~~sql
282 | INSERT INTO "Personel" ("adi", "soyadi") VALUES ('Ahmet', 'Şahin');
283 | INSERT INTO "Personel" ("adi", "soyadi") VALUES ('Ayşe', 'Kartal');
284 | INSERT INTO "Personel" ("adi", "soyadi", "yoneticisi") VALUES ('Mustafa', 'Çelik', '1');
285 | INSERT INTO "Personel" ("adi", "soyadi", "yoneticisi") VALUES ('Fatma', 'Demir', '2');
286 | ~~~
287 |
288 | ~~~sql
289 | SELECT "Calisan"."adi" AS "calisanAdi",
290 | "Calisan"."soyadi" AS "calisanSoyadi",
291 | "Yonetici"."adi" AS "yoneticiAdi",
292 | "Yonetici"."soyadi" AS "yoneticiSoyadi"
293 | FROM "Personel" AS "Calisan"
294 | INNER JOIN "Personel" AS "Yonetici" ON "Yonetici"."personelNo" = "Calisan"."yoneticisi";
295 | ~~~
296 |
297 | ~~~sql
298 | SELECT "Calisan"."adi" AS "calisanAdi",
299 | "Calisan"."soyadi" AS "calisanSoyadi",
300 | "Yonetici"."adi" AS "yoneticiAdi",
301 | "Yonetici"."soyadi" AS "yoneticiSoyadi"
302 | FROM "Personel" AS "Calisan"
303 | LEFT OUTER JOIN "Personel" AS "Yonetici" ON "Yonetici"."personelNo" = "Calisan"."yoneticisi";
304 | ~~~
305 |
306 | + Yoneticisi olmayan çalışanlar da listelenir.
307 |
308 |
309 |
310 |
311 | ## Görünüm (View)
312 |
313 | * Bir veya daha fazla tablodan seçilen satırlar ve alanlardaki bilgilerin yeni bir tablo gibi ele alınmasını temin eden yapıdır.
314 |
315 | * Seçme (SELECT) işlemi için kısa yol tanımlar.
316 |
317 | * Tablo(lar)dan tüm satırlar seçilebileceği gibi yalnızca belli kriterlere uyan satırlar da seçilebilir.
318 |
319 | * Tablo(lar)daki tüm alanlar görünüme dahil edilebileceği gibi yalnızca belli alanlar da görünüme dahil edilebilir.
320 |
321 | * Genellikle, karmaşık olan seçme (SELECT) işlemlerini basit hale getirmek için kullanılır.
322 |
323 | * Dinamiktir. GÖRÜNÜM (VIEW) ile oluşturulan tabloya gerçekleştirilen her erişimde kendisini oluşturan ifadeler (görünüm – view ifadeleri) yeniden çalıştırılır.
324 |
325 | * Güvenliği sağlamak amacıyla da kullanılır.
326 | + Örneğin şirket personeli, müşterilerin genel bilgilerini (ad, soyad, adres v.b.) görebilsin ancak kredi kartı bilgilerine erişemesin isteniyorsa yalnızca görmesini istediğimiz bilgileri içeren bir görünüm oluşturulabilir ve ilgili personeli bu görünüme yetkilendiririz.
327 |
328 | > Aşağıdaki sorgular NorthWind Örnek Veritabanını Kullanmaktadır.
329 |
330 | ~~~sql
331 | CREATE OR REPLACE VIEW "public"."SiparisMusteriSatisTemsilcisi" AS
332 | SELECT "orders"."OrderID",
333 | "orders"."OrderDate",
334 | "customers"."CompanyName",
335 | "customers"."ContactName",
336 | "employees"."FirstName",
337 | "employees"."LastName"
338 | FROM "orders"
339 | INNER JOIN "employees" ON "orders"."EmployeeID" = "employees"."EmployeeID"
340 | INNER JOIN "customers" ON "orders"."CustomerID" = "customers"."CustomerID";
341 | ~~~
342 |
343 | ~~~sql
344 | SELECT * FROM "SiparisMusteriSatisTemsilcisi";
345 | ~~~
346 |
347 | ~~~sql
348 | DROP VIEW "SiparisMusteriSatisTemsilcisi";
349 | ~~~
350 |
351 |
352 | ## Çoklu Satır Fonksiyonları
353 |
354 | > Aşağıdaki sorgular NorthWind Örnek Veritabanını Kullanmaktadır.
355 |
356 |
357 | ### COUNT
358 |
359 | * COUNT (Satır sayısı)
360 | * Sorgu sonucunda oluşan sonuç kümesindeki satır sayısını döndürür.
361 | * Yalnızca bir sütun için uygulanırsa o sütundaki NULL olmayan kayıtların sayısı bulunur.
362 |
363 | ~~~sql
364 | SELECT COUNT("Region")
365 | FROM "customers"
366 | WHERE "Country" = 'Mexico';
367 | ~~~
368 |
369 | ~~~sql
370 | SELECT * from customers WHERE "Country" = 'Mexico';
371 | ~~~
372 |
373 | ~~~sql
374 | SELECT COUNT(*)
375 | FROM "customers"
376 | WHERE "Country" = 'Mexico';
377 | ~~~
378 |
379 |
380 | * Tablodaki tüm kayıtların sayısı
381 |
382 | ~~~sql
383 | SELECT COUNT(*)
384 | FROM "customers";
385 | ~~~
386 |
387 | ~~~sql
388 | SELECT COUNT("CustomerID") AS "musteriSayisi"
389 | FROM "customers";
390 | ~~~
391 |
392 | ~~~sql
393 | SELECT COUNT("CustomerID") AS "musteriSayisi"
394 | FROM "customers"
395 | WHERE "Country" = 'Türkiye';
396 | ~~~
397 |
398 |
399 |
400 | ### LIMIT
401 |
402 | ~~~sql
403 | SELECT * FROM "products" ORDER BY "ProductID" ASC LIMIT 4;
404 | ~~~
405 |
406 | ~~~sql
407 | SELECT * FROM "products" ORDER BY "ProductID" DESC LIMIT 5;
408 | ~~~
409 |
410 |
411 |
412 | ### MAX
413 |
414 | * Seçilen sütundaki en büyük değere ulaşmak için kullanılır.
415 |
416 | ~~~sql
417 | SELECT MAX("UnitPrice") FROM "products";
418 | ~~~
419 |
420 | ~~~sql
421 | SELECT MAX("UnitPrice") AS "enYuksekFiyat" FROM "products";
422 | ~~~
423 |
424 |
425 |
426 | ### MIN
427 |
428 | * Seçilen sütundaki en küçük değere ulaşmak için kullanılır.
429 |
430 | ~~~sql
431 | SELECT MIN("UnitPrice") FROM "products";
432 | ~~~
433 |
434 | ~~~sql
435 | SELECT MIN("UnitPrice") AS "enDusukFiyat" FROM "products";
436 | ~~~
437 |
438 |
439 |
440 | ### SUM
441 |
442 | * Seçilen sütundaki değerlerin toplamına ulaşmak için kullanılır.
443 |
444 | ~~~sql
445 | SELECT SUM("UnitPrice") FROM "products";
446 | ~~~
447 |
448 | ~~~sql
449 | SELECT SUM("UnitPrice") AS "toplam" FROM "products";
450 | ~~~
451 |
452 |
453 | ### AVG
454 |
455 | * Seçilen sütundaki değerlerin aritmetik ortalamasını bulmak için kullanılır.
456 |
457 | ~~~sql
458 | SELECT SUM("UnitPrice") / COUNT("ProductID") FROM "products";
459 | ~~~
460 |
461 | ~~~sql
462 | SELECT AVG("UnitPrice") FROM "products";
463 | ~~~
464 |
465 |
466 |
467 | ## Gruplama
468 |
469 | ### GROUP BY
470 |
471 | * Sorgu sonucunu belirtilen alan(lar)a göre gruplayarak oluşturur.
472 | * Gruplama işleminde seçilecek alan, gruplama yapılan alan ya da çoklu satır fonksiyonları (COUNT, SUM, AVG vb.) olmalıdır.
473 |
474 |
475 | * Aşağıdaki sorgu, ü̈rünleri tedarikçilerine (SupplierID) göre gruplar ve her tedarikçinin sağladığı ürünlerin sayısını (COUNT) hesaplayarak tedarikçi bilgisi ile birlikte döndürür.
476 |
477 | ~~~sql
478 | SELECT "SupplierID", COUNT("SupplierID") AS "urunSayisi"
479 | FROM "products"
480 | GROUP BY "SupplierID";
481 | ~~~
482 |
483 | ~~~sql
484 | SELECT "SupplierID", SUM("UnitsInStock") AS "stokSayisi"
485 | FROM "products"
486 | GROUP BY "SupplierID";
487 | ~~~
488 |
489 | * Northwind veritabanında; sipariş veren müşterilerin şirket isimleri, her müşterinin vermiş olduğu sipariş sayısı ve sipaişlerindeki ürünlerin toplam birim fiyatını hesaplayan SQL ifadesi?
490 | ~~~sql
491 | SELECT "customers"."CompanyName", COUNT("orders"."OrderID"), SUM("products"."UnitPrice")
492 | FROM "orders"
493 | INNER JOIN "customers" ON "orders"."CustomerID" = "customers"."CustomerID"
494 | INNER JOIN "order_details" ON "order_details"."OrderID" = "orders"."OrderID"
495 | LEFT OUTER JOIN "products" ON "order_details"."ProductID" = "products"."ProductID"
496 | GROUP BY "CompanyName"
497 | ORDER BY 1;
498 | ~~~
499 | * Yukarıdaki sorgu, siparişleri müşteri firma adına (CompanyName) göre gruplar ve her müşterinin satın aldığı ürün sayısını (COUNT) ve bu ürünlerin toplam (SUM) birim fiyatını hesaplar.
500 |
501 | ### HAVING
502 |
503 | * Gruplandırılmış veriler üzerinde filtreleme yapmak için kullanılır.
504 | * Gruplama işleminden sonra koşul yazılabilmesi için WHERE yerine HAVING ifadesinin kullanılması gereklidir.
505 | * HAVING ile yazılan koşullar içerisinde çoklu satır fonksiyonları veya gruplama yapılan alan kullanılabilir.
506 |
507 | ~~~sql
508 | SELECT "SupplierID", COUNT("SupplierID") AS "urunSayisi"
509 | FROM "products"
510 | GROUP BY "SupplierID"
511 | HAVING COUNT("SupplierID") > 2;
512 | ~~~
513 |
514 | ~~~sql
515 | SELECT "SupplierID", COUNT("SupplierID") AS "urunSayisi"
516 | FROM "products"
517 | GROUP BY "SupplierID"
518 | HAVING "SupplierID" = 2;
519 | ~~~
520 |
521 | * Çoklu satır fonksiyonları ile WHERE kullanılmaz.
522 | * Aşağıdaki iki sorgu yanlıştır.
523 |
524 | ~~~sql
525 | SELECT "SupplierID", COUNT("SupplierID") AS "urunSayisi"
526 | FROM "products"
527 | WHERE COUNT("SupplierID") > 2;
528 | ~~~
529 |
530 | ~~~sql
531 | SELECT "SupplierID", COUNT("SupplierID") AS "urunSayisi"
532 | FROM "products"
533 | GROUP BY "SupplierID"
534 | WHERE COUNT("SupplierID") > 2;
535 | ~~~
536 |
--------------------------------------------------------------------------------
/VYS11.md:
--------------------------------------------------------------------------------
1 | BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
2 |
3 | # İleri SQL(Alt Sorgular, IN, ANY, ALL, İlintili Sorgular, UNION, INTERSECT, EXCEPT, Hareket/İşlem (Transaction))
4 |
5 |
6 | ## Konular
7 |
8 | * Alt Sorgu
9 | * UNION ve UNION ALL
10 | * INTERSECT
11 | * EXCEPT
12 | * Hareket/İşlem (Transaction)
13 |
14 |
15 | ## Alt Sorgu
16 |
17 | * Burada verilen örnekler NorthWind veritabanının aşağıdaki şeması ile ilgilidir.
18 |
19 |
20 | 
21 |
22 |
23 |
24 | ### WHERE ile Alt Sorgu (Tek Değer Döndüren) Kullanımı
25 |
26 | * WHERE ifadesinde yalnızca =, !=, <, >, <=, >= gibi operatörler kullanılıyor ise alt sorgular sonucunda tek alan ve tek satır dönmeli ve veri tipi uygun olmalı. Aksi halde hata verir.
27 |
28 | * Çoklu satır fonksiyonlarından geriye tek değer döndürüldüğü için alt sorgu içerisinde bu tür fonksiyonlar kullanılabilir.
29 |
30 | * Alt sorgudaki koşul içerisinde birincil anahtar kullanılarak alt sorgudan tek değer döndürülmesi garanti edilebilir.
31 |
32 | ~~~sql
33 | SELECT AVG("UnitPrice") FROM "products";
34 | ~~~
35 |
36 | ~~~sql
37 | SELECT "ProductID", "UnitPrice" FROM "products"
38 | WHERE "UnitPrice" < (SELECT AVG("UnitPrice") FROM "products");
39 | ~~~
40 |
41 | ~~~sql
42 | SELECT "ProductID" FROM "products" WHERE "ProductName" = 'Y Z Bilgisayar';
43 | ~~~
44 |
45 | ~~~sql
46 | SELECT DISTINCT "public"."customers"."CustomerID",
47 | "public"."customers"."CompanyName",
48 | "public"."customers"."ContactName"
49 | FROM "orders"
50 | INNER JOIN "customers" ON "orders"."CustomerID" = "customers"."CustomerID"
51 | INNER JOIN "order_details" ON "order_details"."OrderID" = "orders"."OrderID"
52 | WHERE "order_details"."ProductID" =
53 | (SELECT "ProductID" FROM "products" WHERE "ProductName" = 'Y Z Bilgisayar')
54 | ORDER BY "public"."customers"."CustomerID";
55 | ~~~
56 |
57 | ### WHERE ile Alt Sorgu (Çok Değer Döndüren) Kullanımı
58 |
59 | * Alt sorgudan çok değer dönmesi durumunda IN, ANY ve ALL ifadeleri kullanılmalıdır.
60 |
61 |
62 | * IN ifadesi, sorgulanan değerin, alt sorgudan dönen değerler kümesi içerisinde olup olmadığını araştırmak için kullanılır.
63 |
64 | ~~~sql
65 | SELECT "SupplierID" FROM "products" WHERE "UnitPrice" > 18;
66 | ~~~
67 |
68 | ~~~sql
69 | SELECT * FROM "suppliers"
70 | WHERE "SupplierID" IN
71 | (SELECT "SupplierID" FROM "products" WHERE "UnitPrice" > 18);
72 | ~~~
73 |
74 | ~~~sql
75 | SELECT "ProductID" FROM "products" WHERE "ProductName" LIKE 'A%';
76 | ~~~
77 |
78 | ~~~sql
79 | SELECT DISTINCT "public"."customers"."CustomerID",
80 | "public"."customers"."CompanyName",
81 | "public"."customers"."ContactName"
82 | FROM "orders"
83 | INNER JOIN "customers" ON "orders"."CustomerID" = "customers"."CustomerID"
84 | INNER JOIN "order_details" ON "order_details"."OrderID" = "orders"."OrderID"
85 | WHERE "order_details"."ProductID" IN
86 | (SELECT "ProductID" FROM "products" WHERE "ProductName" LIKE 'A%');
87 | ~~~
88 |
89 | ~~~sql
90 | UPDATE "orders"
91 | SET "ShipCountry" = 'Mexico'
92 | WHERE "CustomerID" IN
93 | (SELECT "CustomerID" FROM "customers" WHERE "Country" = 'Mexico');
94 | ~~~
95 |
96 | ~~~sql
97 | DELETE FROM "products"
98 | WHERE "SupplierID" IN
99 | (SELECT "SupplierID" FROM "suppliers" WHERE "Country" = 'USA');
100 | ~~~
101 |
102 |
103 |
104 | ### ANY ile Alt Sorgu Kullanımı
105 |
106 | * Üç türü mevcuttur.
107 | + = ANY
108 | + \> ANY
109 | + < ANY
110 |
111 | * = ANY ifadesi, sorgulanan değerin, alt sorgudan dönen değerler kümesinin elemanlarından her hangi birisine eşit olup olmadığını araştırmak için kullanılır.
112 |
113 | * \> ANY ifadesi, sorgulanan değerin, alt sorgudan dönen değerler kümesinin elemanlarının her hangi birisinden büyük olup olmadığını araştırmak için kullanılır.
114 |
115 | * < ANY ifadesi, sorgulanan değerin, alt sorgudan dönen değerler kümesinin elemanlarının her hangi birisinden küçük olup olmadığını araştırmak için kullanılır.
116 |
117 | ~~~sql
118 | SELECT * FROM "products"
119 | WHERE "UnitPrice" = ANY
120 | (
121 | SELECT "UnitPrice"
122 | FROM "suppliers"
123 | INNER JOIN "products"
124 | ON "suppliers"."SupplierID" = "products"."SupplierID"
125 | WHERE "suppliers"."CompanyName" = 'Tokyo Traders'
126 | );
127 | ~~~
128 |
129 | ~~~sql
130 | SELECT * FROM "products"
131 | WHERE "UnitPrice" IN
132 | (
133 | SELECT "UnitPrice"
134 | FROM "suppliers"
135 | INNER JOIN "products"
136 | ON "suppliers"."SupplierID" = "products"."SupplierID"
137 | WHERE "suppliers"."CompanyName" = 'Tokyo Traders'
138 | );
139 | ~~~
140 |
141 | ~~~sql
142 | SELECT * FROM "products"
143 | WHERE "UnitPrice" < ANY
144 | (
145 | SELECT "UnitPrice"
146 | FROM "suppliers"
147 | INNER JOIN "products"
148 | ON "suppliers"."SupplierID" = "products"."SupplierID"
149 | WHERE "suppliers"."CompanyName" = 'Tokyo Traders'
150 | );
151 | ~~~
152 |
153 | ~~~sql
154 | SELECT * FROM "products"
155 | WHERE "UnitPrice" > ANY
156 | (
157 | SELECT "UnitPrice"
158 | FROM "suppliers"
159 | INNER JOIN "products"
160 | ON "suppliers"."SupplierID" = "products"."SupplierID"
161 | WHERE "suppliers"."CompanyName" = 'Tokyo Traders'
162 | );
163 | ~~~
164 |
165 |
166 |
167 | ### ALL ile Alt Sorgu Kullanımı
168 |
169 | * İki türü mevcuttur.
170 | + \> ALL
171 | + < ALL
172 |
173 | * \> ALL ifadesi, sorgulanan değerin, alt sorgudan dönen değerler kümesinin elemanlarının tamamından büyük olup olmadığını araştırmak için kullanılır.
174 |
175 | * < ALL ifadesi, sorgulanan değerin, alt sorgudan dönen değerler kümesinin elemanlarının tamamından küçük olup olmadığını araştırmak için kullanılır.
176 |
177 | ~~~sql
178 | SELECT * FROM "products"
179 | WHERE "UnitPrice" < ALL
180 | (
181 | SELECT "UnitPrice"
182 | FROM "suppliers"
183 | INNER JOIN "products"
184 | ON "suppliers"."SupplierID" = "products"."SupplierID"
185 | WHERE "suppliers"."CompanyName" = 'Tokyo Traders'
186 | );
187 | ~~~
188 |
189 | ~~~sql
190 | SELECT * FROM "products"
191 | WHERE "UnitPrice" > ALL
192 | (
193 | SELECT "UnitPrice"
194 | FROM "suppliers"
195 | INNER JOIN "products"
196 | ON "suppliers"."SupplierID" = "products"."SupplierID"
197 | WHERE "suppliers"."CompanyName" = 'Tokyo Traders'
198 | );
199 | ~~~
200 |
201 |
202 | ### HAVING ile Alt Sorgu Kullanımı
203 |
204 | ~~~sql
205 | SELECT AVG("UnitsInStock") FROM "products";
206 | ~~~
207 |
208 | ~~~sql
209 | SELECT "SupplierID", SUM("UnitsInStock") AS "stoktakiToplamUrunSayisi"
210 | FROM "products"
211 | GROUP BY "SupplierID"
212 | HAVING SUM("UnitsInStock") < (SELECT AVG("UnitsInStock") FROM "products");
213 | ~~~
214 |
215 | ~~~sql
216 | SELECT MAX("Quantity") FROM "order_details";
217 | ~~~
218 |
219 | ~~~sql
220 | SELECT "ProductID", SUM("Quantity")
221 | FROM "order_details"
222 | GROUP BY "ProductID"
223 | HAVING SUM("Quantity") > (SELECT MAX("Quantity") FROM "order_details");
224 | ~~~
225 |
226 |
227 |
228 | ### Satır İçi (Inline) Alt Sorgu Kullanımı
229 |
230 | * Alt sorgular sonucunda tek alan ve tek satır dönmeli. Aksi halde hata verir.
231 |
232 | ~~~sql
233 | SELECT
234 | "ProductName",
235 | "UnitsInStock",
236 | (SELECT MAX("UnitsInStock") FROM "products") AS "enBuyukDeger"
237 | FROM "products";
238 | ~~~
239 |
240 | ~~~sql
241 | SELECT
242 | "SupplierID",
243 | SUM("UnitsInStock") AS "toplam",
244 | SQRT(SUM(("UnitsInStock" - (SELECT AVG("UnitsInStock") FROM "products")) ^ 2) / COUNT("UnitsInStock")) AS "standartSapma"
245 | FROM "products"
246 | GROUP BY "SupplierID";
247 | ~~~
248 |
249 | * Standart sapma hesaplanırken “Toplam” takma ismi kullanılmamalı.
250 |
251 |
252 |
253 |
254 | ### İlintili (Correlated) Sorgu
255 |
256 |
257 | * İç içe döngülerdeki gibi dış sorgunun her bir satırı iç sorguya gönderilerek iç sorgunun çalıştırılması sağlanır.
258 |
259 | * Aşağıdaki örneğin çalışması şu adımlardan oluşur;
260 | + 1. Dış sorgunun birinci satırı seçilir.
261 | + 2. İç sorgu çalıştırılır ve dış sorguda seçilen satırın SupplierID değerine sahip olan tüm kayıtların UnitPrice alanlarındaki değerlerin aritmetik ortalaması hesaplanır.
262 | + 3. Dış sorgunun birinci satırının UnitPrice alanındaki değer, alt sorguda hesaplanan ortalamadan büyük ise seçilen birinci satır sonuç kümesine eklenir. Değilse eklenmez.
263 | + 4. Dış sorgunun ikinci satırı seçilir ve aynı işlem yapılır.
264 | + 5. Bu işlemler dış sorgunun tüm satırları için tekrarlanır.
265 |
266 | ~~~sql
267 | SELECT "ProductName", "UnitPrice" FROM "products" AS "urunler1"
268 | WHERE "urunler1"."UnitPrice" >
269 | (
270 | SELECT AVG("UnitPrice") FROM "products" AS "urunler2"
271 | WHERE "urunler1"."SupplierID" = "urunler2"."SupplierID"
272 | );
273 | ~~~
274 |
275 | * EXIST ifadesi ile birlikte başarımı çok iyidir.
276 | + Siparişi olan müşterilerin listesi.
277 |
278 | * Alt sorgudaki * ifadesi yerine herhangi bir alan adı da yazılabilir.
279 |
280 | ~~~sql
281 | SELECT "CustomerID", "CompanyName", "ContactName"
282 | FROM "customers"
283 | WHERE EXISTS
284 | (SELECT * FROM "orders" WHERE "customers"."CustomerID" = "orders"."CustomerID");
285 | ~~~
286 |
287 | * Aynı sonuç farklı sorgular ile de bulunabilir. Ancak daha yavaş olur.
288 |
289 | ~~~sql
290 | SELECT "CustomerID", "CompanyName", "ContactName"
291 | FROM "customers"
292 | WHERE "CustomerID" =
293 | (SELECT DISTINCT "CustomerID" FROM "orders" WHERE "orders"."CustomerID" = "customers"."CustomerID");
294 | ~~~
295 |
296 | ~~~sql
297 | SELECT "CustomerID", "CompanyName", "ContactName"
298 | FROM "customers"
299 | WHERE "CustomerID" IN
300 | (SELECT "CustomerID" FROM "orders" WHERE "orders"."CustomerID" = "customers"."CustomerID");
301 | ~~~
302 |
303 | ~~~sql
304 | SELECT DISTINCT "public"."customers"."CompanyName",
305 | "public"."customers"."ContactName"
306 | FROM "orders"
307 | INNER JOIN "customers" ON "orders"."CustomerID" = "customers"."CustomerID";
308 | ~~~
309 |
310 |
311 | * Siparişi olmayan müşterilerin listesi.
312 |
313 | ~~~sql
314 | SELECT "CustomerID", "CompanyName", "ContactName"
315 | FROM "customers"
316 | WHERE NOT EXISTS
317 | (SELECT * FROM "orders" WHERE "customers"."CustomerID" = "orders"."CustomerID");
318 | ~~~
319 |
320 |
321 | ## UNION ve UNION ALL
322 |
323 | * İki tablonun küme birleşimini alır.
324 | * Rastgele iki tablonun birleşimi alınamaz.
325 | + İki tablonun nitelik sayıları aynı olmalı.
326 | + Aynı sıradaki nitelikleri aynı değer alanı üzerinde tanımlanmış olmalıdır.
327 | * UNION ifadesi ile aynı kayıtlar bir defa gösterilir.
328 | * UNION ALL ifadesi ile aynı kayıtlar gösterilir.
329 |
330 | ~~~sql
331 | SELECT "CompanyName", "Country" FROM "customers"
332 | UNION
333 | SELECT "CompanyName", "Country" FROM "suppliers"
334 | ORDER BY 2;
335 | ~~~
336 |
337 | ~~~sql
338 | SELECT "CompanyName", "Country" FROM "customers"
339 | UNION ALL
340 | SELECT "CompanyName", "Country" FROM "suppliers"
341 | ORDER BY 2;
342 | ~~~
343 |
344 | ~~~sql
345 | SELECT "CustomerID" FROM "customers"
346 | UNION
347 | SELECT "CustomerID" FROM "orders"
348 | ORDER BY "CustomerID";
349 | ~~~
350 |
351 |
352 | ## INTERSECT
353 |
354 | * İki tablonun küme kesişimi elde edilir.
355 | * Rasgele iki tablonun kesişimi alınamaz.
356 | + İki tablonun nitelik sayıları aynı olmalı.
357 | + Aynı sıradaki nitelikleri aynı değer alanı üzerinde tanımlanmış olmalı.
358 |
359 | ~~~sql
360 | SELECT "CompanyName", "Country" FROM "customers"
361 | INTERSECT
362 | SELECT "CompanyName", "Country" FROM "suppliers"
363 | ORDER BY 2;
364 | ~~~
365 |
366 |
367 |
368 | ## EXCEPT
369 |
370 | * Bir tablonun diğerinden farkını elde etmek için kullanılır.
371 | * Rastgele iki tabloya uygulanamaz.
372 | + İki tablonun nitelik sayıları aynı olmalı.
373 | + Aynı sıradaki nitelikleri aynı değer alanı üzerinde tanımlanmış olmalı.
374 |
375 | ~~~sql
376 | SELECT "CompanyName", "Country" FROM "customers"
377 | EXCEPT
378 | SELECT "CompanyName", "Country" FROM "suppliers"
379 | ORDER BY 2;
380 | ~~~
381 |
382 |
383 |
384 | ## Hareket/İşlem (Transaction)
385 |
386 | * Hareket/işlem (transaction) veritabanı yönetim sistemlerinin önemli özelliklerinden birisidir.
387 |
388 | * ACID ile belirtilen ozellikleri destekler.
389 |
390 | * ACID ifadesi, Atomicity, Consistency, Isolation ve Durability kelimelerinin ilk harflerinin birleşiminden oluşur. Detayları aşağıda anlatılmıştır.
391 |
392 | * Atomicity (Atomiklik): Hareket/işlem (transaction) kapsamındaki alt işlemlerin tamamı bir bütün olarak ele alınır. Ya alt işlemlerin tamamı başarılı olarak çalıştırılır, ya da herhangi birinde hata varsa tamamı iptal edilir ve veritabanı eski kararlı haline döndürülür.
393 |
394 | * Consistency (Tutarlılık): Herhangi bir kısıt ihlal edilirse roll back işlemiyle veritabanı eski kararlı haline döndürülür.
395 |
396 | * Isolation (Yalıtım): İşlemler birbirlerini (ortak kaynak kullanımı durumunda) etkilemezler. Kullanılan ortak kaynak işlem tarafından, işlem tamamlanana kadar, kilitlenir.
397 |
398 | * Durability (Mukavemet): Sistem tarafından bir hata meydana gelmesi durumunda tamamlanmamış olan işlem sistem çalışmaya başladıktan sonra mutlaka tamamlanır.
399 |
400 |
401 | ~~~sql
402 | BEGIN; -- Harekete (transaction) başla.
403 |
404 | INSERT INTO "order_details" ("OrderID", "ProductID", "UnitPrice", "Quantity", "Discount")
405 | VALUES (10248, 11, 20, 2, 0);
406 |
407 | -- Yukarıdaki sorguda hata mevcutsa ilerlenilmez.
408 | -- Aşağıdaki sorguda hata mevcutsa bu noktadan geri sarılır (rollback).
409 | -- Yani yukarıdaki sorguda yapılan işlemler geri alınır.
410 |
411 | UPDATE "products"
412 | SET "UnitsInStock" = "UnitsInStock" - 2
413 | WHERE "ProductID" = 11;
414 |
415 | -- Her iki sorgu da hatasız bir şekilde icra edilirse her ikisini de işlet ve
416 | -- veritabanının durumunu güncelle.
417 |
418 | COMMIT; -- Hareketi (transaction) tamamla.
419 | ~~~
420 |
421 | ~~~sql
422 | BEGIN;
423 |
424 | UPDATE Hesap SET bakiye = bakiye - 100.00
425 | WHERE adi = 'Ahmet';
426 |
427 | SAVEPOINT my_savepoint;
428 |
429 | UPDATE Hesap SET bakiye = bakiye + 100.00
430 | WHERE adi = 'Mehmet';
431 |
432 |
433 | -- Parayı Mehmet'e değil Ayşe'ye gönder
434 |
435 | ROLLBACK TO my_savepoint;
436 |
437 | UPDATE Hesap SET bakiye = bakiye + 100.00
438 | WHERE adi = 'Ayşe';
439 |
440 | COMMIT;
441 | ~~~
442 |
--------------------------------------------------------------------------------
/VYS12_1.md:
--------------------------------------------------------------------------------
1 | BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
2 |
3 | # Normalizasyon
4 |
5 | ## Konular
6 |
7 | * Normalizasyon
8 | * Veri Tekrarının Zararları
9 | * Birinci Normal Form (1NF)
10 | * Fonksiyonel Bağımlılık
11 | * İkinci Normal Form (2NF)
12 | * Üçüncü Normal Form (3NF)
13 | * 1., 2. ve 3. Normal Formlar
14 | * Örnekler
15 | * Kaynaklar
16 |
17 | ## Veritabanı Geliştirme Yaşam Döngüsü
18 |
19 | 
20 |
21 | ## Normalizasyon
22 |
23 | * İyi bir veritabanı tasarımı, düzenli ve sağlam tablo tasarımlarını gerektirir.
24 |
25 | * Normalizasyon, veri fazlalıklarını en aza indirerek veri düzensizliklerinin (data anomaly) önüne geçebilmek için tablo yapılarını değerlendirme ve düzeltme işlemi olarak tanımlanabilir.
26 |
27 | * Normalizasyon işlemi normal form adı verilen seri işlemlerden meydana gelir. 1NF, 2NF, 3NF, 4NF
28 |
29 | * 2NF 1NF den, 3NF 2NF den, ve 4NF 3NF den daha iyidir.
30 |
31 | * Her tasarım için en yüksek NF daha iyi sonuç verir denemez. Yüksek başarıma ihtiyaç duyulan bazı durumlarda normal formun (NF) düşürülmesi (denormalizasyon) gerekebilir.
32 |
33 | * Örneğin yüksek hız için veri fazlalığı göze alınarak zaman zaman denormalizasyon yapılabilir.
34 |
35 | * Normalizasyonun en temel faydası, **veri tekrarını** en aza indirerek veri düzensizliklerinin (data anomaly) önüne geçmemize yardımcı olmasıdır.
36 |
37 | ## Veri Tekrarının Zararları
38 |
39 | > Veri tekrarı tablo içerisine başka tablonun gömüldüğü anlamına gelir.
40 |
41 | 
42 |
43 |
44 | * Veri tekrarında aynı bilgi defalarca kaydedilir.
45 |
46 | * Veri tekrarı, kaynak kullanımında israfa yol açar.
47 |
48 | * Veri tekrarı, veri tutarsızlıklarına (düzensizliklerine) neden olabilir.
49 | + Veri girişinde tutarsızlık
50 | + Veri güncellenmesinde tutarsızlık
51 | + Veri silmede tutarsızlık
52 |
53 |
54 | ### Veri Girişinde Tutarsızlık
55 |
56 | * Veri tekrarı olan tablolara yeni kayıt eklenirken tutarsızlıklar oluşabilir.
57 |
58 | > Tabloya yeni kayıt eklenirken birimAdi ve elemanSayisi sütunlarında tutarsızlık oluşmuştur.
59 |
60 | 
61 |
62 |
63 | * Veri tekrarı olan tablolara birincil anahtar değerinin tekrar etmesi durumunda yeni kayıt eklenemeyebilir.
64 |
65 | > Tabloda, personelNo alanına değer yazılamaz ve 3 nolu birim eklenemez.
66 |
67 | 
68 |
69 |
70 | ### Veri Güncellenmesinde Tutarsızlık
71 |
72 | * Veri güncellenirken birçok noktada değişiklik yapmak gerekir ve bu durumda tutarsızlıklar oluşabilir.
73 |
74 | > Tabloda elemanSayısı güncellenirken tutarsızlık oluşmuştur.
75 |
76 | 
77 |
78 |
79 | ### Veri Silmede Tutarsızlık
80 |
81 | * Veriler silinirken başka veriler de kaybedilebilir.
82 |
83 | > Tabloda 1 numaralı birimin elemanları silindiğinde ilgili birimin bilgileri de kaybedilir.
84 |
85 | 
86 |
87 |
88 | ### İyileştirilmiş Tasarım
89 |
90 | 
91 |
92 | 
93 |
94 | ## Birinci Normal Form (1NF)
95 |
96 | * Bir tablonun birinci normal formda (1NF) olması için aşağıdaki şartlar sağlanmalıdır.
97 |
98 | + Tüm alanlar birincil anahtar tarafından belirlenebilmelidir.
99 |
100 | + Tüm alanlar tek değerli olmalıdır.
101 |
102 | * Aşağıdaki tablo birinci normal formda (1NF) değildir.
103 |
104 | + Çünkü ePosta sütunu tek değerli değildir.
105 |
106 | + Normalizasyon yapmalıyız.
107 |
108 | 
109 |
110 |
111 | ### Normalizasyon Sonucu
112 |
113 | 
114 |
115 |
116 | ## Tekrarlanan Veri Grupları
117 |
118 | * Aşağıdaki tablo birinci normal formdadır.
119 |
120 | + Tabloda birincil anahtar var.
121 |
122 | + Her sütunda tek değer var.
123 |
124 | * Buna rağmen veri tekrarı vardır.
125 |
126 | 
127 |
128 |
129 | * Tablodaki tutarsızlık aşağıda gösterilmiştir.
130 |
131 | 
132 |
133 |
134 |
135 | ## İkinci Normal Form (2NF)
136 |
137 |
138 | ### Fonksiyonel Bağımlılık
139 |
140 | * Kayıtların ayırt edilebilmesi, tablolar arasında ilişki kurulabilmesini sağlar.
141 | * Anahtarlar belirlenirken fonksiyonel bağımlılık göz önüne alınmalıdır.
142 |
143 | * Aşağıdaki tabloda, ogrenciNo niteliği kullanılarak adi alanı belirlenebilir. (**tersi doğru değildir**)
144 | * Bu durumda:
145 | + **ogrenciNo** alanı **adi** alanını **belirler**.
146 | + **adi** alanı, **ogrenciNo** alanına **fonksiyonel bağımlıdır ( ogrenciNo ➔ ogrenciAdi)**.
147 |
148 | 
149 |
150 |
151 | ### Tam Fonksiyonel Bağımlılık
152 |
153 | * Nitelikler birden fazla alanın birleşimine fonksiyonel bağımlı olabilir.
154 | + ogrenciNo, dersNo ➔ ortalama **Tam fonksiyonel bağımlılık**
155 | + ogrenciNo, dersNo ➔ dersAdi **Kısmi fonksiyonel bağımlılık**
156 |
157 |
158 | ### İkinci Normal Form Şartları
159 |
160 | * Tablonun birinci normal formda olması gerekir.
161 | * Birincil anahtar, birden fazla alanın birleşiminden oluşuyorsa, tablonun 2NF’de olabilmesi için diğer alanların birincil anahtara **tam fonksiyonel bağımlı** olması gerekir.
162 | * Birincil anahtar tek alandan oluşuyorsa ve tablo 1NF’de ise, 2NF de sağlanmış olur.
163 |
164 |
165 | ### Örnek
166 |
167 | * Birincil anahtar ogrenciNo ve dersNo alanlarından oluşan bileşik birincil anahtardır.
168 | * not alanı birincil anahtara **tam fonksiyonel bağımlıdır**.
169 | * dersAdi ve kredi alanları birincil anahtara **kısmi fonksiyonel bağımlıdır** ve bu nedenle tablo ikinci normal formda (2NF) değildir. Veri tekrarı meydana gelmiştir.
170 |
171 | 
172 |
173 |
174 | ### Tabloyu 2NF'ye Dönüştürme (Kısmi Bağımlılıkların Giderilmesi)
175 |
176 | 
177 |
178 |
179 |
180 | ## Üçüncü Normal Form (3NF)
181 |
182 |
183 | ### Geçişken Bağımlılık
184 |
185 | * Eğer A ➔ B ve B ➔ C ise A ➔ B ➔ C
186 | + A, B üzerinden C’yi belirler.
187 | + C, A ya geçişken bağımlıdır.
188 |
189 | * Aşağıdaki tabloda geçişken bağımlılık vardır.
190 | + oduncNo ➔ ISBNNo ➔ kitapAdi
191 | + oduncNo ➔ ISBNNo ➔ yayinYili
192 | + oduncNo alanı, ISBNNo alanı üzerinden kitapAdi alanını belirler.
193 | + kitapAdi alanı, oduncNo alanına geçişken bağımlıdır.
194 |
195 | 
196 |
197 | 
198 |
199 |
200 | ### Üçüncü Normal Form Şartları
201 |
202 | * Tablo 2NF’de ise ve geçişken bağımlılık yok ise 3NF’dedir.
203 |
204 |
205 | ### Tabloyu 3NF’ye Dönüştürme
206 |
207 | 
208 |
209 |
210 | ### Özet
211 |
212 | * 1NF: Birincil anahtar mevcuttur ve çok değerli alanlar yoktur.
213 | * 2NF: Birinci normal formdadır ve kısmi bağımlılık yoktur.
214 | * 3NF: İkinci normal formdadır ve geçişken bağımlılık yoktur.
215 |
216 |
217 | ### Örnek 1
218 |
219 | * Tablodaki veri tekrarının nedenini ve nasıl düzeltilebileceğini açıklayınız.
220 |
221 | 
222 |
223 |
224 | ### Örnek 2
225 |
226 | * Tablodaki veri tekrarının nedenini ve nasıl düzeltilebilceğini açıklayınız.
227 |
228 | 
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
--------------------------------------------------------------------------------
/VYS12_2.md:
--------------------------------------------------------------------------------
1 | BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
2 |
3 |
4 | # Başarım Eniyileme (Performance Optimization)
5 |
6 |
7 | * Örnekler İçin Pagila Veritabanı Kullanılmaktadır.
8 |
9 |
10 | ## EXPLAIN ANALYSE
11 |
12 | * EXPLAIN ANALYSE ifadesi ile SQL sorgularının başarımına ilişkin detaylı bilgi edinilir. Sorgunun nasıl çalıştırılacağını açıklayan sorgu planı döndürülür.
13 | * EXPLAIN ile pg_statistic katalog tablosuna dayalı olarak, başarımla ilgili tahmini değerler döndürülür (cost=0.00..16.49 rows=1 width=70).
14 | * İlgili tablo veya tabloların içeriğine dair istatistikler (kolon içerisinde en çok bulunan değer ve histogramı, distinct değerler, byte olarak ortalama genişlik, ortalama değer, null olanların sayısı, satır sayısı, vb.) "pg_statistic" içerisinde saklanır. Bu değerler "ANALYZE" işlemiyle güncellenebilir ve büyük tablolarda örnekleme yapılarak oluşturulabilir.
15 | * (cost=0.00..16.49 rows=1 width=70) örneğindeki değerlerin anlamları:
16 | * 0.00 : ilk satırın getirilme maliyeti (birimi "page cost": tek bir sayfanın getirilme maliyeti(zaman ve kaynak kullanımıyla ilgili))
17 | * 16.49 : tüm satırların getirilme maliyeti (birimi "page cost")
18 | * rows: getirilecek satır sayısı
19 | * width: bir satırın byte cinsinde ortalama genişliği
20 |
21 | * ANLYZE ile birlikte sorgu gerçekten çalıştırılarak gerçek değerler döndürülür (actual time=0.115..0.181 rows=1 loops=1). (INSERT, UPDATE, DELETE vb. işlemler için dikkatli kullanılmalıdır.)
22 | * (actual time=0.115..0.181 rows=1 loops=1) örneğindeki değerlerin anlamları:
23 | * 0.115 ms : ilk satırın getirilmesi için geçen zaman
24 | * 0.181 ms : tüm satırların getirilmesi için geçen zaman
25 | * rows: getirilen satır sayısı
26 | * loops: döngü sayısı Toplam zaman= 0.181x1
27 |
28 | ~~~sql
29 | EXPLAIN ANALYSE
30 | SELECT * FROM "customer";
31 | -------------------------------
32 | Seq Scan on customer (cost=0.00..14.99 rows=599 width=70) (actual time=0.009..0.087 rows=599 loops=1)
33 | Planning Time: 0.092 ms // uygun planı seçme zamanı
34 | Execution Time: 0.139 ms // Seçilen planın çalıştırılma zamanı. Actual Time içerisine oturum açma/kapatma zamanı eklenerek bulunur
35 | ~~~
36 |
37 | ~~~sql
38 | EXPLAIN ANALYSE
39 | SELECT * FROM "customer"
40 | WHERE "first_name" = 'Bruce';
41 | -------------------------------
42 | Seq Scan on customer (cost=0.00..16.49 rows=1 width=70) (actual time=0.115..0.181 rows=1 loops=1)
43 | Filter: ((first_name)::text = 'Bruce'::text)
44 | Rows Removed by Filter: 598
45 | Planning Time: 0.110 ms
46 | Execution Time: 0.202 ms
47 | ~~~
48 |
49 | ~~~sql
50 | EXPLAIN ANALYSE
51 | SELECT * FROM "customer"
52 | WHERE "last_name" = 'Lee';
53 | -------------------------------
54 | Index Scan using idx_last_name on customer (cost=0.28..8.29 rows=1 width=70) (actual time=0.035..0.037 rows=1 loops=1)
55 | Index Cond: ((last_name)::text = 'Lee'::text)
56 | Planning Time: 0.127 ms
57 | Execution Time: 0.062 ms
58 |
59 | ~~~
60 |
61 | ~~~sql
62 | EXPLAIN ANALYSE
63 | SELECT "public"."customer"."customer_id",
64 | "public"."customer"."first_name",
65 | "public"."customer"."last_name",
66 | "public"."address"."phone"
67 | FROM "customer"
68 | INNER JOIN "address" ON "customer"."address_id" = "address"."address_id"
69 | -------------------------------
70 | Hash Join (cost=21.57..38.14 rows=599 width=29) (actual time=0.510..0.972 rows=599 loops=1)
71 | Hash Cond: (customer.address_id = address.address_id)
72 | -> Seq Scan on customer (cost=0.00..14.99 rows=599 width=19) (actual time=0.009..0.097 rows=599 loops=1)
73 | -> Hash (cost=14.03..14.03 rows=603 width=16) (actual time=0.485..0.485 rows=603 loops=1)
74 | Buckets: 1024 Batches: 1 Memory Usage: 39kB
75 | -> Seq Scan on address (cost=0.00..14.03 rows=603 width=16) (actual time=0.011..0.237 rows=603 loops=1)
76 | Planning Time: 0.642 ms
77 | Execution Time: 1.052 ms
78 |
79 | ~~~
80 |
81 |
82 |
83 | ## PROJEKSİYON
84 |
85 |
86 | * SELECT ifadesinde bütün alanlara projeksiyon yapmak (* kullanımı) yerine yalnızca gerekli olan alanlara projeksiyon yapmalıyız. Yani yalnızca gerekli alanların getirilmesini istemeliyiz. Böylece, işlem gecikmesi, iletim gecikmesi ve kaynak kullanımı azaltılmış olur.
87 |
88 | ~~~sql
89 | EXPLAIN ANALYSE
90 | SELECT *
91 | FROM "customer"
92 | INNER JOIN "store" ON "customer"."store_id" = "store"."store_id"
93 | INNER JOIN "rental" ON "rental"."customer_id" = "customer"."customer_id"
94 | INNER JOIN "inventory" ON "inventory"."store_id" = "store"."store_id"
95 | INNER JOIN "film" ON "inventory"."film_id" = "film"."film_id";
96 | ~~~
97 |
98 | + Execution time: 10968.823 ms
99 |
100 | ~~~sql
101 | EXPLAIN ANALYSE
102 | SELECT "customer"."first_name", "customer"."last_name",
103 | "film"."film_id", "film"."title"
104 | FROM "customer"
105 | INNER JOIN "store" ON "customer"."store_id" = "store"."store_id"
106 | INNER JOIN "rental" ON "rental"."customer_id" = "customer"."customer_id"
107 | INNER JOIN "inventory" ON "inventory"."store_id" = "store"."store_id"
108 | INNER JOIN "film" ON "inventory"."film_id" = "film"."film_id";
109 | ~~~
110 |
111 | + Execution time: 6220.990 ms
112 |
113 |
114 |
115 |
116 | ## LIMIT ve OFFSET
117 |
118 | ~~~sql
119 | EXPLAIN ANALYSE
120 | SELECT "store"."store_id", "film"."title"
121 | FROM "inventory"
122 | INNER JOIN "film" ON "inventory"."film_id" = "film"."film_id"
123 | INNER JOIN "store" ON "inventory"."store_id" = "store"."store_id";
124 | ~~~
125 |
126 | + Execution time: 4.450 ms
127 |
128 |
129 |
130 | * İlk 40 dan sonraki 20 kayıt getirilsin.
131 |
132 | ~~~sql
133 | EXPLAIN ANALYSE
134 | SELECT "store"."store_id", "film"."title"
135 | FROM "inventory"
136 | INNER JOIN "film" ON "inventory"."film_id" = "film"."film_id"
137 | INNER JOIN "store" ON "inventory"."store_id" = "store"."store_id"
138 | LIMIT 20 OFFSET 40;
139 | ~~~
140 |
141 | + Execution time: 0.315 ms
142 |
143 |
144 | ~~~sql
145 | EXPLAIN ANALYSE
146 | SELECT "customer_id", "first_name", "last_name"
147 | FROM "customer" ORDER BY "customer_id" DESC;
148 | ~~~
149 |
150 | * Son 20 den sonraki 10 getirilsin
151 |
152 | ~~~sql
153 | EXPLAIN ANALYSE
154 | SELECT "customer_id", "first_name", "last_name"
155 | FROM "customer" ORDER BY "customer_id" DESC
156 | LIMIT 10 OFFSET 20;
157 | ~~~
158 |
159 |
160 |
161 | ## SIRALAMA
162 |
163 |
164 | * Gereksiz sıralama başarımı düşürür.
165 |
166 | ~~~sql
167 | EXPLAIN ANALYSE
168 | SELECT "store"."store_id", "film"."title"
169 | FROM "inventory"
170 | INNER JOIN "film" ON "inventory"."film_id" = "film"."film_id"
171 | INNER JOIN "store" ON "inventory"."store_id" = "store"."store_id";
172 | ~~~
173 |
174 | + Execution time: 4.968 ms
175 |
176 |
177 | ~~~sql
178 | EXPLAIN ANALYSE
179 | SELECT "store"."store_id", "film"."title"
180 | FROM "inventory"
181 | INNER JOIN "film" ON "inventory"."film_id" = "film"."film_id"
182 | INNER JOIN "store" ON "inventory"."store_id" = "store"."store_id"
183 | ORDER BY "film"."title";
184 | ~~~
185 |
186 | + Execution time: 7.411 ms
187 |
188 |
189 |
190 | ## INDEX
191 |
192 |
193 | * Index olarak belirlenmiş alanlar üzerinde arama işlemi daha hızlı gerçekleştirilir.
194 |
195 |
196 | * Aşağıdaki sorgularda “customer” tablosunun “last_name” alanı için index tanımlanmıştır.
197 |
198 | ~~~sql
199 | EXPLAIN ANALYSE
200 | SELECT * FROM "customer"
201 | WHERE "first_name" = 'Jeniffer';
202 | ~~~
203 |
204 | + Execution time: 0.132 ms
205 |
206 | ~~~sql
207 | EXPLAIN ANALYSE
208 | SELECT * FROM "customer"
209 | WHERE "last_name" = 'Davis';
210 | ~~~
211 |
212 | + Execution time: 0.036 ms
213 |
214 |
215 |
216 |
217 | * Örnek Ek Veritabanı
218 |
219 | ~~~sql
220 | CREATE DATABASE "TestVeritabani"
221 | ENCODING='UTF-8'
222 | LC_COLLATE='tr_TR.UTF-8'
223 | LC_CTYPE='tr_TR.UTF-8'
224 | OWNER postgres
225 | TEMPLATE=template0;
226 | ~~~
227 |
228 | * Windows işletim sistemi için
229 |
230 | ~~~sql
231 | CREATE DATABASE "TestVeritabani"
232 | ENCODING='UTF-8'
233 | LC_COLLATE='Turkish_Turkey.1254'
234 | LC_CTYPE='Turkish_Turkey.1254'
235 | OWNER postgres
236 | TEMPLATE=template0;
237 | ~~~
238 |
239 | ~~~sql
240 | CREATE TABLE "Kisiler" (
241 | "kisiNo" SERIAL,
242 | "adi" VARCHAR(40) NOT NULL,
243 | "soyadi" VARCHAR(40) NOT NULL,
244 | "kayitTarihi" TIMESTAMP DEFAULT '2019-01-01 01:00:00',
245 | CONSTRAINT "urunlerPK1" PRIMARY KEY("kisiNo")
246 | );
247 | ~~~
248 |
249 | ~~~sql
250 | CREATE OR REPLACE FUNCTION "veriGir"(kayitSayisi integer)
251 | RETURNS VOID
252 | AS
253 | $$
254 | BEGIN
255 | IF kayitSayisi > 0 THEN
256 | FOR i IN 1 .. kayitSayisi LOOP
257 | insert into "Kisiler" ("adi","soyadi", "kayitTarihi")
258 | Values(
259 | substring('ABCÇDEFGĞHIiJKLMNOÖPRSŞTUÜVYZ' from ceil(random()*10)::smallint for ceil(random()*20)::SMALLINT),
260 | substring('ABCÇDEFGĞHIiJKLMNOÖPRSŞTUÜVYZ' from ceil(random()*10)::smallint for ceil(random()*20)::SMALLINT),
261 | NOW() + (random() * (NOW()+'365 days' - NOW()))
262 | );
263 | END LOOP;
264 | END IF;
265 | END;
266 | $$
267 | LANGUAGE 'plpgsql' SECURITY DEFINER;
268 | ~~~
269 |
270 | ~~~sql
271 | SELECT "veriGir"(100000);
272 | ~~~
273 |
274 | ~~~sql
275 | EXPLAIN ANALYZE
276 | SELECT * FROM "Kisiler"
277 | WHERE "adi"='DENEME' -- Satırlardan birinin adi alanı "DENEME" olarak değiştirilmeli
278 | ----------------------------------------
279 | Seq Scan on "Kisiler" (cost=0.00..2107.00 rows=496 width=38) (actual time=20.214..20.215 rows=1 loops=1)
280 | Filter: ((adi)::text = 'DENEME'::text)
281 | Rows Removed by Filter: 99999
282 | Planning Time: 0.085 ms
283 | Execution Time: 20.237 ms
284 | ~~~
285 |
286 | + Execution time: 20.237 ms
287 |
288 | ~~~sql
289 | CREATE INDEX "adiINDEX" ON "public"."Kisiler" USING btree( "adi" Asc NULLS Last );
290 | ~~~
291 |
292 | ~~~sql
293 | EXPLAIN ANALYZE
294 | SELECT * FROM "Kisiler"
295 | WHERE "adi"='DENEME' -- Satırlardan birinin adi alanı "DENEME" olarak değiştirilmeli
296 | ----------------------------------------
297 | Bitmap Heap Scan on "Kisiler" (cost=12.26..784.32 rows=496 width=38) (actual time=0.052..0.053 rows=1 loops=1)
298 | Recheck Cond: ((adi)::text = 'DENEME'::text)
299 | Heap Blocks: exact=1
300 | -> Bitmap Index Scan on "adiINDEX" (cost=0.00..12.14 rows=496 width=0) (actual time=0.045..0.046 rows=1 loops=1)
301 | Index Cond: ((adi)::text = 'DENEME'::text)
302 | Planning Time: 0.123 ms
303 | Execution Time: 0.083 ms
304 | ~~~
305 |
306 | + Execution time: 0.083 ms
307 |
308 | ~~~sql
309 | EXPLAIN ANALYZE
310 | SELECT * FROM "Kisiler"
311 | WHERE "adi"!='DENEME' -- Satırlardan birinin adi alanı "DENEME" olarak değiştirilmeli
312 | -- Sorgu sonucu getirilecek satır çok fazla ise, sonuçlar indeks tablosu kullanılmadan doğrudan veri tablosundan getirilir.
313 | ----------------------------------------
314 | Seq Scan on "Kisiler" (cost=0.00..2107.00 rows=99504 width=38) (actual time=0.019..26.304 rows=99999 loops=1)
315 | Filter: ((adi)::text <> 'DENEME'::text)
316 | Rows Removed by Filter: 1
317 | Planning Time: 0.088 ms
318 | Execution Time: 32.305 ms
319 | ~~~
320 |
321 | + Execution time: 32.305 ms
322 |
323 |
324 |
325 | ## Birleşim (INNER JOIN), IN ve EXIST (İlintili Sorgu)
326 |
327 |
328 | * İlintili sorgu, özellikle EXIST ifadesi ile birlikte, daha iyi sonuç verebilir.
329 |
330 | ~~~sql
331 | EXPLAIN ANALYZE
332 | SELECT DISTINCT "customer"."first_name", "customer"."last_name"
333 | FROM "customer"
334 | INNER JOIN "payment"
335 | ON "payment"."customer_id" = "customer"."customer_id";
336 | ~~~
337 |
338 | + Execution time: 18.817 ms
339 |
340 |
341 | ~~~sql
342 | EXPLAIN ANALYZE
343 | SELECT "customer"."first_name", "customer"."last_name"
344 | FROM "customer"
345 | WHERE "customer_id" IN (SELECT "customer_id" FROM "payment");
346 | ~~~
347 |
348 | + Execution time: 3.980 ms
349 |
350 | ~~~sql
351 | EXPLAIN ANALYSE
352 | SELECT "customer"."first_name", "customer"."last_name"
353 | FROM "customer"
354 | WHERE EXISTS
355 | (SELECT "customer_id" FROM "payment"
356 | WHERE "customer"."customer_id" = "payment"."customer_id");
357 | ~~~
358 |
359 | + Execution time: 3.683 ms
360 |
361 |
362 |
363 | ## HAVING
364 |
365 |
366 | * HAVING ifadesi seçim işlemi yapılıp gruplandırma işlemi tamamlandıktan sonra filtreleme yapmak için kullanılır. Filtreyi, mümkünse gruplama işleminden önce eklemek başarımı artırır.
367 |
368 | ~~~sql
369 | EXPLAIN ANALYSE
370 | SELECT "category"."name", COUNT("film"."film_id")
371 | FROM "film"
372 | LEFT OUTER JOIN "film_category" ON "film"."film_id" = "film_category"."film_id"
373 | LEFT OUTER JOIN "category" ON "film_category"."category_id" = "category"."category_id"
374 | GROUP BY "category"."name"
375 | HAVING "category"."name" = 'Horror' OR "category"."name" = 'Comedy';
376 | ~~~
377 |
378 | + Execution time: 0.922 ms
379 |
380 | ~~~sql
381 | EXPLAIN ANALYSE
382 | SELECT "category"."name", COUNT("film"."film_id")
383 | FROM "film"
384 | LEFT OUTER JOIN "film_category" ON "film"."film_id" = "film_category"."film_id"
385 | LEFT OUTER JOIN "category" ON "film_category"."category_id" = "category"."category_id"
386 | WHERE "category"."name" = 'Horror' OR "category"."name" = 'Comedy'
387 | GROUP BY "category"."name";
388 | ~~~
389 |
390 | + Execution time: 0.898 ms
391 |
392 |
393 |
394 |
395 | ## Alt Sorgu Sayısı
396 |
397 |
398 | * Bazen ana sorguda birden fazla alt sorgu bulunabilir. Bu durumda alt sorgu bloklarının sayısını azaltmaya çalışmalıyız.
399 |
400 | * Bu bölüm NorthWind veritabanı kullanmaktadır.
401 |
402 | ~~~sql
403 | EXPLAIN ANALYSE
404 | SELECT * FROM "products"
405 | WHERE "UnitPrice" < (SELECT AVG("UnitPrice") FROM "products")
406 | AND "UnitsInStock" < (SELECT AVG("UnitsInStock") FROM "products");
407 | ~~~
408 |
409 | + 22:12:27 Query time: 2 millisecond(s), Number of cursor's records: 11
410 |
411 | ~~~sql
412 | EXPLAIN ANALYSE
413 | SELECT * FROM "products"
414 | WHERE ("UnitPrice", "UnitsInStock") <
415 | (SELECT AVG("UnitPrice"), AVG("UnitsInStock") FROM "products");
416 | ~~~
417 | + 22:12:32 Query time: 1 millisecond(s), Number of cursor's records: 8
418 |
419 |
420 |
421 |
422 | ## UNION ve UNION ALL
423 |
424 |
425 | * UNION yerine UNION ALL komutunu kullanmaya çalışmalıyız. UNION komutu icra edilirken DISTINCT işlemi de gerçekleştirildiği için daha yavaştır.
426 |
427 | ~~~sql
428 | EXPLAIN ANALYSE
429 | SELECT "rental_id" FROM "rental"
430 | UNION
431 | SELECT "rental_id" FROM "payment";
432 | ~~~
433 |
434 | + Execution time: 20.382 ms
435 |
436 | ~~~sql
437 | EXPLAIN ANALYSE
438 | SELECT "rental_id" FROM "rental"
439 | UNION ALL
440 | SELECT "rental_id" FROM "payment";
441 | ~~~
442 |
443 | + Execution time: 10.742 ms
444 |
445 |
446 |
447 | ## WHERE
448 |
449 |
450 | * WHERE koşul ifadeleri yazarken dikkat etmemiz gereken hususlar.
451 |
452 | ~~~sql
453 | EXPLAIN ANALYSE
454 | SELECT * FROM "film" WHERE SUBSTR("title", 2, 2) = 'la';
455 | ~~~
456 |
457 | + 22:44:30 Query time: 2 millisecond(s), Number of affected records: 15
458 |
459 | ~~~sql
460 | EXPLAIN ANALYSE
461 | SELECT * FROM "film" WHERE "title" LIKE '_la%';
462 | ~~~
463 |
464 | + 22:44:25 Query time: 1 millisecond(s), Number of affected records: 15
465 |
466 |
467 |
468 | ## Genel Kurallar
469 |
470 |
471 | * Belirli boyutu aşan ikili nesneleri (resim, pdf vb.) depolamak için, ilk olarak onları dosyalama sistemine yerleştiriniz ve sonrasında veritabanına dosyanın konumunu ekleyiniz.
472 |
473 | * SQL standart kurallarını takip ediniz.
474 |
475 |
476 |
477 |
478 | ## VACUUM ve ANALYSE
479 |
480 |
481 | * PostgreSQL’de bir kayıt silindiği zaman aslında gerçekten silinmez.
482 |
483 | * Yalnızca silindiğine ilişkin bir işaret olur. Dolayısıyla belirli bir süre sonra depolama alanı problemi oluşabilir. Silinen kayıtların gerçekten tablodan silinmesini gerçekleştirmek için VACUUM komutu kullanılır. Bu yapıldığında depolama alanımızda yer açılacaktır.
484 |
485 | * ANALYSE işlemi sonucu, ilgili tablo veya tabloların içeriğine dair istatistikler (kolon içerisinde en çok bulunan değer ve histogramı, byte olarak ortalama genişlik, ortalama değer, null olanların sayısı vb.) "pg_statistic" sistem katalogunda güncellenmiş olarak saklanır. Daha sonra bu bilgi, sorgu planlayıcısının (query planner) sorguları en etkin şekilde nasıl çalıştıracağının belirlenmesi işleminde kullanılır.
486 |
487 | * VACUUM ve ANALYSE işlemini, veritabanı kullanımının az olduğu zamanlarda, günde bir kez uygulamak sorgu hızını artırır.
488 |
489 |
490 | ### VACUUM
491 |
492 | * Seçili veritabanındaki tüm tablolara vacuum işlemi uygula.
493 |
494 | ~~~sql
495 | VACUUM;
496 | ~~~
497 |
498 | * Seçili veri tabanındaki tüm tablolara vacuum full işlemi uygula.
499 | * Bu işlem daha uzun sürer. Tabloları kilitleyerek yeni bir kopyasını oluşturur ve daha sonra eski tabloyu siler.
500 |
501 | ~~~sql
502 | VACUUM FULL;
503 | ~~~
504 |
505 | * customer tablosuna vacuum işlemi uygula.
506 |
507 | ~~~sql
508 | VACUUM "customer";
509 | ~~~
510 |
511 |
512 | ### AUTOVACUUM Ayarı
513 |
514 | * Eşik (threshold) değeri 5000 kayıt olsun. Bu eşik değerinin üzerine "eşik değeri * ölçek faktörü" de eklendikten sonra ulaşılan kayıt sayısı kadar güncelleme veya silme işlemi yapıldıktan sonra VACUUM işlemi başlatılır. Bu ayar postgresql.conf dosyasında da belirtilebilir.
515 |
516 | * Varsayılan eşik değeri 50 kayıttır.
517 |
518 | ~~~sql
519 | ALTER TABLE table_name
520 | SET (autovacuum_vacuum_threshold = 5000);
521 | ~~~
522 |
523 | * Eşik değerini %40 aştıktan sonra otomatik vakum işlemi yap. Bu ayar postgresql.conf dosyasında da belirtilebilir.
524 | * Varsayılan ölçek faktörü (scale factor) 0.2'dir.
525 |
526 | ~~~sql
527 | ALTER TABLE table_name
528 | SET (autovacuum_vacuum_scale_factor = 0.4);
529 | ~~~
530 |
531 |
532 | ### ANALYSE
533 |
534 | * Seçili veritabanındaki tüm tablolara ANALYSE işlemi uygula.
535 |
536 | ~~~sql
537 | ANALYSE;
538 | ~~~
539 |
540 | * "payment" tablosuna ANALYSE işlemi uygula.
541 |
542 | ~~~sql
543 | ANALYSE "payment";
544 | ~~~
545 |
546 |
547 | ~~~sql
548 | SELECT * FROM "pg_statistic";
549 | ~~~
550 |
551 | ~~~sql
552 | SELECT "relname", "last_vacuum", "last_autovacuum", "last_analyze", "last_autoanalyze"
553 | FROM "pg_stat_all_tables"
554 | WHERE "schemaname" = 'public';
555 | ~~~
556 |
--------------------------------------------------------------------------------
/VYS14.md:
--------------------------------------------------------------------------------
1 | BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
2 |
3 | # Veritabanı Güvenliği, Yetkilendirme
4 |
5 |
6 | ## psql Kullanımı
7 | psql, postgresql sunucuya bağlanıp işlemler yapmamızı sağlayan konsol uygulamasıdır.
8 |
9 |
10 |
11 | ### psql Uygulamasını Çalıştırma
12 | ~~~
13 | psql -U postgres -h localhost
14 |
15 | psql -U ayse -d pagila -h localhost
16 | ~~~
17 |
18 | ~~~
19 | psql -U postgres
20 |
21 | VTYS_Comp:~ vtys$ psql -U postgres
22 | Password for user postgres:
23 | psql (9.5.4)
24 | Type "help" for help.
25 |
26 | postgres=#
27 | ~~~
28 |
29 |
30 | ### psql ile veritabanlarını görüntüleme
31 | ~~~
32 | postgres=# \l
33 | List of databases
34 | Name | Owner | Encoding | Collate | Ctype | Access privileges
35 | ----------------------+----------+----------+-------------+-------------+-----------------------
36 | AlisVerisUygulamasi | postgres | UTF8 | tr_TR.UTF-8 | tr_TR.UTF-8 |
37 | Musteri | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
38 | Northwind | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
39 | OgrenciBilgiSistemi | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
40 |
41 | ~~~
42 |
43 | ### psql ile veritabanına bağlanma
44 | ~~~
45 | postgres=# \c Northwind
46 | psql (10.3, server 12.1)
47 | WARNING: psql major version 10, server major version 12.
48 | Some psql features might not work.
49 | You are now connected to database "Northwind" as user "postgres".
50 | ~~~
51 |
52 | ### psql ile tabloları görüntüleme
53 | ~~~
54 | Northwind=# \d+
55 | List of relations
56 | Schema | Name | Type | Owner | Size | Description
57 | --------+---------------------------------+----------+----------+------------+-------------
58 | public | CustomersContactName | table | postgres | 16 kB |
59 | public | Musteriler | table | postgres | 0 bytes |
60 | public | Musteriler_musteriNo_seq | sequence | postgres | 8192 bytes |
61 | public | OrderCustomerEmployee | view | postgres | 0 bytes |
62 | public | OrderCustomerEmployee1 | view | postgres | 0 bytes |
63 | public | OrderCustomerEmployee3 | view | postgres | 0 bytes |
64 | public | OrderCustomerEmployee4 | view | postgres | 0 bytes |
65 | public | SiparisMusteriSatisTemsilcisi | view | postgres | 0 bytes |
66 | public | UrunDegisikligiIzle | table | postgres | 8192 bytes |
67 | public | UrunDegisikligiIzle_kayitNo_seq | sequence | postgres | 8192 bytes |
68 | public | categories | table | postgres | 16 kB |
69 | public | customercustomerdemo | table | postgres | 8192 bytes |
70 | public | customerdemographics | table | postgres | 8192 bytes |
71 | public | customers | table | postgres | 56 kB |
72 | public | employees | table | postgres | 16 kB |
73 | public | employeeterritories | table | postgres | 8192 bytes |
74 | public | order_details | table | postgres | 120 kB |
75 | public | orders | table | postgres | 144 kB |
76 | public | products | table | postgres | 8192 bytes |
77 |
78 | ~~~
79 |
80 | ### psql ile sql sorgusu çalıştırma
81 | ~~~
82 | Northwind=# select "ProductID", "ProductName" from products;
83 | ProductID | ProductName
84 | -----------+----------------------------------
85 | 5 | Chef Anton's Gumbo Mix
86 | 7 | Uncle Bob's Organic Dried Pears
87 | 12 | Queso Manchego La Pastora
88 | 13 | Konbu
89 | ~~~
90 |
91 | ### psql - Kullanıcıları/Rolleri Listeleme
92 |
93 | ~~~
94 | postgres=# \du
95 | List of roles
96 |
97 | Role name | Attributes | Member of
98 |
99 | -----------+------------------------------------------------------------+-----------
100 |
101 | postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
102 |
103 | testk1 | | {}
104 |
105 | ~~~
106 |
107 | ### psql Çıkış Örneği
108 | ~~~
109 | postgres=# \q
110 | postgres=#
111 | VTYS_Comp:~ vtys$
112 | ~~~
113 |
114 | ## Yetki/Yetkilendirme
115 |
116 | * Nesnelerle ilgili sahip olunan haklara yetki denir.
117 | * Kullanıcıların/rollerin, veritabanı yönetim sistemi ve veritabanı nesneleri (tablo, görünüm, fonksiyon vb.) üzerinde hangi haklara sahip olacağının belirlenmesine yetkilendirme adı verilir.
118 | * İki tür yetki vardır:
119 | + Temel yetkiler (rol özellikleri)
120 | + Nesne yetkileri
121 |
122 |
123 | ### Temel Yetkiler (Rol Özellikleri)
124 |
125 | * Kullanıcıların/rollerin veritabanı yönetim sistemi üzerindeki haklarını ifade eder.
126 |
127 | + SUPERUSER, CREATEDB, CREATEROLE, CREATEUSER, INHERIT, LOGIN, REPLICATION, BYPASSRLS, NOSUPERUSER, NOCREATEDB, NOCREATEROLE, NOCREATEUSER, NOINHERIT, NOLOGIN, NOREPLICATION, NOBYPASSRLS
128 |
129 |
130 | ### Nesne Yetkileri
131 |
132 | * Kullanıcıların/rollerin veritabanı nesneleri (tablo, görünüm, fonksiyon vb.) üzerindeki haklarını ifade eder.
133 | * Nesnelerin türüne göre (tablo, görünüm, fonksiyon) aşağıdaki yetkiler verilir.
134 | + SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER,
135 | + CREATE, CONNECT, TEMPORARY, EXECUTE, USAGE ...
136 |
137 |
138 |
139 | ## Kullanıcı/Rol Katalogları
140 |
141 | * Oturum yetkilendirmesini postgres rolü olarak ayarla (Bu işlemin yapılabilmesi için superuser yetkisi gereklidir).
142 | * Böylelikle işlemler, postgres rolünün yetkileriyle yapılabilecektir.
143 |
144 | ~~~sql
145 | SET SESSION AUTHORIZATION "postgres";
146 | ~~~
147 |
148 |
149 | * pg_authid ve pg_roles kataloğunu sorgula.
150 | * Bu kataloglarda roller hakkında bilgi mevcuttur.
151 |
152 | ~~~sql
153 | SELECT * FROM "pg_authid";
154 | ~~~
155 |
156 | ~~~sql
157 | SELECT * FROM "pg_roles";
158 | ~~~
159 |
160 | * pg_user kataloğunu sorgula.
161 |
162 | ~~~sql
163 | SELECT * FROM "pg_user";
164 | ~~~
165 |
166 |
167 |
168 | ## Kullanıcı/Rol Oluşturma/Değiştirme İşlemleri
169 |
170 |
171 | * Hiç bir yetkisi olmayan rol oluştur.
172 | * Rolün aynı zamanda şifesi de mevcut değildir.
173 |
174 | ~~~sql
175 | CREATE ROLE "rol1";
176 | ~~~
177 |
178 |
179 | * SUPERUSER yetkisi olan rol oluştur.
180 | * SUPERUSER, nesnelerle ilgili herseyi yapma yetkisine sahiptir.
181 |
182 | ~~~sql
183 | CREATE ROLE "rol2" WITH SUPERUSER;
184 | ~~~
185 |
186 | * Roller oluşturulduktan sonra düzenlenebilir.
187 |
188 | ~~~sql
189 | ALTER ROLE "rol1" WITH SUPERUSER CREATEDB;
190 | ~~~
191 | ~~~sql
192 | ALTER ROLE "rol1" WITH NOSUPERUSER;
193 | ~~~
194 |
195 | ~~~sql
196 | ALTER ROLE "rol1" WITH LOGIN;
197 | ~~~
198 | ~~~sql
199 | ALTER ROLE "rol1" WITH NOLOGIN;
200 | ~~~
201 |
202 |
203 | * abc şifresine sahip "kullanici1" adında bir kullanıcı oluştur.
204 | * abc şifresi MD5 algoritması ile kodlanır (Kullanılacak algoritma postgresql.conf içerisinde değiştirilebilir).
205 |
206 | ~~~sql
207 | CREATE USER "kullanici1" WITH PASSWORD 'abc';
208 | ~~~
209 |
210 |
211 |
212 | + CREATE USER, CREATE ROLE ifadesinin bir takma isimdir.
213 | + Aralarındaki fark LOGIN seçeneğidir.
214 |
215 | + CREATE USER ifadesi varsayılan olarak LOGIN yetkili rol oluşturur.
216 | + CREATE ROLE ifadesi varsayılan olarak LOGIN yetkisi olmayan rol oluşturur.
217 |
218 | + 8.1 ile birlikte user ve group kavramı yerine rol kavramı getirildi.
219 | + Bir rol, user olabilir, group olabilir veya ikisi birden olabilir.
220 |
221 | ~~~sql
222 | CREATE ROLE "rol3" WITH PASSWORD 'abc' LOGIN;
223 | ~~~
224 |
225 |
226 | + Şifre kodlanarak saklanır.
227 | + Şifrenin son geçerlilik tarihi de belirtilir.
228 |
229 | ~~~sql
230 | CREATE ROLE "kullanici4" WITH PASSWORD 'abc' VALID UNTIL '2020-01-01';
231 | ~~~
232 |
233 |
234 |
235 | ### psql - Kullanıcı/Rol Oluşturma/Değiştirme İşlemleri
236 |
237 | * Örnek
238 |
239 | ~~~
240 | postgres=# CREATE USER testk1 WITH PASSWORD '111111';
241 |
242 | CREATE ROLE
243 |
244 | postgres=#
245 |
246 | postgres=# \du
247 |
248 | List of roles
249 |
250 | Role name | Attributes | Member of
251 |
252 | -----------+------------------------------------------------------------+-----------
253 |
254 | postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
255 |
256 | testk1 | | {}
257 |
258 | postgres=#
259 |
260 | ~~~
261 |
262 | * Örnek
263 |
264 | + `CREATE USER` ifadesi, `CREATE ROLE` ifadesinin bir takma isimdir.
265 | + Aralarındaki fark `LOGIN` seçeneğidir.
266 | + https://www.postgresql.org/docs/current/sql-createrole.html
267 | ~~~
268 | postgres=# CREATE ROLE testk2 WITH PASSWORD '111111';
269 | CREATE ROLE
270 | postgres=# \du
271 | List of roles
272 | Role name | Attributes | Member of
273 | -----------+------------------------------------------------------------+-----------
274 | postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
275 | testk1 | | {}
276 | testk2 | Cannot login | {}
277 |
278 | postgres=#
279 | ~~~
280 |
281 |
282 | * Örnek
283 | ~~~
284 | postgres=# CREATE ROLE testk3 WITH PASSWORD '111111' LOGIN;
285 | CREATE ROLE
286 | postgres=# \du
287 | List of roles
288 | Role name | Attributes | Member of
289 | -----------+------------------------------------------------------------+-----------
290 | postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
291 | testk1 | | {}
292 | testk2 | Cannot login | {}
293 | testk3 | | {}
294 |
295 | postgres=#
296 | ~~~
297 |
298 |
299 | * Örnek
300 | ~~~
301 | postgres=# CREATE ROLE testk4 WITH PASSWORD '111111' LOGIN CREATEDB;
302 | CREATE ROLE
303 | postgres=# \du
304 | List of roles
305 | Role name | Attributes | Member of
306 | -----------+------------------------------------------------------------+-----------
307 | postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
308 | testk1 | | {}
309 | testk2 | Cannot login | {}
310 | testk3 | | {}
311 | testk4 | Create DB | {}
312 |
313 | postgres=#
314 | ~~~
315 |
316 |
317 | * Örnek
318 | ~~~
319 | postgres=# ALTER ROLE testk2 WITH LOGIN;
320 | ALTER ROLE
321 | postgres=# \du
322 | List of roles
323 | Role name | Attributes | Member of
324 | -----------+------------------------------------------------------------+-----------
325 | postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
326 | testk1 | | {}
327 | testk2 | | {}
328 | testk3 | | {}
329 | testk4 | Create DB | {}
330 |
331 | postgres=#
332 | ~~~
333 |
334 |
335 | * Örnek
336 | ~~~
337 | postgres=# DROP ROLE testk2;
338 | DROP ROLE
339 | postgres=# \du
340 | List of roles
341 | Role name | Attributes | Member of
342 | -----------+------------------------------------------------------------+-----------
343 | postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
344 | testk1 | | {}
345 | testk3 | | {}
346 | testk4 | Create DB | {}
347 |
348 | postgres=#
349 | ~~~
350 |
351 |
352 | ## Kullanıcı/Rol Silme İşlemleri
353 |
354 | ~~~sql
355 | DROP USER "kullanici1";
356 | ~~~
357 | ~~~sql
358 | DROP ROLE "rol1";
359 | ~~~
360 |
361 |
362 | * Nesne oluşturulurken, CREATE komutunu çalıştıran rol, bu nesnenin sahibi olarak belirlenir.
363 | * Nesne sahibi (ya da SUPERUSER) nesne üzerindeki tüm haklara sahiptir.
364 | * Veritabanı sahibi olan bir rolü silmeden önce veritabanı sahipliğini başka bir role aktarmalıyız.
365 | * Bu işlemi ALTER DATABASE ile yapabiliriz.
366 |
367 | ~~~sql
368 | CREATE ROLE "rol1";
369 | ~~~
370 |
371 | ~~~sql
372 | ALTER DATABASE "NorthWind" OWNER TO "rol1";
373 | ~~~
374 |
375 | ~~~sql
376 | DROP ROLE "rol1";
377 |
378 | -- Kernel error: ERROR: role "rol1" cannot be dropped because some objects depend on it DETAIL: owner of database NorthWind
379 | ~~~
380 |
381 | ~~~sql
382 | ALTER DATABASE "NorthWind" OWNER TO "postgres";
383 | ~~~
384 |
385 | ~~~sql
386 | DROP ROLE "rol1";
387 | ~~~
388 |
389 |
390 | * Veritabanı sahibi olan bir rolü silmeden önce veritabanı sahipliğini başka bir role aktarmalıyız.
391 | * Bu işlemi REASSIGN ile de yapabiliriz.
392 |
393 | ~~~sql
394 | CREATE ROLE "rol1";
395 | ~~~
396 |
397 | ~~~sql
398 | ALTER DATABASE "NorthWind" OWNER TO "rol1";
399 | ~~~
400 |
401 | ~~~sql
402 | DROP ROLE "rol1";
403 |
404 | -- Kernel error: ERROR: role "rol1" cannot be dropped because some objects depend on it DETAIL: owner of database NorthWind
405 | ~~~
406 |
407 |
408 | * "rol1" in sahibi olduğu tüm nesnelerin yeni sahibini "postgres" olarak belirle.
409 |
410 | ~~~sql
411 | REASSIGN OWNED BY "rol1" TO "postgres";
412 | ~~~
413 |
414 | ~~~sql
415 | DROP ROLE "rol1";
416 | ~~~
417 |
418 |
419 | * Bir rolü grup gibi kullanabiliriz.
420 | * Diğer rollerin bu rolden yetkilerini kalıtım olarak almasını temin edebiliriz.
421 |
422 | ~~~sql
423 | CREATE ROLE "gruprol";
424 | ~~~
425 |
426 | ~~~sql
427 | CREATE ROLE "rol1";
428 | ~~~
429 |
430 | * rol1 isimli rolün yetkilerine gruprol isimli rolün yetkilerini de ekle.
431 | * Temel yetkiler kalıtım olarak alınmaz. Yalnızca grubun nesneler üzerindeki yetkileri kalıtım olarak alınır.
432 |
433 | ~~~sql
434 | GRANT "gruprol" TO "rol1";
435 | ~~~
436 |
437 |
438 | * Bunun yapılabilmesi için rol1 isimli rolün kalıtım alma özelliğine sahip olması gerekir. (Postgresql in yeni sürümlerinde rol oluşturulduğunda INHERIT yetkisi veriliyor)
439 | * Diğer bir deyişle INHERIT yetkisine sahip olması gerekir.
440 | * Bu yetki yoksa, yetkiler kalıtım alınmaz.
441 |
442 | ~~~sql
443 | ALTER ROLE "rol1" WITH INHERIT;
444 | ~~~
445 |
446 | ~~~sql
447 | CREATE ROLE "rol2" WITH INHERIT;
448 | ~~~
449 |
450 | ~~~sql
451 | GRANT "gruprol" TO "rol2";
452 | ~~~
453 |
454 | * rol1 isimli role verilmiş yetkilerin (gruprol yetkileri) geri alınması.
455 |
456 | ~~~sql
457 | REVOKE "gruprol" FROM "rol1";
458 | ~~~
459 |
460 |
461 |
462 | ## Yetkilendirme İşlemleri
463 |
464 | > PUBLIC: Tüm roller / kullanıcılar.
465 | > kullaniciAdi: Tek bir kullanıcı.
466 | > ALL: Tüm yetkiler.
467 |
468 |
469 | * rol1 isimli role customers tablosu üzerinde seçim yapma yetkisi ver.
470 |
471 | ~~~sql
472 | GRANT SELECT ON "customers" TO "rol1";
473 | ~~~
474 |
475 | * Tüm rollere customers tablosu üzerinde kayıt ekleme yetkisi ver.
476 |
477 | ~~~sql
478 | GRANT INSERT ON "customers" TO PUBLIC;
479 | ~~~
480 |
481 | * rol1 isimli kullanıcıya customers tablosu üzerinde tüm yetkileri ver.
482 |
483 | ~~~sql
484 | GRANT ALL ON "customers" TO "rol1";
485 | ~~~
486 |
487 | * rol1 isimli rolün customers tablosu üzerindeki güncelleme yetkisini geri al.
488 |
489 | ~~~sql
490 | REVOKE UPDATE ON "customers" FROM "rol1";
491 | ~~~
492 |
493 | * rol1 isimli rolün customers tablosu üzerindeki tüm yetkilerini geri al.
494 |
495 | ~~~sql
496 | REVOKE ALL ON "customers" FROM "rol1";
497 | ~~~
498 |
499 | * rol1 kullanicisinin Sema1 icerisindeki nesnelere ait tüm yetkileri geri alinir.
500 |
501 | ~~~sql
502 | REVOKE ALL ON SCHEMA "Sema1" FROM "rol1";
503 | ~~~
504 |
505 | * Herhangi bir nesne üzerinde yetkiye sahip olan bir rolü silemeyiz.
506 |
507 | ~~~sql
508 | CREATE ROLE "rol1";
509 | ~~~
510 |
511 | ~~~sql
512 | GRANT SELECT ON "customers" TO "rol1";
513 | ~~~
514 |
515 | ~~~sql
516 | DROP ROLE "rol1";
517 |
518 | -- Kernel error: ERROR: role "rol4" cannot be dropped because some objects depend on it DETAIL: privileges for table customers
519 | ~~~
520 |
521 | * rol1 in sahibi olduğu tüm nesneleri sil (kısıtlar ihlal edilemez)
522 |
523 | ~~~sql
524 | DROP OWNED BY "rol1";
525 | ~~~
526 |
527 | ~~~sql
528 | DROP ROLE "rol1";
529 | ~~~
530 |
531 |
532 |
533 | ## Örnek (Northwind Veri Tabanı)
534 |
535 | ~~~sql
536 | CREATE ROLE "rol1";
537 | ~~~
538 |
539 | ~~~sql
540 | SET SESSION AUTHORIZATION "rol1";
541 | ~~~
542 |
543 | ~~~sql
544 | SELECT * FROM "customers";
545 |
546 | -- Kernel error: ERROR: permission denied for relation customer
547 | ~~~
548 |
549 |
550 | * rol1 seçme hakkına sahip olmadigi icin hata oluşur.
551 |
552 | ~~~sql
553 | GRANT SELECT ON "customers" TO "rol1";
554 | ~~~
555 |
556 |
557 | * Yetkilendirme yapabilmek için oturum yetkilendirmesini "postgres" kullanıcısı şeklinde ayarla.
558 |
559 | ~~~sql
560 | SET SESSION AUTHORIZATION "postgres";
561 | ~~~
562 |
563 | * rol1, kullanıcısına "customers" tablosu üzerinde seçme yetisi ver.
564 |
565 | ~~~sql
566 | GRANT SELECT ON "customers" TO "rol1";
567 | ~~~
568 |
569 | ~~~sql
570 | SET SESSION AUTHORIZATION "rol1";
571 | ~~~
572 |
573 | * Sorgu çalışır.
574 |
575 | ~~~sql
576 | SELECT * FROM "customers";
577 | ~~~
578 |
579 |
580 |
581 |
582 | ## Fonksiyonlar ve Yetkilendirme
583 |
584 | ~~~sql
585 | CREATE OR REPLACE FUNCTION "milKMDonustur"(degerMil REAL, OUT degerKM REAL)
586 | AS $$
587 | BEGIN
588 | degerKM = degerMil * 1.6;
589 | END;
590 | $$
591 | LANGUAGE plpgsql;
592 | ~~~
593 |
594 | ~~~sql
595 | SET SESSION AUTHORIZATION "rol1";
596 | ~~~
597 |
598 | ~~~sql
599 | SELECT * FROM "milKMDonustur"(3);
600 | ~~~
601 |
602 | ~~~sql
603 | SET SESSION AUTHORIZATION "postgres";
604 | ~~~
605 |
606 | ~~~sql
607 | REVOKE ALL ON FUNCTION "milKMDonustur"(REAL, OUT REAL) FROM "rol1";
608 | ~~~
609 |
610 | * Aşağıdaki ifade çalışır. Fonksiyonlar PUBLIC grubu için varsayılan olarak çalıştırılırlar.
611 |
612 | ~~~sql
613 | SELECT * FROM milKMDonustur(3);
614 | ~~~
615 |
616 | ~~~sql
617 | SET SESSION AUTHORIZATION "postgres";
618 | ~~~
619 |
620 | ~~~sql
621 | REVOKE ALL ON FUNCTION "milKMDonustur"(REAL, OUT REAL) FROM PUBLIC;
622 | ~~~
623 |
624 | ~~~sql
625 | SET SESSION AUTHORIZATION "rol1";
626 | ~~~
627 |
628 | * Aşağıdaki ifade çalışmaz.
629 |
630 | ~~~sql
631 | SELECT * FROM milKMDonustur(3);
632 | ~~~
633 |
634 |
635 |
636 |
637 | ## Şifreleme
638 |
639 |
640 | * Kullanici şifreleri ve gizli bilgiler açık olarak saklanmamalıdır.
641 |
642 |
643 | * Linux
644 |
645 | ~~~
646 | sudo apt-get install postgresql-contrib
647 | ~~~
648 |
649 |
650 | * Kripto eklentisini oluştur.
651 |
652 | ~~~sql
653 | CREATE EXTENSION "pgcrypto";
654 | ~~~
655 |
656 |
657 | * "sifrem" şifresini sha512 algoritması ile kodla.
658 |
659 | ~~~sql
660 | SELECT ENCODE(DIGEST('sifrem', 'sha512'), 'hex');
661 | ~~~
662 |
663 |
664 | * "sifrem" şifresini md5 algoritması ile kodla ve sonucu "md5" ifadesi ile birleştir.
665 |
666 | ~~~sql
667 | SELECT 'md5'|| MD5('sifrem');
668 | ~~~
669 |
--------------------------------------------------------------------------------