3.4.1 数据查询-单表查询

第三章完整版->有道云笔记

2.数据查询

  • 单表查询

选择表中的若干列

    /* 查询全部列-全体学生的详细记录 */
    SELECT * FROM Student;
    /* 查询指定列-全体学生的姓名、学号和所在系 */
    SELECT Sname,Sno,Sdept FROM Student;
    /* 查询经过计算的值-查询全体学生的姓名及其出生年份 */
    SELECT Sname,2020-Sage FROM Student;

<目标列表达式>不仅可以是算术表达式,还可以是字符串常量函数等。

    /* 小写字母表示系名 */
    SELECT Sname,'Year of Birth:',2014-Sage,LOWER(Sdept) FROM Student

用户还可以指定别名来改变查询结果的列标题。

    /* 替换Sname列标题为NAME,替换2014-Sage列标题为BIRTHDAY */
    SELECT Sname NAME,2014-Sage BIRTHDAY FROM Student;  
NAME BIRTHDAY
李勇 1997
赵六 1995

选择表中的若干元组

I.消除取值重复的行:指定DISTINCT,若无指定,默认为ALL

    SELECT DISTINCT Sno FROM SC;

II.查询满足条件的元组:

①比较大小:可用于比较的运算符一般包括=, >, <, >=, <=, !=或<>, !>, !<。

    /* 查询满足条件的元组:WHRER子句  例:查询CS系全体学生名单 */
    SELECT Sname 
    FROM Student 
    WHRER Sdept='CS';
    /* 例:查询考试成绩不及格的学生学号,这里使用DISTINCT短句
        当一个学生有多门课程不及格,他的学号也之列一次 */
    SELECT DISTINCT Sno 
    FROM SC 
    WHERE Grade<60; 

②确定范围:谓词BETWEEN...AND...和NOT BETWEEN...AND...可用来查找属性值在(或不在)指定范围内的元组,其中BETWEEN后是范围的下限(低值),AND后是上限。

    /* 查询年龄在20-23岁之间的学生姓名、系别和年龄 */
    SELECT Sname,Sdept,Sage 
    FROM Student 
    WHERE Sage BETWEEN 20 AND 23;

③确定集合:谓词IN可以用来查找属性值属于指定集合的元组。(相对的谓词为NOT IN)

    /* 查询计科系(CS)、数学系(MA)学生的姓名和性别 */
    SELECT Sname,Ssex
    FROM Student
    WHERE Sdept IN('CS','MA');

④字符匹配:谓词LIKE可以用来进行字符串的匹配。

    /* 一般语法格式 */
    [NOT] LIKE '<匹配串>' [ESCAPE '<换码字符>']
  • %(百分号)代表任意长度的字符串,如a%b表示以a开头、b结尾的任意长度字符串,如asdb
    /* 查询所有姓刘的学生姓名、学号和性别 */
    SELECT Sname,Sno,Ssex
    FROM Student
    WHERE Sname LIKE '刘%';
  • _(下横线)代表任意单个字符。
    /* [注]:数据库字符集为ASCII时一个汉字需要两个_;字符集为GBK时只需要一个
       查询姓“欧阳”且全名为三个汉字的学生的姓名 */
    SELECT Sname
    FROM Student
    WHERE Sname LIKE '欧阳_';
    /* 查询名字中第二个字为“阳”的学生的姓名 */
    SELECT Sname
    FROM Student
    WHERE Sname LIKE '_阳%';
  • 如果用户要查询的字符本身含有通配符 %或_,这时使用ESCAPE'<换码字符>'短语进行转义
    /* 查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况 */
    SELECT *
    FROM Course
    WHERE Cname LIKE 'DB \_%i_ _' ESCAPE '\';

⑤涉及空值的查询:使用“IS”,不可用等号(=)代替

    /* 查询选课后缺考导致无成绩的学生学号和相应课程号 */
    SELECT Sno,Cno
    FROM SC
    WHERE Grade IS NULL;

⑥多重条件查询:AND和OR可连接多个查询条件。AND优先级高于OR,但可用括号改变优先级。

    /* 查询CS系年龄在20岁以下的学生姓名 */
    SELECT Sname
    FROM Student
    WHERE Sdept = 'CS' AND Sage < 20;

IN谓词实际上是多个OR运算符的缩写。

    /* 查询计科系或数学系学生的姓名 */
    SELECT Sname
    FROM Student
    WHRER Sdept = 'CS' OR Sdept = 'MA';

III.ORDER BY 子句:对查询结果按升序(ASC)或降序(DESC)排列,默认升序。

    // 查询结果按成绩降序排列
    SELECT Sno,Sname
    FROM SC
    WHERE Cno = '3'
    ORDER BY Grade DESC;

IV.聚集函数:

格式 功能
COUNT(*) 统计元组个数
COUNT([DISTINC/ALL]<列名>) 统计一列中值的个数
SUM([DISTINC/ALL]<列名>) 计算一列值的总和(此列必须是数值型)
AVG([DISTINC/ALL]<列名>) 计算一列值的平均值(此列必须是数值型)
MAX([DISTINC/ALL]<列名>) 求一列中的最大值
MIN([DISTINC/ALL]<列名>) 求一列中的最小值

[注]:聚集函数遇到空值时,除COUNT(*)外都跳过空值而只处理非空值;WHERE子句不能使用聚集函数作为条件表达式,聚集函数只能用于SELECT子句和GROUP BY的HAVING子句。

    /* 查询学生201215012选修课程的总学分数 */
    SELECT SUM(Ccredit)
    FROM SC, Course
    WHERE Sno = '201215012' AND SC.Cno = Course.Cno;

V.GROUP BY 子句:将查询结果按某一列或多列的值分组,值相等的为一组。分组的目的是为了细化聚集函数的作用对象。分组后聚集函数将作用于每一个组,即每一组都有一个函数值。

    /* 求各个课程号及对应的选课人数 */
    SELECT Cno,COUNT(Sno)
    FROM SC
    GROUP BY Cno;

查询结果:

Cno COUNT(Sno)
1 21
2 12

分组后若要按照一定条件进行筛选,可使用HAVING短语指定筛选条件。

    /* 查询选修了三门以上课程的学生学号 */
    SELECT Sno
    FROM SC
    GROUP BY Sno
    HAVING COUNT(*)>3;

[注]:WHERE子句作用于整张基本表或视图,HAVING短语作用于组。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容