পর্ব 1 - যোগদান এবং ইউনিয়নসমূহ
এই উত্তরটি কভার করে:
- অংশ 1
- অংশ ২
- সাবকিউরিগুলি - সেগুলি কী, তারা কোথায় ব্যবহার করা যায় এবং কী কী সন্ধান করা উচিত
- কার্তেসিয়ান একেতে যোগ দিলেন - ওঃ দুর্ভাগ্য!
একটি ডাটাবেসে একাধিক সারণী থেকে ডেটা পুনরুদ্ধার করার বিভিন্ন উপায় রয়েছে। এই উত্তরে, আমি এএনএসআই -92 সংযুক্ত সিনট্যাক্স ব্যবহার করব। এটি বেশ কয়েকটি অন্যান্য টিউটোরিয়ালের চেয়ে আলাদা হতে পারে যা পুরানো এএনএসআই -৯৯ সিনট্যাক্স ব্যবহার করে (এবং আপনি যদি 89 এর সাথে ব্যবহার করেন তবে এটি খুব কম স্বজ্ঞাত মনে হতে পারে - তবে আমি যা বলতে পারি তা চেষ্টা করেই করা যায়) কারণ এটি অনেক সহজ যখন প্রশ্নগুলি আরও জটিল হতে শুরু করে তখন বুঝতে। কেন এটি ব্যবহার করবেন? একটি কর্মক্ষমতা লাভ আছে? সংক্ষিপ্ত উত্তর নেই, কিন্তু এটি হল একবার আপনি এটি ব্যবহার করতে পারেন অথবা পড়ার জন্য সহজ। এই সিনট্যাক্সটি ব্যবহার করে অন্যান্য লোকদের দ্বারা লিখিত প্রশ্নগুলি পড়া আরও সহজ।
আমি একটি ছোট caryard ধারণা ব্যবহার করতে যাচ্ছি যা কোন গাড়ী উপলব্ধ তা ট্র্যাক রাখতে একটি ডাটাবেস আছে। মালিক আপনাকে তার আইটি কম্পিউটার লোক হিসাবে ভাড়া করেছে এবং প্রত্যাশা করে যে আপনি হ্যাট পড়ার সময় যে ডেটা জিজ্ঞাসা করেছেন তা তাকে ফেলে দিতে সক্ষম হবেন।
আমি অনেকগুলি সন্ধানের টেবিল তৈরি করেছি যা চূড়ান্ত সারণী দ্বারা ব্যবহৃত হবে। এটি আমাদের থেকে কাজ করার জন্য একটি যুক্তিসঙ্গত মডেল দেবে। শুরু করার জন্য, আমি নীচের কাঠামোগত উদাহরণস্বরূপ ডাটাবেসের বিরুদ্ধে আমার প্রশ্নগুলি চালাচ্ছি। আমি শুরু করার সময় ঘটে যাওয়া সাধারণ ভুলগুলি সম্পর্কে চিন্তা করার চেষ্টা করব এবং তাদের সাথে কী কী ঘটে যায় তা ব্যাখ্যা করব - পাশাপাশি অবশ্যই সেগুলি কীভাবে সংশোধন করতে হবে তাও দেখিয়ে দেব।
প্রথম টেবিলটি কেবল একটি রঙের তালিকা যাতে আমরা জানতে পারি যে গাড়ীর উঠোনটিতে আমাদের কী রঙ রয়েছে।
mysql> create table colors(id int(3) not null auto_increment primary key,
-> color varchar(15), paint varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from colors;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| color | varchar(15) | YES | | NULL | |
| paint | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
mysql> insert into colors (color, paint) values ('Red', 'Metallic'),
-> ('Green', 'Gloss'), ('Blue', 'Metallic'),
-> ('White' 'Gloss'), ('Black' 'Gloss');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from colors;
+----+-------+----------+
| id | color | paint |
+----+-------+----------+
| 1 | Red | Metallic |
| 2 | Green | Gloss |
| 3 | Blue | Metallic |
| 4 | White | Gloss |
| 5 | Black | Gloss |
+----+-------+----------+
5 rows in set (0.00 sec)
ব্র্যান্ডস টেবিলটি বিভিন্ন ব্র্যান্ডের গাড়ি বাইরে বেরিয়ে সম্ভবত ক্যারিয়ার বিক্রি করতে পারে identif
mysql> create table brands (id int(3) not null auto_increment primary key,
-> brand varchar(15));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from brands;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| brand | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
mysql> insert into brands (brand) values ('Ford'), ('Toyota'),
-> ('Nissan'), ('Smart'), ('BMW');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from brands;
+----+--------+
| id | brand |
+----+--------+
| 1 | Ford |
| 2 | Toyota |
| 3 | Nissan |
| 4 | Smart |
| 5 | BMW |
+----+--------+
5 rows in set (0.00 sec)
মডেল টেবিলটি বিভিন্ন ধরণের গাড়ি কভার করবে, প্রকৃত গাড়ির মডেলগুলির চেয়ে বিভিন্ন গাড়ি ধরণের ব্যবহার করা সহজ হবে এটি।
mysql> create table models (id int(3) not null auto_increment primary key,
-> model varchar(15));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from models;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| model | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> insert into models (model) values ('Sports'), ('Sedan'), ('4WD'), ('Luxury');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from models;
+----+--------+
| id | model |
+----+--------+
| 1 | Sports |
| 2 | Sedan |
| 3 | 4WD |
| 4 | Luxury |
+----+--------+
4 rows in set (0.00 sec)
এবং সবশেষে, এই সমস্ত অন্যান্য টেবিলগুলি বেঁধে রাখতে, টেবিলটি যা সবকিছুকে একসাথে জড়িত। আইডি ফিল্ডটি আসলে গাড়ি সনাক্ত করতে ব্যবহৃত অনন্য লট নম্বর।
mysql> create table cars (id int(3) not null auto_increment primary key,
-> color int(3), brand int(3), model int(3));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from cars;
+-------+--------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| color | int(3) | YES | | NULL | |
| brand | int(3) | YES | | NULL | |
| model | int(3) | YES | | NULL | |
+-------+--------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> insert into cars (color, brand, model) values (1,2,1), (3,1,2), (5,3,1),
-> (4,4,2), (2,2,3), (3,5,4), (4,1,3), (2,2,1), (5,2,3), (4,5,1);
Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> select * from cars;
+----+-------+-------+-------+
| id | color | brand | model |
+----+-------+-------+-------+
| 1 | 1 | 2 | 1 |
| 2 | 3 | 1 | 2 |
| 3 | 5 | 3 | 1 |
| 4 | 4 | 4 | 2 |
| 5 | 2 | 2 | 3 |
| 6 | 3 | 5 | 4 |
| 7 | 4 | 1 | 3 |
| 8 | 2 | 2 | 1 |
| 9 | 5 | 2 | 3 |
| 10 | 4 | 5 | 1 |
+----+-------+-------+-------+
10 rows in set (0.00 sec)
এটি আমাদের বিভিন্ন ধরণের যোগদানের নীচের উদাহরণগুলি কভার করতে পর্যাপ্ত ডেটা (আশা করি) দেবে এবং এগুলি সার্থক করার জন্য পর্যাপ্ত ডেটা দেবে।
সুতরাং এর কৌতুক intoুকতে গিয়ে, বস তার কাছে থাকা সমস্ত স্পোর্ট কারের আইডি জানতে চায় ।
এটি একটি সহজ দুটি টেবিল যোগদান। আমাদের কাছে একটি টেবিল রয়েছে যা এতে উপলব্ধ স্টক সহ মডেল এবং টেবিলটি সনাক্ত করে। আপনি দেখতে পাচ্ছেন, টেবিলের model
কলামের ডেটা আমাদের থাকা cars
টেবিলের models
কলামের সাথে সম্পর্কিত cars
। এখন, আমরা জানি যে মডেল টেবিলের 1
জন্য একটি আইডি রয়েছে Sports
সুতরাং যোগদানটি লিখতে দিন।
select
ID,
model
from
cars
join models
on model=ID
সুতরাং এই ক্যোয়ারী ঠিক আছে? আমরা দুটি সারণী শনাক্ত করেছি এবং আমাদের প্রয়োজনীয় তথ্য রয়েছে এবং একটি যোগদান ব্যবহার করে যা কোন কলামগুলিতে যোগদান করতে হবে তা সঠিকভাবে সনাক্ত করে।
ERROR 1052 (23000): Column 'ID' in field list is ambiguous
ওহ নোস! আমাদের প্রথম প্রশ্নে একটি ত্রুটি! হ্যাঁ, এবং এটি একটি বরই। আপনি দেখুন, ক্যোয়ারীটি সত্যই সঠিক কলাম পেয়েছে, তবে সেগুলির কয়েকটি উভয় সারণীতে উপস্থিত রয়েছে, সুতরাং প্রকৃত কলামটি আমাদের কী এবং কোথায় তা সম্পর্কে ডাটাবেস গুলিয়ে যায়। এটি সমাধান করার জন্য দুটি সমাধান রয়েছে। প্রথমটি খুব সহজ এবং সহজ, আমরা tableName.columnName
ডাটাবেসটিকে ঠিক কী বলতে চাইছিলাম তা বোঝাতে এটি ব্যবহার করতে পারি:
select
cars.ID,
models.model
from
cars
join models
on cars.model=models.ID
+----+--------+
| ID | model |
+----+--------+
| 1 | Sports |
| 3 | Sports |
| 8 | Sports |
| 10 | Sports |
| 2 | Sedan |
| 4 | Sedan |
| 5 | 4WD |
| 7 | 4WD |
| 9 | 4WD |
| 6 | Luxury |
+----+--------+
10 rows in set (0.00 sec)
অন্যটি সম্ভবত বেশি ব্যবহৃত হয় এবং এটি টেবিল এলিয়জিং বলে। এই উদাহরণের টেবিলগুলির সুন্দর এবং সংক্ষিপ্ত সাধারণ নাম রয়েছে তবে এর মতো কিছু লিখে খুব সহজেই KPI_DAILY_SALES_BY_DEPARTMENT
পুরানো হয়ে যায়, তাই সাধারণ উপায়টি হ'ল টেবিলের ডাকনাম দেওয়া:
select
a.ID,
b.model
from
cars a
join models b
on a.model=b.ID
এখন, অনুরোধ ফিরে। আপনি দেখতে পাচ্ছেন যে আমাদের আমাদের প্রয়োজনীয় তথ্য রয়েছে তবে আমাদের কাছে এমন তথ্যও রয়েছে যা জিজ্ঞাসা করা হয়নি, সুতরাং স্পোর্টস গাড়িগুলি যেমন জিজ্ঞাসা করা হয়েছিল তেমন পেতে আমাদের বিবৃতিতে একটি ধারা অন্তর্ভুক্ত করতে হবে। আমি যেমন টেবিলের নামটি বারবার টেবিলের নাম ব্যবহার না করে পছন্দ করি, আমি এদিক থেকে এটির সাথে আঁকড়ে থাকব।
স্পষ্টতই, আমাদের কোয়েরিতে আমাদের একটি ক্লজ যুক্ত করতে হবে। আমরা স্পোর্টস গাড়িগুলি উভয় দ্বারা ID=1
বা শনাক্ত করতে পারি model='Sports'
। যেহেতু আইডিটি সূচকযুক্ত এবং প্রাথমিক কী (এবং এটি কম টাইপিংয়ের সাথে ঘটে), আমাদের ক্যোয়ারিতে এটি ব্যবহার করতে দিন।
select
a.ID,
b.model
from
cars a
join models b
on a.model=b.ID
where
b.ID=1
+----+--------+
| ID | model |
+----+--------+
| 1 | Sports |
| 3 | Sports |
| 8 | Sports |
| 10 | Sports |
+----+--------+
4 rows in set (0.00 sec)
বিঙ্গো! বস খুশি। অবশ্যই একজন বস হওয়া এবং তিনি যা চেয়েছিলেন তাতে কখনও খুশি হন না, তিনি তথ্যটি দেখেন, তারপরে বলেন আমিও রঙগুলি চাই ।
ঠিক আছে, সুতরাং আমাদের কোয়েরিতে ইতিমধ্যে লিখিত একটি ভাল অংশ রয়েছে, তবে আমাদের তৃতীয় টেবিলটি ব্যবহার করা উচিত যা রঙ। এখন, আমাদের প্রধান তথ্যের টেবিলটি cars
গাড়ীর রঙিন আইডি সঞ্চয় করে এবং এইগুলি রঙিন আইডি কলামে ফিরে আসে। সুতরাং, মূলটির সাথে একইভাবে, আমরা একটি তৃতীয় টেবিলে যোগদান করতে পারি:
select
a.ID,
b.model
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
where
b.ID=1
+----+--------+
| ID | model |
+----+--------+
| 1 | Sports |
| 3 | Sports |
| 8 | Sports |
| 10 | Sports |
+----+--------+
4 rows in set (0.00 sec)
জঘন্য, যদিও টেবিলটি সঠিকভাবে যুক্ত ছিল এবং সম্পর্কিত কলামগুলি লিঙ্কযুক্ত ছিল, আমরা নতুন সারণীটি যা সবেমাত্র লিঙ্ক করেছি তা থেকে আমরা আসল তথ্যটি টানতে ভুলে গেছি ।
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
where
b.ID=1
+----+--------+-------+
| ID | model | color |
+----+--------+-------+
| 1 | Sports | Red |
| 8 | Sports | Green |
| 10 | Sports | White |
| 3 | Sports | Black |
+----+--------+-------+
4 rows in set (0.00 sec)
ঠিক আছে, এই মুহুর্তের জন্য আমাদের পিছনে বস। এখন, এর আরও কিছুটা বিস্তারিতভাবে ব্যাখ্যা করার জন্য। আপনি দেখতে পাচ্ছেন যে, from
আমাদের বিবৃতিতে থাকা ধারাটি আমাদের মূল টেবিলের সাথে লিঙ্ক করেছে (আমি প্রায়শই কোনও সারণী ব্যবহার করি যা অনুসন্ধান বা মাত্রা সারণির চেয়ে তথ্য থাকে The কোয়েরিটি কেবল পাশাপাশি কাজ করবে সমস্ত টেবিলে সরিয়ে দেওয়া, তবে কখনই কম জ্ঞান হবে আমরা কয়েক মাসের মধ্যে এটি পড়ার জন্য এই ক্যোয়ারিতে ফিরে আসি, সুতরাং প্রায়শই একটি কোয়েরিটি লেখার চেষ্টা করা ভাল যা সহজ এবং সহজেই বুঝতে পারে - এটি স্বজ্ঞাতভাবে লিখে রাখুন, সুন্দর ইনডেন্টিং ব্যবহার করুন যাতে সবকিছু যেমন পরিষ্কার হয় তেমন হয় এটি হতে পারে you আপনি যদি অন্যকে শেখাতে যান তবে তাদের বৈশিষ্ট্যগুলিতে এই বৈশিষ্ট্যগুলি প্রবর্তনের চেষ্টা করুন - বিশেষত যদি আপনি তাদের সমস্যা সমাধান করছেন।
এই পদ্ধতিতে আরও বেশি করে সারণীর সংযোগ স্থাপন করা সম্পূর্ণভাবে সম্ভব।
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=1
আমি এমন কোনও টেবিল অন্তর্ভুক্ত করতে ভুলে গিয়েছি যেখানে আমরা join
বিবৃতিতে একাধিক কলামে যোগ দিতে চাই , এখানে একটি উদাহরণ। যদি models
টেবিলটির ব্র্যান্ড-নির্দিষ্ট মডেল থাকে এবং সেইসাথে এমন একটি কলামও বলা হয় brand
যা মাঠের brands
টেবিলের সাথে ফিরে যুক্ত হয়েছিল ID
, এটি এটি হিসাবে এটি করা যেতে পারে:
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
and b.brand=d.ID
where
b.ID=1
আপনি দেখতে পাচ্ছেন, উপরের ক্যোয়ারীটি কেবল যুক্ত টেবিলগুলিকে মূল cars
টেবিলের সাথে সংযুক্ত করে না , তবে ইতিমধ্যে যোগদান করা টেবিলগুলির মধ্যে যোগদানের বিষয়টিও নির্দিষ্ট করে। যদি এটি না করা হয়, তবে ফলাফলটিকে কার্তেসিয়ান জয়েন বলা হয় - যা খারাপ হওয়ার জন্য ডিবিএ বলে। কার্টেসিয়ান জয়েন হ'ল এক জায়গায় যেখানে সারিগুলি ফিরে আসে কারণ তথ্যগুলি কীভাবে ফলাফলকে সীমাবদ্ধ করতে পারে তা ডেটাবেসকে বলে না, সুতরাং কোয়েরিতে মানদণ্ডের সাথে মানিয়ে যায় এমন সমস্ত সারি ফিরিয়ে দেয়।
সুতরাং, কার্তেসিয়ান যোগদানের উদাহরণ দেওয়ার জন্য, নিম্নলিখিত কোয়েরিটি চালানো যাক:
select
a.ID,
b.model
from
cars a
join models b
+----+--------+
| ID | model |
+----+--------+
| 1 | Sports |
| 1 | Sedan |
| 1 | 4WD |
| 1 | Luxury |
| 2 | Sports |
| 2 | Sedan |
| 2 | 4WD |
| 2 | Luxury |
| 3 | Sports |
| 3 | Sedan |
| 3 | 4WD |
| 3 | Luxury |
| 4 | Sports |
| 4 | Sedan |
| 4 | 4WD |
| 4 | Luxury |
| 5 | Sports |
| 5 | Sedan |
| 5 | 4WD |
| 5 | Luxury |
| 6 | Sports |
| 6 | Sedan |
| 6 | 4WD |
| 6 | Luxury |
| 7 | Sports |
| 7 | Sedan |
| 7 | 4WD |
| 7 | Luxury |
| 8 | Sports |
| 8 | Sedan |
| 8 | 4WD |
| 8 | Luxury |
| 9 | Sports |
| 9 | Sedan |
| 9 | 4WD |
| 9 | Luxury |
| 10 | Sports |
| 10 | Sedan |
| 10 | 4WD |
| 10 | Luxury |
+----+--------+
40 rows in set (0.00 sec)
ভাল godশ্বর, এটা কুশ্রী। তবে, যতদূর ডাটাবেস সম্পর্কিত, ঠিক এটিই যা চাওয়া হয়েছিল। ক্যোয়ারী, আমরা জন্য জিজ্ঞাসা ID
থেকে cars
এবং model
থেকে models
। যাইহোক, কারণ আমরা তা নির্দিষ্ট করেন নি কিভাবে টেবিল যোগদানের জন্য, ডাটাবেজ মিলেছে করেনি যে প্রথম টেবিল থেকে সারি সঙ্গে যে দ্বিতীয় টেবিল থেকে সারি।
ঠিক আছে, সুতরাং বস ফিরে আসেন, এবং তিনি আরও তথ্য চান। আমি একই তালিকাটি চাই, তবে এটিতে 4 ডাব্লুডিও অন্তর্ভুক্ত করব ।
তবে এটি আমাদের এটি সম্পাদন করার জন্য দুটি ভিন্ন উপায়ের দিকে তাকানোর দুর্দান্ত অজুহাত দেয়। আমরা যেখানে এখানে আর একটি শর্ত যুক্ত করতে পারলাম এর মতো:
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=1
or b.ID=3
যদিও উপরেরটি পুরোপুরি ভালভাবে কাজ করবে, এটিকে অন্যরকমভাবে দেখুক, কীভাবে কোনও union
ক্যোয়ারী কাজ করবে তা দেখানোর জন্য এটি দুর্দান্ত বাহানা use
আমরা জানি যে নিম্নলিখিতগুলি সমস্ত স্পোর্টস গাড়ি ফেরত দেবে:
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=1
এবং নিম্নলিখিতগুলি সমস্ত 4WD ফিরে আসবে:
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=3
সুতরাং union all
তাদের মধ্যে একটি ধারা যুক্ত করে, দ্বিতীয় ক্যোয়ারির ফলাফলগুলি প্রথম ক্যোয়ারীর ফলাফলগুলিতে সংযুক্ত হবে।
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=1
union all
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=3
+----+--------+-------+
| ID | model | color |
+----+--------+-------+
| 1 | Sports | Red |
| 8 | Sports | Green |
| 10 | Sports | White |
| 3 | Sports | Black |
| 5 | 4WD | Green |
| 7 | 4WD | White |
| 9 | 4WD | Black |
+----+--------+-------+
7 rows in set (0.00 sec)
আপনি দেখতে পাচ্ছেন, প্রথম ক্যোয়ারীর ফলাফলগুলি প্রথমে ফিরে আসে এবং তার পরে দ্বিতীয় ক্যোয়ারির ফলাফল আসে।
এই উদাহরণস্বরূপ, অবশ্যই প্রথম ক্যোয়ারীটি ব্যবহার করা অবশ্যই অনেক সহজ ছিল তবে union
সুনির্দিষ্ট ক্ষেত্রে অনুসন্ধানগুলি দুর্দান্ত হতে পারে। অথবা যে বিষয়টি জন্য - তারা টেবিল সহজেই একসঙ্গে যোগদান করেননি থেকে টেবিল থেকে নির্দিষ্ট ফলাফলের ফিরে যাওয়ার একটি দুর্দান্ত উপায় সম্পূর্ণরূপে সম্পর্কহীন টেবিল। তবে কয়েকটি বিধি অনুসরণ করতে হবে।
- প্রথম ক্যোয়ারী থেকে কলামের ধরণগুলি অবশ্যই নীচের প্রতিটি অন্যান্য ক্যোয়ারীর কলামের সাথে মেলে।
- প্রথম ক্যোয়ারী থেকে কলামগুলির নামগুলি ফলাফলের পুরো সেট সনাক্ত করতে ব্যবহৃত হবে।
- প্রতিটি ক্যোয়ারিতে কলামের সংখ্যা অবশ্যই একই হতে হবে।
এখন, আপনি ভাবছেন যে ব্যবহার union
এবং এর মধ্যে পার্থক্য কিunion all
। একটি union
কোয়েরি সদৃশগুলি সরিয়ে ফেলবে, যখন একটি তা union all
করবে না। এর অর্থ এই নয় যে union
ওভার ব্যবহারের সময় একটি ছোট পারফরম্যান্স হিট হয়েছে union all
তবে ফলাফলগুলি এর পক্ষে মূল্যবান হতে পারে - যদিও আমি এই ধরণের জিনিসটির বিষয়ে অনুমান করব না।
এই নোটটিতে, এটি কিছু অতিরিক্ত নোটগুলি লক্ষ্য করার মতো হতে পারে।
- আমরা যদি ফলাফলগুলি অর্ডার করতে চেয়েছিলাম তবে আমরা একটি ব্যবহার
order by
করতে পারি তবে আপনি আর কোনও নাম ব্যবহার করতে পারবেন না। উপরের ক্যোয়ারিতে, একটি যুক্ত করা একটি order by a.ID
ত্রুটির কারণ হতে পারে - যতদূর ফলাফল সম্পর্কিত, কলামটি ID
পরিবর্তে বলা হয় a.ID
- যদিও একই উফর উভয় প্রশ্নের ক্ষেত্রে ব্যবহৃত হয়েছে।
- আমাদের কেবল একটি
order by
বিবৃতি থাকতে পারে এবং এটি অবশ্যই শেষ বিবৃতি হিসাবে হওয়া উচিত।
পরবর্তী উদাহরণগুলির জন্য, আমি আমাদের টেবিলগুলিতে কয়েকটি অতিরিক্ত সারি যুক্ত করছি।
আমি Holden
ব্র্যান্ডের টেবিলে যুক্ত করেছি। আমিও যোগ করেছেন মধ্যে একটি সারি cars
যে হয়েছে color
এর মান 12
- যা রং টেবিলের কোন সংশয়ের অবকাশ নেই।
ঠিক আছে, বস আবার অনুরোধ করে বার বার অনুরোধ করে বললেন - * আমরা যে ব্র্যান্ডটি বহন করি তার একটি গণনা এবং এতে থাকা গাড়িগুলির সংখ্যা আমি চাই! `- সাধারণভাবে, আমরা কেবল আমাদের আলোচনার একটি আকর্ষণীয় অংশে পৌঁছে যাই এবং বস আরও কাজ চায় ।
রাইটিও, সুতরাং প্রথম জিনিসটি আমাদের করা দরকার সম্ভাব্য ব্র্যান্ডগুলির একটি সম্পূর্ণ তালিকা পাওয়া।
select
a.brand
from
brands a
+--------+
| brand |
+--------+
| Ford |
| Toyota |
| Nissan |
| Smart |
| BMW |
| Holden |
+--------+
6 rows in set (0.00 sec)
এখন, আমরা যখন এটি আমাদের গাড়ী টেবিলের সাথে যোগ দেই আমরা নিম্নলিখিত ফলাফলটি পাই:
select
a.brand
from
brands a
join cars b
on a.ID=b.brand
group by
a.brand
+--------+
| brand |
+--------+
| BMW |
| Ford |
| Nissan |
| Smart |
| Toyota |
+--------+
5 rows in set (0.00 sec)
যা অবশ্যই একটি সমস্যা - আমরা Holden
যুক্ত করা সুন্দর ব্র্যান্ডের কোনও উল্লেখ দেখছি না ।
এটি কারণ উভয় টেবিলের সাথে সন্নিবেশ সারি সন্ধানের জন্য একটি যোগদান দেখায় । যে ধরণের গাড়িগুলিতে কোনও ডেটা নেই সেহেতু Holden
এটি ফেরানো হয় না। এখানেই আমরা একটি outer
যোগদান ব্যবহার করতে পারি । এটি অন্য টেবিলের সাথে মেলে কিনা তা এক টেবিল থেকে সমস্ত ফলাফল ফেরত দেবে :
select
a.brand
from
brands a
left outer join cars b
on a.ID=b.brand
group by
a.brand
+--------+
| brand |
+--------+
| BMW |
| Ford |
| Holden |
| Nissan |
| Smart |
| Toyota |
+--------+
6 rows in set (0.00 sec)
এখন আমাদের কাছে এটি রয়েছে, আমরা একটি গণনা পেতে এবং বসকে এক মুহুর্তের জন্য আমাদের পিঠ থেকে সরিয়ে নিতে একটি সুন্দর সামগ্রিক ফাংশন যুক্ত করতে পারি।
select
a.brand,
count(b.id) as countOfBrand
from
brands a
left outer join cars b
on a.ID=b.brand
group by
a.brand
+--------+--------------+
| brand | countOfBrand |
+--------+--------------+
| BMW | 2 |
| Ford | 2 |
| Holden | 0 |
| Nissan | 1 |
| Smart | 1 |
| Toyota | 5 |
+--------+--------------+
6 rows in set (0.00 sec)
এবং এটি সঙ্গে, বস skulks দূরে।
এখন, আরও কিছু বিশদে এটি ব্যাখ্যা করতে, বাহ্যিক যোগদানগুলি left
বা right
প্রকারের হতে পারে । বাম বা ডান নির্ধারণ করে যে কোন টেবিলটি সম্পূর্ণ অন্তর্ভুক্ত রয়েছে is এ left outer join
বামে থাকা টেবিল থেকে সমস্ত সারি অন্তর্ভুক্ত করবে, যখন (আপনি এটি অনুমান করেছিলেন) একটি right outer join
টেবিল থেকে সমস্ত ফলাফলকে ডানে আনবে into
কিছু ডাটাবেস এমন একটিকে অনুমতি দেবে full outer join
যা উভয় সারণী থেকে ফলাফল (মিলছে কি না) ফিরিয়ে আনবে , তবে এটি সমস্ত ডাটাবেসে সমর্থিত নয়।
এখন, আমি সম্ভবত এই মুহুর্তে এই চিত্রটি দেখছি, আপনি ভাবছেন যে আপনি কোনও ক্যোয়ারিতে যোগদানের প্রকারগুলি মার্জ করতে পারবেন কিনা - এবং উত্তর হ্যাঁ, আপনি একেবারে করতে পারেন।
select
b.brand,
c.color,
count(a.id) as countOfBrand
from
cars a
right outer join brands b
on b.ID=a.brand
join colors c
on a.color=c.ID
group by
a.brand,
c.color
+--------+-------+--------------+
| brand | color | countOfBrand |
+--------+-------+--------------+
| Ford | Blue | 1 |
| Ford | White | 1 |
| Toyota | Black | 1 |
| Toyota | Green | 2 |
| Toyota | Red | 1 |
| Nissan | Black | 1 |
| Smart | White | 1 |
| BMW | Blue | 1 |
| BMW | White | 1 |
+--------+-------+--------------+
9 rows in set (0.00 sec)
সুতরাং, কেন যে ফলাফল প্রত্যাশিত ছিল না? কারণ কারণ আমরা গাড়ি থেকে ব্র্যান্ডগুলিতে বাইরের জোড়কে বাছাই করেছি, এটি রঙগুলিতে জোড়ায় নির্দিষ্ট করা হয়নি - সুতরাং সেই বিশেষ যোগদানটি কেবল উভয় টেবিলের সাথে মেলে এমন ফলাফলগুলি ফিরিয়ে আনবে।
এখানে যে ক্যোয়ারীটি প্রত্যাশিত ফলাফলগুলি পেতে কাজ করবে:
select
a.brand,
c.color,
count(b.id) as countOfBrand
from
brands a
left outer join cars b
on a.ID=b.brand
left outer join colors c
on b.color=c.ID
group by
a.brand,
c.color
+--------+-------+--------------+
| brand | color | countOfBrand |
+--------+-------+--------------+
| BMW | Blue | 1 |
| BMW | White | 1 |
| Ford | Blue | 1 |
| Ford | White | 1 |
| Holden | NULL | 0 |
| Nissan | Black | 1 |
| Smart | White | 1 |
| Toyota | NULL | 1 |
| Toyota | Black | 1 |
| Toyota | Green | 2 |
| Toyota | Red | 1 |
+--------+-------+--------------+
11 rows in set (0.00 sec)
যেমনটি আমরা দেখতে পাচ্ছি, ক্যোয়ারিতে আমাদের দুটি বহিরাগত যোগদান রয়েছে এবং প্রত্যাশা অনুযায়ী ফলাফলগুলি আসবে।
এখন, আপনি জিজ্ঞাসা করা অন্যান্য ধরণের সম্পর্কে কীভাবে? মোড় সম্পর্কে কি?
ভাল, সমস্ত ডাটাবেস সমর্থন করে না intersection
তবে বেশিরভাগ সমস্ত ডাটাবেস আপনাকে একটি যোগদানের মাধ্যমে ছেদ তৈরি করতে দেয় (বা একটি সুগঠিত যেখানে কমপক্ষে বিবৃতি দেয়)।
একটি ছেদটি union
উপরের বর্ণিত হিসাবে কিছুটা মিলের এক প্রকারের সংযোগ - তবে পার্থক্যটি হ'ল এটি ইউনিয়নে যোগদানকারী পৃথক পৃথক প্রশ্নের মধ্যে কেবলমাত্র সারি (এবং আমি অর্থ অভিন্ন) বলে সারি করে data প্রতিটি ক্ষেত্রে সাদৃশ্যযুক্ত সারিগুলিই ফিরে আসবে।
একটি সাধারণ উদাহরণ যেমন হবে:
select
*
from
colors
where
ID>2
intersect
select
*
from
colors
where
id<4
যখন কোনও সাধারণ union
ক্যোয়ারী সারণীর সমস্ত সারি ফিরে আসে (প্রথম কোয়েরিতে কোনও কিছু ফেরত দেওয়া ID>2
এবং দ্বিতীয়টি যে কোনও কিছু রয়েছে ID<4
) এর ফলে পুরো সেট আসবে, তবে একটি ছেদকৃত ক্যোয়ারী কেবল id=3
উভয় মানদণ্ডের সাথে মিল রেখেই সারি মিলবে ।
এখন, যদি আপনার ডাটাবেসটি কোনও intersect
ক্যোয়ারিকে সমর্থন করে না , তবে উপরেরটি নীচের কোয়েরির সাথে খুব সহজেই সমন্বিত হতে পারে:
select
a.ID,
a.color,
a.paint
from
colors a
join colors b
on a.ID=b.ID
where
a.ID>2
and b.ID<4
+----+-------+----------+
| ID | color | paint |
+----+-------+----------+
| 3 | Blue | Metallic |
+----+-------+----------+
1 row in set (0.00 sec)
যদি আপনি এমন একটি ডাটাবেস ব্যবহার করে দুটি পৃথক টেবিল জুড়ে ছেদটি সম্পাদন করতে চান যা অন্তর্নিহিতভাবে কোনও ছেদ কোয়েরিকে সমর্থন করে না, আপনাকে টেবিলগুলির প্রতিটি কলামে একটি জোড় তৈরি করতে হবে ।