এসকিউএল - গোষ্ঠী দ্বারা উপনাম ব্যবহার করে


143

এসকিউএল সিনট্যাক্স সম্পর্কে মাত্র কৌতূহল। সুতরাং আমি যদি

SELECT 
 itemName as ItemName,
 substring(itemName, 1,1) as FirstLetter,
 Count(itemName)
FROM table1
GROUP BY itemName, FirstLetter

এটি ভুল হবে কারণ

GROUP BY itemName, FirstLetter 

সত্যিই হওয়া উচিত

GROUP BY itemName, substring(itemName, 1,1)

তবে আমরা কেন সুবিধার্থে প্রাক্তনটিকে সহজভাবে ব্যবহার করতে পারি না?


13
পোস্টগ্র্যাস্কল
মাইকেল বুয়েন

7
মাইএসকিউএল এটিও অনুমতি দেয়
কিপ করুন

1
আপনি কোন rdbms এর কথা বলছেন?
শিওয়ানগিনি

উত্তর:


292

এসকিউএল বাস্তবায়িত হয় যেন একটি ক্রোয় নিম্নলিখিত আদেশে কার্যকর করা হয়েছিল:

  1. ধারা থেকে
  2. যেখানে ক্লজ
  3. অনুচ্ছেদে গ্রুপ
  4. ধারা রয়েছে
  5. বিভাগ নির্বাচন করুন
  6. ধারা দ্বারা আদেশ

বেশিরভাগ রিলেশনাল ডাটাবেস সিস্টেমের জন্য, এই আদেশটি ব্যাখ্যা করে যে কোন নামগুলি (কলাম বা উপকরণ) বৈধ, কারণ সেগুলি অবশ্যই পূর্ববর্তী পদক্ষেপে প্রবর্তিত হয়েছিল।

সুতরাং ওরাকল এবং এসকিউএল সার্ভারে, আপনি নির্বাচন বিভাগে সংজ্ঞায়িত গ্রুপের মাধ্যমে গ্রুপের কোনও পদ ব্যবহার করতে পারবেন না কারণ নির্বাচন বিভাগের পূর্বে গ্রুপ বাই সম্পাদন করা হয়েছিল।

যদিও এর ব্যতিক্রম রয়েছে: মাইএসকিউএল এবং পোস্টগ্রিসের কাছে মনে হয় এটির অতিরিক্ত স্মার্টনেস রয়েছে।


3
আমি এই ব্যাখ্যা পছন্দ। যদিও সিনট্যাকটিক চিনির হিসাবে এটি ইঞ্জিনে যুক্ত করা কতটা কঠিন তা অনুমান করতে পারি না।
হাওয়েস্ট

11
ডিবি একই ধারণাটি উপলব্ধি করতে যথেষ্ট স্মার্ট হলে ভাবগুলি পুনরায় মূল্যায়ন না করে সেলেক্ট এবং গ্রুপ বাই দলে থাকে? অর্থাত্ যদি সেখানে থাকে GROUP BY substring(itemName, 1,1)তবে ডাটাবেসটি কি যথেষ্ট স্মার্ট সেলেক্ট ক্লজে সাবস্ট্রিংকে পুনরায় হিসাব করতে পারফরম্যান্সটিকে গ্রহণ করতে পারে না?
কিপ

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

6
ফাঁসির আদেশের প্রশ্নের সাথে কী সম্পর্ক রয়েছে? এটি অনুরূপ নয় যে প্রশ্নকারী COUNT () এর মাধ্যমে গ্রুপ করার চেষ্টা করেছিল। প্রকৃতপক্ষে, জিজ্ঞাসা করা প্রশ্নটি মাইএসকিউএল এবং সম্ভবত পোস্টগ্র্যাসএসকিউএলে ঠিক মত কাজ করে যা মন্তব্যগুলিতে উল্লেখ করেছে।

1
মাইএসকিউএল জন্য, sql_modeসহ না ONLY_FULL_GROUP_BY বিট-মাস্কের মধ্যে, অপ্টিমাইজার উদ্ধার সুযোগ রয়েছে ভালো ফলাফল একটি ভিন্নতা / দিয়ে বিভিন্ন মধ্যে ওরফে ব্যবহার HAVINGদফা।
ড্রয়

28

