Chương 3
SQL
Structured Query Language
Phần 1
Giới thiệu
SQL là ngôn ngữ CSDL Quan hệ chuẩn
Được sử dụng trong các DBMS thương mại
Được phát triển từ IBM (vào đầu 70s, Sequel)
Phiên bản chuẩn được ANSI công bố đầu tiên vào 1986
SQL là ngôn ngữ khai báo cấp cao
Người dùng chỉ ra kết quả cần đạt là gì
Tối ưu hóa và quyết định thi hành ntn là do DBMS
Giới thiệu
SQL bao gồm các phần :
DDL (Data Definition Language)
Định nghĩa Database
Định nghĩa cấu trúc Bảng
Định nghĩa ràng buộc tồn vẹn
Định nghĩa khung nhìn
DML (Data Manipulation Language)
Truy vấn dữ liệu
Các thao tác thêm, xóa , sửa dữ liệu
Kiểm soát các transaction
DCL (Data Control Language)
Phân quyền người dùng
Giới thiệu
Trong
một số DBMS, SQL được mở rộng để
tăng khả năng lập trình thủ tục
T-SQL trong MS SQL Server cho phép
dùng cấu trúc điều khiển, biến cục bộ, cursor
Tạo các procedure, trigger
Ngôn ngữ thao tác dữ liệu - DML
DML
bao gồm các lệnh : SELECT, INSERT,
UPDATE, DELETE
Lệnh Select là lệnh thường dùng nhất
Dùng để truy vấn dữ liệu (query data)
Lấy và hiển thị dữ liệu từ một hay nhiều bảng
Lệnh Select
Cú
pháp :
SELECT [ DISTINCT | ALL] [ * | têncột [AS tên mới]
[,…]
FROM tênbảng [alias] [,…]
[WHERE điềukiện ]
[GROUP BY danhsáchcột ] [HAVING điềukiện ]
[ORDER BY danhsáchcột ]
(*) Các ví dụ trong chương này sử dụng CSDL Quản lý Bán hàng , xem slide
cuối
Câu truy vấn đơn giản
Câu lệnh Select… From…
Vd: Hiển thị Họ, tên , phái của các nhân viên
Select Honv, Tennv, Phai
From Nhanvien
Tương đương với phép chiếu trong ĐSQH
Honv, Tennv, Phai (NHANVIEN)
Hiển thị tất cả các cột , bằng sử dụng *
Vd: Hiển thị danh sách các nhân viên
Select *
From Nhanvien
Câu truy vấn đơn giản
Sử
dụng Distinct để loại bỏ các bộ trùng nhau
Vd: Danh sách nơi sinh của các nhân viên
Select DISTINCT noisinh
From Nhanvien
Câu truy vấn đơn giản
Hiển thị các cột tính tốn (Calculated fields)
Sử dụng hàm trong cột tính tốn
Các cột có thể đặt tên mới – alias
Vd1: hiển thị chi tiết hóa đơn gồm mahd, masp, soluong,
dongia và thành tiền
Select mahd, masp, soluong,dongia, soluong*dongia AS
thanhtien From chitiethoadon
Vd2: hiển thị họ tên, và năm sinh của nhân viên
Select Honv+Tennv as HT , year(ngaysinh) as NS
From Nhanvien
Lệnh Select - Mệnh đề Where
Sử
dụng để chọn một số bộ
Chứa các biểu thức logic, xác định các bộ sẽ
được chọn :
Các cột nằm trong bảng có trong mệnh đề From
Các toán tử so sánh, toán tử logic And, Or, Not, tóan
tử Between
Các tốn tử khác : Like, in, …
Lệnh Select - Mệnh đề Where
Vd1: Hiển thị các mặt hàng có đơn giá >100
Select Tensp , dongia
From Sanpham
Where dongia > 100
Vd2: Hiển thị các mặt hàng có đơn giá >100 hoặc đơn giá <50
Select Tensp , dongia
From Sanpham
Where dongia > 100 or dongia < 50
Vd3: Hiển thị các mặt hàng có đơn giá trong khoảng từ 50 đến 100
Select Tensp , dongia
From Sanpham
Where dongia between 50 and 100
Lệnh Select - Mệnh đề Where
Sử dụng toán tử Like/ Not Like trong biểu thức so sánh
với chuỗi
Like khác với toán tử =
Sử dụng các ký tự thay thế %, _
Vd4: Hiển thị danh sách nhân viên có họ “Nguyễn”
Select *
From Nhanvien
Where Honv like “Nguyễn%”
Vd5: hiển thị danh sách các nhân viên có địa chỉ ở đường Nguyễn
Trãi
Lệnh Select - Mệnh đề Where
Sử dụng IS NULL / IS NOT NULL để so sánh với giá trị
NULL
Vd: Hiển thị danh sách các Nhân viên chưa biết số điện thoại
Select * From Nhanvien
Where dienthoai IS NULL
Vd: mệnh đề Where có thể chứa biểu thức cột
select Honv, Tennv
From Nhanvien
where left(Honv,1) like ‘N'
Lệnh Select - Mệnh đề Order
By
Sắp
xếp các bộ trong quan hệ kết quả theo
giá trị của một / một số cột
Sử dụng ASC hay DESC để chỉ ra chiều sắp
xếp (mặc định là ASC)
Vd
Select *
From Nhanvien
Order by Ngaysinh ASC, Tennv DESC
Lệnh Select – sử dụng các hàm
thống kê
Còn gọi là Aggregate Functions
Hàm Count, Sum, Avg, Min, Max
Vd: hiển thị tổng trị giá tất cả các hóa đơn
Select sum(soluong*dongia)
From Chitiethoadon
Vd: Hiển thị đơn giá lớn nhất, nhỏ nhất và trung bình của
các mặt hàng
Select Max(dongia) , Min(dongia), AVG(dongia)
From Sanpham
Lệnh Select – sử dụng các hàm
thống kê
Hàm count(tencot), count(*) và count(distinct)
Vd1: cho biết số lượng nhân viên
Select Count(Noisinh) From Nhanvien
Select Count(Distinct Noisinh) From Nhanvien
Select Count(*) From Nhanvien
Vd2: Hiển thị tổng số hóa đơn , tổng trị giá các
hóa đơn ?
Lệnh Select – mệnh đề Group by
Gom nhóm các dịng dữ liệu và tạo ra một dịng chung
cho mỗi nhóm
Hiển thị các tổng phụ (subtotal)
Vd1: Hiển thị tổng trị giá của tất cả các hóa đơn
Select sum(soluong*dongia)
From Chitiethoadon
Vd2: Hiển thị tổng trị giá của từng hóa đơn
Select Mahd, maSp, sum(soluong*dongia) As TongTg
From Chitiethoadon
Group By Mahd
Lệnh Select – mệnh đề Group by
MÃ
HĐ
MÃ
SP
SỐ
LƯNG
ĐƠN
GIÁ
10148
3
20.00
2.20
10148
4
30.00
16.50
10148
9
20.00
13.20
10150
2
22.00
44.00
10150
4
10.00
16.50
10156
8
20.00
68.75
MÃ
HĐ
TONGTGÙ
10148
803
10150
1133
10156
68.75
Select Mahd, sum(soluong*dongia)
From Chitiethoadon
Group By Mahd
Lệnh Select – mệnh đề Group by
Chú ý : các cột xuất hiện trong mệnh đề Select phải
có trong mệnh đề Group By, ngoại trừ các cột được
tạo từ hàm thống kê.
Vd3:
Select Manv, LoaiHD, count(Mahd)
From Hoadon
Group by Manv, LoaiHD
Lệnh Select – mệnh đề Having
Đi sau mệnh đề Group by, được sử dụng để lọc các
nhóm
Giống như mệnh đề Where : Chứa các biểu thức
điều kiện
Select Mahd, sum(soluong*dongia)
From Chitiethoadon
Group By Mahd
Having sum(soluong*dongia) > 1000
Truy vấn lồng - Subqueries
Một
câu lệnh select (inner) được nhúng vào
trong một câu lệnh select khác (outer)
Kết quả của lệnh inner select, hay subselect được
sử dụng trong lệnh outer select để xác định tập kết
quả
Thường đặt trong mệnh đề Where, Having của lệnh
outer select
Câu
subselect cũng được sử dụng trong một số
lệnh khác như INSERT, DELETE, UPDATE
Truy vấn lồng - Subqueries
Câu
subSelect có thể trả về một giá trị đơn,
hay một table
Vd1:
Select Masp, Tensp, Dongia
From Sanpham
Where Dongia > (Select Avg(Dongia) From
Sanpham)
Truy vấn lồng - Subqueries
So
sánh với một tập hợp, sử dụng
IN/NOT IN,
>ALL,
>ANY (hay SOME)
Xét lược đồ quan hệ:
Nhanvien(Manv, Honv, Tennv, Phai, Diachi,
Chucvu, Luong)
Truy vấn lồng - Subqueries
Vd2: hiển thị những nhân viên có lương lớn hơn lương của ít nhất
một nhân viên có chức vụ là ‘trưởng phịng’
Select T.Manv, T.Chucvu
From Nhanvien As T, Nhanvien As S
Where T.Luong > S.Luong
And S.Chucvu like ‘trưởng phòng’
Dùng subQuery:
Select Manv
From Nhanvien
Where Luong >Any (Select Luong From Nhanvien
Where Chucvu like ‘trưởng phòng’)
Truy vấn lồng - Subqueries
Vd3: hiển thị những nhân viên có lương lớn hơn lương của tất cả
các nhân viên có chức vụ là ‘trưởng phịng’
Select Manv
From Nhanvien
Where Luong >All (Select Luong From Nhanvien
Where Chucvu like ‘trưởng phòng’ )
Vd4: hiển thị những nhân viên có bán hàng trong tháng 5
Select Manv, Honv, Tennv
From Nhanvien
Where Manv IN (Select Manv From Hoadon
Where Month(NgaylapHD) = 5 )