Мазмунга өтүү

Көп таблицаны бириктирүү жана өз-өзүнө бириктирүү

Сабактын башталышы

Көп таблицаны бириктирүү жана өз-өзүнө бириктирүү

Көп таблицадан бүтүн сүрөт чогултуу -- таблицаны өзү менен бириктирүүнү кошо алганда.

Негизги идея: Нормалдаштырылган маалымат базасы фактыларды көп кичине таблицага бөлүштүрөт. Чыныгы суроо -- «кайсы сатуучу кайсы товарды кайсы кардарга сатты?» -- бир учурда алардын үч-төртөөнө тиешелүү болот. Ага сиз бириктирүүлөрдү тизмектеп жооп бересиз: ар бир 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);
customers customer_id (PK) orders customer_id, emp_id employees emp_id (PK), manager_id products product_id (PK) order_items order_id, product_id departments dept_id (PK) self-join: manager_id -> emp_id FK FK
The shop schema. Each arrow is a foreign key; the orange loop is the self-reference used for self-joins.

Бул диаграмманы эсте туткула: бириктирүү дайыма ушул жебелердин бирин ээрчийт, бир таблицанын сырткы ачкыч тилкесин башка таблицадагы ал шилтеген негизги ачкыч менен дал келтирет.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө