ANHMATTROI – TIN5A
1
Cơ sở dữ liệu T-SQL
1. Các kiểu dữ liệu
- Các kiểu dữ liệu thường dùng:
+ Kiểu số:
Số nguyên: tinyint...
ANHMATTROI – TIN5A
2
+ Tab results: hiện thị kết quả của câu lệnh truy vấn
VD: declare @x int = 9
select @x as N'Giá trị c...
ANHMATTROI – TIN5A
3
Ví dụ:
print N'Cơ sở dữ liệu' + 'T-SQL'
print 2+3
print 8-13
print 3%2
print 4*5
print 8/5
print 8.0/...
ANHMATTROI – TIN5A
4
<= Nhỏ hơn hoặc bằng
!< Không nhỏ hơn
!> Không lớn hơn
3. Các lệnh làm việc với cơ sở dữ liệu và bảng...
ANHMATTROI – TIN5A
5
maxsize = 30mb,
filegrowth = 5%
)
log on
(
name = 'Quanlysinhvien_log',
filename = 'C:Bai tapQuanlysi...
ANHMATTROI – TIN5A
6
(
<tên cột> <kiêu dữ liệu> not null (có hoặc không mặc định là
null),
..................................
ANHMATTROI – TIN5A
7
create table SinhVien
(
MaSV char(10) not null constraint KhoaChinh primary key,
TenSV nvarchar(20)
)...
ANHMATTROI – TIN5A
8
<tên cột> <kiểu dữ liệu> identity(a,b)
Với a là giá trị đầu tiên của cột, b là sau mỗi lần chèn một h...
ANHMATTROI – TIN5A
9
alter table <tên bảng> drop column <tên cột>
Ví dụ: xóa cột tên lớp trong bảng sinh viên
use QLSV
alt...
ANHMATTROI – TIN5A
10
values(N'Đoàn Văn Dũng','06/23/1992',9.5,N'Nữ',N'Nam Định')
insert into SinhVien(TenSV,NgaySinh,Diem...
ANHMATTROI – TIN5A
11
Để kết nối lại ràng buộc thay nocheck bằng check
- Xem ràng buộc có được tạo thành công không:
exec ...
ANHMATTROI – TIN5A
12
where <điều kiện>
Ví dụ: ta có hai bảng sau
BangA BangB
Bảng kết quả:
select * from BangA as a
inner...
ANHMATTROI – TIN5A
13
select a.ma, a.ten, b.diem from BangA as a
inner join BangB as b
on a.ma = b.ma
where a.ma = '100000...
ANHMATTROI – TIN5A
14
+ concat(‘chuỗi 1’,’chuỗi 2’,…): nối các chuỗi lại với nhau
+ cast(<kiểu dữ liệu cũ> as <kiểu dữ liệ...
ANHMATTROI – TIN5A
15
+ sqrt(x): căn bậc hai của x
+ square(x): x
+ round(<số đem làm tròn>,<làm tròn đén chữ số thứ mấy s...
ANHMATTROI – TIN5A
16
select * from SinhVen được bảng ban đầu
+ select top <lấy mấy hàng từ trên xuống> <tên cột>,……..
sel...
ANHMATTROI – TIN5A
17
Ví dụ: cho bảng BangDiem sau
select count(*) as N'Số sinh viên' from BangDiem
select round(avg(diem)...
ANHMATTROI – TIN5A
18
+ Nếu lấy dữ liệu từ nhiều bảng khác nhau phải xác định rõ cột đó thuộc bảng nào bằng
cách select <t...
ANHMATTROI – TIN5A
19
select masv as N'Mã sinh viên',
ten N'Tên sinh viên',
ngaysinh as N'Ngày sinh',
case gioitinh
when N...
ANHMATTROI – TIN5A
20
where SinhVien.MaSV = DiemThi.MaSV
+ Lấy bản ghi từ khối chọn select bằng cách tạo định danh
VD:
sel...
ANHMATTROI – TIN5A
21
Cho biết tên những sinh viên có điểm >= 7
select ten
as N'Những sinh vien có điểm lớn hơn hoặc bằng ...
ANHMATTROI – TIN5A
22
+ like ‘%a%’ hoặc like ‘a%’ hoặc like ‘%a’ hoặc like ‘a_’ hoặc like ‘giá trị[kí tự]’: giá
trị của ô ...
ANHMATTROI – TIN5A
23
+ Nếu có các hàm count/sum/avg/min/max(<tên cột>) ở select: những hàm này chỉ có
tác dụng trên nhóm
...
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 ...
ANHMATTROI – TIN5A
25
+ Gán giá trị: set @<tên biến> = <giá trị>
Mỗi lần gán giá trị cho một biến là một set
+ Một số biến...
ANHMATTROI – TIN5A
26
<các lệnh lập trình/truy vấn>
fetch next from <tên con trỏ> into <các biến>
end
close <tên con trỏ>
...
ANHMATTROI – TIN5A
27
- Câu lệnh rẽ nhánh if … else
if <điều kiện> begin
<các lệnh -- nếu có một lệnh không cần begin end ...
ANHMATTROI – TIN5A
28
size = 5mb,
maxsize = 20mb,
filegrowth = 5%
)
end
else print N'Cơ sở dữ liệu QLSV đã có rồi'
Ví dụ: ...
ANHMATTROI – TIN5A
29
declare @a table
(
x int not null
)
insert into @a values(9)
insert into @a values(2)
insert into @a...
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ủ...
ANHMATTROI – TIN5A
31
create procedure/proc <tên thủ tục>(<các biên tham số truyền vào output/out(không
nhất thiết phải có...
ANHMATTROI – TIN5A
32
8. Hàm
- Tạo hàm
+ Dạng chung:
create function <tên hàm>(<các tham số truyền vào>)
returns <kiểu giá...
ANHMATTROI – TIN5A
33
- Lời gọi hàm:
+ Với hàm trả lạ một giá trị
select dbo.<tên hàm>(<truyền cho hàm những tham số nào>)...
ANHMATTROI – TIN5A
34
where @SoTK = SoTK
return
end
select * from dbo.CTGD_TK(‘9512’)
Upcoming SlideShare
Loading in...5
×

Co so du lieu t sql

9,572

Published on

1 Comment
4 Likes
Statistics
Notes
No Downloads
Views
Total Views
9,572
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
405
Comments
1
Likes
4
Embeds 0
No embeds

No notes for slide

Transcript of "Co so du lieu t sql"

  1. 1. ANHMATTROI – TIN5A 1 Cơ sở dữ liệu T-SQL 1. Các kiểu dữ liệu - 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ữ + Ngày giờ: smalldatetime, datetime(8B), date(3B), time(3-5B) + Chuỗi bit: binary, varbinary, image + Kiểu logic: bit những số khác 0 là 1 còn 0 vẫ là 0, chỉ có 3 giá trị 0, 1, null + Kiểu dữ liệu bảng: table - Các kiểu dữ liệu khi biểu diễn cần đặt giữa hai dấu nháy đơn: char, nchar, text, datetime, nchar, nvarvhar. - Chuyển kiểu dữ liệu: dùng cast(<kiểu dữ liệu cũ> as <kiểu dữ liệu mới>) hoặc dùng convert(<kiểu dữ liệu mới>, <kiểu dữ liệu cũ>) Ví dụ: print 17/9 print 17/cast(9 as float) print 17/9 print 17/convert(float, 9) - Hiển thị ra màn hình: trong sql có hai tab hiện thị
  2. 2. ANHMATTROI – TIN5A 2 + Tab results: hiện thị kết quả của câu lệnh truy vấn VD: declare @x int = 9 select @x as N'Giá trị của x là' + Tab messages: hiển thị chuỗi kí tự hoặc số bằng câu lệnh print <chuỗi kí tự hoặc một số>, chuỗi kí tự đặt giữa hai dấu nháy đơn ‘<đặt chuỗi kí tự ở đây>’. Nếu chuỗi kí tự có mã unicode thì thêm kí tự N đằng trước hai dấu nháy đơn N’ … ‘ VD: print 'sql server' print N'Cơ sở dữ liệu' print 6.78 print 5+6 - Chú thích: dòng chú thích không được biên dịch, nó chỉ để cho dễ hiểu đoạn chương trình này ta đang làm gì. Có hai cách chú thích: + C1: dùng hai dấu gạch ngang viết liền -- <dòng chú thích> cách này chỉ có tác dụng trên một dòng + C2: dùng /* đây là dòng chú thích */ cách này có tác dụng trên nhiều dòng - Trong sql không phân biệt chữ in hoa hay chữ thường 2. Các phép toán - Các phép tính + Cộng hai số hoặc nối hai chuỗi - Trừ hai số * Nhân hai số / Chia hai số, nếu cả hai số có kiểu số nguyên thì kết quả là chia lấy phần nguyên % Chia lấy phần dư: điều kiện hai số có kiểu nguyên
  3. 3. ANHMATTROI – TIN5A 3 Ví dụ: print N'Cơ sở dữ liệu' + 'T-SQL' print 2+3 print 8-13 print 3%2 print 4*5 print 8/5 print 8.0/5 - Các phép logic and or 1 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 not 0 1 1 0 - Các phép so sánh = Phép so sánh bằng > Lớn hơn < Nhỏ hơn <> Khác != khác >= Lớn hơn hặc bằng
  4. 4. ANHMATTROI – TIN5A 4 <= Nhỏ hơn hoặc bằng !< Không nhỏ hơn !> Không lớn hơn 3. Các lệnh làm việc với cơ sở dữ liệu và bảng a. Cơ sở dữ liệu - Tạo cơ sở dữ liệu: use master create database <tên cơ sở dữ liệu> on ( name = '<tên file>', filename = '<đường dẫn tới thư lưu file<tên file ở trên>.mdf', sixe = <kích thước mặc định đơn vị là MB>, maxsize = <kich thước tối đa>, filegrowth = <độ phình> ) log on ( name = '<tên file>', filename = '<đường dẫn tới thư mục lưu file<tên file ở trên>.ldf', size = <kích thước mặc định đơn vị là MB>, maxsize = <kích thước tối đa>, filegrowth = <độ phình> ) + Tên cơ sở dữ liệu không có dấu cách, không chứa các kí tự đặc biệt, không bắt đầu bằng kí tự số,... + Độ phình: khi kích thước của file lớn hơn kích thước mặc định thì size = size + độ phình(đơn vị là mb hoặc %) sao cho không lớn hơn maxsize Ví dụ: tạo cơ sở dữ liệu quản lí sinh viên use master create database QLSV on ( name = 'Quanlysinhvien', filename = 'C:Bai tapQuanlysinvien.mdf', size = 10mb,
  5. 5. ANHMATTROI – TIN5A 5 maxsize = 30mb, filegrowth = 5% ) log on ( name = 'Quanlysinhvien_log', filename = 'C:Bai tapQuanlysinvien_log.ldf', size = 5mb, maxsize = 20mb, filegrowth = 5% ) - Xóa cơ sở dữ liệu: drop database <tên cơ sở dữ liệu> Ví dụ: xóa cơ sở dữ liệu quản lí sinh viên use master drop database QLSV - Đổi tên cơ sở dữ liệu: alter database <tên cơ sở dữ liệu cũ> modify name = <tên mới> Ví dụ: đổi tên cơ sở dữ liệu quản lí sinh viên use QLSV alter database QLSV modify name = QuanLiSinhVien - Đổi kích thước: alter database <tên cơ sở dữ liệu> modify size = <mấy mb> - Thay đổi thuộc tính của cơ sở dữ liệu: exec sp_dbop <tên cơ sở dư liệu> , 'read only' , 'true/false' b. Bảng - Tạo bảng: use <tên cơ sơ dư liệu> create table <tên bảng>
  6. 6. ANHMATTROI – TIN5A 6 ( <tên cột> <kiêu dữ liệu> not null (có hoặc không mặc định là null), ................................................. ) + Tên cột không chứa các kí tự đặc biệt, không bắt đầu bằng kí tự số, không có dấu cách,… + Nếu bạn đặt cột có thuộc tính not null lúc chèn dữ - nhập dữ liệu vào bảng bạn phải điền dữ liệu cho cột này không được không được bỏ qua hay để trống Ví dụ: tạo bảng sinh viên trong cơ sở dữ liệu quản lí sinh viên có các cột sau: mã sinh viên có kiểu char, họ và tên sinh viên kiểu nvarchar, ngày sinh kiểu datetime, giới tính kiểu varchar, quê quán kiểu nvarchar. use QLSV create table SinhVien ( MaSV char(11) not null, TenSV nvarchar(20), NgaySinh datetime, GioiTinh nvarchar(4), QueQuan nvarchar(30) ) - Tạo bảng có các thuộc tính như: khóa chính, khóa ngoại, có điều kiện cho cột: use <tên cơ sở dữ liệu> create table <tên bảng> ( <tên cột> <kiểu dữ liệu> constraint <tên ràng buộc khóa chính> primary key, <tên cột> <kiểu dữ liệu>, <tên cột> <kiểu dữ liệu> constraint <tên ràng buộc khóa ngoại> foreign key references <tên bảng chứa cột cần kết nối>(<tên cột>) ............................. ) Ví dụ: tạo bảng sinh viên có cột mã sinh viên là khóa chính, tên sinh viên trong cơ sở dữ liệu quản lí sinh viên use QLSV
  7. 7. ANHMATTROI – TIN5A 7 create table SinhVien ( MaSV char(10) not null constraint KhoaChinh primary key, TenSV nvarchar(20) ) Ví dụ: tạo bảng lớp học có cột mã lớp là khóa chính, tên lớp và cột mã sinh viên là khóa ngoại tham chiếu đến mã sinh viên ở bảng sinh viên trong cơ sở dữ liệu quản lí sinh viên use QLSV create table LopHoc ( MaLop char(10) not null primary key, TenLop varchar(5), MaSV char(10) not null constraint KhoaNgoai foreign key references SinhVien(MaSV) ) + Các ràng buộc khóa chính và khóa ngoài nếu không có từ khóa constraint tên ràng buộc khóa chính, khóa ngoại sẽ do trình biên dịch đặt tên. + Cột có ràng buộc khóa ngoại khi tham chiếu đến cột của bảng khác thì hai cột này phải cùng kiểu dữ liệu, cùng kích thước. + Nếu trong bảng có từ hai khóa chính trở lên ta có thể dùng constraint <tên khóa chính> primary key (<tên các cột là khóa chính>) các cột này chỉ khai báo có tên cột và kiểu dữ liệu ở trên dòng này. Mỗi bảng chỉ có một tên khóa chính. + Nếu trong bảng có một cột là khóa chính thì giá trị ở cột này không có giá trị nào bị trùng nhau. Nếu có từ hai khóa chính thì giá trị ở mỗi hàng phải khác nhau không được trùng với hàng nào. + Tạo bảng có thêm kiểm tra dữ liệu cho cột bằng từ khóa check: <tên cột> <kiểu dữ liệu> constraint <tên ràng buộc> check(<tên cột> <toán tử điều kiện >,<,>=,…> <toán hạng>) + Đặt giá trị mặc định cho cột: <tên cột> <kiểu dữ liệu> default <giá trị mặc định> Khi thành lập giá trị mặc định cho cột lúc chèn dữ liệu vào bảng nếu không chèn dữ liệu cho cột này thì trình biên dịch tự động gán giá trị mặc định cho cột đó + Tự động tăng giá trị cho cột có kiểu dữ liệu số dùng từ khóa identity(a,b):
  8. 8. ANHMATTROI – TIN5A 8 <tên cột> <kiểu dữ liệu> identity(a,b) Với a là giá trị đầu tiên của cột, b là sau mỗi lần chèn một hàng thành công vào bảng đó a sẽ bằng: a = a + b. Lúc chèn dữ liệu vào bảng ta không chèn dữ liệu cho cột này nữa VD: tạo bảng sinh viên (*) use QLSV create table SinhVien ( MaSV int not null identity(100000,1), TenSV nvarchar(20), NgaySinh datetime not null, Diem float check (Diem>=0 or Diem <=10), GioiTinh nvarchar(4) default N'Nam', QueQuan nvarchar(30), -- giả sử MaSV và NgaySinh là khóa chính constraint KhoaChinh primary key(MaSV,NgaySinh) ) - Xóa bảng: drop table <tên bảng> + Nếu đang có cột từ bảng khác tham chiếu đến phải xóa bảng đó trước mới xóa được bảng này Ví dụ: xóa bảng sinh viên vừa tạo ở trên use QLBH drop table SinhVien - Thêm cột: alter table <tên bảng> add <tên cột> <kiểu dữ liệu> not null(có hoặc không) Ví dụ: thêm cột tên lớp vào bảng sinh viên use QLSV alter table SinhVien add TenLop varchar(10) - Xóa cột:
  9. 9. ANHMATTROI – TIN5A 9 alter table <tên bảng> drop column <tên cột> Ví dụ: xóa cột tên lớp trong bảng sinh viên use QLSV alter table SinhVien drop column TenLop - Thay đổi kiểu dữ liệu của cột: alter table <tên bảng> alter column <tên cột> <kiểu dữ liệu mới> not null (có hoặc không) - Đặt hoặc thay đổi khóa chính: alter table <tên bảng> add constraint <tên ràng buộc> primary key(<tên cột>) Chú ý: cột phải có thuộc tính not null mới thêm hoặc thay đổi khóa chính và bảng hiện tại đang rỗng chưa có hàng nào - Kết nối hai cột thuộc hai bảng khác nhau: alter table <tên bảng 1> add constraint <tên ràng buộc> foreign key(<tên cột thuôc bảng 1>) references <tên bảng 2>(<tên cột của bảng 2>) - Đặt giá trị mặc định cho cột: alter table <tên bảng> add default <giá trị mặc định> for <tên cột> - Xem đặc tính của bảng: exec sp_help <tên bảng> - Chèn dữ liệu vào bảng hay nhập dữ liệu vào từng hàng của bảng: insert into <tên bảng>(<tên cột 1> , <tên cột 2> , .....) values(<giá trị 1> , <giá trị 2> , ...........) + Chèn dữ liệu cho n hàng thì viết n dòng trên và kiểu dữ liệu chèn vào phải phù hợp với từng cột Ví dụ: chền dữ liệu cho bảng sinh viên ở ví dụ (*) use QLBH insert into SinhVien(TenSV,NgaySinh,Diem,GioiTinh,QueQuan)
  10. 10. ANHMATTROI – TIN5A 10 values(N'Đoàn Văn Dũng','06/23/1992',9.5,N'Nữ',N'Nam Định') insert into SinhVien(TenSV,NgaySinh,Diem,GioiTinh,QueQuan) values(N'Đỗ Thanh Bình','06/3/1993',9.5,N'Nữ',N'Hà Nội') insert into SinhVien(TenSV,NgaySinh,Diem,GioiTinh,QueQuan) values(N'Nguyễn Thị Đức','12/15/1993',9.5,N'Nữ',N'Hải Phòng') - Chèn dữ liệu từ bảng khác vào: insert into <tên bảng> select <tên các cột muốn thêm> from <lấy từ bảng nào> + Nếu muốn loại bớt mấy hàng trước khi chèn vào bảng thì thêm where + Số cột chọn ở select == số cột bảng chèn vào và phải cùng kiểu dữ liệu - Lấy các hàng của bảng khác vào bảng: hai bảng có cùng sự phù hợp về kiểu dữ liệu giữa các cột với nhau: select <tên các cột các cột> into <tên bảng cần chèn vào> from <lấy từ bảng nào> - Xóa từng hàng một của bảng: + Trên một bảng: delete <tên bảng> where <điều kiện> + Trên nhiều bảng: delete from <tên bảng 1> from <tên bảng 2> …… where <điều kiện> Ví dụ: xóa thông tin sinh viên Đoàn Văn Dũng delete SinhVien where TenSV = N'Đoàn Văn Dũng' - Xóa tất cả các hàng trong bảng: truncate table <tên bảng> - Sửa đổi thông tin một ô, nhiều ô hoặc cả cột trong bảng: update <tên bảng> set <tên cột> = <dữ liệu> (nếu lấy dữ liệu từ một cột thuộc bảng khác ta thêm) from <cột đó ở bảng nào> where <điều kiện> - Ngắt kết nối ràng buộc hai bảng: khi không chèn được dữ liệu vào bảng alter table <tên bảng> nocheck constraint <tên ràng buộc>
  11. 11. ANHMATTROI – TIN5A 11 Để kết nối lại ràng buộc thay nocheck bằng check - Xem ràng buộc có được tạo thành công không: exec sp_helpconstraint <tên bảng> - Xóa ràng buộc: khóa chính, khóa ngoài: alter table <tên bảng> drop <tên ràng buộc> c. Tạo view - Tạo view: use <tên cơ sở dữ liệu> create view <tên view> as select <tên các cột> from <từ bảng nào> - Xem thông tin view: exec sp_helptext <tên view> - Sửa view: giống như ở bảng alter view <tên view> ………………………… - Xóa view: drop view <tên view> - Truy vấn: select <các cột muôn lấy từ view> from <lấy từ view nào> where <điều kiện> d. Nối hai bảng tạo thành bảng mới select <tên những cột cần nối> from <những cột đó có từ bảng nào> join/inner join <nối vào bảng nào> on <điều kiện kết nối>
  12. 12. ANHMATTROI – TIN5A 12 where <điều kiện> Ví dụ: ta có hai bảng sau BangA BangB Bảng kết quả: select * from BangA as a inner join BangB as b on a.ma = b.ma select a.ma, a.ten, b.diem from BangA as a inner join BangB as b on a.ma = b.ma
  13. 13. ANHMATTROI – TIN5A 13 select a.ma, a.ten, b.diem from BangA as a inner join BangB as b on a.ma = b.ma where a.ma = '1000000001' 4. Một số hàm thông dụng + sum(<tên cột có kiểu số>): tổng các số trong cột này + avg(<tên cột có kiểu số>): giá trị trung bình + count(*): số hàng trong bảng + min(<tên cột>): giá trị nhỏ nhất trong cột + max(<tên cột>): giá trị lớn nhất + getdate(): trả về ngày tháng năm hiện tại + year(<giá trị có kiểu ngày tháng>): trả lại năm + month(<giá trị có kiểu ngày tháng >): trả lại tháng + day(<giá trị có kiểu ngày tháng>): trả lại ngày + sysdatetime(): thời gian SQL Server
  14. 14. ANHMATTROI – TIN5A 14 + concat(‘chuỗi 1’,’chuỗi 2’,…): nối các chuỗi lại với nhau + cast(<kiểu dữ liệu cũ> as <kiểu dữ liệu mới>): chuyển kiểu dữ liệu + convert(<kiểu dữ liệu mới>, <kiểu dữ liệu cũ>): chuyển kiểu dữ liệu + rtrim(<chuỗi>): vất bỏ những khoẳng trắng(dấu cách) ở bên phải chuỗi + ltrim(<chuỗi>): ------------------------------------------------------- trái chuỗi + left(<chuỗi>,<lấy mấy kí tự tính từ bên trái sang phải>): + right(<chuỗi>,<lấy mấy kí tự tính từ phải sang trái>): + len(<chuỗi>): hàm trả về số kí tự của chuỗi + datalength(<chuỗi>): hàm trả về số kí tự của chuỗi nhân với kích thước của một kí tự(B) + charindex(<chuỗi cần tìm>,<tìm ở trong chuỗi nào>,<bắt đầu tìm ở vị trí nào, chỗ này không có mặc định sẽ là 1>): hàm trả về vị trí của chuỗi con trong chuỗi mẹ + substring(<chuỗi gốc>,<vị trí bắt đầu>,<lấy mấy kí tự từ vị trí bắt đầu>): lấy n kí tự trong chuỗi gốc bắt đầu từ vị trí bắt đầu + choose(<chọn kí tự ở vị trí thứ mấy>,<chuỗi gốc>): hàm này chỉ có ở sql server 2012 + reverse(<chuỗi>): đảo ngược chuỗi + upper(<chuỗi>): chuyển chuỗi đó sang kí tự hoa + lower(<chuỗi>): chuyển chuỗi sang kí tự thường + replace(<chuỗi gốc>,<chuỗi bị thay thế là chuỗi con của chuỗi gốc>,<thay bằng chuỗi nào>): + dateadd(<year/month/week/dayhour/minute/second/…>,<thêm giảm bao nhiêu>,<của ngày nào>): + datediff(<year/month/week/…>,<ngày 1>,<ngày 2>): sự chênh lệnh + datename(<year/month/week/…>,<cột có giá trị ngày tháng>): trả lại tên + datepart(<year/month/…>,<cột có giá trị ngày tháng>): trả lại năm,tháng,… + format( value, format, [culture] ): + abs(<giá trị>): trả lại giá trị tuyệt đối + power(x,y): xy
  15. 15. ANHMATTROI – TIN5A 15 + sqrt(x): căn bậc hai của x + square(x): x + round(<số đem làm tròn>,<làm tròn đén chữ số thứ mấy số dương làm tròn đằng sau dấu phẩy, số âm làm tròn đằng trước dấu phẩy>): + rand(): tạo ra một số ngẫu nhiên từ 0.0 -> 1.0 + iif(<biểu thức so sánh>,’true’,’false’): nếu đúng trả lại true sai trả lại false + coalesce(<cột 1>,<cột 2>,’chuỗi a’): nếu cả hai giá trị ở cả hai cột là null thì trả lại chuỗi a + db_name(): tên cơ sở dữ liệu + host_name(): host name + current_user(): người dùng hiện tại + user_name(): tên người dùng + app_name(): tên ứng dụng + isnull(<tên cột>,<nếu giá trị ở cột đó là null thì thay bằng giá trị nào>): 5. Câu lệnh truy vấn a. Khung câu lệnh truy vấn - Tạo định danh cho cột: <tên cột> as <bí danh cho cột> VD: MaSV as MaSinhVien hoặc MaSV as N’Mã sinh viên’ - Select <tên các cột ngăn cách nhau bằng dấu phẩy> + select * : lấy tất cả các cột Ví dụ: cho bảng SinhVien gồm các thông tin sinh viên
  16. 16. ANHMATTROI – TIN5A 16 select * from SinhVen được bảng ban đầu + select top <lấy mấy hàng từ trên xuống> <tên cột>,…….. select top 3 * from SinhVien + select distinct <tên cột>: những giá trị bị trùng trên cột đó chỉ lấy một giá trị select distinct que from SinhVien + select count(*)/avg(<tên cột>)/sum(<tên cột>)/min(<tên cột>)/max(<tên cột>): cột có kiểu số nguyên hoặc số thực
  17. 17. ANHMATTROI – TIN5A 17 Ví dụ: cho bảng BangDiem sau select count(*) as N'Số sinh viên' from BangDiem select round(avg(diem),1) as N'Điểm trung bình' from BangDiem select sum(diem) as N'Tổng điểm' from BangDiem select min(diem) as N'Điểm thấp nhất' from BangDiem select max(diem) as N'Điểm cao nhất' from BangDiem
  18. 18. ANHMATTROI – TIN5A 18 + Nếu lấy dữ liệu từ nhiều bảng khác nhau phải xác định rõ cột đó thuộc bảng nào bằng cách select <tên bảng>.<tên cột> + Có thể có thêm khối chọn select nữa ở khối chọn select ngoài, kết quả ở khối chọn select ở trong phải là 1 giá trị select <tên cột>,(select <tên cột> from <tên bảng>) from <tên bảng> Ví dụ: với dữ liệu của bảng BangDiem select ten as Ten, (select top 1 masv from BangDiem) as MaSV from BangDiem + Tạo định danh cho cột select <tên cột> as <tên cột mới> Vd: select MaSV as N’Mã sinh viên’ hoặc select MaSV as MSV from SinhVien + Có thể có lệnh chuyển case trong khối select VD: hiện thị tên sv, giới tính nếu là nữ hiển thị là 0 nam là 1 Ta có bảng thông tin sinh viên như sau:
  19. 19. ANHMATTROI – TIN5A 19 select masv as N'Mã sinh viên', ten N'Tên sinh viên', ngaysinh as N'Ngày sinh', case gioitinh when N'Nam' then '1' else '0' end as N'Giới tính', que as N'Quê' from SinhVien - From <từ bảng nào> + Nếu lấy dữ liệu từ nhiều bảng bạn có thể tạo bí danh cho bảng ví dụ như: select a.MaSV, a.TenSV, b.DT from SinhVien a, DiemThi b where a.MaSV = b.MaSV Thay cho: select SinhVien.MaSV, SinhVien.TenSV, DiemThi.DT from SinhVien, DiemThi
  20. 20. ANHMATTROI – TIN5A 20 where SinhVien.MaSV = DiemThi.MaSV + Lấy bản ghi từ khối chọn select bằng cách tạo định danh VD: select a.masv as N'Mã sinh viên' from ( select masv, ten from SinhVien ) as a - Where <điều kiện để lấy hay không lấy hàng này> Điều kiện ở mệnh đề where: + =,>,<,>=,<=,<>,!>,!<,!= giá trị ô của cột đó so sánh với giá trị nào đó Ví dụ: cho bảng điểm của sinh viên như sau:
  21. 21. ANHMATTROI – TIN5A 21 Cho biết tên những sinh viên có điểm >= 7 select ten as N'Những sinh vien có điểm lớn hơn hoặc bằng 7' from @bang_a where diem >= 7 + not between/between <giá trị 1> and <giá trị 2>: giá trị của ô thuộc cột đó không/nằm từ giá trị 1 đến giá trị 2 và kiểu dữ liệu của hai giá trị đó là kiểu số(int, float, decimal, datetime,..) VD: cho biết những sinh viên có điểm trong khoảng [8,9] select ten as N'Tên sinh viên' from BangDiem where diem between 8 and 9 VD: những sinh viên có điểm không nằm trong khoảng [8,9] select ten as N'Tên sinh viên' from BangDiem where diem between 8 and 9
  22. 22. ANHMATTROI – TIN5A 22 + like ‘%a%’ hoặc like ‘a%’ hoặc like ‘%a’ hoặc like ‘a_’ hoặc like ‘giá trị[kí tự]’: giá trị của ô thuộc bảng có kiểu chữ có chung kí tự VD: cho biết họ tên của những sinh viên có tên là Bình select ten as N'Tên sinh viên' from BangDiem where ten like N'%Bình' + and not(<tên cột> = ‘s’ or <tên cột> = ‘d’): và 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 <tên cột> is null chứ không phải <tên cột> = 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 <gom nhóm theo cột nào> + Số cột cần đem gom nhóm ở group by phải >= số cột được chọn ở select(>=2) trừ đi 1
  23. 23. ANHMATTROI – TIN5A 23 + Nếu có các hàm count/sum/avg/min/max(<tên cột>) ở select: những hàm này chỉ có tác dụng trên nhóm - Having <điền kiện> -- chỉ có tác dụng trên nhóm không có tác dụng đến toàn bảng - Order by <sắp xếp theo cột nào> 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(<tên cột>),… 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 <nhảy mấy hàng từ trên xuống> rows - Fetch next <chỉ lấy mấy hàng> 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 <tên cột> from <tên bảng 1> union/union all select <tên cột> from <tên bảng 2> Ví dụ: select masv from SinhVien union all
  24. 24. 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 @<tên biến> <kiểu dữ liệu> 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
  25. 25. ANHMATTROI – TIN5A 25 + Gán giá trị: set @<tên biến> = <giá trị> 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 <tên con trỏ không có @ ở trước tên biến> cursor for select <các cột số các cột = số các biến khai báo ở trên> from <tên bảng> ………………… open <tên con trỏ> fetch next from <tên con trỏ> into <thứ tự các biến phù hợp với các cột ở trên> 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
  26. 26. ANHMATTROI – TIN5A 26 <các lệnh lập trình/truy vấn> fetch next from <tên con trỏ> into <các biến> end close <tên con trỏ> deallocate <tên con trỏ> 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
  27. 27. ANHMATTROI – TIN5A 27 - Câu lệnh rẽ nhánh if … else if <điều kiện> begin <các lệnh -- nếu có một lệnh không cần begin end cũng được> end else begin <các lệnh> 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 tapQuanlysinvien.mdf', size = 10mb, maxsize = 30mb, filegrowth = 5% ) log on ( name = 'Quanlysinhvien_log', filename = 'C:Bai tapQuanlysinvien_log.ldf',
  28. 28. 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 <tên cột/tên biến> when <nếu giá trị ở cột là x/của biến là x thì> then <thực hiện công việc gì đó> when <nếu giá trị ở cột là y/của biến là y thì> then <thực hiện công việc gì đó> 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
  29. 29. 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 <điều kiện> begin <các lệnh> + 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
  30. 30. 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:
  31. 31. ANHMATTROI – TIN5A 31 create procedure/proc <tên thủ tục>(<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 <các khối lệnh truy vấn ở đây> 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 <tên thủ tục> - Lời gọi thủ tục: exec <tên thủ tục> <các tham số truyền vào> + 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'
  32. 32. ANHMATTROI – TIN5A 32 8. Hàm - Tạo hàm + Dạng chung: create function <tên hàm>(<các tham số truyền vào>) returns <kiểu giá trị trả về> as begin <các câu lệnh truy vấn hoặc các lệnh lập trình> return <giá trị trả lại> end + Tạo hàm với kiểu giá trị trả lại là bảng: create function <tên hàm>(<các tham số truyền vào>) returns @<tên biến có kiểu dữ liệu bảng> 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 @<tên biến bảng ở trên> select <chọn các cột muốn gán cho các biến> from <lấy từ bảng nào> ……………… return end - Sửa hàm: Thay create bằng alter - Xóa hàm: drop function <tên hàm>
  33. 33. ANHMATTROI – TIN5A 33 - Lời gọi hàm: + Với hàm trả lạ một giá trị select dbo.<tên hàm>(<truyền cho hàm những tham số nào>) 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.<tên hàm>(<các tham số truyền vào>) 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
  34. 34. ANHMATTROI – TIN5A 34 where @SoTK = SoTK return end select * from dbo.CTGD_TK(‘9512’)

×