আপনি সর্বদা একটি subquery ব্যবহার করতে পারে যাতে আপনি উপনামটি ব্যবহার করতে পারেন; অবশ্যই, কর্মক্ষমতা পরীক্ষা করুন (সম্ভাব্য ডিবি সার্ভার উভয় একই চলবে, তবে যাচাই করতে কখনই ব্যাথা দেয় না):

SELECT ItemName, FirstLetter, COUNT(ItemName)
FROM (
    SELECT ItemName, SUBSTRING(ItemName, 1, 1) AS FirstLetter
    FROM table1
    ) ItemNames
GROUP BY ItemName, FirstLetter

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

1
@ রোল্যান্ড কিন্তু সেই ক্ষেত্রে কার্যকর করার পরিকল্পনার চেয়ে আলাদা নয়। অন্য কোনও কর্মক্ষমতা বিবেচনা করা হয়?
গিডো মোচা

@ রোল্যান্ড, সম্পর্কযুক্ত সাব-কোয়েরিজ বা অন্যান্য সিনট্যাক্স যা লুপগুলি বা সারি-সারি আচরণের দিকে পরিচালিত করে তা এড়ানো উচিত এবং নেস্টেড সাবকিউরিয়ান্সগুলির সাথে আপনাকে কত গভীরভাবে যেতে হবে তার সীমাবদ্ধতা রয়েছে তবে এটি সাধারণত সত্য নয় যে উপ-প্রশ্নগুলি নেতৃত্ব দেয় খারাপ অভিনয়। এই ক্ষেত্রে ক্রিস যেমন বলেছেন, আপনি সাবকিউরিটির সাথে এবং ছাড়াই উভয়কে তুলনা করে এক্সিকিউশন প্ল্যান (একে একে ক্যোয়ারী প্ল্যান, প্ল্যান ব্যাখ্যা করতে) যাচাই করতে পারেন এবং সত্যই কোনও পার্থক্য আছে কিনা তা দেখুন। খুব সুন্দর প্রতিটি প্রতিটি ডাটাবেস ইঞ্জিন আপনার ক্যোয়ারীটি পুনরায় লিখবে যাতে আপনি কী কার্যকর হন তার নিয়ন্ত্রণে পুরোপুরি না থাকে। এটি ঘোষণামূলক সিনট্যাক্সের পয়েন্ট।
দাভোস

16

কমপক্ষে পোস্টগ্রাএসকিউএল-এ আপনি নিজের গ্রুপের মাধ্যমে গ্রুপের রেজাল্টটিতে কলাম নম্বরটি ব্যবহার করতে পারেন:

SELECT 
 itemName as ItemName,
 substring(itemName, 1,1) as FirstLetter,
 Count(itemName)
FROM table1
GROUP BY 1, 2

অবশ্যই আপনি যদি ইন্টারেক্টিভভাবে এটি করে থাকেন এবং ফলশ্রুতিতে কলামগুলির সংখ্যা বা ক্রম পরিবর্তন করতে আপনি ক্যোয়ারীটি সম্পাদনা করেন তবে এটি ব্যথা হতে শুরু করে। কিন্তু এখনো.


GROUP BY FirstLetterPostgresql এ অনুমোদিত। বুদ্ধিমানের জন্য, পোস্টগ্র্যাস্কল এ এটি চালানোর চেষ্টা করুন: তথ্য_সেমিমা গ্রুপ থেকে নাম হিসাবে স্ট্রিং (টেবিলের নাম, 1,2) নির্বাচন করুন নাম অনুসারে
মাইকেল বুয়েন

1
@ মিশেলবুয়েন আমার কাছে সম্ভাব্য সমস্যা বলে মনে হচ্ছে। দ্রুত পরীক্ষা থেকে দেখে মনে হচ্ছে যেন কোনও নাম এবং একটি বেস টেবিল কলাম একই নামটির সাথে দ্বিতীয়টি অগ্রাধিকার পায়? এসকিউএল ফিডল । সুতরাং যদি এই গোষ্ঠীর উপর ওরফে নির্ভর করে পরে স্কিমা পরিবর্তন চুপ করে আপনার ক্যোয়ারী ভঙ্গ করতে পারে এবং শব্দার্থবিজ্ঞানের পরিবর্তন করতে পারে।
মার্টিন স্মিথ

