Tải bản đầy đủ (.pdf) (50 trang)

Bài giảng SQL server: Chương 3 - Lê Thị Minh Nguyện

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.27 MB, 50 trang )

10/03/2015

TRƢỜNG CAO ĐẲNG CƠNG NGHỆ THƠNG TIN
THÀNH PHỐ HỒ CHÍ MINH

CHƢƠNG 3. LẬP TRÌNH VỚI
CƠ SỞ DỮ LIỆU

GV: Lê Thị Minh Nguyện
Email:

NỘI DUNG
 Biến cục bộ
 Biến hệ thống
 Các câu lệnh truy vấn dữ liệu
 Các hàm thường dùng

 Cấu trúc điều khiển
 Cấu trúc lặp
 Biến kiểu dữ liệu cursor
2

1


10/03/2015

1.Biến cục bộ
Biến cục bộ: dùng để lưu trữ các giá trị tạm
thời trong q trình tính tốn các xử lý bởi sau
khi thốt khỏi chương trình hoặc tắt máy thì giá


trị các biến này khơng cịn trong bộ nhớ nữa.
 Cú pháp:

DECLARE

@Tên_biến kiểu_dữ_liệu[,…]

 Ví dụ:
DECLARE

@ten_ncc

varchar(50),

@ngayxh DATETIME
 Gán giá trị cho biến:
 Dùng SET hoặc SELECT cùng với phép gán (= )
3

1.Biến cục bộ
Ví dụ 1: để gán giá trị ngày 25/3/2002 vào biến ngày xuất
hàng
DECLARE @ngayxh DATETIME
SET @ngayxh = „25-3-2014‟
Ví dụ 2:
DECLARE @TongSLDat
int
SELECT
@TongSLDat = SUM(SLDAT)
FROM

CTDH
Ví dụ 3:
DECLARE @MinSLDat int, @MaxSLDat int
SELECT @MinSLDat = MIN(SLDAT),
@MaxSLDat = MAX(SLDAT),
FROM
CTDH

2


10/03/2015

1.Biến cục bộ
Xem giá trị hiện hành của biến
Cú pháp:
PRINT
@Tên_biến | Biểu_thức_chuỗi
Ví dụ:
DECLARE @MinSLDat int, @MaxSLDat int
SELECT @MinSLDat = MIN(SLDAT),
@MaxSLDat = MAX(SLDAT),
FROM CTHDON
PRINT „Số lượng đặt thấp nhất là:‟
PRINT @MinSLDat
PRINT „Số lượng đặt cao nhất là:‟
5
PRINT @MaxSLDat

1.Biến cục bộ

Phạm vi hoạt động của biến
 Trong Transaction-SQL phạm vi hoạt động của biến chỉ
nằm trong một thủ tục nội tại (stored procedure) hoặc một
lô (batch) chứa các câu lệnh mà biến đã được khai báo
bên trong đó.
 Lơ được xem như một nhóm tập hợp của một hoặc nhiều
câu lệnh Transaction-SQL sẽ được biên dịch đồng thời
cùng lúc tại SQL Server.
 Một từ khố GO chỉ định kết thúc 1 lơ

6

3


10/03/2015

1.Biến cục bộ
Do các câu lệnh trong một lô được biên dịch tại SQL
Server vì thế khi có ít nhất 1 lệnh bên trong lơ có lỗi về cú
pháp lúc biên dịch thì hệ thống sẽ khơng có lệnh nào được
thực thi bên trong lơ đó.
Ví dụ:
SELECT * FROM NHACC ORDER BY TenNhaCC
INSERT INTO NHACC
(„C01‟, „Nguyen Van A‟, ‟87 Ly Tu Trong‟,„0903.123456‟)
SELECT * FROM VATTU ORDER BY Tenvtu DESC
GO

(thiếu từ khố VALUES) thì các

lệnh SELECT bên trong lơ này
khơng được thực hiện.

7

