“ select count (1) from table_name” ในตารางฐานข้อมูลหมายถึงอะไร


93

เมื่อเราดำเนินการselect count(*) from table_nameจะส่งกลับจำนวนแถว

อะไรcount(1)ทำอย่างไร ที่1นี่มีความหมายอะไร? สิ่งนี้เหมือนกับcount(*)(เนื่องจากให้ผลลัพธ์เดียวกันกับการดำเนินการ) หรือไม่


1
คำถามที่น่าสนใจ ฉันยังสนใจด้วยว่าคำตอบนั้นขึ้นอยู่กับการนำไปใช้งานหรือไม่ (เช่นผลลัพธ์ของแบบสอบถามจะเหมือนกันใน SQL Server เหมือนกับที่อยู่ใน Oracle)
Jon Schneider

คำตอบ:


107

พารามิเตอร์ของฟังก์ชัน COUNT คือนิพจน์ที่จะประเมินสำหรับแต่ละแถว ฟังก์ชัน COUNT ส่งคืนจำนวนแถวที่นิพจน์ประเมินเป็นค่าที่ไม่ใช่ค่าว่าง (* เป็นนิพจน์พิเศษที่ไม่ได้รับการประเมินเพียงแค่ส่งคืนจำนวนแถว)

มีตัวแก้ไขเพิ่มเติมสองตัวสำหรับนิพจน์: ALL และ DISTINCT สิ่งเหล่านี้กำหนดว่าจะทิ้งรายการที่ซ้ำกันหรือไม่ เนื่องจาก ALL เป็นค่าเริ่มต้นตัวอย่างของคุณจึงเหมือนกับ count (ALL 1) ซึ่งหมายความว่ารายการที่ซ้ำกันจะยังคงอยู่

เนื่องจากนิพจน์ "1" ประเมินค่าเป็นไม่เป็นค่าว่างสำหรับทุกแถวและเนื่องจากคุณไม่ได้ลบรายการที่ซ้ำกัน COUNT (1) จึงควรส่งคืนตัวเลขเดียวกันกับ COUNT (*) เสมอ


จำเลือก DISTINCT coloumn1 จาก table1! = select count (DISTINCT coloumn1) จาก table1;
Kanagavelu Sugumar

ยังนับ (1) ที่นี่ 1 ไม่ใช่ coloumn no เป็นนิพจน์ เช่น) เลือก 1 จาก table1; จะพิมพ์ 1 ครั้งสำหรับไม่มีแถวที่มีตาราง
Kanagavelu Sugumar

เลือกจำนวน (DISTINCT / ALL columnName) จาก table1; จะคืนค่าไม่ทั้งหมด / ไม่ซ้ำค่า NOT NULL ของคอลัมน์ (columnName)
Kanagavelu Sugumar

เลือก DISTINCT column1 จาก table1; จะรวมค่า NULL หนึ่งค่าในคอลัมน์ (column1) เลือกจำนวน (DISTINCT coloumn1) จาก table1; จะไม่รวมแถว NULL แม้แต่แถวเดียว
Kanagavelu Sugumar

1
@datps - มีนิพจน์ไม่ จำกัด จำนวนที่ให้ผลลัพธ์เหมือนกัน COUNT ('Hello, world!') ก็น่าจะใช้ได้เช่นกัน (ยังไม่ได้ลอง) คำถามคือทำไมต้องสร้างนิพจน์พิเศษ (*) ในเมื่อมีวิธีการทำสิ่งเดียวกันไม่ จำกัด จำนวน ฉันไม่สามารถพูดแทนผู้สร้าง SQL ได้ (ซึ่งมีบาปมากมายที่ต้องชดใช้ :)) แต่อาจเป็นไปได้ว่าผู้คนไม่จำเป็นต้องเลือกนิพจน์ที่ไม่ใช่ค่าว่างโดยพลการ นั่นจะทำให้เจตนาของผู้เขียนข้อความค้นหาสับสน "ทำไมพวกเขาถึงเขียน 1 แทนที่จะเป็น 2 นี่ต้องหมายถึงอะไรบางอย่าง!"
Jeffrey L Whitledge

26

นี่คือลิงค์ที่จะช่วยตอบคำถามของคุณ ในระยะสั้น:

นับ (*) เป็นวิธีที่ถูกต้องในการเขียนและการนับ (1) นั้นเหมาะสมที่สุดที่จะนับ (*) เป็นการภายใน - ตั้งแต่

a) นับแถวที่ 1 ไม่ใช่ null มีประสิทธิภาพน้อยกว่า
b) นับแถว


17

ความแตกต่างระหว่าง count (*) และ count (1) ใน oracle?

count (*) หมายความว่าจะนับระเบียนทั้งหมดเช่นแต่ละเซลล์ แต่

count (1) หมายความว่าจะเพิ่มคอลัมน์หลอกหนึ่งคอลัมน์ที่มีค่า 1 และส่งคืนจำนวนระเบียนทั้งหมด


9

ซึ่งคล้ายกับความแตกต่างระหว่าง

SELECT * FROM table_name and SELECT 1 FROM table_name.  

ถ้าคุณทำ

SELECT 1 FROM table_name

