[SQL SEVER] Bài tập thực hành số 5

Thảo luận trong 'Khoa Khoa Học Máy Tính' bắt đầu bởi hongoctrien, 12 Tháng tư 2012.

  1. Offline

    hongoctrien

    • Friends

    Số bài viết:
    2.449
    Đã được thích:
    2.464
    Điểm thành tích:
    2.431
    Mình không dám chắc code dưới đây là đúng là tối ưu, vậy nên bạn nào có cách làm hay hơn xin đóng góp thêm nhé! :D

    Nội dung 1:

    Câu 1: Nhập vào 2 số @s1, @s2. In ra câu “Số lớn nhất của @s1 và @s2 là max” với @s1, @s2, max là các giá trị tương ứng.

    Mã:
     CREATE PROC CAU1 (@S1 INT,@S2 INT)
    AS
    DECLARE @M INT
    SET @M=@S2
    IF @S1>@S2
    SET @M=@S1
    PRINT  N'SỐ LỚN NHẤT CỦA'+STR(@S1) +N','+STR(@S2)+N' '+ N'LÀ' + STR(@M)
    EXECUTE CAU1 2,4
     
    Câu 2: Nhập vào 2 số @s1, @s2. Xuất max của chúng ta tham số @max. Cho thực thi và in các giá trị của các tham số này để kiểm tra.

    Mã:
     CREATE PROC CAU2 (@S1 INT,@S2 INT,@MAX INT OUTPUT)
    AS
    SET @MAX=@S1
    IF @S2>@MAX
    SET @MAX=@S2
    
    DECLARE @T INT
    EXEC CAU2 100,18,@T OUTPUT
    SELECT @T
     
    Câu 3: Viết thủ tục nhập dữ liệu cho bảng KHOA

    Mã:
     CREATE PROC CAU3(@MAKHOA NVARCHAR(10),@TENKHOA NVARCHAR(50),@DIENTHOAI NVARCHAR(20))
    AS
    INSERT INTO KHOA
    VALUES(@MAKHOA,@TENKHOA,@DIENTHOAI)
    
    EXEC CAU3 'dhmt',N'Đồ họa','99999999999' 
    Câu 4: Viết thủ tục đưa vào mã sinh viên và in ra câu thông báo: “Họ và tên sinh viên này lớn tuổi hơn (cùng hoặc nhỏ tuổi hơn) sinh viên kia” dựa vào năm sinh của 2 sinh viên.

    Mã:
     CREATE proc CAU4(@masv1 nvarchar(10), @masv2 nvarchar(10))
    as
    begin
    	declare @n1 nvarchar(4)
    	declare @n2 nvarchar(4)
    	declare @hoten1 nvarchar(30)
    	declare @hoten2 nvarchar(30)
    
    	select @hoten1=hodem+' '+ten, @n1=year(ngaysinh)
    	from sinhvien
    	where @masv1=masv
    	
    	select @hoten2=hodem+' '+ten, @n2=year(ngaysinh)
    	from sinhvien
    	where masv=@masv2
    
    	if(@n1>@n2)
    		print @hoten1 + N' lớn tuổi hơn ' +@hoten2
    	if(@n1<@n2)
    		print @hoten1 + N' nhỏ tuổi hơn ' +@hoten2
    	else
    		print @hoten1 + N' bàng tuổi ' +@hoten2
    end
    
    exec CAU4 'dh01-005', 'dl01-001' 
    Câu 5: Viết thủ tục với tham số đưa vào là mã lớp, tham số xuất ra là số sinh viên của lớp đó.

    Mã:
     CREATE proc CAU5 (@malop nvarchar(10))
    as
    begin
    	declare @sv nvarchar(10)
    	select @sv=count(masv)
    	from sinhvien
    	where malop=@malop
    	print N'Lớp có mã lớp: '+@malop + N' có ' + @sv + N' sinh viên'
    end
    
    exec CAU5 'dl01' 
    Câu 6: Viết thủ tục cập nhật cho bảng DIEMTHI với tham số đưa vào là mã sinh viên, mã học phần, lần thi, điểm thi củ, điểm thi mới.

    Mã:
     CREATE proc CAU6 (@mahocphan nvarchar(10), @masv nvarchar(10), @lanthi tinyint, @diemthimoi numeric(5, 2))
    as
    begin
    	update diemthi
    	set mahocphan=@mahocphan, masv=@masv, lanthi=@lanthi, diem=@diemthimoi
    	where masv=@masv and mahocphan=@mahocphan
    end
    
    EXECUTE CAU6 'sql','dl01-001',1,9 
    Câu 7: Viết thục tục hiển thị các thông tin về sinh nhật ngày hôm nay gồm các thông tin: họ và tên, năm sinh, giới tính (Nam hoặc nữ), tên lớp.

    Mã:
    CREATE PROC CAU7
    AS
    SELECT MASV, HODEM, TEN, NGAYSINH,CASE GIOITINH
    WHEN 0 THEN N'NỮ'
    ELSE N'Nam'
    END 'GIOI TINH', NOISINH
    FROM SINHVIEN 
    WHERE DAY(NGAYSINH)=DAY(GETDATE()) AND MONTH(NGAYSINH)=MONTH(GETDATE())
    
    EXEC CAU7 
    Câu 8: Viết thủ tục xóa toàn bộ thông tin của sinh viên trong CSDL có mã sinh viên là tham số đưa vào.

    Mã:
     CREATE PROC CAU8(@MASV NVARCHAR(10))
    AS
    DELETE FROM SINHVIEN
    WHERE @MASV=MASV
    
    EXEC CAU8 'dh01-005' 
    Câu 9: Viết thủ tục với tham số đưa vào là mã sinh viên, tham số xuất ra là điểm trung bình lần 1 và số lần thi của sinh viên đó.

    Mã:
     CREATE PROC CAU9(@MASV NVARCHAR(10))
    AS
    BEGIN
    DECLARE @TB FLOAT
    DECLARE @SOLT INT
    SELECT @TB=(SELECT AVG(DIEM) FROM DIEMTHI WHERE @MASV=MASV AND LANTHI=1)
    SELECT @SOLT=(SELECT COUNT(LANTHI) FROM DIEMTHI WHERE @MASV=MASV)
    PRINT N'Sinh viên có mã sinh viên:'+N' '+@MASV+N' '+N'có điểm thi trung bình lần 1 là:'+STR(@TB)+N' '+N'số lần thi là: '+STR(@SOLT)
    END
    
    EXEC CAU9 'dl01-003' 
    Câu 10: Xây dựng thủ tục giải phương trình bậc nhất (ax+b=0) gồm 2 tham số đưa vào là a và b.

    Mã:
     CREATE PROC CAU10(@A INT,@B INT)
    AS
    DECLARE @X INT
    SET @X=-(@B)/@A
    IF @A=0
    IF @B=0
    PRINT N'Phương trình có vô số nghiệm!'
    ELSE 
    PRINT N'Phương trình vô nghiệm!'
    ELSE
    PRINT N'Phương trình có một nghiệm là:'+N' '+STR(@X)
    
    EXEC CAU10 3,4 
    Câu 11: Viết thủ tục đưa vào mã khoa, thủ tục trả về số sinh viên của khoa đó.

    Mã:
     CREATE PROC CAU11(@MAKHOA NVARCHAR(5))
    AS
    BEGIN
    DECLARE @DEM INT
    SELECT @DEM=(SELECT COUNT(S.MASV) FROM SINHVIEN S JOIN LOP L ON S.MALOP=L.MALOP
    JOIN KHOA K ON L.MAKHOA=K.MAKHOA WHERE @MAKHOA=L.MAKHOA)
    PRINT N'Số sinh viên của khoa có mã khoa: '+@MAKHOA+N' la '+ STR(@DEM)+N' sinh viên'
    END
    EXEC CAU11 'khmt' 
    Câu 12: Viết thủ tục với tham số đưa vào là mã sinh viên, mã học phần, lần thi và hiển thị ra câu thông báo “Họ tên sinh viên học lớp thi học phần đạt loại’ (A,B,C,D,F)

    Mã:
     create proc cau12 (@masv nvarchar(10), @mahocphan nvarchar(10), @lanthi int)
    as
    begin
    	declare @diemthi float
    	declare @hodem nvarchar(25)
    	declare @ten nvarchar(10)
    	declare @tenlop nvarchar(60)
    	declare @tenhocphan nvarchar(50)
    	select @hodem=hodem, @ten=ten, @tenlop=tenlop, @diemthi=diem, @mahocphan=hocphan.mahocphan, @tenhocphan=tenhocphan
    	from sinhvien inner join lop on sinhvien.malop=lop.malop 
    			inner join diemthi on sinhvien.masv=diemthi.masv
    			inner join hocphan on diemthi.mahocphan=hocphan.mahocphan
    	where sinhvien.masv=@masv and hocphan.mahocphan=@mahocphan and lanthi=@lanthi
    	print 'Sinh viên '+@hodem+' '+@ten+' học lớp '+@tenlop+' thi học phần '+'"'+@tenhocphan+'"'+' được '+str(@diemthi)+' điểm, đạt loại: '+
    			case
    				when @diemthi>=8.5 then 'A'
    				when @diemthi>=7.5 then 'B'
    				when @diemthi>=5.5 then 'C'
    				when @diemthi>=4.5 then 'D'
    				else 'F'
    			end
    end
    exec cau12 'dl01-002', 'tindc', '1' 
    Câu 13: Xây dựng thủ tục hiển thị tất cả thông tin của sinh viên từ bảng SINHVIEN có ngày sinh Từ ngày và Đến ngày (2 tham số vào)
    a. Nếu không truyền tham số Đến ngày thì hiển thị thông tin có Ngaysinh>=Từ ngày.
    b. Nếu không truyền vào tham số Từ ngày thì hiển thị thông tin có Ngaysinh<=Đến ngày.
    c. Nếu cả 2 tham số không truyền vào thì hiển thị tất cả.


    Mã:
     CREATE PROC CAU13(@TUNGAY DATETIME=NULL,@DENNGAY DATETIME=NULL)
    AS
    begin
    IF @TUNGAY IS NULL AND @DENNGAY IS NULL
    	SELECT * FROM SINHVIEN
    ELSE 
    	IF @TUNGAY IS NULL
    		SELECT * FROM SINHVIEN WHERE NGAYSINH<=@DENNGAY
    	ELSE IF @DENNGAY IS NULL
    		SELECT * FROM SINHVIEN WHERE NGAYSINH>=@TUNGAY
    ELSE SELECT * FROM SINHVIEN
    	WHERE NGAYSINH BETWEEN @TUNGAY AND @DENNGAY
    End
    
    exec CAU13 '1986-03-15','1986-08-09'
     
    TheDeath, hgtechvn2, Wendy_l0v33 người khác thích bài này.
  2. Offline

    hgtechvn2

    • Thành Viên Mới

    Số bài viết:
    5
    Đã được thích:
    0
    Điểm thành tích:
    0
    đã cảm ơn, thank for share
  3. Offline

    TheDeath

    • Windows NT

    Số bài viết:
    304
    Đã được thích:
    71
    Điểm thành tích:
    60
    Cám ơn chú Triển nhá...Thi Xong anh mời đi uống nước:))
  4. Offline

    TheDeath

    • Windows NT

    Số bài viết:
    304
    Đã được thích:
    71
    Điểm thành tích:
    60
    À Triển , có mấy bài hamf với Trigger hog...
  5. Offline

    huongdem92

    • Thành Viên Mới

    Số bài viết:
    13
    Đã được thích:
    2
    Điểm thành tích:
    0
    Thông tin bổ ích thật nhưng mà mình không hiểu lắm điệu này phải nghiên cứu thêm thôi.
    À mình chắc là thành viên cuối cùng đọc bài viết này quá.

    Thông tin bổ ích thật nhưng mà mình không hiểu lắm điệu này phải nghiên cứu thêm thôi.
    À mình chắc là thành viên cuối cùng đọc bài viết này quá.
  6. Offline

    traitaodo_st

    • Thành Viên Mới

    Số bài viết:
    5
    Đã được thích:
    0
    Điểm thành tích:
    0
    thanks for sharing

Chia sẻ trang này

Advertising: Linux system admin | nukeviet | nukeviet 4 | Upload ảnh miễn phí