sql语句复习(一)
再次看下sql语句,感觉还有些陌生,索性做一个整理。
1.两表关联时显示所有记录,select e.* , d.* from e ,d where e.id(+) = d.id
如select e.* , d.* from e ,d where e.id = d.id,执行结果会是,将e与d表中id一致的对象所有信息列出来,大多数情况下我们会用到此法。但实际可能存在如下情况,e代表员工表,d代表公司部门表,有些部门刚刚成立,还没有员工,这个时候,如上sql语句执行的结果中只包含有员工的部门信息。若要将所有部门信息列出,稍微修改即可,即select e.* , d.* from e ,d where e.id(+) = d.id,此句会列出所有部门的信息。如要统计暂未有人员的部门,则可加上一个条件,select e.* , d.* from e ,d where e.id(+) = d.id and e.id is null,就会列出暂未有人员的部门信息。
2.查询语句中值区分大小写
如s表中name值为A,若查询时where子句为name='a',则查询为空;
3.rownum和rowid
两者都是伪列,但是两者完全不同,rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同也就会导致最终rownum不同,但是rowid是物理结构上的,在每条记录insert到数据库中时,都会有一个唯一的物理记录。
rownum只能使用<=或<关系比较运算符。
如,select * from (select rownum rn, a.* from emp a) t where t.rn between 2 and 10; 可以查找范围2到10的数据;
如,delete from employee where rowid not in (select max(t1.rowid) from employee t1 group by t1.emp_id);可删除重复记录;
对于空间数据表,若存在重复记录,可使用此法。
如,delete from stu a where rowid not in (select max(rowid) from stu b where a.name = b.name and a.id< b.id); 删除名称重复但id不同的记录;
4.求两表的差集
现有A和B两表,若两表有关联字段,需将A表中有但B表中没有的记录插入B表,操作可如下:
create table a_minus_b as select * from a minus select * from b ;
insert into b(fld1, fld2) select * from a_minus_b;