Bài TEST Hệ QT CSDL SQL

319

BÀI TEST SỐ 1

Yêu cầu

Câu 1 – Tạo cơ sở dữ liệu sau

Cơ sở dữ liệu quản lý sinh viên có chứa 3 table. Viết lệnh tạo các table với các ràng buộc khóa chính, khóa ngoại được nêu trong tân từ. Kiểu dữ liệu của các Fields là tự chọn theo ngữ nghĩa.

SinhVien(MSSV, Lop, Ho, Ten, Ngaysinh, Nu)

Tân từ: Mỗi sinh viên có một mã số (MSSV) là số nguyên phân biệt, thuộc một lớp (Lop), có họ (HO) và tên (Ten) sinh viên, ngày sinh (Ngaysinh), thuộc phái nữ hay nam (Nu).

MonHoc(MSMon, TenMon)

Tân từ: Mỗi môn học có một mã số (MSMon) là một số nguyên phân biệt, có tên môn học (TenMon).

DiemThi(MSSV, MSMon, LanThi, Diem)

Tân từ: Mỗi sinh viên (MSSV) có thể học nhiều môn (MSMon). Mỗi môn học có thể thi nhiều lần  (LanThi), mỗi lần thi được đánh số thứ tự từ 1 trở đi và ghi nhận điểm thi (Diem) của các lần thi đó.

Câu 2 – Khai báo bổ sung các ràng buộc sau:

  1. Lần thi (LanThi) trong table DiemThi có giá trị mặc định là 1
  2. Điểm thi (Diem) trong table DiemThi được chấm theo thang điểm 10

Câu 3 – Tạo View:

  1. Tạo view vwLanThiCuoi dùng liêt kê danh sách lần thi cuối cùng của các sinh viên gồm: Mã số sinh viên, mã số môn học, lần thi cuối cùng của môn học (ví dụ sinh viên A thi môn học C ba lần thì lần thi cuối cùng là 3).
  2. Tạo view vwDiemThiCuoi dùng liêt kê danh sách sinh viên gồm: Mã số sinh viên, mã số môn học, lần thi cuối cùng của môn học (ví dụ sinh viên A thi môn học M ba lần thì lần thi cuối cùng là 3) và điểm của lần thi cuối cùng đó.

Câu 4 – Tạo trigger insert

Tạo trigger Insert cho table DiemThi dùng điền tự động số thứ tự lần thi khi thêm điểm thi một môn học của một sinh viên. Ví dụ sinh viên A đã thi môn học M hai lần thì lần thi mới thêm vào phải là 3.

Câu 5 – Viết hàm

Viết thủ tục hoặc hàm liệt kê kết quả thi các môn của một sinh viên khi biết mã số của sinh viên (MSSV) gồm các thông tin: mã số môn học, lần thi, điểm thi. Trong đó, mã số sinh viên là giá trị input.

Hướng dẫn

-- Bài test 1 - Thực hành SQL Server

use master
go
    if exists(select * from sys.databases where name='De1')
    drop database De1
go
    create database De1
go
    use De1
go
--------------------
--Câu 1 : Tạo TABLE
create table SinhVien
(	MSSV int identity(1,1) primary key,
    Lop varchar(10),
    Ho varchar(10),
    Ten varchar(30),
    NgaySinh datetime,
    Nu bit
)
--------------------
create table MonHoc
(	MSMon int identity(1,1) primary key,
    TenMon varchar(30)
)
--------------------
create table DiemThi
(	MSSV int,
    MSMon int,
    LanThi int,
    Diem int,
    primary key(MSSV,MSMon,LanThi),
    foreign key(MSSV) references SinhVien(MSSV),
    foreign key(MSMon) references MonHoc(MSMon),
)
--Câu 2 : Bổ sung ràng buộc
go
Alter table DiemThi	ADD
    default 1 for LanThi,
    check(Diem between 0 and 10)
--------------------
insert into SinhVien values ('07ct112','Nguyen','Hoang Long','11/10/1989','True')
insert into SinhVien values ('07ct112','Le','Ngoc Nam','11/10/1989','True')
insert into SinhVien values ('07ct112','Le','Thanh Phuc','12/25/1989','True')
    --------------------
insert into MonHoc values ('SQL 2005')
insert into MonHoc values ('TTHCM')
    --------------------
