মাইএসকিউএল ক্যোয়ারীতে, কেন ব্যবহারের পরিবর্তে যোগদান করবেন?


108

এটি দুটি বা ততোধিক টেবিলকে একত্রিত করার মতো মনে হচ্ছে, আমরা হয় যোগ বা যেখানে ব্যবহার করতে পারি। একে অপরের ওপরে কী কী সুবিধা রয়েছে?


2
আপনার ব্যবহারের উপর নির্ভর করে এর সম্ভবত একই ফলাফল হতে পারে তবে একটি জোইন দিয়ে আপনি অন্যান্য ধরণের সমিতি করতে পারেন।
জিনাক

এটা কি তোমার প্রশ্নের উত্তর? যেখানে বনাম বনাম যোগ দিন
ফিলিপ্সি

উত্তর:


160

একাধিক টেবিলের সাথে জড়িত যে কোনও প্রশ্নের জন্য টেবিল "এ" থেকে টেবিল "বি" এর সাথে ফলাফলগুলি লিঙ্ক করার জন্য কিছু প্রকারের সমিতি দরকার। Doingতিহ্যবাহী (এএনএসআই -৯৯) এর অর্থ হ'ল:

  1. FROM ধারাটিতে কমা দ্বারা পৃথক করা তালিকার সাথে যুক্ত টেবিলগুলি তালিকাবদ্ধ করুন
  2. যেখানে সারণিগুলির মধ্যে সারণিগুলির মধ্যে সমিতি লিখুন ER

    SELECT *
      FROM TABLE_A a,
           TABLE_B b
     WHERE a.id = b.id

এখানে এএনএসআই -২২ জিন সিনট্যাক্স ব্যবহার করে পুনরায় লিখিত ক্যোয়ারীটি দেওয়া হয়েছে:

SELECT *
  FROM TABLE_A a
  JOIN TABLE_B b ON b.id = a.id

পারফরম্যান্স দৃষ্টিকোণ থেকে:


যেখানে সমর্থিত (ওরাকল 9 আই +, পোস্টগ্রিসকিউএল 7.2+, মাইএসকিউএল 3.23+, এসকিউএল সার্ভার 2000+) সেখানে অন্যটির বাক্য গঠন বাক্য ব্যবহার করে কোনও কার্যকারিতা সুবিধা নেই benefit অপ্টিমাইজার তাদের একই কোয়েরি হিসাবে দেখবে। তবে আরও জটিল প্রশ্নগুলি এএনএসআই -২৯ সিনট্যাক্স ব্যবহার করে উপকৃত হতে পারে:

  • জয়েন অর্ডার নিয়ন্ত্রণের ক্ষমতা - কোন সারণীগুলি স্ক্যান করা হয়েছে সেই আদেশ
  • যোগদানের আগে কোনও টেবিলে ফিল্টার মানদণ্ড প্রয়োগ করার ক্ষমতা

রক্ষণাবেক্ষণের দৃষ্টিভঙ্গি থেকে:


এএনএসআই -৯৯ এর সাথে এএনএসআই -২৯ জিন সিনট্যাক্স ব্যবহারের অসংখ্য কারণ রয়েছে:

  • আরও পঠনযোগ্য, যেহেতু JOIN মানদণ্ড WHERE ধারা থেকে পৃথক
  • JOIN মানদণ্ড মিস করার সম্ভাবনা কম
  • INNER ব্যতীত JOIN প্রকারের জন্য নিয়মিত সিনট্যাক্স সমর্থন, অন্যান্য ডেটাবেসগুলিতে ক্যোরিগুলি সহজেই ব্যবহার করা যায়
  • যেখানে ক্লজটি কেবল টেবিলগুলির কার্টেসিয়ান পণ্য যোগদানের পরিস্রাবণ হিসাবে কাজ করে

ডিজাইনের দৃষ্টিকোণ থেকে:


এএনএসআই -২২ জিন সিনট্যাক্সটি প্যাটার্ন, অ্যান্টি-প্যাটার্ন নয়:

  • ক্যোয়ারির উদ্দেশ্য আরও সুস্পষ্ট; অ্যাপ্লিকেশন দ্বারা ব্যবহৃত কলামগুলি পরিষ্কার
  • এটি যখনই সম্ভব কঠোর টাইপিংয়ের বিষয়ে পরিমিতি বিধি অনুসরণ করে। স্পষ্টত প্রায় সার্বজনীন ভাল।

উপসংহার


