APP下载

SQL统计标准题录的常用方法

2018-01-24张广庆顾婉晴

质量探索 2017年5期
关键词:国家标准语句条件

张广庆,顾婉晴,贾 欣

(1.青岛市标准化研究院,青岛 266071;2.辽宁工业大学,锦州 121001)

1 前言

随着互联网的发展和社会各界对标准工作的日益重视,标准题录也从专业技术机构的独有信息,变为互联网中方便获取的大众信息,人们通过网络上的标准信息检索系统,查询相关标准的题录信息和获取标准线索,初步满足了人们对标准题录的查询需要。本文通过介绍结构化查询语言(简称SQL)中的统计功能,帮助读者进一步掌握分析和统计这些标准题录的常用方法。

标准题录通常存放于关系型数据库中,如Oracle、DB2、PostgreSQL、SQL Server、Access、MySQL、浪潮K-DB等,这些数据库都使用SQL实现数据查询和统计。表1列出了这些数据库操作SQL的图形化工具,借助这些工具,可以方便地使用SQL分析和统计标准题录数据。本文仅以SQL Server为例介绍SQL的统计功能。

表1 关系型数据库的SQL图形化工具

2 SQL及其数据统计功能简介

SQL是结构化查询语言的简称,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,包括数据查询、数据操作、数据控制、数据定义、事务处理、指针控制等6部分语言[1]。

SQL数据查询语言由SELECT语句构成。SELECT语句通常划分为SELECT、FROM、WITH、WHERE、GROUP BY、HAVING、UNION、ORDER BY、INTO等子句,灵活运用这些子句,可以满足大多数的数据统计。

本文以标准题录表std_title和起草单位表std_draft_unit为例,说明SQL的统计功能。两个表的字段属性参见表2和表3[2-3]。

表2 表std_title字段属性

表3 表std_draft_unit字段属性

3 使用聚组函数的统计

SELECT语句使用聚组函数进行数据统计的简易语法是:

SELECT < 聚组函数 >(< 字段名 >) [, ...] FROM < 表名 > WHERE < 查询条件 >

SELECT语句不使用WHERE子句时,将对全部数据进行统计;使用WHERE子句时,则仅在WHERE子句限定的范围内统计。例如输入以下语句并运行,将统计全部标准的总数量:

SELECT COUNT(std_no) FROM std_title

而运行以下语句仅统计国家标准的总数量:

SELECT COUNT(std_no) FROM std_title WHERE std_kind = '国家标准'

SELECT语句常用的聚组函数有5种,参见表4。

表4 聚组函数

WHERE子句除WHERE关键字外,通常由字段名、比较运算符、字段名(或常数)组成,比较运算符参见表5。如统计国家标准和行业标准的总数量的语句是:

SELECT COUNT(std_no) FROM std_title WHERE (std_kind = '国家标准') OR (std_kind = '行业标准')

表5 WHERE子句的比较运算符

运算符 说明 示例 示例说明<= 小于等于 page_num <= 5 标准文本页数小于等于5页的统计(含5页)!=(或<>) 不等于 std_kind != '国家标准' 不是国家标准的统计BETWEEN... AND ... 在两个值之间 release_year BETWEEN '2010' AND '2017'2010年至2017年发布的统计(含2010、2017年)IN 在集合内的值 std_kind IN ('国家标准','行业标准') 国家标准和行业标准的统计LIKE 字符串匹配 std_name LIKE '%食品%' 标准中文名称含“食品”的统计IS NULL 空值 std_eng_name IS NULL 标准英文名为空值的统计NOT 条件不成立时 NOT (Std_kind = '国家标准') 不是国家标准的统计AND 不同条件的交集 (release_year >= '2010') AND(release_year <= '2017')2010年至2017年发布的标准的统计(含2010、2017年)OR 不同条件的并集 (std_kind = '国家标准') OR(std_kind = '行业标准') 国家标准和行业标准的统计

4 使用分组的统计

GROUP BY子句实现对数据的分组统计,简易语法是:

SELECT <字段名>,[...] <聚组函数>(<字段名>) FROM <表名> WHERE <查询条件> GROUP BY <字段名> [, ...]

