【参加讨论】##2 (二)数据查询
sql是一种查询功能很强的语言,只要是数据库存在的数据,总能通过适当的方法将它从数据库中查找出来。sql中的查询语句只有一个:select,它可与其它语句配合完成所有的查询功能。select语句的完整语法,可以有6个子句。完整的语法如下:
select 目标表的列名或列表达式集合
from 基本表或(和)视图集合
[where条件表达式]
[group by列名集合
[having组条件表达式]]
[order by列名[集合]…]
整个语句的语义如下:从from子句中列出的表中,选择满足where子句中给出的条件表 达式的元组,然后按groupby子句(分组子句)中指定列的值分组,再提取满足having子 句中组条件表达式的那些组,按select子句给出的列名或列表达式求值输出。order子句(排序子句)是对输出的目标表进行重新排序,并可附加说明asc(升序)或desc(降序)
排列。在where子句中的条件表达式f中可出现下列操作符和运算函数:
算术比较运算符:<,<=,>,>=,=,<>。
逻辑运算符:and,or,not。
集合运算符:union(并),intersect(交),except(差)。
集合成员资格运算符:in,not in
谓词:exists(存在量词),all,some,unique。
聚合函数:avg(平均值),min(最小值),max(最大值),sum(和),count(计数)。
f中运算对象还可以是另一个select语句,即select语句可以嵌套。
上面只是列出了where子句中可出现的几种主要操作,由于where子句中的条件表达式可以很复杂,因此select句型能表达的语义远比其数学原形要复杂得多。
下面,我们以上面所建立的三个基本表为例,演示一下select的应用:
1.无条件查询
例:找出所有学生的的选课情况
select st_no,su_no
from score
例:找出所有学生的情况
select*
from student
“*”为通配符,表示查找from中所指出关系的所有属性的值。
2.条件查询
条件查询即带有where子句的查询,所要查询的对象必须满足where子句给出的条件。
例:找出任何一门课成绩在70以上的学生情况、课号及分数
select unique student.st_class,student.st_no,student.st_name,
student.st_sex,student.st_age,score.su_no,score.score
from student,score
where score.score>=70 and score.stno=student.st_no
这里使用unique是不从查询结果集中去掉重复行,如果使用distinct则会去掉重复行。
另外逻辑运算符的优先顺序为not→and→or。
例:找出课程号为c02的,考试成绩不及格的学生
select st_no
from score
where su_no=‘c02’and score<60
3.排序查询
排序查询是指将查询结果按指定属性的升序(asc)或降序(desc)排列,由order by子句指明。
例:查找不及格的课程,并将结果按课程号从大到小排列
select unique su_no
from score
where score<60
order by su_no desc
4.嵌套查询
嵌套查询是指where子句中又包含select子句,它用于较复杂的跨多个基本表查询的情 况。
例:查找课程编号为c03且课程成绩在80分以上的学生的学号、姓名
select st_no,st_name
from student
where stno in (select st_no
from score
where su_no=‘c03’ and score>80 )
这里需要明确的是:当查询涉及多个基本表时用嵌套查询逐次求解层次分明,具有结构程序设计特点。在嵌套查询中,in是常用到的谓词。若用户能确切知道内层查询返回的是单值,那么也可用算术比较运算符表示用户的要求。
5.计算查询
计算查询是指通过系统提供的特定函数(聚合函数)在语句中的直接使用而获得某些只有经过计算才能得到的结果。常用的函数有:
count(*) 计算元组的个数
count(列名) 对某一列中的值计算个数
sum(列名) 求某一列值的总和(此列值是数值型)
avg(列名) 求某一列值的平均值(此列值是数值型)
max(列名) 求某一列值中的最大值