Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 13

TÀI LIỆU THI QUẢN TRỊ CSDL VỚI SQL SERVER

PHẦN 1: TẠO CSDL


 Tạo Database :
CREATE DATABASE <Tên DataBase>;

 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,

);

 Tạo Liên Kết :


ALTER TABLE <Tên Bảng chứa khóa ngoại>
ADD FOREIGN KEY (<Tên cột khóa ngoại>) REFERENCES <Tên bảng khóa chính>( Tên cột khóa chính);

 Thêm dữ liệu vào bảng(dùng tool)

PHẦN 2: TRUY VẤN THÔNG TIN


 Tạo STORE PROCEDURE (PROC):
-Công thức:
CREATE PROCEDURE <Tên PROCEDURE > (@<Tên Cột> <Kiểu dữ liệu> INPUT/ OUTPUT )
AS
BEGIN
(Khai báo các biến cho sử lý
Các câu lệnh )
END;
EXEC (Câu lệnh thực hiện PROCEDURE)
DROP PROCEDURE <Tên PROCEDURE >
-Ví dụ:
+VD 1: Tạo SP hiển thị số lượng nhân viên với mã và địa điểm nhập từ bàn phím
CREATE PROC SOLUONG_NHAN_VIENTG_DeAn @mada int , @Ddiem_DA NVARCHAR(15)
AS
BEGIN
DECLARE @dem int ;
SELECT @dem=count(*)
from PHANCONG A
INNER JOIN CONGVIEC B ON B.MADA = A.MADA
INNER JOIN DEAN C ON B.MADA = C.MADA
where A.MADA=@mada AND C.DDIEM_DA = @Ddiem_DA
PRINT N'SỐ LƯỢNG NHÂN VIÊN CÓ MÃ DỰ ÁN VÀ ĐỊA ĐIỂM DỰ ÁN LÀ :'+STR(@DEM)
END
EXEC SOLUONG_NHAN_VIENTG_DeAn @MADA= 2 , @Ddiem_DA = 'Nha Trang'
DROP PROC SOLUONG_NHAN_VIENTG_DeAn

+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 3: Tạo SP đếm số lượng nhân viên ở Hà Nội


CREATE PROC SLNVIENHANOI @tp NVARCHAR(50)
AS
BEGIN
DECLARE @num INT
SELECT @num= COUNT(*) FROM NHANVIEN WHERE DCHI LIKE '%' +@tp
RETURN @num /*trả về số lượng nhân viên ở hà nội từ bảng nhân viên*/
END
DECLARE @tongSoNV int
EXEC @tongSoNV= SLNVIENHANOI 'Hà Nội'
DROP PROC SLNVIENHANOI

+VD 4: Tạo SP tìm đề án dựa vào mã đề án


