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


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.