insert into DiemThi values(1,1,1,10)
    --------------------
insert into DiemThi values(2,1,1,7)
insert into DiemThi values(2,1,2,9)
    --------------------
insert into DiemThi values(3,1,1,8)
insert into DiemThi values(3,2,1,2)
insert into DiemThi values(3,2,2,6)
insert into DiemThi values(3,2,3,10)
--------------------
--Câu 3.1) Tạo view vwLanThiCuoi
go
create view vwLanThiCuoi
as
    select MSSV, MSMon, LanThi=max(LanThi)
    from DiemThi
    group by MSSV, MSMon	
--------------------
--Câu 3.2) Tạo view vwDiemThiCuoi
go
create view vwDiemThiCuoi
as
with BangTam as(select MSSV, MSMon, LanThiMax=max(LanThi)from DiemThi
                group by MSSV, MSMon)
select D.*
from BangTam B join DiemThi D on (B.MSSV=D.MSSV and B.MSMon=D.MSMon and B.LanThiMAX =D.LanThi)
--------------------
--Câu 4 : Tạo trigger
GO
create trigger itrg_AutoLanThi on DiemThi
for INSERT
AS
    declare @MSSV int
    declare @MSMon int
    select @MSSV = MSSV,@MSMon = MSMon from inserted
    if NOT EXISTS (select * from DiemThi where [email protected] and [email protected])
        begin
            print'MSSV them vao khong ton tai'
            rollback tran
            return
        end
    update DiemThi set DiemThi.LanThi = DiemThi.LanThi + 1
    from INSERTED I where [email protected] and [email protected]
--------------------
--Câu 5 : Tạo thủ tục
go
create proc ThongTinSV(@MSSV int=1)
as
Begin
    select MSMon,LanThi,Diem
    from DiemThi
    where MSSV = @MSSV
End
--------------------
go
exec ThongTinSV 3
go
insert into DiemThi(MSSV,MSMon,Diem) values(4,1,7)

BÀI TEST SỐ 2

Yêu cầu

Câu 1 – Tạo cơ sở dữ liệu

Cơ sở dữ liệu quản lý các trận đấu bóng đá tại một sân vận động có chứa 3 table. Viết lệnh tạo các table với các ràng buộc khóa chính, khóa ngoại được nêu trong tân từ. Kiểu dữ liệu của các Fields là tự chọn theo ngữ nghĩa.

Doi(MSDoi, TenDoi, Phai)

Tân từ: Mỗi đội có 1 mã số (MSDoi) là một số nguyên phân biệt; có tên (TenDoi) và thuộc phái nam hay nữ (Phai).

TranDau(MSTD, NgayTD, GioBD, GioKT)

Tân từ: Mỗi trận đấu có 1 mã số (MSTD) là một số nguyên phân biệt với những trận đấu khác, diễn ra vào 1 ngày (NgayTD), bắt đầu ở một giờ (GioBD) và dự kiến kết thúc tại một giờ (GioKT).

DoiThiDau(MSTD, MSDoi)

Tân từ: Lưu trữ danh sách các đội (MSDoi) tham gia thi đấu trong các trận đấu (MSTD). Biết rằng, mỗi trận đấu là một cuộc gặp gỡ giữa 2 đội và cả 2 đội phải thuộc cùng một phái.

Câu 2 – Viết ràng buộc

Viết lệnh khai báo bổ sung các ràng buộc sau:

  1. Giờ bắt đầu thi đấu (GioTD) phải nhỏ hơn giờ kết thúc (GioKT) trận đấu.
  2. Hai trận đấu trong table TranDaudiễn ra trong cùng một ngày (NgayTD) thì không bắt đầu ở cùng một giờ thi đấu (GioTD).

Câu 3 – Tạo view

  1. Tạo view vwDoiChuaThiDaudùng liêt kê danh sách các đội chưa có mã số đội trong table DoiThiDau gồm: Mã số đội, tên đội, phái.
  2. Tạo view vwSoTranDaudùng thống kê số trận đấu diễn ra trong từng ngày thi đấu với các thông tin: Ngày thi đấu và số trận đấu trong ngày.

Câu 4 – Tạo trigger

Tạo insert trigger cho table DoiThiDau dùng kiểm tra ràng buộc mỗi trận đấu chỉ là một cuộc gặp gỡ giữa 2 đội và cả 2 đội phải thuộc cùng một phái.

