├── .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 | ![](Sekiller/01/BuyukResim.png) 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 | ![](Sekiller/01/BuyukResim.png) 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 | ![](Sekiller/01/AlgilayiciVerileri.png) 68 | 69 | ![](Sekiller/01/GitVerileri.png) 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 | ![](Sekiller/01/DosyaYapisi.png) 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 | ![](Sekiller/01/VeritabaniSistemi.png) 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 | ![](Sekiller/01/VeritabaniVeDosyaSistemi.png) 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 | ![](Sekiller/01/ETicaret.png) 145 | 146 | 147 | ## Örnek Bir Veritabanı (İlişkisel Model) 148 | 149 | ![](Sekiller/01/IliskiselSema.png) 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 | ![](Sekiller/01/VeritabaniSiniflariTablo.png) 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 | ![](Sekiller/02/YasamDongusu.png) 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 | ![](Sekiller/02/DosyaYapisi.png) 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 | ![](Sekiller/02/HiyerarsikModel.png) 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 | ![](Sekiller/02/AgModeli.png) 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 | ![](Sekiller/02/IliskiselSema.png) 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 | ![](Sekiller/02/ChenGosterimi.png) 160 | 161 | 162 | ### Crow’s Foot Gösterimi 163 | 164 | ![](Sekiller/02/ETicaret.png) 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 | ![](Sekiller/02/ModelTablosu.png) 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 | ![](Sekiller/02/HariciModel1.png) 206 | 207 | ![](Sekiller/02/HariciModel2.png) 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 | ![](Sekiller/02/KavramsalModel.png) 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 | ![](Sekiller/02/DahiliModel.png) 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 | ![](Sekiller/02/BirCokBagintisi.png) 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 | ![](Sekiller/02/CokCokBagintisi.png) 305 | 306 | 307 | ![](Sekiller/02/CokCokBagintisi2.png) 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 | ![](Sekiller/02/BirBirBagintisi.png) 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 | ![](Sekiller/02/VarOlmaBagimliligi.png) 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 | ![](Sekiller/02/VarOlmaBagimliligi2.png) 330 | 331 | * Var olma Bağımlılığı, Tanımlama Bağıntısı 332 | 333 | ![](Sekiller/02/VarolmaBagimliligiTanimlamaBagintisi.png) 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 | ![](Sekiller/02/ZayifGucluBagintilar.png) 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 | ![](Sekiller/02/TekliBaginti.png) 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 | ![](Sekiller/02/IkiliBaginti.png) 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 | ![](Sekiller/02/UcluBaginti.png) 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 | ![](Sekiller/03/AracUreticisi.png) 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 | ![](Sekiller/03/UBSVBDiyagrami.png) 114 | ![](Sekiller/04/CokCokBagintisi.png) 115 | 116 | 117 | ### Örnek Tablolar 118 | 119 | ![](Sekiller/03/UBSTablo.png) 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 | ![](Sekiller/02/YasamDongusu.png) 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 | ![](Sekiller/04/TemelKavramlar.png) 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 | ![](Sekiller/04/Tablo.png) 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 | ![](Sekiller/04/YabanciAnahtar.png) 112 | ![](Sekiller/04/YabanciAnahtar2.png) 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 | ![](Sekiller/04/ButunlukKurallari.png) 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 | ![](Sekiller/04/VekilBirincilAnahtar.png) 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 | ![](Sekiller/04/Iliski.png) 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 | ![](Sekiller/04/BirBirBagintisi.png) 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 | ![](Sekiller/04/BirCokBagintisi.png) 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 | ![](Sekiller/04/VarOlmaBagimliligi.png) 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 | ![](Sekiller/02/VarolmaBagimliligiTanimlamaBagintisi.png) 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 | ![](Sekiller/04/CokCokBagintisi.png) 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 | ![](Sekiller/04/TekliBaginti.png) 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 | ![](Sekiller/04/Indeks.png) 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 | ![](Sekiller/04/AracUreticisi.png) 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 | ![](Sekiller/04/ETicaret_Kucuk.png) 313 | 314 | ![](Sekiller/04/E-TicaretTablo.png) 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 | ![](Sekiller/05/KalitimPersonel.png) 44 | 45 | ### Örnek 2 46 | 47 | ![](Sekiller/05/ETicaret.png) 48 | 49 | 50 | ### Örnek 3 51 | 52 | ![](Sekiller/05/Urun1.png) 53 | 54 | 55 | ### Örnek 4 56 | 57 | ![](Sekiller/05/Kisi1.png) 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 | ![](Sekiller/05/ETicaretKumeleme1.png) 66 | 67 | 68 | ![](Sekiller/05/ETicaretKumeleme2.png) 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 | ![](Sekiller/05/Select.png) 55 | 56 | * Seçim kriterlerinde kullanılan semboller: 57 | 58 | ![](Sekiller/05/Select2.png) 59 | 60 | * Ogrenciler tablosundan ogrenciNo bilgisi 1512B10010 olan öğrenciyi seç. 61 | 62 | ![](Sekiller/05/Select3.png) 63 | 64 | * Kisiler tablosundan cinsiyeti Erkek olan ve yaşı 18’den büyük olan kayıtları seç. 65 | 66 | ![](Sekiller/05/Select4.png) 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 | ![](Sekiller/05/Projeksiyon.png) 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 | ![](Sekiller/05/Projeksiyon2.png) 83 | 84 | * Ogrenciler tablosundan fakülte numarası 12 olan tüm kayıtların ad ve soyad bilgilerini göster. 85 | 86 | ![](Sekiller/05/Projeksiyon3.png) 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 | ![](Sekiller/05/Birlesim.png) 97 | 98 | * BilgisayarToplulugu ve SiberToplulugu tablolarındaki kayıtların ogrenciNo, ad ve soyad alanlarındaki bilgileri birleştir ve göster. 99 | 100 | ![](Sekiller/05/Birlesim2.png) 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 | ![](Sekiller/05/Kesisim_1.png) 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 | ![](Sekiller/05/Kesisim_2.png) 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 | ![](Sekiller/05/Fark.png) 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 | ![](Sekiller/05/Fark2.png) 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 | ![](Sekiller/05/Kartezyen.png) 139 | 140 | 141 | ![](Sekiller/05/Kartezyen2.png) 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 | ![](Sekiller/05/DogalBirlestirme.png) 153 | 154 | 155 | ![](Sekiller/05/DogalBirlestirme2.png) 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 | ![](Sekiller/05/SolDisBirlestirme.png) 169 | 170 | 171 | ![](Sekiller/05/SolDisBirlestirme2.png) 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 | ![](Sekiller/05/SagDisBirlestirme.png) 184 | 185 | ![](Sekiller/05/SagDisBirlestirme2.png) 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 | ![](Sekiller/05/Bolme.png) 195 | 196 | ![](Sekiller/05/Bolme2.png) 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 | ![](Sekiller/05/Soru1.png) 223 | 224 | * Soru 2: Sakarya ilinde doğan öğrencilerin adını ve soyadını listeleyen ilişkisel cebir ifadesini yazınız. 225 | 226 | ![](Sekiller/05/Soru2.png) 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 | ![](Sekiller/05/Soru3.png) 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 | ![](Sekiller/05/Soru4.png) 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 | ![](Sekiller/05/Soru5.png) 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 | ![](Sekiller/05/Soru6.png) 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 | ![](Sekiller/06/YapisalSorgulamaDili.png) 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 | ![](Sekiller/06/DogalBirlestirme.png) 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 | ![](Sekiller/06/SolDisBirlestirme.png) 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 | ![](Sekiller/06/SagDisBirlestirme.png) 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 | ![](Sekiller/07/YabanciAnahtar.png) 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 | ![](Sekiller/08/PersonelKalitim.png) 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 | ![](Sekiller/08/TekliBaginti.png) 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 | ![](Sekiller/10/NorthWind.png) 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 | ![](Sekiller/02/YasamDongusu.png) 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 | ![](Sekiller/12/VeriTekrarininZararlari_1.png) 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 | ![](Sekiller/12/VeriGirisindeTutarsizlik_1.png) 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 | ![](Sekiller/12/VeriGirisindeTutarsizlik_2.png) 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 | ![](Sekiller/12/VeriGuncellemedeTutarsizlik_1.png) 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 | ![](Sekiller/12/VeriSilmedeTutarsizlik_1.png) 86 | 87 | 88 | ### İyileştirilmiş Tasarım 89 | 90 | ![](Sekiller/12/IyilestirilmisTasarim.png) 91 | 92 | ![](Sekiller/12/IyilestirilmisTasarim1.png) 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 | ![](Sekiller/12/BirinciNormalForm_1.png) 109 | 110 | 111 | ### Normalizasyon Sonucu 112 | 113 | ![](Sekiller/12/BirinciNormalForm_2.png) 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 | ![](Sekiller/12/IkinciNormalForm_1.png) 127 | 128 | 129 | * Tablodaki tutarsızlık aşağıda gösterilmiştir. 130 | 131 | ![](Sekiller/12/IkinciNormalForm_2.png) 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 | ![](Sekiller/12/FonksiyonelBagimlilik.png) 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 | ![](Sekiller/12/IkinciNormalForm_2.png) 172 | 173 | 174 | ### Tabloyu 2NF'ye Dönüştürme (Kısmi Bağımlılıkların Giderilmesi) 175 | 176 | ![](Sekiller/12/IkinciNormalForm_3.png) 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 | ![](Sekiller/12/UcuncuNormalForm_1.png) 196 | 197 | ![](Sekiller/12/UcuncuNormalForm_2.png) 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 | ![](Sekiller/12/UcuncuNormalForm_3.png) 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 | ![](Sekiller/12/Ornek_1.png) 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 | ![](Sekiller/12/Ornek2.png) 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 | --------------------------------------------------------------------------------