使用GROUP BY子句时有以下特点:GROUP BY 子句中的字段名应当在SELECT子句中也出现;SELECT子句中的字段名不在GROUP BY 子句中时,必须使用聚组函数;聚组函数只能在SELECT子句、GROUP BY子句、HAVING子句中出现,不能出现在WHERE子句中;GROUP BY子句与HAVING子句同时使用时,将只给出满足HAVING子句的统计数据;WHERE子句、GROUP BY 子句、HAVING子句同时使用时,程序执行顺序是WHERE->GROUP BY->HAVING;WHERE子句和HAVING子句都用于对查询结果限定条件。两者同时使用时,WHERE子句的作用是在数据分组前过滤数据,即先去掉不符合WHERE子句条件的数据,再对查询结果进行分组;HAVING子句的作用是在数据分组后过滤数据,即先对数据进行分组,再去掉不符合HAING子句条件的分组数据。

示例如下:

(1)统计不同标准类型的数量:

(2)统计2016年发布的不同标准类型的数量:

SELECT std_kind,COUNT(std_no) FROM std_title WHERE release_year = '2016' GROUP BY std_kind

(3)统计2016年发布的数量不少于50个的不同标准类型的数量:

SELECT std_kind,COUNT(std_no) FROM std_title WHERE release_year = '2016' GROUP BY std_kind HAVING COUNT(std_no) >= 50

5 使用连接查询的统计

多个表的关联统计可以使用SQL的连接查询或子查询进行。连接查询的方式有内连接、外连接和交叉连接。内连接分为等值连接、不等连接和自然连接;外连接分为左外连接、右外连接、全外连接。自然连接和交叉连接不能用于数据统计。使用连接查询时,字段名前应加表名前缀(表名或表的别名),只有该字段名在FROM子句的所有表中是唯一的,才可以不加前缀。

(1)使用等值连接查询的统计

WHERE子句中的比较运算符使用“=”号连接不同表的连接字段的查询方式称为等值连接查询。如查询某单位参与起草的所有标准的总页数和总零售价:

例5 (2013.烟台中考)在探究“绿叶在光下制造有机物”时,因受时间和条件的限制,教材为我们提供了实验方案,但实验要在认同实验原理的前提下进行,以下是某小组同学在实验前依次进行的对话,请分析其中蕴含的科学思维和方法。

SELECT SUM(page_num),SUM(retail_price) FROM std_title,std_draft_unit WHERE (std_title.std_no = std_draft_unit.std_no) AND (draft_unit = '某单位')

或者写成如下语句:

SELECT SUM(page_num),SUM(retail_price) FROM std_title INNER JOIN std_draft_unit ON (std_title.std_no = std_draft_unit.std_no) AND (draft_unit = '某单位')

(2)使用不等连接查询的统计

WHERE子句中的比较运算符使用“>”、“>=”、“<=”、“<=”和“!= ”等符号连接不同表的连接字段的查询方式称为不等连接查询。如查询非某单位参与起草的标准的总页数和总零售价:

SELECT SUM(page_num),SUM(retail_price) FROM std_title,std_draft_unit WHERE (std_title.std_no =std_draft_unit.std_no) AND (draft_unit != '某单位')

(3)使用左外连接查询的统计

使用LEFT OUTER JOIN关键字连接不同表的连接字段的查询方式称为左外连接查询。该方式查询的结果不但有满足WHERE子句的查询条件和连接条件的数据,同时还有LEFT OUTER JOIN关键字左边表中满足查询条件但不满足连接条件的数据。如统计某单位参与起草的所有标准的总页数和总零售价:

SELECT SUM(page_num),SUM(retail_price) FROM std_title LEFT OUTER JOIN std_draft_unit ON (std_title.std_no =std_draft_unit.std_no) AND (draft_unit = '某单位') WHERE std_draft_unit.draft_unit = '某单位'

(4)使用右外连接查询的统计

使用RIGHT OUTER JOIN关键字连接不同表的连接字段的查询方式称为右外连接查询。该方式查询的结果不但有满足WHERE子句的查询条件和连接条件的数据,同时还有RIGHT OUTER JOIN关键字右边表中满足查询条件但不满足连接条件的数据。如统计某单位参与起草的所有标准的总页数和总零售价:

