数据库是为了便于有效地管理信息而创建的,人们希望数据库可以随时提供所需要的数据信息。因此,对用户来说,数据查询是数据库最重要的功能。在数据库中创建了对象并且在基表中添加了数据后,用户便可以从数据库中检索特定信息。
1.常规型
常规型数据查询是通过SELECT语句来完成的。SELECT语句可以从数据库中按用户要求检索数据,并将查询结果以表格的形式返回。
1.1SELECT语句概述
SELECT子句是SQL编程人员最常用的语句之一,也是SQL标准中最灵活和应用最为广泛的语句之一。SELECT语句是一个查询表达式,它以关键字SELECT开头,并且包括大量构成该表达式的元素。SELECT语句可以从数据库中按用户的要求查询行,而且允许从一个表或多个表中选择满足给定条件的一个或者多个行或列,并将数据用用户规定的格式进行整理后返回给客户端。
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子句是查询的第一部分,在SELECT子句中指定所需列、列的顺序以及列名。SELECT子句一共有三种形式,分别为:
SELECT列 在该形式下能够获取列出的列,并按这些列在被列出的列表中的顺序放置这些列,还可以对列名进行重命名。(例如:
SELECT 客户姓名 AS NAME,客户地址 AS ADDRESS,联系电话 AS TELEPHONE_NUM
FROM 客户信息
)SELECT *或SELECT 表名.* 在该形式下能够获取表中所有列,并且其放置顺序与表中的顺序相同。但是,不能再SQL语句中重新对列名命名。另外,在添加表中的列以外的其他列时,需要在星号"*"前输入表名,表名与星号之间用一个句点隔开。(例如:
SELECT *
FROM 业务员信息
)SELECT DISTINCT列在该形式下,除了完成SELECT列形式下的功能外,还可以去除结果中的而重复行。(例如:
SELECT DISTINCT 客户地址
FROM 客户信息
)1.3使用WHERE子句
用户在查询数据库时往往不需要检索全部的数据,而只需要查询其中一部分满足给定条件的信息,此时需要在SELECT语句中加入条件,以选择其中的部分记录。这就用到WHERE子句来指定查询返回行的条件,WHERE子句用于选取需要检索的数据行。带WHERE子句的SELECT语句的基本格式如下:
SELECT <select_list>
FROM <table_reference>
WHERE <search_condition>
其中,<search_condition>为指定查询时要返回的行记录所应满足的条件,该条件由表达式及逻辑运算符等组成。
WHERE子句获取FROM子句返回的值,每一行都要根据搜索条件进行评估。若评估为真,则作为查询结果的一部分返回;若评估如果为未知或假,则这些行不包括在查询结果中。而评估的关键是<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两个逻辑表达式中的任意一个,用到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关键字用来显示一个组中的成员关系。当有一个满足条件的离散值列表时,就会用到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语句获得的数据一班没有任何的按一定的规律进行排序。也就是说,这一次提取的数据组的排列顺序与下次提取的数据组的排序顺序可以截然不同。为了方便阅读和使用,最好对查询结果进行排序。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子句是一个可选的子句。在使用ORDER BY子句时,只需指定一列或多列以及可选关键字ASC或DESC(没列只使用一个关键字)。如果没有指定关键字,那么ASC为默认的关键字。
举例来说,从数据库“ 销售管理系统”中,以列“出库单编号”、“客户编号”、“库存编号”和“出库日期”的形式返回“出库日期”的降序排序。
SELECT 出库单编号,客户编号,库存编号,出库日期
FROM 出库单信息
ORDER BY 出库日期 DESC
ORDER BY子句后的列名通常是SELECT列表中的列名,而另一种比较简单的方法是用数字来代替列名,该数字的值是指定排序的列在SELECT列表中的位置,改值有“1”开始 ,从左到右一次加1。例如,在上述的查询语句中,将ORDER BY子句后的列名“出库日期”改为数字“4”,因为“出库日期”在SELECT列表中的位置是“4”。
执行该语句后,其查询结果与上述语句结果查询完全相同。
又如,从数据库“销售管理系统”中,以列“收入明细编号”、“收入日期”、“收入金额”和“盈利金额”的形式返回“收入明细信息”,并将查询结果先按“收入金额”的降序排序,再按“盈利金额”的升序排序。
SELECT 收入明细编号,收入日期,收入金额,盈利金额
FROM 收入明细
ORDER BY 收入金额 DESC,盈利金额 ASC
1.5使用GROUP BY子句
在使用SELECT语句进行数据查询时,如果需要按某一列数据的值进行分类,然后在分类的基础上再进行查询,可以使用GROUP BY子。GROUP BY子句用于归纳信息类型,以汇总相关数据。不管是否使用WHERE子句,GROUP BY子句都可以包括在SELECT语句中。GROUP BY子句的语法格式如下:
SELECT <select_list>
FROM <table_reference>
GROUP BY <grouping_specificition>
其中,<grouping_specificition>可以分解为一下格式:
<column_name> [{,<column_name>...}
| {ROLLUP | CUBE} ( <column_name> [ { , <column_name>}...])
上述语句中的CUBE表示了除了返回由GROUP BY子句指定的列外,还返回按组统计的行。返回的结果先按分组的第一条件列排序显示,再按第二个条件列排序显示,一次类推。统计行包括了GROUP BY子句指定的列的各种组合的数据统计。ROLLUP与CUBE不同的是,它只返回第一个分组条件指定的列的统计行。改变列的顺序会使返回的结果行数发生变化。
例如,从数据库“经销商”的“销售信息”表中,按照“销售人员编号”分组,查询每个销售人员的销售金额,并按销售金额的降序进行排序。
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子句都指定了一列,但是也可以根据需要指定其他的列,这样句可以创建在主键范围内分组数据的子组。例如,从数据库“珠宝销售系统”的“销售明细信息”表中,按照“明细编号”和“单价”分组,查询销售的“单价”及“总利润”,并按照“明细编号”的升序排序。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
当执行上述语句后,在查询结果中对于“明细编号”列中的每个值都增加了一行。三个附加行提供对应于“明细编号”列中的每个值的总数量。而最后增加的一行表示“明细编号”列中所有值得总数量。
CUBE运算符返回的数据和ROLLUP运算符相同,但要比ROLLUP运算符返回的信息多。而在下面的SELECT语句中,仅仅是用运算符CUBE替换ROLLUP:
SELECT 明细编号,单价,SUM(利润) AS 总利润
FROM 销售明细信息
GROUP BY 明细编号,单价 WITH CUBE
可以看出,三个附加行添加到查询结果中, 每一行对应于“明细编号”列中的每个不同的值。和ROLLUP运算符不同,CUBE汇总了每个自组的值。
1.6使用HAVING子句