Câu 5 – Tạo hàm

Tạo thủ tục hoặc hàm hiển thị thông tin 2 đội tham gia trong một trận đấu khi biết mã số trận đấu. Nếu mã trân đấu không có trong table DoiThiDau thì hiện thị thông báo lỗi. Trong đó, mã số trận đấu (MSTD) là giá trị input.

Hướng dẫn

-- Bài test số 2 - Thực hành SQL server

-- Câu 1
use master
go
    if exists(select * from sys.databases where name='De2')
    drop database De2
go
    create database De2
go
    use De2
go
--------------------
create table Doi
(	MSDoi int primary key,
    TenDoi varchar(40),
    Phai bit
)
--------------------
create table TranDau
(	MSTD int primary key,
    NgayTD datetime,
    GioBD smalldatetime,	
    GioKT smalldatetime ,
)
--------------------
create table DoiThiDau
(	MSTD int references TRANDAU(MSTD),
    MSDOI int,
    primary key(MSTD,MSDoi),
    foreign key(MSDOI) references Doi(MSDOI),
)

-- Câu 2
go
Alter table TranDau ADD
    check(GioBD < GioKT),
    unique(GioBD,NgayTD)
--------------------
go
insert into Doi values (1,'Hoang Anh Gia Lai','True')
insert into Doi values (2,'Hoang Anh Gia Lai','False')
insert into Doi values (3,'Dong Tam Long An','True')
insert into Doi values (4,'SHB Da Nang','True')
insert into Doi values (5,'SHB Da Nang','False')
insert into Doi values (6,'Dong Nai','False')
insert into TranDau values (1,'10/10/1998','10/10/1998 2:00:00 PM','10/10/1998 4:00:00 PM')
insert into TranDau values (2,'10/10/1998','10/10/1998 5:00:00 PM','10/10/1998 7:00:00 PM')
insert into TranDau values (3,'10/11/1998','10/10/1998 7:00:00 PM','10/10/1998 9:00:00 PM')
insert into TranDau values (4,'10/12/1998','10/10/1998 6:15:00 AM','10/10/1998 8:15:00 AM')
insert into TranDau values (5,'10/12/1998','10/10/1998 3:30:00 PM','10/10/1998 5:30:00 PM')
insert into TranDau values (6,'10/12/1998','10/10/1998 7:00:00 PM','10/10/1998 9:00:00 PM')
insert into DoiThiDau values (1,1)
insert into DoiThiDau values (1,3)
insert into DoiThiDau values (2,1)
insert into DoiThiDau values (2,4)
insert into DoiThiDau values (3,2)
insert into DoiThiDau values (3,5)
------------------

-- Câu 3
go
create view vwDoiChuaThiDau
as
    select * from Doi A
    where A.MSDoi NOT IN (select B.MSDoi from DoiThiDau B)
--------------------
go
create view vwSoTranDau
as
    select NgayTD, SoTD=count(MSTD)
    from TranDau
    group by NgayTD
--------------------
go

-- Câu 4,5

create proc ThongTinTD(@MSTD int)
as
if NOT exists (select * from DoiThiDau where MSTD = @MSTD)
    Begin
        print'Tran dau khong ton tai'
    End
else
    Begin
        select MSTD,DoiThiDau.MSDoi,TenDoi,Phai 
        from DoiThiDau join Doi on DoiThiDau.MSDoi = Doi.MSDoi
        where MSTD = @MSTD
    End

--------------------
go
exec ThongTinTD 2

BÀI TEST SỐ 3

Yêu cầu

Câu 1 – Tạo bảng

Cơ sở dữ liệu quản lý hóa đơn bán hàng có chứa 3 table. Viết lệnh tạo các table với các ràng buộc khóa chính, khóa ngoại được nêu trong tân từ. Kiểu dữ liệu của các Fields là tự chọn theo ngữ nghĩa.

MatHang(MSMH, TenMH, DonGia, SoTon)

Tân từ: Mỗi mặt hàng có một mã số (MSMH) là một số nguyên phân biệt, có tên mặt hàng (TenMH), đơn giá (DonGia) bán mới nhất của mặt hàng đó và số lượng hàng tồn kho (SoTon).

HoaDon(MSHD, NgayLap)

