SQL'DE VERİ İŞLEME KOMUTLARI SQL'de verileri işlemek için kullanılan komutlara DML (Data Manipulation Language Veri İşleme Dili) denilmektedir. Bu komutlar ile oluşturulan ifadeler tablolara kayıt eklemek, kayıtları değiştirmek ve silmek için kullanılırlar. DML komutları şunlardır. INSERT UPDATE DELETE TRUNCATE Veritabanında kayıt eklenecekse INSERT komutu, kayıtlar üzerinde değişiklik ya da güncelleme yapılacaksa UPDATE komutu, kayıtlar silinecekse DELETE ve TRUNCATE komutlarıyla oluşturulan ifadeler kullanılır. DML komutlarının anlatımında dördüncü ünitede oluşturulan magaza veritabanı ve tabloları kullanılacaktır. Bu tablolar ile ilgili özellikler şekil 1'deki gibidir. Musteri Tablosu Siparis Tablosu Urun Tablosu Tablolar Arası İlşikiler ve Alan Özellikleri Siparis.musteri_no musteri.musteri_no Siparis.urun_kodu musteri.urun_kodu Cinsiyeti DEFAULT 0; urun_markasi DEFAULT 'belirsiz' Şekil 1. Magaza veritabanının tabloları ve tablolar arasındaki ilişkiler Tabloya Yeni Bir Kayıt Girmek INSERT Komutu SQL'de bir tabloya yeni kayıt ya da kayıtlar INSERT komutu ile girilir. Kullanım şekli aşağıdaki gibidir.
INSERT INTO tablo adı [(alan_adı [, alan_adı ])] VALUES (değer [,değer... ]); INSERT komutu bu şekilde kullanıldığında her defasında sadece bir kayıt girer. INSERT ile oluşturulan ifadede her alana bir değer gelecek şekilde değerler sıralandığından değerlerin atanacağı alanların isimleri listelenmesi şart değildir. Şayet alan adları listelenmezse girilen değerler, alanların tablodaki varsayılan sırasına uygun olacak şekilde sıralanmalıdır. INSERT INTO urun VALUES ('Q Klavye', 'A4 Tech', 'Klavye',15); Bu örnekte urun tablosunda 5 alan olmasına rağmen 4 değer girilmiştir. Bunu nedeni IDENTITY yani kimlik olarak tanımlanmış alanlara değer aktarılamaz. Bu tür alanların değerleri sistem tarafından otomatik üretilir. Bu yüzden urun_kodu alanı bu ifadede göz ardı edilecek ve değerler sıradaki diğer alanlara girilecektir.! Burada dikkat edilecek nokta veri girilecek alanların sırası doğru olması ve veri tipi tanımlanırken oluşturulmuş kısıtlamalardır. Örneğin NOT NULL olarak belirlenmiş bir alana mutlaka değer girilmelidir, boş bırakılmamalıdır. INSERT ifadesinde alan ismi belirtilerek değer girilecekse değerlerin atanacağı alanların isimleri listelendikten sonra VALUES içerisinde alan listesindeki sıra gözetilerek değerler yazılır. INSERT INTO urun (urun_markasi,urun_adi, urun_turu,urun_fiyati) VALUES ('A4 Tech', 'Q Klavye', 'Klavye',15); Beklenen alan değeri için bir değer girilmemişse o alan değeri için NULL değer girilmiş demektir. Başka bir deyişle alanın değeri için NULL yazılarak da belirlenebilir. Burada dikkat edilecek nokta o alanın NOT NULL şeklinde bir kısıtlamasının olmamasıdır. INSERT INTO Musteri VALUES ('Aysu', 'TAŞ','','','','', ''); ya da INSERT INTO Musteri VALUES ('Aysu', 'TAŞ', NULL, NULL, NULL, NULL, NULL); ya da INSERT INTO Musteri (soyadi, adi) VALUES ('TAŞ', 'Aysu');
Bu örnekteki ifade çalıştırıldığında musteri tablosuna eklenen kaydın adi alanı değeri Aysu, soyadi alanı değer TAŞ ve diğer alanların değeri belirtilmediği için NULL'dur. Şekil 2'de bu sorgunun sonucu oluşan kaydı inceleyebilirsiniz. Şekil 2. Müşteri tablosuna INSERT ifadesi ile girilen kayıt INSERT deyimi içerisinde DEFAULT değerler kullanılabilir. INSERT INTO Musteri (soyadi, adi,cinsiyeti) VALUES ('TAŞ', 'Aysu', DEFAULT); Şekil 3. Müşteri tablosuna DEFAULT ifadesi ile kayıt eklenmesi Şekil 3'te de görüldüğü gibi cinsiyeti alanının DEFAULT değeri 0 belirlendiği için bu alana 0 atanmıştır. INSERT ifadesinde alanlara fonksiyonlar kullanılarak veri girilebilir. INSERT INTO musteri (adi,soyadi,dogum_tarihi, cinsiyeti, adres, kart_no, tarih) VALUES ('Bora', 'TAYFUN', '10.12.1969',1,'Ankara','123456789', GETDATE()) ; Örnekte GETDATE() fonksiyonu kullanılarak o anki tarih değeri tarih alanına girilmektedir.! Örnekteki SQL ifadesinde VALUES ifadesinden önce musteri_no alan adının olmadığına dikkat edilmelidir. musteri_no alanı kendi değerini otomatik olarak üreteceğinden INSERT ifadesinin içinde yer almaz. Tabloya Çoklu Kayıt Eklemek INSERT ifadesi kullanılarak bir tabloya aynı anda birden çok kayıt eklemek için VALUES bölümünde parantez içinde, aralarına virgül konularak her bir kayıt için gerekli alan değerleri girilir.
INSERT INTO musteri (adi, soyadi) VALUES ('Yağmur','ASLAN'), ('Mehmet','YILMAZ'), ('Selami','SERT'); Örnekte musteri tablosuna üç kayıt birden eklenmektedir. INSERT ifadesi kullanılarak bir tabloya başka bir tablodan elde edilen kayıtları eklemek mümkündür. Bu yöntemle bir komutla birden fazla kayıt zahmetsizce girilmiş olur. INSERT INTO urun (urun_adi, urun_markasi, urun_turu, urun_fiyati) SELECT adi, markasi, turu, fiyati FROM eski_urun; Bu örnekte eski ürünlerin tutulduğu eski_urun tablosundaki kayıtlar güncel ürünlerin tutulduğu urun tablosuna aktarılmıştır.! Örnekteki SQL ifadesinde görüldüğü gibi VALUES kelimesi kullanılmaz. Girilecek değerleri bir alt sorgunun SELECT listesindeki alanlar belirler. Bundan dolayı SELECT listesindeki alanların veri girilecek alanlarla sırasının eşleşmesi gerekmektedir. Tablodaki Verileri Değiştirmek (Güncellemek) UPDATE Komutu Mevcut kayıtlardaki veriler UPDATE komutu kullanılarak güncellenir. Eğer UPDATE ifadesinden WHERE cümlesi kullanılırsa güncellenecek veriler WHERE cümlesinde belirtilen ölçütlere uyanlar olacaktır. WHERE cümlesi kullanılmamışsa herhangi bir ölçüt olmadığı için tüm kayıtlar güncellenecektir. Bu komutun kullanılışı aşağıdaki gibidir. UPDATE tablo_adı SET alan_adı = değer [, alan_adı = değer ] [WHERE koşul]; UPDATE urun SET urun_fiyati = urun_fiyati+ urun_fiyati*0.15; Yukarıdaki sorgu ifadesi urun tablosundaki tüm kayıtların urun_fiyati alanındaki değerler, o anki değerleri üzerine %15 eklenmesi sonucu çıkan değerle değiştirecektir. Başka bir deyişle urun tablosundaki tüm ürünlerin fiyatı %15 artırılacaktır. UPDATE Musteri SET adi='mehmet Ali' WHERE adi = 'M.Ali'; Bu örnekte adı 'M.Ali' şeklinde girilmiş bütün müşterilerin adı 'Mehmet Ali' olarak değiştirilmektedir.
UPDATE Musteri SET adres='1. Cad Emek no:5 Ankara' WHERE musteri_no=5; Yukarıdaki sorgu, musteri_no bilgisi 5 olan müşterinin adresini sorguda belirtilen adres ile değiştirmektedir. Belirli bir kayıt üzerinde yapılacak değişiklikleri, her bir kaydı benzersiz olarak tanımlayan birincil anahtardaki bilgiye göre yapmakta fayda vardır. Örneğin adı Ali Demir olan birden fazla müşteri olabilir. Bu tarz bir değişiklik adı ve soyadına göre yapılmak istense birden fazla müşterinin adresi aynı olacaktır. INSERT ifadesinde olduğu gibi UPDATE ifadesinde de alt sorgu/sorgular kullanarak veriler güncellenebilir. Bu ifadedeki alt sorgu alan ya da alanların alacakları değerleri belirtmek için kullanılır. UPDATE Siparis SET musteri_no = (SELECT musteri_no FROM musteri WHERE adi='mehmet Ali' AND soyadi='demir') WHERE siparis_tarihi = '10.12.2009'; Bu sorgu Siparis tablosundaki tarih alanı değeri 10.12.2009 tarihinden büyük olan kayıtlar için musteri_no alanının değerinin, musteri tablosundaki adi Mehmet Ali ve soyadi Demir olan müşterinin musteri_no bilgisi ile değiştirmektedir. Bu sorgudan şu sonuç çıkarılabilir. 10.12.2009 tarihindeki bütün siparişler Mehmet Ali Demir isimli müşteriye ait olması istenmektedir. Müşterinin isimleri siparis tablosunda olmadığı için musteri_no bilgisine ulaşmak için Musteri tablosundan müşterinin musteri_no bilgisini, adı ve soyadına göre getiren bir sorgu UPDATE ifadesine eklenmiştir.! Yukarıdaki ifadenin doğru çalışması, SELECT ifadesinin tek bir kayıt döndürmesine bağlıdır. Eğer çoklu kayıt döndürürse sonuç olarak hata mesajı ile karşılaşılacaktır. Tablodan Kayıt Silmek DELETE Komutu Veritabanındaki tablolarda bulunan kayıtlar DELETE ifadesi ile silinir. WHERE cümlesini DELETE komutuyla kullanarak koşula uygun kayıtları silmek mümkündür. Eğer koşulsuz bir DELETE ifadesi yazılırsa veritabanındaki o tabloya ait tüm kayıtlar silinir. DELETE FROM tablo_adı [WHERE koşul]; DELETE FROM urun;
Yukarıdaki sorgu Urun tablosundaki tüm kayıtları siler. DELETE FROM siparis WHERE siparis_tarihi<'01.01.2004'; Yukarıdaki sorgu 01.01.2004 tarihinden önceki kayıtları siler. Bir tablodaki kayıtları başka bir tablodaki verileri temel alarak silmek için DELETE ifadesinde alt sorgular kullanılabilir. DELETE FROM siparis WHERE musteri_no = (SELECT musteri_no FROM musteri WHERE adi= 'Mehmet Ali' AND soyadi='demir'); Bu örnekte Mehmet Ali Demir isimli müşterinin bütün siparişleri silinmektedir. UPDATE örneğinde de olduğu gibi siparişleri silinecek müşterinin numarasına ulaşabilmek için bir alt sorgu DELETE ifadesine eklenmiştir. Tablodaki Tüm Kayıtları Silmek TRUNCATE Komutu Veritabanındaki bir tablodan tüm kayıtların silinmesi için TRUNCATE komutu kullanılır. Komutun çalıştırılması için sadece işlemin yapılacağı tablonun adı gereklidir. DELETE komutuyla WHERE cümlesini kullanmadan da tüm kayıtları silebiliriz. Ancak TRUNCATE komutu, DELETE komutuna göre daha hızlı çalışır ve daha az sistem kaynağı kullanır. TRUNCATE komutunun kullanım şekli aşağıdaki gibidir. TRUNCATE TABLE <tablo_adı>; TRUNCATE TABLE Siparis; Bu örnekte Siparis tablosundaki tüm kayıtlar silinir.! TRUNCATE komutu ile tablodaki kayıtlar boşaltılırken otomatik artırma (IDENDITY) özelliğine sahip alanları varsa sayaç sıfırlanır. DELETE komutunda ise tüm kayıtlar silinse bile otomatik artırma özelliğine sahip alanlar için sayaç kaldığı yerden devam eder.! TRUNCATE komutu ile yapılan silme işlemi, işlem günlüğüne yazılmadığından yapılan işlem geri alınamaz.! TRUNCATE komutu ile yabancı anahtar ilişkisi kurulmuş tablolardan birincil anahtara sahip tablonun kayıtları silinemez. Yabancı anahtar kısıtlayıcısı hata mesajı verir.? Magaza veritabanındaki bütün tablolara TRUNCATE komutu uygulanabilir mi?