程序员人生 网站导航

SQL应用与开发:(七)数据操作 · 查 · (一)常规型

栏目:数据库应用时间:2015-06-06 08:09:15

数据库是为了便于有效地管理信息而创建的,人们希望数据库可以随时提供所需要的数据信息。因此,对用户来讲,数据查询是数据库最重要的功能。在数据库中创建了对象并且在基表中添加了数据后,用户即可以从数据库中检索特定信息。

1.常规型

常规型数据查询是通过SELECT语句来完成的。SELECT语句可以从数据库中按用户要求检索数据,并将查询结果以表格的情势返回。

1.1SELECT语句概述

SELECT子句是SQL编程人员最经常使用的语句之1,也是SQL标准中最灵活和利用最为广泛的语句之1。SELECT语句是1个查询表达式,它以关键字SELECT开头,并且包括大量构成该表达式的元素。SELECT语句可以从数据库中按用户的要求查询行,而且允许从1个表或多个表当选择满足给定条件的1个或多个行或列,并将数据用用户规定的格式进行整理后返回给客户端。

SELECT语句可以精确地对数据库进行查找,并且SELECT语句的SQL语法显得直观、结构化。固然,SELECT语句也能够进行模糊查找。

由于SELECT语句的完全语句比较复杂,所以在这里只罗列它的主要子句。SELECT语句的主要格式以下:

SELECT [ALL | DISTINCT ] { * | <select_list>}

FROM <table_reference> [ {, <table_reference>}...]

[WHERE <search_condition>]

[GROUP BY <grouping_specifition>]

[HAVING <search_condition>]

[ORDER BY <order_condition>]

其中,[ ]表示可选项,SELECT子句和FROM子句是必选的,其他子句都是可选的。其具体含义以下:

SELECT子句  [用来指定由查询返回的列。各列在SELECT子句中的顺序决定了它们在结果表中的顺序。]

FROM子句  [用来指定从中查询行的源表。]

WHERE子句  [用来指定限定返回的行的搜索条件。]

GROUP BY子句  [用来指定查询结果的分组条件,即归纳信息类型。]

HAVING子句  [用来指定组或聚合的搜索条件。]

ORDER BY子句  [用来指定结果集的排序方式。]


1.2使用SELECT子句

SELECT子句是查询的第1部份,在SELECT子句中指定所需列、列的顺序和列名。SELECT子句1共有3种情势,分别为:

