সাবকিউরিগুলি এসকিউএল কোয়েরিতে অভিব্যক্তিযুক্ত শক্তি যুক্ত করে?


29

এসকিউএল এর কি সাবকিউরিস দরকার?

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

একটি SQL SELECTকোয়েরি সাধারণত একটি অভিক্ষেপ (নিয়ে গঠিত SELECTঅংশ) কিছু সংখ্যা JOIN(অপারেশন JOINঅংশ) কিছু সংখ্যা SELECTION কার্যকলাপ (SQL এর যে, WHEREক্লজ), এবং তারপর সেট জ্ঞানী কার্যকলাপ ( UNION, EXCEPT, INTERSECT, ইত্যাদি), অন্যের দ্বারা অনুসৃত এসকিউএল SELECTকোয়েরি।

যোগদান করা টেবিলগুলি এক্সপ্রেশনগুলির গণিত ফলাফল হতে পারে; অন্য কথায়, আমরা যেমন একটি বিবৃতি থাকতে পারে:

SELECT t1.name, t2.address
  FROM table1 AS t1 
  JOIN (SELECT id, address 
          FROM table2 AS t3 
         WHERE t3.id = t1.id) AS t2
 WHERE t1.salary > 50,000;

আমরা সাবকিউরি হিসাবে একটি এসকিউএল ক্যোয়ারির অংশ হিসাবে একটি কম্পিউটেড টেবিলের ব্যবহার উল্লেখ করব। উপরের উদাহরণে, দ্বিতীয় (ইন্ডেন্টেড) SELECTএকটি সাবকোয়ারি।

সমস্ত এসকিউএল কোয়েরিগুলি এমনভাবে লেখা যেতে পারে যাতে সাবকোয়ারিগুলি ব্যবহার না করা যায়? উপরের উদাহরণটি পারেন:

SELECT t1.name, t2.address
  FROM table1 AS t1 
  JOIN table2 AS t2
    ON t1.id = t2.id
 WHERE t1.salary > 50,000;

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

SELECT <attribute>,
      ...,
      <attribute>
 FROM <a table, not a subquery>
 JOIN <a table, not a subquery>
  ...
 JOIN <a table, not a subquery>
WHERE <condition>
  AND <condition>
  ...
  AND <condition>

UNION
 -or-
EXCEPT
 -or-
<similar>

SELECT ...

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


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

@ রাফেল আমি মোটামুটি নিশ্চিত আপনি এমনকি একত্রিত মানগুলিও করতে পারেন, আপনাকে আরও বেশি স্ব-যোগদান এবং গ্রুপ-বাই করতে হবে (এটি তাত্পর্যপূর্ণভাবে বৃহত্তর তৈরি করা, তবে এখনও সম্ভব)। যদিও আমি আনুষ্ঠানিকভাবে প্রমাণ করতে পারি যে আপনি যেভাবে সব কিছু করতে পারেন তা অবশ্য নিশ্চিত নয়।
কেভিন

@ কেভিন আপনি কি নিশ্চিত যে অপারেশনগুলি প্রয়োজনীয় সংখ্যক সারিগুলির সংখ্যার উপর নির্ভর করে না? কারণ আমাদের তা থাকতে পারে না, তাই না?
রাফেল

1
স্বাভাবিক উদাহরণস্বরূপ আমি subquery প্রয়োজন জন্য আছে সদৃশ গণনা করা হয়: select count(*) from (select id from sometable group by id having count(*)>1) d। কারণ এটি অন্তর্ভুক্ত group byআমি এটিকে উত্তর হিসাবে রাখি নি।
মার্ক হার্ট

সাধারণ এসকিউএল-তে বিটিডাব্লু আফাইক, এর জন্য ক্লজটি ONপ্রয়োজনীয় JOIN, যদিও কেবল একটি কমা দিয়ে ক্রস পণ্য পাওয়া যায়।
মার্ক হার্ট

উত্তর:


9

কিছু পরিভাষা বিভ্রান্তি আছে; প্রথম বন্ধনীর মধ্যে ক্যোয়ারী ব্লক

SELECT t1.name, t2.address
  FROM table1 
  JOIN (SELECT id, address 
          FROM table2 AS t3 
         WHERE t3.id = t1.id) 

একে অভ্যন্তরীণ দৃশ্য বলে । একটি subquery কোয়ালি ব্লক হয় হয় যেখানে নির্বাচন করুন বা নির্বাচন করুন, যেমন

select deptno from dept
where 3 < (select count(1) from emp 
           where dept.deptno=emp.deptno)

উভয় ক্ষেত্রেই, অভ্যন্তরীণ ভিউ বা সাবকিউরিটি "ফ্ল্যাট" প্রোজেক্ট-সীমাবদ্ধ-যোগে অনিকল্পিত হতে পারে। গোষ্ঠীকরণের সাথে অভ্যন্তরীণ ভিউগুলিতে একীকরণের সাথে সম্পর্কিত সাব-কোয়েরি সম্পর্কিত, যা পরে ফ্ল্যাট ক্যোয়ারিতে অনসেট হয়।

