数据库-(4)-SQL基础2-数据查询

数据查询是数据库的核心操作。SQL 提供了 SELECT 语句进行数据查询,该语句具有灵活的使用方式和丰富的功能。其一般格式为

1
2
3
4
5
SELECT [ALL]DISTINCT] <目标列表达式> [,<目标列表达式>] ... 
FROM<表名或视图名>[,<表名或视图名>...]|(<SELECT 语句>)[AS]<别名>
[WHERE<条件表达式>]
[GROUP BY<列名 1>[HAVING<条件表达式>]]
[ORDER BY<列名 2>[ASC|DESC]];
  • 整个 SELECT 语句的含义是,根据 WHERE 子句的条件表达式从 FROM 子句指定的基本表、视图或派生表中找出满足条件的元组,再按 SELECT 子句中的目标列表达式选出元组中的属性值形成结果表。
  • 如果有 GROUP BY 子句,则将结果按<列名 1>的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数
  • 如果 GROUP BY 子句带 HAVING短语,则只有满足指定条件的组才予以输出。
  • 如果有 ORDER BY 子句,则结果表还要按<列名 2>的值的升序或降序排序。SELECT 语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。

表单查询

表单查询时只涉及一个表的查询

普通查询

  1. 查询全体学生的学号与姓名。

1
2
SELECT Sno,Sname /*这里列出来的列名就是查询出来的顺序*/
FROM Student;

  1. 查询全体学生的姓名、学号、所在系。

    1
    2
    SELECT Sname,Sno,Sdept /*与题目顺序保持一致即可*/
    FROM Student;
  2. 查询全体学生的详细记录

    1
    2
    SELECT * FROM Student;
    SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student;/*两条语句时等价的*/

查询计算后的值

  1. 查询经过计算后的值
1
SELECT Sname,2014-Sage from Student;

图片中的?column?需要自己改名字

  1. 查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名。
1
2
3
4
5
6
SELECT 
Sname,
'Year of Birth:' AS "Year of Birth", /*带空格的列名需要使用双引号*/
2014 - Sage AS birthday,
LOWER(Sdept) AS department
FROM Student;

  1. 查询选修了课程的学生学号。(一个学生可能选择多门课程,需要去重)
1
2
SELECT DIST CTSno 
FROM SC;

查询满足条件的元组

  1. 查询计算机科学系全体学生的名单。

    1
    2
    select sname from student
    where sdept='CS';

  2. 查询所有年龄在 20 岁以下的学生姓名及其年龄。

    1
    2
    select sname sage from student
    where sage < 20;
  3. 查询年龄在 20~23 岁(包括 20 岁和 23 岁)之间的学生的姓名、系别和年龄。

    1
    2
    3
    SELECT Sname,Sdept,Sage 
    FROM Student
    WHERE Sage BETWEEN 20 AND 23;
  4. 查询计算机科学系 (CS) 、数学系 (MA) 和信息系 CIS) 学生的姓名和性别。

1
2
3
SELECT Sname,Ssex 
FROM Student
WHERE Sdept IN ('CS','MA','IS');

  1. 查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别。

    1
    2
    3
    SELECT Sname,Ssex 
    FROM Student
    WHERE Sdept NOT.IN('CS','MA','IS');
  2. 查询所有姓刘的学生的姓名、学号和性别。

    1
    2
    3
    SELECT Sname,Sno,Ssex 
    FROM Student
    WHERE Sname LIKE'刘%';
  3. 查询姓“欧阳”且全名为三个汉字的学生的姓名。

    1
    2
    3
    SELECT Sname 
    FROM Student
    WHERE Sname LIKE '欧阳_';
  4. 查询 DB_Design 课程的课程号和学分。(转义字符)

    1
    2
    3
    SELECT Cno,Ccredit 
    FROM Course
    WHERE Cname LIKE'DB \_Design'ESCAPE'\';
  5. 查询以 “DB_" 开头,且倒数第三个字符为 的课程的详细情况。

    1
    2
    3
    SELECT* 
    FROM Course
    WHERE Cname LIKE'DB \_%i __'ESCAPE'\';
  6. 查询选修了 号课程的学生的学号及其成绩,查询结果按分数的降序排列。

    1
    2
    3
    4
    SELECT Sno,Grade 
    FROM SC
    WHERE Cno='3'
    ORDER BY Grade DESC;
  7. 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生 按年龄降序排列。

    1
    2
    3
    SELECT* 
    FROM Student
    ORDER BY Sdept,Sage DESC;

聚集函数

  1. 查询学生总人数。

    1
    2
    SELECT COUNT(*) 
    FROM Student;
  2. 查询选修了课程的学生人数。

    1
    2
    SELECT COUNT(DISTINCT Sno) 
    FROM SC;
  3. 计算选修 号课程的学生平均成绩。

    1
    2
    3
    SELECT AVG(Grade) 
    FROM SC
    WHERE Cno='1';
  4. 查询选修 号课程的学生最高分数。

    1
    2
    3
    SELECT MAX(Gtade) 
    FROM SC
    WHERE Cno='I';
  5. 查询学生 201215012 选修课程的总学分数。

    1
    2
    3
    SELECT SOM(Ccredit) 
    FROM SC, Course
    WHERE Sno='201215012'AND SC.Cno=Course.Cno;

GROUPBY 子句

  1. 求各个课程号及相应的选课人数。

    1
    2
    3
    SELECT Cno,COUNT(Sno) 
    FROM SC
    GROUP BY Cno;
  2. 查询选修了三门以上课程的学生学号。

    1
    2
    3
    4
    SELECTSno 
    FROM SC
    GROUPBYSno
    HAVING COUNT(*) >3;

    HAVING 短语筛选

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

    1. 查询平均成绩大于等于90 分的学生学号和平均成绩。
1
2
3
4
5
6
7
8
9
10
11
--错误示范
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Gtade)>=90
GROUP BY Sno;

--正确
SELECT Sno,AVG(Grade)
FROM SC
GROUPBYSno
HAVING AVG(Grade)>---9();

连接查询