create procedure TIMTENDEAN @madean int
as
begin
select TENDEAN from DEAN WHERE MADA=@madean
end
exec TIMTENDEAN 1
+ VD 5: Viết SP với các tham số đầu vào phù hợp để tìm kiếm thông tin đĩa thỏa mãn điều kiện tìm kiếm theo: TenNh,
LoaiNH, SoLuongBan, Đơn giá và trả về thông tin theo định dạng sau.
a Cột thứ nhất. Thông tin Nước Hoa, định dạng “Sản phẩm: +<TenNH>+< LoaiNH>
b. Cột thứ hai: Số lượng bán
c. Cột thứ ba: Ngày bán
d Cột thứ tư. Đơn giá
*Cách 1:
CREATE PROC SanPham
AS
BEGIN
SELECT A.TenNH + ' ' + A.MaNH AS N'Sản Phẩm', B.SoLuongBan, C.NgayBan, A.DonGia
FROM NuocHoa A
INNER JOIN HoaDonChiTiet B ON A.MaNH = B.MaNH
INNER JOIN HoaDon C ON B.MaHD = C.MaHD
END
EXEC SanPham
DROP PROC SanPham
*Cách 2:
CREATE FUNCTION GetTotalSalesByMaNH (@MaNH INT)
RETURNS TABLE
AS
RETURN
(
SELECT
N.TenNH,
SUM(HCT.SoLuongBan) AS TongSoLuongBan
FROM
Nuochoa N INNER JOIN HoadonChitiet HCT ON N.MaNH = HCT.MaNH
WHERE N.MaNH = @MaNH
GROUP BY N.TenNH
)
+ VD 6: Viết một SP có tham số đầu vào là MaNH, kiểm tra tham số đầu vào. Trả về MaNH, TenNH, LoaiNH,
SoLuongBan, NgayBan
*Cách 1:
CREATE PROC HTNH
AS
BEGIN
SELECT A.MaNH, A.TenNH, A.LoaiNuocHoa, B.SoLuongBan, C.NgayBan
FROM NuocHoa A
INNER JOIN HoaDonChiTiet B ON A.MaNH = B.MaNH
INNER JOIN HoaDon C ON B.MaHD = C.MaHD
WHERE A.MaNH = 'NH001'
END
EXEC HTNH
DROP PROC HTNH
*Cách 2:
CREATE PROCEDURE GetProductSalesByMaNH @MaNH INT
AS
BEGIN
SET NOCOUNT ON;
-- Kiểm tra xem MaNH có tồn tại trong bảng Nuochoa hay không
IF NOT EXISTS (SELECT 1 FROM Nuochoa WHERE MaNH = @MaNH)
BEGIN
RAISERROR('MaNH không tồn tại trong bảng Nuochoa.', 16, 1)
RETURN
END
-- Lấy thông tin về sản phẩm Nuochoa
SELECT N.MaNH, N.TenNH , N.LoaiNH, HCT.SoLuongBan, H.Ngayban
FROM Nuochoa N
INNER JOIN HoadonChitiet HCT ON N.MaNH = HCT.MaNH
INNER JOIN HoaDon H ON HCT.MaHD = H.MaHD
WHERE N.MaNH = @MaNH;
END
+VD 7: Tạo PROC Xóa nhân viên dựa vào mã nv
CREATE PROC DeleteNV_MaNV @MANV NVARCHAR(9)
AS
BEGIN
IF(EXISTS(SELECT * FROM NHANVIEN WHERE MANV = @MANV))
DELETE FROM NHANVIEN
WHERE MANV = @MANV
END
EXEC DeleteNV_MaNV @MANV = '030'
SELECT * FROM NHANVIEN
DROP PROC DeleteNV_MaNV
+ VD 8: Tạo PROC Cập nhật nhân viên dựa vào mã nv
CREATE PROC UDateNV_MaNV
@HONV NVARCHAR(15),
@TENLOT NVARCHAR(15),
@TENNV NVARCHAR(15),
@MANV NVARCHAR(9),
@NGSINH date,
@DCHI NVARCHAR(30),
@PHAI NVARCHAR(9),
@LUONG float,
@MA_NQL NVARCHAR(9)=null,
@PHG int
AS
BEGIN
IF(EXISTS(SELECT * FROM NHANVIEN WHERE MANV = @MANV))
UPDATE NHANVIEN SET HONV = @HONV, TENLOT = @TENLOT, TENNV = @TENNV, MANV= @MANV, NGSINH=@NGSINH,
DCHI=@DCHI, PHAI = @PHAI, LUONG = @LUONG, MA_NQL =@MA_NQL, PHG = @PHG
WHERE MANV = @MANV
END
EXEC UDateNV_MaNV N'Châu', N'Hoài', N'Bảo', '030', '2004-06-05', 'Kiên Giang', 'Nam', '300000', '003', '1'
SELECT * FROM NHANVIEN
DROP PROC UDateNV_MaNV

+VD 9: Tạo PROC thêm nhân viên vào csdl


CREATE PROC ThemNhanVien
@HONV NVARCHAR(15),
@TENLOT NVARCHAR(15),
@TENNV NVARCHAR(15),
@MANV NVARCHAR(9),
@NGSINH date,
@DCHI NVARCHAR(30),
@PHAI NVARCHAR(9),
@LUONG float,
@MA_NQL NVARCHAR(9)=null,
@PHG int
AS
BEGIN
insert into NHANVIEN(HONV,TENLOT,TENNV,MANV,NGSINH,DCHI,PHAI,LUONG,MA_NQL,PHG)
values(@HONV,@TENLOT,@TENNV,@MANV,@NGSINH,@DCHI,@PHAI,@LUONG,@MA_NQL,@PHG)
END
EXEC ThemNhanVien 'Chau', 'Hoai', 'Bao', '030', '2004-06-05', 'Kien Giang', 'Nam', '300000', '003', '1'
DROP PROC ThemNhanVien
SELECT * FROM NHANVIEN

