Transkript
1 MİRSİS BİLGİ TEKNOLOJİLERİ LTD. ŞTİ. MİCROSOFT SQL SERVER VERİTABANI VE SORGULARI
2 AÇIKLAMA Merhabalar, Günümüzde bilgisayar kullanımının hızla yaygınlaşması ve bilgilerin bilgisayarlarda daha rahat saklanması ile veri tabanı yazılımları na olan ilgi daha çok artırmıştır. Veri tabanı yazılımları, veri tabanının bilgiyi verimli bir şekilde düzenleyebilmesini, gerektiği zaman bilgiye ulaşılabilmesini sağlayan birden çok kullanıcıya bilgiye ayni anda erişme olanağı tanıyan verilerin düzenli bir şekilde saklanmasına imkan sağlayan yazılımlardır. Bu modülümüzde Veritabanı Ve Sorgu Çeşitleri bulunmaktadır. Örnekler AdventureWorks2014 Kütüphanesini kullanarak. Microsoft SQL Server Programında Yapılmıştır.
3 İÇİNDEKİLER 1.VERİ TABANI İHTİYAÇ ANALİZİ Veri Tabanı Tanımı Veri Tabanı Tabloları İlişkisel Veri Tabanı Kısıtlamalar Veri Tipleri Kesin Sayısal Veri Tipleri (Exact numerics) Yaklaşık Sayısal Veri Tipleri (Approximate Numerics) Tarih ve Zaman Veri Tipleri (Date and Time) Karakter Veri Tipleri (Character Strings) Unicode Karakter Veri Tipleri Binary Veri Tipleri (Binary Strings) Diğer Veri Tipleri (Other Data Types) SORGULAR VE ÇEŞİTLERİ SQL Dilinin Yapısı Sorgu İle Tablo Oluşturma Tablo Silme Sütun Ekleme Tablo Güncelleme SELECT Deyiminin Yapısı Verileri Gruplayarak Analiz Etme Grup Fonksiyonları Birden Fazla Sütuna Göre Gruplama Grup Koşullarının Kullanımı İLİŞKİLİ TABLOLAR Kartezyen Çarpımı Eşiti Olan Birleştirme Eşiti Olmayan Birleştirme... 14
4 GİRİŞ 1.VERİ TABANI İHTİYAÇ ANALİZİ Veri tabanı tasarlamaya başlamadan önce ihtiyaç analizinin doğru yapılması gerekmektedir. 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 Veri Tabanı Tanımı Veri tabanı tanımından önce Veri nedir? sorusuna cevap vermemiz gerekmektedir. Veri; Türk Dil Kurumunun güncel sözlüğünde; Olgu, kavram veya komutların, iletişim,yorum ve işlem için elverişli biçimli gösterimi bilişim terimi olarak tanımlanır. Bu tanımından yola çıkarsak, bu apartman çok yüksek, bugün hava soğuk, gibi ifadeler birer veri değilken, apartmanın 10 katlı, bugün hava 2 C ifadelerindeki 10 kat sayısı 2 hava sıcaklığı olarak birer veridir. Bir kişiye veya ürüne ait detaylı verilerin bir düzen çerçevesinde saklandığı ortamlar Veri tabanı olarak adlandırılır. Veri tabanı ile verilerinizi kaydedebilir, silebilir, güncelleyebilir, yeni veriler ekleyip mevcut verileriniz üzerinde sorgulamalar yapabilirsiniz. Günümüzde Veri tabanları yaşamımızın birçok alanında karşımıza çıkmaktadır. Örneğin internet üzerinden yapmış olduğunuz bir alışverişte satıcı firmanın veri tabanına erişim sağlamış oluyorsunuz. İnternet üzerinden notlarınızı veya birtakım bilgileri öğrenmek için girmiş olduğunuz sistem Milli Eğitim Bakanlığının veri tabanında size ait bilgilerin önceden kaydedilmiş olduğu sisteme, bir mağazada herhangi bir ürünün olup olmadığını öğrenmeye çalıştığınızda o mağazanın veritabanına erişmiş oluyorsunuz 1.2. Veri Tabanı Tabloları Tablolar veri tabanının ana nesneleridir. Bir veri tabanında verilerin saklanmış olduğu nesneler tablo olarak adlandırılır. Bir veri tabanı en az bir tablodan oluşur. Veri tabanını oluşturan tablolar ise data field adı verilen veri alanlarından oluşmaktadır. Tabloları oluşturan sütunlar alanları, satırlar ise kayıtları göstermektedir. NO ADI DOĞUM_TARİHİ DOĞUM_YERİ 1.3. İlişkisel Veri Tabanı İlişkisel veri tabanı, birbirinden farkı tablolara yerleştirilmiş olan verilerin birbirleri ile belirli alanlara göre ilişkilendirilerek düzenlenen veri tabanlarıdır. İlişkisel veri tabanı günümüzde en yaygın olarak kullanılan veri tabanı türüdür. İlişkisel veri tabanlarında veriler tablolarda birbirleri ile ilişkili bir şekilde saklanmaktadır. İlişkisel veri tabanları birden fazla tablodan oluşabilir. Tablolar ise satır ve sütunlardan oluşur. Tablolarda satır ve sütunların kesiştiği noktaya ise hücre adı verilir. Tablo içerisindeki satırlar tablonun kayıtlarını oluşturur. Anahtar alan ise tablonun tanımlayıcısı niteliğindedir Tabloların Özellikleri İlişkisel veritabanında yer alacak olan tabloların aşağıdaki özelliklere sahip olması gerekmektedir; Tablolar satır ve sütunlardan oluşur. Her sütunun alacağı isim birbirinden farklı olmalıdır.5 Her satır birbirinden farklı olmalıdır yani birbiri ile tamamen ayni olan iki kayıt kullanılmamalıdır. Satırların ve sütunların sırasının nasıl olacağı önemli değildir. Hücrelerdeki veriler atomik olmalıdır.
5 Kısıtlamalar Bir veri tabanında depolanan bilgiler arasında bir bütünlük olması yani verilerin birbirleri ile uyumlu olması gerekmektedir. Böylelikle veriler arasında kopukluk olmayacak, geçerli bir veritabanı oluşturulmuş olacaktır. Bütünlük kısıtlamaları, veri tabanında depolanacak verileri kısıtlayan koşullar olarak adlandırılır. Bir veritabanına kısıtlamalar uygulanarak sadece geçerli verilerin depolanmasını sağlayabiliriz Anahtar Kısıtlamaları Bütünlük kısıtlamalarının sağlanmasında anahtar kısıtlamaları önemli bir role sahiptir. Herhangi bir tablodaki her bir satır için kullanılan anahtarın tek olması gerekmektedir. Aksi takdirde kayıtlar arasında tutarsızlıklar meydana gelebilmektedir. Birincil anahtar(primary key) veya yabancı anahtar(foreign key) türlerinden birisi seçilerek kısıtlamaların gerçekleştirilmesi sağlanmaktadır. Birincil anahtar(primary key) kısıtlamaları: Bir tablonun birincil anahtarı, tabloda depoladığınız her satırı benzersiz şekilde tanımlayan bir veya daha çok alandan oluşur. Genellikle, birincil anahtar olarak işlev gören bir kimlik numarası, seri numarası, okul no veya kod gibi benzersiz bir tanımlayıcı vardır. Günlük hayatımızda da, TC Kimlik Numaramız, illerin plaka (06-Ankara,34-İstanbul, 35-İzmir gibi), telefon kod numaraları(312-ankara,242-antalya gibi) ve posta kod numaraları bağlı bulundukları ülkelerde benzersiz numaralardır birincil anahtarları başlarındaki sayısal ifadelerdir. Birincil anahtarlar hiçbir zaman NULL(boş) veya birbiri ile ayni olan değerleri içeremez. Yabancı anahtar(foreign key) kısıtlamaları: Tablo içerisindeki verilerin birbirleri ile iletişim kurabilmeleri amacıyla kullanılan anahtarlardır. Birincil anahtarlar hiçbir zaman NULL(boş) veya birbiri ile ayni olan değerleri içeremezken, yabancı anahtarlar birbirleri ile aynı olan değerler içerebilirler. Bir tabloda birden fazla yabancı anahtar kullanılabilir. Kısacası yabancı anahtar, bir tabloya girilebilecek verileri başka bir tablonun herhangi bir alanında yer alabilecek veriler ile sınırlandırmak ve ilişkilendirmek için kullanılır. Yabancı anahtara, başka bir tablonun birincil anahtarıdır da denilebilir Veri Kısıtlamaları Tablo tasarlarken kullanılan verilerin tutarlılığını sağlamak ve ne tür değerlere sahip olabileceğini belirlemek için de kısıtlamalar getirilebilir. Veri kısıtlamaları sırasında kullanılan bazı kısıtlamalar Not Null, Default, Unique ve Check tir. Not null kısıtlaması; Veri girişi yapılacak bir tablodaki sütunun değer alıp (NULL) almaması (NOT NULL) gerektiğini belirlemek için kullanılan kısıtlamadır. Default kısıtlaması; Veri girişi sırasında bir alanın alabileceği varsayılan bir değer atamak için kullanılır. Unique kısıtlaması; Tablodaki bir alana girilen verinin tekrarsız olmasını sağlamak için kullanılır. Check Kısıtlaması; Kontrol kısıtlayıcı olarak da adlandırılır. Veri girişlerinin belirtilen kriterlere göre yapılmasını sağlar. Örneğin kişinin T.C. Kimlik numarası girilirken 11 haneden fazla değer girilmesi engellenebilir veya bir yolculuk sırasında 0-6 yaş grubu yolculardan ücret alınmayacağının belirtildiği bir durumda yolcu yaşı hanesine girilecek olan yaş rakamının 0 ile 6 dışında bir değer alamayacağı şeklinde bir kısıtlama getirilebilir. 1.4.Veri Tipleri Kesin Sayısal Veri Tipleri (Exact numerics) int: 4 bayt yer kaplar ile arası tam sayıları tutar. C# ta da int tipine karşılık gelir. tinyint: 1 bayt yer kaplar. 0 ile 255 arası tam sayıları tutar. C# ta byte tipine karşılık gelir.
6 bit: 1 bayt yer kaplar. 1 ve 0 değerlerini alır. C# ta bool a karşılık gelir. true/false değerlerini bu tipte saklayabiliriz. smallint: 2 bayt yer kaplar ile arası tam sayıları tutar. C# ta short tipine karşılık gelir. bigint: 8 bayt yer kaplar ile arası tam sayıları tutar. C# ta long tipine karşılık gelir. smallmoney: 4 bayt yer kaplar ,3648 ile ,3647 arası ondalık sayıları tutar. Virgülden sonra 4 basamak alır. Parasal verileri smallmoney veri tipinde saklayabiliriz. C# ta direkt karşılığı yoktur, decimal kullanılır. money: 8 bayt yer kaplar ,5808 ile ,5807 arası ondalık sayıları tutar. Virgülden sonra 4 basamak alır. Parasal verileri money veri tipinde saklayabiliriz. C# ta direkt karşılığı yoktur, decimal kullanılır. decimal ve numeric: kapladığı alan kullanılan basamak sayısına göre değişir. Virgülden önce ve sonra toplam basamak sayısı 1-9 arası 5 bayt; arası 9 bayt; arası 13 bayt; arası 17 bayt yer kaplar. numeric ile decimal birebir aynı veri tipidir. C# ta decimal tipine karşılık gelirler Yaklaşık Sayısal Veri Tipleri (Approximate Numerics) float: kullanılmak istenen boyuta göre ortalama değer alır. float(n) şeklinde kullanılır. Mesela virgülden sonra 20 bitlik bir alan kullanılmasını istiyoruz. O zaman float(20) olarak yazılır ve verdiğimiz bu boyuta göre kaydetmek istediğimiz sayı yuvarlanır. Kesin değer değil de yaklaşık değer kaydedilmiş olur. float kısmı 1 ile 53 arasında olmalıdır. C# ta double tipine karşılık gelir. real: float(24) ile aynı özelliktedir. 4 bayt yer kaplar. 3.40E+38 ile -1.18E-38, 0 ve 1.18E-38 ile 3.40E+38 arası ondalık sayıları tutar. C# ta Single tipine karşılık gelir Tarih ve Zaman Veri Tipleri (Date and Time) Date: YYYY-MM-DD şeklinde tarihi tutar. 3 bayt yer kaplar ile arası tarih değerlerini saklar. datetime: YYYY-MM-DD hh:mm:ss[.mmm] şeklinde tarihi tutar ( :35: gibi). 8 bayt yer kaplar :00: ile :59: arası tarih değerlerini saklar. smalldatetime: YYYY-MM-DD hh:mm:ss şeklinde tarih tutar. 4 bayt yer kaplar :00:00 ile :59:59 arası tarih değerlerini saklar. time: sadece saati hh:mm:ss[.nnnnnnn] şeklinde tutar. 00:00: ile 23:59: arası değer alır. Time(n) şeklinde n değerini belirleyebiliyoruz. time değeri 0 ile 2 arasında ise 3 bayt; 3 veya 4 ise 4 bayt; 5 ile 7 arasında ise 5 bayt yer kaplar. Sadece time olarak kullanılırsak varsayılan time değeri 7 dir.
7 datetimeoffset: kullanımı ve tarih aralığı datetime2 ile aynıdır. Ülkelere göre değişen zaman farkını da tutmamıza olanak sağlar. YYYY-MM-DD hh:mm:ss[. nnnnnnn] [{+-}hh:mm] şeklinde tarihi tutar ( :07: :00). Saat farkı -14:00 ile +14:00 arasında değer alır. Yaptığımız uygulamada farklı ülkelerin tarih ve saat bilgilerini tutuyorsak bu veri tipini kullanabiliriz. datetimeoffset(n) şeklinde kullanılır. N değeri 0 ile 2 arasında ise 8 bayt; 3 veya 4 ise 9 bayt; 5 ile 7 arasında ise 10 bayt yer kaplar. Sadece datetimeoffset olarak kullanılırsak varsayılan n değeri 7 dir Karakter Veri Tipleri (Character Strings) char: sabit uzunlukta karakter dizilerini tutar. char(n) şeklinde kullanılır. n karakter sayısıdır ve 1 ile 8000 arasında değer alır. Belirlediğimiz n değerinden daha kısa uzunlukta olan veriler boşluk ile belirlediğimiz bu n değerine tamamlanır. Ve bu n değerine göre (n x 1 bayt) yer kaplarlar. varchar: sabit uzunlukta karakter dizilerini tutar. varchar(n) şeklinde kullanılır. n karakter sayısıdır ve 1 ile 8000 arasında değer alır. Belirlediğimiz n değeri alabileceği maksimum karakter sayısıdır. Karakter sayısı daha kısa veri girersek char gibi boşlukla tamamlanmaz. Kaç karakter veri girilirse boyutu ona göre değişir. ((kaydedilenverininkaraktersayisi x 1 bayt) + 2 bayt) olarak yer kaplar. varchar(max) şeklinde kullanırsak maksimum 8000 karakter değil de maksimum 2,147,483,647 karakter veri girilebilir. text: varchar(max) ile aynı özelliktedir. maksimum 2,147,483,647 karakter veri girilebilir. microsoft bu veri tipini gelecek versiyonlarda kaldıracağı için kullanılması önerilmez. yerinevarchar(max) kullanabilirsiniz. Not: Eğer oluşturmuş olduğumuz veritabanın dil seçeneği (collation) türkçe (Turkish_Cl_AS gibi) ise unicode olmayan bu veri tiplerinde (char,varchar) de türkçe karakter saklayabiliriz. Fakat dil seçeneği farklıysa türkçe karakter gönderdiğimizde seçtiğimiz dil seçeneğine göre türkçe karakter kaydedilmeyebilir. (ı lar i; ş ler s ye çevrilebilir). Böyle durumlarda ya veritabanı özelliklerinden dil seçeneğini (collation) ı türkçeye çevirmeliyiz ya da unicode karakter veri tiplerini(nchar,nvarchar) kullanmalıyız Unicode Karakter Veri Tipleri nchar: char ile kullanımı aynıdır. char dan farklı olarak unicode karakterleri de saklayabilir. nchar(n) şeklinde kullanılır ve n değeri 1 ile 4000 arasındadır. char ın iki katı kadar (n x 2 bayt) yer kaplar. nvarchar: varchar ile kullanımı aynıdır. varchar dan farklı olarak unicode karakterleri de saklayabilir. nvarchar(n) şeklinde kullanılır ve n değeri 1 ile 4000 arasındadır. varchar ın iki katı kadar ((kaydedilenverininkaraktersayisi x 2 bayt) + 2 bayt) olarak yer kaplar. ntext: nvarchar(max) ile aynı özelliktedir. Maksimum 1,073,741,823 karakter veri girilebilir. microsoft bu veri tipini gelecek versiyonlarda kaldıracağı için kullanılması önerilmez. yerinenvarchar(max) kullanabilirsiniz.
8 Not: Eğer veritabanımızdaki kayıtlarda birden fazla dil kullanılacaksa veya veritabanının dil seçeneğinden (collation) farklı bir dil ile kayıt yapılacaksa unicode karakter veri tipleri kullanılmalıdır Binary Veri Tipleri (Binary Strings) binary: dosyaları(binary data) saklamak için kulanılır. binary(n) şeklinde n değeri 1 ile 8000 arasında değer alır. n bayt kadar yer kaplar. varbinary: dosyaları(binary data) saklamak için kullanılır. binary den farklı olarak boyutu kaydedilen dosyanın boyutuna göre değişir. varbinary(n) şeklinde n değeri 1 ile 8000 arasında değer alır. varbinary(max) olarak kullanıldığında maksimum 2,147,483,647 bayt (2 GB) büyüklüğünde dosya kaydedilebilir. image: dosyaları(binary data) saklamak için kullanılır. maksimum 2,147,483,647 bayt (2 GB) büyüklüğünde dosya saklayabilir. microsoft, sql server ın gelecek versiyonlarında image veri tipini kaldırmayı düşündüğü için yerine varbinary(max) kullanabilirsiniz Diğer Veri Tipleri (Other Data Types) uniqueidentifier: 6F9619FF-8B86-D011-B42D-00C04FC964FF gibi bir GUID tipindeki verileri tutar. C# taki karşılığı GUid tir. Guid, harf ve sayılardan oluşan eşsiz bir datadır. İki Guid in birbiri ile eşit olmayacağı garantidir. timestamp: girilen kaydın (satırın) versiyon numarası gibidir (0x D3). her satırda değişir ve satır güncellendiğinde de değişir. Tabloda sadece bir alan timestamp olabilir. Tarih ve saat tutmak için kullanılmaz. xml: 111 şeklinde xml dataları saklar ve tablo ve satırlarda sorgu yapmadan, query() metoduyla, kaydettiğimiz xml in içindeki datalara ulaşabiliriz. sql_variant: farklı veri tiplerindeki değişkenleri kaydedebileceğimiz bir alan sağlar. maksimum boyutu 8016 bayt tır. varchar(max), nvarchar(max), varbinary(max), text, ntext, image, timestamp, sql_variant, hierarchyid, geography, geometry ve kullanıcı tarafından oluşturulan veri tipleri haricinde diğer bütün veri tiplerini saklayabilir. 2.SORGULAR VE ÇEŞİTLERİ Tablolardaki kayıtlarda silme, ekleme, sıralama, seçme, değiştirme gibi işlemlere ihtiyaç duyulacaksa sorgular hazırlanması gerekir. Ayrıca, yapılan bir takım işlemleri otomatikleştirmek ve verilerde yapılan değişiklikleri kaydetmeden önce gözden geçirmek istendiği zaman da sorgular oluşturulur.
9 Tablonun yapısına ve verileri görüntüleme yöntemine göre değişik özelliklerde sorgular hazırlanmaktadır. Seçme sorguları, parametre sorguları, çapraz sorgular, eylem sorguları ve SQL sorguları kullanılan sorgu türleridir. Seçme Sorguları: En sık kullanılan sorgu türüdür. Seçme sorguları, bilgileri veri sayfası görünümünde gösteren veri tabanı nesnesi türüdür. Sorgu, verileri bir veya birden fazla tablodan, mevcut sorgulardan veya bunların her ikisinden alabilmektedir. Parametre Sorguları: Parametre sorguları, çalıştırıldığı zaman bir ölçüt girilmesini sağlayan iletişim kutusunu açan sorgulardır. Örneğin bir okuldaki personelin ocak ayında sevk aldığı günleri görmek istiyorsak, açılan iletişim kutusuna ölçüt olarak istenilen tarih aralıkları girilir ve bu tarihler arasındaki veriler listelenir. Çapraz Sorgular: Bir tablodaki bilgileri analiz etmek, karşılaştırmak ve tablonun özetini hazırlamak için kullanılan sorgu türüdür. Belirtilen iki alana göre istenilen işlemi (toplama, ortalama, vs.) tablo şeklinde göstermekte kullanılır SQL Dilinin Yapısı SQL (Structured Query Language), veri tabanındaki verileri okumak, güncellemek, yeni veri eklemek, verileri silmek vb. gibi işlemleri yapan, program yazarken kolaylıklar sağlayan, satırlarca kodun yaptığı işlemi tek bir sorguda yapabilen, yapısal bir sorgulama dilidir Sorgu İle Tablo Oluşturma Sorgu kullanarak tablo oluşturmak için CREATE TABLE ifadesi kullanılır. SQL kodu yazılarak tablo oluşturma aşağıdaki şekilde yapılmaktadır. CREATE TABLE tablo_adı ( Sütun1 veri tipi, Sütun2 veri tipi,. Sütun veri tipi ); ÖRNEK: CREATE TABLE Sales.SalesReason( SalesReasonID int IDENTITY(1,1) NOT NULL, Name dbo.name NOT NULL, ReasonType dbo.name NOT NULL, ModifiedDate datetime NOT NULL CONSTRAINT DF_SalesReason_ModifiedDate DEFAULT (getdate()), Tablo Silme Daha önceden oluşturmuş olduğunuz bir tabloya ihtiyaç duymayıp veri tabanından silmek isteyebilirsiniz. Silme işlemini gerçekleştirmek için DROP deyimi kullanılmaktadır. DROP TABLE tablo; DROP TABLE Person.Address Yeni bir sorgu oluşturup yukarıdaki komut satırını yazıp çalıştırdığınız zaman veri tabanı programı önceden oluşturmuş olduğunuz PERSONEL isimli tabloyu silecektir. NOT: Tabloyu silmeden önce tabloyu kapatmanız gerekmektedir Sütun Ekleme Bir tablo oluşturduktan sonra, isteğe göre oluşturulmuş olan tabloya yeni sütunlar ekleyebilirsiniz. Tabloya yeni bir sütun eklemek için ADD COLUMN deyimi kullanılır. ALTER TABLE tablo_adı ADD sütun_adı, veri_türü
10 ALTER TABLE Person.Address ADD Sayi INT(5) Tablo Güncelleme Belirtilen tablodaki alanların değerlerini belirtilen ölçütlere göre değiştirmek için bir güncelleme sorgusu oluşturmak gerekir. Bunun için UPDATE deyimi kullanılır. UPDATE tablo SET sütun_adı=yenideğer WHERE ölçütler; UPDATE Person.Password SET BusinessEntityID = BusinessID int SELECT Deyiminin Yapısı Veri tabanında verilere erişebilmek için SELECT deyimi kullanılmaktadır. Select deyimi ile bir tabloda bulunan belli bir sütun, birden fazla sütun veya tüm sütunları çekebilirsiniz. Bunun yanı sıra sorgulama işlemlerini gerçekleştirmek için de SELECT deyiminden yararlanılır. SELECT [sütun_listesi] FROM [tablo_listesi] SELECT PersonType FROM Person.Person Bu satırda AdventureWorks2014.Person.Person tablosunda [PersonType] alanları seçiliyor. SELECT * FROM AdventureWorks2014.Person. Person Bu satır ile kullanici tablosunda bulunan tüm alanlar seçilmiş olur Verilerin Sınırlandırılması Veri tabanında veriyi alma işlemi sırasında satırlara birtakım sınırlamalar getirilerek tablonun tüm satırları yerine istenildiği kadarını elde etmek mümkündür. Tabloda belirli kısımları seçme işlemini gerçekleştirmek için WHERE sözcüğü kullanılmaktadır. SELECT [sütunlar] FROM [tablo] WHERE [koşul] SELECT * FROM AdventureWorks2014.HumanResources.Department WHERE Name= Sales Urunler tablosundaki fiyatı 200 den büyük olanları ekran çıktısını veren sorgu. SELECT * FROM urunler WHERE fiyat > 200; BETWENN AND
11 Urunler tablosunda fiyatı 100 ile 500 olan sorguyu yazınız. SELECT * FROM urunler WHERE fiyat BETWENN 100 AND 500; LİKE % AdventureWorks2014.Person.ContactType tablosunda Name a ile başlayan sorguyu yazınız. SELECT * FROM AdventureWorks2014.Person.ContactType WHERE Name LIKE "a%" Sıralama İşlemleri Tabloların satırlarının herhangi bir sütuna göre sıralanmasının istendiği durumlarda SELECT deyimi ORDER BY ile birlikte kullanılır. SELECT alan_adı FROM tablo_adı ORDER BY sıranılacak; ASC ASC sözcüğü sıralama yaparken (A dan Z ye ve 0 dan 9 a) sıralamak istediğimizde ASC sözcüğü kullanılır. SELECT AddressID FROM AdventureWorks2014.Person.Address ORDER BY AddressID ASC Yukarıda yazmış olduğumuz sorguda FROM AdventureWorks2014.Person.Address isimli tablodaki adı alanındaki isimleri 0-9 a doğru sıralanır. DESC DESC sözcüğü ise sıralamayı azan şekilde yapmamıza yardımcı olur. (Z dan A ye ve 9 dan 0 a) SELECT AddressID FROM AdventureWorks2014.Person.Address ORDER BY AddressID DESC Yukarıda yazmış olduğumuz sorguda PERSONEL isimli tablodaki adı alanındaki tabloyu 9-0 a doğru sıralanır Verileri Gruplayarak Analiz Etme Şu ana kadar incelemiş olduğumuz deyimler söz konusu tablonun tüm satırlarına uygulanmaktaydı. Bazı durumlarda bazı işlemlerin satırlar yerine gruplara uygulanması gerekmektedir. Veriler gruplara ayrılıp analiz edilir ve bu tür gruplama işlemleri için de grup fonksiyonları kullanılır Grup Fonksiyonları Tek satır fonksiyonları tablonun bir satırına uygulanıp buna karşılık gelen bir sonuç satırı elde ediliyordu. Bir grup satıra bir fonksiyonun uygulanmasının söz konusu olduğu durumlara; "çoklu satır" veya "grup fonksiyonları" adı verilir. Grup fonksiyonları tablonun tüm satırlarına uygulanabilmektedir. AVG() Bu fonksiyon, herhangi bir sütunun içerdiği sayısal değerlerin aritmetik ortalamasını hesaplamak amacıyla kullanılır. Fonksiyonun uygulandığı sütunun veri türü sayısal olmalıdır. SELECT AVG(AverageRate)AS AvrageRate FROM AdventureWorks2014.Sales.CurrencyRate SUM()
12 Sütunların içerdiği sayısal değerleri toplamak amacıyla kullanılan fonksiyondur. SELECT SUM(AverageRate)AS AvrageRate FROM AdventureWorks2014.Sales.CurrencyRate MIN() ve MAX Tablodaki değerler arasında en büyük olanı bulmak için MAX(), en küçük olanını bulmak içinse MIN() ve fonksiyonları kullanılır. Örnek MAX(): SELECT MAX(AverageRate)AS AvrageRate FROM AdventureWorks2014.Sales.CurrencyRate Örnek MIN(): SELECT MIN(AverageRate)AS AvrageRate FROM AdventureWorks2014.Sales.CurrencyRate COUNT() Bir tablodaki kayıtların sayılması amacıyla kullanılan fonksiyondur. COUNT(*) fonksiyonu, NULL değerleri de içeren tüm kayıtların sayılmasını sağlar. WHERE ile birlikte kullanılırsa, bu koşula uygun tüm kayıtları sayar. COUNT(sütun) biçiminde kullanılırsa, söz konusu sütunda NULL değerler içermeyen tüm kayıtların sayılmasına neden olur. Örnek SELECT COUNT(AverageRate)AS AvrageRate FROM AdventureWorks2014.Sales.CurrencyRate Birden Fazla Sütuna Göre Gruplama GROUP BY kullanarak belirtilen alan listesindeki benzer değerlere sahip kayıtları tek bir kayıt olarak birleştirebilirsiniz. Yani birden fazla sütun için de gruplama yapabilirsiniz. SELECT alan_adı FROM tablo WHERE Koşullar [GROUP BY grupalan_adı] SELECT Name,COUNT(*) AS NameGroup FROM AdventureWorks2014.Production.ScrapReason GROUP BY Name Grup Koşullarının Kullanımı Grup işlemlerinin uygulanması sırasında birtakım sınırlamalar gerekebilir. Grup koşulları belirlenirken HAVING sözcüğü kullanılır. HAVING sözcüğü gruplama yaptıktan sonra kullanılır. Gruplandırmak istenilmeyen satırları dışarıda tutmak için WHERE, gruplandırılan kayıtlara filtre uygulamak için ise HAVING kullanılır. Group By ifadesi Where ifadesinden sonra, Having ifadesinden önce kullanılır. Order By ifadesi ise en son kullanılır. Kayıtlar GROUP BY ile gruplandırılır ve HAVING ile de hangi kayıtların görüntüleneceği gösterilir. SELECT Name,COUNT(*) AS NameGroup FROM AdventureWorks2014.Production.ScrapReason GROUP BY Name HAVING ModifiedDate=
13 3. İLİŞKİLİ TABLOLAR İlişkisel veri tabanları, birbirleri ile mantıksal ilişkiler içinde olan tablolardan oluşmaktadır. Tabloları ortak olarak sahip oldukları alanlarda birleştirmek için ilişkiler kullanılır. İlişki ise bir sorguda birleştirmeyle gösterilmektedir. Bu bölümde birbirleri ile ilişkileri olan tablolar için kullanılabilecek birleştirme türlerinin neler olduğunu, bu türlerin hangi durumlarda kullanıldığını ve nasıl birleştirme oluşturulacağını öğreneceğiz Tabloların Birleştirilmesi Birden fazla tablodan veri almak gerektiği durumlarda tablolar arasında ilişki kurulması gerekmektedir. Bu işleme Join (birleştirme) adı verilir. Join işlemi birden fazla tabloyu birbirine bağlayıp bu tablolar üzerinde işlem yapabilmemizi sağlamaktadır. Birleştirme işlemi yapabilmek için tabloların aynı değerleri içeren sütunlarının kullanılması gerekir. Tablo birleştirme işlemi yapılırken birleştirmek istediğiniz duruma göre, Kartezyen birleşim, eşiti olan birleştirme veya eşiti olmayan birleştirme türlerinden uygun olanını kullanabilirsiniz Kartezyen Çarpımı İki tablo arasında birleştirme koşulunun tanımlanmadığı durumlarda Kartezyen çarpımından söz edilir. Soldaki tablonun her kaydı için, sağdaki tablodan bütün kayıtları çeker. Birleştirme koşulunun geçersiz olduğu ve birinci tablodaki tüm satırların ikinci tablodaki tüm satırlarla birleşmediği durumlarda da Kartezyen çarpım elde edilir. SELECT sütun1, sütun2, sütun3,, sütun FROM tablo1, tablo2, tablo3,, tablo Eşiti Olan Birleştirme İç birleştirme olarak da adlandırılan birleştirme türüdür. İç birleştirme bir sorguya, birleştirilen tabloların birinde yer alan satırların, birleştirilen alanlardaki verileri temel alarak, diğer tablodaki satırlara karşılık geldiğini bildirir. İç birleştirme içeren bir sorgu çalıştırıldığında, sorgu işlemlerine yalnızca, birleştirilen tabloların her ikisinde de bulunan ortak değere sahip olan satırlar eklenir. Birleştirmede yer alan her iki tablodan sadece, birleştirme alanında eşleşen satırlar döndürülmek istenildiği zaman iç birleştirme kullanılır. Eşiti olan birleştirme yapılırken INNER JOIN deyimi kullanılır. FROM tablo1 INNER JOIN tablo2 ON tablo1.sütun1 karşılaştırma tablo2.sütun2 Birinci tablodaki tüm kayıtları çekip, bu kayıtlar ile eşleşen ikinci tablodaki kayıtlar listelenir. SELECT * FROM AdventureWorks2014.Person.Address a,adventureworks2014.person.addresstype t WHERE a.modifieddate=t.modifieddate VEYA SELECT * FROM AdventureWorks2014.Person.Address a INNER JOIN AdventureWorks2014.Person.AddressType t ON a.modifieddate=t.modifieddate
14 Eşiti Olmayan Birleştirme Eşiti olan birleştirme sırasında bir tablodaki bir sütunun içerdiği değerler diğer tablonun ilgili sütunu ile eşleştirilip sadece eşleşen değerler birleştiriliyordu. Eşleşmeyen satırlar ise birleştirilemiyordu. Eşleşmeyen satırların da birleştirilip sonuca dâhil edilmesi istenilen durumlarda Eşiti Olmayan Birleştirme kullanılmaktadır. Eşiti olmayan birleştirmeler (dış birleştirmeler), eşleşmeyen kayıtların hangi tabloda olduğuna bakarak sol dış birleştirme veya sağ dış birleştirme olmak üzere iki şekilde olabilmektedir. SELECT * FROM tablo1 [ LEFT RIGHT ] JOIN tablo2 ON tablo1.sütun1 karşılaştırma tablo2.sütun2 Buradaki tablo1 ve tablo2 kayıtların birleştirileceği tabloların adını, sütun1 ve sütun2 birleştirilen sütunların adlarını, karşılaştırma ise ("=," "<," ">," "<=," ">=" veya "<>.") gibi işleçleri göstermektedir. Sol dış birleştirme oluşturmak için LEFT JOIN kullanılır. Soldaki tablodan tüm kayıtlar alınır, sağdaki tabloda eşleşen kayıtlar yazılır ve eşleşmeyen kayıtlar için NULL değer döndürülür. Sağ dış birleştirme oluşturmak için RIGHT JOIN kullanılır. Sağ dış birleşimler, ilk tablonun (soldaki tablo) kayıtlarında eşleşen değer olmasa bile, iki tablodan ikincisinin (sağdaki tablo) tüm kayıtlarını içerir.