Bài giảng Hệ quản trị cơ sở dữ liệu: Chương 3 Truy vấn SQL cung cấp cho người học những kiến thức như: Thao tác CSDL (tạo, sửa, xoá, thêm dữ liệu); Các câu truy vấn: Select, Insert, Update, Delete; Truy vấn lồng, gom nhóm, điều kiện gom nhóm; Các hàm xử lý dữ liệu; Bài tập thực hành.
Trang 2NỘI DUNG MÔN HỌC
Trang 3Chương 3: Truy vấn SQL
I Thao tác CSDL (tạo, sửa, xoá, thêm dữ liệu)
II Các câu truy vấn: Select, Insert, Update,
Trang 4I Thao tác CSDL
1 Cho CSDL
Ví dụ: Cho các lược đồ quan hệ sau
Sinhvien (MaSV, Hoten, Namsinh, QQ, Hocluc)
Detai (MaDT, TenDT, Chunhiem, Kinhphi)
SVDT (MaSV, MaDT, NoiAD, KQ)
Bảng dữ liệu mẫu như sau:
Sinhvien MaSv Hoten Namsinh QQ Hocluc
SV001 Thái Bình An 1983 Cần Thơ 7.5 SV002 Lê Văn Khang 1985 Vĩnh Long 7.1 SV003 Trần Đức Thịnh 1983 Đồng Tháp 8.1 SV004 Bùi Quốc Vượng 1984 Đồng Tháp 9.2 SV005 Lâm Nhân Nghĩa 1985 Tiền Giang 6.5 SV006 Hà Công Sự 1982 Cần Thơ 6.0 SV007 Hồ Phương Thanh 1985 An giang 8.2
Trang 5Bảng dữ liệu mẫu (tt)
Detai MaDT TenDT Chunhiem Kinhphi
DT001 Quản lý Nhân sự Nguyễn Thị Xuân 10 DT002 Web site Bán hàng qua mạng Hồ Văn Quang 15 DT003 Bảo mật trong thương mại điện tử Trần Hiếu Hạnh 20 DT004 Quản lý lịch công tác trên mạng Lê Đức Phúc 8 DT005 Bộ soạn thảo công thức toán học Trần Hiếu Hạnh 9 DT006 Web site đào tạo từ xa Lê Đức Phúc 25
SVDT MaSV MaDT Noi_AD KQ
SV001 DT001 Đồng Tháp 9.5 SV002 DT002 Vĩnh Long 9.0 SV003 DT001 Trà Vinh 9.0 SV004 DT002 Đồng Tháp 10.0 SV007 DT004 Trà Vinh 9.0 SV008 DT003 Bạc Liêu 10.0 SV001 DT004 Đồng Tháp 9.5
Trang 7– Default_exp: dữ liệu của cột nhận giá trị
default_exp nếu người dùng không
Trang 8Tạo bảng (tt)
CREATE TABLE SINHVIEN (
MASV CHAR(10) PRIMARY KEY ,
CREATE TABLE DETAI(
MADT CHAR(10) PRIMARY KEY ,
TENDT VARCHAR2(40),
CHUNHIEM VARCHAR2(40),
KINHPHI NUMBER
)
Trang 9Tạo bảng (tt)
CREATE TABLE SVDT (
MASV CHAR(10) NOT NULL,
MADT CHAR(10) NOT NULL,
NOIA_D CHAR(40),
KETQUA FLOAT,
PRIMARY KEY (MASV, MADT),
CONSTRAINT SVDT_SV FOREIGN KEY
(MASV) REFERENCES SINHVIEN (MASV), CONSTRAINT SVDT_DT FOREIGN KEY
(MADT) REFERENCES DETAI(MADT)
Trang 10Thao tác CSDL (tt)
Kiểu ràng buộc Diễn giải
NULL/NOT NULL Cho phép/không cho phép cột chứa giá
trị rỗng
CHECK (Criteria) Giá trị nhập vào cột phải thỏa Criteria
UNIQUE Giá trị nhập vào cột phải là duy nhất
PRIMARY KEY Ràng buộc khóa chính cho cột
REFERENCES
<Table_name1>
(Column_name1)
Ràng buộc khóa ngoại cho cột sẽ tham
chiếu tới Column_name đã tồn tại trong bảng Table_name
Mô tả:
CONSTRAINT <constraint_name>[<constraint_type>]
Trang 11Thao tác CSDL (tt)
3 Sửa bảng
Thêm cột: ALTER TABLE <Tên_bảng> ADD
<Tên_cột> <Kiểu_dữ_liệu> [<RBTV>]
Xóa cột: ALTER TABLE <Tên_bảng>
DROP COLUMN <Tên_cột>
Thay đổi kiểu dữ liệu cột:
ALTER TABLE <Tên_bảng> MODIFY
<Tên_cột> <Kiểu_dữ_liệu_mới>
Trang 12)
Trang 13Sửa bảng (tt)
Mở rộng kiểu dữ liệu cho thuộc tính bảng:
ALTER TABLE HANGHOA
MODIFY DONGIA LONG
Trang 14Sửa bảng (tt)
Thay đổi RBTV:
ALTER TABLE SINHVIEN ADD
CONSTRAINT fk_sv FOREIGN KEY (MAKHOA)
REFERENCES KHOA(MAKHOA)
ALTER TABLE HANGHOA ADD CONSTRAINT fk_HH
PRIMIRY KEY (MAHG)
Xóa ràng buộc toàn vẹn trong bảng
ALTER TABLE SINHVIEN DROP CONSTRAINT fk_sv
Trang 16Thao tác dữ liệu bảng (tt)
5 Thêm dữ liệu
INSERT INTO Tênbảng [Cột1, Cột2, …]
VALUES (giátrị1, giátrị2, …)
VD:
INSERT INTO SVDT (Masv, MaDT, KQ)
VALUES (‘SV001’, ‘DT08’, 8)
Thêm nhiều dòng dữ liệu
INSERT INTO <Tên_bảng> [(ds_thuộc_tính)] SELECT <th_tính_1>, …, <th_tính_n>
FROM <ds_bảng>
[WHERE <đ_kiện>]
Trang 17- Các giá trị thuộc tính khóa không được trùng,
- Câu lệnh INSERT sẽ gặp lỗi nếu vi phạm RBTV (Khóa chính, tham chiếu, trùng tên,…), các thuộc tính có ràng buộc NOT NULL bắt buộc phải có giá trị
Trang 18II Truy vấn Select
1 Định danh
Tạo định danh ( SYNONYM ):Tạo một định danh (tên
gọi tắt) tham chiếu đến một đối tượng của một schema
CREATE SYNONYM < tênđịnhdanh > FOR
<tên schema>.< tên object >
Xóa định danh:
DROP SYNONYM < tên định danh >
VD: PHONG(MA_PHONG, TEN_PHONG)
CREATE SYNONYM P FOR PHONG;
INSERT INTO P(MA_PHONG, TEN_PHONG) VALUES (1, 'Dao tao');
SELECT * FROM P; # SELECT * FROM PHONG;
Trang 19Bài tập
Xác định khóa chính?
CONGNHAN (HOTEN_CN, NAMS_CN, NAM_VAO_N,
CH_MON)
THAMGIA (HOTEN_CN, STT_CTR, NGAY_TGIA, SO_NGAY)
KTRUCSU (HOTEN_KTS, NAMS_KTS, PHAI, NOI_TN,
DCHI_LL_KTS)
THIETKE (HOTEN_KTS, STT_CTR, THU_LAO)
CGTRINH (STT_CTR, TEN_CTR, DIACHI_CTR, TINH_THANH,
KINH_PHI, TEN_CHU, TEN_HAU, NGAY_BD)
CHUTHAU (TEN_THAU, TEL, DCHI_THAU)
CHUNHAN (TEN_CHU, DCHI_CHU)
Trang 20Bài tập (tt)
Xác định khóa ngoại?
CONGNHAN (HOTEN_CN, NAMS_CN, NAM_VAO_N,
THAMGIA (HOTEN_CN, STT_CTR, NGAY_TGIA, SO_NGAY)
KTRUCSU (HOTEN_KTS, NAMS_KTS, PHAI, NOI_TN,
DCHI_LL_KTS)
THIETKE (HOTEN_KTS, STT_CTR, THU_LAO)
CGTRINH (STT_CTR, TEN_CTR, DIACHI_CTR, TINH_THANH,
KINH_PHI, TEN_CHU, TEN_THAU, NGAY_BD)
CHUTHAU (TEN_THAU, TEL, DCHI_THAU)
CHUNHAN (TEN_CHU, DCHI_CHU)
Trang 21Bài tập (tt)
Tạo Synonym
CREATE SYNONYM <tên định danh>
FOR <tên schema>.<tên object>
CONGNHAN => CN THAMGIA => TG
KTRUCSU => KTS THIETKE => TK
CGTRINH => CgTr CHUTHAU => ChThau
CHUNHAN => ChNhan
Trang 22Truy vấn Select (tt)
2 Select
Select không có điều kiện
SELECT * | <Col1,Col2, …, Coln>
Trang 23Truy vấn Select (tt)
Select với Distinct | All
- Distinct: loại bỏ phần tử trùng nhau
AND, OR: kết hợp nhiều điều kiện
[NOT] LIKE: so sánh chuỗi
BETWEEN …AND…: so sánh trong khoảng
IS [NOT] NULL: tìm các bộ là (không) rỗng
[NOT] IN: tìm trong/ ngoài danh sách
- Các ký tự so sánh đại diện đối với chuỗi: ‘%’ (nhiều
Trang 24Truy vấn Select (tt)
Select nhiều bảng
SELECT * | <Danhsáchtrường>
FROM <Tênbảng1> [bídanh1] < loạikếtnối >
<Tênbảng2> [bídanh2] ON (<điềukiệnkếtnối>)
[ WHERE <điềukiệnkếtnối>[ AND | OR <điềukiệnchọn>]
Trong đó <loạikếtnối>:
JOIN : Kết nối trong với cột chỉ định
LEFT OUTER JOIN : kết trái
RIGHT OUTER JOIN : kết phải
FULL OUTER JOIN : kết đầy đủ NATURAL JOIN: kết tự nhiên
CROSS JOIN: kết liên bảng cho phép kết tất
cả các bộ có thể có (tương tự phép kết tích đề-các), khi
đó không cần bất kỳ điều kiện kết nối nào
24
Trang 26Bài tập select
1 In ra mã số, họ tên của tất cả sinh viên
2 In ra mã số, họ tên của tất cả sinh viên từ 30 tuổi trở
lên
3 Tìm họ tên sinh viên thực hiện tên đề tài, kết quả từ
9 trở lên
4 Tìm họ tên của tất cả sinh viên thực hiện đề tài (có
thể có sinh viên không thực hiện đề tài) gồm, họ tên sinh viên, mã đề tài, kết quả
5 Tìm tất cả họ tên chủ nhiệm và sinh viên
6 Tìm tất cả MASV có quê quán khác với nơi áp dụng
đề tài
7 Xóa tất cả những sinh viên chưa đăng ký đề tài nào
Trang 28TRUNCATE TABLE <Tên_bảng>
VD: Xóa những môn học dưới 20 tiết
DELETE FROM MON WHERE SOTIET < 20
Trang 29DELETE FROM SINHVIEN
WHERE EXISTS (SELECT MASV FROM SVDT WHERE SINHVIEN.MASV = SVDT.MASV AND
Trang 30Truy vấn Select (tt)
Nhận xét:
- Các lệnh UPDATE, DELETE có thể gây ra vi phạm RBTV (không cho sửa, xóa, hoặc xóa luôn các dòng dữ liệu tham chiếu hoặc dữ liệu tham chiếu sẽ là Null)
- Điều kiện trong mệnh đề WHERE sẽ được thực hiện cho các dòng thỏa điều kiện, nếu không
có mệnh đề WHERE toàn bộ bảng sẽ có ảnh hưởng
- Tránh vi phạm RBTV khi xóa, nên xóa các dữ liệu bảng nhiều trước, sau đó xóa bảng một
Trang 31Bài tập Select
Tìm tên và địa chỉ liên lạc các chủ thầu thi công công trình ở Cần Thơ
CGTRINH (STT_CTR, TEN_CTR, DIACHI_CTR,
TINH_THANH, KINH_PHI, TEN_CHU, TEN_THAU,
NGAY_BD)
CHUTHAU (TEN_THAU, TEL, DCHI_THAU)
SQL:
Select TEN_THAU, DCHI_THAU
From CGTRINH CT , CHUTHAU T
Where CT.TEN_THAU = T.TEN_THAU and
Trang 32Bài tập Select (tt)
1 Tìm tên và địa chỉ liên lạc của các chủ thầu thi công công trình ở Cần Thơ do kiến trúc sư Lê Kim Dung thiết kế
CGTRINH (STT_CTR, TEN_CTR, DIACHI_CTR,
TEN_THAU, NGAY_BD)
SQL: ???
32
Trang 33TEN_CHU, TEN_THAU, NGAY_BD)
Trang 34Bài tập Select (tt)
3 Tìm tên, năm sinh, năm vào nghề của công nhân
có chuyên môn hàn hoặc điện tham gia công trình của chủ thầu Lê Văn Sơn?
CONGNHAN ( HOTEN_CN, NAMS_CN, NAM_VAO_N , CH_MON )
THAMGIA (HOTEN_CN, STT_CTR, NGAY_TGIA,
SO_NGAY)
CGTRINH (STT_CTR, TEN_CTR, DIACHI_CTR,
TINH_THANH, KINH_PHI, TEN_CHU , TEN_THAU, NGAY_BD)
SQL???
Trang 35NGAY_BD)
Trang 36TINH_THANH, KINH_PHI, TEN_CHU, TEN_THAU, NGAY_BD)
SQL???
Trang 37Bài tập Select (tt)
6 Tìm tên và năm sinh của kiến trúc sư tốt nghiệp ở tp HCM và thiết kế ít nhất 1 công trình có kinh phí >400?
Trang 39Truy vấn lồng (tt)
Mục đích sử dụng:
– Điều kiện tìm kiếm lấy từ kết quả của câu select khác
– Giúp trả lời các câu hỏi
• Tìm dự án thi công dài nhất?
• Tìm kiến trúc sư có thù lao cao nhất?
• Tìm các tác giả có nhiều bài viết nhất?
…
Trang 40TRUY VẤN CON LỒNG NHAU (tt)
a Sử dụng truy vấn con với toán tử IN
Khi cần thực hiện phép kiểm tra giá trị của một biểu thức có xuất hiện (không xuất hiện) trong tập các giá trị của truy vấn con, ta có thể sử dụng toán
tử IN (NOT IN) như sau:
WHERE <biểu_thức> [NOT] IN (<truy_vấn_con>)
Ví dụ: Tìm những sinh viên không thực hiện đề tài
SELECT HOTENSV, HOCLUC FROM SINHVIEN
WHERE MASV NOT IN
(SELECT MASV FROM SV_DT)
Trang 41TRUY VẤN CON LỒNG NHAU (tt)
b Truy vấn con với EXISTS
Lượng từ EXISTS (NOT EXISTS) để kiểm tra xem một truy vấn con có trả về dòng kết quả nào hay không được sử dụng trong truy vấn con dưới dạng:
WHERE [ NOT ] EXISTS ( <truy_vấn_con> )
Ví dụ: cho biết họ tên của những sinh viên hiện chưa
có đăng ký đề tài nào
SELECT hotensv
WHERE NOT EXISTS ( SELECT masv *
Trang 42TRUY VẤN CON LỒNG NHAU (tt)
c Truy vấn con với mệnh đề HAVING
Một truy vấn con có thể được sử dụng trong mệnh
đề HAVING của một truy vấn khác Kết quả của truy vấn con được sử dụng để tạo điều kiện đối với các hàm gộp
Ví dụ: Cho biết mã, tên và trung bình điểm thi của các môn học có trung bình lớn hơn trung bình điểm của tất cả các môn học
SELECT KETQUA.MAMH,TENMH, AVG(DIEM)
FROM KETQUA,MONHOC
WHERE KETQUA.MAMH = MON.MAMH
GROUP BY KETQUA.MAMH,TENMH
HAVING AVG(DIEM ) > [All | Any | Some]
(SELECT AVG(DIEM) FROM KETQUA)
Trang 43TRUY VẤN CON LỒNG NHAU (tt)
d Thực hiện phép chia với truy vấn lồng nhau
Sử dụng toán tử NOT EXISTS để thực hiện:
Trang 44Phép chia với truy vấn lồng nhau (tt)
Ví dụ: Tìm thông tin sinh viên thực hiện tất cả các
Trang 45Truy vấn Select (tt)
2 Gom nhóm Group by
Tạo bảng tạm
WITH <tên bảng tạm> AS (<câu truy vấn con>)
[, <tên bảng tạm> AS (<câu truy vấn con>) [,…]]
Trang 46 Các hàm kết tập bao gồm: SUM, MAX, MIN, AVG
và COUNT
Đặt lại tên trường: Trong một số trường hợp tên trường của kết quả truy vấn không phù hợp ta cần đặt lại tên trường
Cú pháp:<Tên_trường_cũ> AS <Tên_trường_mới>
Trang 47Hàm thống kê (tt)
Cách sử dụng các hàm:
a Hàm SUM (<Tên_trường>): Trả về tổng giá trị của tất cả các dòng của một trường kiểu số
Ví dụ: Tính tổng kinh phí của tất cả các đề tài
SELECT SUM (Kinhphi) as Tong_KP FROM Detai;
b Hàm MAX (<Tên trường>): Trả về giá trị lớn
nhất trong tất cả các dòng của một trường
Ví dụ: Tìm kinh phí lớn nhất của tất cả các đề tài
SELECT MAX(Kinhphi) AS KP_MAX
Trang 48Cách sử dụng hàm (tt)
c Hàm MIN (<Tên trường>): Trả về giá trị nhỏ
nhất trong tất cả các dòng của một trường
Ví dụ: Tìm kinh phí nhỏ nhất của tất cả các đề tài
SELECT MIN(Kinhphi) AS KP_MIN FROM Detai
d Hàm AVG (<Tên_trường>): Trả về giá trị
trung bình cộng của tất cả các dòng một trường kiểu
số
Ví dụ: Tính trung bình cộng kinh phí của tất cả
các đề tài
SELECT AVG(Kinhphi) AS TBC_KP FROM Detai
Trang 49Cách sử dụng hàm (tt)
e Hàm COUNT (<Tên trường>): Đếm các dòng
trong bảng theo một hoặc một số trường nào đó
Ví dụ 1: In ra số lượng đề tài mà thầy Lê Đức Phúc
làm chủ nhiệm
SELECT COUNT(MaDT) AS So_DT
FROM Detai
WHERE Chunhiem = ‘Lê Đức Phúc’
Ví dụ 2: In ra họ tên của các giáo viên chủ nhiệm từ
2 đề tài trở lên
SELECT Chunhiem , COUNT(MaDT) AS SoLG FROM Detai
GROUP BY Chunhiem
Trang 50[ WHERE <Ðiều kiện> ]
HAVING <điều kiện chọn trên nhóm>
Trang 52GROUP BY (tt)
theo từng chủ thầu
CGTRINH (STT_CTR, TEN_CTR, DIACHI_CTR,
Trang 53GROUP BY (tt)
trình lớn hơn 25 triệu
THIETKE (HOTEN_KTS, STT_CTR, THU_LAO)
Select HOTEN_KTS, sum (THU_LAO) As
Trang 54GROUP BY (tt)
trình lớn hơn 25 triệu
THIETKE (HOTEN_KTS, STT_CTR, THU_LAO)
Select count(*) As Solg_KTS
From (Select HOTEN_KTS, sum (THU_LAO)
Having sum (THU_LAO) > 25);
Trang 55CGTRINH (STT_CTR, TEN_CTR, DIACHI_CTR,
TEN_THAU, NGAY_BD)
with t1 as (
Select STT_CTR, count(*) As TongSoCN
From THAMGIA
Trang 56Where a.STT_CTR = b.STT_CTR and
TongSoCN = (Select Max (TongSoCN)
Trang 57IV Các hàm xử lý dữ liệu
1 LENGTH (<chuỗi>): Trả về chiều dài chuỗi
Select LENGTH ('lop DHCNTT') LEN
From Dual len = 10
2 INSTR(<chuỗi a>, <chuỗi con b>,
<vị trí bắt đầu tìm n>,<số lần xuất hiện m>)
Tìm vị trí chuỗi b trong chuỗi a bắt đầu từ vị trí n,
lần xuất hiện thứ m
n<0: tìm từ phải sang trái
Select INSTR ('CORORATE FLOOR','OR',3,2)
Trang 58Các hàm xử lý dữ liệu (tt)
3 SUBSTR (<chuỗi a>, <vị trí bắt đầu cắt lấy n>, <số ký tự cần cắt m>)
Cắt lấy chuỗi con của chuỗi a, lấy từ vị trí n về
phải m ký tự, nếu không chỉ m thì lấy cho đến cuối chuỗi
n<0: vị trí cắt đếm từ phải sang trái
Select SUBSTR('ORACLE',1,3) Substring
From Dual ORA
4 CONCAT (<chuỗia>,<chuỗib>): Nối 2 chuỗi a, b
Select CONCAT ('Lop DHCNTT',' Khoa SP Tin') Substring
Toan-From Dual Lop DHCNTT Khoa SP Toan-Tin
Trang 59Các hàm xử lý dữ liệu (tt)
5 SUBOWER/UPPER/INITCAPSTR (<chuỗi>)
Chuyển chuỗi thành chuỗi viết thường /hoa /ký
tự đầu các từ viết hoa
6 LTRIM/RTRIM(<chuỗi a>, <chuỗi b>)
Loại bỏ chuỗi b ở bên trái/ phải chuỗi a
Select LTRIM(‘khoa su pham toan - tin’, ’khoa’) From Dual; su pham toan - tin
Select RTRIM(‘LAST WORDx’, ’xy’) FROM Dual; LAST WORD
Trang 60Các hàm xử lý dữ liệu (tt)
7 REPLACE (chuỗi a, chuỗi b [,chuỗi c])
Thay tất cả các chuỗi b có trong chuỗi a bằng
Trang 61Các hàm xử lý dữ liệu (tt)
8 SYSDATE(chuỗi a, chuỗi b [,chuỗi c])
Hàm lấy ngày tháng hiện hành của hệ thống
SELECT SYSDATE FROM DUAL
9 EXTRACT (YEAR|MONTH|DAY FROM <chuỗi ngày>) Tách lấy năm|tháng|ngày của <chuỗi ngày>
Select EXTRACT(Month FROM DATE
‘2001-05-07’) FROM Dual; 5
Select EXTRACT(DAY FROM Sysdate)
FROM Dual;
Trang 62Các hàm xử lý dữ liệu (tt)
10 MONTHS_BETWEEN(<ngày 1>, <ngày 2>)
Cho biết số tháng giữa <ngày1> và <ngày2>
Trang 63Các hàm xử lý dữ liệu (tt)
12 NEXT_DAY(<ngày>, <thứ>)
Cho biết <thứ> sau <ngày> là ngày nào
Select NEXT_DAY(DATE ‘2015-04-10’, 'friday')
Trang 64Các hàm xử lý dữ liệu (tt)
14 TO_CHAR(<số>): Chuyển số sang chuỗi
TO_CHAR(<ngày>, <chuỗi định dạng>):Chuyển
ngày sang chuỗi theo định dạng
Select TO_CHAR(DATE'2011-09-20',
'DD-MM-YYYY') FROM Dual; ‘20-09-2011’
16 TO_NUMBER(<chuỗi ký số>): Chuyển chuỗi
ký số sang dạng số
Select TO_NUMBER('123')+TO_NUMBER('34')
FROM Dual; => 157