练题第二天: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错
#每日一练#