Tân từ: Mỗi hóa đơn có một mã số phân biệt (MSHD),  ngày lập hóa đơn (NgayLap)

CTHD(MSHD, MSMH, SoLuong, DonGiaHD)

Tân từ: Mỗi hóa đơn (MSHD) ghi một hoặc nhiều mặt hàng (MSMH) cùng với số lượng (SoLuong) và đơn giá bán tại thời điểm ghi hóa đơn (DonGiaHD).

Câu 2 – Tạo ràng buộc

Khai báo bổ sung các ràng buộc sau:

  1. Số tồn (SoTon) trong table MatHang có giá trị mặc định (Default) bằng 0.
  2. Tên mặt hàng trong table MatHang có giá trị phân biệt giữa các mặt hàng.

Câu 3 – Tạo view

  1. Tạo view “vwTienHD” dùng hiển thị tiền bán trên từng hóa đơn gồm các thông tin: mã số hóa đơn, ngày lập, tiền hóa đơn bằng tổng tiền bán từng mặt hàng ghi trên mỗi hóa đơn.
  2. Tạo view “vwHangKhongBanDuoc” dùng liêt kê danh sách các mặt hàng không bán được trong tháng hiện hành.

Câu 4 – Tạo trigger

Xây dựng Insert trigger cho CTHD thực hiện yêu cầu: khi thêm một chi tiết hóa đơn phải cập nhật lại số lượng tồn (SoTon) của mặt hàng tương ứng.

Câu 5 – Viết hàm

Viết thủ tục hoặc hàm nhận 2 giá trị input kiểu số nguyên là tháng và năm. Hãy liệt kê doanh thu của từng mặt hàng gồm các thông tin: mã số mặt hàng, doanh thu mặt hàng trong :

  1. Một năm nếu tháng là Null và năm khác Null
  2. Một tháng nếu tháng và năm khác Null

Hướng dẫn

-- Bài test số 3 - Thực hành về sql server

-- Câu 1
USE master
GO
IF  EXISTS (SELECT name FROM sys.databases WHERE name = 'De3')
    BEGIN
        DROP DATABASE De3
    END
GO
CREATE DATABASE De3
GO
USE De3
GO
--------------------
CREATE TABLE MATHANG
(	MSMH int PRIMARY KEY ,
    TENMH varchar(100),
    DONGIA money DEFAULT 0 CHECK (DONGIA >=0),
    SOTON int
)
--------------------
CREATE TABLE HOADON
(	MSHD int PRIMARY KEY,
    NGAYLAPHD datetime DEFAULT GETDATE() NOT NULL,
)
--------------------
CREATE TABLE CTHD
(	MSHD int references HOADON,
    MSMH int references MATHANG,
    SOLUONG Smallint DEFAULT 0  CHECK ( SOLUONG > 0),
    DONGIABAN MONEY DEFAULT 0 CHECK ( DONGIABAN > 0),
    PRIMARY KEY (MSHD,MSMH),
    FOREIGN KEY(MSHD) references HOADON(MSHD),
    FOREIGN KEY(MSMH) references MATHANG(MSMH)
)
-- Câu 2
GO
ALTER TABLE MATHANG ADD
    default 0 for SOTON,
    unique(TENMH)