+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 2: Tạo FUNCTION đếm số lượng nhân viên tham gia đề án


CREATE FUNCTION timDA(@manv int) RETURNS INT
AS
BEGIN
DECLARE @Dem int;
SELECT @Dem = COUNT(*) FROM PHANCONG WHERE PHANCONG.MA_NVIEN = @manv
RETURN @Dem
END
PRINT N'Số lượng nhân viên đã tham gia đề án là: '+CONVERT(VARCHAR, DBO.timDA(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

if OBJECT_ID('fn_NH') is not null

drop function fn_NH

go

CREATE FUNCTION fn_NH(@MaNH NVARCHAR(10))

returns table as

return( select NUOCHOA.MaNH,NUOCHOA.TenNH,Sum(SoLuongban) as 'tong so luong ban'

from HoaDonCHiTiet

inner join NUOCHOA on NUOCHOA.MaNH=HoaDonChiTIet.MaNH

where NUOCHOA.maNH=@maNH

group by NUOCHOA.MaNH,NUOCHOA.TenNH)

select * from fn_NH('NH001')

+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 3: Hiển thị thông tin TenNv, Lương, Tuổi


CREATE VIEW hienThi_Ten_Luong_Tuoi
AS
SELECT TENNV, LUONG, YEAR(GETDATE()) - YEAR(NGSINH) AS TUOI
FROM NHANVIEN
SELECT * FROM hienThi_Ten_Luong_Tuoi ; /*Hiến Thị kết quả View ht_Ten_Luong_tuoi */
drop view hienThi_Ten_Luong_Tuoi ;

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

CREATE VIEW Top3NuocHoaBanChay AS

SELECT NH.MaNH, NH.TenNH, SUM(HDCT.Soluongban) AS TongSoLuongBan

FROM NuocHoa NH

JOIN HoadonChitiet HDCT ON NH.MaNH = HDCT.MaNH

GROUP BY NH.MaNH, NH.TenNH

ORDER BY TongSoLuongBan DESC

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

JOIN HoadonChitiet HDCT ON NH.MaNH = HDCT.MaNH


GROUP BY NH.MaNH

HAVING SUM(HDCT.Soluongban) = ( SELECT MIN(TongSoLuongBan)

FROM ( SELECT SUM(Soluongban)

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

PHẦN 3: YÊU CẦU QUẢN TRỊ


- Tạo 2 người dùng CSDL ( 2 cách : tool/ Code)
*Tool (Làm chụp/ ghi từng bước thực hiện)
*Code :
+Tạo tài khoản người dùng: Sử dụng câu lệnh CREATE LOGIN để tạo một tài khoản người dùng trong SQL Server
CREATE LOGIN [username] WITH PASSWORD = ‘password’;
+Tạo người dùng cho cơ sở dữ liệu: Sử dụng câu lệnh CREATE USER để tạo một người dùng trong cơ sở dữ liệu.
CREATE USER [username] FOR LOGIN [username];
+Cấp quyền truy cập vào cơ sở dữ liệu: Sử dụng câu lệnh GRANT để cấp quyền truy cập vào cơ sở dữ liệu cho người dùng.
GRANT CONNECT SQL TO [username];
+ Cấp quyền thực thi Stored Procedure, Function và View: Sử dụng câu lệnh GRANT để cấp quyền thực thi các đối tượng như
Stored Procedure, Function và View cho người dùng
GRANT EXECUTE ON [procedure_name] TO [username];
GRANT EXECUTE ON [function_name] TO [username];
GRANT SELECT ON [view_name] TO [username];
+ Cấp quyền thực hiện các hoạt động trong cơ sở dữ liệu: Sử dụng câu lệnh GRANT để cấp quyền thực hiện các hoạt động như
SELECT, INSERT, UPDATE, DELETE cho người dùng.
GRANT SELECT, INSERT, UPDATE, DELETE ON [table_name] TO [username]

- Sao lưu dự phòng ( File .bak, .log, .mdf)

You might also like