Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 1 Yapısal Sorgulama Dili (SQL) İlişkisel veri tabanı yönetim sistemleri (RDBS) modeli ilk önce 1970 yılında Dr.E. F. Codd tarafından tarif edilmiştir. SQL veya Structured English Query Language (SEQUEL), IBM firması tarafından Codd un modeli kullanılmak için geliştirilmiştir. SEQUEL sonraları SQL olmuştur. 1979 yılında, Relational Software, SQL in ilk ticari uygulamasını geliştirmiştir. Bugün SQL, ilişkisel veri tabanı yönetim sistemleri standardı olarak kabul edilmektedir. SQL, ilişkisel veri tabanlarındaki bilgileri sorgulamak için kullanılan bir dildir. SQL, tüm kullanıcıların ve uygulamaların veri tabanına erişmek için kullandıkları komutlar bütünüdür. Uygulama programları ve veri tabanı araçları kullanıcılara çoğu durumda SQL kullanmadan veri tabanına erişim imkânını sunmaktadırlar fakat bu uygulamalarda geri planda SQL kullanmaktadırlar. Oracle SQL I, standartlara uygundur. Daha da ötesinde, Oracle, SQL standartlarının gelişmesinde motor güç olan bir kurumdur. American National Standarts Institue (ANSI) ve International Standarts Organization (ISO) tarafından belirlenen son SQL standardı, SQL-92 dir. SQL-92 de üç aşamalı uygunluk vardır, İlk seviye (Entry Level) Orta seviye (Intermediate Level) İleri seviyedir (Full Level) SQL, ilişkisel veri tabanları ile uygulamaların diyalogunu sağlamaktadır. SQL temelde verilerle mantıksal seviyede çalışmaktadır. Yani, bir tablodan birkaç kayıt seçebilmek için, o kayıtları seçebilecek bir koşul belirtilir. Koşula uyan tüm kayıtlar bir basamakta gelir ve bunlar kullanıcıya gösterilebildiği gibi, bir başka SQL e veya uygulamaya da gönderilebilir. Kayıtların tek tek nasıl geldiği ve fiziksel olarak veri tabanının neresinde ve nasıl tutulduğu ile SQL ilgilenmektedir. SQL komutları ile 1. Veri sorgulama 2. Bir tabloya kayıt ekleme, değiştirme ve silme 3. Veri tabanı nesneleri (database objects) yaratma, değiştirme ve silme 4. Veri tabanına ve nesnelerine erişimi kontrol etme 5. Veri tabanı bütünlüğünü ve tutarlılığını sağlama işlemleri yapılabilmektedir. SQL komutları bir veya daha fazla satır olabilmektedir. SQL cümlelerinin sonuna noktalı virgül (;) konmaktadır. Birden fazla satır olan komutlarda en son satırın sonuna / işareti isteğe bağlı olarak konabilmektedir. PL/SQL, Oracle in SQL komutlarına yapısal dillere ait özellikleri (begin, end, loop, for, if, elsif, vb.) eklediği kendi standardı olan bir dildir. SQL*Plus, SQL ve PL/SQL komutlarının kullanılabildiği Oracle ürünüdür.
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 2 GĠRĠġ Sql ile gerçekleştirilecek işlemlerde, üzerinde işlem yapılacak olan veri tabanı kütükleri ya da tablolar, bir veri tabanı içinde oluşturulur. Bu veri tabanını oluşturmak için, CREATE DATABASE VERĠ_TABANI_ĠSMĠ; Şeklindeki Sql komutunu kullanmak gerekir. Bu komut belirtilen isimde veri tabanını oluşturur. Daha önceden oluşturulmuş veri tabanlarını görmek için; SHOW DATABASES; Komutu kullanılır. Oluşturulan database üzerinde işlem yapmak için; USE DATABASE_ĠSMĠ; Komutu kullanılır. ÖRNEK-1: Personel bilgileri isminde bir veri tabanı oluşturalım. CREATE DATABASE PERSONEL_BILGILERI; Veri tabanı içerisine, bir işletmenin çeşitli faaliyetleri ile ilişkili aşağıdaki türlerde bilgiler yükleyelim. SICIL_N O SGN O AD I SOYAD I PERSONEL TABLOSU ADRE S DOG_TA R CINSIYE T MAA S BOL_N O YONETICI_N O BOLÜM TABLOSU BOLUM_ADI BOLUM_NO YONETICI_NO BOLUM_NO YER TABLOSU BULUNDUGU_YER PROJE TABLOSU PROJE_ADI PROJE_NO YER BOLUM_NO ÇALIġMA TABLOSU SGNO PROJE_NO SAAT BAGIMLILIK TABLOSU SGNO SICIL_NO CINSIYET DOG_TAR YAKINLIGI PARCA TABLOSU PARCA_NO PARCA_ADI PROJE_NO FIYAT AGIRLIK FIRMA TABLOSU FIRMA_NO ADI ADRES PARCA-FIRMA TABLOSU FIRMA_NO PARCA_NO MIKTAR
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 3 Veri Tipleri (Data Types) Veri tipi SQL komutu Özelliği Sabit uzunluklu karakter CHAR (uzunluk) Sayısal işleme sokulmayacak veriler. Değişken uzunluklu karakter VARCHAR (uzunluk) Buradaki uzunluk max. Uzunluktur. Karakter tipindeki veriler gibidir. Tek fark uzunluk değişkendir. Nümerik tam sayı INTEGER -2147483648 ile 2147483647 arasındaki tam sayılardır. Bellekte 4 Byte lık yer kaplarlar. Ondalık sayı Üstel sayı DECIMAL(x,y) REAL(x,y) ya da NUMERIC (x,y) BOOLEAN(x,y) örnek: 3.1E+17 gibi X sayısının max. hanesayısı y ondalık notadan sonraki hane sayısıdır. x en fazla 20, y ise 0-18 arasındadır. X sayısının toplam hane sayısıdır. max. Değer 20 dir.0.1e-307 ile 0.9E+308 arasındaki değerleri alabilir. Tarih türü veriler DATE Tarih türü veriler için işlem yapmayı sağlar. Mantıksal veri LOGICAL Doğru (true. T.) ya da yanlış (false. F.) şeklinde değer alabilen veriler için kullanılır. Zaman türü veriler TIME Ssddsnsn şeklindeki veriler için kullanılır. Tarih ve zaman türü veriler TIMESTAMP Tarih ve zaman türü verilerin bir karışımı şeklinde kullanılan veriler içindir. Grafik türü veriler GRAPHIC(n) N adet 16 bitlik karakterden oluşan bir sabit uzunluklu bilgi tanımlamak için kullanılır. Değişken uzunluklu grafik türü veri VARGRAPHIC(n) N adet 16 bitlik karakterden oluşan değişken uzunluklu bir bilgi tanımlamak için kullanılır.
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 4 TABLO OLUġTURMA Tabloların oluşturulması için CREATE TABLE TABLO_ĠSMĠ (ALANLAR VE ÖZELLĠKLERĠ); Komutu kullanılır. ÖRNEK-2: Giriş bölümünde verilen tabloların oluşturulması; PERSONEL TABLOSU CREATE TABLE PERSONEL (SICIL_NO INTEGER NOT NULL, SGNO VARCHAR(8) NOT NULL, AD VARCHAR(10) NOT NULL, SOYAD VARCHAR(10) NOT NULL, DOG_TAR DATE, ADRES VARCHAR(50), CINSIYET BOOLEAN, MAAS NUMBER(13,2), BOL_NO INTEGER, YONETICI_NO VARCHAR(8)); CREATE TABLE PARCA (PARCA_NO INTEGER, PARCA_ADI VARCHAR(15), PROJE_NO INTEGER, FIYAT NUMBER(13,2), AGIRLIK INTEGER); FIRMA TABLOSU CREATE TABLE FIRMA (FIRMA_NO INTEGER, FIRMA_ADI VARCHAR(20), ADRES VARCHAR(20)); BOLÜM TABLOSU CREATE TABLE BOLUM (BOLUM_ADI VARCHAR(15), BOLUM_NO INTEGER, YONETICI_NO VARCHAR(8)); PARÇA FĠRMA TABLOSU CREATE TABLE PARCA_FIRMA (FIRMA_NO INTEGER, PARCA_NO INTEGER, MIKTAR INTEGER); YER TABLOSU CREATE TABLE YER (BOLUM_NO INTEGER, BULUNDUGU_YER VARCHAR(15)); PROJE TABLOSU CREATE TABLE PROJE (PROJE_ADI VARCHAR(15), PROJE_NO INTEGER, YER VARCHAR(15), BOLUM_NO INTEGER); ÇALIġMA TABLOSU CREATE TABLE CALISMA (SGNO VARCHAR(8), PROJE_NO INTEGER, SAAT INTEGER); BAĞIMLILIK TABLOSU CREATE TABLE BAGIMLILIK (SGNO VARCHAR(8), SICIL_NO INTEGER, CINSIYET BOOLEAN, DOG_TAR DATE, YAKINLIGI VARCHAR(10)); PARÇA TABLOSU
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 5 TABLOLARDA DEĞĠġĠKLĠK YAPMA TABLOYA VERĠ GĠRĠġĠ (INSERT) SQL de, mevcut bir tabloya veri eklemek için kullanılacak olan komut INSERT komutudur. Standart SQL de, oluşturulan bir tabloya veri yüklemek için tek imkân INSERT komutudur. INSERT komutu ile tabloya, belli bir anda, tek bir satır eklemek imkânı vardır. INSERT komutunun yazılış biçimi aşağıdaki gibidir: INSERT INTO TABLO ADI(SÜTUN ADI1, SÜTUN ADI2,..SÜTUN ADI(N)) VALUES (DEĞER1, DEĞER2,...DEĞER(N)); ÖRNEK-3: Personel tablosuna, sicil no su 275 olan personel ile ilişkili bilgiler aşağıdaki gibi bir INSERT komutu ile yüklenebilir INSERT INTO PERSONEL (SICIL_NO, SGNO, ADI, SOYADI, DOG_TAR, ADRES, CINSIYET, MAAS, BOL_NO, YONETICI_NO) VALUES ( 275, 27652418, ALĠ, CANER, 1962/05/01, MERKEZ CAD. 46-FATĠH-IST,1, 27000000, 2, 876215342 ); Karakter türü verilen sembolleri arasına yüklendiğine, diğer veriler içinse buna gerek olmadığına dikkat ediniz. Burada, tabloya tüm kolonlarla ilgili veri yüklendiği için, istenirse kolon isimleri ihmal edilebilir. Standart SQL deki INSERT komutunun, belli bir anda, tabloya, tek bir satırı eklemesine karşılık, birçok SQL gerçekleştiriminde, yığın halinde veri yükleyen hizmet programlarından (utility) faydalanmak imkânı da vardır. Ayrıca, INSERT komutunun bu şekli ile tabloya veri yüklemek pratikte tercih edilebilecek bir şekil değildir. (Her tablo satırı için bir INSERT komutu kullanılıyor) Daha kullanışlı olan yol, verilerin kullanıcın zorlanmayacağı bir ekran düzeni ile klavyeden yüklenmesi daha bunların INSERT ile tabloya yerleştirilmesidir. SQL de ekrandan interactive bilgi girişi ve ekran tasarımı sağlayacak komutlar yoktur. Fakat SQL in bir veri tabanı yönetim yazılımının (dbase, FoxPro, ORACLE) ya da bir üst düzey dilinin (C, Pascal, COBOL, vb.) interactive bilgi girişine uygun komutlarını kullanarak bu işlemi arzu edilen kalitede gerçekleştirmesi mümkündür. SQL in diğer dillerle etkileşimi daha sonra incelenecektir. TABLO SATIRLARINI SĠLME (DELETE) Bir tablonun satırlarını silmek için gerekli komut DELETE komutudur. Satır silme koşullu veya koşulsuz olarak gerçekleştirilebilir. DELETE FROM PERSONEL; 25 ROWS DELETED Bu komut ile personel tablosundaki tüm satırlar silinecektir. 25 Rows Deleted Mesajı ile o anda tabloda bulunan 25 satırın silindiği bildirilmektedir. Koşula bağlı olarak satır silmenin de mümkün olduğunu söylemiştik. Bunu gerçekleştirmek için, DELETE komutuna WHERE sözcüğü eklenmeli ve bunu izleyen ifade koşulu göstermelidir. DELETE FROM PERSONEL WHERE BOL_NO=2; 5 ROWS DELETED Bu komut ile 2 numaralı bölümdeki personelin tümü tablodan silinecektir. Rows Deleted Mesajı ile de, o anda 2 numaralı bölümde çalışan 5 personele ait satırların silindiği belirtilmektedir. Aşağıdaki örnekte ise maaş alanı boş olmayan tüm personel silinmektedir: DELETE FROM PERSONEL WHERE MAAS IS NOT NULL; 25 ROWS DELETED
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 6 TABLO SATIRLARINI GÜNCELLEME (UPDATE) PERSONEL adlı tabloda sicili 27251 olan kişinin maaşını 37000000 olarak değiştirmek için UPDATE PERSONEL SET MAAS =37000000 WHERE SICIL_NO =27251; 2 inci bölümün yürüttüğü projelerde kullanılan tüm parçaların fiyatlarını % 7 zam yap UPDATE PARCA SET FIYAT = FIYAT *1,07 WHERE PR_NO IN (SELECT PROJ_NO FROM PROJE WHERE BL_NO = 2; TABLONUN YAPISINDA DEĞĠġĠKLĠK YAPMA ALTER TABLE KOMUTU ALTER TABLE komutu ile bir tablonun yapısında değişiklik yapmak mümkündür. Bu değişiklikler tabloya yeni bir kolon ekleme ADD komutu, mevcut kolonun özelliklerini değiştirme MODIFY komutu ile kolon genişliğini değiştirme yada kolondaki verinin NULL yada NOT NULL özelliğini değiştirme,tablodan kolon silme DROP,Mevcut kolonun adını değiştirme RENAME yada tablonun adını değiştirme RENAME TABLE öelliklerinin tamamı ALTER TABLE komutu içinde mevcuttur. Personel tablosuna işe başlama tarihi adında kolon ekleyiniz. ALTER TABLE PERSONEL ADD IS_BAS_TAR DATE; Daha önce proje adlı tabloda VARCHAR(15) olan alanı 25 olarak genişletiniz. ALTER TABLE PROJE MODIFY YER VARCHAR(25); Personel tablosundan IS_BAS_TAR kolonunu siliniz. ALTER TABLE PERSONEL DROP IS_BAS_TAR; Personel tablosunun adını elemanlar olarak değiştiriniz. ALTER TABLE PERSONEL RENAME TABLE ELEMANLAR; Personel tablosunda Maas alanını Brut olarak değiştiriniz. ALTER TABLE PERSONEL RENAME MAAS BRUT; Proje adlı tabloyu siliniz. DROP TABLE PROJE; Temel SQL Sorgulamaları SELECT Komutu Tablodan gerekli bilgileri elde edebilmek için sorgulama komutu SELECT * FROM PERSONEL; Şeklindedir. Bu komut, personel adlı tablo içindeki tüm bilgileri koşulsuz olarak listeleyecektir. SELECT sözcüğünü izleyen kısımda * sembolünün bulunması ilgili tablodaki tüm sütun isimlerinin ve ilgili bilgilerin listelenmesini sağlayacaktır. SELECT SICIL_NO, SGNO, ADI, SOYADI, DOG_TAR, ADRES, CINSIYET, MAAS BOL_NO, YONETICI_NO FROM PERSONEL; Şeklinde olan komut da SELECT sözcüğünden sonra gelen kısımda sütun adları, FROM sözcüğünden sonra gelen kısımda ise tablo ismi yer almaktadır. Tekrarlı Satırların Ortadan Kaldırılması (DISTINC) Tablo içinde birbirinin aynı veri içeren satırlara müsaade edilir. Birbirinin aynı olan satırların listeleme esnasında bir kez yazılması için SELECT komutuna DISTINC sözcüğü eklenir. SELECT DISTINC FIRMA_NO FROM PARCA_FIRMA; Bu komut ile parca_firma adlı tablodan firma numaraları tekrarsız olarak listelenecektir.
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 7 Tablo Bilgilerinin SıralanmıĢ Olarak Listelenmesi (ORDER BY) Tablodan listelenecek bilgilerin belirli bir sütun adına göre sıralanmış olarak görüntülenmesi için SELECT komutuna ORDER BY sözcüğü ilave edilir. ÖRNEK-4: Personel tablosundaki bilgilerin sicil_no, adi, soyadi ve maaş sütunlarını maaşa göre sıralı olarak listeleyiniz, SELECT SICIL_NO, ADI, SOYADI, MAAS FROM PERSONEL ORDER BY MAAS ASC; ASC sözcüğü artan anlamındadır. Veriler azalan sırada büyükten küçüğe ya da alfabetik olarak Z den A ya sıralanmak istense idi bu sözcük yerine DESC kullanılacaktı. Birden Çok Alana Göre Sıralama (ORDER BY) Bir tablo içindeki verileri aynı anda birden çok sütuna göre sıralamak da mümkündür. ÖRNEK-5: Personel tablosundaki sicil_no, adi, soyadi ve maaş sütunlarını adi ve maas a göre listeleyiniz, SELECT SICIL_NO, ADI, SOYADI, MAAS FROM PERSONEL ORDER BY ADI, MAAS; Burada tablo öncelikle ada göre artan sırada sıralanacak, sadece aynı ada sahip olanlar kendi aralarında MAAS A göre artan sırada sıralanacaklardır. Ada ve maaşa göre sıralama çıktısı; SICIL_NO ADI SOYADI MAAS 1215 Ali Can 2000000 3712 Ali Okan 6000000 8145 Birol Çelen 8500000 3712 Birol Akın 4000000 Burada çok sayıda alana göre sıralama, farklı sıralama kriterlerine göre gerçekleştirilebilir. KoĢula Bağlı Olarak Listeleme SELECT komutu ile bir tablonun satırları içinden sadece verilen bir koşulu sağlayanlar listelenebilir. ÖRNEK-6: Maaşı 5000000 dan fazla olan personel listelenmek istenirse SELECT komutu aşağıdaki gibi yazılmalıdır SELECT * FROM PERSONEL WHERE MAAS > 5000000; Burada WHERE sözcüğünü izleyen kısımda koşul belirtilmektedir. Koşul belirtilirken iki veri birbiri ile karşılaştırılmaktadır. SQL içinde verileri çeşitli açılardan karşılaştırmak için karşılaştırma operatörleri kullanılmaktadır. Karşılaştırma ifadesinde karşılaştırılacak verilerin türleri aynı olmalıdır. KarĢılaĢtırma Operatörleri Operatör Anlamı < den küçük > den büyük = Eşit <= Küçük veya eşit >= Büyük veya eşit <> Eşit değil!= Eşit değil Birden Çok KoĢula Dayalı Sorgulamalar (Not, And, Or) Not, And ve Or mantıksal operatörleri yardımı ile birden çok koşulun gerçekleştirilmesine bağlı olarak ifade edilebilecek karmaşık ya da bileşik koşulu ile listelemeleri gerçekleştirmek mümkündür. ÖRNEK-7:
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 8 Maaşı 5000000 TL den fazla olan ve cinsiyeti erkek olan personelin listelenmesi gibi bir işlemde söz konusu personel için iki koşul verilmekte ve her ikisinin de gerçekleşmesi istenmektedir. 1.koşul: Maaşın 5000000 TL den fazla oluşu 2.Koşul: Cinsiyetin ERKEK olması SELECT * FROM personel WHERE MAAS > 5000000 AND cins =.T. ; Koşul.T..F. NOT Operatörü NOT Koşul.F..T. AND OPERATÖRÜ 1.Koşul 2.Koşul 1.koşul AND 2.koşul.T..T..T..T..F..F..F..T..F..F.F..F. OR OPERATÖRÜ 1.Koşul 2.Koşul 1.Koşul AND 2.koşul.T..T..T..T..F..T..F..T..T..F.F..F. ÖRNEK-8: Doğum tarihi 1960 dan önce olan ve maaşı 6000000-10000000 arasında olan bayan personelin listesi, SELECT *FROM PERSONEL WHERE DOG_TAR < 1960/01/01 AND MAAS >=6000000 AND MAAS <= 10000000 AND CINSIYET =1; ÖRNEK-8: Satış bölümü ile muhasebe bölümündekiler kimlerdir? Satış bölümünün BOL_NO sunun 1 ve muhasebe bölümünün BOL_NO sunun 2 olduğunu varsayarsak; SELECT *FROM PERSONEL WHERE BOL_NO =1 OR BOL_NO =2; Bir Veri Kümesi Ġçinde Arama IN Operatörü Aşağıda vereceğim örnek sorunun cevabını şu ana kadar anlattığım SQL komutları ile gerçekleştirebiliriz ÖRNEK-9: BOL_NO su 1,2 ya da 3 olan personeli listeleyiniz. SELECT *FROM PERSONEL WHERE BOL_NO=2 OR BOL_NO=2 OR BOL_NO=3; Fakat SQL de bu işlemi gerçekleştirmenin daha kısa bir yolu vardır IN sözcüğü SELECT *FROM PERSONEL WHERE BOL_NO IN (1,2,3) ; Bu komut OR ile düzenlenen 1. SELECT cümlesine denktir. Fakat belirtildiği gibi daha kısa ve anlaşılır bir ifade oluşmaktadır. IN operatörü NOT ile birlikte kullanılabilir. Aralık Sorgulaması BETWEEN Sözcüğü ÖRNEK-10: Maaşı 5-10 Milyon arasında olan personel kimlerdir? SELECT *FROM PERSONEL WHERE MAAS >=5000000 AND MAAS <=10000000; Aynı soruya daha kısa ve daha etkin bir cevap verilecek olursa BETWEEN sözcüğü kullanılır. SELECT *FROM PERSONEL WHERE MAAS BETWEEN 5000000 AND 10000000;
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 9 Karakter Türü Bilgi Ġçinde Arama Yapma LIKE Sözcüğü Personel tablosu içinde adres alanı 50 karakter uzunluğunda karakter türü olarak tanımlanmıştı. Adres bilgisinin aşağıdaki şekilde verildiğini varsayalım; Cumhuriyet Cad. 46/9 Taksim-Ġstanbul. Burada adres içinde, semtin de belirtildiğini ve bunun ayrı bir sütun olmadığına dikkat çekelim. Şimdi belirli bir semtte ikamet eden personeli listelemek istersek semt adını, adres alanı içinde aramak gerekecektir. Bu işlemi gerçekleştirmek için LIKE sözcüğü kullanılır. SELECT *FROM PERSONEL WHERE ADRES LIKE % TAKSĠM % ; Bu komut ile Taksim semtinde ikamet eden personel listelenmek istenmektedir. Bu komut gerçekten de Taksim de oturan personeli listeleyecektir. Ama bu arada Taksim Caddesi 22-7 Kadıköy - Ġstanbul Şeklindeki adresleri de listeleyecektir. ADRES LIKE % TAKSĠM % İfadesi adres içinde Taksim i arayacaktır. Adres içinde herhangi bir yerde bulduğu takdirde bu satırı listeleyecektir.% sembolü Taksim sözcüğünün öncesinde ve sonrasındaki karakterler ne olursa olsun anlamındadır. Yukarıdaki LIKE ifadesi Taksim Cad.81-Fatih şeklindeki Taksim in en başta ve en sonda olduğu adresleri listeleyecektir. LIKE sözcüğünü, alt çizgi (_) sembolü ile birlikte de kullanmak da mümkündür. ARĠTMETĠKSEL ĠFADELER VE FONKSĠYONLAR Aritmetiksel ifadeler SELECT komutu ile veri tabanında mevcut tablolardan listeleme yaparken, tabloda ayrı bir sütun olarak yer almamış ve ancak bir hesaplama sonucunda üretilebilecek bilgileri de liste içine katmak mümkündür. Aşağıdaki SELECT komutu ile personelin şu anda geçerli olan maaşı ile bu maaşın %32 zamlı şekli listelenmektedir: SELECT ADI, SOYADI, MAAS, MAAS*1.32 FROM PERSONEL; Hesaplanmış alanları elde etmek için oluşturulacak aritmetiksel ifadelerde, aşağıda belirtilen tablodaki sembollerden yararlanılır. Sql de Aritmetiksel Semboller Operatör İşlevi ** veya ^ Üs alma * Çarpma / Bölme + Toplama - Çıkarma Öncelik sırası matematikte ve diğer bilgisayar dillerinde olduğu gibidir. Üs alma hepsinden önceliklidir. Sonra * ve / gelir. * ve / aynı önceliğe sahiptir. + ve en son önceliklidir. Parantezler kullanılarak öncelik sırası değiştirilebilir. Kümeleme Fonksiyonları SQL, tablo içinden çeşitli matematiksel işlemlerin sonucunu otomatik olarak üretmeyi sağlayan fonksiyonlara sahiptir. Bu fonksiyonlar örneklerle birlikte aşağıda verilmiştir. SUM Fonksiyonu Fonksiyonun argümanı olarak belirtilen sütun ile ilişkili olarak toplama işlemini gerçekleştirir. ÖRNEK-11: İşletmedeki personelin MAAS maaşları toplamı ne kadardır? SELECT SUM (MAAS) FROM PERSONEL; ÖRNEK-12: Bilgi işlem bölümündekilerin toplam maaşı ne kadardır? Bilgi işlem bölümünün bölüm numarasını 5 olarak kabul edelim.
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 10 SELECT SUM ( MAAS) FROM PERSONEL WHERE BOL_NO=5; İfadesi ile sonuç elde edilebilir. Sonuç sadece bilgi işlem bölümündekilerin maaşlarının toplamı olacaktır. ÖRNEK-13: Satış, muhasebe ve bilgi işlem bölümlerindeki personelin maaşları toplamı nedir? Satış bölümü için, böl_no 1, muhasebe için 2 ve bilgi işlem için 5 olarak alınırsa SELECT SUM (MAAS) FROM PERSONEL WHERE BOL_NO IN (1,2,5); ÖRNEK-14: Maaşları 5000000 TL nin altında olan bayan personelin maaşları toplamı nedir? Bayan personeli, daha önceden cins alanına 0(sıfır) yerleştirerek kodlamış isek SELECT SUM(MAAS) FROM PERSONEL WHERE CINSIYET=0. AND MAAS < 5000000; AVG Fonksiyonu Aritmetiksel ortalama hesaplamak için kullanılır. SELECT AVG (MAAS) FROM personel; Komutu, işletmedeki ortalama maaşı hesaplayarak görüntüleyecektir. Bu fonksiyon ile de, koşula bağlı olarak hesaplatma yaptırılabilir. ÖRNEK-15: Bilgi işlem bölümündekilerin maaş ortalamaları ne kadardır? Bilgi işlem bölümünün BOL_NO su 5 ise SELECT AVG (MAAS) FROM PERSONEL WHERE BOL_NO =5 MAX Fonksiyonu Tablo içinde, belirtilen sütun (alan) içindeki en büyük değeri bulur. ÖRNEK-16: İşletme içindeki en yüksek maaş ne kadardır? SELECT MAX (MAAS)FROM PERSONEL; ÖRNEK-17: Bilgi işlem bölümündeki en yüksek maaş ne kadardır? SELECT MAX (BRUT)FROM PERSONEL WHERE BOL_NO=5; ÖRNEK-18: Bayan personel içinde en yüksek maaş ne kadardır? SELECT MAX (MAAS)FROM PERSONEL WHERE CINSIYET=0 ; MIN Fonksiyonu Tablo içinde, belirlenen sütun içindeki en küçük değeri bulur. ÖRNEK-19: İşletme içinde 4 Mayıs 1970 den önce doğanlar için asgari ücret nedir? SELECT MIN (MAAS ) FROM PERSONEL WHERE DOG_TAR < 1970/05/04 ; COUNT Fonksiyonu Tablo içinde herhangi bir sayma işlemi gerçekleştirmek için kullanılır. ÖRNEK-20: Personel tablosunda kaç satır vardır? (Bu her satırda farklı bir personel olduğu düşünülürse personel sayısı anlamına da gelmektedir.) SELECT COUNT (*) FROM PERSONEL; Bu koşula bağlı olarak da saydırma yapmak mümkündür. ÖRNEK-21: Ücreti 6000000 dan fazla olan personel sayısı nedir? SELECT COUNT (*) FROM PERSONEL WHERE MAAS > 6000000 ; COUNT fonksiyonu, DISTINCT sözcüğü ile de kullanılabilir.
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 11 ÖRNEK-22: Personel tablosunda mevcut personelin, işletme içinde kaç tane farklı bölümde çalıştığı bulunmak istenirse aşağıdaki SELECT komutu kullanılabilir. SELECT COUNT ( DISTINC BOL_NO) FROM PERSONEL; COUNT komutunda, * argümanının kullanılması, tüm sütunların (alanların) işleme sokulmasını, alan adının belirtilmesi ise (COUNT (böl_no) gibi), sadece belirtilen sütunun işleme sokulmasını sağlar. Gruplandırarak iģlem yapma Yukarıda anlatılan fonksiyonları, tablodaki bilgileri, bazı özelliklere göre gruplandırarak bu gruplandırılmış veri üzerinde de uygulama yapmak mümkündür. Bu işlem GROUP BY sözcükleri ile gerçekleştirilmektedir. ÖRNEK-23: Her bölümdeki ortalama maaş nedir? Burada istenen, bölümler bazında ortalama maaş olduğuna göre, personel tablosundaki satırlar, bölüm numaralarına göre (böl_no) gruplandırılarak her bir grubun maaş ortalaması ayrı ayrı hesaplanarak listelenebilir. SELECT BOL_NO, AVG (MAAS) FROM PERSONEL GROUP BY BOL_NO; SONUÇ Böl_no AVG (MAAS) 1 2500000 2 6800000 3 7400000 4 12500000 ÖRNEK-24: Her bölümdeki en yüksek maaşı olan kişiler listelenmek istenirse, aşağıdaki komut kullanılabilir: SELECT BOL_NO, MAX (MAAS), ADI, SOYADI FROM PERSONEL GROUP BY BOL_NO ; Peronel tablosundaki bilgiler : MAAS Ad soyad Böl_no 5000000 Ali Can 1 3000000 Ayşe Okan 1 8000000 Akın Oran 2 10000000 Rana Şensoy 2 Şeklinde ise yukarıdaki SELECT komutunun çıktısı Böl_no Max_MAAS Ad Soyad 1 5000000 Ali Can 2 10000000 Rana Şensoy Şeklinde olacaktır. Gruplandırarak kümeleme fonksiyonlarını uygularken koşul da verilebilir. Bu durumda grup üzerindeki hesaplamalarla ilgili koşul belirtilirken HAVING sözcüğünü kullanmak gerekir. ÖRNEK-25: En yüksek maaşın 9000000 dan fazla olduğu bölümlerdeki personele ait ortalama maaşları listeleyiniz. SELECT BOL_NO, AVG (MAAS) FROM PERSONEL GROUP BY BOL_NO HAVING AVG (MAAS) > 9000000; Personel tablosunda şu bilgiler mevcut olsun : Böl_no MAAS 1 6000000 1 17000000 2 7500000 2 8000000 3 12000000
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 12 3 11000000 1 14000000 1 18000000 Yukarıdaki SELECT komutu sonrasında Böl Avg_MAAS 1 13750000 3 11500000 Tablosu elde edilecektir. HAVING sözcüğü SELECT komutunda GROUP BY sözcükleri bulunmadığı zaman geçersizdir. HAVING sözcüğünü içeren ifade içinde SUM, COUNT, (*), AVG, MAX, MIN gibi diğer kümeleme elemanlarından en az biri bulunmalıdır. WHERE sözcüğü bir tablonun tek tek satırları üzerinde işlem yapan koşullar için geçerli iken, HAVING sözcüğü sadece gruplanmış veriler üzerindeki işlemlerde geçerlidir. Bazı durumlarda HAVING ve WHERE sözcükleri birlikte SELECT komutu içinde kullanılabilir. ÖRNEK-26: Personel tablosu içinde her bölümde erkek personele ait maaşlar için ortalamanın 9000000 den fazla olduğu bölümleri listeleyiniz. SELECT BOL_NO, AVG (MAAS) FROM PERSONEL WHERE CINSIYET =.T. GROUP BY BOL_NO HAVING AVG (MAAS) >9000000 ; Personel tablosunda aşağıdaki bilgiler olsun Böl_no MAAS Cins 1 6000000.T. 1 17000000.F. 2 7500000.F. 2 8000000.F. 3 12000000.T. 3 11000000.F. 1 14000000.T. 1 18000000.T. Yukarıda uygulanan SELECT komutu, her bölümdeki erkek personele ait ortalama MAAS maaşı hesaplayacak (erkek personel 1 ile belirlenmiştir.) ve erkek personel maaş ortalaması 9000000 den yüksek olan bölümler listelenecektir. Komutun çıktısı aşağıdaki gibidir Böl_no Avg_MAAS 1 12666666.67 3 12000000 BĠRDEN FAZLA TABLOYU ĠLĠġKĠLENDĠREREK SORGULAMA BirleĢtirme ( JOIN ) ĠĢlemi Birleştirme işlemini anlayabilmek için konumuzun başında anlattığımız personel ve bölüm tablolarının içinde yer alan bölümleri hatırlayalım. Personel Tablosu: SICIL_NO, SGNO, ADI, SOYADI, DOG-TAR, ADRES, CINSIYET, MAAS, BOL_NO, YONETICI_NO Bölüm Tablosu: BOLUM ADI, BOL_NO, YONETICI_NO sundan oluşuyordu Bu tablolar ile ilişkili olarak aşağıdaki soruyu soralım: ÖRNEK-27:
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 13 Çalışan her personel ve bu personelin yöneticisi ile ilişkili bilgiler nelerdir? Belirli bir personel ile ilişkili bilgiler personel tablosunun o personele ait satırında mevcuttur. Ancak personelin yöneticisi ile ilişkili bilgilerin bir kısmına ise bölüm tablosundan erişilebilir. Bu durum zorunlu olarak personel ile bölüm tabloları arasında ilişki kurulmasını gerektirir. Bu ilişki ancak müşterek bir alan yardımı ile kurulabilir. Müşterek alan burada bölüm numarasıdır ve personel tablosunda böl_no, bölüm tablosunda ise bölüm_no adı ile yer almaktadır. Müşterek alana göre personel ve bölüm tablolarının birleştirilmesi ( JOIN ) demek, her iki tablodaki tüm sütunları içeren yeni bir tablo oluşturmak demektir. Yalnız bu tabloda sadece her iki tabloda da mevcut olan bölüm numaraları ile ilişkili satırlar yer alacaktır. Birleştirme işlemi ile listeleme aşağıdaki SQL komutu ile gerçekleştirilmektedir SELECT *FROM PERSONEL, BOLUM WHERE PERSONEL. BOL_NO =BOLUM. BOLUM_NO; İlişkilendirme kolayca görülebileceği gibi WHERE PERSONEL. BOL_NO = BOLUM. BOLUM_NO Tablo adı Kolon adı İfadesi ile sağlanmaktadır. Aşağıdaki örnek veri için bu JOIN işlemi sonucu, aşağıdaki tabloda görülmektedir. PERSONEL TABLOSU SICIL_NO SGNO ADI SOYADI DOG_TAR ADRES CĠNSĠYET MAAS BOL _NO YONETICI_ NO 112 27641 Ali Can 60/05/01 Fatih 1 8000000 1 037165 175 3777654 Ayşe Şen 65/07/04 Kadıköy 0 7000000 1 037165 217 176241 Akın Öncel 64/07/11 Üsküdar 1 6000000 2 277143 517 27615 Can Öner 65/08/05 Fatih 1 4000000 2 277143 618 57253 Beril Meral 62/07/08 Pendik 0 3750000 2 277143 1540 44721 Ayşe Cansu 63/08/07 Beşiktaş 0 4800000 3 577211 BOLUM TABLOSU BOLUM_ADI BOLUM_NO YONETICI_NO IS_BAS_TAR Satış 1 037165 89/07/01 Muhasebe 2 277143 91/08/02 Üretim 3 577211 92/06/04 Eğitim 4 443421 91/05/01 Bilgi işlem 5 288111 92/02/05 Personel ve bölüm tablolarının müşterek alan olan bölüm numarası üzerinde JOIN birleştirme işlemine tabi tutulması sonucu elde edilen bilgi sadece her iki tabloda da aynı bölüm numaralarına ait satırlar alınarak birleştirilmiş ve her iki tablonun alanlarından oluşan büyük bir tablo halinde listelenecektir. UNION Sözcüğü UNION sözcüğü küme birleştirme işlemi görür. İki ayrı SELECT komutunun sonucunda elde edilen tabloların birleşimi işlemini görür. ÖRNEK-28: Adı Ahmet ve soyadı Caner olan kişi ve kişileri işletmenin yürüttüğü projelerde çalışan kişi olarak bulunduran projelerin isimlerini ve projelerin yürütüldüğü yerleri listeleyiniz. ( SELECT PROJE_ADI, YER FROM PROJE, BOLUM, PERSONEL WHERE BOL_NO=BOLUM_NO AND YONETICI_NO SGNO AND ADI= AHMET AND SOYADI = CANER ) UNION ( SELECT PROJE_ADI, YER FROM PROJE, CALISMA, PERSONEL WHERE PROJE_NO =PROJE_NO AND SGNO =SGNO AND ADI= AHMET AND SOYADI = CANER )
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 14 UNION sözcüğü ile iki ya da daha çok SELECT in sonucu olan tabloların küme birleşimi işlemine tabi tutulması için iki koşul gereklidir. SELECT komutları sonucunda elde edilecek tablolar aynı sayıda kolon içermelidirler. 1.SELECT Sonuç tablosu 2.SELECT Sonuç tablosu Sonuç tablolarının karşılıklı olarak kolonları aynı veri tipi ve aynı genişlikte olmalıdır. ANY Sözcüğü ÖRNEK-29: Satış bölümünde çalışan personelin herhangi birinden daha düşük maaş alan ve mühendislik bölümünde çalışan kişileri listeleyiniz; SELECT * FROM PERSONEL WHERE MAAS < ANY ( SELECT MAAS FROM PERSONEL WHERE BÖL_NO =2) AND BOL_NO =1; Bu çözümün eşdeğer ifadesi şöyledir; SELECT *FROM PERSONEL WHERE MAAS < ( SELECT MAX (MAAS) FROM PERSONEL WHERE BOL_NO =2) AND BOL_NO =1; Burada satış bölümü kodu 2 ve mühendislik bölümü kodu ise 1 olarak kabul edilmiştir. İkinci çözüm ifadesinden de anlaşılacağı gibi iç içe SELECT ifadesinde içteki SELECT sorgulaması sonucun; 2. Bölümde çalışan personelin içinde en yüksek maaş alan kişinin maaşı bulunmakta dıştaki SELECT ise mühendislik bölümünde bu maaştan düşük olan maaşa sahip kişiler listelenmektedir. Buradaki düşünce tarzı şöyledir: Mühendislik bölümünde çalışan ve satış bölümündeki en yüksek maaştan düşük maaş alan bir kişi satış bölümündeki herhangi bir maaştan düşük olma koşulunu sağlayacaktır. ANY sözcüğünün yerine tamamen eşdeğeri olan SOME sözcüğü de kullanılabilir. ALL Sözcüğü Hepsi, tamamı anlamındaki bu sözcük SELECT komutu içerisinde belirli bir koşulu sağlayan bir grup datanın tamamınca sağlanan koşullarla ilişkili olarak kullanılır. ÖRNEK-30: Satış bölümünde çalışan ve mühendislik bölümündeki personelin hepsinden daha fazla maaş alan personeli listeleyiniz. Satış bölümü kodu 2 ve mühendislik bölümü kodu1 olarak alınırsa; 1. Alternatif SELECT * FROM PERSONEL WHERE MAAS > ALL (SELECT MAAS FROM PERSONEL WHERE BOL_NO=1) AND BOL_NO=2; EXISTS Operatörü Var, mevcuttur anlamındaki bu sözcük, SQL de bir Boolean ( lojik, mantıksal) operatördür. İçteki SELECT komutunun sorgulaması sonucunda en az bir tablo satırı üretilmişse EXISTS operatörü true değerini, hiçbir tablo satırı üretilmemişse, EXISTS operatörü false değerini üretir. EXISTS operatörü, AND, OR ve NOT gibi diğer mantıksal operatörlerle birlikte de kullanılabilir. ÖRNEK-31: Numarası 27 olan parçayı satan satıcılarla ilişkili tüm bilgileri listeleyiniz. İlgili SELECT komutlarını yazabilmek için, sistemde satıcı adlı tabloda ve par_sat adlı tabloda aşağıdaki kolon ve verilerin olduğunu varsayalım;
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 15 FIRMA_NO ADI ADRES 1 Ali akın İstanbul 2 Ayşe can İstanbul 3 AkınPeker Ankara 4 Can Ozan İzmir 5 Mert Ak Antalya SELECT *FROM FIRMA WHERE EXISTS ( SELECT * FROM PARCA_FIRMA WHERE FIRMA_NO =FIRMA_NO AND PARCA_NO=27) ; Aşağıdaki sonuç elde edilir. FIRMA_NO ADI ADRES 1 Ali akın Istanbul 2 Ayşe can Istanbul Yukarıda da belirtildiği gibi, iç SELECT te WHERE I izleyen koşulu sağlayan satırlar PARCA_FIRMA içinde bulundukça EXISTS operatörü true değerini verecek bu durumda dış SELECT in WHERE kısmı doğru olacağı için o firma ile ilişkili bilgiler firma tablosundan listelenecektir. VĠEW OLUġTURMAK Veri tabanı kavramı içinde teorik olarak mevcut olan view (bakış ) terimi, farklı kullanıcıların veri tabanına nasıl baktıklarını ya da bakış açılarını anlatan terimdir. Bu anlamda bir kullanıcı fiziksel olarak mevcut olan tabloların sadece bir kısmı ile ilgilenir. VIEW OluĢturmanın Yararları 1.Veri Güvenliği Veri tabanı içinde bulunan tablolardaki bazı sütunlarda bulunan bilgilerin herkes tarafından görülmesi istenmeyebilir. ÖRNEK-32 Personelin maaşlarının herkes tarafından listelenebilir olması mahsurlu olabilir. Bu durumda personel adlı temel tablodan PERSVIEW adlı bir view oluşturulabilir: CREATE VIEW PERSVIEW AS SELECT SICIL_NO, SGNO, ADI, SOYADI, DOG_TAR, ADRES, CINSIYET, BOL_NO, YONETICI_NO FROM PERSONEL; PERSVIEW adlı view, herkesin kullanımına açık, personel adlı tablo ise yetkili kişiler dışındakilere, erişilemez hale getirilirse, maaşların herkes tarafından erişilebilir bilgi olması önlenmiş olur. Bir view den bilgi listelenmesi temel tablodan bilgi listelenmesinden farklı değildir. SELECT *FROM PERSVIEW; PERSVIEW den maaşlar hariç tüm personel bilgileri listelenecektir. Bir temel tablodaki aynı sütun isimleri kullanılmak zorunda değildir. 2.Sorgulamanın Daha Basit Hale Gelmesi Karmaşık sorgulamalarda, bazı SELECT komutlarının sonuçları diğer SELECT komutlarında kullanıldığında, sorgulanmanın düzenlenmesinde yanlışlıklar yapma olasılığını artar. Karmaşık sorgulamalar, View özelliği kullanılarak daha basit hale getirilebilir. Burada temel fikir şudur: Mademki bir view, bir sorgulama sonucu elde edilen bilgiyi (tabloyu) isimlendirerek elde edilen bir virtüel tablodur; o halde karmaşık SELECT komutu içinde, sonucu kullanacak başka bir SELECT komutu yerine, bu sonucu bir view olarak isimlendirerek, view adını kullanmak. Bazı durumlarda ise,
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 16 işletmenin veri tabanı uygulamasında çok sık olarak sorulan karmaşık soruları bir view yapısı ile saklayarak, daha sonra aynı tip sorgulamalar için bu view yapısını kullanarak daha basit ifadeler kullanmak da olasıdır. ÖRNEK-33 Satış bölümünde çalışan personelin herhangi birinden daha düşük maaş alan ve mühendislik bölümünde çalışan kişileri listeleyiniz. (Satış bölümü kodu 2 ve mühendislik bölümü kodu ise 1 kabul ediliyor). SELECT *FROM PERSONEL WHERE MAAS < ANY (SELECT MAAS FROM PERSONEL WHERE BOL_NO=2) AND BOL_NO=1; Şimdi bu sorunun cevabı olan tablo bir view olarak saklanırsa: CREATE VIEW S1VIEW AS SELECT * FROM PERSONEL WHERE MAAS < ANY (SELECT MAAS FROM PERSONEL WHERE BOL_NO=2) AND BOL_NO=1; Bundan sonra aynı tip sorgulama için sadece SELECT * FROM S1VIEW; Yazmak yeterli olacaktır. Sadece View Kullanılarak GerçekleĢebilen Sorgulamalar Bir tablodan elde edilecek bilgiler için, iki kademeli işlem gerektiren sorgulamalarda, iki adımda bir view oluşturup ikinci adımda esas sorgulamayı bu view yardımı ile gerçekleştirmek, çoğu kez kaçınılmaz bir durumdur. Aşağıdaki soru ve bunun çözümü olan SQL ifadeleri bu konuda bir fikir verecektir: ÖRNEK-34 Her bölümde, o bölümdeki ortalama maaştan daha yüksek maaş alanları listeleyiniz. Bu sorunun cevaplandırılması için önce her bölümdeki ortalama maaşların bulunması gereklidir. CREATE VIEW BOL_OR_VIEW (BOL_NO, ORT_MAAS) AS SELECT BOL_NO, AVG (MAAS) FROM PERSONEL GROUP BY BOL_NO; Daha sonra, yaratılan BOL_OR_VIEW yardımı ile (bu view, bölüm no ları ve bölüm ortalama maaşlarını saklamaktadır) sorulan sorunun cevabı elde edilebilir: SELECT *FROM PERSONEL WHERE BOL_NO=BOL_OR_VIEW BOL_NO AND. BRUT > ORT_BRUT; View ler Üzerinde DeğiĢiklik, Ekleme, Silme iģlemleri Viewler üzerinde ekleme, silme ve değişiklik işlemleri esas itibarı ile tablolar üzerinde yapılan benzer işlemlerden çok farklı değildir. Fakat viewler üzerinde bu tip işlemlerin gerçekleştirilmesinde bazı kısıtlamalar mevcuttur. Aşağıdaki hususlar bilinmelidir. Bir viewin güncellenebilir nitelikte olması için bir birleştirme işlemi sonucunda üretilmiş olması gerekir. Başka bir deyişle CREATE VIEW komutunda FROM sözcüğünü izleyen kısımda sadece bir tablo adı bulunmaktadır. View içindeki hiçbir kolon bileşik fonksiyonlarca üretilmiş olmamalıdır. ( MAX, SUM vb.) Viewin üretildiği SELECT komutunda, DISTINC, GROUP BY ya da HAVING sözcüklerini içeren parçaların işlevleri yerine getirilmiş olmamalıdır. Bu koşulları sağlamayan viewler sadece okunabilir özellikteki viewlerdir ve bunlar üzerinde değişiklik yapılamaz. View Ġçine Satır Ekleme Daha önceden oluşturulmuş px adlı view adı, soyadı ve maaş alanlarını içermiş olsun. Bu view güncellenebilir nitelikte ise aşağıdaki INSERT komutu ile aynen tablolarda olduğu gibi kendisine bir satır eklemek mümkün olacaktır. INSERT INTO PX VALUES ( ALĠ, ÇAKIR, 12000000) ; Daha önceden view oluşturulurken CHECK OPTION alternatifi kullanılmamışsa bu durumda ekleme esnasında viewi oluşturan koşul ihlal ediliyorsa sistem eklemeye müsaade etmeyip hata mesajı verecektir.
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 17 View Ġçinden Satır Silme Güncellenebilir bir view içinden satır silme işlemi, tablodan satır silme işlemi ile aynı şekilde gerçekleştirilebilir. ÖRNEK-35 DELETE FROM UST_PER_VIEW WHERE MAAS< 25000000 ; View Satırları Üzerinde Güncelleme ĠĢlemi Güncellenebilir viewlerde güncelleme işlemi tablolardakinin aynısıdır. ÖRNEK-36 UST_PER_VIEW adlı viewde sicili 27251 olan kişinin maaşını 37000000 olarak değiştirmek için UPDATE UST_PER_VIEW SET MAAS =37000000 WHERE SICIL =27251; Bir Viewi Silmek Tablolardan silinmesine benzer şekilde sistemden oluşturulan bir view DROP VIEW komutu ile silinebilir. DROP VIEW UST_PER_VIEW; Bir viewin silinmesi ile o viewe bağlı olarak oluşturulmuş diğer tüm viewler ve bu viewle ilişkisi olan önceliklerin hepsi silinmiş olur. Ġndeks OluĢturmanın Amacı Bir indeks, veri tabanı ortamında bir tablo ya da bir view gibi bir nesnedir ve ilişkili olarak kullanıldığı tablo ya da viewdeki satırların, indeksleme alanı olarak kullanılan kolondaki verilere göre sıralanmış biçimde işlenme sokulmasını sağlar.bir tablo, indekslenmiş ise, bu tablo içinde gerçekleştirilecek bir arama ya da koşullu listeleme ( SELECT komutu ile ) işlemi çok daha hızlı biçimde gerçekleştirecektir. Ġndeks Yaratma SQL de bir tablo ile ilişkili olarak bir indeks yaratmak için gerekli komut CREATE INDEKS komutudur. Komutun yazılış biçimi aşağıdaki gibidir: CREATE INDEX ĠNDEKS ADI ON TABLO ADI ( KOLON ADI1, KOON ADI2, KOLON ADI (N)) ; İndeksleme artan ya da azalan şekilde olabilir. A dan Z ye nümerik olarak küçükten büyüğe şeklindedir. Azalan ise bunun tam tersidir. Hiçbir özel sözcük kullanılmazsa indeksleme artan sayılır ya da alan adının yanında ASC sözcüğü kullanılırsa artan sıralama yapılacağı anlaşılır. Herhangi bir DESC sözcüğünün kullanılması ise azalan sıralama yapılacağı anlamına gelmektedir. Tek Bir Alana Göre Artan Sırada Ġndeksleme İşletmede çalışan personeli brüt maaşlarına göre artan sırada listelemek istersek, brüt alanına göre bir indeks oluşturmalıyız. CREATE INDEX PERS_MAAS ON PERSONEL (MAAS) ; INDEX CREATED 127 ROWS 127 satırlık personel tablosu ile ilişkili olarak brüt kolonuna indeks anahtarı olarak kullanılan pers_maas adlı indeks oluşturuluştur. Bu durumda SELECT *FROM PERSONEL; Şeklindeki listeleme komutu sonucunda personel tablosundaki tüm personel brüt maaşlarına göre listelenecektir. Tek Bir Alana Göre Azalan Sırada Ġndeksleme İşletmede çalışan personeli brüt maaşlarına göre azalan sırada listelemek istenirse brüt alanına göre aşağıdaki gibi indeks oluşturmak gerekir:
Öğr. Gör. Namık ĠÇELĠ SQL NOTLARI Sayfa 18 CREATE INDEX PERS_MAAS ON PERSONEL (MAAS DESC) ; Birden Fazla Alana Göre Ġndeksleme İşletmedeki personelin öncelikle adlarına göre aynı adda olanların soyadlarına göre hem adı hem soyadı aynı olanların maaşlarına göre sıralanmış olarak listelenmesi istenirse aşağıdaki komut kullanılmalıdır CREATE INDEX P_AD_SOY_M ON PERSONEL ( ADI, SOYADI, MAAS ) ; Bu durumda SELECT *FROM PERSONEL; Komutu sonucunda sıralanmış tablo görülecektir. UNIQUE Sözcüğü Bir tablo, seçilen bir sütuna göre indekslenirken indeksleme alanı olarak seçilen sütundaki verilerin tekrarlanmasına izin verilmesi istenmiyorsa indeksleme yapılırken, CREATE INDEX komutu içinde UNIQUE sözcüğü kullanılır. CREATE UNIQUE INDEX PERS_SICIL ON PERSONEL ( SICIL ); Mevcut Bir Ġndeksin Silinmesi Bir tablo üzerinde tanımlanmış herhangi bir indeks, o tablonun veri tabanından silinmesi ile otomatik olarak silinecektir. Tablo silinmeksizin, o tablo üzerinde oluşturulan indeksin silinmesi içinse DROP INDEX komutu kullanılmalıdır. DROP INDEX PERS_IN; Komutu ile Mesajı alınacaktır. INDEX DROPPED