第一章
数据库的四个基本概念
数据库的发展阶段
数据库模型
常用的数据模型
层次模型
网状模型
关系模型
数据库系统的结构
数据库系统的组成
第二章
SQL语句
SQL语句的基本语法
SOL语句的基本类型
主要记住char,varchar,int,smallint,bigint,decimal(p,d),其中decimal(3,1)形式的数据右22.1,23.1等等float,date,time,timestamp类型
模式的定义和删除
上面这个语句的作用是创建一个学习模式并且授权给zhangxu,create后面的就是创建一个表的意思了
表的定义和删除
索引的建立和删除
第三章
直接通过一道例题来掌握SQL查询语句
数据库中的有关的表如下:
例题1: 查询所有班级的班级编号,班级名称所属学院
理解:因为所需要查找的属性在Class这个表哦中就可以全部找到所以直接在Class中查找即可,并且没有限制条件
SELECT classNo,className,institute
FROM Class
例题2: 查询所有学院的名称
理解:因为所属学院只在班级表中出现所以可以只通过班级班查询即可,唯一的问题就是表中会出现重复的数据怎么办?去重DISTINCT
SELECT DISTINCT institue
FROM Class
例题3: 查询班级的全部信息
理解:通配符*代表获取该表中所有列的投影
SELECT *
FROM Class
例题4: 查询所有班级的所属学院,班级编号和编辑名称,要求列名使用中文显示
给投影取别名,方便使用
语法: SELECT XXX AS xxx 其中AS 可任意省略
不省略 AS
SELECT institue 所需学院,classNo 班级编号,className 班级名称
FROM class
省略AS
SELECT institue AS 所需学院,classNo AS 班级编号,className AS 班级名称
FROM class
例题5: 查询每门课程的课程号,课程名,以及周课时(课时数除以16),并将课程名中的大写字母转化为小写字母输出
对查询到的列及进行处理
SELECT courseNo 课程号, lower(courseName) 课程名,courseHour/16 周时数
FROM Class
例题6: 查询2015级的班级编号,班级名称和所属学院
SELECT calssNo,className,institue
FROM Class
WHERE grade==2015
例题7: 在Student表中查询年龄大于或者等于19岁的同学的学号,姓名,和出生日期
年龄大于19:即当前的日期减去同学的年龄大于19
getDate()
year获取当前日期中的年
SELECT studentNo,studentName,birthday
FROM Student
WHERE (year(getDate())-year(birthday))>=19
例题8: 在选课Score表中查询成绩在80-90分之间的同学学号,课程号和相应成绩
SELECT studentNo,courseNo,termNo
FROM Score
WHERE score BETWEEN 80 AND 90
例题9:在选课Score表中查询成绩不在80-90分之间的同学学号,课程号和相应成绩
SELECT studentNo,courseNo,score
FROM Score
WHERE score NOT BETWEEN 80 AND 90
例题10:在选课Sorce中查询选修了001,005,003其中之一的课程的同学学号,课程号和相应成绩
注意:集合里面的应该是字符串
SELECT studentNo,courseNo,score
FROM Score
WHERE courseNo IN ('001','003','005')
例题11:在Student 中查询籍贯既不是“南昌”也不是“上海”的同学的姓名,籍贯,所属班级
SELECT studentName,native,nation
FROM Student
WHERE native NOT IN ('南昌','上海')
例题12: 在课程Course表中查询先修课程为空值的课程信息
注意:判断一个属性值是否为空不能使用==null
SELECT *
FROM Course
WHERE priorCourse IS null
例题13: 在课程Course表中查询先修课程不为空值的课程信息
注意:判断一个属性值是否为空不能使用==null
SELECT *
FROM Course
WHERE priorCourse IS NOT null
例题14:在班级Class表中查询班级名称中含有会计的班级信息
SELECT *
FROM Class
WHERE calssName LIKE '%会计%'
例题15: 在学生Student表中查询所有姓王并且全名为3个汉字的同学学号和姓名
SELECT studentNo,studentName
FROM Student
WHERE sstudentName LIKE '王--'
例题16:在学生中查询姓名中不含有“福"的同学学号姓名
SELECT studentNo,studentName
FROM Student
WHERE sstudentName NOT LIKE '%福%'
例题17: 在Student 中查询蒙古组的同学的学号和姓名
SELECT studentNo,studentName
FROM Student
WHERE nation LIKE '蒙古族'
//WHERE nation ='蒙古族'
//如果匹配字符串中本身不包含通配符=的作用和LIKE相等
例题19:在选课Sorce中查询选修了001,005,003其中之一的课程的同学学号,课程号和相应成绩
注意:集合里面的应该是字符串
理解:使用逻辑连接符实现
SELECT studentNo,courseNo,score
FROM Score
WHERE courseNo ='001' OR courseNo ='003' OR courseNo ='005'
重点:不可以对同一个属性使用AND连接符并且进行等值判断即下面的这种写法是不被允许的
WHERE courseNo ='001' AND courseNo ='003'
例题20:在Student中查询1998年出生且民族为”汉族“的同学学号,姓名,出生日期
SELECT studentNo,studentName,birthday
FROM Student
WHERE year(birthday)=1998 AND nation='汉族'
例题21:在Student中查询籍贯既不是”南昌“也不是”上海“的同学姓名,籍贯,和所属班级编号
SELECT studentNo,nation,classNo
FROM Student
WHERE nation!= '南昌'AND nation!='上海'
例题22:在score中查询成绩在80-90分之间的同学学号,课程号,和相应成绩
理解:可以使用BETWEEN 和 AND 实现也可以使用OR连接符实现
SELECT studentNo,nation,classNo
FROM Student
WHERE score<80 OR score>90
例题23: 在Student中查询籍贯既不是”南昌“也不是”上海“的同学姓名,籍贯,和所属班级编号,并按照籍贯的降序排序输出
理解:ORDER BY可以控制表格的排序是按照升降序,其中升序表示是ASC 降序是DESC
SELECT studentNo,nation,classNo
FROM Student
WHERE nation!= '南昌'AND nation!='上海'
ORDER BY nation DESC
例题26: 查询1999年出生的”女“同学的信息
方法1:先对表进行一遍查询,再对查询到的结果进行第2遍查询
需要注意的是如果需要对查询到的结果进行查询,需要为该查询结果添加别名
SELECT *
FROM (SELECT * FROM Student where sex='女') AS a
WHERE year(birthday=1999)
方法2:直接使用AND连接符
SELECT *
FROM Student
WHERE year(birthday=1999)AND sex='女'
聚合查询函数:
cout :统计关系的元组个数或一列中值得个数
sum: 统计一列中值得总和
max:统计一列中得最大值
min: 统计一列中得最小值
其中如果指定了DISTINCT谓词,则先消除列名取从重复值得元组,再对表格进行统计
例题27:查询学生的总人数
SELECT count(*)
FROM Student
例题28:查询选课学生的总人数
理解:选课学生的总人数,只能通过Score表格来获取,可是,一门学生可能选修了多门课,所以我们需要先将重复的学生的名字去掉,然后统计者一列的个数
SELECT count (DISTINCT stdentNo)
FROM Student
例题29 查询学号为1500003的同学所选课程的平均分
理解:首先筛选出学号为1500003的同学的所有成绩后,对score列取平均值即可
SELECT avg(score)
FROM Score
WHERE studentNo='1500003'
分组聚合:
作用:分组运算的作用是为了细化聚合函数的而作用对象,如果不对查询随想进行分组,则聚合函数作用与整个查询结果,如果对查询结果进行分组,这句和函数分别作用与每个分组,,查询结果是按组聚合输出。SQL语句组要是通过GROUND BY和HAVING句子来实现分组运算,其中:
GROUND BY子句对查询结果按某一列或者某几列进行分组,值相等的为一组
HAVING 子句对分组的结果进行选择,仅输出满足条件的组,该子句必须配合GROUNG BY子句进行使用
例题30: 查询每个学生的选课门数,平均分,最高分
解释:因为要求的是每个学生的选课门数,平均分,以及最高分,也就是说要以每个学生为一组,分别对每一组进行聚合运算,另外需要注意的是因为你是以studentNo作为分组,所以输出结果时,也应该输出studentNo
SELECT count(courseN0),avg(score),max(score)
FROM Score
GROUND BY studentNo
例题31:查询平均分在80分以上的每个同学的选课门数平均分以及最高分
解释:加上一个HAVING操作进行过滤
SELECT count(courseN0),avg(score),max(score)
FROM Score
GROUND BY studentNo
HAVING avg(score)>=80
连接查询:当需要查询的信息位于两个不同的表中的时候,就需要对存在所需信息的表进行笛卡尔积然后再过滤出符合条件的元组
例题32: 查找会计学院全体同学的学号,姓名,籍贯,班级编号,和所在的班级名称
解释:因为所需要的信息分别位于Class表中以及Student中所以需要先对这两个表进行笛卡尔积然后再筛选出符合条件的元组,因为这两个表是以classNo作为连接的所以直接以classNo作为筛选条件即可,需要注意的是因为含有相同的属性所以进行投影时必须要指明是那个表的属性
SELECT studentNo,studentName,native,a.classNo,className
FROM Calss a,Student b
WHERE a.calssNo=b.classNo AND institute='会计学院'
例题33:查找选修了课程名称为”计算机原理“的同学学号,姓名。
因为Course表格与Student表格是没有直接联系的,而是通过Score建立的联系,所以这次的查询涉及三个表的笛卡尔积
SELECT b.studentNo,studentName
FROM Coursea,Student b,Score c
WHERE b.studentNo=c.StudentNo AND c.courseNo=a.courseNo AND courseNo='计算机原理'
例题34:查找同时选修了编号为001和编号为002课程的同学学号,姓名,课程号和相应的成绩,并按学号排序输出
思路1::可以使用查询的结果与原来的表进行笛卡尔积,然后再在笛卡尔积中获取满足条件的结果
SELECT a.studentNo,a.studentName,b.courseNo,b.score,c.courseNo,c.score
FROM Student a,Score b,(SELECT * FROM Score
WHERE courseNo='002') AS c
WHERE a.studentNo=b.studentNo AND a.studentNo=c.studentNo AND b.studentNo='001'
ORDER BY a.studentNo DESC
思路2:使用自表连接:什么意思?就是直接连接两个Score表并使其中一个的编号为001另一个编号为002,然后再对积后的结果进行筛选
SELECT a.studentNo,a.studentName,b.courseNo,b.score,c.courseNo,c.score
FROM Student a,Score b,score c
WHERE a.studentNo=b.studentNo AND a.studentNo=c.studentNo AND b.studentNo='001' AND c.studentNo='002'
ORDER BY a.studentNo DESC
例题35: 查询获得的总学分(注意:只有成绩及格才能获得该课程的学分)大于等于25的同学的学号,姓名,总学分,并按学号排序输出
理解:首先我们一个同学可能选修了很多们课程,所以要单独聚合某个同学的学分时需要对其进行分组,怎么分?以学分相同的为一组,然后就是是要再该课程及格的前提下,找出概统学的所有学分,怎么做?先求出所有及格的Score,然后与Course以及Score进行笛卡尔积分,然后找出正确的分组,然后按分组聚合即可
SELECT a.studentNo,studentName,sum(creditHour)
FROM Student a,Course b,(SELECT * FROM Score WHERE score>=60) AS c
WHERE a.studentNo=c.studentNo AND c.course=b.courseNo
GROUP BY a.studentNo,studenName
HAVING sum(creditHour)>=25
ORDER BY a.studentNo
自然连接:即通过笛卡尔积,以及筛选条件找出符合条件的元组,并且去掉重复的列
例题36: 实现成绩表和课程表的自然连接
SELECT studentNo,a.courseNo,courseName,creditHour,courseHour,priorCourse,termNo,score
FROM Course a,Score b
WHERE a.courseNo=b.courseNo
例题38: 在Student表中查找与“李宏冰” 同学 在同一个班的同学姓名,班级编号,出生日期
思路同样有两种:
1.先找出李宏冰然后再与Student进行笛卡尔成绩然后进行筛选即可
2.先进行自表连接然后再进行筛选
我这里直接使用自表连接算了
SELECT b.studnetNo,b.calssNo,b.brithday
FROM Student a,Studnet b
WHERE a.studentName='李宏冰' AND a.classNo=b.classNo
外连接:即将不符合条件的结果一样展示出来
外连接:可以分为左外连接和右外连接以及全连接
具体例题直接看书算了,这里就不将了
嵌套子查询:将查询结果放到另一个查询块中的WHERE语句或者HAVING语句中,注意区别于之前的将查询结果放到FROM语句中进行笛卡尔积(即区别于连接)
什么时候使用嵌套子查询:一般来说判断元组是否属于某个集合,集合间的比较运算以及测试是否为空集等时候才会使用嵌套
例题43: 查询选修国课程的学生姓名
理解:首先学生姓名是位于Student表中,课程是位于Course表中,所以涉及了两个表的笛卡尔积,然后去去重
思路1:
SELECT DISTINCT studentName
FROM Student,Score
WHERE Student.studentNo=Score.studentNo
思路2:使用嵌套子查询
SELECT studentName
FROM Student
WHERE Student.studentNo in (SELECT studentNo FROM Score )
例题43: 查找选修的课程中包含“系统“的同学的同学学号,姓名,和班级编号
思路1:直接笛卡尔积然后再进行筛选
SELECT a.studentNo,studentName,classNo
FROM Student a,Score b,Course c
WHERE a.sutdentNo=b.studentNo AND b.courseNo=c.courseNo AND cousrseName LIKE '%系统%'
思路2:先找出包含系统的课程,然后再嵌套找出包含"系统"课程的成绩,最后找出包含该成绩的学生
SELECT a.studentNo,studentName,classNo
FROM Student a
WHERE (SELECT a.studentNo FROM Score b
WHERE b.courseNo in (SELECT c.courseNO FROM Course c
WHERE c.className LIKE '%系统%'))
例题45:查找同时选修过”计算机原理“和“高等数学”两门课程的同学学号,姓名以及该同学所选修的所有课程的课程名和相应成绩,按学号(升序),成绩的降序排序输出
思路1:自表连接的笛卡尔积
SELECT a.studentNo,a.studentName,d.courseName,score
FROM Student a,Course b,Course c,Course d,Score e
WHERE a.studentNo=e.studentNo AND e.courseNo=b.courseNo And b.courseNo=c.courseNo AND c.courseNo=d.courseNo AND b.courseName='计算机原理' AND c.courseName='高等数学'
ORDER BY a.studentNo DESC
思路2:先使用 Student Course Score 后的简单笛卡尔积,然后再判断每个元组是否既存在计算机原理的集合中,又存在于高等数学的集合中
SELECT a.studentNo,a.studentName,courseName,score
FROM Student a,Course b,Score c
WHERE a.studentNo=c.studentNo AND c.courseNo=b.courseNo AND
a.studentNo in(SELECT sutdentNo FROM Score WHERE courseNo IN
(SELECT courseNo FROM Course WHERE
courseName LIKE '计算机原理'
))
AND a.studentNo in(SELECT sutdentNo FROM Score WHERE courseNo IN
(SELECT courseNo FROM Course WHERE
courseName LIKE '高等数学'
))
ORDER BY a.studentNo DESC