Oracle đã thực hiện một số thay đổi quan trọng trong Oracle8i SQL. Những thay đổi này bao gồm các lược đồ thi hành (câu lệnh) mới, hỗ trợ subquery vô hướng (scalar subquery), hỗ trợ chuẩn SQL ISO 99. Như là hệ quả, cú pháp của câu lệnh SQL cũng thay đổi theo hướng dễ sử dụng hơn khi làm việc với cơ sở dữ liệu. Dưới đây là một số thay đổi điển hình trong cú pháp của câu lệnh SQL:
Oracle đã thực hiện một số thay đổi quan trọng trong Oracle8i SQL. Những thay đổi này bao gồm các lược đồ thi hành (câu lệnh) mới, hỗ trợ subquery vô hướng (scalar subquery), hỗ trợ chuẩn SQL ISO 99. Như là hệ quả, cú pháp của câu lệnh SQL cũng thay đổi theo hướng dễ sử dụng hơn khi làm việc với cơ sở dữ liệu. Dưới đây là một số thay đổi điển hình trong cú pháp của câu lệnh SQL:
- CROSS JOIN - Tạo một tập tích Đề các (cặp sắp xếp có thứ tự) các hàng trong 2 bảng, giống như Oracle 8i khi kết nối bảng nhưng bỏ qua mệnh đề WHERE
- NATURAL JOIN - Đây là đặc điểm cú pháp rất tiện lợi trong Oralce 9i, tǎng tính dễ đọc của câu lệnh SQL bằng cách loại bỏ tiêu chuẩn kết nối trong mệnh đề WHERE.
- Mệnh đề USING - Cho phép bạn xác định khóa kết nối theo tên.
- Mệnh đề ON - Cho phép xác định các cột cho các khoá kết nối trong cả 2 bảng.
- LEFT OUTER JOIN - Trả về tất cả các dòng trong bảng bên trái của kết nối cùng với các giá trị tương ứng trong bảng bên phải hoặc null nếu như không có dòng tương ứng ở bảng bên phải.
- RIGHT OUTER JOIN - Trả về tất cả các dòng trong bảng bên phải của kết nối cùng với các giá trị tương ứng trong bảng bên trái hoặc null nếu như không có dòng tương ứng ở bảng bên phải.
- FULL OUTER JOIN - Trả về tất cả các dòng từ hai bảng, thay bất kỳ giá trị trống nào bằng null. Không có mệnh đề tương đương trong Oracle8i.
Phần lớn những thay đổi này nhằm mục đích cho phép các ứng dụng không phải Oracle dễ dàng tương thích với cơ sở dữ liệu Oracele hơn. Lưu ý rằng đây chỉ là những khác biệt về cú pháp, chuẩn ISO 99 không đem lại bất kỳ tính nǎng mới nào cho Oracle9i SQL.
CROSS JOIN
Trong Oracle, mệnh đề CROSS JOIN tạo ra một tích Đề các các hàng trong 2 bảng, giống như khi chúng ta bỏ qua mệnh đề WHERE khi kết nối như dưới đây:
select last_name, dept_id
from emp, depts;
Trong Oracle9i, chúng ta có thể sử dụng mệnh đề CROSS JOIN để nhận được cùng một kết quả như câu lệnh trên:
select last_name, dept_id
from emp
CROSS JOIN dept;
NATURAL JOIN
Cú pháp NATURAL JOIN rất tiện lợi bởi vì nó tự động nhận ra khoá kết nối từ tên cột trùng nhau trong cả hai bảng. Cú pháp này đơn giản hoá Oracle9i SQL nhưng yêu cầu các cột kết nối ở hai bảng phải có cùng tên. Một điều đặc biệt là cú pháp này làm việc ngay cả khi không có mối quan hệ khoá chính/khoá ngoại ở cột kết nối của 2 bảng.
Oracle8i
Select book_title, sum(quantity)
From book, sales
Where book.book_id = sales.book_id
group by book_title;
Oracle9i
Select book_title, sum(quantity)
from book
natural join sales
group by book_title;
Mệnh đề USING
Sử dụng mệnh đề USING nếu có nhiều hơn một cột có cùng tên trong 2 bảng nhưng bạn không muốn kết nối trên tất cả các cột này
Oracle8i
select dept_id, city
from departments, locations
where departments.location_id = location.location_id;
Oracle9i
select department_name, city
from departments
JOIN locations
USING (location_id);
Mệnh đề ON
Mệnh đề ON được sử dụng để kết nối 2 bảng khi tên của các cột trong 2 bảng không trùng nhau.
Oracle8i
select department_name, city
from department, location
where department.location_id = location.loc_id;
Oracle9i
select department_name, city
from department d
JOIN location l
ON (d.location_id = l.id);
Mutable Join
Sử dụng khi cần kết nối nhiều bảng với nhau. Chuẩn ISO SQL 99 luôn mặc định các bảng được kết nối từ trái sang phải và điều kiện kết nối hiện tại chỉ được tham chiếu tới kết nối hiện tại và các kết nối trước đó ở bên trái.
Oracle8i
select emp_id, city_name, dept_name
from location l, department d, emp e
where d.location_id = l.location_id
and d.department_id = e.department_id;
Oracle9i
select emp_id, city_name, dept_name
from locations l
JOIN departments d ON (d.location_id = l.location_id)
JOIN employees e ON (d.department_id = e.department_id);
Cú pháp OUTER JOIN mới
Chuẩn ISO 99 bỏ tất cả các dấu cộng (+) phiền hà từ kết nối mở rộng và vì vậy các kết nối mở rộng trở thành dễ hiểu hơn.
LEFT OUTER JOIN
Trong LEFT OUTER JOIN, tất cả các hàng trong bảng bên trái được trả về, ngay cả khi không có giá trị tương ứng trong cột của bảng bên phải. Trong ví dụ dưới đây, tất cả tên nhân viên được trả về, ngay cả những nhân viên chưa được gán mã phòng.
Oracle8i
select last_name, dept_id
from emp e, dept d
where e.department_id = d.department_id(+);
Oracle9i
select last_name, dept_id
from emp
LEFT OUTER JOIN Dept
ON e.dept_id = d.dept_id;
RIGHT OUTER JOIN
Trong RIGHT OUTER JOIN, tất cả các hàng trong bảng bên trái được trả về, ngay cả khi không có giá trị tương ứng trong cột của bảng bên phải. Trong ví dụ dưới đây, tất cả tên phòng được trả về, ngay cả những phòng chưa có nhân viên.
Oracle8i
select last_name, d.dept_id
from employees e, departments d
where e.department_id(+) = d.department_id;
Oracle9i
select last_name, d.dept_id
from employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id);
Nguyễn Hữu Tùng
(Theo builder.com)