মাইএসকিউএল বনাম ব্যবহার?


252

মাইএসকিউএলে JOIN, ONএবং এর মধ্যে পার্থক্য কী USING()? আমি যতদূর বলতে পারি, USING()এটি কেবল আরও সুবিধাজনক বাক্য গঠন, ONযখন কলামের নামগুলি অভিন্ন না হলে কিছুটা আরও নমনীয়তার সুযোগ দেয়। তবে, পার্থক্যটি খুব সামান্য, আপনি ভাববেন যে তারা এগুলি সরিয়ে ফেলবে USING()

এর চেয়ে বেশি কি চোখের দেখা পাওয়া যায়? যদি হ্যাঁ, একটি প্রদত্ত পরিস্থিতিতে আমি কোনটি ব্যবহার করব?


1
: এছাড়াও আছে প্রাকৃতিক JOIN stackoverflow.com/questions/8696383/...
allyourcode

usingযোগ দিন ছাড়াও অন্য ব্যবহার রয়েছে তা নোট করুন । দেখুন stackoverflow.com/a/13750399/632951
Pacerier

উত্তর:


400

এটি বেশিরভাগ ক্ষেত্রে সিনট্যাকটিক চিনি, তবে কয়েকটি ভিন্নতা লক্ষণীয়:

ওএন হ'ল দু'জনের মধ্যে আরও জেনারেল। একটি কলামের কলাম, একটি কলামের সেট এবং এমনকি শর্তে সারণিতে যোগদান করতে পারে। উদাহরণ স্বরূপ:

SELECT * FROM world.City JOIN world.Country ON (City.CountryCode = Country.Code) WHERE ...

উভয় টেবিলগুলি যে একই নামটিতে যুক্ত হয় তার একই নামের কলামটি ভাগ করে নেওয়ার সময় সেগুলি কার্যকর হয়। এই ক্ষেত্রে, কেউ বলতে পারেন:

SELECT ... FROM film JOIN film_actor USING (film_id) WHERE ...

একটি অতিরিক্ত সুন্দর ট্রিট হ'ল এতে যোগদানকারী কলামগুলিকে পুরোপুরি যোগ্যতার প্রয়োজন নেই:

SELECT film.title, film_id -- film_id is not prefixed
FROM film
JOIN film_actor USING (film_id)
WHERE ...

উদাহরণস্বরূপ, ওএন দিয়ে উপরেরটি করতে , আমাদের লিখতে হবে:

SELECT film.title, film.film_id -- film.film_id is required here
FROM film
JOIN film_actor ON (film.film_id = film_actor.film_id)
WHERE ...

ধারাটিতে film.film_idযোগ্যতার বিষয়টি লক্ষ্য করুন SELECT। এটি কেবল film_idঅস্পষ্ট হবে যেহেতু এটি একটি অস্পষ্টতার জন্য তৈরি করবে:

ERROR 1052 (23000): ফিল্ড তালিকার কলাম 'ফিল্ম_আইডি' অস্পষ্ট

হিসাবে হিসাবে select *, যোগদানের কলামটি ফলাফল সেটটিতে দু'বার ONপ্রদর্শিত হবে যখন এটি একবারে প্রদর্শিত হবে USING:

mysql> create table t(i int);insert t select 1;create table t2 select*from t;
Query OK, 0 rows affected (0.11 sec)

Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

