牛客网刷题笔记-sql-2023.3.28

SQL语言主要分为数据查询语言DQL、数据操纵语言DML、数据定义语言DDL和数据控制语言DCL。DQL用于查询,如SELECT语句;DML涉及插入、更新和删除操作;DDL用于创建数据库对象,如表、视图;DCL处理权限和事务管理。文章还讨论了视图的使用限制,插入数据的规则,以及MySQL中的特定查询和操作示例。
摘要由CSDN通过智能技术生成

SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。

  1. 数据查询语言DQL
    数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:SELECT <字段名表>FROM <表或视图名>WHERE <查询条件>
    2 .数据操纵语言DML
    数据操纵语言DML主要有三种形式:
  1. 插入:INSERT
  2. 更新:UPDATE
  3. 删除:DELETE
  1. 数据定义语言DDL
    数据定义语言DDL用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等如:CREATE TABLE / VIEW / INDEX / SYN / CLUSTER| 表 视图 索引 同义词 簇。DDL操作是隐性提交的!不能rollback
  2. 数据控制语言DCL
    数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
  1. GRANT:授权。
  2. ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。回滚—ROLLBACK回滚命令使数据库状态回到上次最后提交的状态。其格式为:SQL>ROLLBACK;
  3. COMMIT [WORK]:提交。在数据库的插入、删除和修改操作时,只有当事务在提交到数据库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看到所做的事情,别人只有在最后提交完成后才可以看到

在使用insert语句插入数据时,表达式的数据类型和表格中对应各列的数据类型必须一一对应

QL的执行顺序是:FROM–WHERE–GROUP BY–HAVING–SELECT–ORDER BY

下列选项中的锁模式,可以用于数据修改操作,确保不会同时对同一资源进行多重更新的是()
A
共享锁//用于不更改或不更新数据的读取操作,如SELECT语句
B
更新锁//用于可更新的资源中,防止当多个会话在读取、锁定以及随后可能进行的资源更换时发生常见形式的死锁;
C
排他锁//用于数据修改操作,确保不会同时对同一资源进行多重更新
D
架构锁//在执行依赖于表架构的操作时使用

正确答案:C

下列命令中,可以删除视图的是()
A
DELETE//可用于删除表中的行数据
B
DROP//删除视图
C
CLOSE//关闭游标
D
REVOKE//用于收回语句或对象许可
正确答案:B

下列操作在视图上无法完成的是?
A
视图数据查询
B
更新视图数据
C
在视图中定义新的基本表
D
在视图中定义新视图
正确答案:C
你的答案:B
官方解析:
由题意得,在视图中可以进行基本的增删改查故AB排除
,在视图中也可以定义新的视图,却无法创建表,因为视图是个虚表,故C错误

Mysql中表student_table(id,name,birth,sex),插入如下记录:
(‘1001’ , ‘’ , ‘2000-01-01’ , ‘男’);
(‘1004’ , ‘张三’ , ‘2000-08-06’ , ‘男’);
(‘1005’ , NULL , ‘2001-12-01’ , ‘女’);
(‘1006’ , ‘张三’ , ‘2001-12-02’ , ‘女’);
执行
 select t1.name from 
 (select * from student_table where sex = ‘女’)t1 
 left join 
 (select * from student_table where sex = ‘男’)t2 
 on t1.name = t2.name;
的结果行数是()?
A
4
B
3
C
2
D
1
正确答案:C
官方解析:左表t1只有2条记录,并且包含左表的NULL记录,所以结果是2行。
(‘1005’ , NULL , ‘2001-12-01’ , ‘女’,NULL,NULL,NULL);
(‘1006’ , ‘张三’ , ‘2001-12-02’ , ‘女’,‘1004’,‘2000-08-06’ , ‘男’);

积分result表中有A B C D四列,要求:
1)当A列值大于等于B列时,选择A列否则选择B列
2)当C列值大于等于D列时,选择C列否则选择D列
用SQL语句实现正确的是:(      )
A
select ( when A >=B then A else B ) MAX_AB, ( when C>=D then C else D ) MAX_CD from result
B
select (case when A>=B then A else B ) MAX_AB, (case when C>=D then C else D ) MAX_CD from result
C
select (case when A>=B then A else B end) MAX_AB, (case when C>=D then C else D end) MAX_CD from result
D
select case when A>=B then A else B end MAX_AB, case when C>=D then C else D end MAX_CD from result
正确答案:C

Mysql中表student_table(id,name,birth,sex),插入如下记录:
(‘1001’ , ’ ’ , ‘2000-01-01’ , ‘男’);
(‘1002’ , null , ‘2000-12-21’ , ‘男’);
(‘1003’ , NULL , ‘2000-05-20’ , ‘男’);
(‘1004’ , ‘张三’ , ‘2000-08-06’ , ‘男’);
(‘1005’ , ‘李四’ , ‘2001-12-01’ , ‘女’);
执行 select count(name) from student_table 的结果是()?
A
5
B
4
C
3
D
2
正确答案:C
你的答案:B
官方解析:
count(name) 时不包括null值,所以结果是3;
插入时null与NULL的意思一样都是NULL。

