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