Herhangi bir veritabanı tablosundaki "tablo_adından seç say (1)" ne anlama geliyor?


93

Çalıştırdığımızda select count(*) from table_namesatırların sayısını döndürür.

Ne yapar count(1)? 1Burada ne anlama geliyor? Bu, count(*)(yürütmede aynı sonucu verdiği için) ile aynı mı?


1
İlginç soru. Cevabın uygulamaya bağlı olup olmadığıyla da ilgileniyorum (örneğin, sorgunun sonucunun SQL Server'daki Oracle'daki ile aynı olup olmadığı).
Jon Schneider

Yanıtlar:


107

COUNT işlevinin parametresi, her satır için değerlendirilecek bir ifadedir. COUNT işlevi, ifadenin boş olmayan bir değer olarak değerlendirildiği satır sayısını döndürür. (* değerlendirilmemiş özel bir ifadedir, yalnızca satır sayısını döndürür.)

İfade için iki ek değiştirici vardır: ALL ve DISTINCT. Bunlar, kopyaların atılıp atılmayacağını belirler. TÜM varsayılan olduğu için, örneğiniz sayım (TÜMÜ 1) ile aynıdır, bu da kopyaların tutulduğu anlamına gelir.

"1" ifadesi her satır için boş olmayan olarak değerlendirildiğinden ve kopyaları kaldırmadığınız için COUNT (1) her zaman COUNT (*) ile aynı sayıyı döndürmelidir.


Table1'den DISTINCT coloumn1'i seçmeyi unutmayın! = Table1'den count (DISTINCT coloumn1) seçin;
Kanagavelu Sugumar

Ayrıca count (1) burada 1 sütun no değil, bir ifadedir. örneğin) tablo1'den 1'i seçin; tablonun sahip olduğu satırların hiçbiri için 1 kez yazdıracaktır.
Kanagavelu Sugumar

tablo1'den sayımı (DISTINCT / ALL columnName) seçin; sütunun (columnName) tüm / farklı NOT NULL değerlerini döndürür.
Kanagavelu Sugumar

tablo1'den DISTINCT sütun1'i seçin; sütunda bir NULL değeri içerecektir (sütun1). tablo1'den sayımı (DISTINCT coloumn1) seçin; bir NULL satırı bile içermeyecektir.
Kanagavelu Sugumar

1
@datps - Aslında aynı sonucu veren sınırsız sayıda ifade vardır. COUNT ('Merhaba, dünya!') Da aynı şekilde çalışmalıdır. (Ben denemedim.) O halde soru şu: Aynı şeyi yapmanın sınırsız sayıda yolu varken neden özel bir ifade (*) oluşturalım? SQL'in yaratıcıları adına konuşamam (telafi etmek için pek çok günahı olan :)), ancak bu muhtemelen insanların keyfi olarak boş olmayan bir ifade seçmek zorunda kalmayacakları içindir. Bu, sorgu yazarının amacını bulanıklaştırırdı. "Neden 2 yerine 1 yazmışlar? Bunun bir anlamı olmalı!"
Jeffrey L Whitledge

26

İşte sorularınızı yanıtlamanıza yardımcı olacak bir bağlantı . Kısacası:

count (*) bunu yazmanın doğru yoludur ve count (1) dahili olarak sayılmak (*) OLMAK İÇİN OPTİMİZE EDİLMİŞTİR - çünkü

a) 1'in boş olmadığı
satırları sayın, b) satırları sayın


17

Oracle'da count (*) ve count (1) arasındaki fark nedir?

count (*), tüm kayıtları sayacağı anlamına gelir, yani her hücre AMA

count (1), değeri 1 olan bir sözde sütun ekleyeceği ve tüm kayıtların sayısını döndürdüğü anlamına gelir


9

Bu, arasındaki farka benzer

SELECT * FROM table_name and SELECT 1 FROM table_name.  

Yaparsan

SELECT 1 FROM table_name

tablodaki her satır için size 1 sayısını verecektir. Yani evet count(*)ve count(1)isteyerek count(8)veyacount(column_name)