SELECT列 在该情势下能够获得列出的列,并按这些列在被列出的列表中的顺序放置这些列,还可以对列名进行重命名。(例如:

SELECT 客户姓名 AS NAME,客户地址 AS ADDRESS,联系电话 AS TELEPHONE_NUM

FROM 客户信息

SELECT *或SELECT 表名.*  在该情势下能够获得表中所有列,并且其放置顺序与表中的顺序相同。但是,不能再SQL语句中重新对列名命名。另外,在添加表中的列之外的其他列时,需要在星号"*"前输入表名,表名与星号之间用1个句点隔开。(例如:

SELECT * 

FROM 业务员信息

SELECT DISTINCT列在该情势下,除完成SELECT列情势下的功能外,还可以去除结果中的而重复行。(例如:

SELECT DISTINCT 客户地址

FROM 客户信息


1.3使用WHERE子句

用户在查询数据库时常常不需要检索全部的数据,而只需要查询其中1部份满足给定条件的信息,此时需要在SELECT语句中加入条件,以选择其中的部份记录。这就用到WHERE子句来指定查询返回行的条件,WHERE子句用于选取需要检索的数据行。带WHERE子句的SELECT语句的基本格式以下:

SELECT <select_list>

FROM <table_reference>

WHERE <search_condition>

其中,<search_condition>为指定查询时要返回的行记录所应满足的条件,该条件由表达式及逻辑运算符等组成。

WHERE子句获得FROM子句返回的值,每行都要根据搜索条件进行评估。若评估为真,则作为查询结果的1部份返回;若评估如果为未知或假,则这些行不包括在查询结果中。而评估的关键是<search_condition>所指定的搜索条件。


1.3.1WHERE子句中比较运算符的使用:

其语法格式:

SELECT <select_list>

FROM <table_reference>

WHERE <expression1> <comparision operator> <expression2>

举例来讲:

SELECT 供应商名称,供应商所在城市,联系人姓名,联系电话

FROM 供应商名称

WHERE 供应商所在城市='北京市'   


1.3.2WHERE子句中逻辑运算符的使用:

其格式以下:

SELECT <select_list>

FROM <table_reference>

WHERE {NOT <expression> | <expression> <logical operator> <expression2>}

其中,<logical operator>表示逻辑运算符,它可以是AND、OR两个逻辑表达式中的任意1个,用到NOT时,要将NOT放在表达式的前面。

举例来讲:

SELECT 操作人员姓名,入库权限,出库权限,联系电话

FROM 操作人员信息

WHERE 入库人员=1 AND 出库人员=1


1.3.3WHERE子句中IN条件的使用:

SELECT <select_list>

FROM <table_reference>

WHERE <expression> [NOT] IN <value_list>

其中,[NOT]为可选项,<value_list>表示值列表。

在WHERE子句中使用IN或NOT IN关键字指定条件时,IN关键字用来显示1个组中的成员关系。当有1个满足条件的离散值列表时,就会用到IN关键字。

有效值列表中不能包括NULL值得数据,由于在WHERE子句中使用IN关键字作为指定条件时不允许数据中有NULL值。

举例来讲:

SELECT 客户姓名,客户地址,联系电话

FROM 客户信息

WHERE 客户地址 IN ('北京市宣武区','北京市海淀区')


1.3.4WHERE子句中LIKE条件的使用:

其格式以下:

SELECT <select_list>

FROM <table_reference>

WHERE <expression> [NOT] LIKE 'string'

其中,[NOT]为可选项,'string'表示用来进行比较的字符串。利用WHERE子句进行查询的进程中,为了实现对字符串的模糊匹配,可以在string字符串中使用通配符。

举例来讲:

SELECT 商品名称,供应商编号,产地,单价

FROM 商品信息

WHERE 商品名称 LIKE '[A-M]%'


1.3.5WHERE子句中IS NULL的使用:

其格式以下:

SELECT <select_list>

FROM <table_reference>

WHERE <column_name> IS [NOT] NULL

其中,<column_name>表示列名,[NOT]为可选项。

举例来讲:

SELECT 消费者姓名,消费者消费金额,消费者所在城市,联系电话

FROM 顾客信息

WHERE 联系电话 IS NULL


1.4使用ORDER BY子句

SELECT语句取得的数据1班没有任何的按1定的规律进行排序。也就是说,这1次提取的数据组的排列顺序与下次提取的数据组的排序顺序可以截然不同。为了方便浏览和使用,最好对查询结果进行排序。SQL语言中,ORDER BY子句用来指定查询结果是依照升序(使用关键字ASC)还是降序(使用关键字DESC)进行排序。ORDER BY子句的基本语法格式为:

SELECT <select_list>

FROM <table_reference>

ORDER BY[{<order_by_expression> []ASC | DESC}...]

其中,<order_by_expression>表示用于排序的列的列名或列的别名和表达式,或指定为代表选择列表内的名称、别名或表达式的位置的负整数。如果需按多列进行排序,则根据ORDER BY后各列的次序前后决定排序的优先级;ASC指定查询结果依照升序进行排序,DESC指定查询结果依照降序进行排序。

ORDER BY子句是1个可选的子句。在使用ORDER BY子句时,只需指定1列或多列和可选关键字ASC或DESC(没列只使用1个关键字)。如果没有指定关键字,那末ASC为默许的关键字。

举例来讲,从数据库“ 销售管理系统”中,以列“出库单编号”、“客户编号”、“库存编号”和“出库日期”的情势返回“出库日期”的降序排序。

SELECT 出库单编号,客户编号,库存编号,出库日期

FROM 出库单信息

ORDER BY 出库日期 DESC

ORDER BY子句后的列名通常是SELECT列表中的列名,而另外一种比较简单的方法是用数字来代替列名,该数字的值是指定排序的列在SELECT列表中的位置,改值有“1”开始 ,从左到右1次加1。例如,在上述的查询语句中,将ORDER BY子句后的列名“出库日期”改成数字“4”,由于“出库日期”在SELECT列表中的位置是“4”。

履行该语句后,其查询结果与上述语句结果查询完全相同。

又如,从数据库“销售管理系统”中,以列“收入明细编号”、“收入日期”、“收入金额”和“盈利金额”的情势返回“收入明细信息”,并将查询结果先按“收入金额”的降序排序,再按“盈利金额”的升序排序。

SELECT 收入明细编号,收入日期,收入金额,盈利金额

FROM 收入明细

ORDER BY 收入金额 DESC,盈利金额 ASC


1.5使用GROUP BY子句

在使用SELECT语句进行数据查询时,如果需要按某1列数据的值进行分类,然后在分类的基础上再进行查询,可使用GROUP BY子。GROUP BY子句用于归纳信息类型,以汇总相干数据。不论是否使用WHERE子句,GROUP BY子句都可以包括在SELECT语句中。GROUP BY子句的语法格式以下:

SELECT <select_list>

FROM <table_reference>

GROUP BY <grouping_specificition>

其中,<grouping_specificition>可以分解为1下格式:

<column_name> [{,<column_name>...}

 |  {ROLLUP | CUBE} ( <column_name> [ { , <column_name>}...])

上述语句中的CUBE表示了除返回由GROUP BY子句指定的列外,还返回按组统计的行。返回的结果先按分组的第1条件列排序显示,再按第2个条件列排序显示,1次类推。统计行包括了GROUP BY子句指定的列的各种组合的数据统计。ROLLUP与CUBE不同的是,它只返回第1个分组条件指定的列的统计行。改变列的顺序会使返回的结果行数产生变化。

例如,从数据库“经销商”的“销售信息”表中,依照“销售人员编号”分组,查询每一个销售人员的销售金额,并按销售金额的降序进行排序。

SELECT 销售人员编号,SUM(金额) AS 销售金额

FROM 销售信息

GROUP BY 销售人员编号 

ORDER BY 2 DESC

在包括GROUP BY子句的SELECT语句中依然可使用WHERE子句。例如,假设在上个例子中,若只有列“金额”大于100时才可以加入“销售金额”中,则可使用以下语句来实现:

SELECT 销售人员编号,SUM(金额) AS 销售金额

FROM 销售信息

WHERE 金额 > 100

GROUP BY 销售人员编号 

ORDER BY 2 DESC

前面的两个例子中,GROUP BY子句都指定了1列,但是也能够根据需要指定其他的列,这样句可以创建在主键范围内分组数据的子组。例如,从数据库“珠宝销售系统”的“销售明细信息”表中,依照“明细编号”和“单价”分组,查询销售的“单价”及“总利润”,并依照“明细编号”的升序排序。

SELECT 明细编号,单价,SUM(利润) AS 总利润

FROM 销售明细信息

GROUP BY 明细编号,单价

ORDER BY 明细编号

在GROUP BY子句的语法中曾简单介绍过运算符ROLLUP和CUBE。这两个运算符在功能上相似,当把他们添加到GROUP BY子句时,它们都将在查询结果中返回附加摘要值。

例如,以下SELECT语句中,GROUP BY子句将ROLLUP运算符利用于列“明细编号”和“单价”:

SELECT 明细编号,单价,SUM(利润) AS 总利润

FROM 销售明细信息

GROUP BY 明细编号,单价 WITH ROLLUP

当履行上述语句后,在查询结果中对“明细编号”列中的每一个值都增加了1行。3个附加行提供对应于“明细编号”列中的每一个值的总数量。而最后增加的1行表示“明细编号”列中所有值得总数量。

CUBE运算符返回的数据和ROLLUP运算符相同,但要比ROLLUP运算符返回的信息多。而在下面的SELECT语句中,仅仅是用运算符CUBE替换ROLLUP:

SELECT 明细编号,单价,SUM(利润) AS 总利润

FROM 销售明细信息

GROUP BY 明细编号,单价 WITH CUBE

可以看出,3个附加行添加到查询结果中, 每行对应于“明细编号”列中的每一个不同的值。和ROLLUP运算符不同,CUBE汇总了每一个自组的值。


1.6使用HAVING子句

HAVING子句是指定组或聚合的搜索条件。HAVING子句通常与GROUP BY子句1起使用;在完成数据结果的查询和统计后,可使用HAVING子句对分组的结果进行进1步的挑选;如果不使用GROUP BY子句,HAVING子句的功能与WHERE子句1样。HAVING子句的格式为:
HAVING <search_condition>
HAVING子句可以援用选择列表中,依照“明细编号”和“单价”分组,查询销售的“单价”及“总利润”,并要求在查询结果中只显示“总利润”大于150的信息。
SELECT 明细编号,单价,SUM(利润) AS 总利润
FROM 销售明细信息
GROUP BY 明细编号,单价
HAVING SUM(利润) > 150
如果HAVING子句中包括有多个条件,那末可以通过关键字AND、OR或NOT组合为HAVING子句的搜索条件。例如,在上个例子中,要求返回的结果为“单价”大于300或“总利润”大于150的信息。
SELECT 明细编号,单价,SUM(利润) AS 总利润
FROM 销售明细信息
GROUP BY 明细编号,单价
HAVING  单价> 300 OR SUM(利润) > 150

关于数据库的查操作,未完待续......

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