1.Biến cục bộ
Đối với các lỗi khi thực hiện (run-time) bên trong 1 lô nếu
trường hợp các lỗi vi phạm ràng buộc tồn vẹn dữ liệu thì
hệ thống SQL Server chỉ ngưng lại câu lệnh gây lỗi và thực
hiện tiếp các lệnh bên trong lơ đó.
(mặc dù vi phạm ràng buộc tồn vẹn
Ví dụ:
SELECT * FROM NHACC
ORDER BY
TenNhaCC

trong INSERT (giả sử trùng khố
chính ở cột MaNCC) nhưng các lệnh
SELECT bên trong lơ này vẫn được
thực hiện bình thường.

INSERT INTO NHACC
VALUES („C01‟, „Nguyen Van A‟, ‟87 Ly Tu Trong‟,„0903.123456‟)
SELECT * FROM VATTU
ORDER BY
Tenvtu DESC
GO

4



10/03/2015

1.Biến cục bộ
Ví dụ:
DECLARE @NgayDH datetime
SELECT
@NgayDH = MAX(NGAYDH)
FROM
DONDH
GO
PRINT “ngay dat hang gan nhat: ” + convert(char(12),
@ngaydh)
HT sẽ báo lỗi vì có thêm từ khố GO ở giữa 2
GO
lệnh SELECT và PRINT. Bởi vì khi đó các
lệnh này được chia làm 2 lô và lô thứ hai sẽ
không hiểu biến @ngaydh đã được khai báo
trong lô thứ 1.

2.Biến hệ thống
Các biến hệ thống trong SQL Server luôn bắt đầu bằng 2
chữ @@.
Giá trị mà chúng ta đang lưu trữ do hệ thống SQL cung cấp.
Người lập trình khơng can thiệp trực tiếp để gán giá trị vào

các biến hệ thống.

10


5


10/03/2015

2.Biến hệ thống
Tên biến

kiểu trả
về

Dùng để trả về

connections

số nguyên

Tổng số các kết nối vào SQL Server từ khi nó được
khởi động

Error

số nguyên

số mã lỗi của câu lệnh thực hiện gần nhất. Khi một
lệnh thực hiện thành cơng thì biến này có giá trị là 0

Language

chuỗi


Tên ngơn ngữ mà hệ thống SQL đag sử dụng. Mặc
định là US_English

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 của máy tính cục bộ được cài đặt trong SQL
Server

ServiceName

chuỗi

Tên dịch vụ kèm theo bên dưới SQL Server

Fetch_Status

số nguyên

Trạng thái của việc đọc dữ liệu trong bảng theo cơ chế
dòng mẩu tin (cursor). Khi dữ liệu đọc mẩu tin thành

công thì biến này có giá trị là 0

Version

chuỗi

Phiên bản, ngày của phẩm SQL Server và loại CPU

2.Biến hệ thống
Ví dụ:
SELECT * FROM NHACC
SELECT @@ROWCOUNT
(Trả về tổng số mẩu tin đang hiện có trong bảng
NHACC )

Ví dụ:
UPDATE
SET
WHERE
SELECT

SANPHAM
PHATRAM = PHANTRAM + 5
MAVTU like “TV%”
@@ROWCOUNT

(Trả về tổng số mẩu tin có MAVTU bắt đầu bằng chữ
12
“TV” trong bảng VATTU)


6


10/03/2015

3.Các câu lệnh truy vấn dữ liệu
Truy vấn cơ bản
Truy vấn lồng
Hàm kết hợp
Gom nhóm
Điều kiện trên nhóm
Cập nhật dữ liệu
13

3.1.Truy vấn cơ bản
Gồm 3 mệnh đề
SELECT <danh sách các cột>
FROM <danh sách các bảng>
WHERE <điều kiện>
 <danh sách các cột>
• Tên các cột cần được hiển thị trong kết quả truy vấn

 <danh sách các bảng>
• Tên các bảng liên quan đến câu truy vấn

 <điều kiện>
• Biểu thức boolean xác định dịng nào sẽ được rút trích
• Nối các biểu thức: AND, OR, và NOT
• Phép tốn:  ,  ,  ,  ,  , , LIKE và BETWEEN


14

7


10/03/2015

Ví dụ
Lấy tất cả các cột của quan hệ kết quả

SELECT *
FROM NHANVIEN
WHERE PHG=5

Tên bí danh

SELECT MANV, HONV, TENLOT + TENNV as HOTEN
FROM NHANVIEN
WHERE PHG=5 AND PHAI=„Nam‟
Mở rộng

SELECT MANV, LUONG*1.1 AS „LUONG10%‟
FROM NHANVIEN
WHERE PHG=5 AND PHAI=„Nam‟

15

Ví dụ
Loại bỏ các dịng trùng nhau


SELECT LUONG
FROM NHANVIEN
WHERE PHG=5 AND
PHAI=„Nam‟

SELECT DISTINCT LUONG
FROM NHANVIEN
WHERE PHG=5 AND
PHAI=„Nam‟

LUONG
30000
25000
25000
38000

- Tốn chi phí
- Người dùng
muốn thấy

LUONG
30000
25000
38000

16

8



10/03/2015

Ví dụ
BETWEEN

SELECT MANV, TENNV
FROM NHANVIEN
WHERE LUONG>=20000 AND LUONG<=30000
SELECT MANV, TENNV
FROM NHANVIEN
WHERE LUONG BETWEEN 20000 AND 30000
NOT BETWEEN

SELECT MANV, TENNV
FROM NHANVIEN
WHERE LUONG NOT BETWEEN 20000 AND 30000
17

Ví dụ
IN

SELECT MANV, TENNV
FROM NHANVIEN
WHERE PHG IN (4,5)
SELECT MANV, TENNV
FROM NHANVIEN
WHERE PHG = 4 OR PHG=5

NOT IN


SELECT MANV, TENNV
FROM NHANVIEN
WHERE PHG NOT IN (4,5)

18

9


10/03/2015

Ví dụ
Ký tự bất kỳ

LIKE

SELECT MANV, TENNV
FROM NHANVIEN
WHERE DCHI LIKE „Nguyen _ _ _ _‟

SELECT MANV, TENNV
FROM NHANVIEN
WHERE DCHI LIKE „Nguyen %‟

Chuỗi bất kỳ

NOT LIKE

SELECT MANV, TENNV
FROM NHANVIEN

WHERE HONV NOT LIKE „Nguyen‟

19

Ví dụ

NULL

SELECT MANV, TENNV
FROM NHANVIEN
WHERE MA_NQL IS NULL
SELECT MANV, TENNV
FROM NHANVIEN
WHERE MA_NQL IS NOT NULL

20

10


10/03/2015

Ví dụ
Dùng để hiển thị kết quả câu truy vấn
theo một thứ tự nào đó
Cú pháp
SELECT <danh sách các cột>
FROM <danh sách các bảng>
WHERE <điều kiện>
ORDER BY <danh sách các cột>


 ASC: tăng (mặc định)
 DESC: giảm
21

Ví dụ
SELECT MA_NVIEN, SODA
FROM PHANCONG
ORDER BY MA_NVIEN DESC, SODA
MA_NVIEN
999887777
999887777
987987987
987987987
987654321
987654321
987654321

SODA
10
30
10
30
10
20
30
22

11



10/03/2015

3.2.Truy vấn lồng
Chỉ một câu lệnh truy vấn lựa chọn (SELECT)
được lồng vào các câu lệnh truy vấn khác
nhằm thực hiện các truy vấn tính tốn phức
tạp. Khi sử dụng đến truy vấn lống chúng ta
cần lưu tâm đến một vài yếu tố sau:
 Cần mở và đóng ngoặc đơn cho câu lệnh truy vấn con.
 Chúng ta chỉ được phép tham chiếu đến tên một cột hoặc
một biểu thức sẽ trả về giá trị trong truy vấn con.
 Kết quả truy vấn con có thể trả về là một giá trị đơn lẻ hoặc
một danh sách các giá trị.
23

 Cấp độ lồng nhau của các truy vấn con bên trong SQL
Server là không giới hạn.

3.2.Truy vấn lồng
Mệnh đề WHERE của câu truy vấn cha
 <biểu thức> <so sánh tập hợp> <truy vấn con>
 So sánh tập hợp thường đi cùng với một số tốn tử





= ,<>, >=, <=, <, >
IN, NOT IN

ALL
ANY hoặc SOME

 Kiểm tra sự tồn tại
• EXISTS
• NOT EXISTS

24

12


10/03/2015

3.2.Truy vấn lồng
 Truy vấn con trả về một giá trị đơn: là truy vấn mà kết
qủa trả về của nó ln đảm bảo chỉ là một giá trị đơn.
 Ví dụ: để biết được danh sách các đơn đặt hàng gần đây
nhất.

SELECT
FROM

MAX(NGAYDH)
DONDH

Kết quả trả về: 2015-01-25 00:00:00

SELECT
FROM

WHERE

*
DONDH
NGAYDH =

“2015-01-25”

 Kết hợp 2 câu truy vấn trên
SELECT
FROM
WHERE

*
DONDH
NGAYDH =

(SELECT MAX(NGAYDH)
FROM
DONDH)

25

3.2.Truy vấn lồng
 Truy vấn con trả về danh sách các giá trị: trả về của
nó là danh sách các giá trị hay cịn gọi là một tập hợp
các phần tử. Tốn tử IN sẽ được sử dụng để so sánh
truy vấn con dạng này
 Ví dụ 1: để biết nhà cung cấp nào mà công ty đã đặt hàng trong
tháng 01/2015.


SELECT
FROM
WHERE

MaNCC
DONDH
Convert(char(7), NgayDH, 21) = “2015-07”

 Kết quả trả về

MaNCC
C03
C01

SELECT

TenNCC, DienThoai

FROM

NHACC

WHERE

MaNCC IN(“C01”, “C03”)

26

13



10/03/2015

3.2.Truy vấn lồng
Đâu đảm bảo rằng trong tháng 01/2002 công
ty chỉ đặt hàng cho 2 nhà cung cấp C01 và
C03. Do đó để ln ln có được danh sách họ
tên các nhà cung cấp mà công ty đã đặt trong
tháng 01-2002 chúng ta thực hiện truy vấn con
sau:
SELECT TenNCC, DienThoai
FROM

NHACC

WHERE MaNCC IN(SELECT

MaNCC

FROM

DONDH

WHERE

Covert(char(7), NgayDH, 21) = “2015-01”)

27


3.2.Truy vấn lồng
Có 2 loại truy vấn lồng
 Lồng phân cấp
• Mệnh đề WHERE của truy vấn con khơng tham chiếu đến thuộc tính
của các quan hệ trong mệnh đề FROM ở truy vấn cha
• Khi thực hiện, câu truy vấn con sẽ được thực hiện trước

 Lồng tương quan
• Mệnh đề WHERE của truy vấn con tham chiếu ít nhất một thuộc tính
của các quan hệ trong mệnh đề FROM ở truy vấn cha
• Khi thực hiện, câu truy vấn con sẽ được thực hiện nhiều lần, mỗi lần
tương ứng với một bộ của truy vấn cha
28

14


10/03/2015

3.2.Truy vấn lồng
Lồng phân cấp
SELECT
FROM
WHERE

TenNCC, DienThoai
NHACC
MaNCC IN
(SELECT MaNCC
FROM

DONDH
WHERE Convert(char(7), NgayDH, 21) = “2015-01”)

29

3.2.Truy vấn lồng
Lồng tương quan
SELECT TenNCC, DienThoai
FROM
NHACC
WHERE EXISTS
(SELECT *
FROM
DONDH
WHERE Covert(char(7), NgayDH, 21) = “2007-01”
AND NHACC.MaNCC = DONDH.MaNCC)

30

15


10/03/2015

Ví dụ
 Ví dụ 2: Danh sách các nhà cung cấp nào mà công ty
chưa bao giờ đặt hàng:
SELECT

TenNhaCC, DienThoai


FROM

NHACC

WHERE

MaNCC NOT IN (SELECT Distinct MaNCC
FROM

 Hoặc

DONDH)
Lưu ý:
IN tương đương =ANY

SELECT

TenNhaCC, DienThoai

FROM

NHACC

WHERE

MaNCC <> ALL (SELECT Distinct MaNCC

NOT IN tương đượng <>ALL


FROM

31

DONDH)

Ví dụ
 Tìm những nhân viên khơng có thân nhân nào
SELECT *
FROM NHANVIEN
WHERE MANV NOT IN (
SELECT MA_NVIEN
FROM THANNHAN )

Lồng tƣơng quan

Lồng phân cấp

SELECT *
FROM NHANVIEN
WHERE NOT EXISTS (
SELECT *
FROM THANNHAN
WHERE MANV=MA_NVIEN)
32

16


10/03/2015


3.3.Hàm kết hợp
COUNT
 COUNT(*) đếm số dịng
 COUNT(<tên thuộc tính>) đếm số giá trị khác
NULL của thuộc tính
 COUNT(DISTINCT <tên thuộc tính>) đếm số giá trị
khác nhau và khác NULL của thuộc tính
MIN
MAX
SUM
AVG
Các hàm kết hợp được đặt ở mệnh đề SELECT
33

Ví dụ

34

17


10/03/2015

Ví dụ
Tìm tổng lương, lương cao nhất, lương thấp
nhất và lương trung bình của các nhân viên
SELECT SUM(LUONG), MAX(LUONG), MIN(LUONG), AVG(LUONG)
FROM NHANVIEN


Cho biết số lượng nhân viên của phòng
„Nghiên cứu‟
SELECT COUNT(*) AS SL_NV
FROM NHANVIEN, PHONGBAN
WHERE PHG=MAPHG AND TENPHG=‘Nghiên cứu’

35

3.4.Gom nhóm
Cú pháp
SELECT <danh sách các cột>
FROM <danh sách các bảng>
WHERE <điều kiện>
GROUP BY <danh sách các cột gom nhóm>

Sau khi gom nhóm
 Mỗi nhóm các bộ sẽ có cùng giá trị tại các thuộc tính
gom nhóm
36

18


10/03/2015

Ví dụ
Cho biết số lượng nhân viên của từng phịng ban
SELECT PHG, COUNT(*) AS SL_NV
FROM NHANVIEN
GROUP BY PHG


SELECT TENPHG, COUNT(*) AS SL_NV
FROM NHANVIEN, PHONGBAN
WHERE PHG=MAPHG
37

GROUP BY TENPHG

Ví dụ
Với mỗi nhân viên cho biết mã số, họ tên, số
lượng đề án và tổng thời gian mà họ tham gia
SELECT

MA_NVIEN, COUNT(*) AS SL_DA,
SUM(THOIGIAN) AS TONG_TG
FROM
PHANCONG
GROUP BY MA_NVIEN

SELECT

MA_NVIEN ,HONV, TENNV, COUNT(*) AS SL_DA,
SUM(THOIGIAN) AS TONG_TG
FROM
PHANCONG, NHANVIEN
WHERE
MA_NVIEN=MANV
38
GROUP BY MA_NVIEN, HONV, TENNV


19


10/03/2015

3.5.Điều kiện trên nhóm
Cú pháp
SELECT <danh sách các cột>
FROM <danh sách các bảng>
WHERE <điều kiện>
GROUP BY <danh sách các cột gom nhóm>
HAVING <điều kiện trên nhóm>

Cho biết những nhân viên tham gia từ 2 đề án
trở lên
SELECT
FROM
GROUP BY
HAVING

MA_NVIEN, COUNT(*) as SLDA
PHANCONG
MA_NVIEN
COUNT(*) >= 2

39

Ví dụ
Cho biết những phịng ban (TENPHG) có lương
trung bình của các nhân viên lớn lơn 20000

SELECT PHG, AVG(LUONG) AS LUONG_TB
FROM NHANVIEN
GROUP BY PHG
HAVING AVG(LUONG) > 20000

SELECT TENPHG, AVG(LUONG) AS LUONG_TB
FROM NHANVIEN, PHONGBAN
WHERE PHG=MAPHG
GROUP BY TENPHG
HAVING AVG(LUONG) > 20000

40

40

20


10/03/2015

Ví dụ
Tìm những phịng ban có lương trung bình cao
nhất
SELECT PHG, AVG(LUONG) AS
LUONG_TB
FROM NHANVIEN
GROUP BY PHG
HAVING MAX(AVG(LUONG))
SELECT PHG, AVG(LUONG) AS
LUONG_TB

FROM NHANVIEN
GROUP BY PHG
HAVING AVG(LUONG) >= ALL (
SELECT AVG(LUONG) 41
FROM NHANVIEN
GROUP BY PHG)

Kết luận

SELECT <danh sách các cột>
FROM <danh sách các bảng>
[WHERE <điều kiện>]
[GROUP BY <các thuộc tính gom nhóm>]
[HAVING <điều kiện trên nhóm>]
[ORDER BY <các thuộc tính sắp thứ tự>]

42

21


10/03/2015

3.6.Cập nhật dữ liệu
Thêm (insert)
Xóa (delete)
Sửa (update)

43


3.6.1.Thêm (insert)
Dùng để thêm 1 hay nhiều dòng vào bảng
Để thêm dữ liệu
 Tên quan hệ
 Danh sách các thuộc tính cần thêm dữ liệu
 Danh sách các giá trị tương ứng

Cú pháp (thêm 1 dịng)
INSERT INTO <tên bảng>(<danh sách các thuộc tính>)
VALUES (<danh sách các giá trị>)
44

22


10/03/2015

Ví dụ

INSERT INTO NHANVIEN(HONV, TENLOT, TENNV, MANV)
VALUES („Le‟, „Van‟, „Tuyen‟, „635635635‟)
INSERT INTO NHANVIEN(HONV, TENLOT, TENNV, MANV, DCHI)
VALUES („Le‟, „Van‟, „Tuyen‟, „635635635‟, NULL)

INSERT INTO NHANVIEN
VALUES („Le‟, „Van‟, „Tuyen‟, „635635635‟, ‟12/30/1952‟, ‟98 HV‟, „Nam‟,
„37000‟, 4)

45


3.6.1.Thêm (insert)
Nhận xét
 Thứ tự các giá trị phải trùng với thứ tự các cột
 Có thể thêm giá trị NULL ở những thuộc tính
khơng là khóa chính và NOT NULL
 Câu lệnh INSERT sẽ gặp lỗi nếu vi phạm RBTV
• Khóa chính
• Tham chiếu
• NOT NULL - các thuộc tính có ràng buộc NOT NULL
46
bắt buộc phải có giá trị

23


10/03/2015

3.6.1.Thêm (insert)
Cú pháp (thêm nhiều dòng)
INSERT INTO <tên bảng>(<danh sách các thuộc tính>)
<câu truy vấn con>

47

Ví dụ
CREATE TABLE THONGKE_PB (
TENPHG VARCHAR(20),
SL_NV INT,
LUONG_TC INT
)


INSERT INTO THONGKE_PB(TENPHG, SL_NV, LUONG_TC)
SELECT TENPHG, COUNT(MANV), SUM(LUONG)
FROM NHANVIEN, PHONGBAN
WHERE PHG=MAPHG
GROUP BY TENPHG
48

24


10/03/2015

3.6.2.Xóa (delete)
Dùng để xóa các dịng của bảng
Cú pháp:
DELETE FROM <tên bảng>
[WHERE <điều kiện>]

Ví dụ:
DELETE FROM NHANVIEN
WHERE MANV=„345345345‟
DELETE FROM NHANVIEN

49

Ví dụ
Xóa đi những nhân viên ở phịng „Nghien cuu‟

DELETE FROM NHANVIEN

WHERE PHG IN (
SELECT MAPHG
FROM PHONGBAN
WHERE TENPHG=„Nghien cuu‟)

50

25


×