博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[ZZ]Oracle中的select语句

Posted on 2011-10-29 20:47  wangwangkunkun  阅读(120)  评论(0编辑  收藏  举报

http://www.cnblogs.com/yuepeng/archive/2011/03/21/1990105.html

select 查询的一般格式是
select {[ distinct | all ] columns | *}                 //1 选择列
from {tables | views | other select}                 //2 数据来源
where conditions                                            //3 选择条件
group by columns                                          //4 分组
having conditions                                          //5 选择
order by columns                                           //6 排序

一、选择列

  • select后面出现的内容可以是from后面的数据来源中的列,可以是*,可以是常量或者T-SQL函数
  • 如果列名很长,或者多个表的列名有冲突,可以使用as来定义别名

二、数据来源

  • 数据来源可以是表,视图,还可以是其他的select语句(即行集)
  • from子句中可以包含连接说明,即inner join, outer join这样的内容。这个内容参见下面的内容
  • 可以在from子句中为表,视图,或者其他select语句的结果指定别名,但是不要用as

三、where子句

  • 多个条件之间可以用and 或者or连接
  • null值查询要使用is null,或者is not null,而不是=null或者<>null
  • like是进行模式匹配的一种方式,列的数据类型可以是任何字符或者日期数据。它的否定形式是not like。%和_是通配符,%表示0或多个任意字符,_表示一个任意字符。但是这两个字符如果不出现在like后面的模式中,就是两个普通字符
  • text列的where条件只能是like,is null,patindex
  • 如果要在like中匹配普通字符%和_,可以使用escape定义一个转义字符,这个转义字符可以随意指定。然后将这个转义字符放在一个通配符或者单引号之前,就表示这个通配符或者单引号是一个普通的字符
  • in ,not in, between and, not between and.“between a and b”将会包括a和b在内。in可以转换为一个连接,但是not in不能
  • where exists R.当且仅当R非空时,条件exists R为真。 其否定形式是 where not exists R.
  • where s <| >| = | <>| >=|<= all/any R.否定形式是在s前对整个表达式加not.

四、连接查询
     两张表的连接可以用from子句的ansi连接语法或者where子句中的sql连接语法实现。ansi连接语法格式为from  table1 join_type  table2  on(conditions)  join_type  table3  on(conditions)。
     连接有等值连接,笛卡尔积(交叉连接),自然连接,theta连接,外链接五种。

     假设有三个表,其结构如下:

T_Student表:id, name;     3条数据

T_Course表:id,name;     4条数据

T_SC表:sid, cid,score;10条数据

  • 等值连接

select     t_student.*,      t_sc.*
from     t_student     inner     join     t_sc
on   (t_student.id = t_sc.sid)
--10条记录,t_sc的记录数目

  • 交叉连接(笛卡尔积)

select    t_student.*,     t_sc.*
from     t_student     cross     join     t_Sc
--30条记录,t_student的数目 乘以 t_sc的数目

  • 自然连接(等值连接的简化)

select    t_student.*,     t_sc.cid,     t_sc.score
from     t_student     inner     join     t_sc
on (t_student.id = t_sc.sid)
--10条记录,t_sc的记录数目。自然连接是一种特殊的等值连接,其特殊之处在于要将结果列中的重复列去掉。

  • theta连接

select    t_student.*,    t_sc.cid,    t_sc.score
from    t_student    inner join    t_sc
on    (t_student.id = t_sc.sid)
and    t_student.id = 'aaa'

  • 多表连接,同时也是自然连接

select    t_student.name as sname,    t_course.name as cname,    t_sc.score
from    t_student    inner join    t_sc on (t_student.id = t_sc.sid)
inner join    t_course on(t_sc.cid = t_course.id)
--10条记录,t_sc的记录数目

  • 外连接

select    t_student.*,    t_sc.cid,    t_sc.score
from    t_student    left outer join    t_sc
on(t_student.id = t_sc.sid)

或者

select  t_student.*, t_sc.cid, t_sc.score
from t_student, t_sc
where t_student.id = t_sc.sid(+)

上面的例子是左外连接的示例,对应的还有右外连接。以左外连接为例,实际的查询过程大概是这样的:以t_student为主表,遍历t_student。对于 t_student中的每一条记录(每一个学生),如果t_sc中的记录的sid字段值和该学生id相同,就形成新的记录。如果t_sc中找不到任何一条记录的sid字段值和该学生的id相同,也生成一条新纪录,只不过t_sc表的字段都为null。

  • 连接和子查询的比较

如果需要频繁计算聚集数据并将其用在外查询中进行比较,一般用子查询。如果select中的列,来自多个不同的表,一般用连接。

五、group by和having

  • select语句中出现的列,都必须出现在group by子句中,除非那一列使用了聚集函数
  • having子句是从分组后的结果中筛选行,having的搜索条件在进行分组操作之后应用,所以它必须在group by之后使用
  • having子句和where子句的另一个区别在于,它可以出现聚合函数
  • where和having中都可以出现比较运算符,between,in,like,all,any

六、order by
    order by columns用来对结果集进行排序,按照列顺序,嵌套排序。默认是asc升序,desc是降序。