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短语作用于组。