发布新日志

  • 复杂的sql

    2013-12-18 17:39:33

    §7.1   复杂查询语句的使用

    使用SELECT语句和子查询(SUBQUERY)可以从一个或多个表、视图、实体视图中返回数据。

    §7.1.1  相关子查询

        可以将子查询(前面提到的 as subquery )或In exists当成 where 的一个条件的一部分,这样的查询称作子查询。

     

    l  where中可以包含一个select语句子查询;

    l  where中可以包含IN, EXISTS 语句;

    l  最多可嵌套16层;

    l  层数过多会影响性能。

     

    例:比如一个查询是否有专家既以研究所的名义申请基金项目又以大学系为单位申请项目(按规定只能以一个单位来申请):

     

    SQL>select name,per_id,dept_name from univ_subjects

    Where per_id in  ( select  per_id  from colle_subjects );

     

    §7.1.2  外连接

        招生中,如果所有学生的信息放在 students 表中,而部分有特长的学生在另一个表student_skill 中同样有该学生信息。现在要全部列出所有学生,如果某个学生在表student_skill 中有其特长信息,就显示特长内容,如果某个学生没有特长(在表student_skill 中无其特长信息)就显示特长为空:

    SQL>select a.st_id, name, age,skill from students  a, student_skill b

    Where a.st_id=b.st_id(+)

    Order by a.name;

     

    Students 结构为:

    St_id  varchar(20),

    Name varchar2(10),

    Age   number(2),

    Tot_score   number(3),

    ... ...

     

    Student_skill 结构为:

    St_id  varchar(20),

    Skill   varchar2(20),

    ... ...

    Students 的记录,Student_skill的记录少。上面的“+”跟在记录少的表后面,它表示当没有与a.st_id 匹配时就为 b.st_id增加一空行。

    +号在左边表示右关联,在右边表示左关联

     

    St_id          name          tot_score    skill

    ----------  ----------    -------------  ------------------

    1111     aaaa        600               足球

    2222     bbbb        590               篮球

    3333     cccc        620                    

    4444     dddd        610               跳高

    ...  ...

     

    §7.1.3  自我连接

    自我连接是在同一个表或视图内进行条件连接。下面语句返回的是每个雇员的名字及该雇员的经理的名字:

     

    SELECT e1.ename||’ works for ’||e2.ename

    "Employees and their Managers"

    FROM emp e1, emp e2 WHERE e1.mgr = e2.empno;

     

    Employees and their Managers

    -------------------------------

    BLAKE works for KING

    CLARK works for KING

    JONES works for KING

    FORD works for JONES

    SMITH works for FORD

    ALLEN works for BLAKE

    WARD works for BLAKE

    MARTIN works for BLAKE

    SCOTT works for JONES

    TURNER works for BLAKE

    ADAMS works for SCOTT

    JAMES works for BLAKE

    MILLER works for CLARK

     

    连接条件是 e1.mgr = e2.empno

     

     

    §7.1.4  UNION,INTERSECTMINUS

    有时需要从多个表中组合具有一种相似类型的信息。Union 可以完成将两个以上的表的相类似的查询结果合并在一起,并且相同的只取其一;如果union all 则表示返回所有行(不管是否重复)。Intersect返回在两个表中都有相同内容的信息。Minus 则返回只在一个表中出现的信息。

     

    1. 语法:

    select ...

    union[all]

    select ...

     

    select ...

    intersect

    select ...

     

    select ...

    minus

    select ...

     

    例:

    sql>

       select sum(balance) into lf_return from

         (

    select sum(nvl(tran_val,0)*decode(db_cr_flag,'1',1,'0',-1,0) ) balance

             from per_fix_det

             where acc_no=as_acc_no

           union all

    select sum(nvl(tran_val,0)*decode(db_cr_flag,'1',1,'0',-1,0) ) balance

              from per_detail

              where acc_no=as_acc_no

         );

     

    列出有特长的考生(在表students,student_skill 同时出现):

    sql>select name from sutdents

          intersect

         select name from  student_skill;

     

    列出没有特长的考生(仅在表students出现):

    sql>select name from sutdents

          minus

         select name from  student_skill;

  • group by... having

    2013-12-18 16:25:10

    1.以用 GROUP By 来实现对一组数进行分组统计(如SUM,count(*) 等),如:

     

    要列出部门代码、部门人数,部门工资总和,则用到GROUP BY

     

    SQL> select deptno,count(*) ,sum(sal) from emp group by deptno;

     


    2.在分组GROUP BY 中,一般都不管 统计的结果是多少都要全显示,我们可以在GROUP BY 前或后加 HAVING 子句来限制结果的统计,比如要求被统计的人数有5个人以上,则有两方法可以实现:

     

    SQL> select deptno,count(*) ,sum(sal) from emp group by deptno

      having count(*)>=5;

    或者

    select deptno,count(*) ,sum(sal) from emp having count(*)>=5 group by deptno

    没有包含聚合函数的,having 条件要放在group by 后面


    聚合函数指:

      

     



     

     

     

  • SQL 语句

    2012-07-04 11:48:41

    select * from hrb_today_news order by id desc limit 1 查数据库表最后一条数据
Open Toolbar