数据库实验三.pptx
数据库实验(三)查询语法 SQL语言提供了SELECT语句进行数据库的查询,该语句具有灵活的使用方式和丰富的功能。SELECT ALL|DISTINCT,FROM,WHERE GROUP BY HAVING GROUP BY ASC|DESC 根据WHERE子句给出的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组,再按SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。如果有GROUP BY子句,则将结果按的值进行分组,该属性列值相等的元组为一个组。如果GROUP BY 子句带HAVING短语,则只有满足指定条件的组才给予输出。如果有ORDER BY子句,则结果表还要按的值的升序或降序排序。SELECT语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。一、单表查询单表查询是指仅涉及一张表的查询。1、选择表中的若干列选择表中的全部列或部分列,这就是关系代数的投影运算。1)查询指定的列:在很多情况下,用户只对表中一部分属性列感兴趣,这时可以通过在SELECT子句的中指定要查询的属性列。【例4.8】查询所有配电物资的物资编号、物资名称、规格SELECT mat_num,mat_name,speciFROM stock;2)查询全部列 如果要查询表中的所有属性列,有两种方法:一是在目标列表达式中列出所有的列名;一是如果列的显示顺序与其在表中定义的顺序相同,则可以简单地在目标列表达式中写星号“*”。【例4.10】查询所有配电物资的记录SELECT*FROM stock等价于SELECT mat_num,mat_name,speci,warehouse,amount,unit,totalFROM stock3)查询经过计算的值 SELECT子句中的可以是表中存在的属性列,也可以是表达式、字符串常量或函数。【例4.11】查询所有抢修工程的抢修天数 调用datediff()日期函数返回结束日期与开始日期的时间间隔,得到抢修天数。SELECT prj_name,start_date,end_date,datediff(day,start_date,end_date)FROM salavaging【例4.12】查询所有抢修工程的抢修天数,并在实际抢修天数列前加入一个列,此列的每行数据均为抢修天数常量值 SELECT prj_name,抢修天数,datediff(day,start_date,end_date)FROM salvaging改变列标题的语法格式为:列名|表达式AS列标题或列标题=列名|表达式SELECT prj_name 项目名称,start_date 开始日期,end_date 结束日期,datediff(day,start_date,end_date)抢修天数FROM salvaging;2.选择表中的若干元组1)消除取值相同的行【例4.13】在配电物资库存记录表中查询出所有的仓库名称SELECT warehouseFROM stock等价于 SELECT ALL warehouseFROM stock结果可能出现重复行,要消除重复行,需用DISTINCT短语SELECT DISTINCT warehouseFROM stock2)查询满足条件的元组查询满足条件的元组是通过WHERE子句实现的(1)比较大小的查询【例4.14】查询供电局1#仓库存放的所有物资编号、物资名称、规格以及数量SELECT mat_num,mat_name,speci,amountFROM stockWHERE warehouse=供电局1#仓库【例4.15】查询所有单价小于80的物资名称、数量及其单价SELECT mat_name,amount,unitFROM stockWHERE unit=80;(2)确定范围的查询 BETWEEN.AND和NOT BETWEEN.AND是一个逻辑运算符,可以用来查找属性值在或不在指定范围内的元组,其中BETWEEN后边指定范围的下限(即低值),AND后边指定范围的上限(即高值)【例4.16】查询单价在50100之间的物资名称、数量及其单价SELECT mat_name,amount,unitFROM stockWHERE unit BETWEEN 50 AND 100等价SELECT mat_name,amount,unitFROM stockWHERE unit=50 AND unit=100【例4.17】查询单价不在50100之间的物资名称、数量及其单价SELECT mat_name,amount,unitFROM stockWHERE unit NOT BETWEEN 50 AND 100;等价SELECT mat_name,amount,unitFROM stockWHERE unit100(3)确定集合的查询IN 是一个逻辑运算符,可以用来查找属性值属于指定集合的元组【例4.18】查询存放在供电局1#仓库和供电局2#仓库的物资名称、规格及其数量SELECT mat_name,speci,amountFROM stockWHERE warehouse IN(供电局1#仓库,供电局2#仓库)等价SELECT mat_name,speci,amountFROM stockWHERE warehouse=供电局1#仓库OR warehouse=供电局2=仓库【例4.19】查询即没有存放在供电局1#仓库,也没有存放在供电局2#仓库的物资名称、规格及其数量SELECT mat_name,speci,amountFROM stockWHERE warehouse NOT IN(供电局1#仓库,供电局2#仓库)等价SELECT mat_name,speci,amountFROM stockWHERE warehouse!=供电局1#仓库OR warehouse!=供电局2#仓库(4)字符匹配查询LIKE 用于查找指定列名与匹配串常量匹配的元组。在实际应用中,如果需要从数据库中检索一批记录,但又不能给出精确的字符查询条件,这时就可以使用LIKE运算符和通配符来实现模糊查询。在LIKE运算符前边也可以使用NOT运算符,表示对结果取反。其一般格式如下:NOT LIKE ESCAPE,其中可以是一个完整的空符串,也可以含有通配符“%”和“_”。%代表任意长度(长度可以为0)的字符串_代表任意单个字符【例4.20】查询存放在供电局1#仓库的物资的详细情况SELECT*FROM stockWHERE warehouse LIKE 供电局1#仓库等价于SELECT*FROM stockWHERE warehouse=供电局1#仓库如果LIKE后面的匹配串中不含通配符,则可以用“=”(等于)运算符取代LIKE谓词,用“!=”或“”(不等于)运算符取代NOT LIKE 谓词。【4.21】查询所有绝缘电线的物资编号、名称和规格SELECT mat_num,mat_name,speciFROM stockWHERE mat_name LIKE%绝缘电线请按照课本第62页的语法,演练【例4.22】、【例4.23】、【例4.24】(5)涉及空值的查询空值(NULL)在数据库中有特殊含义,它表示不确定的值。判断取值为空的语句格式为:列名 IS NULL判断取值不为空的语句格式为:列名 IS NOT NULL【例4.25】查询无库存单价的物资编号及其名称SELECT mat_num,mat_nameFROM stockWHERE unit IS NULL注意:这里的“IS”不能用等号(=)代替。(6)多重条件查询 在WHERE子句中可以使用逻辑运算符AND和OR来组成多条件查询。【例4.26】查询规格为BVV-120的护套绝缘电线的物资编号、库存数量及库存地点。SELECT mat_num,warehouse,amount FROM stock WHERE mat_name=护套绝缘电线 AND speci=BVV-120