Lấy dữ liệu từ nhiều bảng
Hiển thị dữ liệu từ nhiều bảng
Các bảng liên quan của một cơ sở dữ liệu lớn được liên kết thông qua việc sử dụng các khóa ngoại và khóa chính hoặc những gì thường được gọi là cột chung. Khả năng nối các bảng sẽ cho phép bạn thêm nhiều ý nghĩa hơn vào bảng kết quả được tạo ra. Để kết hợp các bảng số 'n' trong một truy vấn, điều kiện tham gia tối thiểu (n-1) là cần thiết. Dựa trên các điều kiện nối, Oracle kết hợp cặp hàng phù hợp và hiển thị hàng thỏa mãn điều kiện nối.
Tham gia được phân loại như dưới đây
Liên kết tự nhiên (còn được gọi là liên kết tương đương hoặc liên kết đơn giản) - Tạo liên kết bằng cách sử dụng một cột thường được đặt tên và xác định.
Nối không bình đẳng - Nối các bảng khi không có hàng tương đương nào trong bảng được nối - ví dụ: để khớp các giá trị trong một cột của bảng với một dải giá trị trong một bảng khác.
Tự tham gia - Tham gia một bảng với chính nó.
Kết nối bên ngoài - Bao gồm các bản ghi của một bảng ở đầu ra khi không có bản ghi phù hợp trong bảng khác.
Phép nối Descartes (còn được gọi là tích Descartes hoặc phép nối chéo) - Sao chép mỗi hàng từ bảng đầu tiên với mỗi hàng từ bảng thứ hai. Tạo một phép nối giữa các bảng bằng cách hiển thị mọi kết hợp bản ghi có thể.
Tham gia tự nhiên
Từ khóa NATURAL có thể đơn giản hóa cú pháp của một tương đương. NATURAL JOIN có thể thực hiện bất cứ khi nào hai (hoặc nhiều) bảng có các cột có cùng tên và các cột tương thích với nhau, nghĩa là các cột có miền giá trị được chia sẻ. phép toán nối các hàng từ bảng có giá trị cột bằng nhau cho các cột được đặt tên giống nhau.
Hãy xem xét mối quan hệ một-nhiều giữa bảng DEPARTMENTS và EMPLOYEES.Mỗi bảng có một cột có tên là DEPARTMENT_ID. Cột này là khóa chính của bảng DEPARTMENTS và là khóa ngoại của bảng EMPLOYEES.
SELECT E.first_name NAME,D.department_name DNAME
FROM employees E NATURAL JOIN departments D;
FIRST_NAME DNAME
---------- ------
MILLER DEPT 1
JOHN DEPT 1
MARTIN DEPT 2
EDWIN DEPT 2
Truy vấn SELECT bên dưới kết hợp hai bảng bằng cách chỉ định rõ ràng điều kiện kết hợp với từ khóa ON.
SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
ON (E.department_id = D.department_id);
Có một số hạn chế liên quan đến NATURAL JOIN, bạn không thể chỉ định cột LOB bằng NATURAL JOIN, ngoài ra, các cột liên quan đến phép nối không thể đủ điều kiện bằng tên bảng hoặc bí danh.
Điều khoản sử dụng
Sử dụng phép nối tự nhiên, Oracle xác định ngầm các cột để tạo cơ sở cho phép nối. Nhiều tình huống yêu cầu khai báo rõ ràng các điều kiện tham gia. Trong những trường hợp như vậy, chúng tôi sử dụng mệnh đề USING để chỉ định tiêu chí tham gia. Vì mệnh đề USING tham gia các bảng dựa trên sự bằng nhau của các cột, nó còn được gọi là Equijoin. Chúng còn được gọi là phép nối bên trong hoặc phép nối đơn giản.
Cú pháp:
SELECT <column list>
FROM TABLE1 JOIN TABLE2
USING (column name)
Hãy xem xét truy vấn CHỌN dưới đây, bảng EMPLOYEES và bảng DEPARTMENTS được kết hợp bằng cách sử dụng cột chung DEPARTMENT_ID.
SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
USING (department_id);
Tự tham gia
Hoạt động SELF-JOIN tạo ra một bảng kết quả khi tồn tại mối quan hệ quan tâm giữa các hàng được lưu trữ trong một bảng. Nói cách khác, khi một bảng được nối với chính nó, phép nối được gọi là Tự tham gia.
Hãy xem xét bảng EMPLOYEES, có chứa nhân viên và người quản lý báo cáo của họ. Đây là một ứng cử viên điển hình cho Tự tham gia.
SELECT e1.FirstName Manager,e2.FirstName Employee
FROM employees e1 JOIN employees e2
ON (e1.employee_id = e2.manager_id)
ORDER BY e2.manager_id DESC;
Không tương đương
Phép nối không bình đẳng được sử dụng khi các cột liên quan không thể được nối bằng dấu bằng - nghĩa là không có hàng tương đương nào trong bảng được nối. Phép nối không bình đẳng cho phép bạn lưu trữ giá trị tối thiểu của một dải ô trong một cột của một bản ghi và giá trị lớn nhất trong một cột khác. Vì vậy, thay vì tìm kết hợp cột với cột, bạn có thể sử dụng phép nối không bình đẳng để xác định xem mặt hàng đang được vận chuyển có nằm giữa phạm vi tối thiểu và tối đa trong các cột hay không. lệ phí có thể được trả lại trong kết quả. Như với phương pháp nối bình đẳng truyền thống, một phép nối không bình đẳng có thể được thực hiện trong mệnh đề WHERE. Ngoài ra, từ khóa JOIN có thể được sử dụng với mệnh đề ON để chỉ định các cột có liên quan cho phép nối.
SELECT E.first_name,
J.job_hisal,
J.job_losal,
E.salary
FROM employees E JOIN job_sal J
ON (E.salary BETWEEN J.job_losal AND J.job_losal);
Chúng ta có thể sử dụng tất cả các tham số so sánh được thảo luận trước đó như toán tử bình đẳng và bất bình đẳng, GIỮA, LÀ KHÔNG ĐỦ, KHÔNG ĐỦ và RELATIONAL.
Tham gia bên ngoài
Một phép nối bên ngoài được sử dụng để xác định các trường hợp trong đó các hàng trong một bảng không khớp với các hàng trong bảng thứ hai, mặc dù hai bảng có liên quan với nhau.
Có ba loại nối ngoài: LEFT, RIGHT và FULL OUTER JOIN. Tất cả chúng đều bắt đầu bằng INNER JOIN, và sau đó chúng thêm lại một số hàng đã bị loại bỏ. LEFT OUTER JOIN sẽ thêm lại tất cả các hàng bị loại bỏ khỏi bảng đầu tiên (bên trái) trong điều kiện nối và các cột đầu ra từ bảng thứ hai (bên phải) được đặt thành NULL. A RIGHT OUTER JOIN sẽ thêm lại tất cả các hàng bị loại bỏ từ bảng thứ hai (bên phải) trong điều kiện nối và các cột đầu ra từ bảng đầu tiên (bên trái) được đặt thành NULL. FULL OUTER JOIN thêm lại tất cả các hàng bị loại bỏ khỏi cả hai bảng.
Tham gia bên ngoài bên phải
A RIGHT OUTER JOIN sẽ thêm lại tất cả các hàng bị loại bỏ từ bảng thứ hai (bên phải) trong điều kiện nối và các cột đầu ra từ bảng đầu tiên (bên trái) được đặt thành NULL. Lưu ý truy vấn dưới đây liệt kê các nhân viên và các bộ phận tương ứng của họ. Ngoài ra chưa có nhân viên nào được giao cho bộ phận 30
SELECT E.first_name, E.salary, D.department_id
FROM employees E, departments D
WHERE E.DEPARTMENT_ID (+) = D.DEPARTMENT_ID;
FIRST_NAME SALARY DEPARTMENT_ID
---------- ---------- ----------
JOHN 6000 10
EDWIN 2000 20
MILLER 2500 10
MARTIN 4000 20
30
Tham gia bên ngoài bên trái
LEFT OUTER JOIN sẽ thêm lại tất cả các hàng bị loại bỏ khỏi bảng đầu tiên (bên trái) trong điều kiện nối và các cột đầu ra từ bảng thứ hai (bên phải) được đặt thành NULL. Truy vấn được trình bày ở trên có thể được sử dụng để chứng minh phép nối ngoài cùng bên trái, bằng cách hoán đổi vị trí của dấu (+).
SELECT E.first_name, E.salary, D.department_id
FROM employees E, departments D
WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID (+);
FIRST_NAME SALARY DEPARTMENT_ID
---------- ---------- ----------
JOHN 6000 10
EDWIN 2000 20
MILLER 2500 10
MARTIN 4000 20
30
Tham gia đầy đủ bên ngoài
FULL OUTER JOIN thêm lại tất cả các hàng bị loại bỏ khỏi cả hai bảng. Truy vấn bên dưới hiển thị danh sách các nhân viên và phòng ban của họ. Lưu ý rằng nhân viên 'MAN' vẫn chưa được chỉ định cho bất kỳ bộ phận nào cho đến nay (đó là NULL) và bộ phận 30 không được chỉ định cho bất kỳ nhân viên nào.
SELECT nvl (e.first_name,'-') first_name, nvl (to_char (d.department_id),'-') department_id
FROM employee e FULL OUTER JOIN department d
ON e. depARTMENT_ID = d. depARTMENT_ID;
FIRST_NAME DEPARTMENT_ID
---------- --------------------
MAN -
JOHN 10
EDWIN 20
MILLER 10
MARTIN 20
- 30
6 rows selected.
Sản phẩm Descartes hoặc tham gia chéo
Đối với hai thực thể A và B, A * B được gọi là tích Descartes. Tích Descartes bao gồm tất cả các tổ hợp có thể có của các hàng từ mỗi bảng. Do đó, khi một bảng có 10 hàng được nối với một bảng có 20 hàng, thì tích Đề-các là 200 hàng (10 * 20 = 200). Ví dụ: ghép bảng nhân viên với tám hàng và bảng phòng ban có ba hàng sẽ tạo ra một bảng tích Descartes gồm 24 hàng (8 * 3 = 24).
Phép nối chéo đề cập đến tích Descartes của hai bảng. Nó tạo ra sản phẩm chéo của hai bảng. Truy vấn trên có thể được viết bằng mệnh đề CROSS JOIN.
Bảng kết quả tích Descartes thường không hữu ích lắm. Trên thực tế, một bảng kết quả như vậy có thể gây hiểu lầm khủng khiếp. Nếu bạn thực hiện truy vấn dưới đây cho bảng NHÂN VIÊN và PHÒNG, thì bảng kết quả ngụ ý rằng mọi nhân viên đều có mối quan hệ với mọi bộ phận và chúng tôi biết rằng đơn giản là không phải như vậy!
SELECT E.first_name, D.DNAME
FROM employees E,departments D;
Tham gia chéo có thể được viết là,
SELECT E.first_name, D.DNAME
FROM employees E CROSS JOIN departments D;