--------------------
INSERT INTO MATHANG VALUES (1,'Ruou',230.5,201)
INSERT INTO MATHANG VALUES (2,'Gia vi',40,82)
INSERT INTO MATHANG VALUES (3,'Banh kem',10,0)
INSERT INTO MATHANG VALUES (4,'Bo',38,30)
INSERT INTO MATHANG VALUES (5,'Banh mi',8,435)
INSERT INTO MATHANG VALUES (6,'Nem',23.8,97)
INSERT INTO MATHANG VALUES (7,'Tao',5,33)
INSERT INTO MATHANG VALUES (8,'Ca hop',62.5,100)
INSERT INTO MATHANG VALUES (9,'Cam',11,50)
--------------------
INSERT INTO HOADON VALUES (10144,'3/30/2003')
INSERT INTO HOADON VALUES (10150,'4/9/2003')
INSERT INTO HOADON VALUES (10156,'4/20/2003')
INSERT INTO HOADON VALUES (10158,'4/22/2003')
INSERT INTO HOADON VALUES (10175,'5/19/2003')
INSERT INTO HOADON VALUES (10177,'5/21/2003')
INSERT INTO HOADON VALUES (10193,'6/10/2003')
INSERT INTO HOADON VALUES (10207,'6/29/2003')
INSERT INTO HOADON VALUES (10225,'7/21/2003')
INSERT INTO HOADON VALUES (10226,'7/22/2003')
INSERT INTO HOADON VALUES (10255,'8/27/2003')
INSERT INTO HOADON VALUES (10258,'8/30/2003')
INSERT INTO HOADON VALUES (10261,'9/5/2003')
--------------------
INSERT INTO CTHD VALUES (10144,2,35,42)
INSERT INTO CTHD VALUES (10144,6,20,25)
INSERT INTO CTHD VALUES (10144,3,10,10.5)
INSERT INTO CTHD VALUES (10150,6,9,25)
INSERT INTO CTHD VALUES (10156,2,25,42)
INSERT INTO CTHD VALUES (10158,4,12,39.9)
INSERT INTO CTHD VALUES (10158,6,20,25)
INSERT INTO CTHD VALUES (10175,8,12,65.6)
INSERT INTO CTHD VALUES (10177,4,6,39.9)
INSERT INTO CTHD VALUES (10177,6,30,25)
INSERT INTO CTHD VALUES (10193,6,15,25)
INSERT INTO CTHD VALUES (10207,1,10,242)
INSERT INTO CTHD VALUES (10225,1,10,242)
INSERT INTO CTHD VALUES (10225,4,70,39.9)
INSERT INTO CTHD VALUES (10226,4,21,39.9)
INSERT INTO CTHD VALUES (10255,3,35,10.5)
INSERT INTO CTHD VALUES (10255,1,20,242)
INSERT INTO CTHD VALUES (10255,5,55,8.4)
INSERT INTO CTHD VALUES (10258,1,50,242)
INSERT INTO CTHD VALUES (10261,3,60,10.5)
--------------------
-- Câu 3
GO
CREATE VIEW vwTienHD
AS
    SELECT H.MSHD,NGAYLAPHD,TIENHD= SUM(SOLUONG*DONGIABAN)
    FROM HOADON H JOIN CTHD C ON H.MSHD = C.MSHD
    GROUP BY H.MSHD,NGAYLAPHD
--------------------
GO
CREATE VIEW vwHangKhongBanDuoc
AS
    SELECT M.* FROM MATHANG M
    WHERE MSMH NOT IN( SELECT C.MSMH FROM CTHD C
                    WHERE C.MSHD IN(SELECT H.MSHD FROM HOADON H))
--------------------
GO
-- Câu 4,5
CREATE PROC DoanhThu(@Thang int = NULL,@Nam int = NULL)
AS
IF @Nam is NULL
    BEGIN
        print'Gia tri INPUT = NULL'
    END
ELSE	
    IF @Thang is NULL
        BEGIN
            SELECT M.MSMH,DOANHTHU= SUM(SOLUONG*DONGIABAN)
            FROM (MATHANG M JOIN CTHD C ON M.MSMH = C.MSMH) JOIN HOADON H ON H.MSHD = C.MSHD
            WHERE YEAR(NGAYLAPHD) = @Nam
            GROUP BY M.MSMH
        END
    ELSE
        BEGIN
            SELECT M.MSMH,DOANHTHU= SUM(SOLUONG*DONGIABAN)
            FROM (MATHANG M JOIN CTHD C ON M.MSMH = C.MSMH) JOIN HOADON H ON H.MSHD = C.MSHD
            WHERE MONTH(NGAYLAPHD) = @Thang and YEAR(NGAYLAPHD) = @Nam
            GROUP BY M.MSMH	
        END
--------------------
GO
EXEC DoanhThu 6,2003
GO
EXEC DoanhThu @Nam=2003

BÀI TEST SỐ 4

Yêu cầu

Câu 1: Cơ sở dữ liệu quản lý việc mượn trả sách có chứa 3 table. Viết lệnh tạo các table với các ràng buộc khóa chính, khóa ngoại được nêu trong tân từ. Kiểu dữ liệu của các Fields là tự chọn theo ngữ nghĩa.

Sach(MaSach, TenSach, SoLuong, SoDaMuon)

