যেখানে বনাম চলছে


247

মাইএসকিউএল-এর select 1 as "number"পরে HAVINGনয় কেন আপনি নিজের তৈরি কলামগুলি রাখবেন (উদাহরণস্বরূপ ) WHERE?

এবং না করে কি কোনও ডাউনসাইড রয়েছে WHERE 1(কলামের নামের পরিবর্তে পুরো সংজ্ঞাটি লিখছেন)?

উত্তর:


323

মাইএসকিউএলে কোথায় নেই এবং আপনার নিজের তৈরি কলামগুলি (উদাহরণস্বরূপ "সংখ্যা হিসাবে 1 নির্বাচন করুন") কেন স্থাপন করা দরকার?

WHEREসামনে প্রয়োগ করা হয় GROUP BY, HAVINGপরে প্রয়োগ করা হয় (এবং দলা ফিল্টার করতে পারেন)।

সাধারণভাবে, এইসব ক্লজ তন্ন তন্ন মধ্যে alias লেখা উল্লেখ করতে পারেন, কিন্তু MySQLউল্লেখ অনুমতি দেয় SELECTমধ্যে স্তর alias লেখা GROUP BY, ORDER BYএবং HAVING

এবং "WHERE 1" করার পরিবর্তে কোনও ডাউনসাইড রয়েছে (কলামের নামের পরিবর্তে পুরো সংজ্ঞাটি লিখছেন)

যদি আপনার গণনা করা অভিব্যক্তিটি কোনও সমষ্টি না করে থাকে তবে এটিকে ক্লজটিতে রেখে দেওয়া WHEREসম্ভবত আরও কার্যকর।


289

এই প্রশ্নের অন্যান্য সমস্ত উত্তর মূল বক্তব্যটির উপর নির্ভর করে না।

ধরুন আমাদের একটি টেবিল রয়েছে:

