Jadvallarni ichki birlashtirish
Kirish: ushbu darsda siz ikkita jadvaldagi qatorlarni birlashtirish va faqat mos keluvchi qatorlarni tanlab olish uchun PostgreSQL INNER JOIN bandidan qanday foydalanishni o'rganasiz.
PostgreSQLda ma'lumotlar bazasi bir-biri bilan bog'langan bir nechta jadvallardan tashkil topadi. Ular o'zaro tashqi kalitlar (foreign keys) orqali bog'lanadi. Ikki yoki undan ortiq jadvallardan ma'lumotlarni tanlab olish uchun SELECT so'rovining INNER JOIN bandidan foydalanasiz.
Mana INNER JOIN bandining sintaksisi:
SELECT
table1.column1,
table2.column2,
...
FROM
table1
INNER JOIN table2 ON table1.column1 = table2.column1;
Ushbu sintaksisda:
FROM bandida birinchi jadval nomini (table1) ko'rsating.INNER JOIN bandida birinchi jadval qatorlari bilan birlashtirmoqchi bo'lgan ikkinchi jadval nomini (table2) bering.ON bandida birinchi jadval (table1) qatorlarini ikkinchi jadval (table2) qatorlari bilan moslashtirish shartini ko'rsating. Bu shart table1 dagi column1 qiymatlarini table2 dagi column1 qiymatlari bilan solishtirish orqali ikkala jadvaldagi qatorlarni moslashtiradi. E'tibor bering, shartda boshqa taqqoslash operatorlaridan ham foydalanish mumkin. Agar bir nechta shartdan foydalanmoqchi bo'lsangiz, ON bandida ularni birlashtirish uchun AND mantiqiy operatoridan foydalanishingiz mumkin.SELECT bandida yakuniy natija to'plamiga kiritilishi kerak bo'lgan ikkala jadval ustunlarini sanab o'ting.PostgreSQL avval FROM bandini, keyin INNER JOIN bandini va nihoyat SELECT bandini baholaydi.
PostgreSQLda inner join quyidagicha ishlaydi:
INNER JOIN ikkala jadvaldagi column1 qiymatlarini solishtiradi.SELECT bandida ko'rsatilgan ustunlarni yakuniy natija to'plamiga tanlab oladi.Aytaylik, siz X va Y jadvallaridagi qatorlarni ichki birlashtirish (inner join) yordamida birlashtirmoqchisiz:
X jadvalida ikkita ustun mavjud: id (kalit) va x.Y jadvalida ham ikkita ustun mavjud: id (kalit) va y.| X jadvali | Y jadvali |
|---|---|
Inner join faqat id ustunlaridagi qiymatlari mos keladigan qatorlarni o'z ichiga oladi. U natijalar to'plamiga mos kelmaydigan qatorlarni kiritmaydi:
Quyidagi Venn diagrammasi inner join qanday ishlashini tasvirlashning yana bir usulidir:
Aytaylik, sizda ikkita jadval mavjud: products va brands.
CREATE TABLE brands (
brand_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
CREATE TABLE products (
product_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
brand_id INT,
FOREIGN KEY (brand_id) REFERENCES brands (brand_id)
);
INSERT INTO
brands (name)
VALUES
('Apple'),
('Samsung'),
('Google')
RETURNING *;
INSERT INTO
products (name, price, brand_id)
VALUES
('iPhone 14 Pro', 999.99, 1),
('iPhone 15 Pro', 1199.99, 1),
('Galaxy S23 Ultra', 1149.47, 2),
('Oppo Find Flip', 499.99, NULL)
RETURNING *;
products jadvalida brands jadvalining brand_id asosiy kalit ustuniga havola qiluvchi brand_id tashqi kalit ustuni mavjud:
brands jadvali:
brand_id | name
----------+---------
1 | Apple
2 | Samsung
3 | Google
products jadvali:
product_id | name | price | brand_id
------------+------------------+---------+----------
1 | iPhone 14 Pro | 999.99 | 1
2 | iPhone 15 Pro | 1199.99 | 1
3 | Galaxy S23 Ultra | 1149.47 | 2
4 | Oppo Find Flip | 499.99 | NULL
Quyidagi so'rov products jadvalidan mahsulot nomi va narxini hamda brands jadvalidan brend nomini tanlab olish uchun INNER JOIN dan foydalanadi:
SELECT
products.name,
products.price,
brands.name
FROM
products
INNER JOIN brands ON brands.brand_id = products.brand_id;
Natija:
name | price | name
------------------+---------+---------
iPhone 14 Pro | 999.99 | Apple
iPhone 15 Pro | 1199.99 | Apple
Galaxy S23 Ultra | 1149.47 | Samsung
FROM bandi products jadvalidagi har bir qatorni ko'rib chiqadi.INNER JOIN bandi products jadvalidagi har bir qatorning brand_id sini brands jadvalidagi har bir qatorning brand_id si bilan solishtiradi. Ular bir xil brand_id ga ega bo'lgani sababli, so'rov ikkala qatorni birlashtiradi: product_id | name | price | brand_id | brand_id | name
------------+---------------+---------+----------+----------+---------
1 | iPhone 14 Pro | 999.99 | 1 | 1 | Apple
2 | iPhone 15 Pro | 1199.99 | 1 | 1 | Apple
3 | Galaxy S23... | 1149.47 | 2 | 2 | Samsung
Batafsilroq:
products jadvalidagi 1 va 2 identifikatorli qatorlar brands jadvalidagi 1 identifikatorli qatorga mos keladi.products jadvalidagi 3 identifikatorli qator brands jadvalidagi 2 identifikatorli qatorga mos keladi.products jadvalidagi 4 identifikatorli qator (brand_id si NULL) brands jadvalidagi hech qaysi qatorga mos kelmaydi.SELECT bandi products jadvalidan name va price ustunlarini hamda brands jadvalidan name ustunini tanlab oladi.products va brands jadvallarining ikkalasida ham bir xil nomli name ustuni bo'lgani sababli, ularga murojaat qilishda quyidagi sintaksisdan foydalanishimiz shart:
table_name.column_name
Agar shunday qilmasak, PostgreSQL noaniqlik xatoligini (ambiguous error) chiqaradi. Masalan:
SELECT
name,
price,
name
FROM
products
INNER JOIN brands ON brands.brand_id = products.brand_id;
Xatolik:
ERROR: column reference "name" is ambiguous
Natijada ikkita bir xil nomli (name) ustun hosil bo'ladi; ularni tushunarliroq qilish uchun ustun taxalluslaridan (column aliases) foydalanishimiz mumkin:
SELECT
products.name AS product_name,
products.price,
brands.name AS brand_name
FROM
products
INNER JOIN brands ON brands.brand_id = products.brand_id;
Natija:
product_name | price | brand_name
------------------+---------+------------
iPhone 14 Pro | 999.99 | Apple
iPhone 15 Pro | 1199.99 | Apple
Galaxy S23 Ultra | 1149.47 | Samsung
Har bir ustun oldidan jadval nomini to'liq yozib chiqish noqulaylik tug'dirishi mumkin. PostgreSQL so'rovda vaqtinchalik jadval nomlaridan — jadval taxalluslari (table aliases) dan foydalanishni qo'llab-quvvatlaydi.
Ustun taxallusi kabi, so'rov bajarilish vaqtida jadvalga quyidagi sintaksis yordamida vaqtinchalik taxallus berishingiz mumkin:
table_name AS table_alias
AS kalit so'zi ixtiyoriy bo'lgani uchun uni quyidagicha tushirib qoldirishingiz ham mumkin:
table_name table_alias
Quyidagi so'rov jadval taxalluslaridan foydalanib products jadvalini brands jadvali bilan birlashtiradi:
SELECT
p.name AS product_name,
p.price,
b.name AS brand_name
FROM
products AS p
INNER JOIN brands AS b ON b.brand_id = p.brand_id;
Ushbu misolda biz products jadvali uchun p va brands jadvali uchun b taxalluslarini belgiladik. So'ngra ikkala jadval ustunlariga murojaat qilish uchun ushbu jadval taxallaridan foydalandik.
Agar siz ikkita jadvalni bir xil nomli ustunlar qiymatlarini tenglik (=) operatori orqali solishtirib birlashtirayotgan bo'lsangiz, USING bandi sintaksisidan foydalanishingiz mumkin:
SELECT table1.column1, table2.column2, ...
FROM table1
INNER JOIN table2 USING (column1);
Ushbu sintaksisda biz quyidagi ON bandini:
ON table1.column1 = table2.column1
USING bandiga almashtiramiz:
USING (column1)
Masalan, quyidagi so'rov USING bandidan foydalanib products jadvalini brands jadvali bilan birlashtiradi:
SELECT
p.name AS product_name,
p.price,
b.name AS brand_name
FROM
products p
INNER JOIN brands b USING (brand_id);
Ushbu so'rovda biz jadval taxalluslari uchun AS kalit so'zini ishlatmadik va ON bandi o'rniga USING (brand_id) bandidan foydalandik.
INNER JOIN bandidan foydalaning.USING sintaksisidan foydalaning.