5.2 Truy vấn con hàng đơn chỉ trả về một hàng từ câu lệnh SELECT con.. 5.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.. Một số toán tử
Trang 1Chương 5 TRUY 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 trongcâ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ôngcầ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 6(SELECT JobId FROM EmpWHERE Fname = ‘BLAKE’);
Truy vấn con
Trang 7FROM EmpWHERE DeptId =30);
DEPTNO AVG(SAL)
10 2916.66667
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 EmpWHERE 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
Truy vấn con
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
Trả về TRUE nếu có tồn tạiEXISTS
So sánh với tất cả các giá trị trongkết quả lệnh truy vấn con
ALL
So sánh với bất kỳ giá trị nàotrong kết quả của lệnh truy vấn con ANY
Nằm trong danh sáchIN
Diễn giải Toán tử
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ươngtối thiểu của các phòng ban
SELECT ename, salary, dept_id
FROM Emp
WHERE salary IN (SELECT MIN(salary)
FROM empGROUP 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ụngtoán tử ANY)
SELECT emp_id, ename, job_id, salary
FROM Emp
WHERE salary < ANY (SELECT salary
FROM empWHERE 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
(SELECT col1, col2,
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ứclương trung bình trong phòng ban của họ
SELECT ename, salary, deptidFROM Emp outer
WHERE salary > (SELECT AVG(salary)
FROM EmpWHERE deptid = outer.dept_id);
Truy vấn con
Trang 195.5 Truy vấn con tương quan
Tương quan UPDATE
cập nhật các hàng trong một bảng dựa trên cơ sở các hàng từ bảng khác
UPDATE table1 alias1 SET col = (SELECT expression
FROM table2 alias2 WHERE alias1.col = alias2.co);
Truy vấn con
Trang 205.5 Truy vấn con tương quan
Tương quan UPDATE
Ví dụ Cập nhật dữ liệu cột Deptid của bang Emp dựa vào bảngDept
UPDATE Emp e
SET deptid =
(SELECT deptidFROM Dept d WHERE e.deptid = d.deptid);
Truy vấn con
Trang 215.5 Truy vấn con tương quan
Tương quan DELETE
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
Tương quan DELETE
Ví dụ: Xóa những hàng trong bảng EMP mà các hàng đó tồntại trong bảng EMP_HISTORY
DELETE FROM Emp E
WHERE emp_id =
(SELECT emp_idFROM emp_historyWHERE 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 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âncấ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