Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
SQL Count() için Kullanım Şekli
#11
(14-03-2022, Saat: 10:09)mrmarman Adlı Kullanıcıdan Alıntı: 0 yerine 12345 yazın bir de fantastik olsun.

Count(0) = Count(*) peşinen parantez içi rakam vermek ifadesi ile belirtmiştim üstadım.

SQLfiddler linki verdim bence orada deneyin faydalı bir site

Gözümden kaçmış. Teşekkürler.
Bildiğimden değil ama; bilenin bu ayrımı bir gerekçeye dayanarak yaptığını düşünüyorum. 
SQL de bir birini ikame eden ifadeler pek olmadığından yola çıkarak; Count(*) ile Count(sayısaldeğer) arasında bir fark olmalı diye tahmin ediyorum.
Begin : = end / 2;
Cevapla
#12
Merhaba,

Konuya ufak fakat önemli bir kaç not eklemek istiyorum ;
Öncelikle kendi fikrim olarak * kullanımını hiçbir zaman tavsiye etmem. SELECT * FROM kullanımı bile kabul edilebilir değil.
ilk etapta kullanmak zorunda kalsanız bile SELECT TOP 1 * FROM ya da LIMIT 1 gibi eklemeler ile kullanın, İşinize yarayacak olan sütunları alın ve * yerine onları ekleyin. Tüm sütunları kullanacak olsanız bile * yerine tek tek sütunları girin. İleriye dönük olması açısından düzenlenebilir ve convert edilebilir halde olurlar. Ayrıca kodunuzu daha anlaşılır kılacaktır.
Her gün milyonlarca satır kayıt onlarca sütun ve yüzlerce tablo ile işlemler yaptığımdan olsa gerek * kullanımına karşı çıkmaya başladım çünkü tamamıyla zaman kaybı. SQL'in hız konusundaki anlamını yitirmesine neden oluyor. MongoDB kullananlar gülüyorlardır tabi  Wink ( Mutlaka Mongo öğrenin  Smile Smile  )

Gelelim count meselesine ;
Count(*) kullanımı da Count(kisi_id) kullanımı da doğru değil. Neyi arıyorsanız onu saydırın. "Count(Kişi_adi)"

Peki neden ?
Count yapısı bize Sayın Muharrem Arman'ın da örneklemeleri ile bariz olarak göstermektedir ki her sütunu sayar
Örneğin A B C sütunları olduğunu ve A sütununda 5, B sütununda 4, C sütununda 8 kayıt olduğunu kabul edelim. Biz eğer Count(*) şeklinde kullanır isek komut sayılabilir tüm sütunları ve bu sütunlardaki sayılabilir ( Null olmayan ) tüm satırları sayacaktır.
Sonuç olarak ise sayılabilmiş maksimum değer ne ise onu gösterecektir. Yani 8.
Sadece Count(A) olsa idi 5, Sadece Count(B) olsa idi 4, Sadece Count(*) olsa idi 8 değeri gelecekti. Ve sadece belirttiğimiz sütunda işlem yaptığı için dolaylı yoldan 1/sütun adedi hızında daha performanslı çalışmış olacaktı.
Sütun adediniz fazla değilse Count(*) ile Count(Sütun) kullanımı arasındaki hız farkını ayırt edemezsiniz. Fakat LOGO gibi yazılımların tablolarında sütunlar 30 hatta daha fazla olabiliyor. Burada Count(*) şeklinde kullanmak mesaiyi boşa geçirmek için iyi bir fırsat.
Bu hız farkını tecrübe etmiş birisi olaraktan Count(*) dahil olmak üzere * kavramını yok etmeye çalışın.
Yazdığınız ya da yazacağınız yüzlerce satırlık SQL kodları arasında bu gibi ufak detaylar sorgu süresini bir hayli etkilemektedir. Sırf bu yüzden veritabanını Mongoya çeviren tanıyorum. Halbuki SQL kodlaması sağlıklı olsa hiçbir sorun olmayacaktı.  Smile


Count(Sütun) kullanımını anlamak için bu koda bakabilirsiniz ;
SELECT count(A.isim) FROM (SELECT isim FROM tablo1) A
Cevapla
#13
@Mr.X

SELECT kullanımını üzerindeki anlatımınıza katılıyorum. 

Count(*) anlatımınızda ise detay verirken  "her sütunu sayar" deyince devam eden paragraf ile birleşince  sanki ayrı ayrı sayıyor gibi anlam çıkabilir. 
Bir de sayılabilir kısmında parantez içi ifade hatalı olmuş. 
 
