হ্যাভিং এবং হুয়ের মধ্যে পার্থক্য কী?


260

আমি অবশ্যই ভুল উপায়ে গুগল হয়ে যাচ্ছি বা সময় মতো আমার বোকা মুহুর্ত কাটছে।

একটি বিবৃতি মধ্যে HAVINGএবং পার্থক্য কি ?WHERESQL SELECT

সম্পাদনা: স্টিভেনের উত্তরটিকে সঠিক হিসাবে চিহ্নিত করেছি কারণ লিঙ্কটিতে তথ্যের মূল বিট রয়েছে:

কখন GROUP BYব্যবহার করা হয় না, HAVINGএকটি WHEREক্লজের মতো আচরণ করে

আমি যে পরিস্থিতিটি দেখেছি তা ছিল WHEREনা GROUP BYএবং আমার বিভ্রান্তি শুরু হয়েছিল। অবশ্যই, যতক্ষণ না আপনি এটি জানেন না আপনি প্রশ্নটিতে এটি নির্দিষ্ট করতে পারবেন না।


43
আপনি যে লাইনটি উদ্ধৃত করেছেন তা মোটেই মূল বিট নয়। মূল বিট, ডাব্লুএমসি বলেছে যে এটি HAVINGহ'ল পোস্ট- অগ্রিগেশন ফিল্টার, যেখানে WHEREপ্রাক-সমষ্টি ফিল্টার।
নিক চামাস

এই লিঙ্কটি নীচের সমস্ত মন্তব্যগুলির চেয়ে এটি আরও ভালভাবে বুঝতে আমাকে সাহায্য করেছে, ভেবেছিল কেউ এই কোডড্রজেক্ট
আর্টিকেলস /

উত্তর:


93

HAVING একটি গোষ্ঠীর জন্য অনুসন্ধান শর্ত নির্দিষ্ট করে বা SELECT বিবৃতিতে ব্যবহৃত সামগ্রিক ফাংশন নির্দিষ্ট করে।

উৎস


368

হ্যাভিং: একত্রিত হওয়ার পরে শর্তগুলি পরীক্ষা করতে ব্যবহৃত হয় ।
WHERE: পূর্বে শর্তাদি পরীক্ষা করতে ব্যবহৃত হয়

এই কোড:

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City

আপনাকে এমএতে সমস্ত শহরের একটি টেবিল এবং প্রতিটি শহরে ঠিকানা সংখ্যা দেয়।

এই কোড:

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Having Count(1)>5

এমএতে আপনাকে প্রতিটি শহরে 5 টিরও বেশি ঠিকানা এবং ঠিকানার সংখ্যা সহ শহরের একটি টেবিল দেয়।


7
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। "থাকার" এবং "যেখানে" এর মধ্যে পার্থক্য এটিকে অবিলম্বে পরিষ্কার করে দেয়।
পল

27

আমার জন্য প্রথম এক পার্থক্য: যদি HAVINGএসকিউএল ভাষা থেকে সরিয়ে ফেলা হয় তবে জীবন আগের মতো কমবেশি চলবে। অবশ্যই একটি সংখ্যালঘু প্রশ্নের ডাইরেক্টেড টেবিল, সিটিই ইত্যাদি ব্যবহার করে আবার লিখতে হবে তবে ফলস্বরূপ এগুলি বোঝার এবং বজায় রাখা আরও সহজ হবে। সম্ভবত বিক্রেতাদের অপ্টিমাইজার কোডটি এর জন্য অ্যাকাউন্টে আবার লিখতে হবে, আবার শিল্পের মধ্যে উন্নতির সুযোগ।

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

টিএল; ডিআর আমরা HAVINGআগামীকাল হারাতে পারি এবং বিষয়গুলি আরও খারাপ কিছু নাও হতে পারে, সম্ভবত আরও ভাল, তবে এটির বিষয়ে বলা যায় না WHERE


এখানকার উত্তরগুলি থেকে মনে হয় যে অনেক লোক বুঝতে পারে না যে একটি HAVINGধারা ছাড়া কোনও GROUP BYধারা ব্যবহার করা যেতে পারে । এই ক্ষেত্রে, HAVINGক্লজটি পুরো টেবিলের এক্সপ্রেশনটিতে প্রয়োগ করা হয় এবং প্রয়োজন যে কেবল ধারাটিতে উপস্থিত হওয়া প্রয়োজন SELECT। সাধারণত HAVINGধারাটি সমষ্টিগুলিকে জড়িত করে।

