软件开发----SQL基础每日刷题(转载于牛客)

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

       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' , '男');

       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

       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

       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 ;

       update student_table when name is null set name = ( case when sex = '男' then '男生姓名' when sex = '女' then '女生姓名')

       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查询语句的正确执行顺序:

       SELECT ---> FROM(including JOINs) ---> WHERE ---> GROUP BY ---> HAVING ---> DISTINCT ---> ORDER BY ---> LIMIT/OFFSET

       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联合查询,均正确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值