এসকিউএলে, গণনা (কলাম) এবং গণনা (*) এর মধ্যে পার্থক্য কী?


204

আমার নিম্নলিখিত জিজ্ঞাসা রয়েছে:

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

আমি যদি সমস্ত কলগুলিতে প্রতিস্থাপন করি তবে কী পার্থক্য count(column_name)হবে count(*)?

এই প্রশ্নটি দ্বারা অনুপ্রাণিত হয়েছিল কীভাবে আমি ওরাকলের একটি সারণীতে সদৃশ মানগুলি পাই?


গৃহীত উত্তর (এবং হয়ত আমার প্রশ্ন) নির্মল করতে, প্রতিস্থাপন count(column_name)সঙ্গে count(*)ফল করে একটি থাকে একটি অতিরিক্ত সারি ফিরে আসবে nullএবং গণনা nullকলামে মান।

উত্তর:


234

count(*)NULL গণনা count(column)করে এবং না

[সম্পাদনা] এই কোডটি যুক্ত করেছে যাতে লোকেরা এটি চালাতে পারে

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

ফলাফল 7 3 2


8
কেবল কৌতূহল: আপনার যদি সমস্ত NULL এর সাথে একটি সারি থাকে তবে এখনও (*) এটি গণনা করা যাবে, বা সমস্ত কলামের জন্য কেবল গণনা (কলাম) হবে?
জোয়েল কোহোর্ন

7
এই স্ট্যান্ডার্ডটি কি ডিবিএমএস জুড়ে?
অন্ধকার

51
এটি উল্লেখ করার মতো যে আপনার যদি আইডির মতো নন-ক্যান্সারযোগ্য কলাম থাকে তবে গণনা (আইডি) গণনা (*) এর তুলনায় পারফরম্যান্সকে উল্লেখযোগ্যভাবে উন্নত করবে।
tsilb

12
@ টিসিলবি: @ অ্যালান দ্বারা পোস্ট করা উত্তরে "গণনা (*) কে প্রকৃত ডেটা সারিগুলির চেয়ে প্রশ্নের টেবিলে সূচীগুলি দেখে গণনা করা হয়", যদি এটি সত্য হয় তবে আপনার মন্তব্যকে অকার্যকর করে দেয়। আমি প্রশংসা করি যে @ অ্যালান ভুল হতে পারে তবে কোনটি সঠিক তা খুঁজে পেতে আমি আপনার তথ্যের উত্সটিতে আগ্রহী।
টনি

12
@ টিসিলবি: অনেক আধুনিক ক্যোয়ারী অপ্টিমাইজারগুলি ইন্ডেক্সগুলি ব্যবহার করার জন্য গণনাটিকে (*) অনুকূল করে তুলবে যখন এটি বোধগম্য হয়।
শ্যানন সিভেরেন্স

37

* এবং একটি নির্দিষ্ট কলাম ব্যবহার করার মধ্যে অন্য একটি সামান্য পার্থক্য হ'ল কলামের ক্ষেত্রে আপনি DISTINCT কীওয়ার্ড যুক্ত করতে পারেন এবং গণনাটিকে স্বতন্ত্র মানগুলিতে সীমাবদ্ধ করতে পারেন:

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

1
কলাম অনুসারে গ্রুপ এবং গণনা করা একটি পৃথক হওয়া উচিত? অন্যথায় আপনি এই কোয়েরি থেকে কিছুই পাবেন না
স্টিভেক

হ্যাঁ, দুঃখিত .. আমি লক্ষ্য করি নি যে উদাহরণে তারা একই কলাম ছিল। পোস্টটি আপডেট করব।
ব্র্যানন

16

আরও একটি এবং সম্ভবত সূক্ষ্ম পার্থক্য হ'ল কিছু ডাটাবেস বাস্তবায়নে প্রকৃত ডেটা সারিগুলির চেয়ে প্রশ্নের টেবিলে সূচীগুলি দেখে গণনা (*) গণনা করা হয়। যেহেতু কোনও নির্দিষ্ট কলাম নির্দিষ্ট করা হয়নি, তাই আসল সারিগুলি এবং তাদের মানগুলি নিয়ে বিরক্ত করার দরকার নেই (যেমন আপনি যদি একটি নির্দিষ্ট কলাম গণনা করেন তবে সেখানে থাকবেন)। ইনডেক্সের ডেটাবেসকে ব্যবহারের অনুমতি দেওয়া "আসল" সারিগুলি গণনা করার চেয়ে তাড়াতাড়ি দ্রুত হতে পারে।


5
+1 হ্যাঁ, অবশ্যই ওরাকল, এবং পোস্টগ্র্রেএসকিউএল-র জন্য 9.2 থেকে অবশ্যই true
ডেভিড অলড্রিজ

@ ডেভিডএলড্রিজ আপনি কি ডকুমেন্টেশনের (বিশেষত পোস্টগ্রিসক্লের জন্য) এখানে উল্লেখ করার জন্য একটি পয়েন্টার সরবরাহ করতে পারেন? ধন্যবাদ।
ভূষণ


10

দস্তাবেজের ব্যাখ্যা, এটি ব্যাখ্যা করতে সহায়তা করে:

COUNT (*) NUL মান এবং সদৃশ সহ একটি গোষ্ঠীর আইটেমের সংখ্যা প্রদান করে।

COUNT (অভিব্যক্তি) একটি গোষ্ঠীর প্রতিটি সারির জন্য অভিব্যক্তি মূল্যায়ন করে এবং নিরপেক্ষ মানের সংখ্যা প্রদান করে।

সুতরাং গণনা (*) নালগুলি অন্তর্ভুক্ত করে, অন্য পদ্ধতিটি তা করে না।


এসকিউএল নববধূর জন্য: আপনি কোন সহায়তা ফাইলের উল্লেখ করছেন?
বিল করুন

10

আমরা সাধারণ ক্যোয়ারির সাথে পার্থক্যটি বর্ণনা করতে স্ট্যাক এক্সচেঞ্জ ডেটা এক্সপ্লোরার ব্যবহার করতে পারি । স্ট্যাক ওভারফ্লো এর ডাটাবেসে থাকা ব্যবহারকারীদের সারণীতে ব্যবহারকারীর ওয়েবসাইট ইউআরএলের মতো কলামগুলি প্রায়শই ফাঁকা থাকে।

-- 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

আপনি যদি ডেটা এক্সপ্লোরারে উপরে ক্যোয়ারী চালান , আপনি দেখতে পাবেন যে গণনাটি সমান count(Id)এবং count(*)কারণ Idকলামটি nullমানগুলি অনুমোদন করে না । WebsiteUrlগণনা অনেক কম, যদিও কারণ যে কলাম দেয়, null


2

মূলত COUNT(*)ফাংশনটি সারণী থেকে সমস্ত সারি ফেরত COUNT(COLUMN_NAME)দেয় যেখানে না হয়; এটি এখানে নাল মানগুলি বাদ দেয় যা এখানে প্রত্যেকে এখানে উত্তরও দিয়েছিল। তবে সর্বাধিক আকর্ষণীয় অংশটি হল কোয়েরি এবং ডাটাবেসকে অনুকূলিতকরণ করা COUNT(*)একাধিক সংখ্যা বা না করে জটিল কোয়েরি না করে ব্যবহার করা ভাল COUNT(COLUMN_NAME)। অন্যথায়, বিপুল সংখ্যক ডেটার সাথে লেনদেন করার সময় এটি আপনার ডিবি কর্মক্ষমতাটি কমিয়ে দেবে।


1
  • COUNT (*) বাক্যটি এসকিউএল সার্ভারকে একটি টেবিল থেকে সমস্ত সারিগুলি NULL সহ ফিরিয়ে আনতে নির্দেশ করে।
  • COUNT (কলাম_নাম) সারিগুলিতে একটি নন-নাল মানযুক্ত সারিগুলি কেবল পুনরুদ্ধার করে।

এসকিউএল সার্ভার ২০০৮ পরীক্ষার জন্য নিচের কোডটি দেখুন 2008:

-- 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(*) - একটি সারণীতে রেকর্ডের মোট সংখ্যা (NULL মূল্যবান রেকর্ড সহ) ফিরিয়ে দেয়।

COUNT(Column Name) - নন-নুল রেকর্ডের মোট সংখ্যা প্রদান করে। এর অর্থ হ'ল, এটি নির্দিষ্ট কলামে নুল মূল্যবান রেকর্ড গণনা উপেক্ষা করে।


0

এটি ব্যবহার করা ভাল

Count(1) in place of column name or * 

কোনও টেবিলের সারি সংখ্যা গণনা করতে এটি যে কোনও বিন্যাসের চেয়ে দ্রুততর কারণ এটি কখনই টেবিলের কলামের নামটি পরীক্ষা করতে যায় না বা নেই


4
কমপক্ষে ওরাকেলের পক্ষে ভুল, এবং অন্য আরডিবিএমএস-এর জন্যও আমার সন্দেহ। অভ্যন্তরীণ গণনা (1) গণনা (*) এ রূপান্তরিত হয়। বিশেষত, গণনার (*) পারফরম্যান্সগুলি সারিগুলির আকারের সাথে বিরূপ প্রভাবিত হয় না, এটি একটি সাধারণ ভুল ধারণা।
ডেভিড অ্যালড্রিজে

এটি এসকিউএল সার্ভারের ক্ষেত্রে সত্য। @ অলি আদ্রাভি যেমন বলেছিলেন, COUNT(*)তুলনা করে COUNT(columnName)কলাম মানটি যাবেনা , কারণ এটি কেবল সারিগুলি গণনা করে। তবে কলামে প্রয়োগ COUNT(columnName)করাও ধীর ! কমপক্ষে এসকিউএল সার্ভারে অবশ্যই। countid
এবিএস

0

আপনার টেবিলের মধ্যে একটি কলাম ঠিক করা থাকলে কোনও পার্থক্য নেই, আপনি যদি একটি কলামের চেয়ে বেশি কলাম ব্যবহার করতে চান তবে আপনাকে উল্লেখ করতে হবে যে আপনার কতগুলি কলাম গুনতে হবে ......

ধন্যবাদ,


0

পূর্ববর্তী উত্তরে উল্লিখিত হিসাবে, Count(*)এমনকি NULLকলামগুলি count(Columnname)গণনা করা হয় , তবে কলামটির মান থাকে তবেই তা গণনা করা হয়।

এটা সবসময় সেরা এড়াতে অভ্যাস *( Select *, count *, ...)


এড়াতে এটি মোটেও সেরা অনুশীলন নয়COUNT(*)
ডেভিড ফ্যাবার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.