Tân từ: Mỗi tựa sách có một mã số (MaSach) là một số nguyên phân biệt, có tên sách (TenSach), số lượng (SoLuong), và số sách hiện đã cho mượn (SoDaMuon).

DocGia(MaDG, TenDG)

Tân từ: Mỗi đọc giả có một mã số đọc giả (MaDG) là một số nguyên phân biệt, có tên đọc giả (TenDG).

PhieuMuon(MaDG, NgayMuon, MaSach, NgayTra)

Tân từ: Mỗi ngày mỗi đọc giả chỉ được mượn một quyển sách. Khi đọc giả mượn sách cần ghi nhận mã đọc giả (MaDG), ngày mượn (NgayMuon), mã sách (MaSach), ngày trả sách (NgayTra). Ngày trả sách là Null khi chưa trả sách.

Câu 2: Khai báo bổ sung các ràng buộc sau:

  1. Số lượng sách (SoLuong) trong table Sachkhông nhỏ hơn số sách đã mượn (SoDaMuon)
  2. Ngày mượn sách (NgayMuon) trong table PhieuMuon có giá trị mặc định là ngày hiện hành

Câu 3: Tạo View:

  1. Tạo view “vwHetSach” dùng liêt kê các sách có số lượng sách (SoLuong) bằng với số lượng sách đã cho mượn (SoDaMuon) gồm các thông tin: Mã sách, tên sách.
  2. Tạo view “vwChuaTraSach” dùng hiển thị danh sách các đọc giả chưa trả sách (có ngày trả là rổng) gồm các thông tin: mã đọc giả, tên đọc giả, ngày mượn, tên sách đã mượn.

Câu 4: Tạo update trigger trên table PhieuMuon thực hiện yêu cầu sau: Khi sửa ngày trả của một phiếu mượn từ giá trị Null sang một giá trị khác Null thì phải giảm số lượng sách đã mượn của tựa sách tương ứng trên table Sach, ngược lại nếu sửa ngày trả từ một giá trị khác Null sang giá trị Null thì phải tăng số lượng sách đã mượn của tựa sách tương ứng trên table Sach.

Câu 5: Tạo thủ tục hoặc hàm trả về số sách còn có thể cho mượn (SoLuong – SoDaMuon) của một mã sách nào đó. Trong đó, mã sách là giá trị input. Hiển thị thông báo lỗi nếu mã sách không tồn tại trong table Sach.

Hướng dẫn

-- Bài test số 4 - Thực hành về sql server

USE master
GO
IF  EXISTS (SELECT name FROM sys.databases WHERE name = 'De4')
    BEGIN
        DROP DATABASE De4
    END
GO
CREATE DATABASE De4
GO
USE De4
GO
-- Câu 1
--------------------
CREATE TABLE SACH
(	MASACH INT PRIMARY KEY,
    TENSACH VARCHAR(100),
    SOLUONG INT,
    SODAMUON INT
)
--------------------
CREATE TABLE DOCGIA
(	MADG INT PRIMARY KEY,
    TENDG VARCHAR(100)
)
--------------------
CREATE TABLE PHIEUMUON
(	MADG INT,
    NGAYMUON DATETIME,
    MASACH INT,
    NGAYTRA DATETIME,
    PRIMARY KEY(MADG,NGAYMUON),
    FOREIGN KEY(MADG) REFERENCES DOCGIA(MADG)
)
GO
-- Câu 2
ALTER TABLE SACH ADD
    CHECK(SOLUONG >= SODAMUON)
GO
ALTER TABLE PHIEUMUON ADD
    DEFAULT GETDATE() FOR NGAYMUON
