当前位置:文档之家› SQL的数据查询功能之二简单查询

SQL的数据查询功能之二简单查询

二、简单查询1. 选择表中的若干列(1)查询指定列例5 查询全体学生的学号与姓名SELECT Sno,Sname FROM Student;<目标列表达式> 中各个列的先后顺序可以与表中的顺序不一致。

也就是说,用户在查询时可以根据应用的需要改变列的显示顺序。

例6 查询全体学生的姓名、学号、所在系SELECT Sname, Sno, Sdept FROM Student;结果表中的列的顺序与基表中不同,是按查询要求,先列出姓名属性,然后再列学号属性和所在系属性。

(2)查询全部列例7 查询全体学生的详细记录SELECT * FROM Student;该SELECT语句实际上是无条件地把Student表的全部信息都查询出来,所以也称为全表查询,这是最简单的一种查询。

(3)查询经过计算的值SELECT子句的<目标列表达式>不仅可以是表中的属性列,也可以是有关表达式,即可以将查询出来的属性列经过一定的计算后列出结果。

例8 查询全体学生的姓名及其出生年份SELECT Sname, 2004-Sage FROM Student;本例中,<目标列表达式>中第二项不是通常的列名,而是一个计算表达式,是用当前的年份(假设为2004年)减去学生的年龄,这样,所得的即是学生的出身年份。

输出的结果为:Sname------ ----------李勇1976刘晨1977王名1978张立1978不仅可以是算术表达式,还可以是字符串常量、函数等。

例9 查询全体学生的姓名、出生年份和所有系SELECT Sname, 'Year of Birth:', 2004-Sage 出生年份FROM Student;结果为:Sname 出生年份------ -------------------------李勇Year of Birth: 1976刘晨Year of Birth: 1977王名Year of Birth: 1978张立Year of Birth: 1978用户可以通过指定别名来改变查询结果的列标题,这对于含算术表达式、常量、函数名的目标列表达式尤为有用。

2.选择表中的若干元组(1)消除取值重复的行例10 查询所有选修过课的学生的学号SELECT Sno FROM SC;假设SC表中有下列数据Sno Cno Grade------- ------- -------95001 1 9295001 2 8595001 3 8895002 2 9095002 3 80执行上面的SELECT语句后,结果为:Sno-------9500195001950019500295002该查询结果里包含了许多重复的行。

如果想去掉结果表中的重复行,必须指定DISTINCT短语: SELECT DISTINCT Sno FROM SC;执行结果为:Sno-------9500195002(2)查询满足条件的元组查询满足指定条件的元组可以通过WHERE子句实现。

WHERE子句常用的查询条件如表3-3所示。

常用的查询条件查询条件谓词──────────────────────比较(比较运算符) = 、>、>=、<、<=、<>(!=)、NOT确定范围 BETWEEN AND, NOT BETWEEN AND确定集合IN, NOT IN字符匹配 LIKE, NOT LIKE空值 IS NULL, IS NOT NULL多重条件 AND, OR①比较大小例11 查询计算机系全体学生的名单SELECT Sname FROM Student WHERE Sdept = '计算机系';例12 查询所有年龄在20岁以下的学生姓名及其年龄SELECT Sname, Sage FROM Student WHERE Sage <20;或 SELECT Sname, Sage FROM Student WHERE NOT Sage>= 20;例13查询考试成绩有不及格的学生的学号SELECT DISTINCT Sno FROM Course WHERE Grade <60;这里使用了DISTINCT短语,当一个学生有多门课程不及格,他的学号也只列一次。

②确定范围例14 查询年龄在20至23岁之间的学生的姓名、系别、和年龄SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23;与BETWEEN...AND...相对的谓词是NOT BETWEEN...AND...。

例15 查询年龄不在20至23岁之间的学生姓名、系别和年龄SELECT Sname, Sdept, Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;③确定集合例16 查询信息系、数学系和计算机系的学生的姓名和性别SELECT Sname, Ssex FROM Student WHERE Sdept IN ('信息系', '数学系', '计算机系');与IN相对的谓词是NOT IN,用于查找属性值不属于指定集合的元组。

例17 查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别SELECT Sname, Ssex FROM StudentWHERE Sdept NOT IN ('信息系', '数学系', '计算机系');④字符匹配谓词LIKE可以用来进行字符串的匹配。

其一般语法格式如下:[NOT] LIKE '<匹配串>'其含义是查找指定的属性列值与<匹配串>相匹配的元组。

