经典的sql语言教程2

来源:互联网 发布:java 第三方线程池 编辑:程序博客网 时间:2024/06/01 10:48
经典的sql语言教程2
2006年11月05日 星期日 16:45

##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(列名) 求某一列值中的最大值
MIN(列名) 求某一列值中的最小值
例:求男学生的总人数和平均年龄
SELECT COUNT(*),AVG(st_age)
FROM student
WHERE st_sex=‘男’
例:统计选修了课程的学生的人数
SELECT COUNT(DISTINCT st_no)
FROM score
注意:这里一定要加入DISTINCT,因为有的学生可能选修了多门课程,但统计时只能按1人统计,所以要使用DISTINCT进行过滤

原创粉丝点击