এটি শোনার চেয়ে এটি আরও কার্যকর। উদাহরণস্বরূপ, nameকলামটি সমস্ত মানের জন্য অনন্য কিনা তা পরীক্ষা করার জন্য এই কোয়েরিকে বিবেচনা করুন T:

SELECT 1 AS result
  FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );

দুটি মাত্র সম্ভাব্য ফলাফল রয়েছে: HAVINGধারাটি যদি সত্য হয় তবে ফলাফলটি একটি একক সারিতে মান সহ থাকবে 1, অন্যথায় ফলাফলটি খালি সেট হবে।


এটি কি "নির্বাচন COUNT (DISTINCT নাম) = COUNT (নাম) FROM টি" এর সমান?
এমএসপ্রাইজ

@ এমস্রেজিজ জানেন না এটি আপনার পক্ষে কাজ করে কিনা তবে এটি এসকিউএল সার্ভার ২০০৫ এ কাজ করে না তবে প্রথমটি এটি করে
জো

22

HAVING ধারাটি এসকিউএলে যুক্ত করা হয়েছে কারণ WHERE কীওয়ার্ড সামগ্রিক ফাংশন সহ ব্যবহার করা যায়নি।

আরও তথ্যের জন্য এই ডাব্লু 3 স্কুলগুলির লিঙ্কটি দেখুন

বাক্য গঠন:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

এর মতো একটি কোয়েরি:

SELECT column_name, COUNT( column_name ) AS column_name_tally
  FROM table_name
 WHERE column_name < 3
 GROUP 
    BY column_name
HAVING COUNT( column_name ) >= 3;

... এই জাতীয় উত্সযুক্ত টেবিল (এবং বাদ দিয়ে HAVING) ব্যবহার করে আবারও লেখা যেতে পারে :

SELECT column_name, column_name_tally
  FROM (
        SELECT column_name, COUNT(column_name) AS column_name_tally
          FROM table_name
         WHERE column_name < 3
         GROUP 
            BY column_name
       ) pointless_range_variable_required_here
 WHERE column_name_tally >= 3;

3
আপনি সামান্য বিন্দুটি মিস করেছেন: যুক্ত HAVINGকরা হয়েছিল কারণ উত্সযুক্ত টেবিলগুলি ভাষায় যুক্ত করা হয়নি এবং তারা এসকিউএল হওয়া পর্যন্ত আপেক্ষিকভাবে সম্পূর্ণ হয়নি এবং একবার তারা অবশ্যম্ভাবীভাবে HAVINGঅপ্রয়োজনীয় হয়ে উঠেছে।
onedaywhen

21

উভয়ের মধ্যে পার্থক্য হ'ল গ্রুপ বাই গ্রুপের সাথে সম্পর্ক:

  • গ্রুপের আগে যেখানে আসে; এসকিউএল এর রেকর্ডগুলি গোষ্ঠীভুক্ত করার পূর্বে WHERE ধারাটির মূল্যায়ন করে।

  • গ্রাওয়াল গ্রুপের পরে হ্যাভিং আসে; এসকিউএল এটি রেকর্ডকে গোষ্ঠীভুক্ত করার পরে হ্যাভিংকে মূল্যায়ন করে।

স্টেটমেন্ট ডায়াগ্রাম নির্বাচন করুন

তথ্যসূত্র


যেহেতু গ্রুপ এবং হ্যাভিং উভয়ই alচ্ছিক, ডায়াগ্রামটি উভয় ক্ষেত্রে দেখায়, কেবল তীরগুলি অনুসরণ করুন।
পল সুইট

এই প্রশ্নের আমার উত্তর থেকে উদাহরণস্বরূপ ক্যোয়ারী: SELECT 1 AS result FROM T HAVING...- আপনার ডায়াগ্রামে আমি HAVINGপাস না করেই যেতে পারব না GROUP BYতবে আমার পুরোপুরি বৈধ এবং দরকারী প্রশ্নের কোনও উত্তর নেই GROUP BY। গৌণ বিন্দু: আপনার কাছে এই SELECTধারায় আক্ষরিক মান অন্তর্ভুক্ত করার বিকল্প নেই ।
onedaywhen

