II. Ngôn ngữ thao tác dữ liệu
1. Câu lệnh Select
Câu lệnh SELECT được sử dụng để truy xuất dữ liệu từ các dòng và các cột của một hay nhiều bảng, khung nhìn. Câu lệnh này có thể dùng để thực hiện phép chọn (tức là truy xuất một tập con các dòng trong một hay nhiều bảng), phép chiếu (tức là truy xuất một tập con các cột trong một hay nhiều bảng) và phép nối (tức là liên kết các dòng trong hai hay nhiều bảng để truy xuất dữ liệu). Ngoài ra, câu lệnh này còn cung cấp khả năng thực hiện các thao tác truy vấn và thống kê dữ liệu phức tạp khác.
FROM <danh sách bảng/khung nhìn> [WHERE <Biểu thức điều kiện>] [GROUP BY <danh sách cột>] [HAVING <điều kiện>]
[ORDER BY <Tên cột/ Số thứ tự cột/Biểu thức> [ASC/DESC]] [COMPUTE <danh sách hàm gộp [BY <danh sách cột>]>]
Các thành phần nằm trong cặp dấu [ ] là tùy chọn tức là có thể có hoặc không. Các thành phần trong câu lệnh SELECT nếu được sử dụng phải tuân theo đúng thứ tự như trong cú pháp. Nếu không, câu lệnh sẽ được xem là không hợp lệ.
Câu lệnh SELECT được sử dụng để tác động lên các bảng dữ liệu và kết quả của câu lệnh cũng được hiển thị dưới dạng bảng, tức là một tập hợp các dòng và các cột (ngoại trừ trường hợp sử dụng câu lệnh SELECT với mệnh đề COMPUTE).
Trong phần này chúng tôi sử dụng cơ sở dữ liệu về quản lí đơn hàng (QLDH) để làm ví dụ.
a. Mệnh đề From
Mệnh đề FROM trong câu lệnh SELECT được sử dung nhằm chỉ định các bảng và khung nhìn cần truy xuất dữ liệu. Sau FROM là danh sách tên của các bảng
Ví dụ lệnh sau hiển thị họ đệm, tên và địa chỉ của các khách hàng được lưu trữ trong bảng KhachHang
select HoDem, Ten,DiaChi from KhachHang
Ta cũng có thể hiển thị tất cả các cột của bảng bằng cách sử dụng lệnh sau: select * from KhachHang
Nếu tên bảng chứa khoảng trắng ta phải đặt tên bảng trong cặp [ ] hoặc “ “ như sau:
select * from [Khach Hang] Hoặc
select * from “Khach Hang“
Đổi tên các cột trong kết quả hiển thị
Khi kết quả được hiển thị, tiêu đề của các cột mặc định sẽ là tên của các cột khi bạn tạo bảng. Tuy nhiên, để các tiêu đề trở nên thân thiện hơn, ta có thể đổi tên các tiêu đề của các cột khi hiển thị. Để làm được việc này, ta có thể sử dụng một trong hai cách viết sau:
<tiêu đề cột> = <tên cột> hoặc:
Tên cho tiêu đề cột Ten và Địa chỉ thay cho tiêu đề cột DiaChi khi kết quả đươc hiển thị:
select 'Họ đệm'= HoDem,'Tên'=Ten,'Địa chỉ'= DiaChi from KhachHang Hoặc:
select HoDem 'Họ đệm’,Ten 'Tên',DiaChi 'Địa chỉ' from KhachHang Kết quả hiển thị như sau:
Sử dụng tên giản đồ
Trong SQL Server 2005 các tên bảng có thể có phần tiền tố là tên giản đồ, phân cách giữa tên giản đồ và tên bảng là dấu chấm. Mục đích của giản đồ là để nhóm các đối tượng theo loại và làm cho CSDL phức tạp và lớn trở lên dễ quản lí hơn. Nếu bạn là người quản trị thì dbo (database owner) là giản đồ ngầm định.
Ví dụ:
select * from dbo.KhachHang
Đặt bí danh cho cột
Trong mệnh đề FROM có thể sử dụng bí danh (alias) nhằm làm cho câu truy vấn dễ nhìn hơn. Ta có hai cách để đặt bí danh cho cột như sau:
<Tên cột> AS <Bí danh> hoặc
select * from khachhang k where k.MaKhachHang = 2
Cấu trúc CASE
Trong câu lệnh SELECT, ta có thể sử dụng cấu trúc CASE để thay đổi cách hiển thị kết quả ra màn hình. Ví dụ các câu lệnh sau cho biết họ đệm, tên, địa chỉ và giới tính của khách hàng nhưng với giới tính thay vì hiển thị giá trị là 1 hoặc 0 sẽ hiển thị là “Nam” hoặc “Nữ”.
select 'Họ đệm' = HoDem,'Tên'=Ten,'Địa chỉ'= DiaChi,
'Giới tính' = case
when GioiTinh = 1 then N'Nam' when GioiTinh = 0 then N'Nữ' else N'Không có dữ liệu'
end from KhachHang
Kí tự N trước một chuỗi chỉ ra chuỗi này có định dạng Unicode
Danh sách chọn trong câu lệnh SELECT có thể có các biểu thức số học. Khi đó kết quả của biểu thức sẽ là một cột trong kết quả truy vấn. Ví dụ:
select 'Họ và tên' = HoDem + ' ' + Ten,'Địa chỉ' = DiaChi from KhachHang
Từ khóa Top
Từ khoá TOP được sử dụng trong câu lệnh SELECT để chỉ định tập hợp các dòng đầu tiên được trả về trong truy vấn. Tập hợp các dòng đó có thể là một con số hoặc theo tỷ lên phần trăm các dòng dữ liệu.
Ví dụ bạn muốn nhận được 10 dòng đầu tiên từ bảng KhachHang bạn thực hiện câu lệnh truy vấn sau:
select Top 10 * from KhachHang
Nếu bạn muốn số dòng kết quả nhận được bằng 5% tổng số dòng của bảng bạn thực hiện như sau:
select Top 5 percent * from KhachHang
Từ khoá DISTINCT
Từ khoá DISTINCT được sử dụng trong câu lệnh SELECT nhằm loại bỏ ra khỏi kết quả truy vấn những dòng dữ liệu có giá trị giống nhau.
MaNhomHang --- 1 3 4 4 2 2 7 7 7 1 1 3 2 5 5 6 6 5 6 (19 row(s) affected) Nhưng nếu bạn sử dụng câu lệnh:
select distinct MaNhomHang from DanhMucHang Kết quả như sau:
MaNhomHang --- 1 2 3 4 5 6 7 (7 row(s) affected) b. Mệnh đề WHERE
Mệnh đề Where cho phép ta lọc dữ liệu được trả về bởi lệnh Select. Sau mệnh đề Where là một biểu thức logic và chỉ những dòng dữ liệu nào thoả mãn điều kiện được chỉ định mới được hiển thị trong kết quả truy vấn.
Ví dụ câu lệnh sau lọc ra các khách hàng là nữ select * from khachhang
where gioitinh = 0
Mệnh đề Where cho phép ta sử dụng rất nhiều các toán tử so sánh, các toán tử logic và các từ khóa khác để lọc dữ liệu trong một phạm vi nào đó.
Toán tử Ý nghĩa = So sánh bằng > So sánh lớn hơn >= So sánh lớn hơn hoặc bằng !> So sánh không lớn hơn < So sánh nhỏ hơn <= So sánh nhỏ hơn hoặc bằng !< So sánh không nhỏ hơn <> So sánh khác
Ví dụ sau hiển thị họ tên và địa chỉ của những khách hàng có mã khách hàng lớn hơn 4
select 'Họ và tên' = HoDem + ' ' + Ten,'Địa chỉ' = DiaChi from KhachHang
where MaKhachHang > 4
Các toán tử logic And, Or và Not
Ta có thể kết hợp các toán tử so sánh với các toán tử logic. Ví dụ các lệnh sau lọc ra những mặt hàng có giá lớn hơn 10000 và nhỏ hơn 50000
select * from DanhMucHang
where DonGia > 10000 and DonGia < 50000
Kiểm tra giới hạn của dữ liệu
Từ khoá BETWEEN và NOT BETWEEN kiểm tra dữ liệu trong một cột có nằm trong hoặc không nằm trong khoảng giá trị nào đó hay không. Câu lệnh sau lọc ra những mặt hàng có giá nằm trong khoảng từ 10000 đến 50000
select * from DanhMucHang
where DonGia between 10000 and 50000
Ví dụ để lọc ra các đơn đặt hàng trong khoảng ngày 25/1/2010 và 31/1/2010 ta thực hiện như sau:
select * from donhang
where ngaydathang between '1/25/2010' and '1/31/2010'
Từ khóa IN và NOT IN
Toán tử này dùng để xác định giá trị của một cột với một giá trị trong danh sách. Ví dụ để hiển thị thông tin của các khách hàng có mã khách hàng là 2, 4, 5, 7 hoặc 8 ta thực hiện câu lệnh sau:
where MaKhachHang IN (2,4,5,7,8)
Toán tử LIKE và NOT LIKE
Dùng để so khớp các giá trị chuỗi theo mẫu, mẫu ở đây là các kí tự đại diện.
Kí tựđại diện Ý nghĩa
% Chuỗi ký tự bất kỳ gồm không hoặc nhiều ký tự - Một kí tự bất kì
[ ] Một ý tự bất kỳ nằm trong giới hạn được chỉ định
[^] Một ý tự bất kỳ không nằm trong giới hạn được chỉ định Ví dụ để hiển thị thông tin của những khách hàng có tên bắt đầu bởi kí tự “H” ta thực hiện như sau:
select * from KhachHang where Ten Like 'H%'
Để hiển thị thông tin của những khách hàng có tên bắt đầu bởi kí tự “H” hoặc “L” ta thực hiện như sau:
select * from KhachHang where Ten Like '[HL]%'
Để hiển thị thông tin của những khách hàng có tên không bắt đầu bởi kí tự “H” hoặc “L” ta thực hiện như sau:
select * from KhachHang
where Ten Like '[^HL]%'
Giá trị NULL
Để tìm giá trị NULL trong bảng ta sử dụng từ khóa Is Null hoặc Is Not Null. Ví dụ để hiển thị thông tin của những khách hàng không có số điện thoại bạn thực hiện như sau:
select * from KhachHang where SoDienThoai is NULL
Ngược lại để hiển thị thông tin của những khách hàng có số điện thoại bạn thực hiện như sau:
select * from KhachHang where SoDienThoai is NOT NULL
xếp có thể theo chiều tăng (ASC) hoặc giảm (DESC), mặc định là sắp xếp theo chiều tăng. Nếu sau ORDER BY có nhiều cột thì việc sắp xếp dữ liệu sẽ được ưu tiên theo thứ tự từ trái qua phải.
Ví dụ đưới đây sắp xếp thông tin các khách hàng theo tên select * from KhachHang
order by Ten
Ta có thể chỉ định số thứ tự của cột cấn được sắp xếp. Câu lệnh ở ví dụ trên có thể được viết lại như sau:
select * from KhachHang order by 3
Câu lệnh sau sẽ sắp xếp các khách hàng theo thứ tự tăng dần của tên nếu trùng tên thì sắp xếp theo thứ tự giảm dần của ngày sinh
select * from KhachHang order by Ten, NgaySinh Desc
d. Mệnh để GROUP BY
Mệnh đề Group By được sử dụng để phân hoạch các dòng dữ liệu trong bảng thành các nhóm dữ liệu, và trên mỗi nhóm dữ liệu thực hiện tính toán các giá trị thống kê như tính tổng, tính giá trị trung bình,...
Ví dụ sau cho biết tổng số tiền của từng đơn hàng
select madonhang, SUM(thanhtien) as [Tong so tien] from chitietdonhang
group by madonhang
Bạn có thể thêm cột đếm số dòng chi tiết cho mỗi đơn hàng bằng cách sử dụng thêm hàm Count() như sau:
select madonhang, SUM(thanhtien) as [Tong so tien],count(madonhang)
as [So mat hang] from chitietdonhang group by madonhang
e. Mệnh để HAVING
Mệnh đề HAVING dùng để đặt điều kiện lọc cho các phân nhóm con. Having đi sau Group By để đặt điều kiện chọn lọc ra những phân nhóm thoả mãn điều kiện sau Having. Ví dụ bạn chỉ muốn lấy ra những dòng kết quả có tổng số tiền >= 1,000,000
select madonhang, SUM(thanhtien) as [Tong so tien], count(madonhang)as [So mat hang]
from chitietdonhang group by madonhang
having SUM(thanhtien) >= 1000000
f. Mệnh để COMPUTE
Mệnh đề COMPUTE dùng để xem dữ liệu với tổng hoặc tổng con Ví dụ sau cho biết tổng số tiền của tất cả các đơn hàng
select madonhang, dongia,soluong,thanhtien from chitietdonhang
order by madonhang compute sum(thanhtien)
Nếu bạn muốn biết kết quả có tổng con theo một cột nào đó, ví dụ như cột madonhang, thì bạn dùng COMPUTE BY như sau:
select madonhang, dongia,soluong,thanhtien from chitietdonhang
order by madonhang
compute sum(thanhtien) by madonhang