--------------------
GO
INSERT INTO SACH VALUES (1,'Cuon theo chieu gio',10,2)
INSERT INTO SACH VALUES (2,'Ong gia va bien ca',2,2)
INSERT INTO SACH VALUES (3,'Tat den',20,3)
INSERT INTO SACH VALUES (4,'Toan roi rac',1,1)
INSERT INTO SACH VALUES (5,'Lap trinh C#',4,4)
INSERT INTO SACH VALUES (6,'Lich su Dang',3,0)
INSERT INTO SACH VALUES (7,'Kinh van hoa',30,5)
INSERT INTO SACH VALUES (8,'Chien tranh va hoa binh',10,0)
--------------------
GO
INSERT INTO DOCGIA VALUES (1,'Nguyen Hoang Long')
INSERT INTO DOCGIA VALUES (2,'Nguyen Minh Tam')
INSERT INTO DOCGIA VALUES (3,'Le Quoc Thinh')
INSERT INTO DOCGIA VALUES (4,'To Hoai Tan')
INSERT INTO DOCGIA VALUES (5,'Nguyen Trung Truc')
INSERT INTO DOCGIA VALUES (6,'La Phi Hung')
--------------------
GO
INSERT INTO PHIEUMUON VALUES (1,'5/20/2000',2,'5/27/2000')
INSERT INTO PHIEUMUON VALUES (1,'5/30/2000',5,'6/20/2000')
INSERT INTO PHIEUMUON VALUES (1,'7/7/2000',7,'7/25/2000')
INSERT INTO PHIEUMUON VALUES (1,'7/1/2000',8,NULL)
INSERT INTO PHIEUMUON VALUES (2,'7/2/2000',7,NULL)
INSERT INTO PHIEUMUON VALUES (2,'7/3/2000',5,NULL)
INSERT INTO PHIEUMUON VALUES (3,'7/4/2000',5,'7/11/2000')
INSERT INTO PHIEUMUON VALUES (3,'7/5/2000',3,'7/12/2000')
INSERT INTO PHIEUMUON VALUES (3,'7/6/2000',7,'7/13/2000')
INSERT INTO PHIEUMUON VALUES (4,'7/7/2000',1,'7/14/2000')
INSERT INTO PHIEUMUON VALUES (4,'7/8/2000',7,NULL)
INSERT INTO PHIEUMUON VALUES (4,'7/9/2000',2,'7/16/2000')
INSERT INTO PHIEUMUON VALUES (4,'7/10/2000',3,'7/17/2000')
INSERT INTO PHIEUMUON VALUES (5,'7/11/2000',5,NULL)
INSERT INTO PHIEUMUON VALUES (5,'7/12/2000',4,NULL)
INSERT INTO PHIEUMUON VALUES (5,'7/13/2000',7,'7/20/2000')
INSERT INTO PHIEUMUON VALUES (6,'7/14/2000',3,'7/21/2000')
--------------------
-- Câu 3
GO
CREATE VIEW vwHetSach
AS
    SELECT MASACH,TENSACH FROM SACH
    WHERE SOLUONG = SODAMUON
--------------------
GO
CREATE VIEW vwChuaTraSach
AS
    SELECT D.MADG,D.TENDG,NGAYMUON,TENSACH
    FROM (DOCGIA D JOIN PHIEUMUON P ON D.MADG=P.MADG) JOIN SACH S ON S.MASACH=P.MASACH
    WHERE NGAYTRA IS NULL
--------------------
-- Câu 4,5
GO
CREATE PROC SoSachChoMuon(@MASACH INT)
AS
BEGIN
    IF NOT EXISTS (SELECT MASACH FROM SACH WHERE MASACH = @MASACH)
        PRINT'Ma sach khong ton tai'
    ELSE
        SELECT MASACH,SoSachConLai = SOLUONG - SODAMUON
        FROM SACH
        WHERE MASACH = @MASACH
END
--------------------
GO
EXEC SoSachChoMuon 7

BÀI TEST SỐ 5

Yêu cầu

Câu 1: Cơ sở dữ liệu quản lý lương hành chánh sự nghiệp có chứa 3 table. Viết lệnh tạo các table với các ràng buộc khóa chính, khóa ngoại được nêu trong tân từ. Kiểu dữ liệu của các Fields là tự chọn theo ngữ nghĩa.

  • NgachLuong(MSNgach, MoTa)

Tân từ: Hệ thống lương hành chánh gồm nhiều ngạch, mỗi ngạch lương có một mã số (MSNgach) là một số nguyên phân biệt, mục mô tả (MoTa) dùng chỉ định nhân viên thực hiện công việc nào, bằng cấp nào thì thuộc ngạch lương này.

  • DMNgachBac(MSNgach, Bac, HSLuong)

Tân từ: Mỗi ngạch lương (MSNgach) có nhiều bậc lương (Bac). Mỗi bậc lương là một số nguyên có giá trị từ 1 trở đi phân biệt trong cùng một ngạch lương. Mỗi bậc trong một ngạch lương có một hệ số lương (HSLuong).

  • NhanVien(MSNV, Ho, Ten, MSNgach, Bac, NgayNLCC)