จะให้หมายเลข 1 สำหรับแต่ละแถวในตาราง ใช่count(*)และcount(1)จะให้ผลลัพธ์เช่นเดียวกับพินัยกรรมcount(8)หรือcount(column_name)


3
count (column_name) ไม่เหมือนกัน - ไม่นับแถวที่มีค่าว่างในคอลัมน์นั้น ดูรายละเอียดได้ที่นี่: stackoverflow.com/questions/169784
Blorgbeard จะออกใน

อืมจริงๆแล้วสำหรับ SQL Server Oracle อาจทำงานแตกต่างกันฉันคิดว่า
Blorgbeard ออกใน

Count ไม่ควรใช้ค่า NULL ตามมาตรฐาน SQL, ORacle และ SQL Server ควรมีลักษณะการทำงานเหมือนกันในเรื่องนี้
Thorsten

"คล้ายกับความแตกต่างระหว่าง SELECT * FROM table_name และ SELECT 1 FROM table_name" - ไม่จริง SELECT * และ SELECT 1 แตกต่างกัน SELECT (*) และ SELECT (1) ให้ผลลัพธ์เดียวกัน
David Aldridge

7

ไม่มีความแตกต่างกัน

COUNT(1)โดยพื้นฐานแล้วก็คือการนับค่าคงที่ 1 คอลัมน์สำหรับแต่ละแถว ขณะที่ผู้ใช้อื่น ๆ ที่นี่ได้กล่าวว่ามันเป็นเช่นเดียวกับหรือCOUNT(0) COUNT(42)ไม่มีNULLค่าใด ๆก็เพียงพอแล้ว

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

เห็นได้ชัดว่า Oracle Optimizer ใช้เพื่อมีจุดบกพร่องซึ่งทำให้การนับได้รับผลกระทบจากคอลัมน์ที่คุณเลือกและไม่ว่าจะอยู่ในดัชนีหรือไม่ดังนั้นการประชุม COUNT (1) จึงเกิดขึ้น


5
SELECT COUNT(1) from <table name>

ควรทำสิ่งเดียวกันกับ

SELECT COUNT(*)  from <table name>

อาจมีหรือยังคงมีเหตุผลบางประการที่ทำให้มันทำงานได้ดีกว่าSELECT COUNT(*)ในฐานข้อมูลบางตัว แต่ฉันจะพิจารณาว่ามีข้อบกพร่องในฐานข้อมูล

SELECT COUNT(col_name) from <table name>

อย่างไรก็ตามมีความหมายที่แตกต่างกันเนื่องจากนับเฉพาะแถวที่มีค่าที่ไม่ใช่ค่าว่างสำหรับคอลัมน์ที่ระบุ


3

ใน oracle ฉันเชื่อว่าสิ่งเหล่านี้มีความหมายเหมือนกันทุกประการ


1 อ้างถึงคอลัมน์หนึ่งหรือไม่?
dacracot

1
ไม่ 1 หมายถึงจำนวนคงที่ 1 เมื่อคุณพูดว่า ORDER BY 1 หมายถึงคอลัมน์ที่หนึ่ง
Thilo

นั่นคือสิ่งที่ฉันสงสัยในขณะที่ย้อนกลับไป แต่คุณสามารถระบุตัวเลขใดก็ได้ที่มากกว่าจำนวนคอลัมน์ผลลัพธ์ก็ยังเหมือนเดิม ดังนั้นจึงไม่ใช่หมายเลขคอลัมน์แน่นอน
Nrj

@dacracot: มันอาจจะ แต่ฉันไม่เชื่ออย่างนั้น จากสิ่งที่ฉันเข้าใจ oracle เพิ่งเขียนใหม่ count (1) เพื่อนับ (*) ในพื้นหลัง
Jarod Elliott

2

คุณสามารถทดสอบดังนี้:

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

ทั้งนี้ขึ้นอยู่กับคนที่คุณถามบางคนรายงานว่าการดำเนินการวิ่งได้เร็วกว่าselect count(1) from random_table; select count(*) from random_tableคนอื่นอ้างว่าเหมือนกันทุกประการ

ลิงค์นี้อ้างว่าความแตกต่างของความเร็วระหว่าง 2 อันเนื่องมาจาก FULL TABLE SCAN เทียบกับ FAST FULL SCAN


คุณกำลังตีความลิงก์ผิด LS กำลังสร้างจุดที่ COUNT (COLUMN) สามารถเท่ากันและเร็วกว่า COUNT (*) แต่ก็ต่อเมื่อไม่มีการจัดทำดัชนีคอลัมน์ NOT NULL แต่ COLUMN ถูกจัดทำดัชนีและไม่มีค่า null คำถามหลอกลวงอื่น ๆ
David Aldridge

1
ฉันพยายามใช้ลิงก์เพื่อบันทึกการอ้างสิทธิ์ที่ในบางสถานการณ์ COUNT (1) อาจเร็วกว่า COUNT (*) คำตอบก่อนหน้านี้บางคำให้การว่าไม่มีความแตกต่างระหว่าง 2 และฉันกำลังให้ตัวอย่างการโต้แย้งที่เป็นไปได้
Johann Zacharee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.