sql 2008

Màu nền
Font chữ
Font size
Chiều cao dòng

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

Email

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

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

Email

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

Email

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

Email

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: Truyen2U.Pro