Oluşturan - Furkan Aslan
Web sitenizin arama motoru robotları ile iletişime geçip, istediğiniz sayfa veya dizinlerin indekslenmesini robots.txt dosyası ile sağlayabilirsiniz.SEO açısından oldukça mühim ve dikkat bir çekici konu olan robots.txt dosyalarının oluşturulma hikayesi ilk olarak 1994 yılında gündeme gelmiştir. Bu dosyanın mucidi, dünyanın ilk arama motoru olan aliweb'in de kurucusu olan Martijin Koster tarafından bulunmuştur. Ne amaçla kullanılır?Sahip olduğunuz web sitenizde değerli içerik linklerinin yanı sıra iletişim, hakkımda, gizlilik sözleşmesi, sıkça sorulan sorular gibi sitenin footer kısmında yer alan alanların google arama sonuçlarında çıkmasını engellemek maksadıyla kullanılan bir yöntemdir. Nasıl Oluşturulur ?Robots.txt dosyasını oluşturmak için herhangi bir programlama bilgisine ihtiyaç yoktur. Bilgisayarınızda notepad dosyası açıp bunu robots.txt ismiyle kaydediyor olmanız bu işin ilk aşamasıdır. Sonrasında ise bu dosyayı kök dizine atıyor olmanız gerekir. Yani URL nizin aktif hali şu şekilde olacaktır: sitenizinadi.com/robots.txt Robots.txt içeriğindeki komutlar nelerdir ?Bu dosya üç komuttan oluşur: 1) User-agent : İlgili komutun hangi robota uygulandığını ifade eder."*" derseniz tüm robotları kapsasın anlamı taşır. 2) Disallow : Ziyaret edilmesini istemediğiniz kısımları buraya yazıyorsunuz. "Disallow:/linkadi" şeklinde yazılır. "Disallow:" şeklinde bir yazım ise herhangi bir kısıt olmadığını, tüm web sitesinin robot tarafından taranabileceğini ifade eder. 3) Allow : Botlar tarafından taranmasını istediğiniz alanları buraya yazabilirsiniz. Bu arada belirtmekte fayda var. Birden fazla alanı alt alta "Allow :" diyip tanımlayabilirsiniz. Bunların dışında yorum satırı eklemek isterseniz, "#" işaretini kullanmanız gerekir. Bu işaretden sonra yazılan sözcükler google botları tarafından görülmez.
Daha FazlaYayınlandı - Per, 14 Ara 2023
Oluşturan - Furkan Aslan
Günümüzde artık veritabanı sunucuları, yapısal verilerin dışında yapısal olmayan verileride tutmaya yöneliyor. Ses dosyaları, resimler, mailler, video dosyaları, ofis belgeleri vb..Her geçen dakika hatta saniye, yönetebileceğimizden fazla veri üretiyoruz. Günümüzde potansiyel olarak kullandığımız verilerin yaklaşık %80'inin yapısal olmayan türde veriler olduğu ifade ediliyor. Bilgisayar donanımlarının (görece) bu yüksek kapasitedeki verileri depolayarak analiz yapabilecek seviyeye gelmesi oldukça karmaşık bir durum. Karmaşıklıktan kastım bu verilerin etkili bir şekilde saklanması ve bunların sağlıklı analizi diyebilirim. Aynı zamanda bu iş için harcanacak efor gücünün de ayrı meşakkat olduğunu belirtmek isterim. Bu karmaşıklıktan ötürüdürki, şimdilik bu tarz verilerin analizi kurumlar için "Dark Data" diye tabir edilen karanlık tarafta, aydınlanmayı bekliyor.. Esas konumuzun özelinde bir giriş yapacak olur isek; Sql server'ın yapısal olmayan veriler için sunduğu güzel bir özellik vardır: FILESTREAM..Sql 2008 ile birlikte gelen bu yapıda verileriniz NTFS disk sisteminde duruyor. Size düşen ise bu verilerinizi T-SQL kodlarıyla sorgulamak. Yani filestream, sql-server ile diskiniz arasında köprü görevi görüyor desek heralde yanılmış olmayız. Bu işlemin bana göre en büyük yararı audit dediğimiz yetkilendirme safhasından nasibini alması. İstediğiniz dosyaya read-only ataması yapıp yine bu dosyalara kimlerin erişeceği ile alakalı yetki ataması yapabilirsiniz. FILETABLE'da yine filestream ile aynı mantıkta çalışan hatta bu teknolojinin üzerine bina edilmiş daha ileri bir versiyondur diyebiliriz. Bu özellik ise sql 2012 ile birlikte gelmiştir. Sizin bu teknolojiyi kullanabilmeniz için iki seviyede işlem yapıyor olmanız gerekmektedir. 1-Instance seviyesinde, 2-Veritabanı seviyesinde.
Daha FazlaYayınlandı - Per, 14 Ara 2023
Oluşturan - Furkan Aslan
Bu kez 20 adet soruyla sql bilgimizi sınıyoruz.<a href = "Images/sqlsorular.docx" target="_blank"> Sizler için farklı konu başlıklarında 20 adet sql sorusu hazırladım. Cevapları dökümanın sonunda görebilirsiniz. Dökümanı indirmek için buraya tıklayınız. İyi çalışmalar dilerim. </a>
Daha FazlaYayınlandı - Per, 14 Ara 2023
Oluşturan - Furkan Aslan
Bu yazımızda Sql Server 2005 ile birlikte kullanılmaya başlayan CTE kavramını etraflıca ele alacağız.Öncelikle CTE'nin tanımını yapalım. CTE(Common Table Expression), geçici tablo yada türemiş tablo gibi davranan, DB'de object (tablo, sp, view vs..) gibi depolonmayan ve tek bir SELECT, INSERT, UPDATE, DELETE veya CREATE VIEW ifadelerinin derhal peşine(!) kullanılan geçici sonuç kümelerine denir. Türetilmiş tabloların aksine, CTE'ler sorgu içinde kendine referans edilebilir ve yine kendisini birden fazla kez çağırabilir. (Varsayılan olarak üst limit 100 defadır ancak bu sayıyı isteğe göre arttırabilirsiniz.) En basit haliyle CTE nin yazım şekli şöyledir; WITH CTE_ismi(sütun isimleri) AS(cte_sorgusu) SELECT|INSERT|UPDATE|DELETE...FROM...CTE_ismi Nasılki bir stored procedure, view ya da tablo tanımlarken "create view" şeklinde cümleye başlıyoruz, CTE tanımlarken'de cümlemiz WITH anahtar sözcüğü ile başlar. Örnek uygulamalara başlamadan önce aşağıdaki 2 tabloyu veritabanınıza kayıt etmenizi rica ediyorum. CREATE TABLE tblEmployee( Id int not null primary key, Name varchar(50), Gender varchar(10), DepartmentID int ) GO INSERT INTO tblEmployee(Id, Name, Gender, DepartmentID) VALUES (1, 'John', 'Male', 3),(2, 'Mike', 'Male', 2),(3, 'Pam', 'Female',1),(4, 'Todd', 'Male', 4),(5, 'Sara', 'Female', 1),(6, 'Ben', 'Male',3) CREATE TABLE tblDepartment( DeptId int not null primary key, DeptName varchar(50)) GO INSERT INTO tblDepartment(DeptId, DeptName) VALUES(1, 'IT'), (2, 'Payroll'), (3, 'HR'), (4, 'Admin')
Daha FazlaYayınlandı - Per, 14 Ara 2023
Oluşturan - Furkan Aslan
Bu makalede, Sql Server'da zamandan tasarruf etmemizi sağlayacak çok kullanışlı kısayolları tanıyacağız.Alt+X, Ctrl+E, F5 = Sorguları çalıştırmanızı sağlarlar. (Execution işlemi) Ctrl+Shift+F = Sorgu sonuçlarını text formatında .rpt uzantılı çıktı ile kayıt eder. Daha sonra bu dosyayı herhangi bir uygulamada text file(notepad gibi) yada SSMS de açıp okuyabilirsiniz.Ctrl+T= Sorgu sonucunu text hale getirir.Ctrl+D= Sorgu sonucunu grid hale getirir. (Execution işleminden önce yapmamız gerekir.)Ctrl+R= Benim de şahsen çok sık kullandığım bir kısayoldur. Select çektiğiniz sorgu sonuçlarını kapatıp açmaya yarar.Shift+F1= Help MenuSSMS = Windows başlangıç aşamasında SQL Server'a ulaşmanızı sağlar. eg; Win+R>SSMS Shift+Alt+Enter = Tam ekran modunu değiştirir. (Sorgu ekranı açıkken çalışır.) Ctrl+N = Yeni bir sorgu ekranı açar. Ctrl+F4= Sorgu penceresini kapatır. Ctrl+Shift+L = Seçilen öğe yada öğeleri küçük harfe çevirir.Ctrl+Shift+U = Seçilen öğe yada öğeleri büyük harfe çevirir.Ctrl+W = Cursor'ın bulunduğu yeri seçili yapar.Ctrl+Alt+G = Kayıtlı olan server'ların listesini getirir.Ctrl+K+C = Cursor'ın bulunduğu yerden ilgili satırın başına kadar sorguları yorumlu hale getirir.Ctrl+K+U = Yorum haline gelmiş satırları kaldırır.Ctrl+TAB = Açık olan sorgu pencereleri içinde geçiş yapar.F6 = Açık olan sorgu penceresinde, sonuç kümesinde, etkilenen satır sayısı dediğimiz mesaj bölümünde, tuşa her bastığımızda geçiş yapar.Ctrl+J, Ctrl+Load = Intellisense ile cursor'ın bulunduğu yere pencere açar.Ctrl+Shift+R = Yine benim çok sık kullandığım bir kısayoldur. Intellisense özelliğini tazeler. Örneğin yeni bir tablo yarattınız diyelim, bu tabloyu kodunuzda göremiyor iseniz, birkaç kere bu tuş kombinasyonunu deneyerek amacınıza ulaşabilirsiniz.Ctrl+Alt+L = Solution Explorer penceresini getirir.Ctrl+U = Database'i değiştirir.Ctrl+L = Execution Plan'ı getirir. Umarım faydalı olmuştur, bir sonraki makalemde görüşmek üzere..
Daha FazlaYayınlandı - Per, 14 Ara 2023
Oluşturan - Furkan Aslan
SQL Server'da OLAP küpleri oluşturmadan istatistiki analiz imkanı veren birtakım kavramlar vardır. Bu yazımızda bunları inceleyeceğiz.Başlıkta belirtmiş olduğum konular, at ve at arabası gibi sorgularda birlikte koşarlar. Veriler önce gruplara ayrılırlar sonrasında ise bu gruplar hakkında belli değerler bulmak için kullanılırlar. Benim bu yazı dizisinde ele alacağım konu, GROUP BY deyiminin ürettiği sonuçlar üstünde, nasıl istatistiksel özetler elde edildiğini mercek altına almak. Bu deyimler, SQL Server 2008 ile birlikte ANSI SQL 2006 uyumlu olarak yeniden düzenlenmiştir. O halde vakit kaybetmeden başlık konularını tek tek ele alalım. Evvelâ elimizde örnek veri olması açısından aşağıdaki sorguyu veritabanınızda çalıştırmanızı istirham ediyorum. Create Table Sales(Id int primary key, Continent varchar(50),Country varchar(50),City varchar(50),SalesAmount int) GO Insert Into Sales Values(1, 'Asia', 'India', 'Bangalore', 1000)Insert Into Sales Values(2, 'Asia', 'India', 'Chennai', 2000)Insert Into Sales Values(3, 'Asia', 'Japan', 'Tokyo', 4000)Insert Into Sales Values(4, 'Asia', 'Japan', 'Hiroshima', 5000)Insert Into Sales Values(5, 'Europe', 'United Kingdom', 'London', 1000)Insert Into Sales Values(6, 'Europe', 'United Kingdom', 'Manchester', 2000)Insert Into Sales Values(7, 'Europe', 'France', 'Paris', 4000)Insert Into Sales Values(8, 'Europe', 'France', 'Cannes', 5000) ROLLUP ve CUBE kullanımıBu iki deyim herhangi bir OLAP yatırımı olmaksızın, OLTP veritabanında, verilerinizi hızlı bir şekilde özetleyerek, çok çok etkili istatistiksel sonuçlar almanızı sağlarlar..Aggregate functions(SUM, AVG, MAX, MIN ve COUNT) dediğimiz sözcüklerle kullanılırlar ve aynı anda en fazla 10 kolon üzerinde özetleme yapabilirler. Cube ve Rollup birbirlerine çok benzerler ancak aralarında çok ince bir fark vardır. Cube deyimi, en yalın ifade ile gruplama işlemini bir küpe dönüştürür ve bu gruplandırılmış seviyedeki her birleşim için alt toplam oluşturur. Yazım şekline bakacak olursak; Bakınız Resim-1. Rollup deyiminde ise hiyerarşinin tamamı için alt toplam oluşturulabilir. Yani içten dışa doğru sütunlara ait toplamları bularak ilerler. Şimdi bu deyime ait söz dizimine bakalım; Bakınız Resim-2. Görüldüğü gibi şayet bu iki deyim üzerinde tek bir gruplama sütunu kullanıldı ise sonuçlar aynı gelecektir. Şimdi GROUP BY elementi üzerinden sorgularımızı biraz daha genişletip aradaki farkı daha iyi analiz edelim; Bakınız Resim-3.Bakınız Resim-4. Cube deyimi ile yapılan sorguda 48 satır etkilenirken, Rollup ile yapılan sorgu sonucu 15 satır kayıt dönmüştür. Bunun sebebi, cube deyiminin seçilen sütunlardaki değerlerin tüm kombinasyonları için bir sonuç kümesi oluşturması, rollup deyiminde ise seçilen sütunlardaki değerler için hiyerarşik olarak sonuç üretilmesi denilebilir. Cube ve rollup kavramlarını +1 birim daha yakın mercek altına alıp çalışma mantığından bahsetmek istiyorum. Aynı zamanda yukarıda bahsettiklerimde karşılanmış olacak bu sayede. Bakınız Resim-5.Bakınız Resim-6. Şekildeki sorgularda da görüldüğü gibi cube olası tüm kombinasyonları içerir ancak rollup'da özetle hiyerarşik düzen söz konusudur. Peki rollup ve cube kullanımını bilmiyor olsaydık sütun bazlı özet kırılım sonuçlarını nasıl elde ederdik ? Bu sorunun cevabı aşağıdaki şekilde olduğu gibidir. Bakınız Resim-7. Gördüğünüz gibi ne kadar karmaşık ve sorgu tekrarı gerektiren bir sorgu cümlesi. Lütfen bu örnekleri sizde deneyiniz.. ROLLUP ve CUBE kavramları ile ilgili bu kadar detaylı bilgiden sonra sıradaki başlık konularını incelemeye başlayabiliriz. Bundan sonraki başlık konularıda bütün olarak birbirleriyle ilintili olduğu için bu detayların işimize yarayacağını düşünüyorum. O halde makalemize GROUPING SETS kavramıyla devam edebiliriz.. GROUPING SETS kullanımı GROUPING SETS; GROUP BY ile getirilen farklı sonuç sorgularını farklı seviyelerde ele almak için kullanılır. ROLLUP VE CUBE'de olduğu gibi UNION ALL sorgularına alternatiftir. Bu deyim Sql 2008 sonrası, geliştiricilerin kullanımına açılmıştır.GROUP BY ın bir alt sorgusu gibi çalışır ve çoklu sayıda sorgu yazmamıza imkan verir. Burada amaç farklı kırılımlarla veriyi ele alıp buna göre sonuç döndürmektir. Dilerseniz bu ifadenin yazım şekline canlı örnek üzerinden göz atalım; Bakınız Resim-8. Yukarıdaki örneğe bakıldığı zaman, ROLLUP deyimi ile aynı sonucu getirdiğini görüyoruz. Peki kullanım açısından GROUPING SETS ve ROLLUP/CUBE arasında ne fark vardır? Bu sorunun cevabı yine yukarıdaki sorguda saklı diyebilirim zira GROUPING SETS ifadesinde isteğe bağlı olarak kolonlar arasında kırılım yapabiliriz. Ancak ROLLUP/CUBE deyiminde böyle bir şansımız bulunmamaktadır. Bize hiyerarşiyi, yani ara ve genel toplam değerlerini olduğu gibi getirir. Örneğin sadece sütunların ara toplamlarını görmek isteyip genel toplamı görmek istemeyebilirsiniz böyle bir durumda '()' ile belirttiğim satırı sorgudan kaldırıyor olmamız yeterlidir. (Lütfen sizde GROUPING SETS ile farklı kombinasyonları deneyip aradaki farkı görmeye çalışınız.) Anahtar Not: GROUPING SETS içerisinde kullanılan boyutların kullanım sırası önemli değildir. Sürekli aynı sonucu döndürür. Ayrıca yukarıdaki resimde yazmış olduğum ORDER BY deyiminin kullanımına dikkat ediniz. Bakınız Resim-9. Yukarıdaki resimde GROUPING SETS içersinde ROLLUP kullanarak sizlere bu ifadenin bu şekilde de yazılabileceğini göstermek istiyorum. Bu ifadenin anlamı; "Bana Continent alanını sabitle, Country ve City alanlarının ara toplamlarını getir" anlamı taşımaktadır. Daha açık ifade ile bu örnekte ara toplamları istediğimiz kolonlar için açıp kapatabiliriz. Sizde bunun tam tersini yapar mısınız ? Yani Country ve City alanını sabitleyip Continent için ara toplam almayı dener misiniz? Buraya kadar herşey güzel..Ancak çoklu grouping sets sorgularının geliştirici tarafına getirdiği bir karmaşa vardır, bu da özetleme kırılımlarından dönen 'NULL' satırlardır. Bu karmaşayı aşmak için GROUPING_ID fonsiyonunu kullanırız. Şimdi dilerseniz bu fonksiyonu detaylıca ele alalım. GROUPING_ID kullanımı Öncelikle grouping_id fonksiyonuna niçin ihtiyaç duyarız konuya bunu açıklamakla başlayalım. Rollup ve cube ile yapmış olduğumuz örnek sorgu kümelerinde gördüğünüz gibi NULL satırlara rastlıyoruz. Elbette biz biliyoruzki hesaplamalara uğrayan ara ve genel toplamların yansımaları bunlar. Ancak çok çok büyük veri kümeleri ile çalıştığınızı tahayyül edin ve bu işleme soktuğunuz verilerinizin gerçekten NULL satıra sahip olduğunu düşünün. İşte bu durumda dönen satırlar arasındaki ayrımı kolayca fark etmek için bu fonksiyonu kullanırız. Şayet grouping_id için atadığımız parametre değeri geriye 1 döndürüyorsa bu demek oluyorki bu ifade özetlemeden dolayı NULL değer döndürmüştür, ancak herhangi bir özetlemeye sahip satır yoksa 0 değerini döndürür. Bu işlemi özetlenmiş bir sorgu sonucundan sadece ara toplam yada genel toplam satırlarını çekmek için kullanabiliriz. Şimdi bu tanımımızı destekleyecek örnekler yapalım; Bakınız Resim-10. Bu sorguyu inceleyecek olursak; Grouping_id() fonksiyonu ile türetmiş olduğumuz G_Country sütunu için istediğimiz sonucu elde ettik yani gördüğünüz gibi özetlenmiş kısımlarda Country sütununda NULL satırlar için 1 sonucunu geri döndürdük. Gelelim G_Hepsi sütununa. Bu alanda farklı sayısal değerler gözümüze çarpıyor..Bu işlem matematiksel üs alma işlemini yapmıştır arkadaşlar. Son satırdaki 7 değerini inceleyecek olursak; şekildeki sırasıyla Continent(2 üzeri 2 = 4), Country(2 üzeri 1 = 2), City(2 üzeri 0 = 1) Toplam=4+2+1=7 sonucunu elde ettik. Peki bu bizim ne işimize yarar derseniz onu da sorgu üzerinde görelim; Bakınız Resim-11. Sorgu sonucundan gördüğümüz üzere süzme işlemi yaparak ara toplam değerlerini getirdik ya da having koşulunda 7 diyip sadece genel toplamı da getirebiliriz. Bu artık size kalmış.. Anahtar Not: Grouping_id çalışma mantığı kısaca şu şekildedir: GROUPING_ID(A, B, C)= GROUPING(A) + GROUPING(B) + GROUPING(C) Yani içerisinde bulunan parametrelerin tümünü parçalar. Ayrıca binary'den decimal'e doğru bir dönüştürme performansı sergiler. Herşey iyi güzelde sizce hesaplanmış satırların NULL olarak gözükmesi şık mı? Gelin bu satırlara isim verelim.. O halde son başlığımız olan grouping konusunu ele alabiliriz artık. GROUPING kullanımı Grouping, cube ve rollup deyimi ile birlikte kullanılan bir gruplamalı fonksiyondur. Bu deyimlerden dönen ara toplam ve genel toplamların, kullanıcıya daha anlamlı gözükmesi için isimlendirme verilmesi amacı ile kullanılır. Yani NULL satırların Case When sözcükleriyle TOPLAM gibi ifadelere çevrilmesi görevini görür. Dilerseniz konuyu örnekle pekiştirelim; Bakınız Resim-12. Gördüğünüz gibi en alt satıra TOPLAM yazdırdık, aynı şekilde bunu kaç tane kırılım var ise Case When sözcükleriyle çoğaltıp örnek sorgularınızda yazdırabilirsiniz. Bu arada dikkatinizi çekti mi ROLLUP sözcüğünü bu kez farklı bir yazımla kullandım ancak sonuç kümesinde bir fark görülmeyecektir, ROLLUP ya da WITH ROLLUP(WITH CUBE) size aynı sonucu getirecektir. Sadece ROLLUP'da kırılım sütunları birden fazla ise parantez içerisine alınır, WITH ROLLUP'da ise virgülle ayrılır. Aynı işlemi birde isnull ile yapmayı deneyelim; Bakınız Resim-13. Gördüğünüz gibi bir fark yok, aynı sonuç kümesi geldi. Peki o halde GROUPING kullanmanın bize sağladığı avantaj nedir ? Arkadaşlar bir kolon, ya özet kırılımdan dolayı ya da tablodaki değeri NULL olduğu için NULL olarak görünebilir. Grouping() fonksiyonu bize bu iki NULL türünü birbirinden ayırmamızı sağlar. Şimdi bunu güzel bir örnekle pekiştirelim. Öncelikle Sales tablosuna bir manipülasyon yapmamız gerekiyor. Bakınız Resim-14. City satırını gördüğünüz gibi güncelledik. Şimdi bu 3 sütunu özet kırılıma sokup NULL değerlerin yansımasına bakalım; Bakınız Resim-15. Bu örneğimizden de anlaşıldığı gibi NULL değerlerin niteliğini görmek için grouping ile isnull fonksiyonunu iç içe kullanmak en sağlıklı yöntem. Grouping fonksiyonunu rollup, cube ve grouping sets ile kullanabilirsiniz.Şimdi sizlerden ricam benim buraya kadar anlattıklarımı farklı veri kümeleriyle yapmanız, konu böylece daha iyi oturacaktır. Bu amaçla aşağıdaki kod satırını makinenizde çalıştırıp örnek alıştırmaları deneyebilirsiniz. Create Table Employees(Id int primary key, Name varchar(50),Gender nvarchar(10),Salary int,Country nvarchar(10)) GO Insert Into Employees Values(1, 'Mark', 'Male', 5000, 'USA')Insert Into Employees Values(2, 'John', 'Male', 4500, 'India')Insert Into Employees Values(3, 'Pam', 'Female', 5500, 'USA')Insert Into Employees Values(4, 'Sara', 'Female', 4000, 'India')Insert Into Employees Values(5, 'Todd', 'Male', 3500, 'India')Insert Into Employees Values(6, 'Mary', 'Female', 5000, 'UK')Insert Into Employees Values(7, 'Ben', 'Male', 6500, 'UK')Insert Into Employees Values(8, 'Elizabeth', 'Female', 7000, 'USA')Insert Into Employees Values(9, 'Tom', 'Male', 5500, 'UK')Insert Into Employees Values(10, 'Ron', 'Male', 5000, 'USA') Konuya dair anlatacaklarım bu kadar umarım faydalı olmuştur. Bir sonraki makalemde görüşmek üzere diyorum. Not: Sql 2008 den önce kullanılan COMPUTE ve COMPUTE BY deyimleri, önceleri CUBE ve ROLLUP deyimine alternatif olarak kullanılıyordu, ancak takip eden sürümlerde kaldırıldı dolayısı ile eski kodlarınızda bu deyimler var ise elle değiştiriyor olmanız gerekiyor…
Daha FazlaYayınlandı - Çrş, 15 Kas 2023
Oluşturan - Furkan Aslan
SQL Server'da OLAP küpleri oluşturmadan istatistiki analiz imkanı veren birtakım kavramlar vardır. Bu yazımızda bunları inceleyeceğiz.Başlıkta belirtmiş olduğum konular, at ve at arabası gibi sorgularda birlikte koşarlar. Veriler önce gruplara ayrılırlar sonrasında ise bu gruplar hakkında belli değerler bulmak için kullanılırlar. Benim bu yazı dizisinde ele alacağım konu, GROUP BY deyiminin ürettiği sonuçlar üstünde, nasıl istatistiksel özetler elde edildiğini mercek altına almak. Bu deyimler, SQL Server 2008 ile birlikte ANSI SQL 2006 uyumlu olarak yeniden düzenlenmiştir. O halde vakit kaybetmeden başlık konularını tek tek ele alalım. Evvelâ elimizde örnek veri olması açısından aşağıdaki sorguyu veritabanınızda çalıştırmanızı istirham ediyorum. Create Table Sales(Id int primary key, Continent varchar(50),Country varchar(50),City varchar(50),SalesAmount int) GO Insert Into Sales Values(1, 'Asia', 'India', 'Bangalore', 1000)Insert Into Sales Values(2, 'Asia', 'India', 'Chennai', 2000)Insert Into Sales Values(3, 'Asia', 'Japan', 'Tokyo', 4000)Insert Into Sales Values(4, 'Asia', 'Japan', 'Hiroshima', 5000)Insert Into Sales Values(5, 'Europe', 'United Kingdom', 'London', 1000)Insert Into Sales Values(6, 'Europe', 'United Kingdom', 'Manchester', 2000)Insert Into Sales Values(7, 'Europe', 'France', 'Paris', 4000)Insert Into Sales Values(8, 'Europe', 'France', 'Cannes', 5000) ROLLUP ve CUBE kullanımıBu iki deyim herhangi bir OLAP yatırımı olmaksızın, OLTP veritabanında, verilerinizi hızlı bir şekilde özetleyerek, çok çok etkili istatistiksel sonuçlar almanızı sağlarlar..Aggregate functions(SUM, AVG, MAX, MIN ve COUNT) dediğimiz sözcüklerle kullanılırlar ve aynı anda en fazla 10 kolon üzerinde özetleme yapabilirler. Cube ve Rollup birbirlerine çok benzerler ancak aralarında çok ince bir fark vardır. Cube deyimi, en yalın ifade ile gruplama işlemini bir küpe dönüştürür ve bu gruplandırılmış seviyedeki her birleşim için alt toplam oluşturur. Yazım şekline bakacak olursak; Bakınız Resim-1. Rollup deyiminde ise hiyerarşinin tamamı için alt toplam oluşturulabilir. Yani içten dışa doğru sütunlara ait toplamları bularak ilerler. Şimdi bu deyime ait söz dizimine bakalım; Bakınız Resim-2. Görüldüğü gibi şayet bu iki deyim üzerinde tek bir gruplama sütunu kullanıldı ise sonuçlar aynı gelecektir. Şimdi GROUP BY elementi üzerinden sorgularımızı biraz daha genişletip aradaki farkı daha iyi analiz edelim; Bakınız Resim-3.Bakınız Resim-4. Cube deyimi ile yapılan sorguda 48 satır etkilenirken, Rollup ile yapılan sorgu sonucu 15 satır kayıt dönmüştür. Bunun sebebi, cube deyiminin seçilen sütunlardaki değerlerin tüm kombinasyonları için bir sonuç kümesi oluşturması, rollup deyiminde ise seçilen sütunlardaki değerler için hiyerarşik olarak sonuç üretilmesi denilebilir. Cube ve rollup kavramlarını +1 birim daha yakın mercek altına alıp çalışma mantığından bahsetmek istiyorum. Aynı zamanda yukarıda bahsettiklerimde karşılanmış olacak bu sayede. Bakınız Resim-5.Bakınız Resim-6. Şekildeki sorgularda da görüldüğü gibi cube olası tüm kombinasyonları içerir ancak rollup'da özetle hiyerarşik düzen söz konusudur. Peki rollup ve cube kullanımını bilmiyor olsaydık sütun bazlı özet kırılım sonuçlarını nasıl elde ederdik ? Bu sorunun cevabı aşağıdaki şekilde olduğu gibidir. Bakınız Resim-7. Gördüğünüz gibi ne kadar karmaşık ve sorgu tekrarı gerektiren bir sorgu cümlesi. Lütfen bu örnekleri sizde deneyiniz.. ROLLUP ve CUBE kavramları ile ilgili bu kadar detaylı bilgiden sonra sıradaki başlık konularını incelemeye başlayabiliriz. Bundan sonraki başlık konularıda bütün olarak birbirleriyle ilintili olduğu için bu detayların işimize yarayacağını düşünüyorum. O halde makalemize GROUPING SETS kavramıyla devam edebiliriz.. GROUPING SETS kullanımı GROUPING SETS; GROUP BY ile getirilen farklı sonuç sorgularını farklı seviyelerde ele almak için kullanılır. ROLLUP VE CUBE'de olduğu gibi UNION ALL sorgularına alternatiftir. Bu deyim Sql 2008 sonrası, geliştiricilerin kullanımına açılmıştır.GROUP BY ın bir alt sorgusu gibi çalışır ve çoklu sayıda sorgu yazmamıza imkan verir. Burada amaç farklı kırılımlarla veriyi ele alıp buna göre sonuç döndürmektir. Dilerseniz bu ifadenin yazım şekline canlı örnek üzerinden göz atalım; Bakınız Resim-8. Yukarıdaki örneğe bakıldığı zaman, ROLLUP deyimi ile aynı sonucu getirdiğini görüyoruz. Peki kullanım açısından GROUPING SETS ve ROLLUP/CUBE arasında ne fark vardır? Bu sorunun cevabı yine yukarıdaki sorguda saklı diyebilirim zira GROUPING SETS ifadesinde isteğe bağlı olarak kolonlar arasında kırılım yapabiliriz. Ancak ROLLUP/CUBE deyiminde böyle bir şansımız bulunmamaktadır. Bize hiyerarşiyi, yani ara ve genel toplam değerlerini olduğu gibi getirir. Örneğin sadece sütunların ara toplamlarını görmek isteyip genel toplamı görmek istemeyebilirsiniz böyle bir durumda '()' ile belirttiğim satırı sorgudan kaldırıyor olmamız yeterlidir. (Lütfen sizde GROUPING SETS ile farklı kombinasyonları deneyip aradaki farkı görmeye çalışınız.) Anahtar Not: GROUPING SETS içerisinde kullanılan boyutların kullanım sırası önemli değildir. Sürekli aynı sonucu döndürür. Ayrıca yukarıdaki resimde yazmış olduğum ORDER BY deyiminin kullanımına dikkat ediniz. Bakınız Resim-9. Yukarıdaki resimde GROUPING SETS içersinde ROLLUP kullanarak sizlere bu ifadenin bu şekilde de yazılabileceğini göstermek istiyorum. Bu ifadenin anlamı; "Bana Continent alanını sabitle, Country ve City alanlarının ara toplamlarını getir" anlamı taşımaktadır. Daha açık ifade ile bu örnekte ara toplamları istediğimiz kolonlar için açıp kapatabiliriz. Sizde bunun tam tersini yapar mısınız ? Yani Country ve City alanını sabitleyip Continent için ara toplam almayı dener misiniz? Buraya kadar herşey güzel..Ancak çoklu grouping sets sorgularının geliştirici tarafına getirdiği bir karmaşa vardır, bu da özetleme kırılımlarından dönen 'NULL' satırlardır. Bu karmaşayı aşmak için GROUPING_ID fonsiyonunu kullanırız. Şimdi dilerseniz bu fonksiyonu detaylıca ele alalım. GROUPING_ID kullanımı Öncelikle grouping_id fonksiyonuna niçin ihtiyaç duyarız konuya bunu açıklamakla başlayalım. Rollup ve cube ile yapmış olduğumuz örnek sorgu kümelerinde gördüğünüz gibi NULL satırlara rastlıyoruz. Elbette biz biliyoruzki hesaplamalara uğrayan ara ve genel toplamların yansımaları bunlar. Ancak çok çok büyük veri kümeleri ile çalıştığınızı tahayyül edin ve bu işleme soktuğunuz verilerinizin gerçekten NULL satıra sahip olduğunu düşünün. İşte bu durumda dönen satırlar arasındaki ayrımı kolayca fark etmek için bu fonksiyonu kullanırız. Şayet grouping_id için atadığımız parametre değeri geriye 1 döndürüyorsa bu demek oluyorki bu ifade özetlemeden dolayı NULL değer döndürmüştür, ancak herhangi bir özetlemeye sahip satır yoksa 0 değerini döndürür. Bu işlemi özetlenmiş bir sorgu sonucundan sadece ara toplam yada genel toplam satırlarını çekmek için kullanabiliriz. Şimdi bu tanımımızı destekleyecek örnekler yapalım; Bakınız Resim-10. Bu sorguyu inceleyecek olursak; Grouping_id() fonksiyonu ile türetmiş olduğumuz G_Country sütunu için istediğimiz sonucu elde ettik yani gördüğünüz gibi özetlenmiş kısımlarda Country sütununda NULL satırlar için 1 sonucunu geri döndürdük. Gelelim G_Hepsi sütununa. Bu alanda farklı sayısal değerler gözümüze çarpıyor..Bu işlem matematiksel üs alma işlemini yapmıştır arkadaşlar. Son satırdaki 7 değerini inceleyecek olursak; şekildeki sırasıyla Continent(2 üzeri 2 = 4), Country(2 üzeri 1 = 2), City(2 üzeri 0 = 1) Toplam=4+2+1=7 sonucunu elde ettik. Peki bu bizim ne işimize yarar derseniz onu da sorgu üzerinde görelim; Bakınız Resim-11. Sorgu sonucundan gördüğümüz üzere süzme işlemi yaparak ara toplam değerlerini getirdik ya da having koşulunda 7 diyip sadece genel toplamı da getirebiliriz. Bu artık size kalmış.. Anahtar Not: Grouping_id çalışma mantığı kısaca şu şekildedir: GROUPING_ID(A, B, C)= GROUPING(A) + GROUPING(B) + GROUPING(C) Yani içerisinde bulunan parametrelerin tümünü parçalar. Ayrıca binary'den decimal'e doğru bir dönüştürme performansı sergiler. Herşey iyi güzelde sizce hesaplanmış satırların NULL olarak gözükmesi şık mı? Gelin bu satırlara isim verelim.. O halde son başlığımız olan grouping konusunu ele alabiliriz artık. GROUPING kullanımı Grouping, cube ve rollup deyimi ile birlikte kullanılan bir gruplamalı fonksiyondur. Bu deyimlerden dönen ara toplam ve genel toplamların, kullanıcıya daha anlamlı gözükmesi için isimlendirme verilmesi amacı ile kullanılır. Yani NULL satırların Case When sözcükleriyle TOPLAM gibi ifadelere çevrilmesi görevini görür. Dilerseniz konuyu örnekle pekiştirelim; Bakınız Resim-12. Gördüğünüz gibi en alt satıra TOPLAM yazdırdık, aynı şekilde bunu kaç tane kırılım var ise Case When sözcükleriyle çoğaltıp örnek sorgularınızda yazdırabilirsiniz. Bu arada dikkatinizi çekti mi ROLLUP sözcüğünü bu kez farklı bir yazımla kullandım ancak sonuç kümesinde bir fark görülmeyecektir, ROLLUP ya da WITH ROLLUP(WITH CUBE) size aynı sonucu getirecektir. Sadece ROLLUP'da kırılım sütunları birden fazla ise parantez içerisine alınır, WITH ROLLUP'da ise virgülle ayrılır. Aynı işlemi birde isnull ile yapmayı deneyelim; Bakınız Resim-13. Gördüğünüz gibi bir fark yok, aynı sonuç kümesi geldi. Peki o halde GROUPING kullanmanın bize sağladığı avantaj nedir ? Arkadaşlar bir kolon, ya özet kırılımdan dolayı ya da tablodaki değeri NULL olduğu için NULL olarak görünebilir. Grouping() fonksiyonu bize bu iki NULL türünü birbirinden ayırmamızı sağlar. Şimdi bunu güzel bir örnekle pekiştirelim. Öncelikle Sales tablosuna bir manipülasyon yapmamız gerekiyor. Bakınız Resim-14. City satırını gördüğünüz gibi güncelledik. Şimdi bu 3 sütunu özet kırılıma sokup NULL değerlerin yansımasına bakalım; Bakınız Resim-15. Bu örneğimizden de anlaşıldığı gibi NULL değerlerin niteliğini görmek için grouping ile isnull fonksiyonunu iç içe kullanmak en sağlıklı yöntem. Grouping fonksiyonunu rollup, cube ve grouping sets ile kullanabilirsiniz.Şimdi sizlerden ricam benim buraya kadar anlattıklarımı farklı veri kümeleriyle yapmanız, konu böylece daha iyi oturacaktır. Bu amaçla aşağıdaki kod satırını makinenizde çalıştırıp örnek alıştırmaları deneyebilirsiniz. Create Table Employees(Id int primary key, Name varchar(50),Gender nvarchar(10),Salary int,Country nvarchar(10)) GO Insert Into Employees Values(1, 'Mark', 'Male', 5000, 'USA')Insert Into Employees Values(2, 'John', 'Male', 4500, 'India')Insert Into Employees Values(3, 'Pam', 'Female', 5500, 'USA')Insert Into Employees Values(4, 'Sara', 'Female', 4000, 'India')Insert Into Employees Values(5, 'Todd', 'Male', 3500, 'India')Insert Into Employees Values(6, 'Mary', 'Female', 5000, 'UK')Insert Into Employees Values(7, 'Ben', 'Male', 6500, 'UK')Insert Into Employees Values(8, 'Elizabeth', 'Female', 7000, 'USA')Insert Into Employees Values(9, 'Tom', 'Male', 5500, 'UK')Insert Into Employees Values(10, 'Ron', 'Male', 5000, 'USA') Konuya dair anlatacaklarım bu kadar umarım faydalı olmuştur. Bir sonraki makalemde görüşmek üzere diyorum. Not: Sql 2008 den önce kullanılan COMPUTE ve COMPUTE BY deyimleri, önceleri CUBE ve ROLLUP deyimine alternatif olarak kullanılıyordu, ancak takip eden sürümlerde kaldırıldı dolayısı ile eski kodlarınızda bu deyimler var ise elle değiştiriyor olmanız gerekiyor…
Daha FazlaYayınlandı - Çrş, 15 Kas 2023
Oluşturan - Furkan Aslan
Unutulan SQL-Server'ın sa şifresini birkaç satır kod ile sıfırlayıp, yeniden şifre atayabilirsiniz.Bu işlem için Start>Run>cmd.exe (Başlat>Çalıştır>cmd.exe) yolunu izleyip, komut satırına sırasıyla; OSQL -S -E 1> EXEC sp_password NULL, 'yeni_sifre','sa'2>GO Böylece artık 'sa' şifreniz yeni şifre kısmına yazdığınız şifre olacaktır.Diğer yöntem ise SQL Server'ın kurulu olduğu makineye Windows Authentication olarak girip, Logins kısmında sa hesabını bulup ilgili alana yeni atayacağınız parolayı girmektir.Lütfen sizde deneyiniz.. Not: Windows Authentication olarak giriş yapabilmek için localhost, '.', ya da makinenizin adını yazarak girebilirsiniz şayet makine adını unuttu iseniz cmd.exe komut satırına osql -L yazarak server adını öğrenebilirsiniz.
Daha FazlaYayınlandı - Per, 03 Kas 2022
Oluşturan - Furkan Aslan
SQL Server'da tanımlı olan obje'leri(sp, trigger, view v.b) T-Sql sorgusuyla listeleyebilirsiniz. Sysobjects tablosunda yer alan xtype(char veritipi) alanına sorgulamak istediğiniz nesne'nin etiket adını vererek listelemeyi sağlayabilirsiniz. T-Sql kodumuzun yazım şekli şöyledir: select os.name, os.xtype, os.crdate, cs.textfrom sys.sysobjects os join sys.syscomments cs on cs.id=os.idwhere os.xtype='tr' Bu sorgu, sistemimde tanımlı olan tüm trigger'ları getirir. Şayet siz farklı parametrelerle sorgulama yapmak isterseniz, aşağıdaki listeye göre de objelerinize ulaşabilirsiniz. AF: aggregate function AP: application C : check constraintsD : default constraint EN: event notification F : foreign key constraintFN: scalar function FS: assembly scalar function FT: assembly table function IF: inline function IS: inline scalar function IT: internal table L : log P : stored procedure PC : assembly stored procedure PK: primary key constraintR : rule RF: replication filter proc S : system table SN: synonym SQ: queue TA: assembly trigger TF: table function TR: trigger U : user table UQ: unique key constraintV : view X : extended stored procedure Faydalı bir yazı olması dileğiyle. Hepinize iyi çalışmalar..
Daha FazlaYayınlandı - Per, 03 Kas 2022
Oluşturan - Furkan Aslan
SQL Server'da ulama yaptığımız sütunlardan biri bile boş ise sonuç null değer döner. Bunu önlemek için küçük bir sorgu kodu yazmamız gerekiyor.Kimi zaman, birden fazla sütunda yada değişkende yer alan metinleri birleştirmek gerekebilir. Bu işleme ulama (concatenation) denir. Sql'de metinler + işareti ile birleştirilir. Örneğin; SELECT OgrenciID, isim + ' ' + soyad as AdSoyad from tblOgrenci gibi... Ancak ulama yapılan sütunlardan biri bile null ise sonuç yerine null değer çıkar karşımıza. Bunu önlemek için sorgu alanında SET CONCAT_NULL_YIELDS_NULL OFF komutunu yazar isek artık sonuç null değeri dönmeyecektir.
Daha FazlaYayınlandı - Per, 03 Kas 2022
Oluşturan - Furkan Aslan
"The CUBE() and ROLLUP() grouping constructs are not allowed in the current compatibility mode. They are only allowed in 100 mode or higher." bu tarz hatalar ile karşılaşıyorsanız muhtemelen SQL Server ürünü veya uyumluluk seviyesi ile alakalı sorun var demektir...SQL Server'da OLAP küpleri oluşturmadan istatistiki analiz imkanı veren birtakım kavramlar vardır. Bu yazımızda bunları inceleyeceğiz.
Daha FazlaYayınlandı - Per, 03 Kas 2022
Per, 14 Ara 2023
Per, 14 Ara 2023
Per, 14 Ara 2023
Herkese açık bir inceleme yazın