数据库 - 数据查询

数据查询

语句格式
       SELECT [ALL|DISTINCT] <目标列表达式>
                                                [,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];

选择表中的若干列

查询指定列
    [例1]  查询全体学生的学号与姓名。
        SELECT Sno,Sname
        FROM Student; 

    [例2]  查询全体学生的姓名、学号、所在系。
        SELECT Sname,Sno,Sdept
        FROM Student;

全部查询列

选出所有属性列:
在SELECT关键字后面列出所有列名 
将<目标列表达式>指定为 *

[例3]  查询全体学生的详细记录。
SELECT  Sno,Sname,Ssex,Sage,Sdept 
FROM Student; 
   或
SELECT  *
FROM Student; 

查询经过计算的值

[例4]  查全体学生的姓名及其出生年份。
SELECT Sname,2004-Sage    /*假定当年的年份为2004年*/
FROM Student;
使用列别名改变查询结果的列标题:

     SELECT Sname NAME,‘Year of Birth: ’  BIRTH,
       2000-Sage  BIRTHDAY,LOWER(Sdept)  DEPARTMENT
    FROM Student;

比较大小

例7]  查询计算机科学系全体学生的名单。
    SELECT Sname
    FROM Student
    WHERE Sdept=‘CS’; 
[例8]  查询所有年龄在20岁以下的学生姓名及其年龄。
     SELECT Sname,Sage 
FROM    Student    
WHERE Sage < 20;
[例9]  查询考试成绩有不及格的学生的学号。
    SELECT DISTINCT Sno
    FROM  SC
    WHERE Grade<60

确定范围

谓词:   BETWEEN …  ANDNOT BETWEEN  …  AND  …
[例10] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的
             姓名、系别和年龄
      SELECT Sname,Sdept,Sage
FROM     Student
WHERE   Sage BETWEEN 20 AND 23; 
[例11]  查询年龄不在20~23岁之间的学生姓名、系别和年龄
           SELECT Sname,Sdept,Sage
           FROM    Student
           WHERE Sage NOT BETWEEN 20 AND 23

确定集合

谓词:IN <值表>,  NOT IN <值表>          
[例12]查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
    SELECT Sname,Ssex
    FROM  Student
    WHERE Sdept IN ( ‘IS‘‘MA‘‘CS‘ );
[例13]查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
     WHERE Sdept NOT IN ( ‘IS‘‘MA‘‘CS‘ );

字符匹配

谓词: [NOT] LIKE  ‘<匹配串>’  [ESCAPE ‘ <换码字符>’]
匹配串为固定字符串
[例14]  查询学号为200215121的学生的详细情况。
     SELECT *    
     FROM  Student  
     WHERE  Sno LIKE200215121‘;
等价于: 
      SELECT  * 
      FROM  Student 
      WHERE Sno = ‘ 200215121 ‘;
 2) 匹配串为含通配符的字符串
[例15]  查询所有姓刘学生的姓名、学号和性别。
      SELECT Sname,Sno,Ssex
      FROM Student
      WHERE  Sname LIKE ‘刘%’;

[例16]  查询姓"欧阳"且全名为三个汉字的学生的姓名。
      SELECT Sname
      FROM   Student
      WHERE  Sname LIKE ‘欧阳__‘;
[例17]  查询名字中第2个字为"阳"字的学生的姓名和学号。
      SELECT Sname,Sno
      FROM Student
      WHERE Sname LIKE ‘__阳%’;

[例18]  查询所有不姓刘的学生姓名。
      SELECT Sname,Sno,Ssex
      FROM Student
      WHERE Sname NOT LIKE ‘刘%‘;
3) 使用换码字符将通配符转义为普通字符

 [例19]  查询DB_Design课程的课程号和学分。
      SELECT Cno,Ccredit
      FROM Course
      WHERE Cname LIKE ‘DB\_Design‘ ESCAPE ‘\‘;

