SQL单表查询

基本语法

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

选择表中若干列

查询指定列

查询全体学生的学号和姓名

SELECT Sno, Sname
FROM student;

image-20220214104504363

查询全部列

查询全体学生详细记录

SELECT * 
FROM student;

image-20220214104616551

查询经过计算的值

查询所有学生的出生年份

SELECT Sname, 2022-Sage		/*当前年份为2022*/
FROM student;

image-20220214104805502

查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名

SELECT Sname, 'Year of Birth:', 2022-Sage, LOWER(Sdept)
FROM student; 

image-20220214105009856

使用别名改变查询结果的列标题

SELECT Sname NAME, 'Year of Birth:', 2022-Sage BirthYear, LOWER(Sdept) DEPARTMENT
FROM student; 

image-20220214105141598

选择表中若干元组

消除取值重复的行

如果没有指定DISTINCT关键字,则缺省为ALL

查询选修了课程的学生的学号

SELECT Sno FROM sc;
/*等价于*/
SELECT ALL Sno FROM sc;

image-20220214105345784

指定DISTINCT关键字,去掉查询结果中重复的行

SELECT DISTINCT Sno FROM sc;

image-20220214105525176

查询满足条件的元组

常用查询条件

查询条件 谓词
比较 =, >, <, >=, <=, !=, <>, !>, !<, NOT+比较运算符
确定范围 BETWEEN AND, NOT BETWEEN AND
确定集合 IN, NOT IN
字符匹配 LIKE, NOT LIKE
空值 IS NULL, IS NOT NULL
逻辑运算 AND, OR, NOT

查询年龄20岁一下学生的姓名和年龄

SELECT Sname, Sage
FROM `student`
WHERE Sage < 20;

image-20220214153947258

查询所有成绩>=90学生的学号

SELECT Sno
FROM sc
WHERE Grade >= 90;

image-20220214154208030

查询年龄在 20~23 岁(包括 20 岁和 23 岁)之间的学生的姓名、系别和年龄

SELECT Sname, Sdept, Sage
FROM student
WHERE Sage BETWEEN 20 AND 23;

image-20220214154331031

查询信息系( IS )和数学系( MA )学生的姓名和性别

SELECT Sname, Ssex
FROM student
WHERE Sdept IN ('IS', 'MA');

image-20220214154522658

查询所有姓张学生的姓名、学号和性别

SELECT Sname, Sno, Ssex
FROM student
WHERE Sname LIKE '张%';

image-20220214154741530

查询所有不姓张的学生姓名

SELECT Sname, Sno, Ssex
FROM student
WHERE Sname NOT LIKE '张%';

image-20220214154921065

某些学生选修课程后没有参加考试,所以有选课记录,但没 有考试成绩。查询缺少成绩的学生的学号和相应的课程号

注意'IS'不能用'='替换

SELECT Sno 
FROM sc
WHERE Grade IS NULL;

查询计算机系年龄在 20 岁以下的学生姓名

SELECT Sname
FROM student
WHERE Sdept='CS' AND Sage <= 20; 

image-20220214155329079

ORDER BY子句

升序:ASC,降序:DESC,缺省值为升序

ASC:排列为空值的元素最后显示

DESC:排列为空值的元素最先显示

查询选修了 3 号课程的学生的学号及其成绩,查询结果 按分数降序排列

SELECT Sno, Grade
FROM sc
WHERE Cno='3'
ORDER BY Grade DESC;

image-20220214155811168

查询全体学生情况,查询结果按所在系的系名字典序升序排列,同一系中的学生按年龄降序排列

SELECT * 
FROM student
ORDER BY Sdept, Sage DESC;

image-20220214160044923

聚集函数

COUNT, SUM, AVG, MAX, MIN
遇到空值跳过,只处理非空值

  • DISTINCT
    取消指定列中重复值
  • ALL
    不取消重复值,缺省为ALL

查询学生总人数。

SELECT COUNT(*)
FROM student;

image-20220214160237350

查询选修了课程的学生人数

SELECT COUNT(DISTINCT Sno)
FROM sc;

image-20220214160332039

计算 1 号课程的学生平均成绩

SELECT AVG(Grade)
FROM sc
WHERE Cno='1';

image-20220214160444996

查询选修 3 号课程的学生最高分数

SELECT MAX(Grade)
FROM sc
WHERE Cno='3';

image-20220214160554771

查询学生 200215121 选修课程的总学分数

SELECT SUM(Ccredit)
FROM sc, course
WHERE Sno='200215121' AND sc.`Cno`=course.`Cno`;

image-20220214160950894

GROUP BY子句

细化聚集函数的作用对象

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

SELECT Cno, COUNT(Sno)
FROM sc
GROUP BY Cno;

image-20220214161212181

查询选修了 3 门以上课程的学生学号

SELECT Sno, COUNT(*)
FROM sc
GROUP BY Sno
HAVING COUNT(*)>=3;

image-20220214161524909

WHERE与HAVING语句的区别:

  • WHERE作用于基本表或视图,从中选择满足条件的元组
  • HAVING作用于组,从中选择满足条件的组
posted @ 2022-02-14 16:18  dctwan  阅读(165)  评论(0编辑  收藏  举报