zoukankan      html  css  js  c++  java
  • 1.子查询知识体系,单行子查询,多行子查询

    

    1查询工资比scott高的员工信息

    A 第一步:查询出scott这个员工的工资

    select sal from emp

    where ename = 'SCOTT';

    B 第二步:查询出工资比scott高的员工信息           

    select * fromemp

    where sal >3000;

    总结:

    子查询的本质:多个select语句的嵌套

    2:子查询的知识体系搭建

    A 合理的书写风格

    B 子查询外面()不要忘记

    C 子查询和主查询能够查询的是同一张表,也能够不是同一张表

         仅仅要子查询返回的结果,主查询能够用就可以。

    D 在什么地方能够防止子查询

    select a,b,c                     ---OK,仅仅能存放单行子查询,不能使多行子查询

    from tab1                  ---OK 能够有子查询

    where col in(em1,em2)       ---能够有子查询

            col between a1 and a2

            col > 222

            col > ()

    group by …                 ---不能够有子查询

    having ….                  ---能够有子查询

    order by …                 ---不能够有子查询

    E 子查询的分类

    1.单行操作符相应单行子查询。多行操作符相应多行子查询。

    2.依照子查询返回的条目数。分为:单行子查询和多行子查询

    3.单行子查询仅仅能使用单行比較操作符(=  >   >=  <  <=  <>

    4.多行子查询仅仅能使用多行比較操作符(int any all

    3 单行子查询

    Eg:查询员工信息和141号工种一样的,薪水比143号员工工资高的员工

    SQL> conn hr/123456

    已连接。

    SQL> select last_name,job_id,salary

      2  FROM employees

      3  WHERE job_id =

      4                (SELECT job_id

      5                 FROM employees

      6                 WHERE employee_id = 141);

                   

     

    Eg:查询工资最低的员工信息

    select last_name,job_id,salary

    FROM employees

    WHERE salary =

                  (SELECT MIN(salary)

                   FROM employees);

     

    Eg:求各个部门编号和部门的最低工资(这个最低工资要比50号部门的最低工资要高)

    思路分析:看子查询 group by having条件检索 看检索对象

    //子查询:求50号部门的最低工资

    à检索 各部门的最低工资  50号部门的最低工资 大的部门号和部门最小工资

    SELECT department_id,MIN(salary)

    FROM employees

    GROUP By department_id

    HAVING MIN(salary) >

                       (SELECT MIN(salary)

                        FROM employees

                        WHERE department_id = 50);

    4  查询部门名称是SALES的员工信息(2中方式)

    方法1:子查询

    SELECT *

    FROM emp

    WHERE DEPTNO = (SELECT deptno

                    FROM dept

                    WHERE dname = 'SALES');

    方法2:多表查询

    SELECT e.*

    FROM emp e,dept d

    WHERE e.deptno = d.deptno and d.dname = 'SALES';

    注意:另外一种(多表查询的运行速度比子查询的运行速度快。由于多表查询是一次将数据读到内存中进行读取,消耗内存而加高速度)

          第一种(子查询要进行两次连接数据库的操作。连接数据库的操作是一个耗时操作,减低了速度)。

    5 select后面要查询的列中能够是单行子查询,不能够是多行子查询

    错误案例:

    select ename,empno,(select deptno from emp) AA from emp;

    正确案例:

    select ename,empno,(select deptno from emp where EMPNO = 7369) AA from emp;

    6 查询员工的姓名和薪水

    select *

    from (select ename,sal

         from emp);

    7 多行子查询

    多行子查询仅仅能使用多行比較操作符(in any all

        --eg 查询部门名称是*(不是)SALES ACCOUNTING 的员工信息  2种方法

              --eg 查询薪水 30号部门 随意一个员工薪高的员工信息

              -eg 查询薪水 30号部门 全部员工 高的员工信息

    查询部门名称是*(不是)SALES ACCOUNTING 的员工信息  2种方法

    select *

    from emp

    where deptno in

                  (select deptno

                   from dept

                   where dname = 'SALES' or dname = 'ACCOUNTING');

     

    操作符

    含义

    IN

    等于列表中的不论什么一个

    ANY

    和子查询返回的随意一个值比較

    ALL

    和子查询返回的全部值比較

    ANY

    SELECT employee_id,last_name,job_id,salary

     FROM employees

     WHERE salary < ANY

                      (SELECT salary

                       FROM employees

                       WHERE job_id = 'IT_PROG')

     AND job_id <> 'IT_PROC';

    ALL

    SELECT employee_id,last_name,job_id,salary

    FROM employees

    WHERE salary < ALL

                     (SELECT salary

                      FROM employees

                      WHERE job_id = 'IT_PROG')

    AND job_id <> 'IT_PROC'

     

    Eg: 30号部门 随意一个员工薪高的员工信息  大于集合中的最小值 any

    select *

    from emp

    where sal > all(select sal

                    from emp

                    where deptno = 30);

    等价于:

    select *

    from emp

    where sal > (select max(sal)

                from emp

                where deptno = 30);

     

    查询是经理的员工信息

    分析:

    SELECT *

    FROM emp

    WHERE empno in(经理的集合);

    实际:

    select *

    from emp

    where empno in

                 (

                  select mgr from emp

                 );

    select *

    from emp

    where empno not in

    (

    select mgr

    from emp

    where mgr is not null

    );

     

  • 相关阅读:
    多线程
    Java I/O简述
    Java集合
    Java常用类
    Java面向对象基础知识汇总
    Java标识符和关键字
    认识Java
    mvn打包源码和生成javadoc
    Http协议概述
    exe可执行程序及堆栈分配(转载)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5193739.html
Copyright © 2011-2022 走看看