练题第二天:SQL

1.SQL查询中使用WHere子句指出的是

A 查询目标

B 查询结果

C 查询视图

D 查询条件

解析

where后接的是用来筛选结果的查询条件

SELECT field1, field2,...fieldN FROM table_name1, table_name2...

[WHERE condition1 [AND [OR]] condition2.....

查询语句中你可以使用一个或者多个表,表之间使用逗号, 分割,并使用WHERE语句来设定查询条件。

你可以在 WHERE 子句中指定任何条件。

你可以使用 AND 或者 OR 指定一个或多个条件。

WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。

WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。

2.需查看stu表中索引的索引信息时,应使用的存储过程是()

A sp_helpindex

B sp_help

C sp_helpdb

D sp_helptext

sp_helpindex:查看表中的索引信息,index是表示返回指定的行与列交叉处的单元格引用

sp_help:查看有关数据库对象的摘要信息,

sp_helpdb:查看指定数据库或全部数据库信息,

sp_helptext:查看存储过程、视图、触发器等文本信息

索引优化中,我们常常用到sp_helpindex 帮我们查看一个表的索引情况

3.已知数据表STU,现需创建视图view_s,显示所有男同学的信息。下列SQL语句正确的是()

A CREATE VIEW AS SELECT * FROM STU

B CREATE VIEW view_s AS SELECT * FROM STU WHERE 性别='男'

C CREATE view_s SELECT * FROM STU WHERE 性别='男'

D CREATE view_s AS SELECT * FROM STU

解析

ACD选项,语法错误,且AD缺少题中的限定条件。

正确的创建视图的语法为CREATE VIEW view_name[column] AS select_statement [WITH CHECK OPTION]

解题思路,先查询性别为男性的所有数据,然后在创建视图将符合条件的数据放入视图中。

创建视图语句:

create view 视图名 as select * from 表名 where 条件

create views view_s as select * from STU where sex=“男”;

5.下列选项中关于数据库事务的特性描述正确的是()

A 事务允许继续分割 (不可继续分割)

B 多个事务在执行事务前后对同一个数据读取的结果是不同的(一致性:数据与读取结果保持一致)

C 一个事务对数据库中数据的改变是暂时的(持久性)

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

解析

此题考查数据库事务的原子性、一致性、隔离性和持久性。A选项,事务是最小的执行单位,不允许分割;B选项,执行事务前后,数据保持一致,对同一数据读取的结果相同;C选项,一个事务被提交后对数据库中数据的改变是持久的。

事务隔离性存在隔离级别。

理论存在4个级别。读未提交读已提交可重复读序列化(串行化)

读未提交:会导致脏读、不可重复读取、幻读问题。脏读(即一个事务读取了另一个事务未提交的数据)。不可重复读(一个事务还未提交,读取了另一个事务使用update和delete语句后,提交的数据,产生了不同的结果集。幻读(同一个查询还未提交。读取了另一个事务使用insert语句后。且提交后。产生了不同的结果集。

读已提交:会导致 不可重复读和幻读问题。解决了脏读。

可重复读取:解决了上述,三个问题不加锁。msyql innodb(默认第三种隔离级别)

序列化:也解决了上述,三个问题。但是使用了锁的方式。

一旦事务提交。就不可以回滚。所以c 错误。

隔离级别的存在。就是为了保证。在当前事务操作的时候数据库中的数据,数据一致的问题。D对。

事务的特点(ACID):

A 原子性:一个事务是不可再分割的整体,要么都执行要么都不执行

C 一致性:一个事务可以使数据从一个一致状态切换到另外一个一致的状态

B 隔离性:一个事务不受其他事务的干扰,多个事务互相隔离的

(并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的)

D 持久性:一个事务一旦提交了,则永久的持久化到本地

6.Mysql中表student_table(id,name,birth,sex),插入如下记录:

('1004' , '张三' ,'2000-08-06' , '男');

('1009' , '李四', '2000-01-01', '男');

('1010' , '李四', '2001-01-01', '男');

('1006' , '王五', '2000-08-06' , '女');

('1008' , '张三', '2002-12-01', '女');

('1012' , '张三', '2001-12-01', '女');

('1011' , '李四', '2002-08-06' , '女');

执行

select t1.*,t2.*

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 5

解析

on中相同的key匹配上时会产生笛卡尔积!1*2+2*1=4。查询结果如下:

就是相同名字的男生与相同名字的女生连接一个张三男对应两个张三女,是两行,两个李四男对应一个李四女,也是两行,一共四行

4.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 count(t2.birth) as c1

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 1

B 2

C 3

D 4

解析

题目中【inner join ... on t1.birth = t2.birth and t1.name = t2.name ; 】inner join意思是左右表中的birth、name都不为NULL时才会匹配上,结果中不含有一个字段为NULL或两个字段都为NULL的记录,结果只有'张三'一条记录。所以选A.

张三的查询记录不是有两条吗?为啥只有一条记录?

两个表会产生笛卡尔积,两个表连接成一个表。

count()函数有两种使用方式:

使用count(*)对表中行的数目进行计数,不管表列中包含的是空值(null)还是非空值;

使用count(column)对特定列中具有值得行进行计数,忽略null值。(摘自SQL必知必会)

7.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

解析

题目中【inner join ... on t1.birth = t2.birth and t1.name = t2.name ; 】inner join意思是左右表中的birth、name都不为NULL时才会匹配上,结果中不含有一个字段为NULL或两个字段都为NULL的记录,结果只有‘张三’一条记录。所以选D.

查询结果如下图:

MYSQL中,NULL值与任何值值比较永不为真

NULL不能用来直接比较,在生日和名字都相等的前提下只有04和06一条记录

8.使用SQL语句建个存储过程proc_stu,然后以student表中的学号Stu_ID为输入参数@s_no,返回学生个人的指定信息。下面创建存储过程语句正确的是:(    AB

解析

注意MySQL的存储过程和sql server写法不一样。

由题目知道student表中的数据列名为Stu_ID

变量名定义为s_no

A和B的差异在于定义s_no时是否有AS,在MySQL中AS是可省略的,因此AB均正确

9.在SQL中语法规范中,having子句的使用下面描述正确的是:( )

A having子句即可包含聚合函数作用的字段也可包括普通的标量字段

B 使用having的同时不能使用where子句

C having子句必须于group by 子句同时使用,不能单独使用

D 使用having子句的作用是限定分组条件

E Having子句和where子句是等同的

F 如果select语句中没有聚合函数的使用,就不能使用having子句

解析

having是在分组后过滤,where在分组前过滤,不冲突,可以同时使用,BE错;

having是用来过滤的,group by是限定分组,D错;

select语句中没有聚合函数的使用时也可以用having,F错

#每日一练#
全部评论

相关推荐

最近又搬回宿舍了,在工位坐不住,写一写秋招起伏不断的心态变化,也算对自己心态的一些思考表演式学习从开始为实习准备的时候就特别焦虑,楼主一开始选择的是cpp后端,但是24届这个方向已经炸了,同时自己又因为本科非92且非科班,所以感到机会更加迷茫。在某天晚上用java写出hello world并失眠一整晚后选择老本行干嵌入式。理想是美好的,现实情况是每天忙但又没有实质性进展,总是在配环境,调工具,顺带还要推科研。而这时候才发现自己一直在表演式学习,徘徊在设想如何展开工作的循环里,导致没有实质性进展。现在看来当时如果把精力专注在动手写而不是两只手端着看教程,基本功或许不会那么差。实习的焦虑5月,楼主...
耶比:哲学上有一个问题,玛丽的房间:玛丽知道眼睛识别色彩的原理知道各种颜色,但是她生活在黑白的房间里,直到有一天玛丽的房门打开了她亲眼看到了颜色,才知道什么是色彩。我现在最大可能的减少对非工作事情的思考,如果有一件事困扰了我, 能解决的我就直接做(去哪里或者和谁吵架等等……),解决不了的我就不想了,每一天都是最年轻的一天,珍惜今天吧
投递比亚迪等公司10个岗位 > 秋招被确诊为…… 牛客创作赏金赛
点赞 评论 收藏
分享
投票
我要狠拿offer:如果不是必须去成都绝对选九院呀,九院在四川top1研究所了吧
点赞 评论 收藏
分享
评论
1
7
分享
牛客网
牛客企业服务