SQL笔试题笔记(1)

ops/2024/11/17 7:09:52/
下列选项中关于数据库事务的特性描述正确的是()
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 rankingFROM SHIRTABLEB.SELECT shirt _name, shirt_type, shirt _price,PARTITION BY shirt _type ORDER BY shirt _price AS rankingFROM SHIRTABLEC.SELECT shirt _name, shirt_type, shirt _price,RANK (PARTITION BY shirt _type ORDER BY shirt _price) AS rankingFROM SHIRTABLED.SELECT shirt _name, shirt_type, shirt _price,RANK() OVER (PARTITION BY shirt_type) AS rankingFROM 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.snameFROM student a,grade bWHERE a.sno=1909 and a.sno=b.snoand b.cid IN (SELECT cid FROM grade WHERE sno=1909)B.SELECT DISTINCT a.sno,a.snameFROM student a,grade bWHERE a.sno<>1909 and a.sno=b.snoand b.cid IN (SELECT cid FROM grade WHERE sno=1909)C.SELECT DISTINCT a.sno,a.snameFROM student a,grade bWHERE a.sno<>1909 and a.sno=b.snoand b.cid NOT IN (SELECT cid FROM grade WHERE sno=1909)D.SELECT DISTINCT a.sno,a.snameFROM student a,grade bWHERE a.sno=1909 and a.sno=b.snoand 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_idB.SELECT player_id, min(device_id) as first_login FROM gameList GROUP BY player_idC.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.ppmy.cn/ops/134361.html

相关文章

基于微信小程序的校园超市购物系统设计与实现,LW+源码+讲解

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本超市购物系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…

使用YOLOv9进行图像与视频检测

大家好&#xff0c;YOLOv9 与其前身v8一样&#xff0c;专注于识别和精确定位图像和视频中的对象。本文将介绍如何使用YOLOv9进行图像与视频检测&#xff0c;自动驾驶汽车、安全系统和高级图像搜索等应用在很大程度上依赖于此功能&#xff0c;YOLOv9 引入了比 YOLOv8 更令人印象…

Linux开发常用命令

文章目录 开发常用命令包管理 网络操作用户和权限系统监控nohup和screen的区别 开发常用命令 Linux开发中常用的命令非常多&#xff0c;以下是一些基本且重要的命令&#xff0c;这些命令对于日常的开发工作流程至关重要&#xff1a; 文件和目录操作 ls&#xff1a;列出目录内…

【idea】更换快捷键

因为个人习惯问题需要把快捷键替换一下。我喜欢用CTRLD删除一下&#xff0c;用CTRLY复制一样。恰好这两个快捷键需要互换一下。 打开file——>setting——>Keymap——>Edit Actions 找到CTRLY并且把它删除 找到CTRLD 并且把它删除 鼠标右键添加CTRLY 同样操作在Delet…

如何使用 WebAssembly 扩展后端应用

1. WebAssembly 简介 随着互联网的发展&#xff0c;越来越多的应用借助 Javascript 转到了 Web 端&#xff0c;但人们也发现&#xff0c;随着移动互联网的兴起&#xff0c;需要把大量的应用迁移到手机端&#xff0c;随着手端的应用逻辑越来越复杂&#xff0c;Javascript 的解析…

需求驱动学习

需求驱动方法确实强调三种主要的需求类型&#xff0c;它们对软件系统的设计和开发至关重要。下面是对这三种需求的详细解释&#xff1a; 1. 功能性需求&#xff08;Functional Requirements&#xff09; 功能性需求描述的是系统必须具备的功能和行为。它回答了系统“应该做什…

低代码可视化-uniapp开关选择组件-低码生成器

开关&#xff08;Switch&#xff09;选择组件是一种用户界面元素&#xff0c;允许用户在两种状态&#xff08;通常是开/关、是/否、启用/禁用等&#xff09;之间进行切换。这种组件在移动应用、桌面软件、网页以及物联网设备中广泛应用。以下是对开关Switch选择组件的详细介绍&…

arkUI:水果选择与管理:基于 ArkUI 的长按编辑功能实现

水果选择与管理&#xff1a;基于 ArkUI 的长按编辑功能实现 1 主要内容说明2 相关内容2.1 相关内容2.1.1 源码1内容的相关说明2.1.1.1 数据结构与状态管理2.1.1.2 添加水果功能2.1.1.3 水果列表展示2.1.1.4 长按进入编辑模式2.1.1.5 复选框的多选功能2.1.1.6 删除水果功能2.1.1…