özetle tüm sürunları olan bir select çekip satır sayısını döndürür desek yeterlidir. Bu kadar basit. null var mı yok mu polemiğe girmez. 

Yani SELECT * FROM tablo1

sorgusu sonucu row count neyse onu döndürür. Count parantezinde * gördüm diye sütunları ayrı ayrı saymaz yani. Yanlış anlaşılmasın. 

Aslında tüm anlatımın özeti son verdiğiniz SQL Cümlesindeki yapı. Teşekkürler.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#14
Küçük bir görsel hatırlatma ile bende bir katkıda bulunayım istedim.
Count kullanımı sıradında yeni kullananların en çok düştüğü hatayı aşağıdaki görüntüde örneklemeye çalışayım

Where şartı kullandığınızda Select kısmında kullandığınız count sayısının sonuç ile ilgili olduğunu sakın düşünmeyin

Örnekte olduğu gibi hiç bir where şartı yok 
ve count sayıları farklılık gösteriyor
Burada count parantez içerisinde verilen alanın NULL değerini kontrol eder.

illaki Count içine birşeyler yazacaksanız önerim key alanı tek alandan oluşuyorsa bu alanı kullanın

   
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#15
Benden size bir öneri COUNT(*) ile sorgular için
SELECT COUNT(1)
yazınız daha hızlı ve aynı sonucu alırsınız.
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#16
(15-03-2022, Saat: 10:29)narkotik Adlı Kullanıcıdan Alıntı: Benden size bir öneri COUNT(*) ile sorgular için
SELECT COUNT(1)
yazınız daha hızlı ve aynı sonucu alırsınız.

Yaklasik 500 bin kaydin ve 59 sutunun oldugu firebird kullanilan bir veritabanindaki sorgu sonuclarim.
select count(*) from tablo_adi  (sonuc: 300-380 milisaniye)
select count(1) from tablo_adi  (sonuc: 300-380 milisaniye)
select count(id) from tablo_adi  (sonuc: 800-1000 milisaniye id alani primary key)

Bu sorgulari ust ustte 5' den fazla arka arkaya calistirdim.
Cevapla
#17
Buradaki herkes Count kulanımı konusunda haklı. Sadece şunu belirtmek istedim (ve Firebird özelinde). Eğer veritabanınız içerisinde Computed Field (Hesaplanmış alanlar) kullanıyorsanız, count(*) kullanımı ile count(id) şeklinde kullanım çok fark edecektir. Benim veritabanımdan şöyle bir resim paylaşayım :

s93tdi9.jpg

Eğer * şeklinde kullanırsam, sorgunun dakika sürdüğü bile oluyor. Çünkü farklı farklı tablolardan farklı farklı alanları kullanarak hesaplamalar yapılıyor. Bu sebeple eğer bu şekilde bir kullanımınız varsa * yerine sadece istediğiniz alanı kullanmanız, performans olarak çok fark eder.
Firebird Ekipler Amiri. Dmitry Kouzmenko ve Dmitry Yemanov ile çalışmış , Eski IBSurgeon personeli, Kıdemli Firebird Kurtarma Uzmanı, Firebird Foundation bağışçısı...
Cevapla
#18
(13-03-2022, Saat: 20:14)mrmarman Adlı Kullanıcıdan Alıntı: @sabanakman Count(*) ile Count(AlanAdi) arasında fark yok derken NULL olanlar dışında demek istediniz değil mi ? ...
NULL değeri o kadar yok saymışız demek ki!  Tongue

Bu arada SQL Server Managment Studio içinde bulunan "Execution Plan" (Ctrl + L) ile sorgular üzerinde nasıl bir çalışma yapılıyor şema olarak gözlenebiliyor. Count içinde belirtilen alana göre performans değişecektir ama Primary Key olan bir tabloda * veya PK alanı kullanımı arasında fark yok gibi sanırım.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Pratik MySQL Kullanım Örnekleri vkamadan 12 19.451 02-08-2022, Saat: 08:43
Son Yorum: vkamadan
  MySQL-Her Client İçin Neden User Tanımlaması Gerekli hi_selamlar 18 12.279 25-08-2020, Saat: 11:38
Son Yorum: mkysoft
  create de edilen mysqlde her bir alan için 3 ayrı dosya oluşması ahmetb 7 6.062 14-01-2019, Saat: 11:17
Son Yorum: Fesih ARSLAN



Konuyu Okuyanlar: 1 Ziyaretçi