<匹配串>可以是一个完整的字符串,也可以含有以下通配符。

%(百分号) 代表任意长度(长度可以为0)的字符串。

_(下横线) 代表任意单个字符。

[ ]:匹配[ ]中的任意一个字符。

[^]:不匹配[ ]中的任意一个字符。

例18 查所有姓刘的学生的姓名、学号和性别SELECT Sname, Sno, Ssex FROM Student WHERE Sname LIKE '刘%';例19 查名字中第二字为“大”或“小”的学生的姓名和学号SELECT Sname, Sno FROM Student WHERE Sname LIKE '__[大小]%';例20 查询所不姓刘的学生姓名SELECT Sname, Sno, Ssex FROM Student WHERE Sname NOT LIKE '刘%';例21 查询学号中最后一位不是2、3、5的学生情况SELECT * FROM Student WHERE Sno LIKE ‘%[^235]’;⑤涉及空值的查询例23 某些学生选修某门课程后没有参加考试,所以有选课记录,但没有考试成绩,下面我们来查一下缺少成绩的学生的学号和相应的课程号SELECT Sno, Cno FROM SC WHERE Grade IS NULL;注意这里的'IS'不能用等号('=')代替。

例24 查所有有成绩的记录的学生学号和课程号SELECT Sno, Cno FROM SC WHERE Grade IS NOT NULL;⑥多重条件查询逻辑运算符AND和OR可用来联结多个查询条件。

如果这两个运算符同时出现在同一个WHERE条件子句中,则AND的优先级高于OR,但用户可以用括号改变优先级。

例25 查询计算机系年龄在20岁以下的学生姓名SELECT Sname FROM Student WHERE Sdept='计算机系' AND Sage<20;例12 中的IN谓词实际上是多个OR运算符的缩写,因此例12中的查询也可以用OR运算符写成如下等价形式:SELECT Sname, Ssex FROM StudentWHERE Sdept='信息系' OR Sdept='数学系' OR Sdept='计算机系';3.对查询结果排序如果没有指定查询结果的显示顺序,DBMS将按其最方便的顺序(通常是元组在表中的先后顺序)输出查询结果。

用户也可以用ORDER BY子句指定按照一个或多个属性列的升序(ASC)或降序(DESC)重新排列查询结果,其中升序ASC为缺省值。

例26 查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列SELECT Sno, Grade FROM SC WHERE Cno='3' ORDER BY Grade DESC;前面已经提到,可能有些学生选修了3号课程后没有参加考试,即成绩列为空值。

用ORDER BY子句对查询结果按成绩排序时,若按升序排,成绩为空值的元组将最后显示,若按降序排,成绩为空值的元组将最先显示。

例27 查询全体学生情况,查询结果按所在系升序排列,对同一系中的学生按年龄降序排列SELECT * FROM Student ORDER BY Sdept, Sage DESC;4.使用集函数为了进一步方便用户,增强检索功能,SQL提供了许多集函数,主要包括:COUNT([DISTINCT|ALL] *) 统计元组个数COUNT([DISTINCT|ALL] <列名>) 统计一列中值的个数SUM([DISTINCT|ALL] <列名>) 计算一列值的总和(此列必须是数值型)AVG([DISTINCT|ALL] <列名>) 计算一列值的平均值(此列必须是数值型)MAX([DISTINCT|ALL] <列名>) 求一列值中的最大值MIN([DISTINCT|ALL] <列名>) 求一列值中的最小值如果指定DISTINCT短语,则表示在计算时要取消指定列中的重复值。

如果不指定DISTINCT短语或指定ALL短语(ALL为缺省值),则表示不取消重复值。

例29 查询学生总人数SELECT COUNT(*) FROM Student;例30 查询选修了课程的学生人数SELECT COUNT(DISTINCT Sno) FROM SC;学生每选修一门课,在SC中都有一条相应的记录,而一个学生一般都要选修多门课程,为避免重复计算学生人数,必须在COUNT函数中用DISTINCT短语。

例31 计算1号课程的学生平均成绩SELECT AVG(Grade) FROM SC WHERE Cno='1';例32 查询选修1号课程的学生最高分数SELECT MAX(Grade) FROM SC WHERE Cno='1';例33 查询选修1号课程的学生最高分、最低分及平均分SELECT MAX(Grade),MIN(Grade),AVG(Grade) FROM SC WHERE Cno='1';5.对查询结果分组GROUP BY子句可以将查询结果表的各行按一列或多列取值相等的原则进行分组。

相关主题