SQL'de count (sütun) ve count (*) arasındaki fark nedir?


205

Aşağıdaki sorgu var:

select column_name, count(column_name)
from table
group by column_name
having count(column_name) > 1;

Ben tüm çağrıları yerini fark eder ne olurdu count(column_name)hiç count(*)?

Bu sorudan, Oracle'daki bir tabloda yinelenen değerleri nasıl bulabilirim? .


Kabul cevap (ve belki sorumu) netleştirmek için, değiştirilmesi count(column_name)ile count(*)bir içeren sonuç fazladan bir satır döneceğini nullve sayısını nullsütunundaki değerler.

Yanıtlar:


235

count(*)NULL'ları sayar ve count(column)yok

[değiştir] bu kodu insanların çalıştırabilmesi için ekledi

create table #bla(id int,id2 int)
insert #bla values(null,null)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,null)

select count(*),count(id),count(id2)
from #bla

sonuçlar 7 3 2


8
Sadece merak ediyorum: tüm NULL'ları içeren bir satırınız varsa , count (*) yine de sayıyor mu yoksa sadece tüm sütunlar için count (sütun) mu?
Joel Coehoorn

7
Bu standart DBMS'lerde mi?
Tutulma

51
Kimlik gibi boş olmayan bir sütununuz varsa, count (ID) değerinin count (*) üzerindeki performansı önemli ölçüde artıracağını belirtmek gerekir.
tsilb

12
@tsilb: @Alan tarafından gönderilen yanıt "sayım (*), doğru ise yorumunuzu geçersiz kılan" gerçek veri satırları yerine söz konusu tablodaki dizinlere bakılarak "hesaplanır. @Alan'ın yanlış olabileceğini takdir ediyorum, ancak hangisinin doğru olduğunu bulmak için bilgilerinizin kaynağıyla ilgileniyorum.
Tony

12
@tsilb: Birçok modern sorgu iyileştirici, sayıyı (*) anlam ifade ettiğinde dizinleri kullanmak üzere optimize eder.
Shannon Severance

37

* İle belirli bir sütunu kullanma arasındaki bir diğer küçük fark, sütun durumunda DISTINCT anahtar sözcüğünü ekleyebileceğiniz ve sayımı farklı değerlerle sınırlayabileceğinizdir:

select column_a, count(distinct column_b)
from table
group by column_a
having count(distinct column_b) > 1;

1
Sütuna göre grup ve sayılan grup farklı mı olmalı? aksi halde bu sorgudan hiçbir şey almazsınız
steevc

Evet, üzgünüm .. Örnekte aynı sütun olduklarını fark etmemiştim. Gönderiyi güncelleyeceğim.
Brannon

16

Diğer ve belki de ince bir fark, bazı veritabanı uygulamalarında, sayının (*), gerçek veri satırları yerine söz konusu tablodaki dizinlere bakılarak hesaplanmasıdır. Belirli bir sütun belirtilmediğinden, gerçek satırlarla ve değerleriyle uğraşmanıza gerek yoktur (belirli bir sütunu saydığınızda olduğu gibi). Veritabanının dizin verilerini kullanmasına izin vermek, "gerçek" satırları saymaktan çok daha hızlı olabilir.


5
+1 Evet, Oracle ve 9.2'den sonraki PostgreSQL için kesinlikle doğrudur.
David Aldridge

@DavidAldridge Belirtilen belgelere (özellikle postgresql için) bir işaretçi sağlayabilir misiniz? Teşekkürler.
Bhushan


10

Dokümanlardaki açıklama , bunu açıklamaya yardımcı olur:

COUNT (*), NULL değerler ve kopyalar dahil olmak üzere bir gruptaki öğe sayısını döndürür.

COUNT (ifade), bir gruptaki her satır için ifadeyi değerlendirir ve boş olmayan değerlerin sayısını döndürür.

Yani count (*) null içerir, diğer yöntem içermez.


SQL yeni başlayanlar için: Hangi yardım dosyasına başvuruyorsunuz?
Kertenkele Bill

10

Basit bir sorgu ile farkı göstermek için Stack Exchange Veri Gezgini'ni kullanabiliriz. Stack Overflow veritabanındaki Kullanıcılar tablosunda, kullanıcının Web Sitesi URL'si gibi boş bırakılan sütunlar bulunur.

