数据库查询2学习.pptx
查询语句的基本结构Select from where group by having order by 第1页/共65页简单查询查询所有学生的学号与姓名Select sno,sn from S第2页/共65页简单查询查询所有学生的记录Select *from S第3页/共65页 查询经过计算的列查询全体学生的姓名及其出生年份 select sn,2010-age from S第4页/共65页 给经过计算的列加上列名查询全体学生的姓名及其出生年份 Select sn AS 姓名,2010-age AS 年份 from S第5页/共65页条件查询查询在选课表SC中有哪些学生选修了课程,并列出学生的学号 select sno from sc第6页/共65页 消除相同的元组查询在选课表SC中有哪些学生选修了课程,并列出学生的学号 SELECT DISTINCT sno FROM SC第7页/共65页 查询满足条件的元组WHERE 子语句常用的查询条件(1)算术操作符+(加号)、(减号)、*(乘号)和 /(除号)。(2)比较操作符=(等于)、(大于)、(小于)、=(大于等于)、!=!=(不等于)、(小于大于)、!(不大于)和 !85第11页/共65页 确定范围查询年龄在18-21岁之间的学生的姓名,所在系和年龄。SELECT SN,DEPT,AGE FROM S WHERE AGE BETWEEN 18 AND 21 (WHERE AGE=18 AND AGE=21)第12页/共65页确定范围查询年龄不在18-21岁之间的学生的姓名,所在系和年龄。SELECT SN,DEPT,AGE FROM S WHERE AGE NOT BETWEEN 18 AND 21 (WHERE AGE21)第13页/共65页 确定集合查询信息系,数学系和计算机系的学生姓名和性别 SELECT SN,SEX FROM S WHERE DEPT IN(信息系,数学系,计算机系)(where dept=信息系 or dept=数学系 or dept=计算机系)第14页/共65页 确定集合查询信息系,数学系和计算机系的学生姓名和性别 SELECT SN,SEX FROM S WHERE DEPT NOT IN(信息系,数学系,计算机系)(where dept!=信息系 AND dept!=数学系 AND dept!=计算机系)第15页/共65页 字符匹配查询查询姓“张”同学的详细信息 SELECT *FROM S WHERE SN LIKE 张%第16页/共65页 字符匹配查询查询姓名第二字是“德”同学的姓名和学号 SELECT SN,SNO FROM S WHERE SN LIKE _德%第17页/共65页 空值查询查询无考试成绩的学生的学号和相对应的课程号SELECT SNO,CNO FROM SC WHERE SCORE IS NULL第18页/共65页 空值查询查询参加考试成绩的学生的学号和相对应的课程号SELECT SNO,CNO FROM SC WHERE SCORE IS NOT NULL第19页/共65页 多重条件查询查询选修了C01 或C02且分数大于等于85 分学生的学号、课程号和成绩 SELECT SNO,CNO,SCORE FROM SC WHERE (CNO=C01 OR CNO=C02)AND SCORE=85第20页/共65页Group by 子语句Group by子语句将查询结果按照某一列或是多列的值分组,值相等的为一组。分组查询 第21页/共65页分组查询统计每门课程的选课人数,列出课程号和人数 select cno as 课程号,count(sno)as 选课人数 from sc group by cno第22页/共65页ORDER BY 子语句ORDER BY子语句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,缺省值为升序。结果排序第23页/共65页对结果进行排序查询选修3课程的学生的学号和成绩,并按照成绩的降序排序 select sno,score from sc where cno=3 order by score desc第24页/共65页对结果进行排序查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列.select*from s order by dept,age desc第25页/共65页使用TOP子句显示前面的有限条记录查询成绩前5名的学生的学号Select top 5 sno from sc order by score第26页/共65页常用的计算函数及其功能函数名函数名使用格式使用格式功能功能COUNTCOUNT(*)统计表中元组的个数,不消除统计表中元组的个数,不消除重复行,不允许使用重复行,不允许使用distinct关键字关键字COUNTCOUNT()统计本列值的个数统计本列值的个数SUMSUM()按列计算值的总和(数值型的按列计算值的总和(数值型的列)列)AVGAVG()按列求平均值按列求平均值MAXMAX()求一列中的最大值求一列中的最大值MINMIN()求一列中的最小值求一列中的最小值第27页/共65页 利用函数统计汇总查询查询学生总人数 SELECT COUNT(*)FROM S 第28页/共65页查询选修了3门以上的学生学号Select sno from sc group by sno having count(*)3第29页/共65页 利用函数统计汇总查询查询学号为 S01的学生的总分和平均分 SELECT SUM(SCORE)AS 总分,AVG(SCORE)AS 平均分 FROM SC WHERE SNO=S01第30页/共65页 利用函数统计汇总查询求选修C01号课程的最高分,最低分,以及相差的分数 SELECT MAX(SCORE)AS 最高分,MIN(SCORE)AS 最低分,MAX(SCORE)-MIN(SCORE)AS 相差分数 FROM SC WHERE CNO=C01 第31页/共65页思考查询年龄最大的学生的姓名Select sn from sWhere age=max(age)代码错误!正确代码?第32页/共65页连接查询当查询涉及到两个及两个以上的表,称之为连接查询。内连接 外连接 左外连接 右外连接 全外连接第33页/共65页内连接 内连接也叫连接,被称为普通连接或自然连接。内连接是从结果中删除其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。第34页/共65页S表SC表snosn1a2b3c4dsnocno11121321223132内连接第35页/共65页s.snosnsc.snocno1A111a121a132b212b223c313c32第36页/共65页外连接外连接则扩充了内连接的功能,会把内连接中删除表源中的一些保留下来,由于保留下来的行不同,把外连接分为左外连接、右外连接和全外连接这3种连接。第37页/共65页左外连接左外连接保留了第一个表的所有行,但只包含第二个表与第一表匹配的行。第二个表相应的空行被放入NULL值。第38页/共65页ABCa1b12a2b24a2b36a2b48BDb15b26b37b38RS第39页/共65页AR.BCS.BDa1b12b15a1b24b26a2b36b37a2b36b38a2b48nullnull左外连接第40页/共65页右外连接右外连接保留了第二个表的所有行,但只包含第一个表与第二个表匹配的行。第一个表相应空行被入NULL值。第41页/共65页ABCa1b12a2b24a2b36a2b48BDb15b26b37b38b53RS第42页/共65页AR.BCS.BDa1b12b15a1b24b26a2b36b37a2b36b38nullnullnullb53右外连接第43页/共65页全外连接全外连接会把两个表所有的行都显示在结果表中。第44页/共65页ABCa1b12a2b24a2b36a2b48BDb15b26b37b38b53RS第45页/共65页AR.BCS.BDa1b12b15a1b24b26a2b36b37a2b36b38a2b48nullNullnullnullnullb53全外连接第46页/共65页内连接两个表的关键字满足连接条件,则从两个表中提取数据并组合成新的记录Select 列名from 表1 (inner)jion 表2 on 连接条件(Select 列名 from 表1,表2 where 连接条件)第47页/共65页外连接两个表的关键字满足连接条件,则从两个表中提取数据并组合成新的记录Select 列名from 表1 left/right/full jion 表2 on 连接条件第48页/共65页 内连接查询选修课程号为3的学生的姓名 select sn from s join sc on s.sno=sc.sno and cno=3(select sn from s,sc where s.sno=sc.sno and cno=3)第49页/共65页内连接查询每个学生的情况以及选修课的情况Select*from sc jion s on s.sno=sc.sco(Select*from sc,s where s.sno=sc.sco)第50页/共65页去掉重复的列 -自然连接查询每个学生的情况以及选修课的情况Select s.sno,s,age,dept,cno,score from sc jion s on s.sno=sc.sco(Select s.sno,s,age,dept,cno,score from sc,s where s.sno=sc.sco)第51页/共65页复合条件查询查询选修2号课程且成绩在90分以上的所有学生的学号和姓名Select sno,snFrom s,sc where s.sno=sc.sno and cno=2 and score=90第52页/共65页多表查询Select sno,sn,cn,score from s,sc,c where s.sno=sc.sno and o=o and dept=1查询1系中每个学生的学号,姓名,选修课的课程名及成绩第53页/共65页 查询与“张三”在同一个系学习的学生Select sno,sn,deptFrom sWhere dept=(Select dept from s Where sn=张三 )嵌套查询第54页/共65页 嵌套查询查询选修了“数据库”课程的学生的学号和姓名Select sno,snFrom sWhere sno=(Select sno from sc Where cno=(Select cno from c Where cn=数据库 )第55页/共65页查询选修了1号课程且成绩大于此课程平均成绩的学生的学号和成绩Select sno,cno from sc where cno=1 and score (select avg(score)from sc where cno=1 )第56页/共65页 带有ANY 或ALL谓词的子查询查询其他系中比1系某一学生小的学生姓名和年龄Select sn,age from s where ageany(select age from s where dept=1 )and dept1第57页/共65页 带有ANY 或ALL谓词的子查询查询其他系中比1系所有学生都小的学生姓名和年龄Select sn,age from s where ageall(select age from s where dept=1 )and dept1第58页/共65页 带有ANY 或ALL谓词的子查询查询其他系中比1系所有学生都小的学生姓名和年龄Select sn,age from s where age(select min(age)from s where dept=1 )and dept1第59页/共65页EXISTS表示存在的量词,带有EXISTS的子查询不返回任何实际数据,它只得到逻辑值“真”或“假”。当子查询的查询结果为空时,外层的where 子句返回true值,否则返回false带有EXISTS谓词的子查询第60页/共65页 带有EXISTS谓词的子查询查询选修了(没有)1号课程的学生的姓名 select sn from s where(not)exists(select*from sc where s.sno=sc.sno and cno=1 )第61页/共65页 带有EXISTS谓词的子查询由EXISTS引出的子查询,其目标列表达式通常用*,因为带EXISTS的子查询只返回真值(true)或者假值(false)第62页/共65页 合并查询查询学号为1号学生的学号和总分,再查询出学号为2号学生的学号和总分,将两个结果合并成一个结果集 select sno as学号,sum(score)as 总分 from sc where sno=1 unionselect sno as学号,sum(score)as 总分 from sc where sno=2第63页/共65页 将结果存储到表中Select.into 表名.查询选修1号课程的学生的姓名,并将结果存储在“查询结果”表中。select sn as 姓名 into 查询结果 from s,sc where s.sno=sc.sno and cno=1 第64页/共65页感谢您的观看!第65页/共65页