You are on page 1of 24

LẬP TRÌNH CƠ SỞ DỮ LIỆU

(Database Programming)

Phần 2
Ngôn ngữ Transact-SQL
Các kiểu dữ liệu

bigint Số nguyên -2^63 (-9223372036854775808) -2^63-1 (9223372036854775807).

int Số nguyên -2^31 (-2,147,483,648) - 2^31 - 1 (2,147,483,647).


smallint Số nguyên 2^15 (-32,768) - 2^15 - 1 (32,767).
tinyint Số nguyên 0 - 255.
bit Số nguyên 0,1.
decimal Số thực -10^38 +1 - 10^38 –1.
numeric Như decimal.
money -2^63 (-922,337,203,685,477.5808) - 2^63 - 1 (+922,337,203,685,477.5807)
smallmoney - 214,748.3648 - +214,748.3647.
float Số thực -1.79E + 308 - 1.79E + 308.
real Số thực -3.40E + 38 - 3.40E + 38.
datetime Date and time data từ 01/01/1753 – 31/12/9999
smalldatetime Date and time data từ 01/01/1900 – 06/06/2079.
char Chuổi độ dài cố định không Unicode (<=8,000 characters)
varchar Chuổi độ dài biến đổi không Unicode (<=8,000 characters).
text Chuổi độ dài biến đổi không Unicode (length of 2^31 - 1 (2,147,483,647) characters.
nchar Chuổi độ dài côs định Unicode (<=4,000 characters).
nvarchar Chuổi độ dài biến đổi Unicode (<=4,000 characters)
ntext Chuổi độ dài biến đổi (lên đến 1,073,741,823 ký tự).
binary Dữ liệu binary độ dài cố định (<= 8,000 bytes).
varbinary Dữ liệu binary độ dài biến đổi (<= 8,000 bytes).
image Dữ liệu binary độ dài biến đổi (<= 2,147,483,647 bytes).
cursor Một tham chiếu đến cursor.
sql_variant Một kiểu dữ liệu chứa các giá trị bất kỳ được hỗ trở bởi SQL Server, trừ các kiểu text,
ntext, timestamp, và sql_variant.
table Một kiểu dữ liệu đặc biệt được sử dụng để chứa một tập kết quả .
timestamp A database-wide unique number that gets updated every time a row gets updated.
uniqueidentifi Một giá trị định danh duy nhất (globally unique identifier (GUID)).
er
Các toán tử
Các toán tử số học
+ Cộng
- Trừ.
* Nhân.
/ Chia.
% Lấy số dư.

Các toán tử bit


& AND
| OR
^ XOR

Các toán tử so sánh


= Bằng
> Lớn hơn
< Nhỏ hơn
>= Lơn hơn hoặc bằng
<= Nhỏ hơn hoặc bằng
<> Khác
!= Khác
!< Không nhỏ hơn
!> Không lớn hơn
Các toán tử logic
ALL
AND
ANY
BETWEEN
EXISTS
IN
LIKE
NOT
OR
SOME

Toán tử nối chuổi (+)

Ví dụ: 'abc' + '' + 'def' sẽ là chuổi 'abcdef'


Các hàm
Các hàm toán học
ABS DEGREES RAND
ACOS EXP ROUND
ASIN FLOOR SIGN
ATAN LOG SIN
ATN2 LOG10 SQUARE
CEILING PI SQRT
COS POWER TAN
COT RADIANS  

Các hàm ngày và giờ


DATEADD
DATEDIFF
DATENAME
DATEPART
DAY
GETDATE
GETUTCDATE
MONTH
YEAR
Các hàm về chuổi

ASCII NCHAR SOUNDEX


CHAR PATINDEX SPACE
CHARINDEX REPLACE STR
DIFFERENCE QUOTENAME STUFF
LEFT REPLICATE SUBSTRING
LEN REVERSE UNICODE
LOWER RIGHT UPPER
LTRIM RTRIM  

Các hàm chuyển đổi kiểu

CAST ( expression AS data_type )


CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Các câu lệnh SQL
CREATE DATABASE: Tạo database

Ví dụ: Tạo một database có tên là QLCC với các file được chỉ ra

USE master
GO

CREATE DATABASE QLCC


ON
( NAME = qlcc_dat,
FILENAME = 'c:\qlcc_data.mdf'
)
LOG ON
( NAME = ‘qlcc_log',
FILENAME = 'c:\qlcc_log.ldf'
)
GO

ALTER DATABASE: Sửa đổi database

DROP DATABASE : Loại bỏ database


CREATE TABLE: Tạo một table cho database

Ví dụ: Tạo table hoso cho database QLCC


USE QLCC
GO

CREATE TABLE hoso


(
RID int IDENTITY(1,1) PRIMARY KEY CLUSTERED,
maso char(10) NOT NULL
hoten nvarchar(50) NOT NULL DEFAULT ‘’,
ngsinh char(10) NOT NULL DEFAULT ‘’,
hesolg decimal NOT NULL CHECK (hslg>=2.5 AND hslg<=6.0)
donvi char(2) NOT NULL DÈAULT ‘’
)
GO

ALTER TABLE : Sửa đổi một table

DROP TABLE : Loại bỏ một table


INSERT: Chèn thêm một bản ghi mới

USE QLCC
GO
INSERT INTO hoso (maso,hoten,ngsinh,hslg,donvi)
VALUES (’HS0001’,’Trần Thị Hồng’,’12/10/1982’,3.32,’KT’)

UPDATE: Sửa đổi các bản ghi

USE QLCC
GO

UPDATE hoso SET hslg=4.32, ngsinh=’12/11/1982’ WHERE maso=‘HS0001’


GO

DELETE: Loại các bản ghi

USE QLCC
GO

DELETE FROM hoso WHERE hslg=0


GO
SELECT: Truy vấn

SELECT select_list
[ INTO new_table ]
FROM table_source
[ WHERE search_condition ]
[ GROUP BY group_by_expression [ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]

Toán tử UNION có thể được sử dụng giữa hai truy vấn để hợp hai tập kết
quả truy vấn thành một tập.

Ví dụ:

USE QLCC
GO
SELECT * FROM hoso
SELECT hoten,hslg FROM hoso WHERE donvi=‘KT’
SELECT donvi,COUNT(*) as ‘songuoi’, SUM(hslg) as ‘tonghslg’ FROM hoso
GROUP BY donvi HAVING songuoi>=5 ORDER BY donvi
GO
Cấu trúc điều khiển
Từ khoá Mô tả

BEGIN...END Định nghĩa một khổi lệnh.

BREAK Thoát khỏi vòng lặp WHILE gần nhất .


CONTINUE Quay lên lại đầu vòng lặp WHILE.
GOTO label Nhảy đến lệnh sau nhãn label.
IF...ELSE Lệnh điều kiện.
RETURN Thoát không điều kiện khỏi một hàm/thủ tục.
WAITFOR Đặt một khoảng thời giản để tiếp tục.
WHILE Vòng lặp với điều kiện là TRUE.

Một số lệnh khác sử dụng với cấu trúc điều khiển


CASE : Cho giá trị của biểu thức tùy theo điều kiện
/*...*/ : Đoạn chú thích -- : Chú thích trên dòng
DECLARE : Khai báo biến cục bộ
EXECUTE : Gọi thực hiện một thủ tục
PRINT : Trả một kết quả về cho client
Một ví dụ về cấu trúc điều khiển:
USE QLCC
GO

DECLARE @dv char(2)


SET @dv = ‘KT‘

-- Trích những người có đơn vị không thuộc KT


DECLARE trich CURSOR FOR SELECT maso, hslg FROM hoso WHERE donvi<>@dv

DECLARE  @m  char(10), @v decimal

OPEN trich
-- dọc dòng đầu tiên của cursor
FETCH NEXT FROM trich INTO @m, @v
-- duyệt cursor
WHILE @@Fetch_Status = 0
   BEGIN
IF @v<3.0
UPDATE hoso SET hslg= @v+1.0 WHERE maso=@m
ELSE
UPDATE hoso SET hslg= @v+0.5 WHERE maso=@m
-- dọc dòng tiếp theo
FETCH NEXT FROM trich INTO @m, @v
END

CLOSE trich
Thủ tục (Stored Procedures)
Cú pháp tạo một thủ tục

CREATE PROCEDURE [owner.]ProcedureName


( @ParameterName1 DataType,
@ParameterName2 DataType,
@ParameterName_n DataType )
AS
BEGIN
Các dòng lệnh của thủ tục
END

Gọi thực hiện một thủ tục


EXEC ProcedureName ParameterValue1, ParameterValue2..., ParameterValue_n
EXECUTE ProcedureName ParameterValue1, ParameterValue2..., ParameterValue_n

Loại bỏ một thủ tục

DROP PROCEDURE ProcedureName


Ví dụ 1: Thủ tục không tham số

CREATE PROCEDURE dbo.GanHeso


AS
BEGIN
UPDATE hoso SET hslg=2.5 WHERE donvi=‘KT’
END

Gọi thực hiện nó:


EXECUTE dbo.GanHeso
Ví dụ 2: Thủ tục có tham số

CREATE PROCEDURE dbo.GanHeso (@h decimal, @d char(2))


AS
BEGIN
UPDATE hoso SET hslg=@h WHERE donvi=@d
END

Gọi thực hiện nó:


EXECUTE dbo.GanHeso 2.5, ‘KT’

Tham số mặc định:


CREATE PROCEDURE dbo.GanHeso
( @h decimal=2.5, @d char(2) =‘’ )
AS
BEGIN
UPDATE hoso SET hslg=@h WHERE donvi=@d
END
Nhận các giá trị sau khi thực hiện thủ tục:
Ví dụ: Lập thủ tục tính tổng số người và tổng hslg của một đơn vị

Cách 1: Sử dụng tham số kiểu OUTPUT

CREATE PROCEDURE dbo.Tinh


(
@d char(2) =‘’ ,
@n int OUTPUT ,
@S decimal OUTPUT
)
AS
BEGIN
SELECT @n = COUNT(*) FROM hoso WHERE donvi=@d
SELECT @S = SUM(hslg*300000) FROM hoso WHERE donvi=@d
END

Gọi thực hiện nó:


DECLARE  @v1  int, @v2 decimal
EXECTUTE dbo.Tinh ‘KT’, @v1, @v2
Cách 2: Sử dụng cursor như là một lệnh truy vấn

CREATE PROCEDURE dbo.Tinh


(
@d char(2) =‘’
)
AS
BEGIN
DECLARE  @n  int, @S decimal
SELECT @n = COUNT(*) FROM hoso WHERE donvi=@d
SELECT @S = SUM(hslg*300000) FROM hoso WHERE donvi=@d
SELECT @n AS ‘songuoi’, @S AS ‘tonglcb’
END

Gọi thực hiện nó:


EXECTUTE dbo.Tinh ‘KT’
Kết quả là một cursor 1 dòng có hai cột ‘songuoi’ và ‘tonglcb’
Tùy theo ngôn ngữ lập trình để tham chiếu đến cursor này
Hàm tự định nghĩa (User Defined Function)
Cú pháp tạo một hàm

CREATE FUNCTION [Owner.]FunctionName (


( @ParameterName1 DataType,
@ParameterName2 DataType,
@ParameterName_n DataType )
RETURNS (kiểu giá trị trả lại)
AS
BEGIN
Các câu lệnh của hàm
RETURN (giá trị trả lại của hàm)
END

Gọi một hàm

[Owner.]FunctionName(Danh sách các đối số của tham số)


Ví dụ 1: Hàm trả lại một giá trị đơn (hàm vô hướng)
CREATE FUNCTION dbo.TinhTongLcb ( @d char(2) )
RETURN decimal
AS
BEGIN
DECLARE  @S decimal
SELECT @S = SUM(hslg*300000) FROM hoso WHERE donvi=@d
RETURN (@S)
END

Hoặc, gọn hơn:


CREATE FUNCTION dbo.TinhTongLcb ( @d char(2) )
RETURN decimal
AS
BEGIN
RETURN (SELECT SUM(hslg*300000) FROM hoso WHERE donvi=@d)
END

Gọi thực hiện hàm:


SELECT dbo.TinhTong(“KT”) AS tong
Ví dụ 2: Giá trị của hàm là một bảng từ kết quả truy vấn

USE QLCC
GO

CREATE FUNCTION dbo.DanhSach


( @d Char(2) )
RETURNS TABLE
AS
BEGIN
RETURN ( SELECT hoten,ngsinh FROM hoso WHERE donvi =@d )
END

Gọi thực hiện nó:

SELECT * FROM dbo.Danhsach(“KT”)


Ví dụ 3: Giá trị của hàm là một bảng với định nghĩa cấu trúc
CREATE FUNCTION dbo.ThongKe
( @d Char(2) )
RETURNS @ketqua TABLE ( Muc nvarchar(50), Giatri decimal)
AS
BEGIN
DECLARE  @n  int, @S decimal
SELECT @n = COUNT(*) FROM hoso WHERE donvi=@d
SELECT @S = SUM(hslg*300000) FROM hoso WHERE donvi=@d
INSERT INTO @ketqua (Muc,Giatri) Values (‘Số người’,@n)
INSERT INTO @ketqua (Muc,Giatri) Values (‘Tổng lương cơ bản’,@S)
RETURN
END

Hoặc:
CREATE FUNCTION dbo.ThongKe
( @d Char(2) )
RETURNS @ketqua TABLE ( Muc nvarchar(50), Giatri decimal)
AS
BEGIN
INSERT INTO @ketqua SELECT ‘Số người’,COUNT(*) FROM hoso WHERE donvi=@d
INSERT INTO @ketqua SELECT ‘Tổng lương cơ bản’,SUM(hslg*300000) FROM hoso _
WHERE donvi=@d
RETURN
END

Gọi thực hiện nó:


SELECT * FROM dbo.ThongKe(“KT”)
Bài tập phần 2
Bài 1:
Giả sử database KETOAN có một số table sau:
Chungtu : gồm các cột soct, ngay, makh, tkno, tkco, sotien (mỗi chứng từ
có thể ghi nhiều dòng)
Taikhoan : gồm các cột matk, tentk
Khachhang: gồm các cột makh, tenkh, loaikh
Viết các lệnh truy vấn để nhận được:
1. Các dòng mà số chứng từ là “010001”
2. Các dòng chứng từ nhập trong tháng 9/2009
3. Các dòng gồm các mục, số chứng từ, ngày, tên khách hàng, tên tài khoản nợ,
tên tài khoản có, số tiền của các dòng có ngày là 20/10/2009
4. Các dòng có số chứng từ khác nhau
5. Đếm xem có bao nhiêu chứng từ được ghi không ít hơn 2 dòng
6. Tổng nợ của tài khoản 1111 có tài khoản đối ứng là 3112
7. Tổng số tiền liên quan đến của loại khách hàng “TN”
8. Tổng số tiền liên quan đến mỗi loại khách hàng.
Bài 2:
Database BANHANG (bán hàng) có 2 table sau:
Hoadon : Gồm các mục hdso (hoá đơn số), ngayban (ngày bán),
mahang (mã hàng), soluong (số lượng bán)
Banggia : Ghi lại quá trình điều chỉnh giá bán, gồm các mục:
mahang : mã hàng
tungay : từ ngày (tức ngày bắt đầu áp giá mới)
dongia : giá bán tính từ ngày trên
Câu 1: Viết hàm (hoặc thủ tục) tính đơn giá bán, có dạng:
gia(m,d) (cho lại đơn giá của mã hàng m vào ngày d)
Câu 2: Áp dụng hàm (thủ tục trên) để truy vấn các mục:
hdso, ngayban, mahang, soluong, dongia, thanhtien

You might also like