当前位置: 首页 > article >正文

SQL笔试题笔记(1)

下列选项中关于数据库事务的特性描述正确的是()
A.事务允许继续分割

B.多个事务在执行事务前后对同一个数据读取的结果是不同的

C.一个事务对数据库中数据的改变是暂时的

D.并发访问数据库时,各并发事务之间数据库是独立的

答案解析:一个事务是一个完整的业务逻辑单元,不可再分。 一旦提交事件,不可回滚,多个事务相互隔离的。

事务的特点(ACID):

  • A 原子性:一个事务是不可再分割的整体,要么都执行要么都不执行
  • C 一致性:一个事务可以使数据从一个一致状态切换到另外一个一致的状态
  • I 隔离性:一个事务不受其他事务的干扰,多个事务互相隔离的
  • D 持久性:一个事务一旦提交了,则永久的持久化到本地

通过子查询的方式从衬衫表SHIRTABLE中选取出销售单价shirt_price高于全部衬衫的平均价格的衬衫名字

A.SELECT shirt_id,shirt_name,shirt_price FROM SHIRTABLE WHERE shirt_price > AVG(shirt_price)

B.SELECT shirt_id,shirt_name,shirt_price FROM SHIRTABLE WHERE shirt_price > (SELECT AVG(shirt_price) FROM SHIRTABLE)

C.SELECT shirt_id,shirt_name,shirt_price FROM SHIRTABLE HAVING shirt_price > AVG(shirt_price)

D.SELECT shirt_id,shirt_name,shirt_price FROM SHIRTABLE WHERE shirt_price > (SELECT AVG(shirt_price) FROM SHIRTABLE WHERE shirt_price > AVG(shirt_price))

答案解析:使用子查询来计算整个表的平均价格,然后在外层查询中使用这个平均价格作为条件来筛选记录。

1.WHERE子句不能直接跟聚合函数 MAX.MIN等

2.WHERE子句能跟含聚合函数的子查询


写一段SQL,已知衬衫表SHIRTABLE,请你实现通过窗口函数实现,根据不同的衬衫种类shirt_type,按照销售单价shirt_price从低到高的顺序创建排序表()

A.SELECT shirt_name, shirt_type, shirt_price,

RANK() OVER (PARTITION BY shirt _type ORDER BY shirt_price) AS ranking

FROM SHIRTABLE

B.SELECT shirt _name, shirt_type, shirt _price,

PARTITION BY shirt _type ORDER BY shirt _price AS ranking

FROM SHIRTABLE

C.SELECT shirt _name, shirt_type, shirt _price,

RANK (PARTITION BY shirt _type ORDER BY shirt _price) AS ranking

FROM SHIRTABLE

D.SELECT shirt _name, shirt_type, shirt _price,

RANK() OVER (PARTITION BY shirt_type) AS ranking

FROM SHIRTABLE

答案解析:

  1. over()窗口函数的语法结构

    OVER() 子句是 SQL 中窗口函数的一部分,它定义了窗口函数操作的窗口。窗口函数允许您在 SQL 查询中执行聚合计算,但不是对整个结果集,而是对结果集中的特定子集(窗口)进行计算。

    OVER() 子句通常包含以下几个部分:

    • PARTITION BY 子句:类似于 GROUP BY,它将数据分成不同的分区,窗口函数将在每个分区内独立操作。
    • ORDER BY 子句:它确定了窗口内的排序方式,对于某些窗口函数(如排名函数)是必需的。
    • ROWS 或 RANGE 子句:它定义了窗口的大小和范围。ROWS 基于行号定义窗口,而 RANGE 基于值的范围定义窗口。

    语法示例:

    sql

    FUNCTION_NAME() OVER (
      [PARTITION BY column] 
      ORDER BY column 
      [ROWS BETWEEN start AND end]
    )

    如果您不指定 PARTITION BYORDER BY 或窗口范围,窗口大小默认为整个查询结果集。

  2. 常与over()一起使用的分析函数

    您列出的分析函数分类是正确的,这里再详细说明一下:

    • 聚合类:这些函数在窗口内对数据进行聚合计算。

      • AVG():计算平均值。
      • SUM():计算总和。
      • MAX():找出最大值。
      • MIN():找出最小值。
      • COUNT():计算行数。
    • 排名类:这些函数在窗口内对行进行排名。

      • RANK():为每个值分配一个排名,相同值的行会有相同的排名,但会导致排名跳跃(空位)。
      • DENSE_RANK():与 RANK() 类似,但不会跳跃,相同值的行会有相同的排名,排名之间没有间隔。
      • ROW_NUMBER():为每个行分配一个唯一的序号,不考虑值是否相同。


已知某校数据库中包含如下的表数据:
学生表student(sno,sname,birthday,gender)

