Keep Thinking! My Yahoo ID-silvercheng2006@yahoo.com

复杂的DQL-SELECT语句

上一篇 / 下一篇  2009-01-31 22:21:08 / 个人分类:数据库

select语句的完整语法描述如下:
SELECT[ALL|DISTINCT TOP n [PERCENT]WITH TIES select_list --必要元素,制定列
[INTO[new_table_name]]
[FROM {table_name|view_name}[(optimizer_hints)]--指定表
[[,{table_name2|view_name2}[(optimizer_hints)]
[...,table_name16|view_name16][(optimizer_hints)]]]
[WHERE clause]--指定行
[GROUP BY clause]
[HAVING clause]
[ORDER BY clause]
[COMPUTE clause]
[FOR BROWSE]

关键字解释:

a. FROM子句指定查询中包含的行和列所在的表
[FROM {table_name|view_name}[(optimizer_hints)]--指定表
[[,{table_name2|view_name2}[(optimizer_hints)]
[...,table_name16|view_name16][(optimizer_hints)]]]
在查询其他角色对应的方案中的表,需要指定该方案的名称,例如查询方案tiger的temp1表的所有行,其语句为:
select * FROM tiger.temp1
可以在FROM中指定多个表,用逗号分隔表名就可以了,例如
select * from table1,table2,table3

b. select_list,必要元素,用来指定列,跟在关键字SELECT后面。
SELECT column_name_1,column_name_n
FROM table_1,table_n
利用指定列的方法可以改变创建表时列的顺序来显示查询的结果,并且可以通过在多个地方指定同一列来多次显示同一个列。
当然也可以使用通配符*来指定所有列,但通常我们应该少用通配符*,因为这样将检索所有行,效率十分低。

c. WHERE子句指定行
SELECT语句指定了表中所有列的部分列,而所有行都被检索,在很多情况下,用户仅仅需要有目的地检索部分行,这时候就要使用where子句了。
where子句构成一个行选择表达式,尽可能小范围地指定检索的行,带有where的select语句可以返回一个单独的行,甚至没有相匹配的行。如果没有行返回的话,并不返回错误,而是显示”未选定行“。
SELECT column_name_1,column_name_n
FROM table_1,table_n
WHERE column_name comparation_operator value

在where子句中使用比较运算符
在where子句中允许在表列名(column_name)和列值(value)之间使用比较运算符(comparation_operator)包括=,!=,<>,<,>,<=,>=,LIKE.
比较运算符LIKE后面跟一个值的部分而不是一个完整的列值。一个百分号%可以用来匹配任何长度的字符,而通配符下划线"_"则是用来匹配一个字母的。

在where子句中使用布尔操作和其他关键词
可以使用布尔操作符可以组成多个检索条件,更加精确地控制被检索的行。
SELECT column_name_1,column_name_n
FROM table_1,table_n
WHERE column_name comparation_operator value
Boolean_operator column_name comparation_operator value
 OR操作符:”或“的意思,即由OR操作符连接的两个条件只要任意满足一个即可获得逻辑真值。
 AND操作符:”与“的意思,即由AND操作符连接的两个条件必须同时满足才获得逻辑真值。
 NOT操作符:”非“的意思,即由NOT操作符后面的条件不满足时才获得逻辑真值。
 BETWEEN选择值的范围:使用between和and来指定要检索值的范围。
 IN来指定一条列值:使用between和and可以指定某个范围内的所有值,而IN关键词用来指定几个特定的值。实际上,IN就等同于使用多个OR操作符。

d. ORDER BY 子句
数据在数据库中的存储是无序的。使用select语句可以指定检索和显示行的顺序。通过order by子句可以对select语句检索得到的数据进行排序。其语法如下:
SELECT column_name_1,column_name_n
FROM table_1,table_n
ORDER BY column_name_1,column_name_n
使用该语句,首先根据column_name_1这一列进行排序,如果该列的值出现了相同的值,则根据column_name_n这一列的值进行排序。
默认情况下,根据指定的列值进行升序排序,如果要降序排列的话,可以在列名的后面跟上关键词DESC(descend)

e. 使用DISTINCT来检索唯一的列值
再次强调,数据在表中的存储往往是无序的甚至是无规则的。因此,在表中存储了重复数据的行也是可能的。当然,用户在设计数据库的表时,可以通过定义限制,使用唯一的关键字来禁止向表中存储重复的行。然而,某一列的数据总是可能重复的,而用户往往想知道在某一列中导读存在哪些不同的数据,就可以使用DISTINCT来检索这一列的唯一值了。
SELECT DISTINCT column_name_1
FROM table_1

f. 使用算术运算符
SQL语句中还可以使用算术运算符,而带有运算符的表达式同样是从左到右按照先乘除后加减的顺序进行运算。
SELECT column_name_1*2,column_name_n --column_name_1乘以2
FROM table_1

g. 使用组函数
组函数也称为集合函数,返回基于多个行的单一结果,行的准确数量无法确定,除非查询被执行并且所有的结果都被包含在内。与单行函数不同,在解析时所有的行都是已知的。这些函数可以在select或者select的having子句中使用,当用于select子串时常常都与group by一起使用。
AVG([{DISTINCT|ALL}]) 返回数值的平均值,默认设置为ALL
MAX([{DISTINCT|ALL}]) 返回选择列表项目的最大值,默认设置为ALL
MIN([{DISTINCT|ALL}]) 返回选择列表项目的最小值,默认设置为ALL
STDDEV([{DISTINCT|ALL}]) 返回选择列表项目的标准差,默认设置为ALL
SUM([{DISTINCT|ALL}]) 返回选择列表项目的数值的总和,默认设置为ALL
VARIANCE([{DISTINCT|ALL}]) 返回选择列表项目的统计方差。

h. 用GROUP BY给数据分组
group by子句将表按行分组,每组中的行对指定的列具有相同的值,每个不同值的重复值被放在相同的组中,分组使用户可以对行的组执行同样的函数。
在一条语句中可以用任意数量的列进行分组,在选择清单中的列必须是在group bu子句中或有一个函数使用它,包含group by的select语句的语法如下:
SELECT column_name_1,column_name_n
FROM table_1
GROUP BY  column_name_1,column_name_n
group by在按列升序排序后,仅仅定位唯一的列值。
还可以使用HAVING子句选择特殊的组,HAVING子句将组的一些属性和一些常数值比较,如果一个组满足HAVING子句中的逻辑表达式,它就被包括在查询的结果中,使用HAVING子句的select语句的语法如下:
SELECT column_name_1,column_name_n
FROM table_1
GROUP BY  column_name_1,column_name_n
HAVING expression --e.g. HAVING count(*)=3

i. 用HAVING子句限制分组数据
组函数只能用于两个子串中,组函数不能用于where子句中

j. 使用复杂的select语句

-----集合操作:交,并,差------

交:UNION和UNION ALL

使用UNION语句可以合并两个或多个查询的结果。UNION用第二个查询结果合并第一个查询结果。它不显示两个查询中重复的行。而UNION ALL操作符返回查询所检索出的所有行,包括重复的行。其语法是:
SELECT column_name_1,column_name_n
FROM table_1,table_n
WHERE column_name comparasion_operator value
[GROUP BY  ...]
[HAVING ...]
UNION [ALL]
SELECT column_name_1,column_name_n
FROM table_1,table_n
WHERE column_name comparasion_operator value
[GROUP BY  ...]
[HAVING ...]
[ORDER BY ...]  --注意:如果使用order by子句进行排序,该子句只能出想在最后一个查询的后面。

并(INTERSECT)操作:返回两个查询所检索出的共有行
差(MINUS)操作:返回将第二个查询检索的行从第一个查询检索出的行中减去之后剩余的行

----子查询----
可以在一个select语句中嵌入另一个完整的select语句,则嵌入到select语句中的select语句称为子查询。子查询应用括号进行区分。

----表的连接----
我们可以使用from指定多个表进行查询,但一般来说指定的多个表一定会有某种关系,用户需要综合这些表来查询特定的信息。在设计表格时,就考虑了查询的问题。在表中创建主关键字约束和外部关键字约束来使两张表联系起来,在查询的时候,使用where子句设置一个表中的主关键字等于另一个表中的外部关键字的方法来实施一种关系连接,进行查询。这种关系连接称为等值链接和自然连接。

----CASE语句的使用----
CASE语句可以在SQL中实现if-then-else型的逻辑,而不必使用PL/SQL。
有两种类型的CASE语句:
简单CASE语句,使用表达式确定返回值。
搜索CASE语句,是有条件确定返回值。

简单CASE语句
CASE search_expression
 WHEN expression1 THEN result1
 WHEN expression2 THEN result2
 ...
 WHEN expressionN THEN resultN
 ELSE default_result
END
其中search_expression是待求的表达式
expression1,...,expressionN是要与search_expression进行比较的表达式
result1,... ,resultN是(每一个可能的表达式所对应的)返回值。
default_result是无法找到匹配的表达式时的默认返回值


搜索CASE语句
CASE
 WHEN condition1 THEN result1
 WHEN condition2 THEN result2
 ...
 WHEN conditionN THEN resultN
 ELSE default_result
END
其中condition1,condition2,... ,conditionN是待求的表达式
result1,... ,resultN是返回值。
default_result是无法找到匹配的表达式时的默认返回值 

----强大的DECODE函数----
DECODE(value,search_value,result,default_value)对value与search_value进行比较。如果这两个值相等,DECODE()返回result,否则返回default_result。DECODE()函数允许在SQL中执行if-then-else型的逻辑,而不必使用PL/SQL。

Silver

Written @2009-1-31


TAG: 数据库

 

评分:0

我来说两句

我的栏目

日历

« 2024-04-12  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 6298
  • 日志数: 8
  • 建立时间: 2009-01-16
  • 更新时间: 2009-02-02

RSS订阅

Open Toolbar