7.1 SQL的查询语句
SQL的数据操作能力基本上体现在查询上,SQL的一个基本语句是一个完整的查询语句,它给出了如下三个内容:
(1)查询的目标属性:r1,r2,…rm;
(2)查询所涉及的表:R1,R2,…,Rn;
(3)查询的逻辑条件:F。
它们可以用SQL中的基本语句———SELECT语句的三个子句分别表示。SELECT语句由SELECT,FROM及WHERE等三个子句组成,其中SELECT子句给出查询的目标属性,FROM子句给出查询所涉及的表,而WHERE子句则给出查询的逻辑条件,它们可以用下面形式表示:
SELECT<列名>[,<列名>]
FROM<表名>[,<表名>]
WHERE<逻辑条件>
这种SELECT语句在数据查询中表达力很强,不仅如此,为了表示简洁与方便,SELECT语句中的WHERE子句还具有更多的表示能力:
(1)WHERE子句中具有嵌套能力。
(2)WHERE子句中的逻辑条件具有复杂的表达能力。
1)SQL的基本查询语句
SQL的查询功能基本上是用SELECT语句实现的,下面用若干例子说明SELECT语句的使用,这些例子仍以前面所述的学生数据库STUDENT为背景:
S(sno,sn,sa,sd)
C(cno,cn,pno)
SC(sno,cno,g)
(1)单表简单查询
单表简单查询需给出三个条件,它们是:
●所须查询的表名:由FROM子句给出。
●已知条件———给出满足条件的行:由WHERE子句给出。
●目标列名:由SELECT子句给出。
单表的简单查询包括:
●单表全列查询
●单表的列查询
●单表的行查询
●单表的行与列查询
它们可用下面四个例子表示。
例7.1 查询S的所有情况:
其中*表示所有列。
例7.2 查询全体学生名单。
此例为选择表中列的查询。
例7.3 查询学号为990137的学生学号与姓名。
此例为选择表中行的查询。
选择表中行的查询中须使用比较符θ,它包括如下一些:
=,<,>,>=,<=,<>,!=,!<,!>。
它们构成AθB之形式,其中A,B为列名、列表达式或列的值。AθB称比较谓词,它是一个仅具T/F值的谓词。
例7.4 查询所有年龄大于20岁的学生姓名与学号:
此例为选择表中行与列的查询。
(2)常用谓词
除比较谓词外,SELECT语句中还有若干谓词,谓词可以增强语句表达能力,它的值仅是T/F,在这里我们介绍几个常见的谓词,它们是:
●DISTINCT
●BETWEEN
●LIKE
●NULL
一般的谓词常用于WHERE子句中,但是DISTINCT则仅用于SELECT子句中。
例7.5 查询所有选修了课程的学生学号:
SELECT后的DISTINCT表示在结果中去掉重复sno。
例7.6 查询年龄在18至21岁(包括18与21岁)的学生姓名与年龄:
例7.7 查询年龄不在18至21岁的学生姓名与年龄:
上两例给出了WHERE子句中BETWEEN的使用方法。
例7.8 查询姓名以A打头的学生姓名与所在系:
此例给出了WHERE中LIKE的使用方法,LIKE的一般形式是:
<列名>[NOT]LIKE<字符串常量>
其中列名类型必须为字符串,字符串常量的设置方式是:
字符%表示可以与任意长的字符相配,字符__(下横线)表示可以与任意单个字符相配,其他字符代表本身。
例7.9 查询姓名以A打头,且第三个字符必为P的学生姓名与系别:
例7.10 查询无课程分数的学号与课程号:
此例给出了NULL的使用方法,NULL是用以测试属性值是否为空的谓词。NULL的一般形式是:
<列名>IS[NOT]NULL
(3)布尔表达式
在WHERE子句中经常需要使用逻辑表达式,它一般由谓词通过NOT、AND与OR三个联结词构成,称为布尔表达式。下面举一个例子。
例7.11 查询计算机系年龄小于等于20岁的学生姓名:
例7.12 查询非计算机系或年龄不为18岁的学生姓名:
在三个联结词中结合强度依次为NOT、AND、及OR,在表达式中若同时出现有若干个联结词且有时不按结合强度要求则需加括号。
(4)简单连接
在多表查询中涉及到表间连接,其中简单的连接方式是表间等值连接,它可用WHERE子句设置两表不同列间的相等关系,而这些列往往用的是表的外键。因此,在多表查询中须给出四个条件,它们是:
●查询中所涉及的表名:由FROM子句给出,它有多个;
●已知条件:由WHERE子句给出;
●列名:由SELECT子句给出;
●表间连接:由WHERE子句给出。
下面用两个例子以说明之。
例7.13 查询修读课程号为c1的所有学生的姓名。
这是一个涉及到两张表的查询,它可以写为:
S.sn,S.sno及SC.sno,SC.cno分别表示表S中的属性sn,sno以及表SC中的属性sno,cno。一般而言,在涉及多张表查询时须在属性前标明该属性所属的表,但是凡查询中能区分的属性则其前面的表名可省略。
例7.14 查询修读课程名为DATABASE的所有学生姓名。
这是一个涉及到三张表的查询,它可以写为:
(5)自连接
有时在查询中需要对相同的表进行联结,为区别两张相同的表,须对一表用两个别名,然后再按照简单连接方法实现之。现以一例说明。
例7.15 查询至少修读S5所修读的一门课的学生学号。
它可以用下面的图7.1表示之。
图7.1 连接图
(6)结果排序
有时,希望查询结果能按某种顺序显示,此时须在语句后加一个排序子句ORDER BY,该子句具有下面的形式:
ORDER BY<列名>[ASC/DESC]
其中<列名>给出了所需排序的列的列名,而ASC/DESC则分别给出了排序的升序与降序,有时为方便起见,ASC可以省略。
例7.16 查询计算机系所有学生名单并按学号顺序升序显示。
例7.17 查询全体学生情况,结果按学生年龄降序排列。
(7)查询结果的赋值
在SELECT语句中可以增加一个赋值子句,用它可以将查询结果赋值到新表中,这个子句的形式是:
INTO<新表名>
它一般直接放在SELECT子句后。
在对表作赋值时必须预先创建新表。
例7.18 将学生的学号与姓名保存到新表S1中。
2)分层结构查询
SQL是分层结构的,即在SELECT语句的WHERE子句中可以嵌套使用SELECT语句。
目前常用的嵌套关系有两种,一种是IN嵌套,另一种是ANY(ALL)嵌套。它们都反映了查询中的查询路径。
我们知道,在多表查询中,从已知条件的表中开始到目标表中间须有一条路径,只有存在路径查询才能进行。而表的嵌套关系即给出了这种查询的路径。
(1)谓词IN的使用
元素与集合间的属于关系可以用IN表示。
由于IN中必须出现有集合,而SELECT语句的结果为元组集合,因此在IN的使用中允许出现有SELECT语句,这样就出现了SELECT语句的嵌套使用。
图7.2 嵌套图
例7.19 查询修读课程号为c1的所有学生姓名。
在此例子中WHERE子句具有x∈S的形式,其中S.sno为元素,IN为“属于”(∈),而嵌套SELECT语句:
为集合,它称为一个子查询。
这个嵌套可以用下面的图7.2表示。
例7.20 查询所有成绩都不及格的学生姓名。
通过WHERE子句中的IN可以实现嵌套,这种嵌套可以有多重,下面的例子即是三重嵌套,这是一个如图7.3所示的嵌套形式。
图7.3 三重嵌套图
例7.21 查询修读课程名为JAVA的所有学生姓名。
(2)限定比较谓词的使用
在元素与集合的关系中尚有更为复杂的情况,它们是元素与集合中元素的比较关系,它可用带有比较符的ANY与ALL表示。其中谓词ANY表示子查询结果集中某个值,而谓词ALL则表示子查询结果集中的所有值。这样,′>ANY′表示大于子查询结果集中的某个值,′>ALL′表示大于子查询结果集中的所有值。其它如′>=ANY′、′>=ALL′、′=ANY′、′=ALL′、′<ANY′、′<ALL′、′<=ANY′、′<=ALL′、′<>ANY′、′<>ALL′、′!=ANY′、′!=ALL′等。注意,现在经常用′SOME′代替′ANY′这是允许的,它们具相同效果,下面用两个例子说明之。
例7.22 查询学生成绩大于c1课程号中所有学生成绩的学生学号。
例7.23 查询学生成绩大于等于c1课程号中的至少一位学生成绩的学生学号。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。