Dùng để thực hiện tổng hợp dữ liệu được lưu trữ trong một hay nhiều bảng thành một tập kết quả. Dữ liệu trong tập kết có thể được lọc theo điều kiện và sắp xếp theo nhu cầu của người sử dụng.Truy vấn select còn được dùng để thực hiện việc tính toán thống kê trên tập dữ liệu kết quả trả về của nó.
Trang 2• Dùng để thực hiện tổng hợp dữ liệu được lưu trữ trong một hay nhiều bảng thành một tập kết quả
• Dữ liệu trong tập kết có thể được lọc theo điều kiện và sắp xếp theo nhu cầu của người sử dụng.
• Truy vấn select còn được dùng để thực hiện việc tính toán thống kê trên tập dữ liệu kết quả trả về của nó.
Trang 4• Để lấy dữ liệu từ nhiều bảng, chúng ta có thể dùng
SELECT FROM kết hợp với mệnh đề JOIN để kết nối hai bảng có quan hệ với nhau.
• Cú pháp:
SELECT * | Danh_sách_các_cột
FROM Tên_bảng_1 INNER | LEFT [OUTER] | RIGHT [OUTER]
| FULL [ OUTER] JOIN Tên_bang_2 ON Điều_kiện_ghép_nối;
Trang 5– RIGHT JOIN: Ngược lại LEFT JOIN
– FULL JOIN: Lấy các dòng có Ten_bang_1 nhưng không có trong Ten_bang_2, các dòng có Ten_bang_2 nhưng không có
Ten_bang_1 và các dòng thỏa mãn điều kiện kết nối
– Điều kiện ghép nối : gần giống điều kiện của mệnh đề Where
Trang 6• Sử dụng mệnh đề WHERE kết hợp với mệnh đề SELECT FROM để chúng ta có thể lọc ra các dòng dữ liệu thỏa mãn điều kiện được đưa ra.
• Cú pháp:
– Điều_kiện_lọc: là một biểu thức luận lý làm điều kiện chỉ định việc lọc
mẩu tin Có thể sử dụng các phép toán sánh, logic, Like và kí tự đại diện
%, []
• Ví dụ: Lấy ra các sinh viên thuộc khoa Tin học
SELECT * FROM Sinhvien WHERE Makh=‘TH’
SELECT * | Danh_sách_các_cột
FROM Tên_bảng
WHERE <Điều_kiện_lọc>;
Trang 7• Chú ý khi xây dựng điều kiện lọc
– Giá trị kiểu chuỗi được trong cặp dấu nháy đơn ‘’
– Khi dùng giá trị kiểu ngay so sánh với cột kiểu datetime, giá trị đó được đặt trong cặp dấu nháy đơn ‘’ và nên nhập theo dạng năm-tháng-ngày Ví dụ: ‘2005-12-31’
– Để so sánh với giá trị NULL, chúng ta dùng phép toán IS Ví dụ
@a is null
– Sử dụng phép toán Like khi field được chọn để lọc dữ liệu là kiểu chuỗi Like là phép toán so sánh gần đúng và luôn được sử dụng với kí tự đại diện như % (thay thế cho một chuỗi), _ (thay thế cho một kí tự),
Ví dụ:
+ Biểu thức lọc những sinh viên có tên bắt dầu bằng chữ T:
TenSv Like ‘T%’
Trang 8• Dùng để giới hạn các dòng dữ liệu trùng nhau trong tập kết quả.
Trang 9• Được sử dụng cùng với SELECT FROM khi muốn sắp xếp các dòng trong tập kết quả theo cột hoặc biểu thức nào đó.
• Cú pháp:
– Chú ý: Tên cột để sắp xếp có thể thể là bí danh(alias) danh hoặc
số thự tự của cột trong Danh_sách_các_cột.
Trang 10• Ví dụ: Đưa ra danh sách sinh viên sắp xếp tên từ
A->Z, và học bổng theo chiều giảm dần
SELECT Masv, Hosv, Tensv, Ngaysinh, Hocbong
FROM sinhvien
ORDER BY Tensv, Hocbong DESC
Trang 11• SELECT FROM kết hợp với mệnh đề GROUP BY cho phép chúng ta có thể nhóm dữ liệu của các dòng trong một bảng và có thể sử dụng các hàm tính toán đi kèm để thực hiện thống kê trên mỗi nhóm.
• Cú pháp
– Các_hàm_thống_kê: SUM, COUNT, AVG, MIN, MAX
– Danh_sách_các_cột_nhóm_dữ_liệu: Tên các cột được dùng để nhóm dữ liệu.
SELECT Danh_sách_các_cột, Các_hàm_thống_kê
Trang 12• Ví dụ
– Cho biết khoa nào có đông sinh viên nhất, gồm Mã khoa, Tên
khoa, Tổng số sinh viên
SELECT Top 1 With ties Khoa.Makh,Tenkhoa, Count(*) As TongSoSV
FROM Khoa Inner Join SinhVien On Khoa.makh=SinhVien.makh
GROUP BY Khoa.Makh,Tenkhoa
ORDER BY Count(*) Desc
– Cho biết 3 sinh viên có điểm thi môn Đồ họa thấp nhất
Thông tin gồm Họ tên SV, Tên khoa, Tên môn, Điểm
SELECT Top 3 Hosv+‘ ’+ Tensv as Hoten, Tenkh, tenmh, diem,monhoc.mamh FROM (Khoa Inner Join SinhVien On Khoa.makh=SinhVien.makh)
Inner join (Monhoc inner join Ketqua On ketqua.mamh=Monhoc.mamh)
On Ketqua.masv=sinhvien.masv WHERE monhoc.mamh='04'
ORDER BY diem asc
Trang 13• HAVING, mệnh đề được đặt sau GROUP BY dùng để lọc dữ liệu sau khi đã được tính toán thống kê theo nhóm Having chỉ được dùng khi
có Group By
• Cú pháp
– Các_hàm_thống_kê: SUM, COUNT, AVG, MIN, MAX
– Danh_sách_các_cột_nhóm_dữ_liệu: Tên các cột được dùng để nhóm
Trang 14• Ví dụ
– Liệt kê các sinh viên thi nhiều hơn 4 môn, gồm mã sinh viên, tên
sinh viên, số môn thi
SELECT Sinhvien.Masv, hosv+ ' ' + Tensv as Hoten, count(*) as
SoMonthi
FROM SinhVien Inner Join Ketqua On ketqua.masv=SinhVien.masv GROUP BY Sinhvien.Masv, hosv+ ' ' + Tensv
HAVING count(*)>=4
– Cho biết trung bình điểm thi của từng môn, chỉ lấy môn nào có
trung bình điểm thi lớn hơn 6 Thông tin gồm: mã môn, tên môn, điểm trung bình
SELECT monhoc.Mamh, Tenmh, avg(diem)
FROM monhoc INNER JOIN Ketqua ON Monhoc.mamh=Ketqua.mamh GROUP BY monhoc.Mamh, Tenmh
HAVING avg(diem)>6
Trang 15– Liệt kê các sinh viên thi rớt trên 2 môn (có điểm<5), gồm mã sinh viên, tên
sinh viên, mã khoa
SELECT Sinhvien.Masv, hosv+ ' ' + Tensv as Hoten, Count(*) as SoMonTruot FROM SinhVien Inner Join Ketqua On ketqua.masv = SinhVien.masv
WHERE Diem <5
GROUP BY Sinhvien.Masv, hosv+ ' ' + Tensv
HAVING Count(*)>=2
– Cho biết khoa có 5 sinh viên Nam trở lên Thông tin gồm có mã khoa, tên
khoa, tổng số sinh viên nam
SELECT Khoa.Makh, Tenkh, Count(*) as TongSVNam
FROM khoa INNER JOIN sinhvien ON Khoa.makh=SinhVien.makh WHERE Phai=0
GROUP BY Khoa.Makh, Tenkh
HAVING Count(*)>5
Trang 16• Mệnh đề UNION cho phép ghép kết quả của câu truy vấn thứ hai vào kết quả của câu truy vấn thứ nhất:
} Câu truy vấn thứ nhất
} Câu truy vấn thứ hai
Mệnh đề nối hai truy vấn
Trang 17• Ví dụ 1 :
SELECT * FROM sinhvien WHERE makh='TH'
UNION ALL
SELECT * FROM sinhvien WHERE makh='TR'
– Cho biết số dòng trả về của hai truy vấn sau
Trang 19• Dùng để lấy ra các bản ghi dựa trên vị trí của chúng trong tập các dòng được chọn bởi SELECT LIMIT có thể dùng với một tham số hoặc hai tham số.
lấy 3 sinh viên có học bổng
cao nhất
lấy 10 dòng bắt đầu từ dòng
có vị trí 20
Trang 20• Ví dụ 1: Lấy ra sinh viên có học bổng cao nhất
• Ví dụ 2: Lấy ngẫu nhiên 5 sinh viên trong bảng sinhvien
SELECT Masv, Hosv, Tensv, Ngaysinh, Hocbong
Trang 21• Là một câu truy vấn SELECT được lồng vào các câu truy vấn khác nhằm thực hiện các truy vấn tính toán phức tạp.
• Một số chú ý khi sử dụng truy vấn con:
– Truy vấn con bắt buộc phải đặt trong cặp ngoặc ( )
– Chỉ được phép tham chiếu đến tên một cột hoặc một biểu thức sẽ trả về giá trị trong truy vấn con
– Kết quả trả về của truy vấn con có thể trả về là một giá trị đơn lẻ, hoặc một danh sách giá trị
Truy vấn con được viết ở phần Danh_sách_các_cột của câu truy
vấn chính phải là câu truy vấn con chỉ trả về duy nhất một giá trị Còn truy vấn con được sử dụng trong các mệnh đề HAVING, WHERE hoặc sau các từ khóa IN, NOT IN, ANY, ALL, hàm Exists thì có thể trả về danh sách các giá trị
Trang 22• Một số phép toán thường sử dụng khi sử dụng truy vấn con
Phép toán IN tương đương với =ANY
Phép toán NOT IN tương đương với <>ANY
Trang 23• Ví dụ 1: Đưa ra các khoa chưa có sinh viên
SELECT * FROM khoa
WHERE khoa NOT IN ( SELECT Makh FROM sinhvien)
Trang 24• Truy vấn cập nhật phép thực hện các thao cập nhật
dữ liệu như: thêm mới, xóa, sửa dữ liệu
Trang 25• Lệnh INSERT cho phép thêm một dòng mới hoặc nhiều dòng dự liệu vào bảng.
• Cú pháp thêm một dòng dữ liệu mới vào bảng
• Cú pháp thêm nhiều dòng dữ liệu mới vào bảng
INSERT INTO <tên_bảng>(Danh_sách_cột)
Trang 26• Một số lưu ý khi thêm mới
– Khóa chính không được trùng và không được bỏ
trống Nếu khóa chính là cột AUTO_INCREMENT (tự động tăng) thì không được gán giá trị khi thêm mới.
– Với cột khóa ngoại: Giá trị cho cột khóa ngoại phải tồn tại ở cột khóa chính trong bảng liên quan.
– Danh sách giá trị phải tương ứng với danh sách cột
Trang 27• Cú pháp
– Trong đó
• Từ khóa LOW_PRIORITY được dùng để trì hoãn việc thực thi câu lệnh UPDATE cho đến khi không có bất kì ứng dụng khách nào đọc dữ liệu trên CSDL nữa thì mới tiến hành thực hiện
câu lệnh UPDATE
• Từ khóa IGNORE được sử dụng để chỉ ra cần thực thi lệnh update ngay cả khi xảy ra lỗi trong quá trình thực hiện câu lệnh UPDATE
UPDATE [LOW_PRIORITY] [IGNORE]Tên_bảng
SET Tên_cột_1=giá_trị_1 , Tên_cột_2=giá_trị_2, …
WHERE Điều_kiện_Cập_nhật
Trang 28DELETE Tên_bảng_1, Tên_bảng_2
FROM Tên_bảng_1 INNER JOIN Tên_bảng_2 ON
Điều_kiện_ghép_dữ_liệu
WHERE Điều_kiện_xoá
DELETE Tên_bảng_1, Tên_bảng_2
USING Tên_bảng_1, Tên_bảng_2
WHERE Điều_kiện_xoá
Trang 29• Ví dụ 1: xóa các sinh viên khoa anh văn
• Ví dụ 2: Xóa khoa tin học đồng thời xóa các sinh viên thuộc khoa tin học
Hoặc
DELETE FROM sinhvien WHERE sinhvien.makh= 'AV'
DELETE khoa, sinhvien
WHERE sinhvien.makh= 'TH'
DELETE FROM khoa, sinhvien
USING khoa INNER JOIN sinhvien ON khoa.makh=sinhvien.makh
WHERE khoa.makh=sinhvien.makh AND sinhvien.makh= 'TH'