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时没有分组,取出来的是所有项目最高分,不符合题意,排除