[例20]  查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。
      SELECT  *
      FROM   Course
      WHERE  Cname LIKE  ‘DB\_%i_ _‘ ESCAPE ‘ \ ‘;

 ESCAPE ‘\‘ 表示“ \” 为换码字符 

涉及空值的查询

谓词: IS NULL 或 IS NOT NULL
 “IS” 不能用 “=” 代替
      [例21]  某些学生选修课程后没有参加考试,所以有选课记录,但没 
      有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
     SELECT Sno,Cno
      FROM  SC
      WHERE  Grade IS NULL
[例22]  查所有有成绩的学生学号和课程号。
      SELECT Sno,Cno
      FROM  SC
      WHERE  Grade IS NOT NULL;

多重条件查询

逻辑运算符:AND和 OR来联结多个查询条件
AND的优先级高于OR
可以用括号改变优先级
可用来实现多种其他谓词
[NOT] IN
[NOT] BETWEEN … AND …

[例23]  查询计算机系年龄在20岁以下的学生姓名。
     SELECT Sname
       FROM  Student
       WHERE Sdept= ‘CS‘ AND Sage<20
改写[例12]
[例12]  查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( ‘IS‘‘MA‘‘CS‘ )
可改写为:
SELECT Sname,Ssex
FROM   Student
WHERE  Sdept= ‘ IS ‘ OR Sdept= ‘ MA‘ OR Sdept= ‘ CS ‘

ORDER BY子句

ORDER BY子句
可以按一个或多个属性列排序
升序:ASC;降序:DESC;缺省值为升序
当排序列含空值时
ASC:排序列为空值的元组最后显示
DESC:排序列为空值的元组最先显示 
[例24]  查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
        SELECT Sno,Grade
        FROM  SC
        WHERE  Cno= ‘ 3 ‘
        ORDER BY Grade DESC;
[例25]  查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
        SELECT  *
        FROM  Student
        ORDER BY Sdept,Sage DESC

聚集函数

聚集函数:
计数
COUNT[DISTINCT|ALL] *)
COUNT[DISTINCT|ALL] <列名>)
计算总和
SUM[DISTINCT|ALL] <列名>)    
 计算平均值
AVG[DISTINCT|ALL] <列名>)
最大最小值
     MAX[DISTINCT|ALL] <列名>)
     MIN[DISTINCT|ALL] <列名>)
 [例26]  查询学生总人数。
    SELECT COUNT(*)
    FROM  Student; 
     [例27]  查询选修了课程的学生人数。
     SELECT COUNT(DISTINCT Sno)
     FROM SC;
     [例28]  计算1号课程的学生平均成绩。
          SELECT AVG(Grade)
          FROM SC
          WHERE Cno= ‘ 1 ‘
 [例29]  查询选修1号课程的学生最高分数。
   SELECT MAX(Grade)
   FROM SC
   WHER Cno= ‘ 1 ’;

 [例30]查询学生200215012选修课程的总学分数。
              SELECT SUM(Ccredit)
             FROM  SC, Course
             WHER Sno=‘200215012‘ AND SC.Cno=Course.Cno; 

GROUP BY

GROUP BY子句分组:
细化聚集函数的作用对象
未对查询结果分组,聚集函数将作用于整个查询结果
对查询结果分组后,聚集函数将分别作用于每个组
作用对象是查询的中间结果表
按指定的一列或多列值分组,值相等的为一组

[例31]  求各个课程号及相应的选课人数。
     SELECT Cno,COUNT(Sno)
     FROM    SC
     GROUP BY Cno; 
[例32]  查询选修了3门以上课程的学生学号。
     SELECT Sno
     FROM  SC
     GROUP BY Sno
     HAVING  COUNT(*) >3

HAVING短语与WHERE子句的区别:
作用对象不同
WHERE子句作用于基表或视图,从中选择满足条件的元组
HAVING短语作用于组,从中选择满足条件的组。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。