例3.19到3.48

  • 时间:
  • 浏览:
  • 来源:互联网

数据查询

[例题3.19]
查询全体学生的出生年份,可以以计算的方式:

SELECT Sname,2021-Ssage
FROM Student;

在这里插入图片描述

[例题3.20]
在查询中属性列也可以是字符串,比如

SELECT Sname,'Year of birth:',2021-Ssage 
FROM Student;

在这里插入图片描述
而且我们还可以在字符串后面添加属性列的名称

SELECT Sname,'Year of birth:'BIRTH,2021-Ssage BIRTHDAY
FROM Student;

在这里插入图片描述
【例3.21】消除重复的行
首先比如查询选了课的学生名单

SELECT Sno
FROM SC;

在这里插入图片描述
有重复,如果想显示不重复的学生名单则:

SELECT DISTINCT Sno
FROM SC;

在这里插入图片描述
查询时可以限制条件.比如:
【例3.22】查询计科全体学生名单

SELECT Sname
FROM Student
WHERE Sdept='计科';

在这里插入图片描述
还可以有很多的查询条件限制比如:
【例3.23】查询年龄20岁以下的学生姓名和年龄

SELECT Sname,Sage
FROM Student
WHERE Sage<20;

【例3.24】查询成绩不及格的

select distinct Sno
from SC
where Grade<60;

这里distinct可以让多次课程都不及格的学生只显示一次
【例3.25】between and 使用

select Sname,Sdept,Sage
from Student
where Sage between 20 and 23;

【例3.26】not between and

select Sname,Sdept,Sage
from Student
where Sage not between 20 and 23;

【例3.27】【例3.28】略

查询也可以通过字符匹配来查询:
【例3.29】查询学号为1001的学生情况

select *
from Student
where Sno like'1001';

在这里插入图片描述
通配符%代表任意长度的字符串
【例3.30】查询姓狗的学生

select *
from Student
where Sname like'狗%';

在这里插入图片描述
通配符_(下横线)代表任意单个字符
【例3.31】查询姓小且名字只有两个字的人

select *
from Student
where Sname like'小_';

在这里插入图片描述
如果我们查3个字的,这样打连两个字的也会出现

select *
from Student
where Sname like'小__';

在这里插入图片描述
那怎么查只有3个字的呢,可以这样:

select *
from Student
where Sname like'小__' And Sname NOT LIKE '小_';

在这里插入图片描述
如果查询的字符串本身就包含%或者_,这时可以用escape’<换码字符>‘短语进行通配符转义了
【例3.34】查DB_Design课程的相关信息
如果直接这样查的话’_'就代表任意一个字符,并不能准确

select *
from Course
where Cname like'DB_Design';

在这里插入图片描述
如果我们用换码字符进行查询的话就可以这样

select*
from Course
where Cname like'DB\_Design'escape'\';

这样就可以查到了
在这里插入图片描述
【例3.36】涉及空值的查询
例如查询是否有成绩的学生的信息

select*
from SC
where Grade is NULL;
select*
from SC
where Grade is not NULL;
select*
from SC
where Grade = NULL;

在这里插入图片描述
这里我们不可用=代替is,如果用了=号结果就没有显示出来
【例3.38】查询计科系20岁以下的学生姓名(and的使用)

select Sname
from Student
where Sage<20 and Sdept='CS';

在这里插入图片描述
order by句子的使用:
用户可以用order by字句对查询结果按照一个或者多个属性列的升序(ASC)或者降序(DESC)排列,默认值为升序
【例3.39】查询选修了3号课程的学生的成绩并按照降序排序

select Sno, Grade
from SC
where Cno='3 '
order by Grade DESC;

在这里插入图片描述
聚集函数:
count(*):统计元组个数
count([distinct|all]<列名>):统计一组中值的个数
sum([distinct|all]<列名>):计算一列值的总和(此列必须为数值型)
avg([distinct|all]<列名>):计算一列值的平均值(此列必须为数值型)
max([distinct|all]<列名>):求一列中最大值
min([distinct|all]<列名>):求一列中最小值
【例3.41】查学生总人数

select count(*)
from Student;

【例3.42】查询选修了的学生人数

select count(distinct Sno)
from SC;

【例3.43】查询选修了一号课程的学生的平均成绩

select avg(grade)
from SC
where Cno='1';

【例3.44】查询选修了一号课的学生的最高分

select max(grade)
from SC
where Cno='1';

【例3.45】查询学生1001选修课程的总分

selest sum(grade)
from SC Course
where Sno='1001' and SC.Cno=Course.Cno;

group by子句:该子句将查询结果按某一列或多列的值进行分组,值相等的为一组。
【例3.46】求各个课程号及相应的选课人数

select  Cno,Count(Cno)renshu
from SC
group by Cno;

在这里插入图片描述
如果分组后还要进行条件筛选,则可以用having短语
【例3.47】查询选修了2门课及以上的学生学号

select  Sno
from SC
group by Sno
having count(*)>=2;

在这里插入图片描述
where子句与having子句的作用对象不同,where子句后面不可以接聚集函数而having可以接、
【例3.48】查询平均成绩大于等于90分的学生学号和平均成绩

select Sno,avg(Grade)
from SC
where avg(Grade)>=90
group by Sno;

这样的语句就是不对的,会出现错误
在这里插入图片描述
这样就可以了:

select Sno,avg(Grade)
from SC
group by Grade
having avg(Grade)>=90;

在这里插入图片描述

本文链接http://smartadmin.com.cn/smartadmin/show-5809.html