下列选项中关于数据库事务的特性描述正确的是()
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
答案解析:
-
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 BY
、ORDER BY
或窗口范围,窗口大小默认为整个查询结果集。 -
常与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