课程表course(cid,cname)

成绩表grade(sno,cid,mark)

查询至少有一门课程与sno=1909的学生选择的课程相同的学生的学号和姓名,下列SQL语句中正确的是()

A.SELECT DISTINCT a.sno,a.sname

FROM student a,grade b

WHERE a.sno=1909 and a.sno=b.sno

and b.cid IN (SELECT cid FROM grade WHERE sno=1909)

B.SELECT DISTINCT a.sno,a.sname

FROM student a,grade b

WHERE a.sno<>1909 and a.sno=b.sno

and b.cid IN (SELECT cid FROM grade WHERE sno=1909)

C.SELECT DISTINCT a.sno,a.sname

FROM student a,grade b

WHERE a.sno<>1909 and a.sno=b.sno

and b.cid NOT IN (SELECT cid FROM grade WHERE sno=1909)

D.SELECT DISTINCT a.sno,a.sname

FROM student a,grade b

WHERE a.sno=1909 and a.sno=b.sno

and b.cid IN (SELECT cid FROM grade WHERE sno<>1909)

 答案解析:<> 符号与 != 没有区别。

逻辑顺序:
1. 从 `student` 和 `grade` 表中选择字段 `sno`(学生编号)和 `sname`(学生姓名)。
2. 筛选条件 `a.sno<>1909` 排除 `sno` 为 1909 的学生。
3. 通过 `a.sno=b.sno` 关联 `student` 和 `grade` 表。
4. 子查询 `(SELECT cid FROM grade WHERE sno=1909)` 找出 `sno` 为 1909 的学生修过的课程(`cid`)。
5. 主查询中用 `b.cid IN` 条件,只包括修过与 `sno` 为 1909 的学生相同课程的其他学生。
结果没有重复(`DISTINCT`)。


A.SELECT player_id, min(event_date) as first_login FROM gameList GROUP BY player_id

B.SELECT player_id, min(device_id) as first_login FROM gameList GROUP BY player_id

C.SELECT player_id, event_date as first_login FROM gameList GROUP BY player_id WHERE min(event_date)

D.SELECT player_id, min(event_date) as first_login FROM gameList WHERE min(event_date) GROUP BY player_id

答案解析:

登陆时间对应的字段是event_date,第一次意为最早,用min()聚合函数,这是除求数字最小,也能求日期最早。

如果求最近一次,用max()函数。

逻辑顺序:

1.我们需要查询每个 player_id 的第一次登录时间,因此我们需要使用 min() 函数来查询每个 player_id 的最早时间。

2.我们需要根据 player_id 分组,因此需要使用 GROUP BY 语句。

3.我们需要将结果按照 player_id 和 first_login 格式输出。


SQL中属于分组查询的语句是?()
A.Where
B.联盟链
C.Group By
D.Having

答案解析:

区块链大致可以分为公有链(Public Blockchain)、私有链(Private Blockchain)以及联盟链(Consortium Blockchain)三大类。

因此,联盟链属于区块链的一种。

where筛选、group by分组、having与group by连用,用于筛选。


下列选项中都属于关系代数运算符中集合运算符的是()

A.∩、∪、−、×

B.∩、∪、σ、π

C.∧、∨、−、×

D.σ、π、¬、∩

答案解析:

关系代数有五个基础运算符,这五个基础运算符能派生出其他组合运算符。它们分别是:

选择(σ, selection)、投影(π, projection)、叉乘(x, cross-product)、

差(-, set-difference)和并(υ, union)

它们和SQL语句的对应关系为:

选择(σ, selection)相当于SQL语句中的where,表示选出满足一定条件的行。

如:σ rating>8 (S2)相当于 select * from S2 where rating>8;

投影(π, projection)相当于SQL语句中的select。。。distinct, 表示选择哪些列。注意:投影是会去重的!

如:π sname,rating (σ rating>8 (S2))相当于 select sname, rating from S2 where rating>8;

叉乘(x, cross-product)相当于SQL语句中的from,表示穷举所有集合两边元素的组合量

如: AxB 相当于 select * from A, B;  注意:叉乘时两个集合不能有重名列

差(-, set-difference)R-S返回所有在R中而不在S中的元组

并(υ, union)RυS返回包含在R中或在S中的所有元组


Mysql中表student_table(id,name,birth,sex),查询张姓、李姓的学生总人数,错误的是()?
A.select sum(case when name like '张%' then 1 else 0 end) as zhang_first_name ,
sum(case when name like '李%' then 1 else 0 end) as li_first_name
from
student_table;
B.select count(case when name like '张%' then 2 else null end) as zhang_first_name ,
count(case when name like '李%' then 2 else null end) as li_first_name
from
student_table;
C.select count(case when name like '张%' then 1 else 0 end) as zhang_first_name ,
count(case when name like '李%' then 2 else 0 end) as li_first_name
from
student_table;
D.select sum(case when name like '张%' then 1 else null end) as zhang_first_name ,
sum(case when name like '李%' then 1 else null end) as li_first_name
from
student_table;

