牛客网-SQL专项训练8

①在SQL中用条件表示价格在在30至40之间,应该如何表达(B)

 解析:IN 与BETWEEN AND的区分 (数字型)

1.in (xx,xx,xx,...)  通常是不连续的,in(30,40)要查询的数据中是否存在30或40;
2.BETWEEN AND 注意是闭区间,BETWEEN 1 AND 199,是1-199,含1和199。
②已知数据表STU,现需创建视图view_s,显示所有男同学的信息。下列SQL语句正确的是(B)

 解析:

创建视图的语法: create view 视图名 as select * from 表名 where 条件

ACD:要么缺少筛选条件,要么语法错误

③在MySQL中,现有评分表evaluate(包含班级编号cid和分数point字段),有班级表grade(包含班级编号cid等字段), 查询evaluate 表中有没有班级均分大于等于80分的,如果存在,则查询显示grade表按cid由大到小排名的前五行记录,SQL语句是()

分析:

1.需要显示的字段:grade中的所有信息

2.需要查询的表:grade

3.进行查询

先从表evaluate中计算point的平均分大于等于80的记录

select cid AVG(point) as avg

from evaluate

group by cid

having avg >= 80;

然后从筛选出的表中按cid从大到小降序排列,选出前五行的记录

select *

from grade

where exists(

slect cid AVG(point) as avg

from evaluate

group by cid

having avg >= 80

)

order by grade.cid desc

limit 5;

注意:group by 后面可以使用别名

④Mysql中表student_table(id,name,birth,sex),id字段值可能重复,分别查询男生、女生的不重复id总数,如下SQL正确的是(B)?

 A:如果是男就为1,否则为null,然后再对1去重,就只会有一个1,sum()最终结果就只有一个1,女生也同样如此,不符合题意。

C:与A情况一样,如果是男就为1,否则为null,然后再对1去重,就只会有一个1,count()最终就只有一条记录,count()为1,不符合题意。

D:distinct需要写在case前面

B:如果是男就显示它的id,否则为null,然后再对id去重,就只会留下不重复的id,count()最终结果就是不重复的id数。

注意:sum(),max(),avg(),min(),count()都是忽略nul的

⑤已知grade表如下,要求找出分数重复的数据,SQL语句是:

分析:

先统计每个mark的数量,并mark进行分组

select mark count(mark) as nums

 from grade

group by mark;

再找出mark数量大于1的分数:

select mark

from(

select mark count(mark) as nums

from grade

group by mark

) as temp

where nums > 1

注意:

  • 创建临时表的时候记得起表名;
  • where子句不能与聚合函数一起使用;
  • where 、group by、 having 的执行顺序是 先where 再group by 再having。
posted on 2022-09-12 11:11  我不想一直当菜鸟  阅读(207)  评论(0编辑  收藏  举报