-- count(column_name) vs. count(*)
-- Illustrates the difference between counting a column
-- that can hold null values, a  'not null' column, and  count(*)

select count(WebsiteUrl), count(Id), count(*) from Users

Eğer yukarıdaki sorguyu çalıştırırsanız Data Explorer , sen sayımı için de aynı olduğunu göreceksiniz count(Id)ve count(*)çünkü Idsütun izin vermez nulldeğerleri. WebsiteUrlSütun izin verdiğinden sayımı olsa da, çok daha düşüktür null.


2

Temel olarak COUNT(*)işlev bir tablodan tüm satırları döndürür COUNT(COLUMN_NAME); yani buradaki herkesin de cevapladığı boş değerleri içermez. Ancak en ilginç kısım, sorguları ve veritabanını optimize etmek, COUNT(*)birden fazla sayım veya karmaşık bir sorgu yapmadan kullanmak daha iyidir COUNT(COLUMN_NAME). Aksi takdirde, çok sayıda veriyle uğraşırken DB performansınızı gerçekten düşürür.


1
  • COUNT (*) cümle, SQL Server'ın NULL'ler de dahil olmak üzere bir tablodaki tüm satırları döndürmesini belirtir.
  • COUNT (sütun_adı) yalnızca satırlarda boş olmayan bir değere sahip satırları alır.

SQL Server 2008 test yürütmeleri için lütfen aşağıdaki koda bakın:

-- Variable table
DECLARE @Table TABLE
(
      CustomerId int NULL 
    , Name nvarchar(50) NULL
)

-- Insert some records for tests
INSERT INTO @Table VALUES( NULL, 'Pedro')
INSERT INTO @Table VALUES( 1, 'Juan')
INSERT INTO @Table VALUES( 2, 'Pablo')
INSERT INTO @Table VALUES( 3, 'Marcelo')
INSERT INTO @Table VALUES( NULL, 'Leonardo')
INSERT INTO @Table VALUES( 4, 'Ignacio')

-- Get all the collumns by indicating *
SELECT  COUNT(*) AS 'AllRowsCount'
FROM    @Table

-- Get only content columns ( exluce NULLs )
SELECT  COUNT(CustomerId) AS 'OnlyNotNullCounts'
FROM    @Table

1

COUNT(*) - Bir tablodaki toplam kayıt sayısını döndürür (NULL değerli kayıtlar dahil).

COUNT(Column Name) - NULL olmayan kayıtların toplam sayısını döndürür. Bu, belirli bir sütundaki NULL değerli kayıtları saymayı göz ardı ettiği anlamına gelir.


0

Kullanmak en iyisidir

Count(1) in place of column name or * 

bir tablodaki satır sayısını saymak için herhangi bir formattan daha hızlıdır, çünkü sütun adını tabloya var olup olmadığını asla kontrol etmez


4
En azından Oracle için yanlış ve diğer RDBMS'ler için de şüpheleniyorum. Dahili olarak count (1), count (*) değerine dönüştürülür. Özellikle, count (*) performansı, sıradan bir yanlış anlama olan satırların boyutundan olumsuz olarak etkilenmez.
David Aldridge

Bu SQL Server için geçerlidir. @Ali Adravi dediği gibi, COUNT(*)karşılaştırmalı olarak COUNT(columnName), bunun nedeni sadece numaralandırmak satırları sütun değerini kontrol etmek gitmeyecek. Ancak bir sütuna uygulandığında COUNT(columnName)bile daha yavaştır ! En azından SQL Server'da elbette. countid
ABS

0

Tablonuzda bir sütun düzeltilmişse fark yoktur, birden fazla sütun kullanmak istiyorsanız, ne kadar sütun saymanız gerektiğini belirtmeniz gerekir ......

Teşekkürler,


0

Önceki cevaplarda belirtildiği gibi sütunları Count(*)bile sayar.NULLcount(Columnname) sayarken, yalnızca sütunun değerleri varsa sayar.

Her zaman kaçınmak için en iyi yöntem *( Select *, count *, ...)


Kaçınılması gereken en iyi uygulama değilCOUNT(*)
David Faber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.