3
count (sütun_adı) tam olarak aynı değildir - o sütunda boş olan satırları saymaz. Ayrıntılar için buraya bakın: stackoverflow.com/questions/169784
Blorgbeard

Hmm, aslında bu SQL Server için. Oracle sanırım farklı çalışabilir.
Blorgbeard

Count, standart SQL, ORacle ve SQL Server'a göre hiçbir zaman NULL değerleri kullanmamalıdır, bu konuda aynı davranışa sahip olmalıdır.
Thorsten

"SELECT * FROM tablo_adı ile SELECT 1 FROM tablo_adı arasındaki farka benzer." -- pek sayılmaz. SELECT * ve SELECT 1 farklıdır. SELECT (*) ve SELECT (1) aynı sonucu verir.
David Aldridge

7

Fark yok.

COUNT(1)temelde her satır için sabit bir değer 1 sütununu saymaktır. Buradaki diğer kullanıcıların söylediği gibi, COUNT(0)veya ile aynı COUNT(42). NULLDeğer olmayan herhangi bir şey yeterli olacaktır.

http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::::P11_QUESTION_ID:1156151916789

Oracle optimizer görünüşe göre hatalar içeriyordu, bu da sayımın seçtiğiniz sütundan ve bir dizinde olup olmadığından etkilenmesine neden oldu, bu nedenle COUNT (1) kuralı ortaya çıktı.


5
SELECT COUNT(1) from <table name>

tam olarak aynı şeyi yapmalı

SELECT COUNT(*)  from <table name>

SELECT COUNT(*)Bazı veritabanlarında olduğundan daha iyi performans göstermesinin bazı nedenleri olabilir veya hala olabilir , ancak bunu DB'de bir hata olarak değerlendirebilirim.

SELECT COUNT(col_name) from <table name>

ancak verilen sütun için yalnızca boş olmayan değere sahip satırları saydığından farklı bir anlamı vardır.


3

oracle'da bunların tamamen aynı anlama sahip olduğuna inanıyorum


1, birinci sütuna mı atıfta bulunuyor?
dacracot

1
hayır, 1 sabit sayı 1'i ifade eder. SİPARİŞLE 1 dediğinizde, birinci sütunu ifade eder.
Thilo

Bir süre önce merak ettiğim şey buydu, ancak sütun sayısından daha büyük herhangi bir sayı belirtebilirsiniz, yine de sonuç aynı. Yani kesinlikle sütun numarası değil.
Nrj

@dacracot: Olabilir ama buna inanmıyorum. Oracle'ın anladığım kadarıyla arka planda saymak (*) için count (1) 'i yeniden yazıyor
Jarod Elliott

2

Bu şekilde test edebilirsiniz:

create table test1(
 id number,
 name varchar2(20)
);

insert into test1 values (1,'abc');
insert into test1 values (1,'abc');

select * from test1;
select count(*) from test1;
select count(1) from test1;
select count(ALL 1) from test1;
select count(DISTINCT 1) from test1;

0

Kime sorduğunuza bağlı olarak, bazı insanlar yürütmenin select count(1) from random_table;daha hızlı çalıştığını bildiriyor select count(*) from random_table. Diğerleri tamamen aynı olduklarını iddia ediyor.

Bu bağlantı , 2 arasındaki hız farkının FULL TABLE SCAN ile FAST FULL SCAN'den kaynaklandığını iddia ediyor.


Bağlantıyı yanlış yorumluyorsunuz. LS, COUNT (COLUMN) 'un COUNT (*) ile aynı ve daha hızlı olabileceğini, ancak yalnızca NOT NULL sütunları dizinlenmediğinde, ancak COLUMN dizinlendiğinde ve gerçekte boş değer içermediğinde işaret ediyor. Daha çok hileli bir soru.
David Aldridge

1
Bağlantıyı, bazı durumlarda COUNT (1) 'in COUNT (*)' dan daha hızlı olabileceği iddiasını belgelemek için kullanmaya çalışıyordum. Daha önceki bazı cevaplar, 2 arasında hiçbir fark olmadığını ifade etmişti ve ben olası bir karşı örnek veriyorum.
Johann Zacharee
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.