select deptno from dept d
    where 3 < (select avg(sal) from emp e
               where d.deptno=e.deptno)

select d.deptno from dept d, ( 
    select deptno from emp e
    group by deptno
    having avg(sal) > 3
) where d.deptno=e.deptno

select d.deptno from dept d, emp e
where d.deptno=e.deptno 
group by d.deptno
having avg(sal) > 3

ক্যোয়ারী অপ্টিমাইজেশনের জন্য বীজগণিত সংক্রান্ত নিয়মগুলির ক্ষেত্রে, সম্পর্কিত বীজগণিত সম্পর্কিত এবং ল্যাটিক্সের সাথে স্বতঃস্ফূর্ত হিসাবে পরিচিত যা এখানে এবং সেখানে প্রদর্শিত হিসাবে ক্যোয়ারী রূপান্তরকে সহজতর করে ।


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

16

আপনার বক্তব্যটিকে সম্পর্কিত বীজগণিত হিসাবে অনুবাদ করতে, আমার মনে হয় এটি জিজ্ঞাসা করে:

আমরা কি কে হিসাবে আবার লিখতে পারি ?σ ( σ বি ( বি ) )σA(A)σB(B)σA(σB(AB))

(যেখানে নির্বাচন করা হয় এবং যোগ দেওয়া হয়))σ

উত্তরটি "হ্যাঁ" এবং এটি একটি স্ট্যান্ডার্ড ক্যোয়ারী অপ্টিমাইজেশন। সত্যি কথা বলতে কী, প্রশ্নবিদ্ধ-ভিক্ষা পদ্ধতিতে কীভাবে এটি প্রমাণ করবেন আমি নিশ্চিত নই - এটি কেবল নির্বাচন এবং যোগদানের সম্পত্তি। আপনি চান নেস্টেড ক্যোয়ারীগুলির অনেকগুলি স্তর যুক্ত করতে প্ররোচিতভাবে তর্ক করতে পারেন।

অতিরিক্তভাবে, আপনি জিজ্ঞাসা করতে পারেন:

যোগদানের প্রতিটি অনুক্রমকে কি হিসাবে লেখা যেতে পারে [এর বিপরীতে, বলুন, ]?( A B ) ( C D )ABC(AB)(CD)

আবার উত্তরটি হ্যাঁ, কারণ যোগদান হ'ল সাহসী। প্রক্ষেপণ সম্পর্কেও অনুরূপ বিবৃতি দেওয়া যেতে পারে।

একটি উল্লেখযোগ্য ধরণের "সাবকোয়ারি" যা আমি মনে করি এটি "সমতল" করা যায় না with। এটি দেখার একটি উপায় হ'ল নোট করা আপনার যদি withবিবৃতি থাকে তবে আপনার একটি পুনরাবৃত্ত ফাংশন থাকতে পারে, যা সাবকিউরি ব্যবহার না করে লেখা যায় না।

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


রিকার্সিভ আচরণটি withএসকিউএল: ১৯৯৯ সালে প্রবর্তিত হয়েছিল এবং ফলস্বরূপের ভাষাটিকে আরও দৃ express়তর করে তোলে।
আন্দ্রেস সালামন

1

"সাবকিউরিয়েরা কি এসকিউএল কোয়েরিতে অভিব্যক্তিযুক্ত শক্তি যুক্ত করে?"

কমপক্ষে এসকিউএল ভাষায় এক্সেসপিটি প্রবর্তনের আগে তারা করেছিল।

এক্সেসপিটি প্রবর্তনের আগে এসকিউএলে কোনও সাবকোরিয়াস না করেই কোনও সম্পর্কের পার্থক্য বা সেমিডিফারেন্স প্রকাশ করার উপায় ছিল না।

আজকাল, "রিলেশনাল বীজগণিত" এর সমস্ত "সাধারণ" আদিম অপারেটরগুলি সাবকিউরিটি ছাড়াই প্রকাশ করা যেতে পারে:

প্রাকৃতিক যোগদান প্রাকৃতিক যোগদানের মাধ্যমে করা যেতে পারে, বা
ইউনিয়ন
যোগদানের মাধ্যমে ইউনিয়ন মাধ্যমে করা যেতে পারে মাইনাস ছাড়াই প্রকল্পের মাধ্যমে করা যেতে পারে
/ পুনরায় নামকরণ / এক্সটেন্ড করা যায় থ্র্যাগের
মাধ্যমে নির্বাচিত প্রতিস্থাপনের মাধ্যমে সম্পন্ন করা যেতে পারে যেখানে
রিলেশনাল লিটারালগুলি ভ্যালুয়াসের মাধ্যমে
ট্রান্সজিটিভ ক্লোজার্সের মাধ্যমে করা যেতে পারে পুনরাবৃত্তির মাধ্যমে সম্পন্ন করা

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