Көбүнчө бир суроодо бир эле учурда бир нече таблицадан маалыматтарды алуу зарылчылыгы бар. Биз ар кандай таблицалардагы маалыматтарды консолидациялоо үчүн ар кандай ыкмаларды колдоно алабыз. Бул макалада биз эң кеңири тараган эмес, бирок абдан жөнөкөй ыкманы карап чыгабыз, бул таблицалардын жашыруун кошулуусу.
Келгиле, бизде шилтемелер менен байланышкан төмөнкү таблицалар бар дейли:
@A@
CREATE
TABLE
Products
(
Id
INT
AUTO_INCREMENT
PRIMARY
KEY
,
ProductName
VARCHAR
(30)
NOT
NULL
,
Manufacturer
VARCHAR
(20)
NOT
NULL
,
ProductCount
INT
DEFAULT
0,
Price
DECIMAL
NOT
NULL
);
CREATE
TABLE
Customers
(
Id
INT
AUTO_INCREMENT
PRIMARY
KEY
,
FirstName
VARCHAR
(30)
NOT
NULL
);
CREATE
TABLE
Orders
(
Id
INT
AUTO_INCREMENT
PRIMARY
KEY
,
ProductId
INT
NOT
NULL
,
CustomerId
INT
NOT
NULL
,
CreatedAt
DATE
NOT
NULL
,
ProductCount
INT
DEFAULT
1,
Price
DECIMAL
NOT
NULL
,
FOREIGN
KEY
(ProductId)
REFERENCES
Products(Id)
ON
DELETE
CASCADE
,
FOREIGN
KEY
(CustomerId)
REFERENCES
Customers(Id)
ON
DELETE
CASCADE
);
@A@
Бул жерде Өнүмдөр жана Кардарлар таблицалары Заказдар таблицасына бирден көпкө байланышы аркылуу туташтырылган. ProductId жана CustomerId тышкы ачкычтары түрүндөгү Буйрутмалар жадыбалында тиешелүүлүгүнө жараша Өнүмдөр жана Кардарлар таблицаларындагы Id тилкелерине шилтемелер бар. Ал ошондой эле сатылып алынган продуктунун санын (ProductCount) жана кандай баада сатылып алынганын (Баасы) сактайт. Мындан тышкары, таблицада сатып алуу датасы CreatedAt тилкеси катары сакталат.
Бул таблицалар төмөнкү маалыматтарды камтысын:
@A@
INSERT
INTO
Products (ProductName, Manufacturer, ProductCount, Price)
VALUES
(
'iPhone X'
,
'Apple'
, 2, 76000),
(
'iPhone 8'
,
'Apple'
, 2, 51000),
(
'iPhone 7'
,
'Apple'
, 5, 42000),
(
'Galaxy S9'
,
'Samsung'
, 2, 56000),
(
'Galaxy S8'
,
'Samsung'
, 1, 46000),
(
'Honor 10'
,
'Huawei'
, 2, 26000),
(
'Nokia 8'
,
'HMD Global'
, 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 S8'
),
(
SELECT
Id
FROM
Customers
WHERE
FirstName=
'Tom'
),
'2018-05-21'
,
2,
(
SELECT
Price
FROM
Products
WHERE
ProductName=
'Galaxy S8'
)
),
(
(
SELECT
Id
FROM
Products
WHERE
ProductName=
'iPhone X'
),
(
SELECT
Id
FROM
Customers
WHERE
FirstName=
'Tom'
),
'2018-05-23'
,
1,
(
SELECT
Price
FROM
Products
WHERE
ProductName=
'iPhone X'
)
),
(
(
SELECT
Id
FROM
Products
WHERE
ProductName=
'iPhone X'
),
(
SELECT
Id
FROM
Customers
WHERE
FirstName=
'Bob'
),
'2018-05-21'
,
1,
(
SELECT
Price
FROM
Products
WHERE
ProductName=
'iPhone X'
)
);
@A@
Эми эки таблицаны Заказдарды жана Кардарларды бириктирели:
@A@
SELECT
*
FROM
Orders, Customers;
@A@
Бул тандоо менен Буйрутмалар таблицасындагы ар бир сап Кардарлар таблицасындагы ар бир сапка кошулат. Башкача айтканда, сиз кайчылаш байланыш аласыз. Мисалы, Заказдарда үч сызык бар, ал эми Кардарларда үч сызык бар, демек, биз 3 * 3 = 9 сапты алабыз:
Бирок бул мен көргүм келген жыйынтык эмес. Мындан тышкары, Заказдардын ар бир буйрутмасы бардык мүмкүн болгон сатып алуучулар менен эмес, Кардарлардан белгилүү бир сатып алуучу менен байланышкан.
Көйгөйдү чечүү үчүн, сиз WHERE пунктун колдонуп , Буйрутмалардагы CustomerId талаасы Кардарлардын Id талаасына дал келген шартта саптарды чыпкалашыңыз керек:
SELECT
*
FROM
Orders, Customers
WHERE
Orders.CustomerId = Customers.Id;
@A@
Эми үч таблицадагы маалыматтарды бириктирели Заказдар, Кардарлар жана Продукттар. Башкача айтканда, биз бардык буйрутмаларды кабыл алабыз жана кардар жана тиешелүү продукт боюнча маалымат кошобуз:
@A@
SELECT
Customers.FirstName, Products.ProductName, Orders.CreatedAt
FROM
Orders, Customers, Products
WHERE
Orders.CustomerId = Customers.Id
AND
Orders.ProductId=Products.Id;
@A@
Бул жерде кошула турган үч таблица болгондуктан, жок дегенде эки шарт колдонулат. Негизги таблица Заказдар бойдон калууда, алардан бардык буйрутмалар чыгарылат, андан кийин шарт боюнча кардар маалыматтары Orders.CustomerId = Customers.Id
жана шарт боюнча продукт маалыматтары ага туташтырылат.Orders.ProductId=Products.Id
Бул учурда, таблицанын аттары кодду абдан көбөйтөт, бирок биз аны таблица лакап атын колдонуу менен кыскарта алабыз:
@A@
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;
@A@
Эгер лакап ат колдонууда белгилүү бир таблицадан бардык мамычаларды тандоо керек болсо, жылдызчаны колдонсоңуз болот:
@A@
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;
@A@