co so du lieu t sql

34
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ố: Snguyê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á tr0, 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ị

Upload: anhmattroi

Post on 05-Dec-2014

6.834 views

Category:

Documents


3 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Co so du lieu t sql

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ị

Page 2: Co so du lieu t sql

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

Page 3: Co so du lieu t sql

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

Page 4: Co so du lieu t sql

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 tap\Quanlysinvien.mdf', size = 10mb,

Page 5: Co so du lieu t sql

ANHMATTROI – TIN5A

5

maxsize = 30mb, filegrowth = 5%

) log on (

name = 'Quanlysinhvien_log', filename = 'C:\Bai tap\Quanlysinvien_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>

Page 6: Co so du lieu t sql

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

Page 7: Co so du lieu t sql

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):

Page 8: Co so du lieu t sql

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:

Page 9: Co so du lieu t sql

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)

Page 10: Co so du lieu t sql

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>

Page 11: Co so du lieu t sql

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>

Page 12: Co so du lieu t sql

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

Page 13: Co so du lieu t sql

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

Page 14: Co so du lieu t sql

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

Page 15: Co so du lieu t sql

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

Page 16: Co so du lieu t sql

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

Page 17: Co so du lieu t sql

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

Page 18: Co so du lieu t sql

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:

Page 19: Co so du lieu t sql

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

Page 20: Co so du lieu t sql

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:

Page 21: Co so du lieu t sql

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

Page 22: Co so du lieu t sql

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

Page 23: Co so du lieu t sql

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

Page 24: Co so du lieu t sql

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

Page 25: Co so du lieu t sql

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

Page 26: Co so du lieu t sql

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

Page 27: Co so du lieu t sql

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 tap\Quanlysinvien.mdf', size = 10mb, maxsize = 30mb, filegrowth = 5% ) log on ( name = 'Quanlysinhvien_log', filename = 'C:\Bai tap\Quanlysinvien_log.ldf',

Page 28: Co so du lieu t sql

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

Page 29: Co so du lieu t sql

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

Page 30: Co so du lieu t sql

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:

Page 31: Co so du lieu t sql

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'

Page 32: Co so du lieu t sql

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>

Page 33: Co so du lieu t sql

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

Page 34: Co so du lieu t sql

ANHMATTROI – TIN5A

34

where @SoTK = SoTK return end select * from dbo.CTGD_TK(‘9512’)