数据库标准语言SQL(五)——查询(二)
一、前言
这一次内容继续是单表查询的部分,然后单表查询就结束了。
二、示例
1.用值表确定集合查询
引入谓词IN 查找属性值属于指定集合的元组,可以让我们在查询时候更加的随心所欲,查询结果更加符合需求
--查询IS、MA、CS三个系学生信息
select sname,ssex,sdept from student
where sdept in ('IS','MA','CS');
--查询非以上三系
select sname,ssex from student
where sdept not in ('IS','MA','CS');
因为之前插入数据的时候,数据题目就只有这三个系,所以,另一个结果就是空的。
2.字符匹配以及字符通配符的简单使用
字符匹配用 LIKE 和NOT LIKE两个谓词,当然还涉及到了一些简单的字符通配符
字符通配符 | 含义 |
---|---|
% | 代表任意字长 |
_(下划线) | 只占一个任意单个字符,其代表汉字时候和数据库字符集有关,ASCII用一个,GBK两个 |
--匹配串为固定字符串
--查询学号为201215122的学生信息
select * from student
where sno like '201215122';
--等价于
select * from student
where sno = '201215122';
--匹配串为含通配符的字符串
--查询所有李姓同学的信息
select sname,sno,ssex from student
where sname like '李%';
--查询姓王,且全名为2个字--
SELECT * FROM Student WHERE Sname LIKE '王_';
--转义字符换码
--查询DB_Design课程的信息
--这里面有字符通配符‘_’所以要转义
select Cno,Credit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE'\';
3.空值查询
这里引入 IS 。要注意的是,虽然之前像LIKE这样的可以和“=”相互替换,但是这个绝对不可以。
--查询缺少成绩的学生学号和课程号
select sno,cno from sc
where grade is null;
--查询有成绩
select sno,cno from sc
where grade is not null;
建表的时候,都是良好的数据题目,没有空值,所以查询结果为空
4.多重条件查询
这里就用到了两个关键词AND 和OR就是逻辑上的且和或
/*多重条件查询*/
--查询计算机系年龄在20岁以下的学生姓名
select sname from student
where sdept = 'CS' and sage<20;
--查询IS、MA、CS的学生姓名和 性别
--方法一、IN集合查询
select sname,ssex from student
where sdept in ('IS','MA','CS');
--方法二、OR条件查询
select sname,ssex from student
where sdept='IS' or sdept='MA' or sdept='CS';
5.ORDER BY子句
这个子句主要是把查询结果按照一定的顺序排序输出,有两个排序的标志词ASC(升序)和DESC(降序)。
/*ORDER BY子句*/
--查询选修3号课程,降序排列
select sno,grade from sc
where cno='3'
order by grade desc;
--系号升序,同一个系降序
--asc可以省略
select * from student
order by sdept asc,sage desc;
select * from student
order by sdept ,sage desc;
我们可以看到,不仅仅有对于数字的排序,还有对于英文字符串的排序
6.聚集函数
当然,我们也可以在数据库里面实现excel的统计学功能。这里就用到了一些聚集函数
聚集函数的语法 | 意义 |
---|---|
COUNT(*) | 统计所有元组个数 |
COUNT(DISTINCT 列名) | 统计该列中值个数,且不重复计入 |
COUNT(ALL(默认) 列名) | 统计该列中值个数,全部计入 |
SUM(DISTINCT 列名) | 统计该列中值总和,且不重复计入 |
SUM(ALL(默认) 列名) | 统计该列中值总和,全部计入 |
AVG(DISTINCT 列名) | 统计该列中值平均数,且不重复计入 |
AVG(ALL(默认) 列名) | 统计该列中值平均数,全部计入 |
MAX(DISTINCT 列名) | 统计该列中值最大值,且不重复计入 |
MAX(ALL(默认) 列名) | 统计该列中值最大值,全部计入 |
MIN(DISTINCT 列名) | 统计该列中值最小值,且不重复计入 |
MIN(ALL(默认) 列名) | 统计该列中值最小值,全部计入 |
/*聚集函数*/
--查询学生总人数
select count(*) from student;
--查询选修了课程的学生人数
select count(distinct sno) from sc;
--查询且计算1号课程的平均成绩
select avg (grade) from sc
where cno='1';
--查询1号课程的学生最高分数
select max(grade) from sc
where cno = '1';
--查询1号课程的学生最低分数
select min(grade) from sc
where cno = '1';
--查询学生201215122选修课程的总学分
select sum(ccredit) from sc,course
where sno='201215122' and sc.cno=course.cno;
7.GROUP BY子句
该子句为了将查询结果按照某一列或者多列的值分组,其目的在于细化聚集函数的查询。
/*GROUP BY子句*/
--求各个课程号及相应的选课人数
select cno,count(sno) from sc
group by cno ;
--查询选修了3门课以上的学生学号
select sno from sc
group by sno
having count(*)>3;