1、创建数据库和数据表
(1)利用资源管理器,在D盘建立以自己的姓名为名称的文件夹,以便保存数据库
(2)登录并连接到SQL Server
(3)利用对象资源管理器建立名为Study的数据库文件,主文件名为study.mdf,日志文件名为Study.ldy。它们的保存路径在第(1)步中建立的文件夹
(4)利用对象资源管理器在已经建立的Study数据库中分别建立以下六个数据表
我用的SQL语句
①学生基本情况表Student
②班级数据表Class
③课程数据表Course
④选修课程情况表Choice
⑤教师数据表Teacher
⑥教师任课情况表Teaching
use Study;GOCREATE TABLE Student(s_no char(6) primary key, --学号class_no char(6) not null, --班级号s_name varchar(10) not null, --学生姓名s_sex char(2) check(s_sex = '男' or s_sex = '女'),--性别s_birthday datetime --出生日期)GOCREATE TABLE Class(class_no char(6) primary key, --班级号class_name char(20) not null, --班级名称class_special varchar(20), --所属专业class_dept char(20) --系别)GOCREAtE TABLE Course(course_no char(5) primary key, --课程号course_name char(20) not null, --课程名称course_score numeric(6,2) --学分)GOCREATE TABLE Choice(s_no char(6), --学号course_no char(5), --课程号score numeric(6,2) --成绩)GOCREATE TABLE Teacher(t_no char(6) primary key, --教师号t_name varchar(10) not null, --教师姓名t_sex char(2) check(t_sex = '男' or t_sex = '女'), --性别t_birthday datetime, --出生日期t_title char(10) --职称) GOCreate table Teaching(couse_no char(5), --课程号t_no char(6) --教师号)
(5)利用企业管理器,在Study数据库中,向以上建立的数据表分别输入以下内容
我用的SQL语句
①学生基本情况数据表Student
GOinsert into Student(s_no, class_no, s_name, s_sex, s_birthday) values('991101', 'js9901' , '张彬', '男', '1981-10-1')insert into Student(s_no, class_no, s_name, s_sex, s_birthday) values('991102', 'js9901' , '王蕾', '女', '1980-8-8')insert into Student(s_no, class_no, s_name, s_sex, s_birthday) values('991103', 'js9901' , '李建国', '男', '1981-4-5')insert into Student(s_no, class_no, s_name, s_sex, s_birthday) values('991104', 'js9901' , '李平方', '男', '1981-5-12')insert into Student(s_no, class_no, s_name, s_sex, s_birthday) values('991201', 'js9902' , '陈东辉', '男', '1980-2-8')insert into Student(s_no, class_no, s_name, s_sex, s_birthday) values('991202', 'js9902' , '葛鹏', '男', '1979-12-23')insert into Student(s_no, class_no, s_name, s_sex, s_birthday) values('991203', 'js9902' , '潘桃芝', '女', '1980-2-6')insert into Student(s_no, class_no, s_name, s_sex, s_birthday) values('991204', 'js9902' , '姚一峰', '男', '1981-5-7')insert into Student(s_no, class_no, s_name, s_sex, s_birthday) values('001101', 'js0001' , '宋大方', '男', '1980-4-9')insert into Student(s_no, class_no, s_name, s_sex, s_birthday) values('001102', 'js0001' , '许辉', '女', '1978-8-1')insert into Student(s_no, class_no, s_name, s_sex, s_birthday) values('001201', 'js0002' , '王一山', '男', '1982-12-14')insert into Student(s_no, class_no, s_name, s_sex, s_birthday) values('001202', 'js0002' , '牛莉', '女', '1981-6-9')insert into Student(s_no, class_no, s_name, s_sex, s_birthday) values('002101', 'xx0001' , '李丽丽', '女', '1981-9-19')insert into Student(s_no, class_no, s_name, s_sex, s_birthday) values('002102', 'xx0001' , '李王', '男', '1980-9-23')GO
②班级数据表Class
GOinsert into Class(class_no, class_name, class_special, class_dept)values('js9901', '计算机99-1', '计算机', '计算机系')insert into Class(class_no, class_name, class_special, class_dept)values('js9902', '计算机99-2', '计算机', '计算机系')insert into Class(class_no, class_name, class_special, class_dept)values('js0001', '计算机00-1', '计算机', '计算机系')insert into Class(class_no, class_name, class_special, class_dept)values('js0002', '计算机00-2', '计算机', '计算机系')insert into Class(class_no, class_name, class_special, class_dept)values('xx0001', '信息00-1', '信息', '信息系')insert into Class(class_no, class_name, class_special, class_dept)values('xx0002', '信息00-2', '信息', '信息系')Go
③课程数据表Course
GoGoinsert into Course(course_no, course_name, course_score)values('01001', '计算机基础', '3')insert into Course(course_no, course_name, course_score)values('01002', '程序设计语言', '5')insert into Course(course_no, course_name, course_score)values('01003', '数据结构', '6')insert into Course(course_no, course_name, course_score)values('02001', '数据库原理与应用', '6')insert into Course(course_no, course_name, course_score)values('02002', '计算机网络', '6')insert into Course(course_no, course_name, course_score)values('0', '微机原理与应用', '8')Go
④选修课程情况数据表Choice
insert into Choice(s_no, course_no, score)values('991101', '01001', '88.0')--这里的score书上是不填的,但是报错,所以给个初始值insert into Choice(s_no, course_no, score)values('991102', '01001', '0.0')insert into Choice(s_no, course_no, score)values('991103', '01001', '91.0')insert into Choice(s_no, course_no, score)values('991104', '01001', '78.0')insert into Choice(s_no, course_no, score)values('991201', '01001', '67.0')insert into Choice(s_no, course_no, score)values('991101', '01002', '90.0')insert into Choice(s_no, course_no, score)values('991102', '01002', '58.0')insert into Choice(s_no, course_no, score)values('991103', '01002', '71.0')insert into Choice(s_no, course_no, score)values('991104', '01002', '85.0')Go
⑤教师数据表Teacher的内容
Goinsert into Teacher(t_no, t_name, t_sex, t_birthday, t_title)values('000001', '李英', '女', '1964-11-3', '讲师')insert into Teacher(t_no, t_name, t_sex, t_birthday, t_title)values('000002', '王大山', '男', '1955-3-7', '副教授')insert into Teacher(t_no, t_name, t_sex, t_birthday, t_title)values('000003', '张朋', '男', '1960-10-5', '讲师')insert into Teacher(t_no, t_name, t_sex, t_birthday, t_title)values('000004', '陈为军', '男', '1970-3-2', '助教')insert into Teacher(t_no, t_name, t_sex, t_birthday, t_title)values('000005', '宋浩然', '男', '1966-12-4', '讲师')insert into Teacher(t_no, t_name, t_sex, t_birthday, t_title)values('000006', '许红霞', '女', '1951-5-8', '副教授')insert into Teacher(t_no, t_name, t_sex, t_birthday, t_title)values('000007', '徐永军', '男', '1948-4-8', '教授')insert into Teacher(t_no, t_name, t_sex, t_birthday, t_title)values('000008', '李桂箐', '女', '1940-11-3', '教授')insert into Teacher(t_no, t_name, t_sex, t_birthday, t_title)values('000009', '王一凡', '女', '1962-5-9', '讲师')insert into Teacher(t_no, t_name, t_sex, t_birthday, t_title)values('000010', '田峰', '男', '1972-11-5', '助教')Go
⑥教师任课情况表Teaching
Goinsert into Teaching(couse_no, t_no)values('01001', '000001')insert into Teaching(couse_no, t_no)values('01002', '000002')insert into Teaching(couse_no, t_no)values('01003', '000002')insert into Teaching(couse_no, t_no)values('02001', '000003')insert into Teaching(couse_no, t_no)values('02002', '000004')insert into Teaching(couse_no, t_no)values('01001', '000005')insert into Teaching(couse_no, t_no)values('01002', '000006')insert into Teaching(couse_no, t_no)values('01003', '000007')insert into Teaching(couse_no, t_no)values('02001', '000007')insert into Teaching(couse_no, t_no)values('02002', '000008')Go
(6)利用对象资源管理器的数据库备份功能,将以上建立的数据库Study备份到所建立的文件夹中,并将备份文件拷贝到U盘中
2、简单的数据查询
(1)查询所有同学的基本信息,包括序号s_no、班级号class_no、姓名s_name、性别s_sex、出生日期
SELECT s_no, class_no, s_name, s_sex, s_birthdayFROM Student
(2)查询所有同学,要求显示其学号s_no、姓名s_name
SELECT s_no, s_nameFROM Student
(3)查询所有男同学,要求显示其学号s_no、姓名s_name、出生日期s_birthday
SELECT s_no, s_name, s_birthdayFROM StudentWHERE s_sex = '男'
(4)查询所有出生日期在“1980-01-01”前的女同学,要求显示其学号s_no、姓名s_name、性别s_sex、出生日期s_birthday
SELECT s_no, s_name, s_sex, s_birthdayFROM StudentWHERE s_sex= '女'AND s_birthday < '1980-01-01'
(5)查询所有“李”姓的男同学,要求显示其学号、姓名、性别、出生日期
SELECT s_no, s_name, s_sex, s_birthdayFROM StudentWHERE s_sex = '男'AND s_name like '李%'
(7)查询所有姓名中含有“一”字的同学,要求显示其学号,姓名
SELECT s_no, s_nameFROM StudentWHERE s_name like '%一%'
(7)查询所有职称不是“讲师”的教师,要求显示其教师号、姓名、职称
SELECT t_no, t_name, t_titleFROM TeacherWHERE t_title != '讲师'
(8)查询选修了课程,但未参加考试的所有同学,要求显示出这些同学的学号
SELECT s.s_noFROM Student As s, Choice as ChoWHERE s.s_no = cho.s_noAND cho.score = 0.0
(9)查询所有考试不及格的同学,要求显示出这些同学的序号、成绩,并按成绩降序排列
SELECT s.s_no, c.scoreFROM Student As s inner join Choice As cON s.s_no = c.s_noAND c.score < '60.0' order by c.score desc
(10)查询出课程号为01001、02001、0的所有课程,要求显示出课程号、课程名称
SELECT course_no, course_nameFROM CourseWHERE course_no in('01001','01002','01003')
(11)查询所有在1970年出生的教师,要求显示教师号、姓名、出生日期
SELECT t_no, t_name,t_birthdayFROM TeacherWHERE t_birthday >= '1970-01-01'AND t_birthday < '1971-01-01'
(12)查询出各个课程号及相应的选课人数
SELECT Choice.course_no, COUNT(Choice.course_no)FROM Choice inner join CourseON Choice.course_no = Course.course_nogroup by Choice.course_no
(13)查询出教授两门以上课程的教师号
SELECT t_noFROM TeachingGROUP BY t_noHaving COUNT(t_no) > 2
两门以上查不到,两门及以上就有
(14)查询出选修了01001课程的学生平均分数、最低分数及最高分数
SELECT SUM(score) AS '平均分数',MAX(score) AS '最高分数', MIN(score) AS '最低分数'FROM Choice
注:可能有人以为这里错了,因为课本是有一个缺考,我这给他零分,所以它是最低
(15)查询1960年以后出生的,职称为讲师的教师的姓名、出生日期,并按出生日期升序排序
SELECT t_name, t_birthdayFROM TeacherWHERE t_birthday >= '1960-01-01' AND t_title = '讲师'order by t_birthday asc
3、复杂数据查询
(1)查询所有同学的选课情况及成绩情况,要求显示学生的学号、姓名、课程号和课程的成绩
--有些同学没有选课,在这里我列出的是所有同学的,无论选没选课SELECT s.s_no, s.s_name, c.course_no, c.scoreFROM Student As s left join Choice As cOn s.s_no = c.s_no
(2)查询所有同学的选课情况及成绩情况,要求显示学生的姓名、课程名称、课程的成绩,并将查询结果存放到一个新的数据表new_table中
--在这里,同样的,我把没有选课的也查出来了,如果想查出只选有课的同学,用内连接就好SELECT s.s_name, c.course_name, ch.scoreinto new_table FROM (Student As s left join Choice As ch on s.s_no = ch.s_no)left join Course As c On ch.course_no = c.course_no
(3)查询“计算机99-1”班的同学的选课及成绩情况,要求显示学生的学号、姓名、课程号、课程名称、课程的成绩
--这里我是四个表联立,如果有更简单的方法可以留言SELECT s.s_no, s.s_name, c.course_no, c.course_name, ch.score FROM (Student As s inner join Choice As ch ON s.s_no = ch.s_no)inner join Class As cl ON s.class_no = cl.class_no AND cl.class_name = '计算机99-1'inner join Course As c ON ch.course_no = c.course_no
(4)查询所有同学的学分情况(假设课程成绩≥60分时可获得该门课程的学分),要求显示学生的学号、姓名、总学分(将该列名定为:choice_num)
--有错误可以留言SELECT s.s_no, s.s_name, SUM(course_score) As total_scoreFROM Student As s inner join Choice As ch ON s.s_no = ch.s_noinner join Course As c ON ch.course_no = c.course_noWHERE ch.score >= '60.0'GROUP BY s.s_no, s.s_name
(5)查询所有同学的平均成绩及选课门数,要求显示学生的学号、姓名、平均成绩(该列名定位average_score)、选课的门数(该列定名为:choice_num)
--如果错误或者有更简单的方法,欢迎留言SELECT s.s_no, s_name, AVG(ch.score) As average_score, COUNT(ch.course_no) As choice_numFROM Student AS s inner join Choice As ch ON s.s_no = ch.s_no GROUP BY s.s_no, s.s_name
(6)查询所有选修了课程但未参加考试的所有同学及相应的课程,要求显示学生的学号、姓名、课程号、课程名称
--这里为啥有个条件是0.0呢?因为我前面把未参加考试的人的成绩,置为0.0了SELECT s.s_no, s.s_name, c.course_no, c.course_name FROM Student As s inner join Choice As ch ON s.s_no = ch.s_no AND ch.score = '0.0'inner join Course As c ON ch.course_no = c.course_no
(7)查询所有选修了课程但考试不及格(假设<60为不及格)的所有同学及相应的课程,要求显示学生的学号、姓名、课程号、课程名称、学分
--为啥有两个王蕾呢?因为一门没考,一门不及格SELECT s.s_no, s.s_name, c.course_name, c.course_scoreFROM Student As s inner join Choice As ch ON s.s_no = ch.s_no inner join Course As c ON ch.course_no = c.course_noWHERE ch.score < '60.0'
(8)查询选修了课程名称“程序设计语言”的所有同学及成绩情况,要求显示学生的姓名、课程的成绩(使用ANY)
SELECT s.s_name, ch.scoreFROM Student As s inner join Choice As chON s.s_no = ch.s_no AND ch.course_no = ANY(SELECT course_no FROM Course WHERE course_name = '程序设计语言')
(9)查询“计算机系”的所有同学及成绩情况,要求显示学生的学号、姓名、班级名称、课程号、课程名称、课程的成绩
--计算机系的所有同学在这里,但有些可是没有课程的,也就没有成绩SELECT s.s_no, s.s_name, cl.class_name, c.course_no, c.course_name, ch.scoreFROM Student As s left join Choice As ch ON s.s_no = ch.s_no left join Course As c ON ch.course_no = c.course_noinner join Class As cl ON cl.class_dept = '计算机系' AND s.class_no = cl.class_no
(10)查询所有教师的任课情况,要求显示教师姓名、担任课程的名称
SELECT Teacher.t_name, Course.course_nameFROM Teacher inner join Teaching ON Teacher.t_no = Teaching.t_no INNER JOIN Course ON Teaching.couse_no = Course.course_no
(11)查询所有教师的任课门数,要求显示教师姓名、担任课程的门数(course_number)
SELECT Teacher.t_name, COUNT(Teaching.couse_no) AS course_numberFROM Teacher inner join Teaching ON Teacher.t_no = Teaching.t_no AND Teaching.couse_no IN(SELECT couse_no FROM Course WHERE Teaching.couse_no = course_no)GROUP BY Teacher.t_name
(12)查询和“李建国”是同一班级的同学的姓名(利用子查询)
SELECT s_nameFROM Student WHERE s_name != '李建国'AND class_no in(SELECT class_no FROM Student WHERE s_name = '李建国')
(13)查询没有选修“计算机基础”课程的学生姓名(用NOT EXISTS)
SELECT s_nameFROM Student WHERENOT EXISTS(SELECT 1 FROM Course inner join Choice ON course_name = '计算机基础'AND Choice.course_no = Course.course_noAND Student.s_no = Choice.s_no)
(14)查询主讲“数据库原理与应用”和主讲“数据结构”的教师姓名(用UNION)
SELECT t.t_nameFROM Teacher As t inner join Teaching As tiON t.t_no = ti.t_no AND ti.couse_no = (SELECT Course.course_no FROM Course WHERE course_name = '数据库原理与应用')UNIONSELECT t.t_nameFROM Teacher As t inner join Teaching As tiON t.t_no = ti.t_no AND ti.couse_no = (SELECT Course.course_no FROM Course WHERE course_name = '数据结构')
(15)查询讲授了所有课程的教师的姓名
--这是网上写的,我这条做不出来,如果有理解的,可以交流交流SELECT t.t_nameFROM Teacher As tWHERE NOT EXISTS(SELECT * FROM Course As c WHERE NOT EXISTS(SELECT * FROM Teaching As ti WHERE t.t_no = ti.t_no AND c.course_no = ti.couse_no))
4、用Transact-SQL语句定义存储过程
(1)创建一个能向学生表Student插入一条记录的存储过程Insert_student,该过程需要五个参数,分别用来传递学号、姓名、班级、性别、出生日期五个值
--书上的题目,有点错误CREATE proc Insert_student@s_no char(6),@class_no char(6),@s_name varchar(10),@s_sex char(2),@s_birthday datetimeasbegininsert into Student(s_no, class_no, s_name, s_sex, s_birthday)values(@s_no, @class_no, @s_name, @s_sex, @s_birthday)end
(2)写出存储过程Inset_student的SQL语句,向数据表Student中插入一个新同学,并提供相应的实参值(实参值由用户自己给出)
--参数自己随便填,当然要在限制内exec Insert_student @s_no = '199800', @class_no = 'xx0001', @s_name = '陈帅', @s_sex = '男', @s_birthday = '-01-01'
(3)创建一个向课程表Course中插入一门新课程的存储过程Insert_course,该存储过程需要三个参数,分别用来传递课程号、课程名、学分,但允许参数“学分”的默认值为2,即当执行存储过程Insert_course时,未给第三个参数“学分”提供实参值时,存储过程按默认值2进行运算
CREATE proc Insert_course@course_no char(5),@course_name char(20),@course_score numeric(6, 2) = 2asbegin insert into Course(course_no, course_name, course_score)values(@course_no, @course_name, @course_score)end
(4)执行存储过程Insert_course,向课程表插入一门新课程。分两种情况写出相应的SQL命令
第一种情况:提供三个实参值执行存储过程Insert_course(三个参数由用户提供)
exec Insert_course @course_no = '00007', @course_name = '泡妞骨灰级教程', @course_score = '6'
第二种情况:只提供两个实参值执行存储过程Insert,即不提供与参数“学分”对应的实参值
exec Insert_course @course_no = '00008', @course_name = '撩汉108式'
(5)创建一个名称为qurey_student的存储过程,该存储过程的功能是从数据表Student中根据学号查询某一同学的姓名、班级、性别、出生日期
CREATE proc qurey_student@s_no char(6)as beginSELECT s_name, class_no, s_sex, s_birthday FROM Student WHERE s_no = @s_noend
(6)执行存储过程query_student,查询学号为“001101”的姓名、班级、性别、出生日期
exec qurey_student @s_no = '001101'
5、Transact-SQL语句自定义触发器
(1)创建一个向学生表中插入一新同学时能自动列出全部同学信息的触发器Display_trigger
CREATE trigger Display_triggerON dbo.Studentafter insertASbeginSELECT * FROM Studentend
(2)执行存储过程Insert_student,向学生表中插入一新同学,看触发器Display_tigger是否被执行
insert into Student(s_no, class_no, s_name, s_sex, s_birthday)values('99999', 'js0002', '帅陈', '男', '-01-01')
欢迎大家关注下个人的「公众号」:独醉贪欢
后台回复「无脑死磕数据库原理」即可获得练习题与答案