মাইএসকিউএল কেন হ'ল নির্বাচনী উপকরণ ব্যবহারের অনুমতি দেয়?


14

এসকিউএলে, যতদূর আমি জানি, লজিক্যাল ক্যোয়ারী প্রসেসিং অর্ডার, যা ধারণাগত ব্যাখ্যার আদেশ, নিম্নলিখিত পদ্ধতিতে FROM দিয়ে শুরু হয়:

  1. থেকে
  2. কোথায়
  3. গ্রুপ দ্বারা
  4. উপস্থাপন করে আমরা সহজেই
  5. নির্বাচন
  6. অর্ডার দ্বারা

এই তালিকাটি অনুসরণ করা আপনার কেন সহজে একটি দফায় নির্বাচনী এলিয়াস রাখতে পারবেন না তা সহজেই দেখা যায়, কারণ উপনামটি এখনও তৈরি হয়নি। টি-এসকিউএল (এসকিউএল সার্ভার) এটিকে কঠোরভাবে অনুসরণ করে এবং আপনি নির্বাচন না করে অবধি নির্বাচিত উপকরণ ব্যবহার করতে পারবেন না।

তবে মাইএসকিউএলে এইচওভিং ধারাটিতে সিলিক্ট এলিয়াস ব্যবহার করা সম্ভব যদিও সেলেক্ট ক্লজের আগে এটি (যৌক্তিকভাবে) প্রক্রিয়া করা উচিত। এটি কীভাবে সম্ভব?

একটি উদাহরণ দিতে:

SELECT YEAR(orderdate), COUNT(*) as Amount
FROM Sales.Orders
GROUP BY YEAR(orderdate) 
HAVING Amount>1;

টি-এসকিউএল-তে বিবৃতিটি অবৈধ (কারণ হ'ল নির্বাচনী উলেফ উল্লেখ করা হচ্ছে Amount) ...

Msg 207, Level 16, State 1, Line 5
Invalid column name 'Amount'.

... তবে মাইএসকিউএলে ঠিক কাজ করে।

এর ভিত্তিতে আমি ভাবছি:

  • মাইএসকিউএল ব্যবহারকারীকে সাহায্য করার জন্য এসকিউএল বিধিগুলিতে একটি শর্টকাট নিচ্ছে? কিছুটা প্রাক-বিশ্লেষণ ব্যবহার করে?
  • বা মাইএসকিউএল আমি সমস্ত আরডিবিএমএস অনুসরণ করে থাকলেও তার চেয়ে আলাদা ধারণাগত ব্যাখ্যা সংজ্ঞা ব্যবহার করছে?

1
আমার অনুমান, এটি আপনার দ্বিতীয় বুলেট পয়েন্ট।
a_horse_with_no_name

3
ভাল আমি অনুমান করি যে পর্যন্ত তারা র‌্যাঙ্কিংয়ের কার্যগুলি সমর্থন না করে এটি কোনও দ্বিধা বা বিভ্রান্তির কারণ নয়। তারপর SELECT C, ROW_NUMBER() OVER (ORDER BY X) AS RN FROM T GROUP BY C HAVING RN = 1যেমন সমস্যাযুক্ত হতে হবে ROW_NUMBERরান পরHAVING
মার্টিন স্মিথ

আমি নিশ্চিত নই যে মাইএসকিউএল দ্বারা সমর্থিত কোন র‌্যাঙ্কিংয়ের কাজগুলি। আপনি সারি সংখ্যা চান তাহলে আপনাকে এই ভাবে এটি তৈরি করতে হবে: SELECT @rownum:=@rownum + 1 as row ...। তারা কেবল নির্বাচনী এলিয়াসগুলিকে সমর্থন করার কারণটি হ'ল কারণ তারা পারে যে এই কারণে যে তারা এমন জিনিসগুলিকে সমর্থন করে না যা এটি অসম্ভব করে দেয় ... কে জানে? :)
ওহলিন

@ মার্টিনস্মিত যেমন ব্যাখ্যা করেছেন, যতক্ষণ উইন্ডো / র‌্যাঙ্কিংয়ের কোনও কার্য নেই, ততক্ষণ HAVINGএবং SELECTদফার জন্য কার্যকর করার যৌক্তিক ক্রমটি আদান প্রদান করা যেতে পারে। সুতরাং, এটি করার ক্ষেত্রে কোনও অস্পষ্টতা নেই এবং যখন রাক্ষস প্রকাশ হয় তখন কোডটির চেহারাটি সহজ করতে পারে SELECT
ypercubeᵀᴹ

আশা করি এটি কিছুটা অনন্য বিষয় বলার জন্য আমি এখানে একটি প্রশ্নের উত্তর দিয়েছি যা এখানে একই ফলাফলের পরেও দ্রুত ফলাফল (সহ distincts) উপভোগ করছে । অপ্টিমাইজারের সাথে কিছুটা ভিন্নতা ঘটছে। Alias in the HavingExplain
ড্র হয়েছে

উত্তর:


13

ঠিক আছে যখন আপনার এই বাছাইয়ের প্রশ্ন রয়েছে তথ্যের সেরা উত্স আইএমএইচও হ'ল মাইএসকিউএল ডকুমেন্টেশন। এখন বিষয়। এটি মাইএসকিএল এক্সটেনশনের আচরণ GROUP BYযা এতে ডিফল্টরূপে সক্ষম হয়।

গ্রুপে মাইএসকিউএল এক্সটেনশনগুলি মাইএসকিউএল একত্রিত কলামের জন্য HAVING ধারাটিতে একটি উপনামের ব্যবহারের অনুমতি দেওয়ার জন্য
এই আচরণটি প্রসারিত করে

আপনি যদি স্ট্যান্ডার্ড আচরণ চান তবে আপনি এই এক্সটেনশনটি অক্ষম করতে পারবেন sql_mode ONLY_FULL_GROUP_BY

SET [SESSION | GLOBAL] sql_mode = ONLY_FULL_GROUP_BY;

আপনি যদি ONLY_FULL_GROUP_BYsql_mode এ উল্লিখিত ক্যোয়ারীটি কার্যকর করার চেষ্টা করেন তবে আপনি নিম্নলিখিত ত্রুটি বার্তাটি পাবেন:

নন-গ্রুপিং ফিল্ড 'পরিমাণ' হ্যাভিং ধারাটিতে ব্যবহৃত হয়: বছর বাছাই করুন (অর্ডারেট), COUNT (*) বছরের অর্ডার গ্রুপ থেকে প্রাপ্ত হিসাবে অর্ডার (অর্ডারেট) প্রাপ্ত পরিমাণ> 1

এখানে এসকিউএলফিডাল ডেমো রয়েছে

সুতরাং আপনার মাইএসকিউএল-এর উদাহরণটি কীভাবে কনফিগার করতে এবং ব্যবহার করবেন তা আপনার উপর নির্ভর করে।


আপনি ডকুমেন্টেশন সম্পর্কে একেবারে ঠিক। আমি কখনই ভাবিনি যে এটি উপরে বর্ণিত হিসাবে এটি এতটা পরিষ্কার লেখা যেতে পারে :) এটি সন্ধানের জন্য ধন্যবাদ ...
ওহলিন

