1. 若要“查询选修了3门以上课程的学生的学号”,则正确的SQL语句是( )
A SELECT Sno FROM SC GROUP BY Sno WHERE COUNT(*)> 3
B SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)> 3
C SELECT Sno FROM SC ORDER BY Sno WHERE COUNT(*)> 3
D SELECT Sno FROM SC ORDER BY Sno HAVING COUNT(*)> 3
正确答案:B
解析:
执行顺序 where->groupby->聚合->having,where无论如何不能拿到聚合
2. 学生、课程、学生与课程之间的多对多联系,三个模式如下:
学生(学号,姓名,性别,专业号)
课程(课程号,课程名,学分)
选修(学号,课程号,成绩)
下列选项对于上述模式的参照完整性叙述不正确的是()
A “选修”关系中的“学号”是一个外键,引用了“学生”中的“学号”
B “选修”关系中的“课程号”是一个外键,引用了“课程”中的“课程号”
C “学号”、“课程号”分别为“学生”、“课程“关系中的主键
D “学生”关系中的属性“学号”可以唯一标识一个元组,但不可以唯一标识学生实体
正确答案:D
解析:
现实中实体是可区分的,即它们具有唯一标识性,关系模型中以主键来唯一标识元组,即可以唯一标识学生实体
3. 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' , '女');
('1006' , '李四' , '2001-12-02' , '女');
查询男生女生存在的相同姓名,比如'张三' ,正确的是()?
A
select distinct t1.name from
(select * from student_table where sex = '女')t1
inner join
(select * from student_table where sex = '男') t2
on t1.name = t2.name ;
B
select distinct t1.name from
(select * from student_table where sex = '女')t1
left join
(select * from student_table where sex = '男') t2
on t1.name = t2.name ;
C
select distinct t1.name from
(select * from student_table where sex = '女')t1
full join
(select * from student_table where sex = '男') t2
on t1.name = t2.name ;
D
select distinct t1.name from
(select * from student_table where sex = '女')t1
right join
(select * from student_table where sex = '男') t2
on t1.name = t2.name ;
正确答案:A
解析:
B会把'李四'也查询出来,此时是以t1为主表;
C执行报错,Mysql当前不支持full join;
D结果含有NULL,主表是t2存在NULL,左表t1对应字段值只能是NULL;
所以A正确,用inner join关联是最正确的。
4.Mysql中表student_info(id,name,birth,sex),字段类型都是varchar,插入:1018 , 赵六 , 2003-08-02 , 男;
SQL正确的是()?
A insert overwrite student_info values('1018' , '赵六' , '2003-08-02' , '男');
B insert into student_info values(1018 , '赵六' , '2003-08-02' , '男');
C insert into student_info(`birth`,`id`,name,`sex`) values('2003-08-02' ,'1018' , '赵六' , '男');
D insert into student_info value('1018' , '赵六' , '2003-08-02' , '男');
正确答案:C
解析:
A执行报错,插入时是insert into不是insert overwrite;
B执行报错,id是varchar类型,插入的1018需要加上单引号;
D执行报错,插入时是values不是value;
所以C正确,字段名顺序与字段值顺序一致即可,可以给部分或所有字段名加``。
5.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.
查询结果如下图:
6. 下列哪个语句是授予用户SQLTest对数据库Sales的CUSTOMERS表的列cid、cname的查询权限()
A grant select on cid,cname to SQLTest
B grant select on cid,cname with SQLTest
C grant select on CUSTOMERS(cid,cname) to SQLTest
D grant select on CUSTOMERS(cid,cname) with SQLTest
正确答案:C
解析:
授权查询的语句是grant...to,因此答案B、D不正确。因为是对CUSTOMERS表的列cid、cname授权,而答案A并没有指定具体的表,因此A不正确。答案选择C
7. 某软件公司正在升级一套水务管理系统。该系统用于县市级供排水企业、供水厂、排水厂中水务数据的管理工作。系统经重新整合后,开发人员决定不再使用一张备份数据表waterinfo001表,需永久删除。选出符合要求的语句。
A DELETE TABLE waterinfo001
B DELETE FROM TABLE waterinfo001
C DROP TABLE waterinfo001
D DROP FROM TABLE waterinfo001
正确答案:C
解析:
1. drop是完全删除表,包括表结构
2. delete是删除表数据,保留表的结构,而且可以加where,只删除一行或者多行
3. truncate 只能删除表数据,会保留表结构,而且不能加where
8. Mysql中表student_table(id,name,birth,sex),插入如下记录:
('1003' , NULL , '2002-05-20' , '男');
('1004' , '张三' , '2000-09-06' , '男');
('1005' , '李四' , '2001-12-01' , '女');
('1006' , NULL , '2001-12-02' , '女');
修改name字段为NULL的记录,是男生时设置name='男生姓名',是女生时设置name='女生姓名',如下SQL正确的是()?
A update student_table set name = ( case when sex = '男' then '男生姓名' when sex = '女' then '女生姓名' end) if name is null ;
B update student_table when name is null set name = ( case when sex = '男' then '男生姓名' when sex = '女' then '女生姓名')
C update student_table set name = ( when sex = '男' then '男生姓名' when sex = '女' then '女生姓名') where name is null ;
D update student_table set name = ( case when sex = '男' then '男生姓名' when sex = '女' then '女生姓名' end) where name is null ;
正确答案:D
解析:
【修改name字段为NULL的记录】需要把where条件写在最后;
case when的正确语法是: case when ... then ... when ... then ... else ... end,case和end不能缺少!
所以D正确!
9. 下面哪一个是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
解析:
正确的执行顺序应该是
-
先找到要查询表格或连接要查询的表格,因此FROM才是第一步;
-
接下来是进行条件筛选,所以是WHERE紧随其后;
-
然后如果遇到表格有分组的需要,则需要先GROUP BY;
-
分组时如果也存在筛选条件,这里就要用HAVING进行分组筛选;
-
这些执行过后才是查询操作SELECT;
-
SELECT的时候如果遇到重复数据,就需要去重,即使用DISTINCT;
-
接下来如果要对查询后的数据进行排序,会用到ORDER BY;
-
最后如果要指定返回的查询数据范围、条数则要用LIMIT/OFFSET函数。
综上,只有C选项是正确的,ABD都是错误的执行顺序。
10. 有两张表,如下图所示
表A(仅列出部分数据作参考)
Order_id User_id Add_time
11701245001 10000 1498882474
11701245002 10001 1498882475
表B:(仅列出部分数据作参考)
id Order_id goods_id price
1 11701245001 1001 10
2 11701245001 1002 20
3 11701245002 1001 10
问:用SQL查询 购买过goods_id 为1001的用户user_id()
A select user_id from A where order_id = (select order_id from B where goods_id = '1001')
B select a.user_id from A a,B b where a.order_id=b.order_id and b.goods_id='1001'
C select user_id from A where order_id in (select order_id from B where goods_id = '1001')
D Select A.user_id from A left join B on A.order_id=B.order_id where B.goods_id='1001'
正确答案:BCD
解析:
A和C的思路一样,不过A用等于的前提是结果只能有一个结果,如果有多个结果将出错,所以A排除,C正确;
B是多表联合查询,D用join联合查询,均正确