পরিচিতি এবং / বা স্বাচ্ছন্দ্যের সংক্ষিপ্ততা, আমি এএনএসআই -৯৯ জোনের সিনট্যাক্সের পরিবর্তে এএনএসআই -৯৯ WHERE ধারাটি ব্যবহার করা চালিয়ে যাওয়ার কোনও উপকার দেখতে পাচ্ছি না। কেউ কেউ অভিযোগ করতে পারেন যে এএনএসআই -২৯ সিনট্যাক্সটি আরও ভার্বোজ, তবে এটি এটিকে স্পষ্ট করে তোলে। আরও স্পষ্টত, বোঝা এবং বজায় রাখা তত সহজ।


14
"... একাধিক টেবিলের সাথে জড়িত যে কোনও প্রশ্নের জন্য টেবিল 'এ' থেকে টেবিল 'বি' এর সাথে সংযুক্ত করার জন্য কিছু প্রকার সংঘের প্রয়োজন হয় ... অন্যথায় আপনি কার্টেসিয়ান পণ্য পাবেন, এবং আপনি সম্ভবত এটি চান না (যাদের Cartesians বিশ্রি পণ্য করা)।
স্কট স্মিথ

8

কোনটিতে কী যোগ দেওয়া হচ্ছে সে সম্পর্কে বেশিরভাগ লোকেরা জিন সিনট্যাক্সটি কিছুটা স্পষ্টভাবে খুঁজে পেতে চান। অতিরিক্তভাবে, এটি একটি মানক হওয়ার সুবিধা রয়েছে।

ব্যক্তিগতভাবে, আমি যেখানে "বড় হয়েছি", তবে যতই আমি যুক্ত সিনট্যাক্স ব্যবহার করি আমি এটি আরও স্পষ্টভাবে দেখতে শুরু করি।


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

8

সিনট্যাক্স ব্যবহার করার ক্ষেত্রে এই সমস্যাগুলি (অন্তর্নিহিত যোগদান হিসাবে অন্যান্য জ্ঞানী)

প্রথমত, দুর্ঘটনাক্রমে ক্রস যোগ দেওয়া খুব সহজ কারণ যোগদানের শর্তগুলি টেবিলের নামের পাশে ঠিক নেই। যদি আপনার 6 টি টেবিল একসাথে যোগদান করা হয় তবে যেখানে ক্লজটিতে একটিটি মিস করা সহজ। আপনি পৃথক কীওয়ার্ড ব্যবহার করে এটি প্রায়শই স্থির দেখতে পাবেন। এটি ডাটাবেসের জন্য অহেজ পারফরম্যান্স হিট। সুস্পষ্ট জোড় সিনট্যাক্স ব্যবহার করে আপনি দুর্ঘটনাজনক ক্রস জয়েন পেতে পারবেন না কারণ এটি সিনট্যাক্স চেককে ব্যর্থ করবে।

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

যদি আপনি ক্রস জয়েন ব্যবহার করতে চান তবে এটি পুরানো বাক্য গঠন থেকে পরিষ্কার নয়। এটি বর্তমানের এএনএসআইআই স্ট্যান্ডার্ডটি ব্যবহার করে পরিষ্কার।

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

আমি আরও লক্ষ্য করেছি যে কিছু লোক যারা এই অন্তর্নিহিত যোগদানগুলি ব্যবহার করে তারা আসলে কীভাবে যোগদান করে তা বুঝতে পারে না এবং এইভাবে তাদের অনুসন্ধানগুলিতে ভুল ফলাফল পাচ্ছে।

সত্যি বলতে কি, আপনি কি 18 বছর আগে আরও ভাল পদ্ধতিতে প্রতিস্থাপন করা অন্য কোনও ধরণের কোড ব্যবহার করবেন?


6

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


3

আপনি দুটি টেবিল একত্রিত করতে WHERE ব্যবহার করতে পারবেন না। আপনি যা করতে পারেন তা লিখতে হয়:

SELECT * FROM A, B
WHERE ...

এখানে কমা লেখার সমতুল্য:

SELECT *
FROM A
CROSS JOIN B
WHERE ...

আপনি কি এটা লিখবেন? না - কারণ আপনি মোটেই বোঝাতে চাইছেন না। আপনি ক্রস যোগ দিতে চান না, আপনি একটি অন্তর্ভুক্ত যোগদান করতে চান। কিন্তু যখন আপনি কমা লিখেন, আপনি ক্রস যোগ দিয়ে বলছেন এবং এটি বিভ্রান্তিকর।


0

আসলে আপনার প্রায়শই "WHERE" এবং "যোগদান" উভয়ই প্রয়োজন।

"যোগদান" দুটি টেবিল থেকে ডেটা পুনরুদ্ধার করতে ব্যবহৃত হয় - একটি সাধারণ কলামের মানগুলির উপর ভিত্তি করে। আপনি যদি এই ফলাফলটি আরও ফিল্টার করতে চান তবে WHERE ধারাটি ব্যবহার করুন।

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

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