SELECT SUM(page_num),SUM(retail_price) FROM std_title RIGHT OUTER JOIN std_draft_unit ON (std_title.std_no =std_draft_unit.std_no) AND (draft_unit = '某单位')

从该示例可以看出,使用右外连接查询进行统计时,可以不用WHERE子句再限制统计结果。

(5)使用全外连接查询的统计

使用FULL OUTER JOIN关键字连接不同表的查询方式称为全外连接查询。该方式查询的结果不但有满足WHERE子句的查询条件和连接条件的数据,同时还有FULL OUTER JOIN 关键字左边表和右边表中满足查询条件但不满足连接条件的数据。如统计某单位参与起草的所有标准的总页数和总零售价:

SELECT SUM(page_num),SUM(retail_price) FROM std_title FULL OUTER JOIN std_draft_unit ON (std_title.std_no =std_draft_unit.std_no) AND (draft_unit = '某单位') WHERE std_draft_unit.draft_unit = '某单位'

6 使用子查询的统计

包含在WHERE子句中的SELECT语句称为子查询。SELECT语句使用子查询进行数据统计的简易语法有三种:

(1)IN方式:

SELECT <聚组函数>(<字段名 >) [, ...] FROM <表名 > WHERE <字段名> [NOT] IN (子查询)

(2)ALL方式:

SELECT <聚组函数>(<字段名>) [, ...] FROM <表名> WHERE <字段名> <比较运算符> [ANY| ALL](子查询)

(3)EXISTS方式:

SELECT <聚组函数>(<字段名 >) [, ...] FROM <表名 > WHERE [NOT] EXISTS (子查询 )

包含子查询的SQL有以下特点:不同的关系型数据库中子查询的嵌套层次不同,最多可达255层;最里面的子查询先执行,将查询结果返回给上一级查询使用;子查询方式常常可以和连接查询互换使用,得到的查询或统计结果相同;关键字IN 和 =ANY可以互换使用,关键字NOT IN 和!=ALL可以互换使用;含有IN的查询可以换成EXISTS,但含有EXISTS的查询则不一定能用IN代替;子查询中一般不使用ORDER BY。

以统计某单位参与起草的所有标准的总页数和总零售价为例,上述三种方式的语句分别是:

SELECT SUM(page_num),SUM(retail_price) FROM std_title WHERE std_no IN (SELECT std_no FROM std_draft_unit WHERE draft_unit = '某单位')

SELECT SUM(page_num),SUM(retail_price) FROM std_title WHERE std_no = ANY (SELECT std_no FROM std_draft_unit WHERE draft_unit = '某单位')

SELECT SUM(page_num),SUM(retail_price) FROM std_title WHERE EXISTS (SELECT std_no FROM std_draft_unit WHERE std_title.std_no = std_draft_unit.std_no AND draft_unit = '某单位')

子查询中也常用到数据统计,如起草标准页数最多的单位名称:

SELECT draft_unit FROM std_draft_unit WHERE std_no = (SELECT std_no FROM std_title WHERE page_num =(SELECT MAX(page_num) FROM std_title))

7 结语

结构化查询语言(SQL)是查询和统计标准题录数据的重要工具,熟练掌握和灵活运用聚组函数、分组、连接查询、子查询等功能,可以帮助企业进一步了解标准的整体情况,掌握不同行业标准的发展特点,获知本行业最新的科技动态,从而有效指导本企业的生产、经营和管理等工作。

[1] 石宏磊.浅谈SQL语言的基础应用[J].计算机光盘软件与应用,2014,(15):74.

[2] QJ 1640-1989,标准文献著录规则[S].

[3] GB/T 22373-2008,标准文献元数据[S].

猜你喜欢

国家标准语句条件
排除多余的条件
选择合适的条件
重点:语句衔接
近期发布的相关国家标准(2019年12月10日)
近期发布的相关国家标准(2019年12月31日)
近期发布的相关国家标准(2020年03月06日)
近期发布的相关国家标准(2020年03月31日)
为什么夏天的雨最多
我喜欢
认同或对抗——论执政条件下的党群关系互动