Query OK, 1 row affected (0.19 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select*from t join t2 on t.i=t2.i;
+------+------+
| i    | i    |
+------+------+
|    1 |    1 |
+------+------+
1 row in set (0.00 sec)

mysql> select*from t join t2 using(i);
+------+
| i    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql>

2
+1 সিনট্যাক্টিকাল পার্থক্য সম্পর্কে দুর্দান্ত উত্তর। আমি পারফরম্যান্স পার্থক্য সম্পর্কে কৌতূহল, যদি হয়। আমি কল্পনা USINGকরার ব্যাখ্যা করে ON
জেসন ম্যাকক্রারি

9
আসলে, উভয়ই সমান পুরাতন থেটা-স্টাইলকে ব্যাখ্যা করে। আপনি দেখতে পাচ্ছেন যে আপনার ক্যোয়ারিতে এক্সট্লেন্ড এক্সটেন্ডড ইনভেস্ট করে, তারপরে শো সতর্কতাগুলি অনুসরণ করুন।
Shlomi নোয়াচ

2
আপনি USING(বিভাগের ,ক্ষেত্র_আইডও করতে পারেন )যা যৌগিক প্রাথমিক কীগুলিতে যোগদানের সময় কার্যকর, এছাড়াও আমি শুনেছি যে অপ্টিমাইজার USINGকিছু ক্ষেত্রে পারফরম্যান্স উন্নত করতে ব্যবহার করে
টিমো হুভিনেন

কি USINGএকটি মাইএসকিউএল সংজ্ঞা বা তা মানসম্পন্ন হয়?
ফোনিক্স


18

ভেবেছিলাম যে আমি যখন এখানে ONথেকে বেশি দরকারী বলে খুঁজে পেয়েছি তখন আমি এখানে চিপ করব USINGOUTERযোগদানগুলি যখন কোয়েরিতে পরিচয় হয়।

ONযোগদানের OUTERরক্ষণাবেক্ষণের সময় কোনও কোয়েরিতে যোগ দেওয়া সারণীর ফলাফল নির্ধারণের অনুমতি দেওয়া থেকে সুবিধা OUTER। একটি নির্দিষ্ট মাধ্যমে নির্ধারণ করে ফলাফল সীমিত করার প্রয়াস WHEREদফা করবে কার্যকরভাবে পরিবর্তন OUTERযোগদানের মধ্যে একটি INNERযোগদান।

অনুমোদিত এটি কোনও আপেক্ষিক কোণার কেস হতে পারে। যদিও সেখানে রেখে দেওয়া মূল্যবান .....

উদাহরণ স্বরূপ:

CREATE TABLE country (
   countryId int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
   country varchar(50) not null,
  UNIQUE KEY countryUIdx1 (country)
) ENGINE=InnoDB;

insert into country(country) values ("France");
insert into country(country) values ("China");
insert into country(country) values ("USA");
insert into country(country) values ("Italy");
insert into country(country) values ("UK");
insert into country(country) values ("Monaco");


CREATE TABLE city (
  cityId int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
  countryId int(10) unsigned not null,
  city varchar(50) not null,
  hasAirport boolean not null default true,
  UNIQUE KEY cityUIdx1 (countryId,city),
  CONSTRAINT city_country_fk1 FOREIGN KEY (countryId) REFERENCES country (countryId)
) ENGINE=InnoDB;


insert into city (countryId,city,hasAirport) values (1,"Paris",true);
insert into city (countryId,city,hasAirport) values (2,"Bejing",true);
insert into city (countryId,city,hasAirport) values (3,"New York",true);
insert into city (countryId,city,hasAirport) values (4,"Napoli",true);
insert into city (countryId,city,hasAirport) values (5,"Manchester",true);
insert into city (countryId,city,hasAirport) values (5,"Birmingham",false);
insert into city (countryId,city,hasAirport) values (3,"Cincinatti",false);
insert into city (countryId,city,hasAirport) values (6,"Monaco",false);

-- Gah. Left outer join is now effectively an inner join 
-- because of the where predicate
select *
from country left join city using (countryId)
where hasAirport
; 

-- Hooray! I can see Monaco again thanks to 
-- moving my predicate into the ON
select *
from country co left join city ci on (co.countryId=ci.countryId and ci.hasAirport)
; 

4
অত্যন্ত ভাল পয়েন্ট। সমস্ত সুবিধাগুলি usingসরবরাহ করে, এটি অন্যান্য পূর্বাভাসের সাথে একত্রিত করা যায় না: select*from t join t2 using(i) and on 1কাজ করবে না।
পেসারিয়ার

where hasAirport ;- এটার মানে কি ? এর সাথে তুলনা করার মতো কোনও মূল্য নেই।
ইসতিয়াক আহমেদ

এছাড়াও নোট করুন যে আপনি কেবল = এর চেয়ে ওনার সাথে আরও তুলনা করতে পারেন। SELECT * FROM country LEFT JOIN city ON country.countryId=city.countryId AND city.city BETWEEN 'C' AND 'E' সমস্ত দেশকে পছন্দ করবে তবে কেবল সি বা ডি দিয়ে শুরু করা শহরগুলি (যদি থাকে)। ('ই' নামে পরিচিত শহরগুলি)
রোমের

আমি একবার এমনকি অন-এ সাবকিউরির সাথে একটি জয়েনও করেছি !!! এটি সব সম্ভব এবং কখনও কখনও অত্যন্ত কার্যকর।
রোমার

11

উইকিপিডিয়ায় নিম্নলিখিত তথ্য রয়েছে USING:

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

টেবিলগুলি যেগুলি সম্পর্কে কথা বলছিল:

এখানে চিত্র বর্ণনা লিখুন

Postgres ডকুমেন্টেশন তাদের চমত্কার করবেঃ

ওএন ক্লজটি সর্বাধিক সাধারণ ধরণের যোগদানের শর্ত: এটি পুরো ধরণের একটি বুলিয়ান মান প্রকাশ করে যেখানে একটি দফায় ব্যবহৃত হয়। টি -1 এবং টি 2 থেকে সারিগুলির একটি জুটি মিলছে যদি ওয়ান এক্সপ্রেশনটি সত্যকে মূল্যায়ন করে।

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

তদুপরি, JOIN USING এর আউটপুট রিলান্ট্যান্ট কলামগুলিকে দমন করে: উভয় মিলিয়ে কলামগুলি মুদ্রণের প্রয়োজন নেই, কারণ তাদের সমান মান থাকতে হবে। যোগদানের পরে টি 1 থেকে সমস্ত কলাম টি-এর সমস্ত কলাম এবং তারপরে টি 2 থেকে সমস্ত কলাম তৈরি হয়, যোগদানের মাধ্যমে তালিকাভুক্ত প্রতিটি কলাম জোড়া (তালিকাভুক্ত ক্রমে) জন্য একটি আউটপুট কলাম তৈরি হয়, তারপরে টি 1 থেকে অবশিষ্ট কলামগুলি অনুসরণ করবে, তারপরে টি 2 থেকে অবশিষ্ট কলামগুলি অনুসরণ করবে ।


1

যারা পিএইচপিএমএইডমিনে এটি নিয়ে গবেষণা করছেন তাদের জন্য কেবল একটি শব্দ:

phpMyAdmin এর সাথে কয়েকটি সমস্যা রয়েছে বলে মনে হচ্ছে USING। রেকর্ডের জন্য এটি পিএইচপিএমইএডমিনটি লিনাক্স মিন্ট, সংস্করণে চালিত হয়: "4.5.4.1deb2ubuntu2", ডাটাবেস সার্ভার: "10.2.14-মারিয়াডিবি-10.2.14 + মারিয়া ~ জেনিয়াল - মারিয়্যাডবিআরও বাইনারি বিতরণ"।

আমি পিএইচপিএমওয়াই অ্যাডমিন এবং টার্মিনাল (কমান্ড লাইন) SELECTব্যবহার করে JOINএবং কমান্ডগুলি চালিত করেছি USING, এবং পিএইচপিএমওয়াই অ্যাডমিনে থাকা কিছু বিস্মিত প্রতিক্রিয়া প্রকাশ করে:

1) LIMITশেষে একটি ধারা উপেক্ষা করা হবে বলে মনে হচ্ছে।
2) ফলাফলগুলির সাথে পৃষ্ঠার শীর্ষে বর্ণিত সারিগুলির অনুমিত সংখ্যাটি কখনও কখনও ভুল হয়: উদাহরণস্বরূপ 4 ফিরিয়ে দেওয়া হয়, তবে শীর্ষে এটি বলে "সারিগুলি 0 - 24 দেখানো (2503 মোট, ক্যোয়ারি 0.0018 সেকেন্ড সময় নিয়েছে)) "

সাধারণত mysql এ লগ ইন করা এবং একই ক্যোয়ারী চালানো এই ত্রুটিগুলি তৈরি করে না। পিএইচপিএমআইএডমিন ব্যবহার করে একই ক্যোয়ারি চালানোর সময় এই ত্রুটিগুলিও ঘটে না JOIN ... ON ...। সম্ভবত একটি phpMyAdmin বাগ।

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