উত্তর:
মাইএসকিউএলে কোথায় নেই এবং আপনার নিজের তৈরি কলামগুলি (উদাহরণস্বরূপ "সংখ্যা হিসাবে 1 নির্বাচন করুন") কেন স্থাপন করা দরকার?
WHEREসামনে প্রয়োগ করা হয় GROUP BY, HAVINGপরে প্রয়োগ করা হয় (এবং দলা ফিল্টার করতে পারেন)।
সাধারণভাবে, এইসব ক্লজ তন্ন তন্ন মধ্যে alias লেখা উল্লেখ করতে পারেন, কিন্তু MySQLউল্লেখ অনুমতি দেয় SELECTমধ্যে স্তর alias লেখা GROUP BY, ORDER BYএবং HAVING।
এবং "WHERE 1" করার পরিবর্তে কোনও ডাউনসাইড রয়েছে (কলামের নামের পরিবর্তে পুরো সংজ্ঞাটি লিখছেন)
যদি আপনার গণনা করা অভিব্যক্তিটি কোনও সমষ্টি না করে থাকে তবে এটিকে ক্লজটিতে রেখে দেওয়া WHEREসম্ভবত আরও কার্যকর।
এই প্রশ্নের অন্যান্য সমস্ত উত্তর মূল বক্তব্যটির উপর নির্ভর করে না।
ধরুন আমাদের একটি টেবিল রয়েছে:
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 |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
আপনি দেখতে পাচ্ছেন কোথায় বা হ্যাভিং সূচক ব্যবহার করে তবে সারিগুলি আলাদা।
SELECT value, COUNT(*) frequency FROM table GROUP BY value HAVING frequency > 10
...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
মূল পার্থক্যটি হ'ল WHEREগ্রুপযুক্ত আইটেমগুলিতে (যেমন SUM(number)) ব্যবহার করা যাবে নাHAVING না।
কারণ WHEREসম্পন্ন করা হয় আগে গ্রুপিং এবং HAVINGসম্পন্ন করা হয় পরে গ্রুপিং সম্পন্ন করা হয়।
HAVINGআপনার একীকরণে ফিল্টার করতে ব্যবহৃত হয় GROUP BY।
উদাহরণস্বরূপ, সদৃশ নামগুলি পরীক্ষা করতে:
SELECT Name FROM Usernames
GROUP BY Name
HAVING COUNT(*) > 1
উভয়ই ডেটা ফিল্টার করার শর্ত সম্পর্কে বলার জন্য এই 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.*/
WHEREএবং HAVING।
কোথায় তথ্য সামনে ফিল্টার দলবদ্ধ করা হয়, এবং উপস্থাপন করে আমরা সহজেই ফিল্টার পর ডাটা দলবদ্ধ করা হয়। এটি একটি গুরুত্বপূর্ণ পার্থক্য; WHOWE ধারা দ্বারা মুছে ফেলা সারিগুলি গ্রুপে অন্তর্ভুক্ত করা হবে না। এটি গণনা করা মানগুলিকে পরিবর্তন করতে পারে যা পরিবর্তে (= ফলস্বরূপ) হ্যাভিং ধারাটিতে এই মানগুলির ব্যবহারের ভিত্তিতে কোন গ্রুপগুলি ফিল্টার করা হয় তা প্রভাবিত করতে পারে ।
এবং অবিরত,
উপস্থাপন করে আমরা সহজেই যাতে অনুরূপ কোথায় যে অধিকাংশ DBMSs যদি কোনো একই জিনিস তাদের আচরণ একদল নির্দিষ্ট করা হয়েছে। তবুও, আপনার সেই পার্থক্যটি নিজেরাই করা উচিত। কেবল গ্রুপের মাধ্যমে গ্রুপের সাথে একত্রে HAVING ব্যবহার করুন । স্ট্যান্ডার্ড সারি-স্তরের ফিল্টারিংয়ের জন্য WHERE ব্যবহার করুন ।
এর থেকে অংশ: ফরটা, বেন। "স্যামস 10 মিনিটের মধ্যে নিজেকে এসকিউএল শেখায় (5 তম সংস্করণ) (স্যামস নিজেকে শিখান ...)"।