标签:
初学,第一次碰……其实是因为作业要写实验报告,所以顺便写写文章,也算留一个存档。
#实验要求具体就不描述了
实验要求:
1,创建Student数据库,包括Students,Courses,SC表,表结构如下…
#1. 先手动用SQL Server 2014 Management Studio添加新表,新列
#2. 遇到第一个报错:
不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了“阻止保存要求重新创建表的更改”选项
解决:http://www.jb51.net/article/30416.htm
工具-〉选项-〉左侧有个 设计器-〉表设计器和数据库设计器 -> 阻止保存要求重新创建表的更改(右侧) 把钩去掉即可。
#2. 手打了Students表和Courses表
#3. 嫌SC表内容太多,一个个手打太麻烦,然后直接复制了4行下去,作了个大死!开始报错:
SQL 已更新或删除的行值要么不能使该行成为唯一行(sqlserver中有多行所有的列重复的数据,无法更新或删除问题)
参考:http://www.cnblogs.com/jhxk/articles/1614963.html
试了好久,并没有成功【主要因为自己一开始不知道怎么搞】,然后干脆删了表(反正我就写了那么几行,删了就删了)重新建一个新的,
然后开始批量生产,就是很普通的插入语句,大致如下:
1 USE [Student] 2 GO 3 4 INSERT INTO [dbo].[SC] 5 ([SNO] 6 ,[CNO] 7 ,[GRADE]) 8 VALUES 9 (‘0409011‘,‘EE-006‘,87); 10 GO
妈妈再也不用担心我不能复制粘贴了。差不多第一个题勉强这么解决。
2.1.查询身高大于1.80m的男生的学号和姓名;
#1. 直接SELECT语句
1 USE [Student] 2 GO 3 4 SELECT [SNO] 5 ,[SNAME] 6 FROM [dbo].[Students] 7 WHERE HEIGHT>1.80 AND SEX=‘男‘; 8 GO
截图如上
2.2.查询计算机系秋季所开课程的课程号和学分数
#1. 由于计算机系课程默认以SC开头,所以查找字段中包含某字符串的结果
参考:http://blog.itpub.net/22392018/viewspace-772268/
1 USE [Student] 2 GO 3 4 SELECT [CNO] 5 ,[CREDIT]
6 FROM [dbo].[Courses]
7 WHERE PATINDEX(‘%CS%‘,CNO)>0 AND SEMESTER=‘秋‘
8 GO
截图如上
2.3查询选修计算机系秋季所开课程的男生的姓名、课程号、学分数、成绩
#1. 有关计算机秋的查询如上题,本次是三表联查
参考:http://zhidao.baidu.com/question/465019816.html
1 USE [Student] 2 GO 3 4 SELECT [dbo].[Courses].[CNO] 5 ,[dbo].[Courses].[CREDIT] 6 ,[dbo].[Students].[SNAME] 7 ,[dbo].[SC].[GRADE] 8 FROM [dbo].[SC] 9 LEFT JOIN[dbo].[Courses]ON[dbo].[SC].[CNO]=[dbo].[Courses].[CNO] 10 LEFT JOIN[dbo].[Students]ON[dbo].[SC].[SNO]=[dbo].[Students].[SNO] 11 12 WHERE PATINDEX(‘%CS%‘,[dbo].[SC].[CNO])>0 AND SEMESTER=‘秋‘ AND [dbo].[Students].[SEX]=‘男‘ 13 14 GO
截图如上
2.4查询至少选修一门电机系课程的女生的姓名(假设电机系课程的课程号以EE开头)
#1. 并没有用到新的知识,直接贴代码
USE [Student] GO SELECT [dbo].[Students].[SNAME] FROM [dbo].[Students] LEFT JOIN[dbo].[SC]ON[dbo].[SC].[SNO]=[dbo].[Students].[SNO] WHERE PATINDEX(‘%CS%‘,[dbo].[SC].[CNO])>0 AND [dbo].[Students].[SEX]=‘女‘ GO
让人忧伤的是,查询出来的是所有的记录,一直想知道怎么让它一个名字只出来一条,然而并没有找到办法。【此处未完日后待续】
#第二天发现谜之答案之后得到解决——DISTINCT
1 USE [Student] 2 GO 3 4 SELECT DISTINCT [dbo].[Students].[SNAME] 5 FROM [dbo].[Students] 6 LEFT JOIN[dbo].[SC]ON[dbo].[SC].[SNO]=[dbo].[Students].[SNO] 7 8 WHERE PATINDEX(‘%CS%‘,[dbo].[SC].[CNO])>0 AND [dbo].[Students].[SEX]=‘女‘ 9 10 GO
2.5查询每位学生已选修课程的门数和总平均成绩
#1. 查询每位学生的已修课程COUNT(),总平均成绩AVG()
1 USE [Student] 2 GO 3 4 SELECT [dbo].[Students].[SNO] 5 ,AVG([dbo].[SC].[GRADE]) 平均成绩 6 ,COUNT([dbo].[SC].[CNO]) 课程门数 7 FROM [dbo].[SC] 8 LEFT JOIN[dbo].[Courses]ON[dbo].[SC].[CNO]=[dbo].[Courses].[CNO] 9 LEFT JOIN[dbo].[Students]ON[dbo].[SC].[SNO]=[dbo].[Students].[SNO] 10 GROUP BY [dbo].[Students].[SNO]
2.6查询每门课程选课的学生人数,最高成绩,最低成绩和平均成绩
#1. 新知识为最大项MAX()和最小项MIN()
1 USE [Student] 2 GO 3 4 SELECT [dbo].[Courses].[CNO] 5 ,COUNT([dbo].[SC].[SNO]) 选课人数 6 ,AVG([dbo].[SC].[GRADE]) 平均成绩 7 ,MAX([dbo].[SC].[GRADE]) 最高成绩 8 ,MIN([dbo].[SC].[GRADE]) 最低成绩 9 FROM [dbo].[Courses],[dbo].[SC] 10 WHERE [dbo].[SC].[CNO]=[dbo].[Courses].[CNO] 11 GROUP BY [dbo].[Courses].[CNO]
2.7查询所有课程的成绩都在80分以上的学生的姓名、学号、且按学号升序排列
#1. 想法是查询最低成绩在80分以上,则所有成绩都在80分以上,想当然的使用 GROUP BY MIN([dbo].[SC].[GRADE])>=80 报错,提示使用HAVING
参考:http://www.cnblogs.com/gaiyang/archive/2011/04/01/2002452.html
GROUP BY 和 HAVING 讲的很多
1 USE [Student] 2 GO 3 4 SELECT [dbo].[Students].[SNO] 5 ,[dbo].[Students].[SNAME] 6 FROM [dbo].[Students] 7 LEFT JOIN [dbo].[SC] ON [dbo].[SC].[SNO]=[dbo].[Students].[SNO] 8 GROUP BY [dbo].[Students].[SNO],[dbo].[Students].[SNAME] 9 HAVING MIN([dbo].[SC].[GRADE])>=80 10 ORDER BY [dbo].[Students].[SNO]
结果只有一个人(其实一个人都没有,后来改了数据orz)
2.8查询缺成绩的学生的姓名,缺成绩的课程号及其学分数
#1.新知识IS NULL 为空
1 USE [Student] 2 GO 3 4 SELECT [dbo].[Students].[SNAME] 5 ,[dbo].[Courses].[CNO] 6 ,[dbo].[Courses].[CREDIT] 7 FROM [dbo].[SC] 8 LEFT JOIN[dbo].[Courses]ON[dbo].[SC].[CNO]=[dbo].[Courses].[CNO] 9 LEFT JOIN[dbo].[Students]ON[dbo].[SC].[SNO]=[dbo].[Students].[SNO] 10 WHERE [dbo].[SC].[GRADE] IS NULL
搜不到,然后任性的加了一个试验品hhhh
2.9查询有一门以上(含一门)三个学分以上课程的成绩低于70分的学生的姓名;
#1. 世界上最狗血的事情就是,当我想好好写数据库作业的时候,一百度发现了全套答案
发张图表达一下这操蛋的心情,我不抄我不抄,我就看一眼
链接:http://3y.uu456.com/bp_1jk0h81auc7zlrk1b2th_1.html
看了一下前面题的答案,还是不错的,至少解决了之前未完待续的问题棒棒哒!不过我前题做法比答案复杂不止一点点呢……
WHERE STUDENTS.SNO=SC.SNO 就能代替我所有的 LEFT JOIN (话说我之前是哪里百度出LEFT JOIN的写法)
参考了答案之后撸出这道题,然后发现其实这个题很简单orz
1 USE [Student] 2 GO 3 4 SELECT [dbo].[Students].[SNAME] 5 6 FROM [dbo].[SC],[dbo].[Courses],[dbo].[Students] 7 WHERE [dbo].[SC].[SNO]=[dbo].[Students].[SNO] 8 AND [dbo].[SC].[CNO]=[dbo].[Courses].[CNO] 9 AND [dbo].[Courses].[CREDIT]>=3 10 AND [dbo].[SC].[GRADE]<70 11 /*上面是答案的方法,下面是按我之前风格写的, 12 区别在于另外两个表联法不同*/
13 USE [Student]
14 GO
15
16 SELECT [dbo].[Students].[SNAME]
17 FROM [dbo].[SC]
18 LEFT JOIN[dbo].[Courses]ON[dbo].[SC].[CNO]=[dbo].[Courses].[CNO]
19 LEFT JOIN[dbo].[Students]ON[dbo].[SC].[SNO]=[dbo].[Students].[SNO]
20 WHERE [dbo].[Courses].[CREDIT]>=3 AND [dbo].[SC].[GRADE]<70
2.10查询1984年~1986年出生的学生的姓名,总平均成绩及已修学分数
#1. 挺简单的BETWEEN AND
1 USE [Student] 2 GO 3 4 SELECT [dbo].[Students].[SNAME] 5 ,COUNT([dbo].[Courses].[CREDIT]) 已修学分 6 ,AVG([dbo].[SC].[GRADE]) 平均成绩 7 FROM [dbo].[SC] 8 LEFT JOIN[dbo].[Courses]ON[dbo].[SC].[CNO]=[dbo].[Courses].[CNO] 9 LEFT JOIN[dbo].[Students]ON[dbo].[SC].[SNO]=[dbo].[Students].[SNO] 10 WHERE [dbo].[Students].[BDATE] BETWEEN ‘1984-01-01‘ AND ‘1986-12-31‘ 11 GROUP BY [dbo].[Students].[SNAME]
2.11在STUDENT和SC关系中,删去SNO以’01’开关的所有记录。
#这个不知道什么意思呢。。。看了一眼答案发现题目的开关应该是开头orz。。。= =还以为是什么很高级的东西的说
而且答案还错了
1 USE [Student] 2 GO 3 4 DELETE FROM [dbo].[SC] 5 WHERE [dbo].[SC].[SNO] LIKE ‘%01%‘ 6 GO 7 8 DELETE FROM [dbo].[Students] 9 WHERE [dbo].[Students].[SNO] LIKE ‘%01%‘ 10 GO
2.12在STUDENTS关系中增加以下记录:
#直接INSERT跟第1题一样
1 USE [Student] 2 GO 3 4 INSERT INTO [dbo].[Students] 5 ([SNO] 6 ,[SNAME] 7 ,[SEX] 8 ,[BDATE] 9 ,[HEIGHT] 10 ,[DEPARTMENT]) 11 VALUES 12 (‘0409101‘,‘何平‘,‘女‘,‘1987-03-02‘,1.62,‘‘), 13 (‘0408130‘,‘向阳‘,‘男‘,‘1986-12-11‘,1.75,‘‘); 14 GO
2.13将课程CS-221的学分数增为3,讲课时数增为60
#UPDATE语句
1 USE [Student] 2 GO 3 4 UPDATE [dbo].[Courses] 5 SET [CREDIT] = 3 6 ,[LHOUR] = 60 7 WHERE [dbo].[Courses].[CNO]=‘CS-211‘ 8 9 10 11 GO
/**************************************我是萌萌哒的分割线**************************************/
第一次写日志,并不是什么特别有意义的东西QAQ
但是,毕竟第一次就当鼓励自己了,应该除了我之外没人看吧,我就当日记写了orz
好好加油,无论现在多么凄惨,一年之后一定能遇见不一样的自己!
标签:
原文地址:http://www.cnblogs.com/karac/p/4858083.html