sql语言使用SELECT语句来实现数据的查询,并按要求检索数据,将查询结以表格的形式返回
SELECT 查询语句结构
SELECT select_list
[INTO new_table_name] //将查询出的结果集创建并存至新表中
FROM tablename
WHERE 限定返回行的搜索条件
GROUP BY 结果集的分组条件
HAVING 结果集的附加筛选条件
ORDER BY 排序方法(DESC OR ASC)
SELECT 子句
1.定义别名(AS 关键字 或 空格)
SELECT studname AS 学生姓名,studbirthday 出生日期,classid 所属班级
FROM Studinfo
2.列连接
sqlsever用 +,oracle 用 ||
SELECT studno || studname AS studindex ,studsex
FROM Studinfo
3.DISTINCT关键字
使用distinct关键字去除重复记录
SELECT DISTINCT(studname),studno,studname,studsex,studbirthday,classid
From Studinfo;
4.空值判断(is NULL)
SELECT * FROM Studinfo
WHERE studbirthday is null //查询生日信息为空值的的学生信息
5.Top-N分析
当我们要取前10条记录时
sqlsever 使用TOP关键字
SELECT TOP10 × FROM Studinfo
oracle没有TOP关键字但可以通过ROWNUM取前几条数据
SELECT * FROM Sstudinfo
where rownum<=10
WHERE子句
where字句用于限制返回的行的查询条件
1.比较查询 (>,<=,between..and.. , ….)
SELECT * FROM Studscore WHERE STUDSCORE >90
2.逻辑运算(and,or,not)
SELECT * FROM Stuinfo
where studsx='女' and classid = '201611520'
3.模糊查询(LIKE关键字)
%包含零个或多个字符的任意字符串
_单个字符串
SELECT * FROM Studinfo WHERE studname like '杨%'
//查询姓杨的学生的学生信息
SELECT * FROM Studinfo WHERE studname like '_浩_'
//查询名字为3个字,且第二个字为‘浩’的同学的基本信息
GROUP BY 子句
结果集的分组条件
按指定的条件进行分类汇总,如果SELECT子句中包含聚合函数则,计算每组的汇总值
注意
在使用GROUP BY 子句时,在SELECT子句中,只能出现GROUP BY分组字段和聚合函数
SELECT studno,count(*) FROM Studinfo
GROUP BY Studno //从学生成绩表查询,各同学所参考的课程门数
HAVING 子句
附加筛选条件
SELECT studno,avg(score) Avgscore
FROM studscoreinfo
WHERE avg(studscore)<60
GROUP BY studno
HAVING COUNT(*)>10
//统计重修10门课程以上的学生平均成绩
ORDER BY 子句
ASC升序; DESC降序
SELECT studno,AVG(Studscore)
FROM Studinfo
GROUP BY Studno
ORDER BY DESC
//统计各学生所有课程平均分,并按降序排序
实战
1.写出在学生信息表(StudInfo)中得到不重复姓名,性别的 SQL 语句。
select distinct studname,studsex from studinfo
2. 写出在学生成绩信息表(StudScoreInfo)中查询学号为 20010505001 并且课程成绩大于 80
的学生成绩记录的 SQL 语句。
select * from studscoreinfo
where studno=20010505001 and studscore>80
3. 写出在学生成绩信息表(StudScoreInfo)中查询成绩在 80 到 90 之间的所有学生成绩记录
的 SQL 语句。(利用 BETWEEN…And 或>=、<=两种方法实现)
select * from studscoreinfo
where studscore between 80 and 90
select * from studscoreinfo
where studscore>=80 and studscore<=90
4.写出在学生成绩信息表(StudScoreInfo)中查询成绩不在 80 到 90 之间的所有学生成绩记
录的 SQL 语句。(利用 NOT 或 OR 两种方法实现)
select * from studscoreinfo
where studscore not between 80 and 90
select * from studscoreinfo
where studscore<80 or studscore>90
5.写出在学生信息表(StudInfo)查询姓名为程竹、李丹、王飞的学生信息记录(用 IN、OR
两种方法实现)。
select * from studinfo
where studname in ('程竹','李丹','王飞')
select * from studinfo
where studname='程竹' or studname='李丹' or studname='王飞'
6.写出在学生信息表(StudInfo)中查询姓名中含有丽字的所有学生信息的 SQL 语句。
select * from studinfo
where studname like '%丽%'
7.写出在学生信息表(StudInfo)中查询姓名中第三个字为丽的所有学生信息的 SQL 语句。
select * from studinfo
where studname like '__丽'
8. 在学生成绩表(StudScoreInfo)中,写出查询学号为 990708012 前 5 门课程成绩记录的 SQL
语句
select * from studscoreinfo
where studno='990708012' and rownum <=5
9. 写出在学生信息表(StudInfo)中查询出生日期为空值的 SQL 语句。
select * from studinfo
where studbirthday is null
10.在学生成绩表(StudScoreInfo)中,将学号为 20010505001 的成绩按高低排序。
select * from studscoreinfo
where studno = 20010505001
order by studscore desc
11.在学生成绩表(StudScoreInfo)中,将学号为 990708012 且成绩低于 60 的成绩提高 50%
显示。
select studno,courseid,studscore*1.5 as studscoreimprove
from studscoreinfo
where studno='990708012' and studscore<60
12. 写出在学生信息表(StudInfo)中,查询 1986 年 10 月以后出生的学生信息,要求学
号与姓名连接在一起取别名。
select studno || studname as studnoname ,studbirthday
from studinfo
where studbirthday>=to_date('1986-11-01','yyyy-mm-dd')
13. 写出在学生成绩信息表(StudScoreInfo)中统计学号为 20010505001 的成绩总分、成
绩平均分、所修课程门数的 SQL 语句。
select sum(studscore) as sumscore, avg(studscore) as avgscore , count(courseid) countcourse
from studscoreinfo
where studno='20010505001'
14. 写出在学生成绩信息表(StudScoreInfo)中统计各学生平均分的 SQL 语句,并按平均
分高低排序。
select studno,avg(studscore) as avgscore
from studscoreinfo
group by studno
order by avgscore desc
15. 写出在学生成绩信息表(StudScoreInfo)中统计各学生平均分、课程门数的 SQL 语
句。
select studno ,avg(studscore) 平均成绩,count(*) 课程门数
from studscoreinfo
group by studno
16. 写出在学生成绩信息表(StudScoreInfo)中统计各课程平均分、参考人数、最高分、
最低分的 SQL 语句。
select courseid 课程编号,avg(studscore) 平均成绩,count(*) 参考人数, max(studscore) 最高成绩, min(studscore) as 最小成绩
from studscoreinfo
group by courseid
17. 在学生成绩信息表(StudScoreInfo)中,统计学号以 20010505 开头的平均分 80 以下
的学生成绩信息。
select studno 学号, avg(studscore) 平均成绩
from studscoreinfo
where studno like '20010505%'
group by studno
having avg(studscore)<85
18. 在学生成绩信息表(StudScoreInfo)中,统计平均分为 85 以上,所修课程为 30 门以
上的学生成绩记录。
select studno,avg(studscore) 平均成绩,count(*) 所修课程门数
from studscoreinfo
group by studno
having avg(stuscorescore)>80 and count(*)>30
19. 在学生成绩信息表(StudScoreInfo)中,统计重修(成绩小于 60)门数为 10 门以上
的学生成绩信息。
select studno,avg(studscore) avgscore
from studscoreinfo
where studscore<60
group by studno
having count(*)>10
20. 双表关联查询,在学生信息表(StudInfo)和学生成绩表(StudScoreInfo)中,查询出学号、姓名、成绩、课程编号。
select s.studno,studname,si.studscore,courseid
from studinfo s,studscoreinfo si
where s.studno=si.studno
21. 多表关联查询,在学生信息表(StudInfo)、学生成绩表(StudScoreInfo)、班级信息表
(ClassInfo)、课程信息表(CourseInfo)中找出学号、姓名、班级编号、班级名称、课程编
号、课程名称、课程成绩。
select s.studno,studname,c.courseid,coursename,studscore
from studinfo s,studscoreinfo si,courseinfo c
where s.studno=si.studno and si.courseid=c.courseid
22. 双表关联统计,例如:在学生成绩信息表(StudScoreInfo)和课程信息表(CourseInfo)中,写出统计各门课程平均分、所修人数、课程最高分、课程最低分的 SQL语句,包括课程编号、课程名称、课程平均分、课程最高分、课程最低分、所修人数查询字段,并按平均分高低排序。
select s.courseid 课程编号,c.coursename 课程名称,
avg(studscore) 平均分,count(*) 所修人数 ,max(studscore) 最高分,min(studscore) 最低分
from studscoreinfo s,courseinfo c
where s.courseid=c.courseid
group by s.courseid,c.coursename
order by 平均分 desc