CREATE TABLE `table` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `value` int(10) unsigned NOT NULL,
 PRIMARY KEY (`id`),
 KEY `value` (`value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

এবং 1 থেকে 10 পর্যন্ত আইডি এবং মান উভয় সহ 10 টি সারি রয়েছে:

INSERT INTO `table`(`id`, `value`) VALUES (1, 1),(2, 2),(3, 3),(4, 4),(5, 5),(6, 6),(7, 7),(8, 8),(9, 9),(10, 10);

নিম্নলিখিত 2 টি প্রশ্নের চেষ্টা করুন:

SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows
SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows

আপনি ঠিক একই ফলাফল পাবেন, আপনি দেখতে পাচ্ছেন যে HAVING ধারাটি গ্রুপ BYUP ছাড়াই কাজ করতে পারে।


পার্থক্য এখানে:

SELECT `value` v FROM `table` WHERE `v`>5;

ত্রুটি # 1054 - অজানা কলাম 'ভি' ইন 'যেখানে ধারা'

SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows

যেখানে ক্লজটি শর্তটিকে যে কোনও টেবিল কলাম ব্যবহার করার অনুমতি দেয়, তবে এটি উপকরণ বা সামগ্রিক ফাংশন ব্যবহার করতে পারে না। হ'ল ক্লজটি শর্তটিকে একটি নির্বাচিত (!) কলাম, ওরফে বা একটি সামগ্রিক ফাংশন ব্যবহার করার অনুমতি দেয়।

এটি কারণ যেখানে ক্লাউজ নির্বাচনের আগে ডেটা ফিল্টার করে, তবে নির্বাচনের পরে ডেটা ফলক হ'ল ক্লজ fil

সুতরাং শর্তগুলিকে WHERE এ রাখুন যদি আপনার কোনও টেবিলে অনেকগুলি সারি থাকে তবে আরও কার্যকর হবে।

মূল পার্থক্যটি বোঝার চেষ্টা করুন:

EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5;
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| id | select_type | table | type  | possible_keys | key   | key_len | ref  | rows | Extra                    |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
|  1 | SIMPLE      | table | range | value         | value | 4       | NULL |    5 | Using where; Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+

EXPLAIN SELECT `value` v FROM `table` having `value`>5;
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key   | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
|  1 | SIMPLE      | table | index | NULL          | value | 4       | NULL |   10 | Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+

আপনি দেখতে পাচ্ছেন কোথায় বা হ্যাভিং সূচক ব্যবহার করে তবে সারিগুলি আলাদা।


32
আমি প্রশংসা করি যে আপনি উল্লেখ করেছেন!
পাইগো

নির্বাচনের পরে ক্লোজ ডেটা ফিল্টার করার কারণে, যেখানে ক্লজটি আরও কার্যকর হবে। সুতরাং এটি যদি সত্য হয় তবে কখন আমাদের পরিবর্তে হ্যাভার ব্যবহার করা উচিত?
গ্রেপ

5
@ গ্রেপ যদি আপনাকে নির্বাচনের পরে ডেটা ফিল্টার করতে হয় তবে আপনার প্রয়োজন হ'ল ধারা, সাধারণত আমরা এটিকে গ্রুপ বা গ্রুপের সাথে ব্যবহার করি, যেমন: SELECT value, COUNT(*) frequency FROM table GROUP BY value HAVING frequency > 10
ফিশড্রাউনড

1
দুর্দান্ত পোস্ট। প্রস্তাবিত ...HAVING clause can use both column and alias....HAVING clause can use either column or alias....WHERE clause will be more effective...WHERE clause will be more efficient
স্পষ্টির

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

62

মূল পার্থক্যটি হ'ল WHEREগ্রুপযুক্ত আইটেমগুলিতে (যেমন SUM(number)) ব্যবহার করা যাবে নাHAVING না।

কারণ WHEREসম্পন্ন করা হয় আগে গ্রুপিং এবং HAVINGসম্পন্ন করা হয় পরে গ্রুপিং সম্পন্ন করা হয়।


39

HAVINGআপনার একীকরণে ফিল্টার করতে ব্যবহৃত হয় GROUP BY

উদাহরণস্বরূপ, সদৃশ নামগুলি পরীক্ষা করতে:

SELECT Name FROM Usernames
GROUP BY Name
HAVING COUNT(*) > 1

1
এটি কিছু বিদ্যমান। আপনি এখনও আপনার পুরো 'কোথায়' থাকার ধারাটিতে রাখতে পারেন।
ডেভিড ব্রুনেলেল


8

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

উদাহরণস্বরূপ: সারণীতে শিক্ষার্থীর ছাত্রের তালিকা, নাম, জন্মদিন, ঠিকানা থাকতে দেওয়া উচিত ss গণনার জন্মদিন টাইপ ডেট।

SELECT * FROM Student WHERE YEAR(birthday)>1993; /*this will work as birthday is in database.if we use having in place of where too this will work*/

SELECT student_id,(YEAR(CurDate())-YEAR(birthday)) AS Age FROM Student HAVING Age>20; 
/*this will not work if we use ‘where’ here, ‘where’ don’t know about age as age is defined in select part.*/

1
এই বাস্তব জীবনে উদাহরণ সম্পূর্ণরূপে মধ্যে পার্থক্য সুস্পষ্ট করে দিয়েছেন WHEREএবং HAVING
ডাব্লুএম

স্পষ্টতই থাকা এবং যেখানে থাকা মধ্যে পার্থক্য দেখায়। ধন্যবাদ।
মার্কোজেন

3

কোথায় তথ্য সামনে ফিল্টার দলবদ্ধ করা হয়, এবং উপস্থাপন করে আমরা সহজেই ফিল্টার পর ডাটা দলবদ্ধ করা হয়। এটি একটি গুরুত্বপূর্ণ পার্থক্য; WHOWE ধারা দ্বারা মুছে ফেলা সারিগুলি গ্রুপে অন্তর্ভুক্ত করা হবে না। এটি গণনা করা মানগুলিকে পরিবর্তন করতে পারে যা পরিবর্তে (= ফলস্বরূপ) হ্যাভিং ধারাটিতে এই মানগুলির ব্যবহারের ভিত্তিতে কোন গ্রুপগুলি ফিল্টার করা হয় তা প্রভাবিত করতে পারে ।

এবং অবিরত,

উপস্থাপন করে আমরা সহজেই যাতে অনুরূপ কোথায় যে অধিকাংশ DBMSs যদি কোনো একই জিনিস তাদের আচরণ একদল নির্দিষ্ট করা হয়েছে। তবুও, আপনার সেই পার্থক্যটি নিজেরাই করা উচিত। কেবল গ্রুপের মাধ্যমে গ্রুপের সাথে একত্রে HAVING ব্যবহার করুন । স্ট্যান্ডার্ড সারি-স্তরের ফিল্টারিংয়ের জন্য WHERE ব্যবহার করুন ।

এর থেকে অংশ: ফরটা, বেন। "স্যামস 10 মিনিটের মধ্যে নিজেকে এসকিউএল শেখায় (5 তম সংস্করণ) (স্যামস নিজেকে শিখান ...)"।


1

শুধুমাত্র একত্রিতকরণের সাথে ব্যবহৃত হয় তবে অ-একত্রিতকরণের বিবৃতি সহ যেখানে আপনার যদি শব্দ থাকে তবে এটি সমষ্টিকরণের আগে রাখে (গোষ্ঠী অনুসারে)

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