Loading...

Толук эмес таблица кошулуу

Көбүнчө бир суроодо бир эле учурда бир нече таблицадан маалыматтарды алуу зарылчылыгы бар. Биз ар кандай таблицалардагы маалыматтарды консолидациялоо үчүн ар кандай ыкмаларды колдоно алабыз. Бул макалада биз эң кеңири тараган эмес, бирок абдан жөнөкөй ыкманы карап чыгабыз, бул таблицалардын жашыруун кошулуусу.

Келгиле, бизде шилтемелер менен байланышкан төмөнкү таблицалар бар дейли:

@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 сапты алабыз:

MySQLде JOIN жок ачык-айкын таблицаны бириктирүү

Бирок бул мен көргүм келген жыйынтык эмес. Мындан тышкары, Заказдардын ар бир буйрутмасы бардык мүмкүн болгон сатып алуучулар менен эмес, Кардарлардан белгилүү бир сатып алуучу менен байланышкан.

Көйгөйдү чечүү үчүн, сиз WHERE пунктун колдонуп , Буйрутмалардагы CustomerId талаасы Кардарлардын Id талаасына дал келген шартта саптарды чыпкалашыңыз керек:

@A@
SELECT * FROM Orders, Customers
WHERE Orders.CustomerId = Customers.Id;
@A@

MySQLде JOIN жок таблицаларга кошулуу

Эми үч таблицадагы маалыматтарды бириктирели Заказдар, Кардарлар жана Продукттар. Башкача айтканда, биз бардык буйрутмаларды кабыл алабыз жана кардар жана тиешелүү продукт боюнча маалымат кошобуз:

@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

MySQLде JOIN жок таблицаларга кошулуу

Бул учурда, таблицанын аттары кодду абдан көбөйтөт, бирок биз аны таблица лакап атын колдонуу менен кыскарта алабыз:

@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@