@মনায়েহেন আপনি যেহেতু অন্তর্নিহিত গ্রুপ সম্পর্কে জানেন , কেন আপনি এটি উল্লেখ করেননি? আপনি কি জানেন যে এই আচরণটি আপনি প্রত্যাশা করছেন কি না?
পল সুইট

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

... দ্বিতীয় লিঙ্কে আপনি কী আচরণের ইঙ্গিত দিচ্ছেন তা আমি জানি না। কাঙ্ক্ষিত ফলাফলটি হ'ল আপনি উল্লিখিত বৈধ (স্পষ্ট) পথটি দেখানোর জন্য আপনি চিত্রটি ঠিক করেছেন। এটি সম্পর্কে চিন্তা করুন: ডায়াগ্রামটি পুরো ক্যোয়ারিকে কভার করেছে তবে প্রশ্নটি কেবল WHERE->HAVINGঅংশে আগ্রহী , তাই আমি মনে করি বিশদটির দিকে গভীর মনোযোগের দাবি রয়েছে। আপনি যদি আমার উত্তরটি ভুল বলে মনে করেন তবে এটি সম্পাদনা করুন বা মন্তব্যে একটি প্রস্তাবিত সংশোধন পোস্ট করুন।
onedaywhen

12

HAVINGআপনি যখন একটি সামগ্রিক ব্যবহার করছেন তখন ব্যবহৃত হয় GROUP BY

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;

8

এসকিউএল দ্বারা ফিরে আসা সেটে সীমাবদ্ধতা হিসাবে যেখানে প্রয়োগ করা হয়; এটি এসকিউএলের অন্তর্নির্মিত সেট oepration এবং সূচি ব্যবহার করে এবং ফলস্বরূপ সেটগুলি ফিল্টার করার দ্রুততম উপায়। যখনই সম্ভব সর্বদা WHERE ব্যবহার করুন।

কিছু সামগ্রিক ফিল্টারগুলির জন্য হওয়িং প্রয়োজনীয়। এটি এসকিউএলএর পরে ক্যোয়ারী ফিল্টার করে ফলাফল পুনরুদ্ধার, একত্রিত, এবং বাছাই করে। অতএব, এটি WHEE এর চেয়ে অনেক ধীর এবং এটি যে পরিস্থিতিতে প্রয়োজন তা বাদ দিয়ে এড়ানো উচিত।

এসকিউএল সার্ভার আপনাকে যেখানে ব্যবহার করা হবে তার থেকেও দূরে সরিয়ে দেবে away এটা করবেন না।


এসকিউএল ভাষায় উত্সযুক্ত টেবিলগুলির জন্য সমর্থন মানে আপনার দাবি "কিছু সমষ্টিগত ফিল্টারগুলির জন্য প্রয়োজনীয়" মিথ্যা।
onedaywhen

1
এটা একটা ভাল দিক. এই উত্তরটি লেখার পর থেকে তিন বছরে আমি অবশ্যই সঞ্চিত টেবিলগুলি ব্যবহারের দিকে সরে এসেছি যেখানে আমি আগে ব্যবহার করতাম। হ্যাভিং-এর এখনও কিছু ব্যবহারের ঘটনা রয়েছে যা বোঝা যায় কিনা তা নিয়ে আমি ভাবিনি। আমিও জানি না যে কোনও উত্সযুক্ত টেবিল সার্বজনীনভাবে হ্যাভিংয়ের চেয়ে আরও ভাল পারফর্ম করবে।
ডেভিডক্লিজ

7

যেখানে ধারাটি সামগ্রিক ফাংশনের জন্য কাজ করে না তার
অর্থ: আপনার এই বোনাসের মতো ব্যবহার করা উচিত নয়: টেবিলের নাম

SELECT name  
FROM bonus  
GROUP BY name  
WHERE sum(salary) > 200  

এখানে যেখানে ক্লাউজ ব্যবহার করার পরিবর্তে আপনাকে থাকতে হবে ..

গ্রুপ দ্বারা গ্রুপ ব্যবহার না করে, HAVING ধারাটি যেখানে যেখানে বিধি হিসাবে কাজ করে

SELECT name  
FROM bonus  
GROUP BY name  
HAVING sum(salary) > 200  

3

পার্থক্য বি / ডাব্লু WHEREএবং HAVINGধারা:

WHEREএবং HAVINGধারাটির মধ্যে প্রধান পার্থক্যটি , WHEREসারি ক্রিয়াকলাপের HAVINGজন্য ব্যবহৃত হয় এবং কলাম ক্রিয়াকলাপের জন্য ব্যবহৃত হয়।

