Sql/PLSql随记

一、形如 select  *  from  t1  where  col1 not  in  (select  col1_1  from  t2)的sql语句,如果t2表的col1_1中有空记录,则不会有返回结果。这应该是因为not  in  就相当于<>,即 where  1  not  in  (3,  null)  相当于  where  1  <>  3  and  1  <>  null,由于and后面的表达式1<>null是不成立的(同样1=null也不成立)所以where条件为假,结果选出的结果集就是零行

        这个问题有两种方式可以解决,

        其一是过滤子查询中的null记录,select  *  from  t1  where  col1 not  in  (select  col1_1  from  t2 where   col1_1  is  not  null)

        其二是使用not  exists,select  a.*  from  t1 a  where  not  exists  (select  null  from t2  where  col1_1  =  a.col1)

        第二种方式之所以会选出需要的结果集是因为exists和in比较方式的区别,在这里子查询中会将a.col1值和每个t2表的col1_1进行等于比较,因为any  =  null是不成立的,所以最后没有满足条件的记录,于是子查询之外的not  exists运算成立,所以可以取到需要的值

        换句话说其实很简单,就是null  =  any   和   null  <>  any 都是不成立的

网上搜了下更详细的信息,转了一个帖子 http://blog.csdn.net/RedPea/archive/2008/01/22/2059089.aspx

 

二、一些常用的DDL语句

1、修改表名

rename  oldtablename  to   newtablename;

在存储过程中使用,由于是DDL语句,需要使用动态SQL ,execute   immediate   'rename   oldtablename   to   newtablename'

 2、更改字段长度
alter   table   表名   modify(字段   varchar2(20),   字段   varchar2(50))

3、用plsql增加删除字段
ALTER TABLE TableName drop column ColumnName;  --删除
ALTER TABLE TableName ADD ColumnName NUMBER(10);  --增加

4、用plsql编译函数存储过程的方法
Alter ObjectType ObjectName Compile;

三、一些常用查询

 外键
select * from user_constraints where constraint_type = 'R'

执行一个由字符串组成的sql
execute immediate v_Sql


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值