5.1 Định nghĩa Mục đích Cung cấp giá trị cho WHERE, HAVING và START WITH Định nghĩa một tập hợp các hàng để chèn vào bảng trong câu lệnh INSERT hay CREATE TABLE.. 5.2 Truy vấn
Trang 1TRUY VẤN CON
- Lý thuyết: 3 tiết
- Thực hành: 2 tiết
Trang 25.1 Định nghĩa
5.2 Truy vấn con hàng đơn
5.3 Truy vấn con nhiều hàng
5.4 Truy vấn con trên nhiều cột
5.5 Truy vấn con tương quan
5.6 Truy vấn con phân cấp
Truy vấn con
Trang 45.1 Định nghĩa
Mục đích
Cung cấp giá trị cho WHERE, HAVING và START WITH
Định nghĩa một tập hợp các hàng để chèn vào bảng trong câu lệnh INSERT hay CREATE TABLE
Định nghĩa một hay nhiều giá trị để gán cho một hàng đã tồn tại trong câu lệnh UPDATE
Truy vấn con
Trang 55.1 Định nghĩa
Một số quy tắc
trong cặp dấu ngoặc đơn ()
bên phải điều kiện so sánh
Mệnh đề ORDER BY trong câu lệnh truy vấn con là không cần thiết trừ khi chúng ta thực hiện phân tích top-n
Sử dụng các phép toán
Truy vấn con
Trang 7FROM Emp WHERE DeptId
=30);
DEPTNO AVG(SAL)
10 2916.66667
20 2175
Truy vấn con
Trang 85.2 Truy vấn con hàng đơn
chỉ trả về một hàng từ câu lệnh SELECT con.
Ví dụ
Tìm nhân viên có mã công việc giống với nhân viên số
141 SELECT Ename, job_id
FROM Emp WHERE job_id = (SELECT job_id
FROM EmpWHERE emp_id = 141);
Truy vấn con
Trang 95.2 Truy vấn con hàng đơn
Chú ý: Một số lỗi thường gặp
Câu lệnh con trả về nhiều hơn một hàng
Câu lệnh con không trả về hàng nào
Các phép toán thường dùng Toán tử Diễn giải
Trang 105.3 Truy vấn con nhiều hàng
kết quả trả về nhiều hơn một hàng
Một số toán tử thường được sử dụng
Toán tử Diễn giải
IN Nằm trong danh sáchANY
So sánh với bất kỳ giá trị nào trong kết quả của lệnh truy vấn con
ALL So sánh với tất cả các giá trị trong kết quả lệnh truy vấn conEXISTS Trả về TRUE nếu có tồn tại
Truy vấn con
Trang 115.3 Truy vấn con nhiều hàng
Ví dụ: Tìm những nhân viên có thu nhập bằng với mức lương tối thiểu của các phòng ban
SELECT ename, salary, dept_id
FROM Emp
WHERE salary IN (SELECT MIN(salary)
FROM emp GROUP BY dept_id);
Truy vấn con
Trang 125.3 Truy vấn con nhiều hàng
Ví dụ: Tìm nhân viên không phải lập trình viên (ST_PROG’)
và mức lương thấp hơn bất kỳ một lập trình viên nào (sử dụng toán tử ANY)
SELECT emp_id, ename, job_id, salary
FROM Emp
WHERE salary < ANY (SELECT salary
FROM emp WHERE job_id = 'ST_PROG')
AND job_id <> ‘ST_PROG’;
Truy vấn con
Trang 135.3 Truy vấn con nhiều hàng
Chú ý:
< ANY: nhỏ hơn phần tử lớn nhất
> ANY: lớn phần tử nhỏ nhất
= ANY: tương đương với bất kỳ phần tử nào
< ALL: nhỏ hơn phần tử nhỏ nhất
> ALL: lớn hơn phần tử lớn nhất
điều kiện so sánh với giá trị NULL trả về NULL (dùng IN)
Truy vấn con
Trang 145.4 Truy vấn con trên nhiều cột
Mỗi hàng trong câu truy vấn chính được so sánh với
giá trị của câu truy vấn con nhiều hàng và nhiều cột
SELECT col1, col2,
FROM table
WHERE (col1, col2, ) IN
FROM table WHERE condition);
Truy vấn con
Trang 155.4 Truy vấn con trên nhiều cột
Ví dụ: Hiển thị các nhân viên do cùng một người quản lý và
làm việc cùng phòng với nhân viên có mã số 178 hoặc 174
SELECT emp_id, manager_id, dept_id
FROM Emp
WHERE (manager_id, dept_id) IN
(SELECT manager_id, dept_id FROM Emp
WHERE emp_id IN (178,174)) AND emp_id NOT IN (178,174);
Truy vấn con
Trang 165.5 Truy vấn con tương quan
được sử dụng trong trường hợp xử lý từng hàng
Trang 175.5 Truy vấn con tương quan
SELECT column1, column2,
FROM table1 outer
WHERE column1 operator
(SELECT colum1, column2 FROM table2
WHERE expr1 = outer.expr2);
có thể sử dụng toán tử ANY và ALL trong câu lệnh truy vấn con tương quan
Truy vấn con
Trang 185.5 Truy vấn con tương quan
Ví dụ: Tìm tất cả các nhân viên có thu nhập cao hơn mức lương trung bình trong phòng ban của họ
SELECT ename, salary, deptid
FROM Emp outerWHERE salary > (SELECT AVG(salary)
FROM Emp
WHERE deptid = outer.dept_id);
Truy vấn con
Trang 195.5 Truy vấn con tương quan
cập nhật các hàng trong một bảng dựa trên cơ sở các
Trang 205.5 Truy vấn con tương quan
Ví dụ Cập nhật dữ liệu cột Deptid của bang Emp dựa vào bảng Dept
UPDATE Emp e
SET deptid =
(SELECT deptid FROM Dept d
WHERE e.deptid = d.deptid);
Truy vấn con
Trang 215.5 Truy vấn con tương quan
xóa các hàng trong một bảng dựa trên cơ sở các
hàng từ bảng khác
DELETE FROM table1 alias1
WHERE col operator
(SELECT expression FROM table2 alias2 WHERE alias1.col = alias2.col);
Truy vấn con
Trang 225.5 Truy vấn con tương quan
Ví dụ: Xóa những hàng trong bảng EMP mà các hàng đó tồn tại trong bảng EMP_HISTORY
DELETE FROM Emp E
WHERE emp_id =
(SELECT emp_id FROM emp_history
WHERE emp_id = E.emp_id);
Truy vấn con
Trang 23[START WITH condition(s)]
[CONNECT BY PRIOR condition(s)];
Truy vấn con
Trang 24 CONNECT BY PRIOR Chỉ định cột và định hướng trong
mối liên hệ hình cây (bắt buộc)
Truy vấn con
Trang 255.6 Truy vấn phân cấp
Ví dụ: Hiển thị danh sách những người quản lý bắt đầu với
nhân viên tên ‘King’ (Thứ tự trên xuống)
SELECT ename||' reports to '||
PRIOR ename "Walk Top Down“
FROM emp
TART WITH ename = 'King’
CONNECT BY PRIOR emp_id = manager_id;
Truy vấn con
Trang 265.6 Truy vấn phân cấp
Ví dụ: Lập báo cáo hiển thị các cấp quản lý công ty, bắt đầu từ cấp cao nhất và thụt đầu dòng theo từng cấp.(Định dạng phân cấp báo cáo sử dụng LEVEL và LPAD)
SELECT LPAD(ename, LENGTH(ename) + (LEVEL*2)
-2,'_') AS org_chart FROM Emp
START WITH ename='King'
CONNECT BY PRIOR emp_id=manager_id
Truy vấn con
Trang 275.6 Truy vấn phân cấp
Truy vấn con
Trang 28Câu hỏi và bài tập
Trả lời câu hỏi phần 6.7 trong giáo trình
Thực hành viết các câu lệnh truy vấn con trong phần bài tập
Chuẩn bị nội dung chương 6.
Truy vấn con