এই জবাবটি উত্তর দেয় না "মাইএসকিউএল প্রাক-বিশ্লেষণ করছে বা মাইএসকিউএল একটি ভিন্ন ধারণাগত ব্যাখ্যা ব্যবহার করছে?"
পেসারিয়ার

2
@ পেসারিয়র মাইএসকিউএল অবশ্যই "প্রাক-বিশ্লেষণ করছেন", কারণ কোয়েরি অপ্টিমাইজারটি কোয়েরিটির সমস্ত দিক বিবেচনা করে বিবেচনা করে যা এটি বিশ্বাস করে যে সর্বোত্তম ক্যোয়ারী পরিকল্পনা হবে। একটি "ভিন্ন ধারণাগত ব্যাখ্যার" ধারণাটি একটি ভুল বোঝাবুঝির পরিচয় দেয় যে কোনও বৈধ ফলাফল উত্পন্ন করে এমন কোনও উপায়ে সার্ভার ধারণাগত মডেলটি প্রয়োগ করতে মুক্ত। ORDER BYউদাহরণস্বরূপ, সম্ভবত তাত্ত্বিকভাবে তুলনায় এটি আগে অনেক আগে পরিচালনা করা হতে পারে, যদি অপটিমাইজারের সন্ধান হয় যে সারিগুলি ইতিমধ্যে পছন্দসই ক্রমে থাকা একটি সূচক থেকে ক্রমগুলি প্রথমে পাঠ করা যেতে পারে।
মাইকেল - sqlbot

4

ভাল প্রশ্ন.

আমার মনে হয় আপনার এই অনুসন্ধানগুলি চালানো উচিত

EXPLAIN SELECT YEAR(orderdate), COUNT(*) as Amount
FROM Sales.Orders
GROUP BY YEAR(orderdate) 
HAVING Amount>1;
SHOW WARNINGS;

এবং কীভাবে পুনরায় লেখা হয় তা পরীক্ষা করুন। আমি নিশ্চিত যে ক্যোয়ারী অপ্টিমাইজারটি পরিমাণের সাথে COUNT (*) প্রতিস্থাপন করবে

SELECT YEAR(orderdate), COUNT(*) as Amount
FROM Sales.Orders
GROUP BY YEAR(orderdate) 
HAVING COUNT(*)>1;

এটির মতো করে

select 
 *
from 
 test
where 
 id = 5 - 3

ক্যোয়ারী অপ্টিমাইজারের পরে এটি এর মতো কিছু।

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