LEFT (OUTER) JOIN:
Chap jadvaldagi barcha ma‘lumotlarni va
oʻng jadvaldagi mos keladigan ma‘lumotlarni qaytaradi.
RIGHT (OUTER) JOIN:
Oʻng jadvaldagi barcha ma‘lumotlarni va
chap jadvaldagi mos keladigan ma‘lumotlarni qaytaradi.
FULL (OUTER) JOIN:
Agar chap yoki oʻng jadvalda mos keladigan
boʻlsa, barcha ma‘lumotlarni qaytaradi.
Soʻrovni yozishda bir nechta jadvallarni oʻzaro boʻladigan indeks
maydonlar ishlatiladi.
Koʻpincha bir nechta jadvallardan ma‘lumotlarni olishimiz kerak
boʻladi. Turli jadvallardagi ma‘lumotlarni birlashtirish uchun SELECT
buyrugʻidan foydalanishingiz mumkin. Misol uchun, sizda munosabatlar
bilan bogʻlangan quyidagi jadvallar mavjud deylik:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE
TABLE
Products
(
Id SERIAL PRIMARY
KEY,
ProductName VARCHAR(30) NOT
NULL,
Company VARCHAR(20) NOT
NULL,
ProductCount INTEGER
DEFAULT
0,
Price NUMERIC
NOT
NULL
);
CREATE
TABLE
Customers
(
Id SERIAL PRIMARY
KEY,
FirstName VARCHAR(30) NOT
NULL
);
CREATE
TABLE
Orders
(
Id SERIAL PRIMARY
KEY,
72
16.
17.
18.
19.
20.
21.
22.
23.
ProductId
INTEGER
NOT
NULL
REFERENCES
Products(Id) ON
DELETE
CASCADE,
CustomerId
INTEGER
NOT
NULL
REFERENCES
Customers(Id) ON
DELETE
CASCADE,
CreatedAt DATE
NOT
NULL,
ProductCount INTEGER
DEFAULT
1,
Price NUMERIC
NOT
NULL
);
Bunday holda, Mijozlar va Mahsulotlar jadvallari Buyurtmalar
jadvaliga birdan koʻpga bogʻlangan. ProductId va CustomerId xorijiy
kalitlari koʻrinishidagi Buyurtmalar jadvali mos ravishda Mahsulotlar va
mijozlar jadvallaridagi Id ustunlariga havolalarni oʻz ichiga oladi.
Shuningdek, u sotib olingan mahsulot miqdorini (ProductCount) va
qanday narxda sotib olinganini (Narx) saqlaydi. Bundan tashqari, jadval
xarid sanasini CreatedAt ustunida ham saqlaydi.
Ushbu jadvallar quyidagi ma‘lumotlarni oʻz ichiga oladi:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
INSERT
INTO
Products(ProductName,
Company,
ProductCount, Price)
VALUES
('iPhone X', 'Apple', 2, 66000),
('iPhone 8', 'Apple', 2, 51000),
('iPhone 7', 'Apple', 5, 42000),
('Galaxy S9', 'Samsungʻ, 2, 56000),
('Galaxy S8 Plus', 'Samsungʻ, 1, 46000),
('Nokia 9', 'HDM Global', 2, 26000),
('Desire 12', 'HTC', 6, 38000);
INSERT
INTO
Customers(FirstName)
VALUES
('Tom'), ('Bob'),('Sam');
INSERT
INTO
Orders(ProductId, CustomerId, CreatedAt,
ProductCount, Price)
VALUES
(
(SELECT
Id
FROM
Products
WHERE
ProductName='Galaxy S9'),
(SELECT
Id FROM
Customers WHERE
FirstName='Tom'),
'2017-07-11',
2,
(SELECT
Price
FROM
Products
WHERE
ProductName='Galaxy S9')
),
73
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
(
(SELECT
Id
FROM
Products
WHERE
ProductName='iPhone 8'),
(SELECT
Id FROM
Customers WHERE
FirstName='Tom'),
'2017-07-13',
1,
(SELECT
Price
FROM
Products
WHERE
ProductName='iPhone 8')
),
(
(SELECT
Id
FROM
Products
WHERE
ProductName='iPhone 8'),
(SELECT
Id FROM
Customers WHERE
FirstName='Bob'),
'2017-07-11',
1,
(SELECT
Price
FROM
Products
WHERE
ProductName='iPhone 8')
);
Keling, ikkita jadvalni qoʻshamiz Buyurtmalar va mijozlar:
1.
SELECT
* FROM
Orders, Customers;
Ushbu tanlov yordamida Buyurtmalar jadvalidagi har bir satr Mijozlar
jadvalidagi har bir qatorga moslashtiriladi. Ya'ni, siz oʻzaro bogʻlanishni
olasiz. Masalan, Buyurtmalarda uchta qator, Mijozlarda esa uchta qator
mavjud, shuning uchun biz 3 · 3 = 9 qatorni olamiz:
7.1-rasm. Jadvallarni qoʻshish
74
Ya'ni, bu holda biz ikki guruhning toʻgʻridan-toʻgʻri (kartezian)
mahsulotini olamiz. Biroq, bunday natijani istalgan deb atash qiyin.
Bundan tashqari, Buyurtmalarning har bir buyurtmasi barcha mumkin
boʻlgan mijozlar bilan emas, balki Mijozlarning ma‘lum bir mijozi bilan
bogʻliq.
Ushbu muammoni hal qilish uchun siz WHERE bandidan
foydalanishingiz va Buyurtmalardagi CustomerId maydoni Mijozlarning
Id maydoniga mos kelishi sharti bilan qatorlarni filtrlashingiz kerak:
1.
2.
SELECT
* FROM
Orders, Customers
WHERE
Orders.CustomerId = Customers.Id;
7.2-rasm. Jadvallarni qoʻshish
Keling, uchta jadvaldagi Buyurtmalar, Mijozlar va Mahsulotlar uchun
ma‘lumotlarni birlashtiramiz. Ya'ni, biz barcha buyurtmalarni qabul
qilamiz hamda mijoz va tegishli mahsulot haqida ma‘lumot qoʻshamiz:
1
2
3
SELECT
Customers.FirstName, Products.ProductName,
Orders.CreatedAt
FROM
Orders, Customers, Products
WHERE
Orders.CustomerId = Customers.Id AND
Orders.ProductId=Products.Id;
Bu yerda uchta jadval birlashtirilganligi sababli, kamida ikkita shart
qoʻllanilishi kerak. Buyurtmalar asosiy jadval boʻlib qoladi, undan barcha
buyurtmalar olinadi va keyin mijoz haqidagi ma‘lumotlar unga Orders.
75
CustomerId = Customers. Id sharti boʻyicha va mahsulot haqidagi
ma‘lumotlar Orders. ProductId = Products. Id sharti boʻyicha ulanadi.
7.3-rasm. Jadvallarni qoʻshish
Bu holda jadval nomlari kodni sezilarli darajada oshirganligi sababli,
jadval taxalluslari yordamida uni qisqartirishimiz mumkin:
1.
2.
3.
SELECT
C.FirstName, P.ProductName, O.CreatedAt
FROM
Orders AS
O, Customers AS
C, Products AS
P
WHERE
O.CustomerId = C.Id AND
O.ProductId=P.Id;
Agar taxallusdan foydalanganda ma‘lum bir jadvaldagi barcha
ustunlarni tanlashingiz kerak boʻlsa, yulduzchadan foydalanishingiz
mumkin:
1.
2.
3.
SELECT
C.FirstName, P.ProductName, O.*
FROM
Orders AS
O, Customers AS
C, Products AS
P
WHERE
O.CustomerId = C.Id AND
O.ProductId=P.Id;
INNER JOIN
Jadvallarni birlashtirishning yana bir usuli JOIN yoki INNER JOIN
operatorlaridan foydalanishdir. U ichki bogʻlanish deb ataladigan narsani
ifodalaydi. Uning rasmiy sintaksisi:
1.
2.
3.
4.
SELECT
столбцы
FROM
таблица1
[INNER] JOIN
таблица2
ON
условие1
76
5.
6.
[[INNER] JOIN
таблица3
ON
условие2]
JOIN operatoridan keyin ikkinchi jadval nomi keladi, uning
ma‘lumotlari tanlovga qoʻshilishi kerak. JOIN oldidan ixtiyoriy INNER
bayonoti boʻlishi mumkin. Uning mavjudligi yoki yoʻqligi hech narsaga
ta'sir qilmaydi. Bundan tashqari, ON kalit soʻzidan keyin qoʻshilish sharti
koʻrsatiladi. Bu shart ikki jadval qanday solishtirilishini belgilaydi.
Odatda, birlashma asosiy jadvalning asosiy kalitidan va bogʻliq jadvalning
tashqi kalitidan foydalanadi.
Oldingi yuqoridagi ma‘lumotlar jadvallarini olaylik.
JOIN-dan foydalanib, keling, barcha buyurtmalarni tanlaymiz va ularga
mahsulot ma‘lumotlarini qoʻshamiz:
1.
2.
3.
SELECT
Orders.CreatedAt,
Orders.ProductCount,
Products.ProductName
FROM
Orders
JOIN
Products ON
Products.Id = Orders.ProductId;
Xuddi shunday, biz boshqa jadvallarni qoʻshishimiz mumkin. Misol
uchun, mijozlar jadvalidagi mijoz ma‘lumotlarini buyurtmaga qoʻshamiz:
1.
2.
3.
4.
SELECT
Orders.CreatedAt,
Customers.FirstName,
Products.ProductName
FROM
Orders
JOIN
Products ON
Products.Id = Orders.ProductId
JOIN
Customers ON
Customers.Id=Orders.CustomerId;
7.4-rasm. JOIN operatoridan foydalanish
77
Jadvallarni birlashtirish tufayli biz tanlovni filtrlash yoki saralash
uchun ularning ustunlaridan foydalanishimiz mumkin:
1.
2.
3.
4.
5.
6.
SELECT
Orders.CreatedAt,
Customers.FirstName,
Products.ProductName
FROM
Orders
JOIN
Products ON
Products.Id = Orders.ProductId
JOIN
Customers ON
Customers.Id=Orders.CustomerId
WHERE
Products.Price > 45000
ORDER
BY
Customers.FirstName;
ON kalit soʻzidan keyingi shartlar murakkabroq boʻlishi mumkin.
Misol uchun, Apple tomonidan ishlab chiqarilgan mahsulotlar uchun
barcha buyurtmalarni tanlaymiz.
1.
2.
3.
4.
5.
SELECT
Orders.CreatedAt,
Customers.FirstName,
Products.ProductName
FROM
Orders
JOIN
Products ON
Products.Id = Orders.ProductId AND
Products.Company='Apple'
JOIN
Customers ON
Customers.Id=Orders.CustomerId
ORDER
BY
Customers.FirstName;
OUTER JOIN yoki tashqi birlashmada qatnashgan bir yoki ikkita
jadvalning barcha qatorlarini qaytarish imkonini beradi.
Outer Join quyidagi sintaksisga ega:
1.
2.
3.
4.
SELECT
столбцы
FROM
jadval1
{LEFT|RIGHT|FULL} [OUTER] JOIN
jadval2 ON
shart1
[{LEFT|RIGHT|FULL} [OUTER] JOIN
jadval3 ON
shart2]...
JOIN iborasi oldidan LEFT, RIGHT yoki FULL kalit soʻzlardan biri
boʻlib, ular qoʻshilish turini aniqlaydi:
LEFT: tanlov birinchi yoki chap jadvaldagi barcha qatorlarni oʻz ichiga
oladi
RIGHT: tanlov ikkinchi yoki oʻng jadvaldagi barcha qatorlarni oʻz
ichiga oladi
FULL: tanlov ikkala jadvaldagi barcha qatorlarni oʻz ichiga oladi
78
JOIN operatoridan oldin OUTER kalit soʻzi boʻlishi mumkin, lekin u
ixtiyoriy. JOIN dan keyin qoʻshiladigan jadval, soʻngra qoʻshilish sharti
ON operatoridan keyin keladi.
Buyurtmalar va mijozlar jadvallarini qoʻshish:
1.
2.
3.
SELECT
FirstName,
CreatedAt,
ProductCount,
Price, ProductId
FROM
Orders LEFT
JOIN
Customers
ON
Orders.CustomerId = Customers.Id;
Yuqoridagi natijadan koʻrinib turibdiki, chap tomondagi birlashma
INNER qoʻshilish bilan bir xil, ammo unday emas. Shart bajarilganda
Inner Join jadvallari qatorlarini birlashtiradi. Agar jadvallardan birida
ushbu shartga mos kelmaydigan qatorlar mavjud boʻlsa, u holda bu
qatorlar chiqish tanloviga kiritilmaydi. Left Join birinchi jadvaldagi barcha
satrlarni tanlaydi va keyin oʻng jadvaldagi qatorlarni ularga birlashtiradi.
Masalan, mijozlar jadvalini olaylik va mijozlarga ularning buyurtmalari
haqida ma‘lumot qoʻshamiz:
7.5-rasm. INNER JOIN va LEFT JOIN.
Yuqoridagi misolda ulanish turini oʻng tomonga oʻzgartiramiz:
1.
2.
3.
SELECT
FirstName, CreatedAt, ProductCount, Price,
ProductId
FROM
Orders RIGHT
JOIN
Customers
ON
Orders.CustomerId = Customers.Id;
Endi Mijozlarning barcha qatorlari tanlanadi va shartlar boʻyicha
Buyurtmalar jadvalidagi qatorlar allaqachon ularga biriktiriladi:
79
7.6-rasm. RIGHT JOIN
Mijozlar jadvalidagi mijozlardan birining Buyurtmalardan bogʻlangan
buyurtmalari yoʻqligi sababli, Buyurtmalardagi mos ustunlar NULL
boʻladi.
FULL JOIN ikkala jadvalni birlashtiradi:
1.
2.
3.
SELECT
FirstName, CreatedAt, ProductCount, Price,
ProductId
FROM
Orders FULL
JOIN
Customers
ON
Orders.CustomerId = Customers.Id;
|