VERİTABANI ORGANİZASYONU Veri nedir? Veri(data) ilişkide olduğumuz(ilgimiz olan) dünyanın durumlarıdır. O gün mağazaya kaç kişi geldiği, dışarıda havanın sıcaklığı, boyunuzun uzunluğu, göz renginiz veya son okuduğunuz kitabın sayfa sayısı birer veridir. Veri kavramını dünyanın betimlemesi olarak düşünebiliriz. Duyu organlarımız ile verileri algılar ve beynimizle işleriz. Bilgi nedir? Bilgi (knowledge) verilerin işlenmesiyle elde edilir. Örnek: Bugün dışarıda hava sıcaklığı 25 C dir. İnsanlar bilgiyi oluşturabilmek için uzunca bir süre verilerden yararlanırlar. Verilerin anlamlı ve kullanılabilir olmaları için tanımlı bir çerçeve içine alınmaları ve işlenmeleri gerekir. Veritabanı nedir? Birbiri ile ilişkili verilerin belirli bir düzen içerisinde bir araya getirildiği ve depolandığı yapılara veritabanı(database) diyoruz. 1
Veritabanı Yönetim Sistemi(VTYS) Database Management System(DBMS) Veritanı oluşturmak, verileri saklamak ve verileri işlemek üzere geliştirilmiş bilgisayar yazılımlarına VTYS denir. VTYS lerden önce veriler klasik dosyalarda saklanıyordu. VTYS lerin üstünlükleri: - Veri tekrarının önlenmesi. - Verilerin tutarlı olmasını sağlamak - Aynı aydaki erişimlerde tutarsızlıkların ortaya çıkmasını önlemek. - Verilerin güvenliğini sağlamak. Örnek VTYS yazılımları: MS-Access, MS-SQL Server, My-Sql, PostgreSQL, Oracle, IBM DB2, IBM-Informix, Paradox İlişkisel Veritabanı Nedir? Günümüz veritabanı sistemleri ilişkisel modeli kullanır. İlişkisel Model -> Releational Model Bu modelin prensibi böl-parçala-yönet tir. Bu modelde veriler birden çok tabloda saklanır. Bu tablolar ortak alanlar vasıtasıyla ilişkilendirilir. İlişki Türleri a) Bire-Bir İlişki ( 1-1 ) b) Bire-Çok İlişki ( 1 oo ) c) Çoka Çok İlişki ( oo oo ) 2
Bire Bir İlişki: Bir tablodaki bir kayda karşılık diğer tabloda bir kayıt varsa bu tablolar arasında bire-bir ilişki söz konusudur. (*) Bire-Çok İlişki: Bir tablodaki bir kayda karşılık diğer tabloda çok sayıda kayıt varsa bu tablolar arasında bire-çok ilişki söz konusudur. (*) Çoka-Çok İlişki: Bir tablodaki çok sayıda kayda karşılık diğer tabloda çok sayıda kayıt varsa bu tablolar arasında çoka-çok ilişki söz konusudur. Kısıtlamalar(Constraints) a) Anahtar Kısıtlamaları - Birincil Anahtar (Primary Key) kısıtlaması - Yabancı Anahtar (Foreign Key) kısıtlaması b) Veri Kısıtlamaları - Not Null kısıtlaması - Default kısıtlaması - Unique kısıtlaması - Check kısıtlaması 3
Veritabanı Tasarım Adımları 1) Nesneler Tanımlanır: Nesne, çeşitli özellikleri bulunan bir varlıktır. Herhangi bir proje de öncelikle nesneler tanımlanır. Ör) Birkaç örnek proje için nesneleri verecek olursak, Kütüphane sistemi: Kitap, üyeler, türler, ödünç hareketleri E-ticaret sistemi: Ürünler, müşteriler, siparişler, teslimat, fatura bilgileri, üreticiler, tedarikçiler, dağıtıcılar... Futbol Ligi: Takımlar, sahalar, oyuncular, fikstür, hakemler, antrenörler Okul Sistemi: Öğrenciler, öğretmenler, dersler, derslikler Sözlük: kelimeler, anlamlar, diller 2) Her nesne için bir tablo oluşturulur: Her nesne için bir tablo oluşturulur ve her bir tabloya içereceği veriyi en iyi anlatan bir isim verilir. 3) Her bir tablo için bir anahtar alan seçilir: Veri tabanındaki herhangi bir veriye erişilmeden önce tabloya erişilir. Tabloda yer alacak her bir kaydı bir diğerinden ayırabilecek bir sütuna ihtiyaç duyulur. 4) Nesnelerin gerekli her bir özelliği için tabloya bir sütun eklenir : Tablolara sırasıyla adını veren nesnelerin her bir özelliği için bir alan (sütun) eklenir. 4
5) Tekrarlayan nesne özellikleri için ek tablolar oluşturulur : Veri tekrarı olacaksa bir yerlerde hata yapılıyor demektir. Bu durumda eldeki tablonun en az bir tabloya daha ayrılması gerekiyor demektir. (Normalizasyon kurallarının devreye girdiği aşamadır) 6) Anahtar alana bağlı olmayan alanlar belirlenir: Bazen, anahtar alan ile aynı satırda yer aldığı halde, anahtar alan ile birebir ilişkisi olmayan bir alan yer alabilir. Bu türden alanların elimine edilip ayrı tablolara ayrılması gerekir. 7) Tablolar arasındaki ilişkiler tanımlanır: Her biri bir nesneye dair özellikleri barındıran tabloların tümü göz önüne alınır ve birbirleri ile olan ilişkileri tanımlanmaya çalışılır. NORMALİZASYON Amaç : Veri tekrarını ve bilgilerin kaybını önlemek Toplam 5 tane normalizasyon kuralı vardır. 5
İlk 3 kural pratikte kolay uygulanabilir kurallardır. Diğerleri ise daha çok kuramsal olarak kalır ve uygulanması zordur. Normalizasyon uygulanmadan önce bütün tablolar ; Normal Olmayan Biçim (Unnormalized Form UNF) de kabul edilir. Kurallar uygulanıp tablolar dönüştürüldükçe; Normal Biçime dönüşür. (Normal Form - NF) UNF -> 1.NF -> 2.NF -> 3.NF -> 4.NF -> 5.NF Veri Fazlalığı: a) Mutlak Veri Fazlalığı i) Birleşik Özellik : Birden çok verinin birleştirilerek bir alanda bulunması. ii) Tekrarlayan Grup: Tablolarda aynı tipteki veriyi içerecek alanların bulunması. iii) Çok Değerli Özellik: Aynı alanda birden fazla verinin virgülle ayrılarak kaydedilmesi. 6
b) Gereksiz Tekrar (Veri Artıklığı): Bazı durumlarda aynı veri çeşidi birden fazla kayıtta yer alabilmekte ve bu da sistemin yavaşlamasına sebep olmaktadır. Bilgilerin yinelenmesi, gereksiz alan kaplar, hata ve tutarsızlıklara sebep olabilir. Tablo-1: Tablo-2: (Veri artıklığı içeren tablo örnekleri) 7
Normalizasyon Aşamaları ( ilk 3 aşama) 1.Normalizayon 2.Normalizayon 3.Normalizayon İşlemleri İşlemleri İşlemleri Fonksiyonel Bağımlılıklar: Fonksiyonel Bağımlık Nedir? R bir ilişki şeması, X ve Y nitelikleri de R nin iki alt kümesi olsun. Eğer X nitelikler kümesinin değerleri Y nitelikler kümesinin değerlerini belirliyorsa Y, X e fonksiyonel bağımlı dır denir. R ilişkisinin Y niteliği, R nin X niteliğine ikişkisel olarak bağımlı ve X in her bir değeri Y nin bir değerine karşılık geliyorsa fonksiyonel bağımlılıktan söz edilir. 8
a) Kısmı bağımlık: Anahtar olmayan alan, birleşik anahtarın sadece bir kısmı ile belirlenebiliyorsa, buna kısmi bağımlılıkdenir. İsim alanını Müşteri_Id belirlemektedir. b) Dolaylı bağımlılık (Geçişken Bağımlılık): A,B,C niteliklilerini içeren 3 nitelikli bir tabloda: A, B, ve C için A => B ve B => C fonksiyonel bağımlılıkları bulunmakta ise, C dolaylı olarak A ya bağımlıdır. 9
Normalizasyon İşlemlerini Adım-Adım Yapalım: UNF -> 1.Normalizasyon Kuralları -> 1NF 10
1NF -> 2.Normalizayon Kuralları -> 2NF 11
12
2NF -> 3.Normalizayon Kuralları -> 3NF 13
14
Bir veritabanın baştan sonra tasarlanması: Veri Tabanı Tasarım Adımları Uygulanır. A) İhtiyaç Analizi Yapmalıyız. Veri tabanı ihtiyaç analizi yapılırken hazırlanacak olan sistemin neye hizmet edeceği, Veri tabanını ne iş yapacağı ve hangi ihtiyaçları karşılayacağına, Veri tabanının hangi verileri depolayacağı, Veri tabanını oluşturan tabloların neler olacağı ve ne tür verileri saklayacağı v.b. gibi sorulara cevap vermek gerekmektedir. Tüm bunları kağıt üzerinde tasarladıktan sonra fiziksel tasarıma geçmek çalışmanızın daha sistemli yürümesi açısından avantajınıza olacaktır. B) Tasarım Adımları 1.Nesneler Tanımlanır (Örneğimiz Kütüphane Sistemi olsun) kitaplar, üyeler, türler, ödünç hareketleri, yazarlar vd. 15
2.Her nesne için tablo oluşturulur 3.Her bir tablo için anahtar alan seçin 4.Nesnelerin gerekli her bir özelliği için tabloya bir sütun ekleyin. (Alanları belirleyin) Ör) Tablo:kitap ( kitapid (PK), kitapadi, ISBNNo, sayfasayisi, tur, ozet, yayinevi, yazar, yil) Bu şekilde bu tablolar önceden oluşturulmalı Normalizason ile ilgili işlemler 5.Tekrarlayan nesne özellikleri için ek tablolar oluşturun 6.Anahtar Alana Bağlı Olmayan Alanları Belirleyin 7.Tablolar arasındaki ilişkileri tanımlayın. 16
En son aşamada veritabanı şematik olarak ifade edilmelidir. Not: Bu şema temsilidir. 17
MySQL Veritabanı Yönetim Sistemi MySQL, altı milyondan fazla sistemde yüklü bulunan çoklu iş parçacıklı (multi-threaded), çok kullanıcılı (multi-user), hızlı ve sağlam (robust) bir veritabanı yönetim sistemidir. UNIX, OS/2 ve Windows platformları için ücretsiz dağıtılmakla birlikte ticari lisans kullanmak isteyenler için de ücretli bir lisans seçeneği de mevcuttur. Linux altında daha hızlı bir performans sergilemektedir. Geliştiricileri, 500'den fazlası 7 milyon kayıt içeren 10.000 tablodan oluşan kendi veritabanlarını (100 gigabyte civarında veri) MySQL'de tuttuklarını söylüyorlar. Web sunucularında en çok kullanılan veritabanıdır, asp, php gibi birçok web programlama dili ile kullanılabilir. MySQL, tuttuğu tablolarla çok kullanıcılı sistemlerde söz konusu olan erişim hakları sorununu başarılı bir şekilde çözmektedir. MySQL'in 4.0 sürümü ile birlikte "transaction" desteği, 4.1 sürümüyle birlikte de alt sorgu desteği eklenmiştir. Ayrıca "veri tutarlılığını (referential integrity)" sağlama işinin programcıya bırakılması tercih edilmiştir, ancak bu bir dezavantaj olarak görülmeyebilir. Çünkü pek çok veritabanı programcısı VTYS'lerdeki veri tutarlılığının esnek olmayan, zorlayıcı bir özellik olduğunu düşünmektedir. MySQL aşağıdaki veritabanı nesnelerini desteklemekte olup bu nesnelerin bazıları 5.1 sürümü ile gelmiştir: Tables (Tablo) Views (Görüntü) (Görüntüleme) Procedures (Prosedür/Yordam) Triggers Cursors 18
Tarihçe 1994 MySQL'in geliştirilmesine başlandı. 23 Mayıs 1995 İlk MySQL sürümü yayınlandı. 2001 yılında MySQL 3.23 yayınlandı. 2004 MySQL 4.1 beta sürümü, ve gerçek sürümü Ekim 2004 yılında yayınlandı. (R-trees and B-trees, subqueries, prepared statements) 2008: MySQL 5.1 sürümü yayınlandı. (event scheduler, partitioning, plugin API, row-based replication, server log tables) 2008 Ocak: Sun Microsystems, bir milyar dolara MySQL'i satın aldı. 2009 Nisan: Oracle, Sun Microsystems'i satın aldı. Oracle, MySQL'i geliştirmeye devam edeceğini duyurdu. MySQL Nasıl Yönetilir MySQL i yönetmek için farklı yazılımlar vardır. a) Desktop üzerinden - Database Master, Navicat, MySQL Front, SQL yoq b) Web üzerinden - phpmyadmin phpmyadmin ile MySQL i Yönetmek http://localhost/phpmyadmin 19
SQL Structured Query Language (Yapısal Sorgulama Dili) Veritabanı Yönetim Sistemleri için evrensel bir veri sorgulama dilidir. Neler yapılabilir? - Veritabanı, tablolar ve diğer nesneler oluşturulabilir. - Veri sorgulama işlemleri : Veri çekme - Diğer veri işlemleri : Veri ekleme, veri silme, veri güncelleme - Yapısal işlemler: Tabloların yapılarını değiştirme SQL dili kendi arasında: 1. DML (Data Manupulation Language) : Veri İşleme Dili. SELECT, UPDATE, DELETE, INSERT 2. DDL (Data Definition Language) : Veri tanımlama dili. CREATE, DROP, ALTER 3. DCL (Data Control Language) : Veri kontrol dili. GRANT, DENY, REVOKE, IF, FOR DDL (Data Definition Language) - Veri tanımlama dili komutları: CREATE Komutu: Bu komut ile veritabanın kendisi dahil bir çok nesne oluşturabilir. Database Oluşturmak: CREATE Database dbname; Database Silmek: DROP Database dbname; 20
Tablo Oluşturmak: CREATE TABLE table_name ( ); Tablo oluşturma işlemi yapılmadan önce mutlaka veri tabanı seçilmelidir (USE komutuyla). USE DATABASE dbname; Format: Create Table <tablo adı> ( alan_adı veri_türü [Default ifade] [alan_kısıtlaması], [ tablo kısıtlaması] ); MySQL de üç temel veri tipi vardır. Bunlar; sayısal (numeric), tarih ve saat (date and time) ve karakter katarıdır (string). Bu kategorilerin her birinin içinde de pek çok tip bulunur. 21
Her bir tipin hafızada çeşitli depolama boyutları vardır. Veri türleri ve özellikleri aşağıdaki tabloda görülmektedir. 22
Örnek: Mezun olan öğrenciler için mezun bilgilerinin tutulacağı bir tablo oluşturalım. Bu tablo için aşağıdaki alan adları bulunacaktır. Tablo adını kayit olarak kabul edelim. Alan adı - açıklama adi : Öğrenci Adı soyadi : Öğrenci Soyadı ogrno : Öğrenci Numarası SQL Kodu CREATE TABLE kayit ( ad varchar(15) not null, soyad varchar(15) not null, ogrno smallint(5) unsigned, constraint ogrno_pk primary key (ogrno) ); Örnek: Bir alışveriş sitesinde müşteri bilgilerini tutacak bir tablo için aşağıdaki alanlar bulunacaktır. Tablo adı musteri olsun. Alan adı - açıklama Musteri_id : Müşteri numarası adsoyad : Müşteri adı ve soyadı adres : Müşteri adresi sehir : Şehir tlfon : Telefon SQL Kodu CREATE TABLE musteri (musteri_id int unsigned not null auto_increment primary key, adsoyad varchar(50) not null, adres varchar(100) not null, 23
sehir varchar(15) not null, tlfon varchar(11) not null ); Örnek: Bir satış sitesine konulacak ürünlerin tutulacağı urun adlı tabloyu aşağıdaki gibi oluşturalım. Alan adı - Açıklama Urun_kodu : Satılacak ürün kodu Urun_markasi : Satılacak ürünün markası Urun_turu : Satılacak ürün türü Urun_fiyati : Satılacak ürünün fiyatı SQL Kodu CREATE TABLE urun ( urun_kodu integer(5) zerofill not null, urun_markasi varchar(20) not null default BELİRSİZ, urun_turu varchar(20) not null default BELİRSİZ, urun_fiyati bigint(10) unsigned, constraint urun_kodu_pk primary key (urun_kodu), ); Tablolarda Karakter Kodlamasının Ayarlanması Tablo oluştururken metinsel verilerin karakter kodlamasını ayarlamak için CREATE TABLE ( ) komutu bittikten sonra aşağıdaki kod yazılır: DEFAULT CHARSET=utf8 ; veya DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci ; 24
Tabloları Silmek (DROP TABLE Komutu): Bazen bir tablonun tamamından kurtulmak isteyebilirsiniz. Bunu DROP TABLE ifadesiyle yapabilirsiniz. Genel kullanımı aşağıdaki gibidir: DROP TABLE tablo_adi Örnek: musteri tablosunu silmek için aşağıdaki ifade kullanılır. DROP TABLE musteri; Bu sorgu, tablodaki tüm satırları ve tablonun kendisini sileceğinden kullanırken dikkatli olunmalıdır. Görünümler (VIEW) Bir ya da daha fazla tablonun mantıksal alt kümelerini oluşturmak için görünümlerden yararlanılır. Görünümler, bir tabloya dayalı mantıksal bir tablo olarak değerlendirilir. Görünüm, tablolar gibi veriyi fiziksel olarak saklamaz. Görünümler, saklanmış (depolanmış) SELECT deyimi olarak değerlendirilir. Bir SELECT deyiminin defalarca kullanılması söz konusu ise, onu bir görünüm biçiminde tanımlayarak, bu görünümün çalıştırılması mümkündür. Görünümler aşağıda sıralanan nedenlerle tercih edilir: Görünümler, veri tabanına erişimi sınırlayan olanaklardır çünkü görünüm, tabloların sadece seçilen bir kısmını görüntüleyebilir. Karmaşık sorguların kolayca yapılmasını sağlar. Aynı veriyi kullanan çok sayıda görünüm tanımlanabilmektedir. 25
Bir görünümün yaratılabilmesi için CREATE VIEW deyimi kullanılır. Bu deyimin kullanımı aşağıda gösterildiği gibidir: CREATE VIEW görünüm AS altsorgu; Bir görünümün yaratılması esnasında kullanılacak alt sorgu içinde ORDER BY sözcüğü yer alamaz. Var olan bir görünümü yok etmek amacıyla DROP VIEW deyimi kullanılır. Bu deyimin kullanımı aşağıda gösterildiği gibidir: DROP VIEW görünüm; Var olan herhangi bir görünümün güncelleştirilmesi amacıyla, CREATE OR REPLACE VIEW deyimi kullanılır. Bu deyimin kullanımı aşağıda gösterildiği gibidir: CREATE OR RELACE VIEW görünüm [(görünüm sütunları)] AS altsorgu; Örnek: Görünüm oluşturma: Öğrencilerin danışmanlarının kimler olduğunu döndürecek bir sorguya ihtiyacımız var. Bu sorguya sık sık ihtiyaç duyacağımızı varsayarak SELECT deyimini bir görünüme dönüştürmek istiyoruz. CREATE VIEW ogda AS SELECT OGR.adsoyad AS Öğrenci, DAN.kimlik AS Danışman FROM ogrenciler OGR, danismanlar DAN WHERE OGR.sinif = DAN.sinif; Örnek: Görünümü güncelleştirme: Yarattığımız ogda sorgusu içerisinde bir güncelleştirmeye ihtiyacımız var. Sorgu sonrası dönen listenin öğrencinin adına göre alfabetik sıralanmasını istiyoruz. 26
CREATE OR REPLACE VIEW ogda AS SELECT OGR.adsoyad AS Öğrenci, DAN.kimlik AS Danışman FROM ogrenciler OGR, danismanlar DAN WHERE OGR.sinif = DAN.sinif ORDER BY OGR.adsoyad Örnek: Görünümü kaldırma: ogda isimli görümünü veritabanımızda daha fazla kullanmak istemiyoruz. DROP VIEW ogda; Index Yapıları (Create Index) Bir index, veri tabanı ortamında tablo gibi bir nesnedir ve ilişkili olarak kullanıldığı tablonun indexleme alanı (priamry key) olarak kullanılan kolondaki verilere göre sıralanmış biçimde işleme sokulmasını sağlar. Bir tablo indexlenmiş ise bu tablo içinde gerçekleştirilecek bir arama ya da koşullu listeleme işlemi çok daha hızlı biçimde gerçekleştirilebilecektir. CREATE INDEX belirtilen bir tablo üzerinden bir indeks oluşturur. İndekslerin birincil kullanım amacı, veri tabanı başarımını artırmaktır (ancak, uygunsuz kullanımı başarının düşmesiyle sonuçlanır). İndeks için anahtar alanları sütun isimleri olarak ya da parantez içinde yazılmış ifadeler olarak belirtilir. İndeksleme yöntemi, çok sütunlu indeksleri destekliyorsa çok sayıda alan belirtilebilir. Bir indeks alanı, tablonun satırındaki bir veya daha fazla sütun değerinden hesaplanan bir ifade olabilir. Bu özellik, bazı temel veri dönüşümlerini temel alan veriye daha hızlı erişim sağlamak için kullanılabilir. 27
Auto_increment, tam sayı sütunlarında kullanabileceğiniz özel bir MySQL özelliğidir. Tabloya satırlar eklerken ilgili alanı boş bıraktığımızda MySQL otomatik olarak benzersiz bir tanımlayıcı değer oluşturacaktır. Bu değer, sütundaki mevcut maksimum değerlerin bir fazla olacaktır. Her tabloda yalnızca bir tane bulunabilir. Auto_increment içeren sütunlar indexlenmelidir. Bir sütun adının ardından gelen primary key, bu sütunun tablo için birincil anahtar olduğunu belirtir. Bu sütuna yapılan girişlerin benzersiz olması gerekir (T.C. kimlik Nu., okuldaki öğrenci Nu. gibi). MySQL bu sütunu otomatik olarak indexler. Bir sütun adının ardından birincil anahtar (primary key) belirleme işlemi sadece tek sütunluk birincil anahtarlar için yapılabilir. Birincil anahtarların belirtilmesi, bu sütunlarda indexlerin oluşturulmasını sağlar. Birincil anahtarlar ya da indexler olmadan da tablo oluşturmak mümkündür. Yeni başayan MySQL kullanıcılarının karşılaştıkları sorunlardan biri çok hızlı olduğunu duymuş oldukları bu veri tabanından yeterli performans elde edememektir. Bu performans sorunuyla karşılaşmalarının nedeni, veri tabanlarında hiçbir index oluşturmamış olmalarıdır. MySQL tarafından otomatik olarak oluşturulan indexler başlangıç için işimizi görecektir. Eğer anahtar olmayan bir sütunda çok fazla sorgu çalıştırdığınızı fark ederseniz performansı artırmak için bu sütuna bir index eklemek isteyebilirsiniz. Bunu CREATE INDEX ifadesini kullanarak yapabilirsiniz. Bu ifadenin genel formu aşağıdadır. Format: CREATE [ UNIQUE ] INDEX isim ON tablo [ USING yöntem ] ( { sütun ( ifade ) } [ işleç_sınıfı ] [,...] ) [ TABLESPACE tablo_alanı ] [ WHERE dayanak ] 28
Parametreler: UNIQUE : İndeks oluşturulurken ve her veri eklenişinde tabloda birbirinin aynı değerler bulunmaması için sistemin sınama yapmasını sağlar. Girdilerin yinelenmesine sebep olacak bir veri girme veya güncelleme işleminin yapılmaya çalışılması bir hata üretecektir. isim : Oluşturulacak indeksin ismi (Burada şema nitelemeli isimler kullanılamaz. İndeks daima tabloyu içeren şemada oluşturulur.) tablo : İndekslenecek tablonun ismi (Şema nitelemeli olabilir.) Yöntem : İndeks için kullanılacak yöntemin ismi. Değer olarak, btree, hash, rtree ve gist verilebilir. btree öntanımlı yöntemdir. sütun : Tablo sütunun ismidir. İfade : Tablonun bir ya da daha fazla sütünu ile ilintili bir ifade. İfade, yukarıdaki söz diziminde gösterildiği gibi parantez içinde yazılmalıdır. Ancak, ifade bir işlev çağrısı biçimindeyse parantez içine alınmayabilir. işleç_sınıfı: Bir işleç sınıfının ismidir. Ayrıntılar için aşağıya bakınız. tablo_alanı: İndeksin oluşturulacağı tablo alandır. Belirtilmezse default_tablespace yapılandırma değişkeninin değeri, bu değişkene bir değer atanmamışsa veri tabanının öntanımlı tablo alanı kullanılır. dayanak : Bir kısmi indeks için kısıt ifadesi Örnekler: films tablosunun title sütunu üzerinde bir B-tree indeksi oluşturmak için: CREATE UNIQUE INDEX title_idx ON films (title); 29
films tablosunun code sütunu üzerinde bir indeks oluşturup bu indeksin indexspace tablo alanında kalması için: CREATE INDEX code_idx ON films(code) TABLESPACE indexspace; CREATE INDEX namex ON "Depo.Dbf" (malz_adi) İşletmede çalışan personeli brüt maaşlarına göre azalan sırada (yüksek maaştan düşük maaşa doğru) listelemek istenirse brüt alanına göre aşağıdaki gibi index oluşturmak gerekir: CREATE INDEX per_maas ON personel (brut DESC); Bir okuldaki öğrencileri öncelikle adlarına göre, aynı adda olanları soyadlarına göre, hem adı hem soyadı aynı olanların ortalamalarına göre sırlanmış olarak listelenmesi istenirse aşağıdaki komutlar kullanılmalıdır: CREATE INDEX ogr_ad_soyad_ort ON ogrenci (ad,soyad,ort); Mevcut Index in Silinmesi (Index Drop) Bir tablo üzerinde tanımlanmış herhangi bir index, o tablonun veri tabanından silinmesi ile otomatik olarak silinecektir. Tablo silinmeksizin o tablo üzerinde oluşturulan indeks içinse: DROP INDEX komutu kullanılır. Örnek: Böylece ogrenci tablosu üzerinde oluşturulmuş ogr_ad_soyad_ort adlı indeks, öğrenci tablosu veri tabanında kaldığı hâlde silinecektir. ALTER TABLE ogrenci DROP ogr_ad_soyad_ort; 30
MySQL için Kullanıcı Oluşturma ve Doğru Yetkilendirme MySQL için aceleyle yapacağınız kullanıcı oluşturma ve yetkilendirme işlemleri başınıza bela olabilir. Eğer sunucu üzerindeki MySQL servisinin kontrolü sizdeyse (klasik bir hosting kullanıyorsanız sizde değildir) yetkilendirmeleri doğru şekilde yapmakta fayda vardır. MySQL de Yeni Kullanıcı Oluşturma CREATE USER 'ismet'; Yukarıdaki gibi şifre belirtmeden bir kullanıcı oluşturursanız, herhangi biri ismet kullanıcısı üzerinden şifre belirtmeksizin MySQL e erişebilir durumda olacaktır. Bu kullanıcıya henüz herhangi bir veri tabanı üzerinde yetki verilmedi. Dolayısıyla MySQL e bağlanmış olsa bile veri tabanları üzerinde işlem yapamayacaktır. Bu kullanıcıya şifre vermeyi unuttuktan sonra, bir veri tabanı üzerinde yetki verirseniz sonuçlar kötü olabilir. MySQL de oluşturacağınız kullanıcılar için host parametresi de verebilirsiniz. Bu ayar kullanıcı nereden (hosttan) bağlanabilir sorusunun cevabıdır. Localhost: Sadece MySQL in bulunduğu makineden erişilir. %: Sadece dışarıdan erişilir. IP: Sadece sizin belirlediğiniz IP lerden erişilir. Örnek: Sadece MySQL in bulunduğu makineden MySQL e giriş yapabilen bir kullanıcı oluşturalım: CREATE USER 'ismetaktar'@'localhost' IDENTIFIED BY 'powerful_password'; 31
Kullanıcıyı yukarıdaki gibi oluşturursanız Navicat, Workbench gibi programlar kullanarak MySQL e dışardan erişemezsiniz. Sadece o makineden MySQL e erişebilirsiniz. Örnek: Sadece dışarıdan MySQL e erişebilen bir kullanıcı oluşturalım: CREATE USER 'ismetaktar'@'%' IDENTIFIED BY 'another_password'; Gördüğünüz üzere, kullanıcı adları aynı olan şifreleri farklı olan 2 farklı kullanıcı oluşturduk. Birisi powerful_password şifresi ile sadece içeriden, diğeri ise another_password şifresi ile sadece dışarıdan erişebilir durumdadır. MySQL de Kullanıcıları Listeleme Oluşturduğunuz kullanıcıları şu sorgu ile görüntüleyebilirsiniz: SELECT host, user FROM mysql.user; MySQL de Kullanıcı Silme Oluşturduğunuz kullanıcıları silmek için 2 farklı yol kullanabilirsiniz: DROP USER ismetaktar; Kullanıcıyı drop ederseniz sadece % ile oluşturulan kullanıcıyı silmiş olursunuz. Aşağıdaki gibi bir kullanım daha sağlıklı olacaktır. DROP USER 'ismetaktar'@'localhost'; DROP USER 'ismetaktar'@'%'; DROP yerine DELETE de kullanabilirsiniz. Lakin bu tavsiye edilen bir yol değil. Zaten bir kullanıcıyı DELETE edip tekrar aynı isimle yaratmaya çalıştığınızda hata oluşuyor. 32
-- veya DELETE FROM mysql.user WHERE user = 'ismetaktar' DELETE FROM mysql.user WHERE user = 'ismetaktar' AND host = 'localhost'; DELETE FROM mysql.user WHERE user = 'ismetaktar' AND host='%'; MySQL de Kullanıcı Yetkilendirme Kullanıcı oluşturduktan sonra, hangi kullanıcınının hangi veri tabanı ve tablolar üzerinde hangi yetkilere sahip olacaklarını belirlememiz gerekiyor. Kullanıcı oluştururken yaptığımız gibi yine hosta göre yetkilendirme yapabiliyoruz. GRANT ALL PRIVILEGES ON ismetaktardb.* TO 'ismetaktar'@'localhost'; Yukarıdaki syntax ile ismetaktar kullanıcısı local makineden bağlanarak, ismetaktardb veri tabanının tüm tablolarında (ismetaktardb.* ile ifade ediliyor) tüm işlemleri yapabilir. GRANT SELECT, INSERT, UPDATE, DELETE ON ismetaktardb.users TO 'ismetaktar'@'%'; Bu syntax ile korsan kullanıcısı dışarıdaki bir makineden bağlanarak, ismetaktardb veri tabanının tüm users tablosunda (ismetaktardb.users) sadece SELECT, INSERT, UPDATE, DELETE işlemlerini yapabilir. Yetkilendirme işlemlerini yaparken kullanıcının şifresi yoksa aşağıdaki gibi şifre de oluşturabilirsiniz. GRANT ALL PRIVILEGES ON ismetaktardb.* TO 'ismetaktar'@'localhost' IDENTIFIED BY 'password'; 33
Ayrıca, bir kullanıcıya atanmış tüm yetkileri görüntülemek için aşağıdaki syntaxı kullanabilirsiniz. SHOW GRANTS FOR 'ismetaktar'@'localhost'; SHOW GRANTS FOR 'ismetaktar'@'%'; Kullanıcı Oluşturma ve Yetkilendirme Sonuç Özet MySQL de yeni bir kullanıcı oluştururken veya yetkilendirirken şifresini belirlemeyi unutmayınız. Hostlara göre farklı şifreler veriniz. Hostlara göre farklı yetkiler belirleyiniz. Bu ufak bir detay olarak görünür fakat veri tabanına erişmek isteyen kötü niyetli insanları caydırabilir. Son olarak, en hızlı şekilde bir kullanıcı oluşturmak ve düzgün bir şekilde yetkilendirmek için aşağıdaki syntax işinize yarayabilir. CREATE USER 'ismetaktar'@'%' ; GRANT ALL PRIVILEGES ON ismetaktardb.* TO 'ismetaktar'@'%' IDENTIFIED BY 'password'; 34
Alter Komutu - Alter Table (Tablo Güncelleme) Alter Table, bir tablonun tanımını değiştirir. Veri tabanındaki satırları güncellemeye ek olarak, veri tabanı içindeki tabloların yapısını da değiştirmek gerekebilir. Bu amaç için: ALTER TABLE ifadesi kullanılır. MySQL ile bir tabloda istediğiniz kadar değişiklik yapabilirsiniz. Değiştirme cümleciklerinin her biri tablonun farklı yönlerini değiştirmek için kullanılabilir. Alter Table nin çeşitli alt kullanımları vardır. Kullanım Formatı: ALTER [IGNORE] TABLE tbl_name alter_specification [, alter_specification]... alter_specification: table_option... ADD [COLUMN] column_definition [FIRST AFTER col_name ] ADD [COLUMN] (column_definition,...) ADD {INDEX KEY} [index_name] [index_type] (index_col_name,...) ADD [CONSTRAINT [symbol]]primary KEY [index_type] (index_col_name,...) ADD [CONSTRAINT [symbol]]unique [INDEX KEY] [index_name] [index_type] (index_col_name,...) ADD [CONSTRAINT [symbol]]foreign KEY [index_name] (index_col_name,...)[reference_definition] ALTER [COLUMN] col_name {SET DEFAULT literal DROP DEFAULT} CHANGE [COLUMN] old_col_name column_definition [FIRST AFTER col_name] MODIFY [COLUMN] column_definition [FIRST AFTER col_name] DROP [COLUMN] col_name DROP PRIMARY KEY DROP {INDEX KEY} index_name DROP FOREIGN KEY fk_symbol DISABLE KEYS ENABLE KEYS RENAME [TO] new_tbl_name ORDER BY col_name [, col_name]... CONVERT TO CHARACTER SET charset_name [COLLATE collation_name] [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name] DISCARD TABLESPACE 35
IMPORT TABLESPACE index_col_name: col_name [(length)] [ASC DESC] index_type: USING {BTREE HASH} 36
Örnek: Müşteri tablosunda adların 25 karaktere kadar uzun olmasına izin verilmiş olsun. Verileri almaya başladıktan sonra bazı isimlerin çok uzun olduğu görülsün. Bu durum, sütunu 50 karakter uzunluğunda olacak şekilde değiştirilerek düzeltilebilir. ALTER TABLE musteri MODIFY ad CHAR(50) NOT NULL; Çok sık ortaya çıkan bir durum, bir sütun ekleme ihtiyacıdır. Örnek: Müşteri tablosunda müşterilerin e-mail adreslerini de almak istediğimizi düşünelim. tablomuzda böyle bir sütun önceden yoktu. Bu durumda yeni bir sütun eklenecektir. ALTER TABLE musteri ADD email CHAR(50) NOT NULL; Eklenen bir sütundan kurtulma isteği de yine çok sık karşılaşılan bir durumdur. Yukarıda eklediğimiz sütunu aşağıdaki gibi silebiliriz: ALTER TABLE musteri DROP email; 37
Örnek: Öğrenci kayıt bilgileri için oluşturulmuş olan ogrenci tablosunun adını ogr olarak değiştirmek için şu kodlar yazılır: ALTER TABLE ogrenci RENAME ogr; Örnek: Bir kirtasiye veri tabanındaki kitap adlı alan adını book olarak değiştirelim: ALTER TABLE kirtasiye CHANGE kitap book VARCHAR(50); DML (Data Manupulation Language) - Veri İşleme Dili komutları: Insert Komutu Bir veri tabanı ile işlem yapabilmek için önce ona veri girmemiz gerekir. Bunu yapmanın en yaygın yolu da MySQL in INSERT komutudur. Bir tablodaki her satır normalde gerçek bir nesne veya ilişkiyi tarif eder ve o satırın sütun değerleri bu gerçek nesne hakkındaki bilgileri depolar. INSERT ifadesini veri tabanına veri satırları eklemek için kullanabiliriz. Kullanım Formatı: INSERT INTO tablo [(kolon, kolon,...)] VALUES (değer-1, değer-2,...) ya da INSERT INTO tablo [(kolon, kolon,...)] SELECT... 38
Örnekler: INSERT INTO musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('özgür', 'Dönmez', 'Arı Koop.2/2 Batıkent', 'Ankara', '06130', '03122560123'); INSERT INTO musteri values (null, ali er, 12.cad no:3 Emek, Ankara, 03123335566 ); INSERT INTO musteri (musteri_no, adsoyad, sehir) values(3, Davut ÖZTÜRK, Mersin ); INSERT INTO iller (cod_il) VALUES (33); INSERT INTO eski_uyeler VALUES('M', 'Karabulut', 'mk@karya.net', '1979-03-29' ); INSERT INTO musteri VALUES ("M. Selcuk Batal", "61", "Refahiye", "Erzincan"); INSERT INTO mus_hesap VALUES ("1471", "100", {05/02/03} ); Bu örneklerdeki değerlerin tümü tek tırnak içine alınmıştır. MySQL deki karakter katarlarının her zaman çift veya tek tırnak içinde olması gerekir. Sayılara ve tarihlere tırnak gerekmez. Insert sözcüğünün sonuna: LOW_PRIOROTY ya da DELAYED eklenebilir. 39
LOW_PRIORITY anahtar sözcüğü, sistemin bekleyip verileri daha sonra tablodan okunmadıkları sırada girilebileceği anlamına gelir. DELAYED anahtar sözcüğü, girilen verilerinizin tampon belleğe alınacağı anlamına gelir. Sunucu meşgulse insert işleminin tamamlanmasını beklemek zorunda kalmadan sorgu çalıştırmaya devam edebilirsiniz. SELECT Komutu SQL'de sorgulama işlemleri, SELECT deyimi yardımıyla yerine getirilir. SELECT deyimi temel olarak üç farklı işlemi yerine getirmek için kullanılır: Seçme İşlemi (Select): Bir tablodaki satırları seçme işlemidir. Bunun için çeşitli seçme kriterleri kullanılabilir. Atma İşlemi (Projection): Bir tablodaki belirli sütunların seçilmesi işlemidir. Birleştirme İşlemi (Join): Bir tablonun içinde yer alan sütunların (ya da birden fazla tablonun belirlenen sütunlarının ilişkiler yardımıyla) birleştirilmesi. SELECT deyimi en basit biçimde şu şekilde ifade edilmektedir; SELECT [DISTINCT] { * sütun,...} FROM tablo; Tanım içinde bazı SQL anahtar kelimelerine yer verilmektedir. Bu anahtar kelimeler, SQL 'in kendi özel kelimeleridir ve aynen bu şekilde ifade edilmelidir. SELECT: SQL'in sorgulama deyimidir. FROM: Hangi tablonun sorgulanacağını ifade eder. DISTINCT: Çift kayıtları önleyen anahtar kelimedir. 40
Örnek: 41
Örnek: Örnek: 42
Örnek: Örnek: 43
Örnek: Örnek: 44
Verinin Sınırlandırılması Veri tabanını sorgularken, satırlara bazı kısıtlamalar koyarak sorgulanan tablonun tüm satırları yerine belirli bir kısmı geri döndürülebilir. Bu işlem için SELECT deyimi içerisinde WHERE ifadesi kullanılır. SELECT [DISTINCT] {* sütun,...} FROM tablo [WHERE KOŞUL]; Örnek: WHERE sözcüğü içinde tanımlanan kısıtlama ifadelerinde, çeşitli karşılaştırma işleçleri kullanılabilir. <> Eşit Değil <= Küçük veya Eşit >= Büyük veya Eşit < Küçük > Büyük = Eşit 45
Örnek: Diğer Karşılaştırma İşleçleri Şu ana kadar öğrendiğimiz karşılaştırma işleçleri dışında, bazı özel amaçlarla kullanılabilecek başka karşılaştırma işleçleri de bulunmaktadır. Şimdi bu işleçleri ve anlamlarını inceleyelim; BETWEEN... AND... : İki değer arasındaki karşılaştırma. IN (liste) : Liste içindeki değerlerle karşılaştırma. LIKE: Bir karakter katarı ile karşılaştırma. IS NULL: Bir NULL değer ile karşılaştırma. 46
Örnek: Örnek: 47
Örnek: Örnek: 48
Örnek: Mantıksal İşleçler Koşulları içeren karşılaştırma işlemlerinde mantıksal işleçlere de yer verilebilir. Bu işleçlerden; AND ve OR iki koşulu birlikte değerlendirmek üzere kullanılırlar. AND : Her iki koşulun değeri TRUE ise, sonuç olarak TRUE döndürür. OR : Koşulların herhangi birinin değeri TRUE ise, sonuç olarak TRUE döndürür. NOT : Bu işleci izleyen koşul FALSE ise, TRUE; TRUE ise, FALSE döndürür. 49
Örnek: Örnek: 50
Örnek: İşleçlerin İşlem Sırası WHERE sözcüğü içinde yer alan işleçler, belirli bir sıraya göre işlem görürler. Bu işleçlerin dışında, parantezler de kullanılabilir. Parantezler tüm işleçlere göre bir önceliğe sahiptir. Yani öncelikle parantez içindeki işlemler yapılır, ardından da aşağıdaki işlem sırası uygulanır. 1- Karşılaştırma İşleçleri ( <, >, <=, >= ) 2- NOT 3- AND 4- OR 51
Sıralama İşlemleri Tabloların satırlarının, herhangi bir sütuna göre sıralı olarak elde edilmesi söz konusu ise, SELECT deyimi ORDER BY ifadesi ile birlikte kullanılır. Örnek: 52
Örnek: --- En son burada kaldık.(17.02.2015) ----------------------------------- 53
Fonksiyonlar veya bir başka deyişle işlevler, SQL'e bazı güçlü özellikler katan olanaklar olarak değerlendirilir. SQL fonksiyonları, aynen programlama dillerinde olduğu gibi, kullanıcıya bazı özel işlemleri ve hesaplamaları otomatik olarak sağlar. Bir fonksiyon; çeşitli argümanları girdi olarak alıp bir sonuç üreten hazır bileşenlerdir. Kullanıcının, fonksiyonun adını ve gerekli argümanları tanımlaması yeterlidir.bu bilgilere dayalı olarak fonksiyon, bir sonuç döndürür (üretir). Fonksiyonlar uygulamadan uygulamaya farklılık gösterebilirler. Bu ders kapsamında MySQL veritabanında kullanılan SQL fonksiyonları kullanılacaktır. Tek Satır Fonksiyonları Tek satır fonksiyonları (genelde sadece Fonksiyon olarak adlandırılır), tablonun her bir satırına uygulanan fonksiyonlardır. Tek satır fonksiyonlarının Karakter, Tarih, Sayısal, Dönüştürme gibi birçok türü bulunmaktadır. Fonksiyonların kullanım şekli aşağıda belirtildiği gibidir. Fonksiyon_adı(sütun ifade, [argümanlar]) Fonksiyon: Herhangi bir SQL fonksiyonunu simgeler. Örneğin LCASE bir fonksiyon ismidir. Bu ismi değiştiremeyiz. Sütun: Herhangi bir tabloya ilişkin sütun adı. İfade: Herhangi bir karakter dizisi ya da hesaplama ifadesi. Argümanlar: Fonksiyonla birlikte kullanılabilecek argümanlar. Karakter Fonksiyonları Karakter fonksiyonları; karakter verileri girdi olarak alan, karakter ya da sayısal değerler döndürebilen fonksiyonlardır. Bu fonksiyonların en çok kullanılanlarını şu şekilde sıralayabiliriz; 54
Örnek: 55
Örnek: Örnek: 56
Örnek: Örnek: 57
Sayısal Fonksiyonlar Sayısal veriler üzerinde çeşitli işlemleri gerçekleştirmek üzere özel fonksiyonlar bulunmaktadır. Sayısal fonksiyonlar, sayısal veriler alır ve yine sayısal sonuçlar üretirler. Bu fonksiyonların en çok kullanılanlarını şu şekilde sıralayabiliriz; Örnek: 58
Örnek: 59
Tarih ve Saat Fonksiyonları Tarih ve saat işlemlerinde kullanılan birçok fonksiyon vardır. Bu fonksiyonların en çok kullanılanlarından biri NOW fonksiyonudur. NOW fonksiyonunun herhangi bir argümanı bulunmamaktadır. O andaki tarih ve zaman bilgisini elde etmek amacıyla kullanılır. O anki saat ve tarihi ayrı ayrı alabileceğiniz fonksiyonlar aşağıdaki tabloda yer almaktadır. Dönüştürme Fonksiyonları Karakter, sayısal ve tarih verilerinin birbirlerine dönüştürülmesi ve özellikle biçimlendirme işlemlerinde çeşitli fonksiyonlardan yararlanılır. Bu fonksiyonlardan tarih ve saat bilgisinin formatlanmasında kullanılan DATEFORMAT fonksiyonunun kullanımı aşağıda yer almaktadır. 60
Çoklu Satır Fonksiyonları Tek satır fonksiyonları, tablonun bir satırına uygulanabiliyor ve buna karşılık gelen bir sonuç satırı elde edilebiliyordu. Bir grup satıra bir fonksiyonun uygulanması söz konusu ise; "çoklu satır" ya da bir başka deyişle "grup fonksiyonlarından" söz edilir. Grup fonksiyonları tablonun tüm satırlarına uygulanabildiği gibi, GROUP BY sözcüğü yardımıyla da alt gruplara uygulanabilir. Bir tablonun tüm satırları için grup fonksiyonu uygulanacak ise, SELECT deyimi aşağıda belirtildiği biçimde kullanılır; 61
Örnek: Örnek: 62
Örnek: Örnek: 63
Örnek: Örnek: 64
Alt Sorgular Çoklu Tablolar (Tabloların Birleştirilmesi) Görünümler Alt Sorgular Uygulamada, bir sorgudan elde edilen sonuç, bir diğer sorguyu ilgilendirebilir. Bu gibi durumlarda alt sorgular ya da bir başka deyişleiç sorgular kullanılır. Alt sorgu, SELECT deyimi içerisinde ikinci bir SELECT deyiminin kullanılması ile oluşturulur. İkinci select deyimi parantez içinde yer almalıdır. Alt sorgunun kullanım şekli aşağıda yer almaktadır: Örnek: 65
Çoklu Tablolar (Tabloların Birleştirilmesi) İlişkisel veri tabanı yönetim sistemlerinde bazen ilişkili veriler birden fazla tabloya bölünebilir ve bu tablolarda bulunan verilere aynı anda ihtiyacımız olabilir. Bu gibi durumlarda ilgili tabloları birleştirerek sorgulama yapmak gerekir. Birden fazla tablonun ele alınarak, birleştirilmesi ve tek bir sonucun üretilmesi söz konusu olabilir. Bu işleme "birleştirme denir. Birleştirme işlemi, tabloların aynı değerler içeren sütunları kullanılmak suretiyle yapılır. Birleştirme işlemi şu şekilde tanımlanır; Sütun isimlerinin ön tarafına, tablo isimlerinin yazılması yararlı olacaktır. Özellikle her iki tablodaki sütun isimleri aynı ise, söz konusu sütunların hangi tablodan geldiğini belirtmek mümkün olamayacak ve bu durumda SELECT deyimi çalışmayacaktır. Örnek: 66
Örnek: Görünümler Bir ya da daha fazla tablonun mantıksal alt kümelerini oluşturmak için görünümlerden yararlanılır. Görünümler, bir tabloya dayalı mantıksal bir tablo olarak değerlen dirilir. Görünüm, tablolar gibi veriyi fiziksel olarak saklamaz. Görünümler, saklanmış (depolanmış) SELECT deyimi olarak değerlendirilir. Bir SELECT deyiminin defalarca kullanılması söz konusu ise, onu bir görünüm biçiminde tanımlayarak, bu görünümün çalıştırılması mümkündür. Görünümler aşağıda sıralanan nedenlerle tercih edilir: Görünümler, veri tabanına erişimi sınırlayan olanaklardır çünkü görünüm, tabloların sadece seçilen bir kısmını görüntüleyebilir. 67
Karmaşık sorguların kolayca yapılmasını sağlar. Aynı veriyi kullanan çok sayıda görünüm tanımlanabilmektedir. Görünüm Oluşturma Öğrencilerin danışmanlarının kimler olduğunu döndürecek bir sorguya ihtiyacımız var. Bu sorguya sık sık ihtiyaç duyacağımızı varsayarak SELECT deyimini bir görünüme dönüştürmek istiyoruz. SQL cümleciği aşağıdaki gibi olmalıdır: 68
Görünümü Güncelleştirme Yarattığımız ogda sorgusu içerisinde bir güncelleştirmeye ihtiyacımız var. Sorgu sonrası dönen listenin öğrencinin adına göre alfabetik sıralanmasını istiyoruz. SQL cümleciği aşağıdaki gibi olmalıdır: Görünümü Kaldırma ogda isimli görümünü veritabanımızda daha fazla kullanmak istemiyoruz. SQL cümleciği aşağıdaki gibi olmalıdır: 69