1.SQL中,下列涉及空值的操作,不正确的是?
A.name IS NULL
B.name= NULL
C.namee IS NoT NULL
D.NoT(name IS NULL)
答案:B
解析:在SQL中,NULL是一种特有的数据类型,其等价于没有任何值、是未知数。NULL与0、空字符串、空格都不同。SQL默认情况下对WHERE XX!=NULL和WHERE XX=NULL的判断会永远返回0行,却不会提示语法错误。
2.在满足实体完整性约束的条件下
A.一个关系中应该有一个或多个候选关键字
B.一个关系中只能有一个候选关键字
C.一个关系中必须有多关键字个候选
D.一个关系中可以没有候选关键字
答案:A
解析:数据库完整性分为实体完整性、域完整性和参照完整性。实体完整性要求表中的主键字段不能为空且不能重复;域完整性要求表中数据都在有效范围内;参照完整性保证了相关联的表的数据一致性。约束是保证表中数据完整性和一致性的手段,分为主键约束、外键约束、检查约束、唯一约束、非空约束五种。不管哪种约束,体现在表中都可以有1列或多列
3.下列选项中,不属于SQL约束的是
A.UNIQUE
B.PRIMARY KEY
C.FOREIGN KEY
D.BETWEEN
答案:C
解析:between不属于约束,它是用于where条件后的比较操作符,FOREIGN KEY(外键)在数据库中的使用主要是为了在两个或多个表之间建立关联,确保数据的一致性和完整性
4.SQL 查询语句中 WHERE 、 GROUP BY 、 HAVING 这些关键字区别和用法总结错误的是
A.HAVING在查询语句中必须依赖于GROUP BY
B.WHERE子句用来限制SELECT语句从表中指定选取的行
C.GROUP BY子句用来分组WHERE子句的输出结果集
D.HAVING子句用来从分组的结果中筛选列
答案:D
解析:HAVING是从分组结果中筛选数据的(行),而不是筛选列的
5.某查询语句运行后返回的结果集为:
1班 72
2班 75
3班 NULL
则有可能的查询语句是以下:
A.SELECT class, AVG(score) FROM test WHERE class<4
B.SELECT class, AVG(score) FROM test WHERE class<4 GROUP BY class
C.SELECT class, AVG(score) FROM test WHERE class<4 GROUP BY ALL class
D.SELECT class, AVG(score) FROM test GROUP BY class HAVING class<4
答案:B D
解析:按照题目和答案中相同的部分可以知道,class字段是一个字符串,score字段是一个数值型,查询字段有class,和一个聚合函数score字段的平均值,表达的意思是,查询班级信息,以及该班级的所有分数的平均值。所以需要group by语句。
再来看答案:A没用group by,错误。
B先过滤,按照字符串比较(自然序列比较)之后的数据集,再进行分组。
C中的ALL使用错误。
D是先分组后再按照字符串比较并过滤。
以上AC语法错误,B和D都可以查询出class字段比4小的,不同只是B是先过滤再分组,D是先分组再过滤
6.有订单表orders,包含字段用户信息userid,字段产品信息productid,查询至少被订购过两回的productid。
A.select productid from orders where count(productid)>1
B.select productid from orders where max(productid)>1
C.select productid from orders where having count(productid)>1 group by productid
D.select productid from orders group by productid having count(productid)>1
答案:D
解析:A不行,因为productid为字段产品信息count不能直接计算
至少被订购过两次,说明同一个productid的产品,至少有两条数据,可以先按照productid分组,这样结果就是同一个产品的数据,再分组后过滤数据大于1行的,使用group by...having操作,进行分组后过滤
7.有一张员工表emp,字段:姓名name,性别sex,部门depart,工资salary。查询以下数据:
1、查询男女员工的平均工资
2、查询各部门的总薪水
3、查询总薪水排名第二的部门
4、查询姓名重复的员工信息
5、查询各部门薪水大于10000的男性员工的平均薪水
答案:select sex,avg(salary) from emp group by sex;
说明:平均值使用聚合函数avg,并且按照性别男女分组,group by 性别字段
select depart,sum(salary) from emp group by depart;
说明:总薪水使用聚合函数sum取薪水字段求和,并且按照部门字段分组,group by 部门字段
select depart,sum(salary) from emp group by depart order by sum(salary) desc limit 1,1;
说明:order by语句先按照总薪水排序,之后取第二条数据,可以使用分页,每一页1条数据,第二页就是该结果
select name from emp group by name having count(name)>1;
说明:名字重复,说明同一个名字有多条数据,可以先按照名字分组,分组之后再过滤行数大于1的,就表示同一个名字至少有2条记录,重复了
select depart,avg(salary) from emp where salary>10000 and sex='男' group by depart;
说明:这里需要注意题目要求是查询薪水大于10000的男性员工,这个是在按部门分组前就过滤,在过滤后的结果集中再查询各个部门的平均薪水