Professional Documents
Culture Documents
TÀI LIỆU THI QUẢN TRỊ CSDL VỚI SQL SERVER
TÀI LIỆU THI QUẢN TRỊ CSDL VỚI SQL SERVER
Tạo Bảng :
CREATE TABLE <Tên Bảng>(
<Tên Cột 1> <Kiểu dữ liệu> PRIMARY KEY NOT NULL,
<Tên Cột 2> <Kiểu dữ liệu> NOT NULL,
…
);
+VD 2: Tạo SP hiển thị số lượng nhân viên với mã nhập từ bàn phím
CREATE PROC SOLUONG_NHAN_VIEN @mada int
AS
BEGIN
DECLARE @dem int ;
SELECT @dem=count(*)
from PHANCONG
where MADA=@mada
PRINT N'SỐ LƯỢNG NHÂN VIÊN CÓ MÃ DỰ ÁN NHẬP VÀO TỪ BÀN PHÍM:'+STR(@DEM)
END
EXEC SOLUONG_NHAN_VIEN @MADA=20
DROP PROC SOLUONG_NHAN_VIEN
+VD 10: Tạo PROC Lấy thông tin nhân viên dựa trên mã
CREATE PROC XUATNV_THEOMA @MANV NVARCHAR(9)
AS
BEGIN
SELECT *
FROM NHANVIEN
WHERE MANV = @MANV
END
EXEC XUATNV_THEOMA @MANV = '001'
DROP PROC XUATNV_THEOMA
Tạo FUNCTION:
-Công thức:
Loại 1: Tạo Function trả về giá trị loại Scalar-valued
CREATE FUNCTION <Tên function>([@<tên tham số> <kiểu dữ liệu> [= <giá trị mặc định>], …,[...]])
RETURNS <kiểu dữ liệu>
[WITH ENCRYPTION]
[AS]
BEGIN
[Thân của hàm]
RETURN <Biểu thức giá trị đơn>
END
Loại 2: Tạo Function trả về giá trị loại Table-valued
a) Hàm giá trị bảng đơn giản
CREATE FUNCTION <Tên function> ([@<tên tham số> <kiểu dữ liệu> [= <giá trị mặc định>], …,[...]])
RETURNS TABLE
[WITH ENCRYPTION]
[AS]
RETURN <Câu lệnh SQL>
END
b) Hàm giá trị bảng đa câu lệnh
CREATE FUNCTION <Tên function>([@<tên tham số> <kiểu dữ liệu> [= <giá trị mặc định>], …,[...]])
RETURNS @<tên biến trả về> TABLE (<tên cột 1> <kiểu dữ liệu> [tùy chọn thuộc tính], ..., <tên cột n> <kiểu dữ liệu>
[tùy chọn thuộc tính])
[AS]
BEGIN
<Câu lệnh SQL>
RETURN
END
-Ví dụ:
+VD 1: Tạo FUNCTION tính tuổi nhân viên
CREATE FUNCTION tinhTuoiNV (@manv int) RETURNS INT
AS
BEGIN
declare @tuoi int;
SELECT @TUOI=YEAR(GETDATE())-YEAR(NGSINH)
FROM NHANVIEN
WHERE MANV=@manv
RETURN @tuoi
END
PRINT N'SO TUOI NHAN VIEN LÀ:'+CONVERT(VARCHAR,DBO.tinhTuoiNV(001))
+VD 3: Tạo FUNCTION đếm số lượng nhân viên theo giới tính
CREATE FUNCTION tinhSLNV (@phai nvarchar(3)) RETURNS INT
AS
BEGIN
declare @sl int;
select @sl=Count(*) from NHANVIEN where phai=@phai
return @sl
END
PRINT N'SỐ LƯỢNG NHÂN VIÊN THEO PHÁI :'+CONVERT(VARCHAR,DBO.tinhSLNV('nam'))
PRINT N'SỐ LƯỢNG NHÂN VIÊN THEO PHÁI :'+CONVERT(VARCHAR,DBO.tinhSLNV('nữ'))
+VD 4: Tạo FUNCTION Tryền tham số đầu vào là Mã Phòng, cho biết tên phòng ban, họ tên người trưởng phòng và số
lượng đề án mà phòng ban đó chủ trì.
CREATE FUNCTION tenTP_Sl_DA(@maphong int ) RETURNS table (
TenPhong VARCHAR(50),
HoTenTruongPhong VARCHAR(100),
SoLuongDeAn INT)
AS
BEGIN
RETURN
DECLARE @ID_TP nvarchar ;
DECLARE @maphong int;
SELECT PHONGBAN.TENPHG,NHANVIEN.HONV AS HOTENTRUONGPHONG,COUNT(DEAN.MADA) AS SL_DE_AN
INTO TenPhong,HoTenTruongPhong, SoLuongDeAn
FROM PHONGBAN INNER JOIN NHANVIEN ON PHONGBAN.TRPHG=NHANVIEN.MANV
LEFT JOIN DEAN ON PHONGBAN.MAPHG=NHANVIEN.PHG
WHERE PHONGBAN.MAPHG=@maphong
group by PHONGBAN.TENPHG,NHANVIEN.HONV
END
+VD 5: Tạo FUNCTION có tham số đầu vào là maNhanVien, trả về TenNhanVien và tổng số lượng bán
go
returns table as
from HoaDonCHiTiet
where NUOCHOA.maNH=@maNH
group by NUOCHOA.MaNH,NUOCHOA.TenNH)
+VD 6: Tạo FUNCTION tính điểm trung bình chung của sinh viên có mã chỉ định ở học kỳ bất kỳ.
CREATE FUNCTION TinhDTBChungSV(@MaSV NVARCHAR(9), @HocKy INT)
RETURNS FLOAT
AS
BEGIN
DECLARE @DiemTB FLOAT;
SELECT @DiemTB = AVG(DiemHP)
FROM DIEMHP A
INNER JOIN DMHOCPHAN B ON A.MaHP = B.MaHP
WHERE A.MaSV = @MaSV AND B.HocKy = @HocKy;
RETURN @DiemTB;
END;
PRINT N'Điểm trung bình của sinh viên là :'+CONVERT(VARCHAR ,DBO.tinhDTBChungSV('002',1))
DROP FUNCTION TinhDTBChungSV
+VD 7: Tạo FUNCTION tính tổng số đơn vị học trình của các học phần điểm <5 của sinh viên có mã chỉ định
CREATE FUNCTION TinhTongDVHTrinh (@MaSV NVARCHAR(9))
RETURNS INT
AS
BEGIN
DECLARE @TongDVHTrinh INT;
SELECT @TongDVHTrinh = SUM(Sodvht)
FROM DMHOCPHAN A
INNER JOIN DIEMHP B ON A.MaHP = B.MaHP
INNER JOIN SINHVIEN C ON B.MaSV = B.MaSV
WHERE C.MaSV = @MaSV AND A.Sodvht < 5;
RETURN @TongDVHTrinh;
END;
PRINT N'Tổng số học trình của sinh viên < 5 là :'+CONVERT(VARCHAR,DBO.TinhTongDVHTrinh('001'))
DROP FUNCTION TinhTongDVHTrinh
+VD 8: Tạo FUNCTION đếm số sinh viên có điểm HP <5 của học phần chỉ định
CREATE FUNCTION DemSoSV (@MaHP NVARCHAR(9))
RETURNS INT
AS
BEGIN
DECLARE @Dem INT;
SELECT @Dem = COUNT(*)
FROM SinhVien A
INNER JOIN DIEMHP B ON A.MaSV = B.MaSV
INNER JOIN DMHOCPHAN C ON B.MaHP = C.MaHP
WHERE C.MaHP = @MaHP AND B.DiemHP < 5;
RETURN @Dem;
END;
PRINT N'Số sinh viên có điểm học phần < 5 là :'+CONVERT(VARCHAR,DBO.DemSoSV('001'))
DROP FUNCTION DemSoSV
+VD 9: Tạo FUNCTION đếm số học phần có điểm HP <5 của sinh viên chỉ định.
CREATE FUNCTION DemHP (@MaSV NVARCHAR(9))
RETURNS INT
AS
BEGIN
DECLARE @Dem INT;
SELECT @Dem = COUNT (*)
FROM DMHOCPHAN A
INNER JOIN DIEMHP B ON A.MaHP = B.MaHP
INNER JOIN SINHVIEN C ON B.MaSV = C.MaSV
WHERE C.MaSV = @MaSV AND B.DiemHP < 5;
RETURN @Dem;
END;
PRINT N'Số học phần có điểm < 5 là : '+CONVERT(VARCHAR,DBO.DemHP('002'))
DROP FUNCTION DemHP
Tạo VIEW:
-Công thức:
CREATE VIEW <tên view> [(<tên cột 1> [, <tên cột 2>]...)]
[WITH {ENCRYPTION|SCHEMABINDING|ENCRYPTION,SCHEMABINDING}]
AS
<Câu lệnh SELECT>
[WITH CHECK OPTION]
-Ví Dụ:
+VD 1: Tạo View hiển thị Hoten,Gioitinh,NgaySinh của SinhVien
CREATE VIEW ViewHThi_SV AS
SELECT HoTen, GioiTinh, NgaySinh
FROM SINHVIEN;
SELECT * FROM ViewHThi_SV
DROP VIEW ViewHThi_SV
+VD 2: Tạo View hiển thị gồm Hoten,Malop,Ngaysinh,DiemHP, TenHP có Sodvht >3
CREATE VIEW ViewHThi_SVCoDVHT AS
SELECT A.HoTen, B.MaLop, A.NgaySinh, C.DiemHP, D.TenHP
FROM SINHVIEN A
INNER JOIN DMLOP B ON A.MaLop = B.MaLop
INNER JOIN DIEMHP C ON A.MaSV = C.MaSV
INNER JOIN DMHOCPHAN D ON C.MaHP = D.MaHP
WHERE D.Sodvht > 3
SELECT * FROM ViewHThi_SVCoDVHT
DROP VIEW ViewHThi_SVCoDVHT
+VD 4: Hiển thị tên phòng ban và họ tên trưởng phòng của phòng ban có đông nhân viên nhất
CREATE VIEW hienthi_TenTP_Dong_NV
as
SELECT PHONGBAN.TENPHG, NHANVIEN.TENNV as Truongphong
FROM PHONGBAN INNER JOIN NHANVIEN ON NHANVIEN.PHG=PHONGBAN.MAPHG
WHERE PHONGBAN.MAPHG IN (
SELECT TOP 1 PHG
FROM NHANVIEN GROUP BY PHG
ORDER BY COUNT(*) DESC)
SELECT * FROM hienthi_TenTP_Dong_NV
DROP VIEW hienthi_TenTP_Dong_NV
+VD 5: Hiển thị danh sách trưởng phòng có tối thiểu 1 thân nhân
USE QLDA;
GO
CREATE VIEW ht_DS_TRUONGPHONG
AS
SELECT NHANVIEN.HONV,NHANVIEN.TENLOT,NHANVIEN.TENNV
FROM NHANVIEN
WHERE EXISTS(SELECT * FROM THANNHAN WHERE THANNHAN.MA_NVIEN=NHANVIEN.MANV) /*kiểm tra tối thiểu có 1 thân
nhân */
SELECT * FROM ht_DS_TRUONGPHONG
DROP VIEW ht_DS_TRUONGPHONG
+VD 6: Tạo view hiển thị Top 3 Nước hoa bán chạy nhất
*Cách 1:
CREATE VIEW TOP3NH AS
SELECT TOP 3 *
FROM HoaDonChiTiet
ORDER BY SoLuongBan DESC;
SELECT * FROM TOP3NH
DROP VIEW TOP3NH
*Cách 2:
FROM NuocHoa NH
LIMIT 3;
+VD 7 :
CREATE VIEW ht_tenPhong
as
SELECT TENPHG
FROM PHONGBAN
WHERE MAPHG=1
UPDATE ht_tenPhong
SET TENPHG ='Phần mềm'
select * from ht_tenPhong;
drop view ht_tenPhong
VD ?: Xóa thông tin của Nước hoa có tổng số lượng bán thấp nhất
Cách 1:
DELETE FROM NuocHoa
WHERE MaNH IN (
SELECT NH.MaNH
FROM NuocHoa NH
AS TongSoLuongBan
FROM HoadonChitiet
GROUP BY MaNH )
AS Subquery ) );
Cách 2:
if OBJECT_ID('sp_Del_NuocHoa') is not null
drop proc sp_Del_NuocHoa
go
create proc sp_Del_NuocHoa @SoLuongBan int
as
begin try
declare @tbNuocHoa table(MaNH NVARCHAR(20))
insert into @tbNuocHoa
select MaNH from HoaDonChiTIet where SoLuongBan<=@SoLuongBan
begin tran
delete from NUOCHOA where maNH in (select MaNH from @tbNuocHoa)
print 'Đã xóa thành công'
commit
end try
begin catch
rollback tran
print'Xóa không thành công'
end catch
exec sp_Del_NuocHoa 2
select *from @tbNuocHoa