เมื่อเราดำเนินการselect count(*) from table_name
จะส่งกลับจำนวนแถว
อะไรcount(1)
ทำอย่างไร ที่1
นี่มีความหมายอะไร? สิ่งนี้เหมือนกับcount(*)
(เนื่องจากให้ผลลัพธ์เดียวกันกับการดำเนินการ) หรือไม่
เมื่อเราดำเนินการselect count(*) from table_name
จะส่งกลับจำนวนแถว
อะไรcount(1)
ทำอย่างไร ที่1
นี่มีความหมายอะไร? สิ่งนี้เหมือนกับcount(*)
(เนื่องจากให้ผลลัพธ์เดียวกันกับการดำเนินการ) หรือไม่
คำตอบ:
พารามิเตอร์ของฟังก์ชัน COUNT คือนิพจน์ที่จะประเมินสำหรับแต่ละแถว ฟังก์ชัน COUNT ส่งคืนจำนวนแถวที่นิพจน์ประเมินเป็นค่าที่ไม่ใช่ค่าว่าง (* เป็นนิพจน์พิเศษที่ไม่ได้รับการประเมินเพียงแค่ส่งคืนจำนวนแถว)
มีตัวแก้ไขเพิ่มเติมสองตัวสำหรับนิพจน์: ALL และ DISTINCT สิ่งเหล่านี้กำหนดว่าจะทิ้งรายการที่ซ้ำกันหรือไม่ เนื่องจาก ALL เป็นค่าเริ่มต้นตัวอย่างของคุณจึงเหมือนกับ count (ALL 1) ซึ่งหมายความว่ารายการที่ซ้ำกันจะยังคงอยู่
เนื่องจากนิพจน์ "1" ประเมินค่าเป็นไม่เป็นค่าว่างสำหรับทุกแถวและเนื่องจากคุณไม่ได้ลบรายการที่ซ้ำกัน COUNT (1) จึงควรส่งคืนตัวเลขเดียวกันกับ COUNT (*) เสมอ
นี่คือลิงค์ที่จะช่วยตอบคำถามของคุณ ในระยะสั้น:
นับ (*) เป็นวิธีที่ถูกต้องในการเขียนและการนับ (1) นั้นเหมาะสมที่สุดที่จะนับ (*) เป็นการภายใน - ตั้งแต่
a) นับแถวที่ 1 ไม่ใช่ null มีประสิทธิภาพน้อยกว่า
b) นับแถว
ความแตกต่างระหว่าง count (*) และ count (1) ใน oracle?
count (*) หมายความว่าจะนับระเบียนทั้งหมดเช่นแต่ละเซลล์ แต่
count (1) หมายความว่าจะเพิ่มคอลัมน์หลอกหนึ่งคอลัมน์ที่มีค่า 1 และส่งคืนจำนวนระเบียนทั้งหมด
ซึ่งคล้ายกับความแตกต่างระหว่าง
SELECT * FROM table_name and SELECT 1 FROM table_name.
ถ้าคุณทำ
SELECT 1 FROM table_name
จะให้หมายเลข 1 สำหรับแต่ละแถวในตาราง ใช่count(*)
และcount(1)
จะให้ผลลัพธ์เช่นเดียวกับพินัยกรรมcount(8)
หรือcount(column_name)
ไม่มีความแตกต่างกัน
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) จึงเกิดขึ้น
SELECT COUNT(1) from <table name>
ควรทำสิ่งเดียวกันกับ
SELECT COUNT(*) from <table name>
อาจมีหรือยังคงมีเหตุผลบางประการที่ทำให้มันทำงานได้ดีกว่าSELECT COUNT(*)
ในฐานข้อมูลบางตัว แต่ฉันจะพิจารณาว่ามีข้อบกพร่องในฐานข้อมูล
SELECT COUNT(col_name) from <table name>
อย่างไรก็ตามมีความหมายที่แตกต่างกันเนื่องจากนับเฉพาะแถวที่มีค่าที่ไม่ใช่ค่าว่างสำหรับคอลัมน์ที่ระบุ
ใน oracle ฉันเชื่อว่าสิ่งเหล่านี้มีความหมายเหมือนกันทุกประการ
คุณสามารถทดสอบดังนี้:
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;
ทั้งนี้ขึ้นอยู่กับคนที่คุณถามบางคนรายงานว่าการดำเนินการวิ่งได้เร็วกว่าselect count(1) from random_table;
select count(*) from random_table
คนอื่นอ้างว่าเหมือนกันทุกประการ
ลิงค์นี้อ้างว่าความแตกต่างของความเร็วระหว่าง 2 อันเนื่องมาจาก FULL TABLE SCAN เทียบกับ FAST FULL SCAN