আমাদের HAVINGক্লজ দরকার কেন ?

যেমনটি আমরা জানি, সামগ্রিক ফাংশনগুলি কেবল কলামগুলিতেই সম্পাদন করা যায়, তাই আমরা ধারাতে সমষ্টিগত ফাংশনগুলি ব্যবহার করতে পারি না WHERE। অতএব, আমরা ধারাটিতে সামগ্রিক ফাংশন ব্যবহার করি HAVING


1

সমষ্টিগত ক্যোয়ারিতে, (যে কোনও জিজ্ঞাসা যেখানে একটি সামগ্রিক ফাংশন ব্যবহৃত হয়) সমষ্টিগত মধ্যবর্তী ফলাফল সেট তৈরি হওয়ার আগে যেখানে ক্লজটি মূল্যায়ন করা হয় সেখানে পূর্বাভাস দেয়,

ভবিষ্যতের পূর্বে ভবিষ্যদ্বাণীগুলি উত্পন্ন হওয়ার পরে সামগ্রিক ফলাফল সেটটিতে প্রয়োগ করা হয়। এজন্য সামগ্রিক মানগুলির সম্পর্কে ভবিষ্যদ্বাণীপূর্ণ শর্তাদি হ'ল ক্লজ-এ নয়, এবং কেন আপনি একটি ক্লজ থাকার ক্ষেত্রে নির্বাচন বিভাগে সংজ্ঞায়িত এলিয়াস ব্যবহার করতে পারেন তবে কোথায় থাকবেন না সে ক্ষেত্রে থাকতে হবে।


1

আমি একটি সমস্যা ছিল এবং অন্য পার্থক্য খুঁজে পাওয়া যায় নি মধ্যে WHEREএবংHAVING । এটি সূচকযুক্ত কলামগুলিতে একইভাবে কাজ করে না।

WHERE my_indexed_row = 123 সারিগুলি দেখায় এবং স্বয়ংক্রিয়ভাবে অন্যান্য ইনডেক্স করা সারিগুলিতে একটি "অর্ডার এএসসি" সম্পাদন করে।

HAVING my_indexed_row = 123 পুরানো "sertedোকানো" সারি থেকে সর্বাধিক সর্বাধিক সবকিছু দেখায়, কোনও আদেশ নেই।


আপনি কীভাবে জানবেন যে আপনি যে বিশেষ এসকিউএল সার্ভারটি ব্যবহার করছিলেন তা বাস্তবায়নের দুর্ঘটনার পরিবর্তে এই দ্বিগুণ মধ্যে সংজ্ঞাযুক্ত পার্থক্য?
JdeBP

আমি এটি কেবল মারিয়াডিবিতে পরীক্ষা করেছি। আমার ধারণা 8 বছর আগে আমি যে এসকিউএল সার্ভারটি ব্যবহার করছিলাম এটি বিভিন্ন ফলাফল তৈরি করেছিল।
সিমমনিজ

1

কখন GROUP BYব্যবহার করা হয় না, WHEREএবং HAVINGক্লজগুলি মূলত সমতুল্য।

তবে, কখন GROUP BYব্যবহৃত হয়:

  • দ্য WHEREদফা ফলে থেকে ফিল্টার রেকর্ড করতে ব্যবহৃত হয়। ফিল্টারিং কোনও গ্রুপিং করার আগে ঘটে।
  • HAVINGদফা (পরে দলের মধ্যে অ্যাগ্রিগেশন সঞ্চালিত হয়েছে অবস্থার চেক করতে অর্থাত,) একটি গ্রুপ থেকে ফিল্টার মান ব্যবহার করা হয়।

এখান থেকে রিসোর্স


থাকা এবং যেখানে মূলত সমতুল্য নয়। এটি কার্যকর করার সময় ত্রুটি দেবে। HAVING ধারাটিতে অবৈধ কারণ এটি কোনও সামগ্রিক ফাংশন বা গ্রুপের মাধ্যমে গ্রুপের মধ্যে নেই।
নগেন্দ্র কুমার

1

এটি ভাবার একটি উপায় হ'ল ক্লজটি হ'ল ক্লজটি অতিরিক্ত ফিল্টার।

একটি যেখানে ক্লজ ব্যবহার করা হয় ফলাফল থেকে রেকর্ড ফিল্টার করে। যে কোনও গ্রুপিংয়ের আগে ফিল্টারটি ঘটে। একটি গ্রুপ থেকে মানগুলি ফিল্টার করার জন্য একটি হাওয়িং ক্লজ ব্যবহার করা হয়


0

থেকে এখানে

এসকিউএল স্ট্যান্ডার্ডের প্রয়োজন যে HAVING অবশ্যই গ্রুপের গ্রুপের মধ্যে কেবল কলামগুলি বা সামগ্রিক ফাংশনে ব্যবহৃত কলামগুলি রেফারেন্স করতে হবে

সম্পূর্ণ ক্লাসের বিপরীতে যা ডাটাবেস সারিগুলিতে প্রয়োগ করা হয়


উত্স বলছে, "কলাম পজিশনের ব্যবহার হ্রাস করা হয়েছে কারণ সিনট্যাক্সটি এসকিউএল স্ট্যান্ডার্ড থেকে সরানো হয়েছে।" দুঃখের বিষয়, এটি ভুল: স্ট্যান্ডার্ড থেকে কোনও কিছুই মুছে ফেলা হয় না, কারণ বিদ্রূপজনকভাবে আমাদের HAVINGউত্সাহিত টেবিলগুলি দ্বারা এটি 'অবমূল্যায়ন' করার পরে দশক পরেও রয়েছে।
onedaywhen

সামান্য পেডেন্টিক তবে উদ্ধৃতিটি সঠিক নয় যেমন বিবেচনা করুন SELECT 1 FROM T HAVING COUNT(*) >= 1;- ধারাটিতে কলামগুলি GROUP BY(কোনও নেই) রেফারেন্স দেয় না বা সমষ্টিগত কার্যগুলিতে কলামগুলি নেই (ক্যোয়ারী রেফারেন্সগুলি কোনও কলামই নয়)।
onedaywhen

0

একটি প্রকল্পে কাজ করার সময়, এটি আমার প্রশ্নও ছিল। উপরে উল্লিখিত হিসাবে, HAVING ইতিমধ্যে পাওয়া ক্যোয়ারী ফলাফলের শর্তটি পরীক্ষা করে। তবে কোথায় শর্ত যখন ক্যোয়ারী চালনা করে পরীক্ষা করা হয়।

আমি এটি একটি উদাহরণ দিতে। ধরুন আপনার কাছে এর মতো একটি ডাটাবেস টেবিল রয়েছে।

ব্যবহারকারীযোগ্য {ইন্ট ইউজারিড, তারিখের তারিখের ক্ষেত্র, দৈনিক আয়}

মনে করুন, নিম্নলিখিত সারিগুলি টেবিলে রয়েছে:

1, 2011-05-20, 100

1, 2011-05-21, 50

1, 2011-05-30, 10

2, 2011-05-30, 10

2, 2011-05-20, 20

এখন, আমরা useridএস এবং sum(dailyincome)কাদের পেতে চাইsum(dailyincome)>100

যদি আমরা লিখি:

ব্যবহারকারী, যে পরিমাণ (দৈনিক আয়)> ইউজারিডের মাধ্যমে 100 টি গ্রুপ

এটি একটি ত্রুটি হবে। সঠিক ক্যোয়ারীটি হ'ল:

ইউজারিডের যোগফল (দৈনিক আয়)> ১০০ ব্যবহারকারীর গ্রোপ থেকে ব্যবহারকারী, যোগফল (দৈনিক আয়) নির্বাচন করুন


0

বেস টেবিলের মানগুলির তুলনা করার জন্য যেখানে ক্লজটি ব্যবহৃত হয়, যেখানে কোয়েরি ফলাফলের সেটগুলিতে সামগ্রিক ফাংশনগুলির ফলাফলগুলি ফিল্টার করার জন্য HAVING ধারাটি ব্যবহার করা যেতে পারে এখানে ক্লিক করুন !


-1

আমি একটি সামগ্রিক ফাংশনের ফলাফলের উপর ভিত্তি করে কোয়েরি সীমাবদ্ধ করার জন্য হাভিং ব্যবহার করি। EG নির্বাচন করুন * bbbbbblah গ্রুপে কিছু গণনা করে (কিছু)> 0


-1

এটি কেবল যেখানে "যেখানে" বিষয়টি একটি সারি, সেখানে "থাকার" বিষয় একটি গোষ্ঠী হতে পারে। আমি কি সঠিক?


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