@ মার্টিনস্মিথ কেবল এখন জানতেন যে এটি গোটচা, এটি ব্যবহার থেকে বিরত থাকবে, ধন্যবাদ। পোস্টগ্র্রেএসকিউএল যে শর্টকাটকে অনুমতি দেয় তা প্রদত্ত, তাদের উপন্যাসটিকে অগ্রাধিকার দেওয়া উচিত, অন্যথায় তারা সেই শর্টকাটকে একেবারেই অনুমতি দেয় না।
মাইকেল বুয়েন

পোস্টগ্রিসএসকিউএল ডিজাইনারদের দ্বারা এটি একটি ভয়ানক ধারণা ছিল। এটি GROUP BYসামগ্রিক ফাংশন বা উইন্ডো ফাংশন সম্বলিত কোনও অভিব্যক্তির চেষ্টা করার সাথে সাথেই এটি বিভ্রান্তিকর , যা "স্পষ্টত" কাজ করে না।
লুকাশ

13

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

এখানে তথ্যের জন্য এক উৎস SQL সার্ভার যৌক্তিক প্রক্রিয়াকরণ পর্যায়ক্রমে


8

আমি কেন এটির উত্তর দিচ্ছি না, তবে কেবলমাত্র এসিএইচএল সার্ভারে CROSS APPLYউপন্যাসটি তৈরি করে এই সীমাবদ্ধতার আশেপাশের কোনও পথ দেখাতে চেয়েছি । তারপরে আপনি এটি GROUP BYক্লজে ব্যবহার করুন, ঠিক তেমন :

SELECT 
 itemName as ItemName,
 FirstLetter,
 Count(itemName)
FROM table1
CROSS APPLY (SELECT substring(itemName, 1,1) as FirstLetter) Alias
GROUP BY itemName, FirstLetter

4

সতর্কতা যে গ্রুপ বাই দ্বারা উপনাম ব্যবহার করা (এটি সমর্থন করে এমন পরিষেবাগুলির জন্য, যেমন পোস্টগ্রিজ) অনিচ্ছাকৃত ফলাফল পেতে পারে। উদাহরণস্বরূপ, আপনি যদি এমন একটি উপাধ তৈরি করেন যা ইতিমধ্যে অভ্যন্তরীণ বিবৃতিতে উপস্থিত রয়েছে, তবে গ্রুপ বাই অভ্যন্তরীণ ক্ষেত্রের নামটি বেছে নেবে।

-- Working example in postgres
select col1 as col1_1, avg(col3) as col2_1
from
    (select gender as col1, maritalstatus as col2, 
    yearlyincome as col3 from customer) as layer_1
group by col1_1;

-- Failing example in postgres
select col2 as col1, avg(col3)
from
    (select gender as col1, maritalstatus as col2,
    yearlyincome as col3 from customer) as layer_1
group by col1;

3

কিছু ডিবিএমএস আপনাকে পুরো এক্সপ্রেশনটি পুনরাবৃত্তি না করে পরিবর্তে একটি উপকরণ ব্যবহার করতে দেয়।
তেড়তাটাও এরকম একটি উদাহরণ।

আমি পূরণবাচক অবস্থান স্বরলিপি হিসাবে নথিভুক্ত কারণে বিল দ্বারা বাঞ্ছনীয় এড়াতে এই তাই প্রশ্ন

সহজ এবং মজবুত বিকল্প হ'ল GROUP BY clause এ অভিব্যক্তিটি সর্বদা পুনরাবৃত্তি করা।
DRY এসকিউএল-তে প্রযোজ্য নয়।


1

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


0

যেদিন ফিরে এসেছিলাম যে আরডিবি, পূর্বের ডিসি প্রোডাক্ট যা এখন ওরাকল দ্বারা সমর্থিত তা কলামের নামটি গ্রুপ বাই দ্বারা ব্যবহার করার অনুমতি দেয়। সংস্করণ ১১-এর মাধ্যমে মূলধারার ওরাকল GROUP BY দ্বারা কলামের উপনামটি ব্যবহার করার অনুমতি দেয় না। নিশ্চিত নন যে পোস্টগ্র্যাস্কিল, এসকিউএল সার্ভার, মাইএসকিউএল ইত্যাদি কি অনুমতি দেবে না won't YMMV।

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