Көп таблицаны бириктирүү жана өз-өзүнө бириктирүү
Көп таблицадан бүтүн сүрөт чогултуу -- таблицаны өзү менен бириктирүүнү кошо алганда.
JOIN ... ON жыйынтыкка дагы бир таблицаны кошот. Өз-өзүнө бириктирүү -- ошол эле ыкма бир таблицага эки жолу колдонулганы: ушул менен сиз саптын өзүн ошол таблицадагы башка сапка байлайсыз (кызматкерди анын жетекчисине).
- таблица псевдонимдери менен үч же андан көп бириктирүүнү таза тизмектөө,
- бириктирүүлөрдүн тартиби тууралуу ой жүгүртүү -- качан маанилүү, качан жок,
- сапты ошол эле таблицадагы башка сапка байлаган өз-өзүнө бириктирүү жазуу,
- жуп суроо-талаптарды куруу жана кайталанган/күзгү жуптардан качуу,
CROSS JOINдегенди таануу -- атайын жасалганын да, кокустан болгон «декарттык жарылууну» да.
Бул баштапкы курстун улантуусу: сиз SELECT, WHERE, GROUP BY, ачкычтарды жана NULL менен жалгыз INNER JOIN / LEFT JOIN ди билесиз.
1. Биз колдоно турган мисал схема
Төмөнкү ар бир суроо-талап бир кичине дүкөн базасына каршы иштейт. Дүкөндө табигый түрдө кардарлар, алар берген заказдар, ар бир заказдагы товарлар, аларга кызмат кылган кызматкерлер жана ошол кызматкерлер таандык бөлүмдөр болот. Эки байланышты дароо белгилеп коюу керек: orders.emp_id заказды аны кабыл алган сатуучуга байлайт, ал эми employees.manager_id ошол эле таблицага кайра көрсөтөт -- дал ушул тилке өз-өзүнө бириктирүүнү мүмкүн кылат.
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(40)
);
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(40),
manager_id INT, -- points at another employees.emp_id
dept_id INT,
FOREIGN KEY (manager_id) REFERENCES employees(emp_id),
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(40),
city VARCHAR(40)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
emp_id INT, -- the sales rep who took the order
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id),
FOREIGN KEY (emp_id) REFERENCES employees(emp_id)
);
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(40),
price DECIMAL(8,2)
);
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id),
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
Суроо-талап кыла турган бир нече сап:
INSERT INTO departments VALUES
(1,'Sales'), (2,'Support'), (3,'Warehouse');
INSERT INTO employees VALUES -- (emp_id, name, manager_id, dept_id)
(1,'Alice', NULL, 1), -- top manager, no boss
(2,'Bob', 1, 1),
(3,'Carol', 1, 2),
(4,'Dan', 2, 1),
(5,'Eve', 3, 2);
INSERT INTO customers VALUES
(1,'Maria','Bishkek'), (2,'John','Almaty'), (3,'Sara','Osh');
INSERT INTO orders VALUES -- (order_id, customer_id, emp_id, order_date)
(101,1,2,'2026-03-01'),
(102,2,2,'2026-03-02'),
(103,1,4,'2026-03-05'),
(104,3,3,'2026-03-06');
INSERT INTO products VALUES
(1,'Keyboard',25.00), (2,'Mouse',15.00), (3,'Monitor',120.00);
INSERT INTO order_items VALUES -- (order_id, product_id, quantity)
(101,1,2), (101,2,1),
(102,3,1),
(103,2,3),
(104,1,1);
Бул диаграмманы эсте туткула: бириктирүү дайыма ушул жебелердин бирин ээрчийт, бир таблицанын сырткы ачкыч тилкесин башка таблицадагы ал шилтеген негизги ачкыч менен дал келтирет.