Tân từ: Mỗi nhân viên có một mã số (MSNV) là một số nguyên phân biệt, có họ (Ho), tên (Ten), thuộc ngạch lương (MSNgach), bậc lương (Bac) và ngày nâng lương cuối cùng (NgayNLCC).

Câu 2: Khai báo bổ sung các ràng buộc sau:

  1. Trong table DMNgachBac, Hệ số lương (HSLuong) phải phân biệt trong cùng một ngạch lương (MSNgach).
  2. Bậc lương (Bac) trong table NhanVien có giá trị mặc định (Default) bằng 1.

Câu 3: Tạo View:

  1. Tạo view vwHSLuong dùng liêt kê hệ số lương của mỗi nhân viên gồm các thông tin: mã số nhân viên, mã số ngạch, bậc, hệ số lương.
  2. Tạo view vwNangLuong dùng liệt kê nhân viên có số tháng tính từ ngày nâng lương cuối cùng (NgayNLCC) đến ngày hiện hành có giá trị không nhỏ hơn 24 tháng.

Câu 4: Tạo update trigger cho table NhanVien để kiểm tra ràng buộc: Khi nâng bậc lương (Bac) của một nhân viên thì bậc lương mới không lớn hơn bậc lương cao nhất trong ngạch lương của nhân viên (ví dụ, ngạch lương mã số 15113 có số thứ tự bậc lương từ 1 đến 10 thì bậc lương mới của nhân viên có mã ngạch 15113 không đượt lớn hơn 10).

Câu 5: Viết thủ tục hay hàm trả về danh sách nhân viên đã được nâng lương trong một năm (nghĩa là có ngày nâng lương cuối cùng thuộc năm tìm kiếm). Trong đó, năm là một giá trị Input kiểu số nguyên. Nếu năm là Null thì trả về danh sách nhân viên đã được nâng lương trong năm hiện hành.

Hướng dẫn

-- Bài test số 5 - Thực hành về sql server

-- Câu 1
USE master
GO
IF  EXISTS (SELECT name FROM sys.databases WHERE name = 'De5')
    BEGIN
        DROP DATABASE De5
    END
GO
CREATE DATABASE De5
GO
USE De5
GO
--------------------
CREATE TABLE NgachLuong
(	MSNgach INT PRIMARY KEY,
    MOTA VARCHAR(100)
)
--------------------
CREATE TABLE DMNganhBac
(	MSNgach	INT,
    BAC INT,
    HSLuong FLOAT,
    PRIMARY KEY(MSNgach,BAC),
    FOREIGN KEY(MSNgach) REFERENCES NgachLuong(MSNgach)
)
--------------------
CREATE TABLE NhanVien
(	MSNV INT PRIMARY KEY,
    HO VARCHAR(50),
    TEN VARCHAR(50),
    MSNgach	INT,
    BAC INT,
    NGAYNLCC DATETIME
)
--------------------
-- Câu 2
GO
ALTER TABLE DMNganhBac ADD
    UNIQUE(MSNgach,HSLuong)
GO
ALTER TABLE NhanVien ADD
    DEFAULT 1 FOR BAC
--------------------
-- Câu 3
GO
CREATE VIEW vwHSLuong
AS
    SELECT MSNV,N.MSNgach,N.BAC,HSLuong
    FROM DMNganhBac D JOIN NhanVien N ON D.MSNgach = n.MSNgach
    GROUP BY MSNV,N.MSNgach,N.BAC,HSLuong
--------------------
GO
CREATE VIEW vwNangLuong
AS
    SELECT * FROM NhanVien
    WHERE DATEDIFF(M,NGAYNLCC,GETDATE())>=24
--------------------
GO
-- Câu 4,5
CREATE PROC DSNangLuong(@Nam int = NULL)
AS
    IF @Nam IS NULL
        SELECT * FROM NhanVien
        WHERE YEAR(NGAYNLCC)=YEAR(GETDATE())
    ELSE
        SELECT * FROM NhanVien
        WHERE YEAR(NGAYNLCC) = @Nam
--------------------
GO
EXEC DSNangLuong 2000

TranNhuomEDU Chúc các bạn THÀNH CÔNG!

BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây