এসকিউএল কোয়েরিতে গ্রুপ ব্যতীত হ্যাভিংয়ের ব্যবহার


26

HAVINGএসকিউএল কোয়েরিতে ব্যবহার করার জন্য , GROUP BYকলামের নামগুলি একত্রিত করার জন্য একটি অবশ্যই থাকতে হবে ?

কোন বিশেষ ক্ষেত্রে যেখানে এটি ব্যবহার করা সম্ভব হয় HAVINGএকটি ছাড়া GROUP BYএসকিউএল কোয়েরি মধ্যে?

তাদের কি একই সাথে সহ-উপস্থিত থাকতে হবে?

উত্তর:


25

না।

তাদের সহাবস্থান করতে হবে না, যেমন ওরাকলে নিম্নলিখিত কোয়েরিটি কাজ করে তা প্রমাণ করে:

select * from dual having 1 = 1;

একইভাবে, পোস্টগ্রাইএসকিউএলে নিম্নলিখিত কোয়েরিটি কাজ করে:

select 1 having 1 = 1;

সুতরাং প্রয়োজন having হয় না । group by

হচ্ছে না প্রয়োগ পর অ্যাগ্রিগেশন ফেজ এবং যদি আপনি সমষ্টিগত ফলাফল ফিল্টার করতে চান ব্যবহার করা আবশ্যক। সুতরাং বিপরীতটি সত্য নয়, এবং নিম্নলিখিতগুলি কাজ করবে না:

select a, count(*) as c
from mytable
group by a
where c > 1;

নিম্নলিখিত হিসাবে আপনাকে এই ক্ষেত্রে প্রতিস্থাপন whereকরতে হবে having:

select a, count(*) as c
from mytable
group by a
having c > 1;

NB নিম্নলিখিত কোয়েরি ফর্মটিও কাজ করবে:

select *
from (
  select a, count(*) as c
  from mytable
  group by a
)
where c > 1;

আপনি দেখতে পাচ্ছেন যে havingব্যবহারটি হ'ল এই শেষ ক্যোয়ারীর একটি সংক্ষিপ্ত সংস্করণ।


সংক্ষেপে বলা যায়, havingপ্রয়োগ করা হয় পরgroup by ফেজ যেহেতু whereপ্রয়োগ করা হয় আগেgroup by ফেজ।


2
আর একটি উদাহরণ:SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);
— ypercubeᵀᴹ

1
হ্যাঁ। এবং PostgreSQL নিম্নলিখিত নির্মাণের অনুমতি দেয় select 1 having count(*) = 1;যা আমি এখনও বুঝতে পারি না।
— কলিন টি হার্ট

এসকিউএল সার্ভারও অনুমতি দেয়, SELECT 1 AS id, 'Colin' AS name;অন্যদিকে ওরাকলের মতো অন্যদের একটি বিশেষ dualটেবিল থাকে। আমি মনে করি না যে এই সিনট্যাক্সগুলির একটিও এএনএসআই / আইএসও এসকিউএল (যার প্রয়োজন FROM)।
— ypercubeᵀᴹ

আমি অভাব মানে না fromকিন্তু রেফারেন্স count(*)মধ্যে havingহাতে যা কলাম এই সমষ্টিগত হচ্ছে কোনো ইঙ্গিত ছাড়া দফা। সম্ভবত এটি ধারাটিতে সমস্ত কলামের উপরে একত্রিত হয় select।
— কলিন 'হার্ট

আহ, ঠিক আছে. হ্যাঁ, আমি সম্মতি জানাই যে এটি যা করে তা (আপনার সার্থক সমস্ত সারি জুড়ে - খালি টেবিলের সমস্ত সারি জুড়ে)।
— ypercubeᵀᴹ

4

গ্রুপ ফিল্টার করতে ব্যবহৃত হয়।

যেখানে সারণি ফিল্টার করতে ক্লজ ব্যবহার করা হয়।



1
আপনার প্রথম বিবৃতিটি সঠিক নয়। havingহয় প্রয়োগ পর অ্যাগ্রিগেশন ফেজ তাই ব্যবহার করা যেতে পারে ফিল্টার গোষ্ঠী।
— কলিন টি হার্ট

1

গ্রুপগুলি ফিল্টার করছে A যদি আপনার কারণে গ্রুপ নেই, সমস্ত সারি একটি গোষ্ঠী উপস্থাপন করে। সুতরাং, যদি হ্যাভিং-এ প্রাক্টিকেট সত্য হিসাবে মূল্যায়ন করে তবে আপনি একটি সারি পাবেন, অন্যথায় কোনও সারি নেই।


1

গ্রুপের গ্রুপের অনুপস্থিতিতে ক্যোয়ারী পুরো সম্পর্কটিকে একটি গোষ্ঠী হিসাবে বিবেচনা করে।

যেমন

     select count(*)
     from dual
     having count(*) > 5;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.