sql 2008
SQL SERVER 2008
Tác giả: Ks Hoàng Anh Quang
Mục lục
Bài 1 – Ngôn ngữ T-SQL
.
5
1. Truy vấn dữ liệu đơn giản với SELECT
..
6
2. Tìm hiểu các trường tính toán
.
12
3. Lọc dữ liệu với mệnh đề WHERE
..
15
4. Sắp xếp dữ liệu với ORDER BY
..
21
5. Nhóm dữ liệu với mệnh đề GROUP BY
..
24
6. Query con
.
29
7. Các phép nối
33
7.1. Tạo phép nối với mệnh đề WHERE
..
33
7.2. INNER JOIN (nội kết)
36
7.3. Sử dụng bí danh của bảng
.
36
7.4. OUTER JOIN (Ngoại kết)
38
8. Kết hợp các query
.
41
9. Chèn dữ liệu
.
42
9.1. Chèn dữ liệu trực tiếp
.
42
9.2. Chèn dữ liệu truy vấn
.
44
9.3. Sao chép dữ liệu từ bảng khác
.
44
10. Cập nhật, xóa dữ liệu
.
44
10.1. Cập nhật chỉnh sửa dữ liệu
.
44
10.2. Xóa dữ liệu
.
45
11. Bài tập thực hành
.
46
Bài 2 – Giới thiệu về phiên bản SQL Server 2008
..
48
1. Hệ quản trị cơ sở dữ liệu
.
48
2. Cài đặt SQL Server 2008
.
49
2.1. Cài đặt .Net FrameWork 3.5
.
50
2.2. Cài đặt bản nâng cấp Windows
.
53
2.3. Cài đặt SQL Server 2008
.
55
2.4. Khởi động SQL server 2008
.
60
3. Một số thao tác cơ bản với SQL Server 2008
.
61
3.1. Kết nối tới Sever
.
62
3.2. Tìm hiểu cửa sổ New Query
.
64
4. Quản lý Database đơn giản
.
66
4.1. Tạo mới một DataBase
.
66
4.2. Cất dữ DataBase (Backup)
71
4.3. Xóa DataBase (Delete)
78
4.4. Phục hồi DataBase (Restore)
80
4.5. Gở bỏ DataBase (Detach)
86
4.6. Đính kèm DataBase (Attach)
88
Bài 3 – Các đối tượng và một số xử lý trong SQL Server 2008
92
1. Câu lệnh SQL
..
92
1.1. Đối tượng
.
92
1.2. Biến
.
92
1.3. Kiểu dữ liệu
.
94
1.4. Hàm
..
96
1.5. Câu lệnh có cấu trúc
.
109
1.6. Viết câu lệnh T-SQL trên New Query của SQL Server 2008
110
1.7. Bài tập thực hành
.
115
2. Bảng
.
116
2.1. Tạo bảng
.
116
2.2. Cập nhật dữ liệu vào bảng
.
124
2.3. Bài tập thực hành
.
131
3. View
..
136
3.1. Định nghĩa
.
136
3.2. Thêm và chỉnh sửa View
..
137
3.3. Bài tập thực hành
.
146
4. Stored Procedures (Thủ tục lưu)
146
4.1. Khái niệm
..
146
4.2. Viết Stored Procedure
.
148
4.3. Sử dụng bảng tạm
..
156
4.4. Tìm hiểu Cursors
.
160
4.5. Bài tập thực hành
.
163
5. Trigger
.
163
5.1. Định nghĩa
.
163
5.2. Tạo mới và sửa đổi Trigger
.
165
5.3. Bài tập thực hành
.
170
Phần 1 – Hệ quản trị cơ sở dữ liệu SQL Server
Bài 1 – Ngôn ngữ T-SQL
Giới thiệu sơ lược về ngôn ngữ Transact-SQL (T-SQL)
- Structured Query Language (SQL) là ngôn ngữ do IBM phát triển từ năm 1970, dùng để giao tiếp với cơ sở dữ liệu. Các hệ thống cơ sở dữ liệu có cách viết và thi hành vâu lệnh SQL riêng như: ANSI SQL (SQL chuẩn), T-SQL (SQL Server, Sybase), PL/SQL (Oracle), Access SQL.
- Transact-SQL là ngôn ngữ SQL mở rộng dựa trên SQL chuẩn của ISO (International Organization for Standardization) và ANSI (American National Standards Institute) được sử dụng trong SQL Server khác với P-SQL (Procedural-SQL) dùng trong Oracle.
Các lệnh T-SQL được chia làm 3 nhóm:
+ Data Definition Language (DDL):
Ðây là những lệnh dùng để quản lý các thuộc tính của một Database như định nghĩa các hàng hoặc cột của một table, hay vị trí data file của một database... như Create, Alter, Drop.
+ Data Control Language (DCL):
Ðây là những lệnh quản lý các quyền truy cập lên từng object (table, view, stored procedure...) như Grant, Revoke, Deny.
+ Data Manipulation Language (DML):
Ðây là những lệnh phổ biến dùng để xử lý data như Select, Update, Insert, Delete.
Trong bài này chúng ta chủ yếu nghiên cứu nhóm lệnh Data Manipulation Language (DML).
1. Truy vấn dữ liệu đơn giản với SELECT
Trong thực tế chúng ta thường xuyên phải thực hiện các công việc như lập danh sách sinh viên trong lớp hay lập danh sách các nhà cung cấp hàng hóa cho công ty,… Để thực hiện các công việc đó trong hệ quản trị CSDL với ngôn ngữ T-SQL chúng ta sử dụng câu truy vấn SELECT.
Cú pháp:
SELECT [DISTINCT] [TOP So_Ban_Ghi]
<Danh_Sach_Truong>
FROM <Ten_Bang>
Giải thích:
- Distinct: Chỉ định không trùng lặp thông tin giữa các bản ghi của kết quả truy vấn tương ứng với danh sách trường hiển thị.
- So_Ban_Ghi: Số bản ghi trả về trong kết quả truy vấn
v
Lưu ý:
Nếu danh sách kết quả không được sắp xếp, kết quả sẽ hiển thị theo thứ tự dữ liệu được thêm vào bảng.
- Danh_Sach_Truong: Trường hiển thị trong danh sách kết quả truy vấn, danh sách trường có thể là tên các trường hoặc các biểu thức được ngăn cách với nhau bằng dấu phẩy dưới “,”. Số lượng tối đa các trường, biểu thức trong danh sách này là 4096.
v
Lưu ý:
Sử dụng ký tự “*” khi cần lấy tất cả các trường trong bảng gốc vào danh sách kết quả truy vấn.
- Ten_Bang: Tên bảng cần truy vấn dữ liệu
Ví dụ:
Cho các bảng cơ sở dữ liệu sau:
- Bảng danh sách nhà cung cấp, khách hàng (DMDT) bao gồm các trường: Id, Ma_Dt, Ten_Dt, Dia_Chi, So_Dt, Fax, Email, Ghi_Chu.
Dữ liệu mẫu
Id
Ma_Dt
Ten_Dt
Dia_Chi
So_Dt
Fax
1
N001
Cty TNHH ABC
Hà Nội
04 3640 0119
3
N002
Cty Cổ phần CB thực phẩm miền bắc
Hà Nội
046 3423 3438
4
N003
Cty liên doanh Việt Pháp
Hải Phòng
033 6534 391
5
N004
Cty TNHH một thành viên cấp nước Yên Bái
Yên Bái
02183 543 443
6
N005
Cty Cổ phần Lạc Hồng
Bắc Ninh
0240 362 552
7
N006
Cty XNK Á Châu
Hải Dương
0320 3111 411
- Bảng danh sách vật tư, hàng hóa (DMVT) bao gồm các trường: Id, Ma_Vt, Ten_Vt, Dvt, Quy_Cach, Ghi_Chu.
Id
Ma_Vt
Ten_Vt
Dvt
Quy_Cach
1
TP001
Bánh trứng Custas
Hộp
Hộp 20 cái
2
TP002
Bánh kem xốp
Gói
Gói 200 gram
3
VT001
Bột mì loại 1
Kg
4
VT002
Hương liệu
Kg
5
VT003
Bột nở
Kg
6
TP003
Bánh kem bơ
Gói
Gói 150 gram
7
TP004
Bánh Socola Vinasun
Hộp
Hộp 6 cái
8
VT004
Socola nguyên liệu
Kg
9
VT005
Sửa ông thọ
Thùng
- Bảng chứng từ (CT) bao gồm các trường: Id, Ma_Ct, Nhom_Ct, So_Ct, Ngay_Ct, Ma_Dt, Ong_Ba, Dia_Chi, Dien_Giai.
SttCt
Ma_Ct
Nhom_Ct
So_Ct
Ngay_Ct
Ma_Dt
Ong_Ba
Dia_Chi
Dien_Giai
1
PX
1
PX001
31/05/11
N001
Lê Văn Khương
Hà Nội
Xuất hàng hóa bán đại lý
2
PX
1
PX002
01/06/11
N001
Đào Thị Hạnh
Hà Nội
Xuất hàng hóa bán đại lý
3
PN
2
PN001
01/06/11
N002
Tạ Thu Loan
Công ty
Nhập vật tư phục vụ sản xuất
4
PX
1
PX003
01/06/11
N004
Phan Thế Anh
Hà Nội
Xuất bán hàng hóa
5
PN
2
PN002
02/06/11
N005
Tạ Thị Minh
Hà Tây
Nhập nguyên liệu
6
PX
1
PX004
05/06/11
N004
Phan Thế Anh
Hà Nội
Xuất bán hàng hóa
- Bảng chi tiết chứng từ (CTCT) bao gồm các trường: Id, Id_Ct, Ma_Vt, Ma_Kho, So_Luong, Don_Gia.
Stt_Dong
Stt_Ct
Ma_Vt
Ma_Kho
So_Luong
Don_Gia
1
1
TP001
KTP
120.000
120,00
2
1
TP002
KTP
23.500
45,00
1
2
TP001
KTP
11.500
35,00
1
3
VT001
KVT
30.000
120,00
2
3
VT002
KVT
120.000
15,00
1
4
TP001
KTP
110.000
75,00
2
4
TP004
KTP
34.000
44,00
1
5
VT004
KVT
75.000
30,00
2
5
VT001
KVT
31.000
32,00
3
5
VT003
KVT
120.000
56,00
1
6
TP001
KVT
13.000
78,00
Yêu cầu truy vấn:
- Lập danh sách nhà cung cấp, khách hàng bao gồm các thông tin: Tên, Địa chỉ, Số điện thoại, Email.
Câu lệnh SQL
SELECT Ten_Dt, Dia_Chi, So_Dt, Email
FROM DmDt
- Lập danh sách vật tư hàng hóa bao gồm toàn bộ thông tin có trong bảng DMVT
SELECT * FROM DmVt
- Lập danh sách 5 vật tư xuất hiện đầu tiên trong bảng DMVT
SELECT TOP 5 Id, Ma_Vt, Ten_Vt, Quy_Cach, Ghi_Chu
FROM DmVt
- Lập bảng kê chứng từ nhập xuất bao gồm các thông tin Ngày chứng từ, số chứng từ, Diễn giải, mã đối tượng, người nhập xuất (học viên tự viết).
2. Tìm hiểu các trường tính toán
Các trường tính toán không tồn tại trong cơ sở dữ liệu đã được chuẩn hóa, nó chỉ được xác định trong quá trình xử lý, tính toán. Ví dụ trong bảng DMDT (như giới thiệu phần trước) bạn muốn lấy danh sách nhà cung cấp với tên nhà cung cấp kèm theo sổ điện thoại để tiện liên lạc như minh họa dưới đây:
Mã số
Tên nhà cung cấp
Địa chỉ
N001
Cty TNHH ABC (04 3640 0119)
Hà Nội
N002
Cty Cổ phần CB thực phẩm miền bắc (046 3423 3438)
Hà Nội
…
…
…
Trong ví dụ này cột “Tên nhà cung cấp” được tạo ra từ trường Ten_Dt và trường So_Dt trong bảng DMDT.
Câu lệnh SQL tương ứng:
SELECT Ma_Dt, Ten_Dt + ‘ (’ + So_Dt + ‘)’, Dia_Chi
FROM DmDt
Hoặc trong bảng CTCT (như giới thiệu phần trước) bạn muốn lấy danh sách chứng từ bao gồm các trường Ma_Vt, Ma_Kho, So_Luong, Don_Gia, Thanh_Tien.
Mã vật tư
Mã kho
Số lượng
Đơn giá
Thành tiền
TP001
KTP
120.000
120,00
14.400.000
TP002
KTP
23.500
45,00
1.075.500
…
…
…
- Mô hình quan hệ giữa các bảng trong hệ thống
Trong ví dụ này cột “Thành tiền” được tạo ra từ phép nhân giữa hai trường Don_Gia và So_Luong.
Câu lệnh SQL tương ứng:
SELECT Ma_Vt, Ma_Kho, So_Luong, Don_Gia, Don_Gia * So_Luong
FROM DmDt
Như vậy trong hai ví dụ trên trường “Tên nhà cung cấp” mới và trường “Thành tiền” là các trường tính toán.
Lưu ý:
- Tên bí danh: Câu lệnh SQL ở hai ví dụ trên khi thực thi đều cho kết quả đúng, tuy nhiên hai trường tính toán chưa có tên (thường trả về tên mặc định theo hệ quản trị cơ sở dữ liệu ví dụ như “(no column name)”), để gán tên cho hai trường này chúng ta sử dụng cú pháp <Bieu_Thuc> AS Ten_Bi_Danh.
Có thể viết lại hai câu truy vấn trên như sau:
SELECT Ma_Dt, Ten_Dt + ‘ (’ + So_Dt + ‘)’ AS Ten_Dt_Moi,
Dia_Chi
FROM DmDt
Và
SELECT Ma_Vt, Ma_Kho, So_Luong,
Don_Gia, Don_Gia * So_Luong AS Thanh_Tien
FROM DmDt
Trong hai câu lệnh mới tên trường “Thanh_Tien” và “Ten_Dt_Moi” gọi là tên bí danh.
- Các toán tử trong biểu thức trường tính toán: Có thể sử dụng các toán tử +, -, *, / trong biểu thức của trường tính toán.
- Chúng ta cũng có thể sử dụng các hàm xử lý chuỗi, ngày tháng, số trong biểu thức của trường tính toán.
Danh sách một số hàm thường dùng
Hàm
Giải thích
GetDate()
Lấy thời gian hiện thời tại Client
GetUtcDate()
Lấy thời gian hiện thời tại Server
Day()
Trả về giá trị ngày của đối số
Month()
Trả về giá trị tháng của đối số
Year()
Trả về giá trị năm của đối số
ABS()
Trả về giá trị tuyệt đối của đối số
LEFT()
Lấy các ký tự bên trái của đối số
RIGHT()
Lấy các ký tự bên phải đối số
SUBSTRING()
Lấy ký tự bất kỳ của đối số
LEN()
Trả về độ dài của đối số
LTRIM(), RTRIM(), ALLTRIM()
Cắt khoảng trắng bên trái, phải và cả trái và phải của đối số
UPPER(), LOWER()
Chuyển đối số thành chữ viết hoa, viết thường
…
…
3. Lọc dữ liệu với mệnh đề WHERE
Trong thực tế bảng thường chứa một lượng lớn dữ liệu và ít khi chúng ta lấy toàn bộ các bản ghi trong bảng dữ liệu đó. Chúng ta thường truy xuất một tập con dữ liệu của bảng ứng với các hoạt động cụ thể. Việc truy vấn như vậy đòi hỏi phải chỉ định một vùng điều kiện tìm kiếm hay còn gọi là điều kiện lọc. Ví dụ lấy danh sách các nhà cung cấp tại Hà Nội hoặc lấy bảng kê các mặt hàng nhập xuất trong năm 2011,…
Cú pháp:
SELECT [DISTINCT] [TOP So_Ban_Ghi]
<Danh_Sach_Truong>
FROM <Ten_Bang>
WHERE <Dieu_Kien_Loc>
Giải thích:
- Dieu_Kien_Loc: Biểu thức điều kiện lọc dữ liệu
Một số toán tử cơ bản trong biểu thức điều kiện lọc dữ liệu:
Toán tử
Giải thích
=
Bằng
<>
Khác
!=
Khác
<
Nhỏ hơn
<=
Nhỏ hơn hoặc bằng
!<
Không nhỏ hơn
Lớn hơn
>=
Lớn hơn hoặc bằng
!>
Không lớn hơn
BETWEEN
Nằm giữa hai giá trị cụ thể
ISNULL
Là một giá trị NULL
Ví dụ:
(Sử dụng các bảng dữ liệu ở phần trước)
- Lập danh sách khách hàng, nhà cung cấp tại Hà Nội
SELECT Ma_Dt, Ten_Dt, So_Dt, Fax, Email
FROM DmDt
WHERE Dia_Chi = N'Hà Nội'
Kết quả
Ma_Dt
Ten_Dt
So_Dt
Fax
N001
Cty TNHH ABC
04 3640 0119
N002
Cty Cổ phần CB thực phẩm miền bắc
046 3423 3438
- Lập bảng kê chứng từ nhập xuất trong tháng 06
SELECT Ma_Ct, Ngay_Ct, So_Ct, Ma_Dt, Dien_Giai
FROM Ct
WHERE MONTH(Ngay_Ct) = 6
Kết quả
Ma_Ct
Ngay_Ct
So_Ct
Ma_Dt
Dien_Giai
PX
01/06/2011
PX002
N001
Xuất hàng hóa bán đại lý
PN
01/06/2011
PN001
N002
Nhập vật tư phục vụ sản xuất
PX
01/06/2011
PX003
N004
Xuất bán hàng hóa
PN
02/06/2011
PN002
N005
Nhập nguyên liệu
PX
05/06/2011
PX004
N004
Xuất bán hàng hóa
Tìm hiểu một số toán tử cao cấp:
- Toán tử AND và OR: Sử dụng các toán tử này để kết hợp nhiều điều kiện lọc
+ Lập danh sách chứng từ xuất hàng cho công ty Cty TNHH một thành viên cấp nước Yên Bái vào ngày 01/06/2011.
SELECT Ngay_Ct, So_Ct, Dien_Giai, Ong_Ba
FROM Ct
WHERE Ma_Dt = ‘N004‘ AND Ngay_Ct = ‘01/06/2011‘
Kết quả:
Ngay_Ct
So_Ct
Dien_Giai
Ong_Ba
01/06/2011
PX003
Xuất bán hàng hóa
Phan Thế Anh
Lưu ý:
Cty TNHH một thành viên cấp nước Yên Bái có mã là “N004”
+ Lập bảng kê xuất hàng chi tiết mặt hàng “Bánh trứng Custas (TP001)” hoặc “Bánh kem bơ (TP003)”.
SELECT Ma_Vt, So_Luong, Don_Gia,
So_Luong * Don_Gia AS Thanh_Tien
FROM CtCt
WHERE Ma_Vt = ‘
TP001
‘ OR Ma_Vt = ‘TP003’
Kết quả:
Ma_Vt
So_Luong
Don_Gia
Thanh_Tien
TP001
120
120,000
14,400,000
TP002
45
23,500
1,057,500
TP001
35
11,500
402,500
TP001
75
110,000
8,250,000
TP001
78
13,000
1,014,000
+ Lập bảng kê chứng từ xuất hàng cho Cty TNHH ABC (N001) hoặc các chứng từ không phải cho công ty này nhưng được thực hiện vào ngày 05/06/2011.
SELECT Ngay_Ct, So_Ct, Dien_Giai, Ma_Dt
FROM CT
WHERE Ma_Dt = ‘N001’
OR (Ma_Dt <> ‘N001’ AND Ngay_Ct = ‘05/06/2011’)
Kết quả
Ngay_Ct
So_Ct
Dien_Giai
Ma_Dt
2011-05-31
PX001
Xuất hàng hóa bán đại lý
N001
2011-06-01
PX002
Xuất hàng hóa bán đại lý
N001
2011-06-05
PX004
Xuất bán hàng hóa
N004
- Toán tử IN: Sử dụng toán tử này để chỉ định một dãy điều kiện với bất kỳ giá trị nào trong dãy thỏa mãn. IN sử dụng một danh sách các giá trị được tách bởi dấu phẩy dưới “,”, tất cả được đặt trong dấu ngoặc đơn.
Ví dụ:
Lập bảng kê xuất hàng chi tiết mặt hàng “Bánh trứng Custas (TP001)” hoặc “Bánh kem bơ (TP003)” sử dụng từ khóa IN.
SELECT Ma_Vt, So_Luong, Don_Gia,
So_Luong * Don_Gia AS Thanh_Tien
FROM CtCt
WHERE Ma_Vt IN(‘
TP001
‘, ‘TP003’)
- Toán tử NOT: Phủ định biểu thức đứng ngay sau nó
Ví dụ:
+ Lập bảng kê chứng từ xuất hàng cho Cty TNHH ABC (N001) hoặc các chứng từ không phải cho công ty này nhưng được thực hiện vào ngày 05/06/2011 sử dụng từ khóa NOT.
SELECT Ngay_Ct, So_Ct, Dien_Giai, Ma_Dt
FROM CT
WHERE Ma_Dt = ‘N001’
OR (NOT(Ma_Dt = ‘N001’) AND Ngay_Ct = ‘05/06/2011’)
- Toán tử LIKE và các ký tự đại diện: Sử dụng toán tử này để tìm dữ liệu gần đúng với giá trị tìm kiếm bằng cách kết hợp với các ký tự đại diện. Chỉ có thể áp dụng toán tử LIKE và các ký tự đại diện cho dữ liệu kiểu chuỗi.
+ Ví dụ về ký tự đại diện “%”: Ký tự đại diện này đại diện cho phần còn lại của chuỗi.
Lập danh sách các khách hàng là loại hình doanh nghiệp “Cổ phần” trên địa bàn Hà Nội
SELECT RTRIM(Ten_Dt) + ' (' + RTRIM(Ma_Dt) + ')' AS Ten_Dt,
So_Dt, Email
FROM DmDt
WHERE Ten_Dt LIKE N'%Cổ phần%' AND Dia_Chi = N'Hà Nội'
Kết quả:
Ten_Dt
So_Dt
Cty Cổ phần CB thực phẩm miền bắc (N002)
046 3423 3438
+ Ví dụ về ký tự đại diện “_”: Ký tự đại diện này tương tự như ký tự “%” tuy nhiên nó chỉ đại diện cho một ký tự đơn.
Tìm những thành phẩm với mã có phần mở rộng là các số chạy nhỏ hơn 10.
SELECT Ma_Vt, Ten_Vt, Dvt, Quy_Cach
FROM DmVt
WHERE RTRIM(Ma_Vt) LIKE N'TP00_'
Kết quả:
Ma_Vt
Ten_Vt
Dvt
Quy_Cach
TP001
Bánh trứng Custas
Hộp
Hộp 20 cái
TP002
Bánh kem xốp
Gói
Gói 200 gram
TP003
Bánh kem bơ
Gói
Gói 150 gram
TP004
Bánh Socola Vinasun
Hộp
Hộp 6 cái
+ Ví dụ về ký tự đại diện “[ ]”: Sử dụng để chỉ định một tập hợp các ký tự, một ký tự trong tập hợp phải thỏa mãn một ký tự tại một vị trí xác định trước (vị trí của ký tự đại diện).
Lập danh sách các công ty “TNHH” hoặc “Cổ phần” đóng trên địa bàn “Hà Nội”
SELECT RTRIM(Ten_Dt) + ' (' + RTRIM(Ma_Dt) + ')' AS Ten_Dt,
So_Dt, Email
FROM DmDt
WHERE Ten_Dt LIKE N'%[Cổ phần, TNHH]%'
AND Dia_Chi = N'Hà Nội'
Kết quả:
Ten_Dt
So_Dt
Cty TNHH ABC (N001)
04 3640 0119
Cty Cổ phần CB thực phẩm miền bắc (N002)
046 3423 3438
Lưu ý:
Không thể phủ nhận khả năng linh hoạt khi tìm kiếm với các ký tự đại diện, tuy nhiên việc tìm kiếm với chúng mất nhiều thời gian hơn cả so với những cách tìm kiếm đã giới thiệu.. sau đây là một số thủ thuật cần ghi nhớ khi sử dụng tìm kiếm bằng các ký tự đại diện:
- Không lạm dụng các ký tự đại diện nếu như có thể tìm kiếm bằng các toán tử khác.
- Nếu không thực sự cần thiết không nên sử dụng ký tự đại diện ở phần đầu của các mẩu tìm kiếm vì đây là cách tìm kiếm chậm nhất.
- Đặc biệt chú ý đến vị trí của ký tự đại diện vì nếu đặt sai vị trí bạn sẽ không có được kết quả như mong muốn.
4. Sắp xếp dữ liệu với ORDER BY
Trong những ví dụ ở các phần đã học kết quả truy vấn chưa được sắp xếp, chúng thường được hiển thị theo thứ tự trong bảng, đây có thể là trật tự dữ liệu được thêm vào bảng ban đầu. Tuy nhiên trật tự này có thể thay đổi nếu như bảng thường xuyên được cập nhật hoặc xóa, chúng ta có thể sử dụng câu truy vấn với ORDER BY để sắp xếp lại dữ liệu.
Cú pháp:
SELECT [DISTINCT] [TOP So_Ban_Ghi]
<Danh_Sach_Truong>
FROM <Ten_Bang>
WHERE <Dieu_Kien_Loc>
ORDER BY <Chi_Tieu_Sap_Xep> [ASC|DESC]
Giải thích:
- Chi_Tieu_Sap_Xep: Là danh sách tên cột hoặc thứ tự cột cần sắp xếp
- ASC: Chỉ định sắp xếp tăng dần
- DESC: Chỉ định sắp xếp giảm dần
Ví dụ:
- Lập danh sách thành phẩm mà công ty sản xuất, kết quả được sắp xếp theo thứ tự trong bảng chữ cái của tên thành phẩm.
SELECT Ma_Vt, Ten_Vt, Dvt, Quy_Cach
FROM DmVt
WHERE Ma_Vt LIKE ‘TP%’
ORDER BY Ten_Vt
Kết quả:
Ma_Vt
Ten_Vt
Dvt
Quy_Cach
TP003
Bánh kem bơ
Gói
Gói 150 gram
TP002
Bánh kem xốp
Gói
Gói 200 gram
TP004
Bánh Socola Vinasun
Hộp
Hộp 6 cái
TP001
Bánh trứng Custas
Hộp
Hộp 20 cái
Xem lại kết quả khi không sử dụng ORDER BY
Ma_Vt
Ten_Vt
Dvt
Quy_Cach
TP001
Bánh trứng Custas
Hộp
Hộp 20 cái
TP002
Bánh kem xốp
Gói
Gói 200 gram
TP003
Bánh kem bơ
Gói
Gói 150 gram
TP004
Bánh Socola Vinasun
Hộp
Hộp 6 cái
- Lập bảng kê chứng từ nhập xuất trong tháng 06 năm 2011, sắp xếp theo Ma_Dt và Ngay_Ct tăng dần.
SELECT Ngay_Ct, So_Ct, Ma_Dt, Dien_Giai
FROM Ct
WHERE MONTH(Ngay_Ct) = 6 AND YEAR(Ngay_Ct) = 2011
ORDER BY Ma_Dt, Ngay_Ct
Kết quả:
Ngay_Ct
So_Ct
Ma_Dt
Dien_Giai
01/06/2011
PX002
N001
Xuất hàng hóa bán đại lý
01/06/2011
PN001
N002
Nhập vật tư phục vụ sản xuất
01/06/2011
PX003
N004
Xuất bán hàng hóa
05/06/2011
PX004
N004
Xuất bán hàng hóa
02/06/2011
PN002
N005
Nhập nguyên liệu
- Lập bảng kê chứng từ xuất bán thành phẩm, sắp xếp theo Ma_Vt và So_Luong giảm dần.
SELECT Ma_Vt, So_Luong, Don_Gia,
So_Luong * Don_Gia AS Thanh_Tien
FROM CtCt
WHERE Ma_Vt LIKE 'TP%'
ORDER BY Ma_Vt, So_Luong DESC
Kết quả:
Ma_Vt
So_Luong
Don_Gia
Thanh_Tien
TP001
120
120.000
14.400.000
TP001
78
13.000
1.014.000
TP001
75
110.000
8.250.000
TP001
35
11.500
402.500
TP002
45
23.500
1.057.500
TP004
44
34.000
1.496.000
5. Nhóm dữ liệu với mệnh đề GROUP BY
Với mệnh đề WHERE ở phần trước đã học chúng ta có thể thống kê xem có bao nhiêu lần vật tư có mã là ‘VT001’ được nhập xuất với câu lệnh như sau:
SELECT COUNT(*) AS So_Lan_Nx
FROM CTCT
WHERE Ma_Vt = ‘VT001’
Tuy nhiên để thống kê xem mỗi vật tư được nhập xuất bao nhiêu lần chúng ta phải sử dụng mệnh đề GROUP BY.
Cú pháp:
SELECT <Danh_Sach_Truong>
FROM <Ten_Bang>
WHERE <Dieu_Kien_Loc>
GROUP BY <Danh_Sach_Nhom>
HAVING <Bieu_Thuc_Dieu_Kien>
ORDER BY <Chi_Tieu_Sap_Xep>
Giải thích:
- <Danh_Sach_Nhom>: Danh sách cột, thứ tự cột cần nhóm dữ liệu
- <Bieu_Thuc_Dieu_Kien>: Biểu thức điều kiện lọc nhóm dữ liệu
Ví dụ:
- Thống kê xem mỗi nhà cung cấp, khách hàng đã phát sinh bao nhiêu chứng từ nhập xuất với công ty trong tháng 6 năm 2011.
SELECT Ma_Dt, COUNT(Ma_Dt) AS So_Ct_Nx
FROM Ct
WHERE MONTH(Ngay_Ct) = 6 AND YEAR(Ngay_Ct) = 2011
GROUP BY Ma_Dt
Kết quả:
Ma_Dt
So_Ct_Nx
N001
1
N002
1
N004
2
N005
1
- Thống kê tổng số lượng nhập xuất kho của từng mặt hàng, kết quả sắp xếp tăng dần theo số lượng.
SELECT Ma_Vt, SUM(So_Luong) AS So_Luong
FROM CtCt
GROUP BY Ma_Vt
ORDER BY So_Luong
Kết quả:
Ma_Vt
So_Luong
VT002
15
VT004
30
TP004
44
TP002
45
VT003
56
VT001
152
TP001
308
- Thống kê lượng nhập xuất hàng hóa theo từng kho và từng mặt hàng, kết quả sắp xếp theo mã kho và giảm dần theo số lượng.
SELECT Ma_Kho, Ma_Vt, SUM(So_Luong) AS So_Luong
FROM CtCt
GROUP BY Ma_Kho, Ma_Vt
ORDER BY Ma_Kho, So_Luong DESC
Kết quả:
Ma_Kho
Ma_Vt
So_Luong
KTP
TP001
230
KTP
TP002
45
KTP
TP004
44
KVT
VT001
152
KVT
TP001
78
KVT
VT003
56
KVT
VT004
30
KVT
VT002
15
- Thống kê doanh số bán hàng theo từng mặt hàng, kết quả sắp xếp theo Ma_Vt và giảm dần theo doanh thu.
SELECT Ma_Vt, SUM(So_Luong * Don_Gia) AS Doanh_Thu
FROM CtCt
WHERE Ma_Vt LIKE 'TP%'
GROUP BY Ma_Vt
ORDER BY Doanh_Thu DESC
Kết quả:
Ma_Vt
Doanh_Thu
TP001
24.066.500
TP004
1.496.000
TP002
1.057.500
- Thống kê những mặt hàng có doanh số bán hàng lớn hơn 2 triệu, kết quả sắp xếp danh sách theo Ma_Vt.
SELECT Ma_Vt, SUM(So_Luong * Don_Gia) AS Doanh_Thu
FROM CtCt
WHERE Ma_Vt LIKE 'TP%'
GROUP BY Ma_Vt
HAVING SUM(So_Luong * Don_Gia) > 2000000
ORDER BY Ma_Vt
Kết quả:
Ma_Vt
Doanh_Thu
TP001
24.066.500
- Lập danh sách những nhà cung cấp, khách hàng đã từng phát sinh từ 2 chứng từ nhập xuất trở lên với công ty. Kết quả sắp xếp giảm dần theo số chứng từ phát sinh.
SELECT Ma_Dt, COUNT(Ma_Dt) AS So_Ct_Nx
FROM Ct
GROUP BY Ma_Dt
HAVING COUNT(Ma_Dt) >= 2
ORDER BY So_Ct_Nx DESC
Kết quả
Ma_Dt
So_Ct_Nx
N001
2
N004
2
- Thống kê mặt hàng bán chạy nhất
SELECT TOP 1 Ma_Vt, SUM(So_Luong * Don_Gia) AS Doanh_Thu
FROM CtCt
WHERE Ma_Vt LIKE 'TP%'
GROUP BY Ma_Vt
ORDER BY Doanh_Thu DESC
Kết quả
Ma_Vt
Doanh_So
TP001
24.066.500
- Thống kê 2 mặt hàng bán chậm nhất
SELECT TOP 2 Ma_Vt, SUM(So_Luong * Don_Gia) AS Doanh_Thu
FROM CtCt
WHERE Ma_Vt LIKE 'TP%'
GROUP BY Ma_Vt
ORDER BY Doanh_Thu ASC
Kết quả:
Ma_Vt
Doanh_So
TP002
1.057.500
TP004
1.496.000
Lưu ý:
- Các trường trong danh sách nhóm sau mệnh đề GROUP BY có thể không xuất hiện trong danh sách trường sau SELECT.
- Các trường không xuất hiện trong danh sách nhóm sau mệnh đề GROUP BY, nhưng xuất hiện trong danh sách trường sau SELECT thì phải được chỉ định bởi một hàm thống kê (phải là một trường tính toán). Một số hàm thống kế thường sử dụng.
Hàm
Giải thích
AVG()
Trả về giá trị trung bình của cột
COUNT()
Bạn đang đọc truyện trên: Truyen247.Pro