答案解析:

count分为两种情况

1、使用count(*)时是对表中行的数目进行计数

2、使用count(column)时是对特定列具有的值进行计数,忽略null值

sum加0时和加null时和不变。


 有一张学生成绩表sc(sno 学号,class 课程,score 成绩),示例如下

请问哪个语句可以查询出每个学生的英语、数学的成绩(行转列,一个学生输出一行记录,比如输出[1, 89, 90])?
A.select sno,class,score from sc where class in('english','math')
B.select sno,
if(class='english',score,0),
if(class='math',score,0)
from sc
where class in('english','math')
C.select sno,
case when class='english' then score else 0 end ,
case when class='math' then score else 0 end
from sc
where class in('english','math')
D.select sno,
sum(if(class='english',score,0)) as english,
sum( if(class='math',score,0) ) as math
from sc
where class in('english','math')
group by sno

答案解析:

sum函数作用:不加的话就会导致 

sno english math

1 90 0

1 0 85

而我们想要的结果是

sno english math

1 90 85  将上面2条记录合并就正常啦!  

group by作用:不加会导致所有学生英语成绩都加在一起,数学成绩也会加在一起

sno english math

1 185 165


使用SQL语句建个存储过程proc_stu,然后以student表中的学号Stu_ID为输入参数@s_no,返回学生个人的指定信息。下面创建存储过程语句正确的是:(      )
A.CREATE PROCEDURE [stu].[proc_student]
@s_no AS int
AS
BEGIN
select * from stu.student where Stu_ID=@s_no
END
B.CREATE PROCEDURE [stu].[proc_student]
@s_no int
AS
BEGIN
select * from stu.student where Stu_ID=@s_no
END
C.CREATE PROCEDURE [stu].[proc_student]
@s_no int
AS
BEGIN
select * from stu.student where s_no=@s_no
END
D.CREATE PROCEDURE [stu].[proc_student]
@s_no AS int
AS
BEGIN
select * from stu.student where Stu_ID=@Stu_ID
END

答案解析:

不带参数的存储过程:

create procedure proc_sql1  
as  
begin  
    declare @i int  
    set @i=0  
    while @i<26  
      begin  
         print char(ascii('a') + @i) + '的ASCII码是: ' + cast(ascii('a') + @i as varchar)   
         set @i = @i + 1  
      end  
end

带参数的存储过程:

create proc proc_sql6  
@num1 int,  
@num2 int,  
@num3 int  
as  
begin  
   declare @max int  
   if @num1>@num2    
      set @max = @num1  
   else set @max = @num2  
     
   if @num3 > @max  
      set @max = @num3  
        
   print '3个数中最大的数字是:' + cast(@max as varchar)  
end

http://www.kler.cn/a/396957.html

相关文章:

  • 【Framework系列】UnityEditor调用外部程序详解
  • 【数据库系列】 Spring Boot 集成 Neo4j 的详细介绍
  • 计算机网络HTTP——针对实习面试
  • vue 项目使用 nginx 部署
  • tdengine学习笔记
  • C++内存池实现
  • 深度学习工具和框架详细指南:PyTorch、TensorFlow、Keras
  • 深入解析生成对抗网络(GAN)
  • Vue模块化开发的理解
  • layui 表格点击编辑感觉很好用,实现方法如下
  • ZeroSSL HTTPS SSL证书ACMESSL申请3个月证书
  • unity3d————Resources卸载资源
  • 如何构建安全可靠的 HarmonyOS 应用
  • 【软件工程】一篇入门UML建模图(类图)
  • C++11标准模板(STL)- 常用数学函数 - 宏常量 - 求值得到float类型的安静NaN(NAN)
  • 硬件---4电感---基本概念与特性
  • Aria2-CVE-2023-39141漏洞分析
  • 使用 Caffeine 缓存并在业务方法上通过注解实现每3到5秒更新缓存
  • Python学习笔记(2)正则表达式
  • 《Java核心技术 卷I》用户界面AWT事件继承层次
  • 【网络】什么是交换机?switch
  • IDC机房服务器托管的费用组成
  • 【MyBatis操作数据库】XML配置
  • 自然语言处理(NLP)的开源生态系统:Hugging Face 原理和使用
  • [241115] Debian 12.8 发布 | Mistral AI 推出批量 API,成本降低 50%
  • “嵌入”在大语言模型中是解决把句子转换成向量表示的技术