数据查询是数据库的核心操作。SQL 提供了 SELECT 语句进行数据查询,该语句具有灵活的使用方式和丰富的功能。其一般格式为
1 |
|
- 整个
SELECT
语句的含义是,根据WHERE
子句的条件表达式从FROM
子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT
子句中的目标列表达式选出元组中的属性值形成结果表。 - 如果有
GROUP BY
子句,则将结果按<列名 1>的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数 - 如果
GROUP BY
子句带HAVING
短语,则只有满足指定条件的组才予以输出。 - 如果有
ORDER BY
子句,则结果表还要按<列名 2>的值的升序或降序排序。SELECT
语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。
表单查询
表单查询时只涉及一个表的查询
普通查询
- 查询全体学生的学号与姓名。
1
2SELECT Sno,Sname /*这里列出来的列名就是查询出来的顺序*/
FROM Student;
查询全体学生的姓名、学号、所在系。
1
2SELECT Sname,Sno,Sdept /*与题目顺序保持一致即可*/
FROM Student;查询全体学生的详细记录
1
2SELECT * FROM Student;
SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student;/*两条语句时等价的*/
查询计算后的值
- 查询经过计算后的值
1 |
|
图片中的?column?
需要自己改名字
- 查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名。
1 |
|
- 查询选修了课程的学生学号。(一个学生可能选择多门课程,需要去重)
1 |
|
查询满足条件的元组
查询计算机科学系全体学生的名单。
1
2select sname from student
where sdept='CS';查询所有年龄在 20 岁以下的学生姓名及其年龄。
1
2select sname sage from student
where sage < 20;查询年龄在 20~23 岁(包括 20 岁和 23 岁)之间的学生的姓名、系别和年龄。
1
2
3SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;查询计算机科学系 (CS) 、数学系 (MA) 和信息系 CIS) 学生的姓名和性别。
1
2
3SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ('CS','MA','IS');
查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别。
1
2
3SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT.IN('CS','MA','IS');查询所有姓刘的学生的姓名、学号和性别。
1
2
3SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE'刘%';查询姓“欧阳”且全名为三个汉字的学生的姓名。
1
2
3SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳_';查询 DB_Design 课程的课程号和学分。(转义字符)
1
2
3SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE'DB \_Design'ESCAPE'\';查询以 “DB_" 开头,且倒数第三个字符为 的课程的详细情况。
1
2
3SELECT*
FROM Course
WHERE Cname LIKE'DB \_%i __'ESCAPE'\';查询选修了 号课程的学生的学号及其成绩,查询结果按分数的降序排列。
1
2
3
4SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生 按年龄降序排列。
1
2
3SELECT*
FROM Student
ORDER BY Sdept,Sage DESC;
聚集函数
查询学生总人数。
1
2SELECT COUNT(*)
FROM Student;查询选修了课程的学生人数。
1
2SELECT COUNT(DISTINCT Sno)
FROM SC;计算选修 号课程的学生平均成绩。
1
2
3SELECT AVG(Grade)
FROM SC
WHERE Cno='1';查询选修 号课程的学生最高分数。
1
2
3SELECT MAX(Gtade)
FROM SC
WHERE Cno='I';查询学生 201215012 选修课程的总学分数。
1
2
3SELECT SOM(Ccredit)
FROM SC, Course
WHERE Sno='201215012'AND SC.Cno=Course.Cno;
GROUPBY 子句
求各个课程号及相应的选课人数。
1
2
3SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;查询选修了三门以上课程的学生学号。
1
2
3
4SELECTSno
FROM SC
GROUPBYSno
HAVING COUNT(*) >3;HAVING 短语筛选
WHERE
子句与HAVING
短语的区别在作用对象不同。WHERE
子句作用千基本表或 视图,从中选择满足条件的元组。 HAVING 短语作用于组,从中选择满足条件的组。- 查询平均成绩大于等于90 分的学生学号和平均成绩。
1 |
|