Mysql中表student_table(id,name,birth,sex),插入如下记录:
(‘1003’ , ‘’ , ‘2000-01-01’ , ‘男’);
(‘1004’ , ‘张三’ , ‘2000-08-06’ , ‘男’);
(‘1005’ , NULL , ‘2001-12-01’ , ‘女’);
(‘1006’ , ‘张三’ , ‘2000-08-06’ , ‘女’);
(‘1007’ , ‘王五’ , ‘2001-12-01’ , ‘男’);
(‘1008’ , ‘李四’ , NULL, ‘女’);
(‘1009’ , ‘李四’ , NULL, ‘男’);
(‘1010’ , ‘李四’ , ‘2001-12-01’, ‘女’);
执行
select t1.,t2.
from (
select * from student_table where sex = ‘男’ ) t1 
inner  join 
(select * from student_table where sex = ‘女’)t2 
on t1.birth = t2.birth and t1.name = t2.name ; 
的结果行数是()?
A
4
B
3
C
2
D
1
正确答案:D
官方解析:
题目中【inner join … on t1.birth = t2.birth and t1.name = t2.name ; 】inner join意思是左右表中的birth、name都不为NULL时才会匹配上,结果中不含有一个字段为NULL或两个字段都为NULL的记录,结果只有‘张三’一条记录。所以选D.
查询结果如下图:

已知员工表如下图所示,员工编号依次递增,现需改变相邻员工的编号,当员工总人数为奇数是,不需要改变最后一个员工的编号。下列SQL语句不正确的是()
表employee:
±----±----------+
| eno | ename |
±----±----------+
| 1 | 小李 |
| 2 | 小王 |
| 3 | 小刚 |
| 4 | 小虎 |
±—±-----------+

A
SELECT
ROW_NUMBER() OVER(ORDER BY(eno+1-2POWER(0,eno%2))) AS eno,ename
FROM employee
B
SELECT
ROW_NUMBER() OVER(ORDER BY(eno-1+2
MOD(0,eno%2))) AS eno,ename
FROM employee
C
SELECT
IF(eno%2=0,eno-1,
IF(eno=(SELECT COUNT(DISTINCT eno) FROM employee),eno,eno+1))
AS eno,ename
FROM employee
ORDER BY eno
D
SELECT
IF(eno%2=0,eno+1,
IF(eno=(SELECT COUNT(DISTINCT eno) FROM employee),eno,eno-1))
AS eno,ename
FROM employee
ORDER BY eno
正确答案:C
你的答案:未作答
官方解析:
D选项,运行后所得结果错误,若eno为偶数,应减1而非加1;若eno为奇数,且不为最后一个,应加1而非减1。

下面哪一个是MySQL查询语句的正确执行顺序:
A
SELECT —> FROM(including JOINs) —> WHERE —> GROUP BY —> HAVING —> DISTINCT —> ORDER BY —> LIMIT/OFFSET
B
SELECT —> DISTINCT —> FROM(including JOINs) —> WHERE —> GROUP BY —> HAVING —> ORDER BY —> LIMIT/OFFSET
C
FROM(including JOINs) —> WHERE —> GROUP BY —> HAVING —> SELECT —> DISTINCT —> ORDER BY —> LIMIT/OFFSET
D
FROM(including JOINs) —> WHERE —> GROUP BY —> HAVING —> DISTINCT —> SELECT —> ORDER BY —> LIMIT/OFFSET
正确答案:C
你的答案:B
官方解析:
本题考察知识点:MySQL查询语句的执行顺序
正确的执行顺序应该是
先找到要查询表格或连接要查询的表格,因此FROM才是第一步;
接下来是进行条件筛选,所以是WHERE紧随其后;
然后如果遇到表格有分组的需要,则需要先GROUP BY;
分组时如果也存在筛选条件,这里就要用HAVING进行分组筛选;
这些执行过后才是查询操作SELECT;
SELECT的时候如果遇到重复数据,就需要去重,即使用DISTINCT;
接下来如果要对查询后的数据进行排序,会用到ORDER BY;
最后如果要指定返回的查询数据范围、条数则要用LIMIT/OFFSET函数。
综上,只有C选项是正确的,ABD都是错误的执行顺序。

某高校采取电子化考试,便于查询学生对应考场号创建视图,已知student表(学号sid,姓名sname,考号s_test_id),room表(考场号rid,座位号rseat,考号s_test_id),下列语句错误的是()
A
CREATE VIEW view_room (sname,s_test_id,rid,rseat) AS
SELECT student.sname, student.s_test_id, room.rid, room.rseat
FROM student,room WHERE student.s_test_id=room.s_test_id;
B
CREATE ALGORITHM={TEMPTABLE} VIEW view_room AS
SELECT student.sname, student.s_test_id, room.rid, room.rseat
FROM student,room WHERE student.s_test_id=room.s_test_id;
C
CREATE VIEW view_room AS
SELECT student.sname, student.s_test_id, room.rid, room.rseat
FROM student,room WHERE student.s_test_id=room.s_test_id;
D
CREATE VIEW view_room AS (rid,rseat,sname,s_test_id)
SELECT student.sname, student.s_test_id, room.rid, room.rseat
FROM student,room WHERE student.s_test_id=room.s_test_id;
正确答案:D
你的答案:B
官方解析:
所有选项都是在多表上建立视图,AD选项在视图中重命名了选取列的列名,但是D选项的列名与选取列内容不一致,后续对于视图的操作很容易引起歧义,且指定列名和AS颠倒了位置,错误;B选项增加了将视图存入临时表的操作,然后用临时表来执行语句;C选项未重命名,但是并不影响。

