每日更新SQL练习题之第一天

练习题(1)


SELECT product_name,sale_price
FROM PRODUCT AS P
WHERE EXISTS (SELECT * FROM SHOPPRODUCT AS SP
WHERE SP.shop_id =00C’ AND SP.product_id = P.product_id);

其中PRODUCT表示商品表,SHOPPRODUCT指商店在售商品表,其中shop_id字段表示商店id,product_id表示产品id。
以上这段sql主要是完成了哪个操作?

答案:选出了‘00C’商店目前在售的商品价格
product_id将PRODUCT和SHOPPRODUCT进行关联,然后展示在特定店铺即等于‘00C’的商店中,在售的商品的价格

2.比赛结果result表内容如下:
Date Win
2017-07-12 胜
2017-07-12 负
2017-07-15 胜
2017-07-15 负

显示下面的样子,请写出SQL语句
比赛日期 胜 负
2017-07-12 1 1
2017-07-15 1 1

select Date As 比赛日期, SUM(case when Win='胜' then 1 else 0 end), SUM(case when Win='负' then 1 else 0 end) 负 from result group by Date

3.某高校采取电子化考试,便于查询学生对应考场号创建视图,已知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;

所有选项都是在多表上建立视图,AD选项在视图中重命名了选取列的列名,但是D选项的列名与选取列内容不一致,后续对于视图的操作很容易引起歧义,且指定列名和AS颠倒了位置,错误;B选项增加了将视图存入临时表的操作,然后用临时表来执行语句;C选项未重命名,但是并不影响。

4.学生、书店和图书三个实体集之间的联系属于()
二元联系 多元联系 自反联系 一对一联系
答案:多元联系
参与联系的实体集个数大于2个时,为多元联系;A选项,二元联系指只有两个实体集参与的联系;C选项,自反联系描述了同一实体集内两部分实体之间的联系,是一种特殊的二元联系;D选项,是二元联系下的一种细分。

5.某IT公司人事管理采用专门的人事管理系统来实现。后台数据库名为LF。新来的人事部张经理新官上任,第一件事是要对公司的员工做全面的了解。可是他在访问员工信息表EMPL里的工资和奖金字段的时被拒绝,只能查看该表其他字段。作为LF的开发者你将如何解决这一问题:( )
A.废除张经理的数据库用户帐户对表EMPL里的工资列和奖金列的SELECT权限
B.添加张经理到db_datareader角色
C.添加张经理到db_accessadmin角色
D.授予张经理的数据库用户帐户对表EMPL里的工资列和奖金列的SELECT权限。

答案: A是废除,明显错误;
B C权限太大,没必要;
D是正确操作,给他相应字段查询权限即可
在这里插入图片描述6.下面哪一个是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

正确的执行顺序应该是
先找到要查询表格或连接要查询的表格,因此FROM才是第一步;
接下来是进行条件筛选,所以是WHERE紧随其后;
然后如果遇到表格有分组的需要,则需要先GROUP BY;
分组时如果也存在筛选条件,这里就要用HAVING进行分组筛选;
这些执行过后才是查询操作SELECT;
SELECT的时候如果遇到重复数据,就需要去重,即使用DISTINCT;
接下来如果要对查询后的数据进行排序,会用到ORDER BY;
最后如果要指定返回的查询数据范围、条数则要用LIMIT/OFFSET函数。
综上,只有C选项是正确的,ABD都是错误的执行顺序。
7.下列选项中不属于结构化查询语言的组成部分的是()
A.数据定义语言
B.数据处理语言
C.数据字典
D.数据库事务

SQL语言的组成部分有:数据定义语言、数据处理语言、数据控制语言、数据库事务。数据字典是关于数据库中数据的描述,是元数据,而不是数据本身。

8.已知职员表employee(eno,ename,gender,birthday,salary),现有一张E表,表结构与职员表一致,要求将E表中没有在职员表中出现的女职员添加到职员表中。下列SQL语句正确的是()
A.

INSERT INTO employee(eno,ename,gender,birthday,salary)
SELECT eno,ename,gender,birthday,salsry
FROM E
WHERE E.gender='女'

B.

INSERT INTO employee(eno,ename,gender,birthday,salary)
SELECT eno,ename,gender,birthday,salsry
FROM E
WHERE E.gender='女' and EXISTS(
SELECT * FROM employee
WHERE employee.eno=E.eno)

C.

INSERT INTO employee(eno,ename,gender,birthday,salary)
SELECT eno,ename,gender,birthday,salsry
FROM E
WHERE E.gender='女' and NOT IN employee

D.

INSERT INTO employee(eno,ename,gender,birthday,salary)
SELECT eno,ename,gender,birthday,salsry
FROM E
WHERE E.gender='女' and NOT EXISTS(
SELECT * FROM employee
WHERE employee.eno=E.eno)

A选项,缺少体现题干中“E表中没有在职员表中出现的女职员”的条件;B选项,语句的含义是“E表中在职员表中出现的女职员“,不符题意;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 * from student_table where length(name) >= 0 的结果行数是()?
1 2 3 4
结果是1001,1004,1005共3行;length无法对null做筛选!

10.大学生春季运动会的数据库,保存了比赛信息的三个表如下:
运动员 sporter(运动员编号 sporterid,姓名name,性别 sex,所属系号 department),
项目 item(项目编号 itemid,名称 itemname,比赛地点 location), 成绩 grade(运动员编号 id,项目编号 itemid,积分 mark)。
用SQL语句完成在“体育馆”进行比赛的各项目名称及其冠军的姓名,正确的是:( )。
A.

SELECT i.itemname,s.name FROM grade g,
  (SELECT itemid iid,MAX(mark) max  FROM grade   WHERE itemid IN ( SELECT itemid FROM item  WHERE location='体育馆') GROUP BY itemid) temp,item i,sporter s 
WHERE g.itemid=temp.iid AND g.mark=temp.max AND temp.iid=i.itemid AND s.sporterid=g.sporterid;

B.

SELECT i.itemname,s.name FROM grade g,
  (SELECT itemid iid,MIN(mark) max  FROM grade   WHERE itemid IN ( SELECT itemid FROM item  WHERE location='体育馆') GROUP BY itemid) temp,item i,sporter s 
WHERE g.itemid=temp.iid AND g.mark=temp.max AND temp.iid=i.itemid AND s.sporterid=g.sporterid;

C.

SELECT i.itemname,s.name FROM grade g,
  (SELECT itemid iid,MAX(mark) max  FROM grade   WHERE itemid IN ( SELECT itemid FROM item  WHERE location='体育馆') ) temp,item i,sporter s 
WHERE g.itemid=temp.iid AND g.mark=temp.max AND temp.iid=i.itemid AND s.sporterid=g.sporterid;

D.

SELECT i.itemname,s.name FROM grade g,
  (SELECT itemid iid,MIN(mark) max  FROM grade   WHERE itemid IN ( SELECT itemid FROM item  WHERE location='体育馆') GROUP BY itemid) temp,item i,sporter s 
WHERE g.itemid=temp.iid AND g.mark=temp.max AND

由题意,取出冠军,即同一项目编号的组内分数最高者,应取max;
B D中是取min,故排除B D;
C中取max时没有分组,取出来的是所有项目最高分,不符合题意,排除

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值