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