数据库约束练习(1)

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的男性员工,这个是在按部门分组前就过滤,在过滤后的结果集中再查询各个部门的平均薪水

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值