下列子句中不可以与聚合函数一起使用的是()
A
GROUP BY
B
COMPUTE BY
C
HAVING
D
WHERE
正确答案:D
你的答案:B
官方解析:
WHERE子句的作用对象只是行,用来过滤数据作为条件使用。

某打车公司要将驾驶里程(drivedistanced)超过5000里的司机信息转存到一张称为seniordrivers 的表中,他们的详细情况被记录在表drivers 中,正确的sql语句为()
A
insert into seniordrivers where drivedistanced>=5000 from drivers
B
insert into seniordrivers(drivedistanced) values from drivers where drivedistanced>=5000
C
insert into seniordrivers(drivedistanced) where values>=5000 from drivers
D
select * into seniordrivers from drivers where drivedistanced >=5000
正确答案:D
你的答案:B
官方解析:
INSERT INTO 语句用于向一张表中插入新的行。
SELECT INTO 语句从一张表中选取数据插入到另一张表中。常用于创建表的备份复件或者用于对记录进行存档。

有一张学生成绩表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
正确答案:D
你的答案:C
官方解析:原本数据是一个人多行数据,每行一个成绩,现在要行转列,因此需要按学号分组,组内将数据拆成列

批处理是指包含一条或多条T-SQL语句的语句组,下列选项中,关于批处理的规则描述正确的是()
A
定义一个check约束后,可以在同一个批处理中使用
B
修改一个表中的字段名后,不可以在同一个批处理中引用这个新字段
C
Create default,Create rule等语句同一个批处理中可以同时提交多个
D
把规则和默认值绑定到表字段或自定义字段上之后,可以在同一个批处理中使用
正确答案:B
官方解析:
A选项,不能定义一个check约束后,立即在同一个批处理中使用;C选项,Create default,Create rule,Create trigger,Create procedure,Create view等语句同一个批处理中只能提交一个;D选项,不能把规则和默认值绑定到表字段或自定义字段上之后,立即在同一个批处理中使用。

使用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
正确答案:AB
官方解析:
注意MySQL的存储过程和sql server写法不一样。
由题目知道student表中的数据列名为Stu_ID,因此排除C;
变量名定义为s_no,因此排除D;
A和B的差异在于定义s_no时是否有AS,在MySQL中AS是可省略的,因此AB均正确

在SQL中语法规范中,having子句的使用下面描述正确的是:(       )
A
having子句即可包含聚合函数作用的字段也可包括普通的标量字段
B
使用having的同时不能使用where子句
C
having子句必须于group by 子句同时使用,不能单独使用
D
使用having子句的作用是限定分组条件
E
Having子句和where子句是等同的
F
如果select语句中没有聚合函数的使用,就不能使用having子句
正确答案:AC

having是在分组后过滤,where在分组前过滤,不冲突,可以同时使用,BE错;
having是用来过滤的,group by是限定分组,D错;
select语句中没有聚合函数的使用时也可以用having,F错

表结构如下:
1
2
3
4
5
6
7 CREATE TABLE score (
   id int(11) NOT NULL AUTO_INCREMENT,
   sno int(11) NOT NULL,
   cno tinyint(4) NOT NULL,
   score tinyint(4) DEFAULT NULL,
   PRIMARY KEY (id)
 ) ;
以下查询语句结果一定相等的是()
A.SELECT sum(score) / count(*) FROM score WHERE cno = 2;

B.SELECT sum(score) / count(id) FROM score WHERE cno = 2;

C.SELECT sum(score) / count(sno) FROM score WHERE cno = 2;

D.SELECT sum(score) / count(score) FROM score WHERE cno = 2;d

E.SELECT sum(score) / count(1) FROM score WHERE cno = 2;

F.SELECT avg(score) FROM score WHERE cno = 2; f
A
A,E,F
B
A,D,F
C
A,B,C,D
D
D,F
E
A,B,E,F
F
A,B,C,E
正确答案:DF
官方解析:

  1. count(*)包括了所有列,相当于行数,在统计结果的时候,不会忽略某些列值为NULL的行。
  2. count(1)用1代表代码行,忽略所有列的值,在统计结果的时候,统计所有行,效果同count(*)。
  3. count(列名)只包括列名对应一列,在统计结果的时候,会忽略列值为空的行。 
    本题中只有score列可能为空,其他列均设置了NOT NULL,因此只有count(score)和avg(score)会忽略score为空的列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值