Oracle11G-SQL开发指南-2-从数据库表中检索信息

1.  对单表执行select查询
    select 列名1[,列名2,...] from 表名 ;


2.  选择一个表中所有列
    select * from 表名 ;


3.  使用where子句过滤行
    SELECT list of items 
    FROM   list of tables
    WHERE  list of conditions ; 


4.  理解行标识符
    rowid: 伪列, Oracle数据库中每一行都有一个唯一的行标识符,是18位数字,采用base-64编码;
    select rowid ,bin_float from binary_test ; 
  
5.  理解行号
    rownum: 伪行, 返回每一行在结果集中的行号;从1开始。
    select rownum ,bin_float from binary_test ; 


6.  执行算术运算符
    1> 用算术表达式来进行算术运算:  +  -  *   /
    2> 日期运算
    3> 列运算


7.  使用列别名 
  
8.  使用连接操作符( "||" )合并列的输出结果    


9.  理解空值(null value)
    使用相关函数处理空值 nvl(), nvl2()


10. 禁止显示重复行 distinct


11. 比较值
     = 、!=或<> 、< 、> 、<= 、>= 、ANY 、SOME 、ALL 


12.使用sql操作符
    like、in、 between、 is null 、 is nan、 is infinite、与not结合使用,含义相反的
    like: 通配符:(_)匹配一个;(%)匹配任意个


13. 使用逻辑操作符    and、 or、 not


14. 理解操作符执行的优先级(推荐使用括号来显示处理)


15. 使用order by 来排序 desc:降序  asc:升序


16. 执行使用两个表的select语句, 要使用一个连接条件


17. 使用表别名,在from语句中指定


18. 笛卡尔积 , 在多表查询时不指定连接条件,


19. 执行使用多于两个表的select语句  连接数=查询中使用的表的总数 - 1 


20. 连接条件与连接类型
    根据连接条件分:
        1> 等连接(equijoin)  使用 = 
        2> 不等连接(non-equijoin) 使用 <,>,between等
    连接类型:
        1> 内边接(inner join) 满足连接条件则返回一行;连接条件中有一列为空,则不返回
        2> 外连接(outer join) 满足连接条件则返回一行;连接条件中有一列为空,也返回
3> 自连接(self join)  返回连接到同一个表的行


    
    外连接:Oracle特有的外连接操作符是使用圆括号括起来的加号:(+),用空值来填充未匹配项;
        1> 左外连接: 外连接操作符是在等于操作符的右边
2> 右外连接: 外连接操作符是在等于操作符的左边
注:
  a> 不能在连接的两端使用外连接操作符
  b> 不能同时使用外连接条件与in操作符
  c> 不能同时使用一个外连接条件和另一个使用or操作符的连接条件


21. 使用SQL/92语法执行连接
    1> 对于内连接,可以使用inner join ... on 子句
    2> 对于内连接,并满足(查询是等连接且等连接中的列同名),则可以用using关键字简化连接
    例: SQL/86格式:  
             select p.name,pt.name 
    from products p, product_types pt 
    where p.product_type_id = pt.product_type_id  
    order by p.name;
         inner join ..。on格式: 
             select p.name,pt.name 
    from products p inner join product_types pt 
    on p.product_type_id = pt.product_type_id  
    order by p.name;
         using格式:
    select p.name,pt.name 
    from products p inner join product_types pt 
    using(product_type_id) 
    order by p.name;
    
    3> 对于外连接 from table1 {LEFT | RIGHT | FULL } OUTER JOIN TABLE2
         左外连接:
    select p.product_type_id,pt.product_type_id,p.name,pt.name
             from products p, product_types pt
             where  p.product_type_id = pt.product_type_id(+)
             order by p.name;
         右外连接:
             select p.product_type_id,pt.product_type_id,p.name,pt.name
             from products p, product_types pt
             where  p.product_type_id(+) = pt.product_type_id
             order by p.name;
全外连接:
    select p.product_type_id,pt.product_type_id,p.name,pt.name
             from products p full outer join product_types pt
             using (product_type_id)
             order by p.name;
    
    4> 交叉连接 使用 cross join
          SQL/86格式: select * from products,product_types ; 
 SQL/92格式: select * from products cross join product_types ; 
        


注:注意not in 与null时的特殊情况
    1:select * from customers where customer_id in (2,3,5); 
    2:select * from customers where customer_id not in (2,3,5); 
    3:select customer_id from customers where customer_id not in (2,3,5,null); 
    4:select customer_id from customers where customer_id not in (null); 


    对于1,2这两个语句都好理解,对于第3,4条语句,显示结果为空;
    3,4语句可以重写为:
    3==> select customer_id from customers where customer_id <>2 and customer_id <>3 and customer_id <>5 and customer_id <>null;
    4==> select customer_id from customers where customer_id <>null;
    解释: "not in ( 列表值1 [,列表值2,...] )" 在该条件的列表中,有一个为空值则判断结果是UNKNOW,结果不是true,where子句只认true,其他都不认,这样就不会有结果集返回了


   –如果null参与算术运算,则该算术表达式的值为null。(例如:+,-,*,/ 加减乘除)
   –如果null参与比较运算,则结果可视为false。(例如:>=,<=,<>  大于,小于,不等于)
   –如果null参与聚集运算,则聚集函数都置为null。除count(*)之外。
   -如果在not in子查询中有null值的时候,则不会返回数据。


   对于not in 遇到空值时出现的”陷阱“问题:
   1. 可以用nvl()函数,先处理数据;
   2. 使用not exists 替换处理
      in/not in 的结果是依赖于“=”等值判断的结果;
      exists/not exists 虽然是判断集合是否为空,但通常里面的子查询做的是值判断。
   3. 对于多表关联使用 LEFT OUTER JOIN 替换处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值