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_ID. Employees_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_ID | Name |
---|---|
01 | Hansen, Ola |
02 | Svendson, Tove |
03 | Svendson, Stephen |
04 | Pettersen, Kari |
B?ng Orders:
Prod_ID | Product | Employee_ID |
---|---|---|
234 | Printer | 01 |
657 | Table | 03 |
865 | Chair | 03 |
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?:
Name | Product |
---|---|
Hansen, Ola | Printer |
Svendson, Stephen | Table |
Svendson, Stephen | Chair |
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?:
Name | Product |
---|---|
Hansen, Ola | Printer |
Svendson, Stephen | Table |
Svendson, Stephen | Chair |
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?:
Name | Product |
---|---|
Hansen, Ola | Printer |
Svendson, Tove | |
Svendson, Stephen | Table |
Svendson, Stephen | Chair |
Pettersen, Kari |
Ví d?:
RIGHT JOIN
Cú pháp:
Available link for download