Cơ sở dữ liệu T-SQL
- Các kiểu dữ liệu thường dùng:
+ Kiểu số:
Số nguyên: tinyint(8bit), smallint(16bit), int(32bit), bigint(64bit)
Số thực: float(32-64bit), real(32bit), decimal(5-17B), numberic(5-17B), money(8B)
+ Kiểu chữ: char(n), varchar(n), nchar(n), nvarchar(n), text với n là số kí tự. Kiểu
nchar(n) và nvarchar(n) biểu diễn các kí tự mã Unicode. Kiểu char(n), varchar(n) biểu
diễn các kí tự mã Ascii
Char(n): 1 <= n <= 8000 mỗi kí tự cần 8bit để lưu trữ
Nchar(n): 1 <= n <= 4000 mỗi kí tự cần 16bit để lưu trữ
Varchar(n): 1 <= n <= 8000 mỗi kí tự cần 8bit để lưu trữ
không phải là s hoặc d
+ in (a,b,…): hoặc là a hoặc là b
+ not in (a,b,…): không là a mà cũng không là b
+ all(a,b): là cả a và b
+ any/some(a,b): là giá trị nào đó
+ is null: dùng is null chứ không phải = null khi ô thuộc cột đó có
giá trị null
+ exists/not exists: nếu khối chọn select ở mệnh đề where trả lại bản ghi rỗng/không
rỗng thì lấy/không lấy hàng đang duyệt
- Group by
+ Số cột cần đem gom nhóm ở group by phải >= số cột được chọn ở select(>=2) trừ đi
1
ANHMATTROI – TIN5A
23
+ Nếu có các hàm count/sum/avg/min/max() ở select: những hàm này chỉ có
tác dụng trên nhóm
- Having -- chỉ có tác dụng trên nhóm không có tác dụng đến toàn bảng
- Order by asc/desc
+ asc: sắp xếp tăng dần(mặc định)
+ desc: sắp xếp giảm dần
- Compute count/avg/min/max/sum(),… by <là một/nhiều trong các cột ở order
by
và thứ tự các cột phải giống như ở order by>
+ Bắt đầu từ hàng trên cùng đến cuối bảng của những cột sắp xếp ở order by tách lấy
những hàng có giá trị trùng nhau: các lệnh ở compute sẽ thực hiện trên những phần đã
tách ra
+ Đã có compute … by … phải có order by …. nếu compute không có by thì không
compute sẽ thực hiện trên toàn bảng
- Offset rows
- Fetch next rows only
- Thứ tự chạy các khối lệnh: khối lệnh from chạy đầu tiên -> khối lệnh where -> group
by/order by -> …. -> cuối cùng là khối lệnh select
- Nối kết quả của hai khối lệnh truy vấn bằng union hoặc union all, các cột ở kết quả hai
khối truy vấn phải cùng kiểu dữ liệu.
+ Union: nối hai khối đó lại xong sắp xếp theo thứ tự từ điển, những giá trị bị trùng chỉ
dữ lại một giá trị
+ Union all: chỉ nối khối 2 vào khối 1 xong không làm thay đổi gì
select from
union/union all
select from
Ví dụ:
select masv from SinhVien
union all
ANHMATTROI – TIN5A
24
select tensv from SinhVien
- Loại những giá trị bị trùng ở kết quả truy vấn của khối truy vấn 1 với giá trị ở kết quả
truy vấn của khối truy vấn 2
(khối truy vấn 1)
minus
(khối truy vấn 2)
Ví dụ:
select hoten from SinhVien
minus
select hoten from SinhVien
where masv = 10001
6. Biến và câu lệnh rẽ nhánh, vòng lặp
- Biến
+ Khai báo biến: declare @
Biến do người dùng khai báo luôn có @ trước tên biến, lúc khai báo có thể gán giá mặc
định cho biến: declare @x int = 0, @y float = 1
ANHMATTROI – TIN5A
25
+ Gán giá trị: set @ =
Mỗi lần gán giá trị cho một biến là một set
+ Một số biến hệ thông thường dùng: biến hệ thống có hai chữ @@ trước tên biến và
chỉ được dùng không thay đổi giá trị của nó theo ý muốn được
+ Con trỏ: khai báo
declare @<khai báo các biến, số biến khai báo ở dòng này = số cột ở câu lệnh truy
vấn ở dưới>
declare cursor for
select
from
…………………
open
fetch next from into
while @@fetch_status = 0 begin
@@fetch_status Số nguyên Nếu là 0 đọc thành công
còn nếu không ngược lại
@@connections Số nguyên Tổng số kết nối tới
MSSQL
@error Số nguyên
Nếu là 0 không có lỗi còn
nếu không tương ứng với
các lỗi
@@language Chuỗi Tên ngôn ngữ mà
MSSQL đang sử dụng
@@rowcount Số nguyên
Tổng số mẫu tin được tác
động vào câu lệnh truy
vấn gần nhất
@@servername Chuỗi Tên máy
@@servicename Chuỗi Tên dịch vụ
@@version Chuỗi Phiên bản MSSQL đang
cài trên máy
ANHMATTROI – TIN5A
26
fetch next from into
end
close
deallocate
Ví dụ: khai báo biến @ToaDo có kiểu dữ liệu table chứa hai cột x, y sau đó duyệt
bảng bằng con trỏ
-- Tạo bảng ToaDo lưu tọa đọ của các điểm
declare @ToaDo table
(
x int,
y int
)
insert into @ToaDo
values(1,2)
insert into @ToaDo
values(-3,2)
insert into @ToaDo
values(6,8)
insert into @ToaDo
values(2,4)
insert into @ToaDo
values(9,1)
insert into @ToaDo
values(12,5)
-- Duyệt tọa độ các điểm
declare @x int, @y int
declare contro cursor for
select x, y
from @ToaDo
open contro
declare @i int = 1
fetch next from contro into @x, @y
while @@FETCH_STATUS = 0 begin
print N'Tọa độ điểm thứ ' + cast(@i as varchar(2))
+ N' là: (' + cast(@x as varchar(2))
+ ',' + cast(@y as varchar(2)) + ')'
set @i = @i + 1
fetch next from contro into @x, @y
end
close contro
deallocate contro
ANHMATTROI – TIN5A
27
- Câu lệnh rẽ nhánh if … else
if begin
end
else begin
end
+ Nếu điều kiện ở khối if đúng thì các lệnh ở khối if chạy còn nếu sai thì các lệnh
ở khối else chạy
+ Nếu chỉ cần các lệnh ở khối if chạy hay không thì không cần khối else
Ví dụ: if 10>9 print N'Đúng'
+ Dùng exists, not exists trong if: nếu tồn tại hoặc không tồn tại
Ví dụ: tạo cơ sở dữ liệu quản lí sinh viên có kiểm tra xem cơ sở dữ liệu đã có chưa.
Nếu chưa có thì tạo cơ sở dữ liệu đó. Nếu có rồi thì hiện ra thông báo cơ sở dữ liệu
này đã có rồi.
use master
if not exists(select 'true' from sys.databases where name = 'QLSV')
begin
create database QLSV on
(
name = 'Quanlysinhvien',
filename = 'C:\Bai tap\Quanlysinvien.mdf',
size = 10mb,
maxsize = 30mb,
filegrowth = 5%
)
log on
(
name = 'Quanlysinhvien_log',
filename = 'C:\Bai tap\Quanlysinvien_log.ldf',
ANHMATTROI – TIN5A
28
size = 5mb,
maxsize = 20mb,
filegrowth = 5%
)
end
else print N'Cơ sở dữ liệu QLSV đã có rồi'
Ví dụ: với bảng
use QLSV
if not exists(select * from QLSV.sys.objects where name = 'LopHoc')
begin
create table LopHoc
(
malop nchar(30) constraint KhoaChinh primary key,
tenlop nchar(20) not null,
diadiem nchar(20) not null,
magvql int not null
)
end
else print N'Bảng lớp học đã có rồi'
Ví dụ: với view
use QLSV
if exists(select * from QLSV.sys.views where name = 'Diem_View')
begin
drop view Diem_View
print N'Diem_View đã xóa thành công'
end
else print N'Diem_view không có trong cơ sở dữ liệu QLSV nên không xóa
được'
- Câu lệnh chuyển case
case
when
then
when
then
else <nếu không phải là những giá trị ở các when thì thực hiện
công việc>
end
VD: tạo biến có kiểu dữ liệu là bảng có một cột x lưu các số và kiểm tra các số này có
chia hết cho 2 không
ANHMATTROI – TIN5A
29
declare @a table
(
x int not null
)
insert into @a values(9)
insert into @a values(2)
insert into @a values(0)
insert into @a values(1)
insert into @a values(8)
insert into @a values(2)
------------------------
select x,case x%2
when 0 then N'Có'
else N'Không'
end as N'Chia hết cho 2'
from @a
- Vòng lặp while
while begin
+ nếu gặp lệnh continue ở đây sẽ bỏ qua những lệnh ở dưới continue và chuyển
sang vòng lặp tiếp theo
+ nếu gặp break thì dừng hẳn vòng lặp
+ continue và break chỉ xuất hiện trong vòng lặp
end
VD: hiện thị các số từ 1 đến 15 nếu gặp số 6, 10 thì không hiện thị những số này
declare @i int
set @i = 1
print N'Các số i là'
while @i<16 begin
if @i=6 or @i=10 begin
set @i = @i + 1
ANHMATTROI – TIN5A
30
continue
end
print 'i = ' + cast(@i as varchar(3))
set @i = @i + 1
end
VD: tìm ước chung lớn nhất của 112 va 68
print N'Ước chung lớn nhất của 112 và 68 là: '
declare @a int,@b int, @phandu int
set @a = 112
set @b = 68
while 1>0 begin
if @b=0 break
set @phandu = @a%@b
set @a = @b
set @b = @phandu
end
print cast(@a as char(3))
7. Thủ tục
- Tạo thủ tục:
ANHMATTROI – TIN5A
31
create procedure/proc (<các biên tham số truyền vào output/out(không
nhất thiết phải có)>) as
with recompile/with encryption -- dòng này có hoặc không
begin
end
+ with recompile: mỗi lần gọi thủ tục – thủ tục sẽ biên dịch lại
+ with encryption: không xem được nội dung của thủ tục
- Sửa thủ tục:
Thay create bằng alter và bắt đầu thay đổi thủ tục đã tạo
- Xóa thủ tục:
drop procedure
- Lời gọi thủ tục:
exec
+ Nếu tham số truyền vào khai báo ở lệnh tạo thủ tục là output/out thì các tham số
truyền vào cũng bị thay đổi theo
Ví dụ: Tạo thủ tục có tên CTGD_Ngay nhận ngày giao dịch là tham số truyền vào,
hiện thị thông tin giao dịch ngày như: số tài khoản, loại giao dịch, số tiền giao dịch
trong ngày đó và tổng số tiền theo từng loại giao dịch. Hiển thị tông tin giao dịch
ngày 2-2-2012
create procedure CTGD_Ngay(@Ngay datetime) as
begin
select SoTK, LoaiGD, sum(SoTienGD)
as N'Tổng số tiền giao dịch'
from ChiTietGD
where NgayGD = @Ngay
group by SoTK, LoaiGD
end
exec CTGD_Ngay '2-2-2012'
ANHMATTROI – TIN5A
32
8. Hàm
- Tạo hàm
+ Dạng chung:
create function ()
returns as begin
return
end
+ Tạo hàm với kiểu giá trị trả lại là bảng:
create function ()
returns @ table
(
khai báo các biến ở đây những biến này phải có kiểu dữ liệu phù hợp với các
cột được chọn ở
khối lệnh select sẽ được định nghĩa ở dưới đây
) as begin
insert into @
select
from
………………
return
end
- Sửa hàm:
Thay create bằng alter
- Xóa hàm:
drop function
ANHMATTROI – TIN5A
33
- Lời gọi hàm:
+ Với hàm trả lạ một giá trị
select dbo.()
Ví dụ: tạo hàm TienTK nhận số tài khoản là tham số truyền vào và trả về số tiền trong
tai khoản này. In ra số tiền của tài khoản 9513
create function TienTK(@SoTK char(12))
returns int as
begin
return
(
select SoTien
from TaiKhoan
where @SoTK = SoTK
)
end
declare @sotien int = 0
set @sotien = dbo.TienTK('9513')
print N'Số dư: '
print @sotien
+ Với hàm trả lại một bảng dữ liệu
select */……
from dbo.()
Ví dụ: tạo hàm CTTGD_TK nhận tham số truyền vào là số tài khoản và trả về bản
ghi chứa thông tin sau: loại giao dịch, ngày giao dịch, số tiền giao dịch. Viêt lời gọi
hàm cho tài khoản 9512
create function CTGD_TK(@SoTK char(12))
returns @Bang table
(
LoaiGD char(3),
NgayGD datetime,
SoTienGD int
) as
begin
insert into @Bang
select LoaiGD, NgayGD, SoTienGD
from ChiTietGD
ANHMATTROI – TIN5A
34
where @SoTK = SoTK
return
end
select * from dbo.CTGD_TK(‘9512’)
File đính kèm:
Cơ sở dữ liệu T-SQL.pdf

