Monday, January 23, 2017

Nối kết và khoá trong SQL nối 2 bảng với nhau bằng JOIN hoặc WHERE

Nối kết và khoá trong SQL nối 2 bảng với nhau bằng JOIN hoặc WHERE


 N?i k?t và khoá
?ôi khi chúng ta ph?i l?y d? li?u t? hai b?ng cùng m?t lúc, chúng ta th?c hi?n m?t k?t n?i.
Các b?ng trong CSDL có th? quan h? ràng bu?c v?i nhau thông qua các khoá. M?t khoá chính (primary key)  là m?t c?t mà trong ?ó m?i giá tr? c?a hàng ph?i là duy nh?t. M?c ?ích c?a khoá là k?t n?i d? li?u l?i v?i nhau, t? nhi?u b?ng khác nhau mà không gây trùng l?p d? li?u gi?a các b?ng.
Trong b?ng Employees (nhân viên) ? ví d? d??i ?ây có c?t Employees_ID là khoá chính, b?o ??m r?ng không th? có hai dòng nào có trùng Employees_IDEmployees_ID dùng ?? phân bi?t hai nhân viên khi h? trùng tên.
Trong ví d? d??i ?ây:
  • Employee_ID là khoá chính c?a b?ng Employees.
  • Prod_ID là khoá chính c?a b?ng Orders.
  • C?t Employeed_ID trong b?ng Orders ???c s? d?ng ?? k?t n?i v?i b?ng Employees, ch? ??n nhân viên trong b?ng Employees.
B?ng Employees:
Employees_IDName
01Hansen, Ola
02Svendson, Tove
03Svendson, Stephen
04Pettersen, Kari
B?ng Orders:
Prod_IDProductEmployee_ID
234Printer01
657Table03
865Chair03
K?t n?i hai b?ng v?i nhau
Chúng ta có th? l?y d? li?u t? hai b?ng b?ng cách k?t n?i chúng, t??ng t? nh? sau:
S? d?ng Where ?? n?i 2 b?ng (Cách 1)
Ví d?: Tìm xem ai ?ã ??t hàng s?n ph?m và h? ?ã ??t món hàng gì:
SELECT Employees.Name, Orders.Product
FROM Employees, Orders
WHERE Employees.Employee_ID = Orders.Employee_ID
Ho?c
SELECT Employees.Name, Orders.Product
FROM Employees A, Orders B
WHERE A.Employee_ID = B.Employee_ID
k?t qu? tr? v?:
NameProduct
Hansen, OlaPrinter
Svendson, StephenTable
Svendson, StephenChair
Ví d?: Tìm xem ai ?ã ??t hàng máy in:
SELECT Employees.Name
FROM Employees, Orders
WHERE Employees.Employee_ID = Orders.Employee_ID
AND Orders.Product = Printer
k?t qu? tr? v?:
Name
Hansen, Ola
S? d?ng JOIN ?? n?i 2 b?ng (Cách 2)
Ta có th? s? d?ng t? khoá JOIN ?? k?t n?i d? li?u t? hai b?ng.
Ví d?: INNER JOIN
Cú pháp:
SELECT c?t_1, c?t_2, c?t_3
FROM b?ng_1
INNER JOIN b?ng_2
ON b?ng_1.khoá_chính = b?ng_2.khoá_ngo?i
Ai ?ã ??t hàng và h? ?ã ??t món hàng nào:
SELECT Employees.Name, Orders.Product
FROM Employees
INNER JOIN Orders
ON Employees.Employee_ID = Orders.Employee_ID
INNER JOIN tr? v? t?t c? các dòng ? c? hai b?ng khi chúng t??ng ?ng v?i nhau. N?u có m?t dòng ? b?ng Employees không ?ng v?i dòng nào ? b?ng Orders, dòng ?ó s? không ???c tính.
k?t qu? tr? v?:
NameProduct
Hansen, OlaPrinter
Svendson, StephenTable
Svendson, StephenChair
Ví d?: LEFT JOIN
Cú pháp:
SELECT c?t_1, c?t_2, c?t_3
FROM b?ng_1
LEFT JOIN b?ng_2
ON b?ng_1.khoá_chính = b?ng_2.khoá_ngo?i
Li?t kê t?t c? các nhân viên và món hàng mà h? ??t (n?u có):
SELECT Employees.Name, Orders.Product
FROM Employees
LEFT JOIN Orders
ON Employees.Employee_ID = Orders.Employee_ID
LEFT JOIN tr? v? t?t c? các dòng c?a b?ng th? nh?t (Employees), ngay c? khi các dòng ?ó không ?ng v?i dòng nào ? b?ng th? hai (Orders). N?u có m?t dòng nào ? b?ng Employees không ?ng v?i b?t c? dòng nào ? b?ng Orders thì dòng ?ó c?ng v?n ???c tính.
k?t qu? tr? v?:
NameProduct
Hansen, OlaPrinter
Svendson, Tove
Svendson, StephenTable
Svendson, StephenChair
Pettersen, Kari
Ví d?: RIGHT JOIN
Cú pháp:
Available link for download