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;  

原文地址:https://www.cnblogs.com/emily_fly/p/2403557.html