Bạn muốn nối các bảng trên nhiều cột bằng cách sử dụng khóa ghép chính trong một bảng và khóa ghép ngoại trong bảng khác
Ví dụ
Cơ sở dữ liệu của chúng tôi có ba bảng tên là student
, enrollment
và payment
. Bảng student
có dữ liệu trong các cột sau. id
[khóa chính],
SELECT SUPPLIER_NUMBER, SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER, ITEM_NAME
FROM SAMPLECOLL.SUPPLIERS, SAMPLECOLL.INVENTORY_LIST
WHERE SAMPLECOLL.SUPPLIERS.ITEM_NUMBER
= SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER
0 và SELECT SUPPLIER_NUMBER, SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER, ITEM_NAME
FROM SAMPLECOLL.SUPPLIERS, SAMPLECOLL.INVENTORY_LIST
WHERE SAMPLECOLL.SUPPLIERS.ITEM_NUMBER
= SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER
1idfirst_namelast_name1EllieWillson2TomBrown3SandraMillerBảng enrollment
có dữ liệu trong các cột sau. khóa chính [
SELECT SUPPLIER_NUMBER, SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER, ITEM_NAME
FROM SAMPLECOLL.SUPPLIERS, SAMPLECOLL.INVENTORY_LIST
WHERE SAMPLECOLL.SUPPLIERS.ITEM_NUMBER
= SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER
3 và student
0], student
1 và student
2student_idcourse_codeis_activestart_date1GD03true2020-01-201AP01false2020-03-102SL01true2020-05-053SL01true2020-06-01Bảng payment
có dữ liệu trong các cột sau. khóa ngoại [
SELECT SUPPLIER_NUMBER, SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER, ITEM_NAME
FROM SAMPLECOLL.SUPPLIERS, SAMPLECOLL.INVENTORY_LIST
WHERE SAMPLECOLL.SUPPLIERS.ITEM_NUMBER
= SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER
3 và student
0, khóa chính của bảng enrollment
], student
7 và student
8student_idcourse_codestatusamount1GD03pay2301AP01pending1002SL01pending803SL01pending110Hãy hiển thị tên, mã khóa học, trạng thái và số tiền thanh toán của từng sinh viên
Dung dịch
SELECT s.last_name, s.first_name, p.course_code, p.status, p.amount FROM enrollment e JOIN student s ON s.id=e.student_id JOIN payment p ON p.course_code=e.course_code AND p.student_id=e.student_id;last_namefirst_namecourse_codestatusamountWillsonEllieGD03đã thanh toán230WillsonEllieAP01đang chờ xử lý100BrownTomSL01đang chờ xử lý80MillerSandraSL01đang chờ xử lý110
Thảo luận
Nếu bạn muốn lấy dữ liệu được lưu trữ trong các bảng được nối bằng một khóa phức hợp, là khóa chính trong một bảng và khóa ngoại trong một bảng khác, chỉ cần sử dụng điều kiện nối trên nhiều cột
Trong một bảng đã tham gia [trong ví dụ của chúng tôi, enrollment
], chúng tôi có một khóa chính được tạo từ hai cột [
SELECT SUPPLIER_NUMBER, SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER, ITEM_NAME
FROM SAMPLECOLL.SUPPLIERS, SAMPLECOLL.INVENTORY_LIST
WHERE SAMPLECOLL.SUPPLIERS.ITEM_NUMBER
= SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER
3 và student
0]. Trong bảng thứ hai [payment
], chúng tôi có các cột là khóa ghép ngoại [SELECT SUPPLIER_NUMBER, SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER, ITEM_NAME
FROM SAMPLECOLL.SUPPLIERS, SAMPLECOLL.INVENTORY_LIST
WHERE SAMPLECOLL.SUPPLIERS.ITEM_NUMBER
= SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER
3 và student
0]. Làm thế nào chúng ta có thể nối các bảng với các phím ghép này?Dễ dàng. Chúng ta chỉ cần sử dụng mệnh đề enrollment
5 với nhiều hơn một điều kiện bằng cách sử dụng toán tử AND sau điều kiện đầu tiên. Trong ví dụ của chúng tôi, chúng tôi sử dụng điều kiện này
enrollment
6
Trong phần đầu tiên, chúng tôi sử dụng cột
SELECT SUPPLIER_NUMBER, SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER, ITEM_NAME
FROM SAMPLECOLL.SUPPLIERS, SAMPLECOLL.INVENTORY_LIST
WHERE SAMPLECOLL.SUPPLIERS.ITEM_NUMBER
= SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER
3 từ bảng enrollment
và SELECT SUPPLIER_NUMBER, SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER, ITEM_NAME
FROM SAMPLECOLL.SUPPLIERS, SAMPLECOLL.INVENTORY_LIST
WHERE SAMPLECOLL.SUPPLIERS.ITEM_NUMBER
= SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER
3 từ bảng payment
. Ở điều kiện tiếp theo, chúng ta lấy cột student
0 từ bảng enrollment
và student
0 từ bảng payment
Lưu ý rằng các cột
SELECT SUPPLIER_NUMBER, SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER, ITEM_NAME
FROM SAMPLECOLL.SUPPLIERS, SAMPLECOLL.INVENTORY_LIST
WHERE SAMPLECOLL.SUPPLIERS.ITEM_NUMBER
= SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER
3 và student
0 tạo thành khóa chính trong bảng enrollment
. Do đó, chúng được sử dụng trong bảng payment
làm khóa ngoại Với SQL, bạn có thể lấy thông tin từ các cột trong nhiều bảng. Thao tác này được gọi là thao tác nối
Trong SQL, một thao tác nối được chỉ định bằng cách đặt tên của các bảng mà bạn muốn nối vào cùng một mệnh đề TỪ của câu lệnh SELECT
Giả sử bạn muốn xem danh sách tất cả các nhà cung cấp và số mặt hàng cũng như tên mặt hàng cho các mặt hàng được cung cấp của họ. Tên mặt hàng không có trong bảng NHÀ CUNG CẤP; . Sử dụng cột chung, ITEM_NUMBER, bạn có thể thấy tất cả các cột như thể chúng đến từ một bảng duy nhất
Bất cứ khi nào cùng một tên cột tồn tại trong hai hoặc nhiều bảng được nối, tên cột phải đủ điều kiện theo tên bảng để chỉ định cột nào đang được tham chiếu. Trong câu lệnh CHỌN này, tên cột ITEM_NUMBER được xác định trong cả hai bảng, do đó, nó cần phải đủ điều kiện theo tên bảng. Nếu các cột có tên khác nhau thì không cần trình độ chuyên môn
Để thực hiện thao tác nối này, hãy nhập câu lệnh SELECT sau bằng cách nhập trực tiếp vào màn hình Nhập câu lệnh SQL hoặc bằng cách nhắc.
SELECT SUPPLIER_NUMBER, SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER, ITEM_NAME
FROM SAMPLECOLL.SUPPLIERS, SAMPLECOLL.INVENTORY_LIST
WHERE SAMPLECOLL.SUPPLIERS.ITEM_NUMBER
= SAMPLECOLL.INVENTORY_LIST.ITEM_NUMBER
Nếu bạn sử dụng lời nhắc, bạn cần nhập cả hai tên bảng trên dòng nhập TỪ bảngMột cách khác để nhập cùng một câu lệnh là sử dụng tên tương quan. Tên tương quan cung cấp tên khác cho tên bảng để sử dụng trong câu lệnh. Tên tương quan phải được sử dụng khi tên bảng giống nhau. Nó có thể được chỉ định bằng cách theo dõi từng tên bảng trong danh sách TỪ. Câu lệnh trước đó có thể được viết lại thành.
SELECT SUPPLIER_NUMBER, Y.ITEM_NUMBER, ITEM_NAME
FROM SAMPLECOLL.SUPPLIERS X, SAMPLECOLL.INVENTORY_LIST Y
WHERE X.ITEM_NUMBER = Y.ITEM_NUMBER
Trong ví dụ này, SAMPLECOLL. NHÀ CUNG CẤP được đặt tên tương quan là X và SAMPLECOLL. INVENTORY_LIST được đặt tên tương quan là Y. Sau đó, tên X và Y được sử dụng để xác định tên cột ITEM_NUMBER
Chạy ví dụ này trả về đầu ra sau
Display Data
Data width . . . . . . : 45
Position to line . . . . . Shift to column . . . . . .
....+....1....+....2....+....3....+....4....+
SUPPLIER_NUMBER ITEM ITEM
NUMBER NAME
1234 153047 Pencils, red
1234 229740 Lined tablets
1234 303476 Paper clips
9988 153047 Pencils, red
9988 559343 Envelopes, legal
2424 153047 Pencils, red
2424 303476 Paper clips
5546 775298 Chairs, secretary
3366 303476 Paper clips
3366 073956 Pens, black
******** End of data ********
F3=Exit F12=Cancel F19=Left F20=Right F21=Split
Ghi chú. Vì không có mệnh đề ORDER BY nào được chỉ định cho truy vấn nên thứ tự của các hàng mà truy vấn của bạn trả về có thể khác.
Các giá trị dữ liệu trong bảng kết quả biểu thị tổng hợp các giá trị dữ liệu có trong hai bảng INVENTORY_LIST và SUPPLIERS. Bảng kết quả này chứa số nhà cung cấp từ bảng NHÀ CUNG CẤP và số mặt hàng và tên mặt hàng từ bảng INVENTORY_LIST. Mã hàng nào không có trong bảng NHÀ CUNG CẤP thì không có trong bảng kết quả này. Các kết quả không được đảm bảo theo bất kỳ thứ tự nào trừ khi mệnh đề ORDER BY được chỉ định cho câu lệnh SELECT. Bởi vì bạn không thay đổi bất kỳ tiêu đề cột nào cho bảng SUPPLIER, tên cột SUPPLIER_NUMBER được sử dụng làm tiêu đề cột
Ví dụ sau đây cho thấy cách sử dụng ORDER BY để đảm bảo thứ tự của các hàng. Câu lệnh đầu tiên sắp xếp bảng kết quả theo cột SUPPLIER_NUMBER. Các hàng có cùng giá trị cho SUPPLIER_NUMBER được sắp xếp theo ITEM_NUMBER của chúng.
SELECT SUPPLIER_NUMBER,Y.ITEM_NUMBER,ITEM_NAME
FROM SAMPLECOLL.SUPPLIERS X,SAMPLECOLL.INVENTORY_LIST Y
WHERE X.ITEM_NUMBER = Y.ITEM_NUMBER
ORDER BY SUPPLIER_NUMBER,Y.ITEM_NUMBER