zoukankan      html  css  js  c++  java
  • 6-子查询理解

    单行子查询

    1.查询工资比200号员工工资高的员工
    分析:
    比200号员工工资高,首先需要知道的是200号员工的工资,可以通过sql语句
    SELECT SALARY FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=200;得到
    然后需要的是写一条SQL语句:查询工资大于?的数据
    SELECT * FROM HR.EMPLOYEES WHERE SALARY > ?;
    一般而言?可以添加一个数字:例如
    SELECT * FROM HR.EMPLOYEES WHERE SALARY > 2000;
    而现在?需要的是200号部门的员工的工资值.
    
    理解:SELECT语句可以理解为Java中一个有Object返回值的函数,可以自动很多类型,可以为一个值,一个数组,一个集合
    例如存在这样一个函数int getSalFromEmployees(int empId);
    功能为根据员工ID从员工数据集合内获得某个员工的工资.最终返回的一个工资值
    SELECT语句此时就可以理解为一个具有number类型返回值的函数.
    ?处此时可以理解为调用了一个函数得到了200号员工的数据.
    最终这样一条SQL语句产生了,得到了想要的结果:
    SELECT * FROM HR.EMPLOYEES WHERE SALARY > 
           (SELECT SALARY FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=200);

    多行子查询

    2:了解多行子查询前需要知道的内容
    > < = >= <= <>的使用:
    在Java中,同样存在一些比较的运算符,例如>可以想到 1>2, 2<3, 2=2 此时是可以进行比较的,因为比较的都是数字,同样'a'=='a',
    之所以能够互相进行比较是因为运算符两遍的数据类型本质一致('a'==20也可以进行比较,因为比较时字符比较的是其编码,本质上也是一个整数),
    而'a' 不能与"a"进行比较,因为一个是char类型一个是String类型,类型不一致;
    再看1中的SQL语句:
    SALARY > (SELECT SALARY FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=200);
    之所以能够进行比较是因为SALARY是number类型,而后面的SELECT语句查询返回得到的结果也是一个number类型的数据;
    假如改成了SALARY > (SELECT HIRE_DATE FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=200);
    此时sql语句报错,ORA-00932:数据类型不一致: 应为NUMBER,但却获得DATE.>比较时两边的数据不一致.
    由此引发出了另外一个问题:
    与上面的SELECT语句相比,SELECT语句返回的可能不仅仅是一条记录,例如将上述的SQL语句改为
    SELECT * FROM HR.EMPLOYEES WHERE SALARY > (SELECT SALARY FROM HR.EMPLOYEES);
    再次执行会报错:ORA-01427: 单行子查询返回多个行.
    我们可以这样理解:SALARY是一个number类型的数据,而SELECT SALARY FROM HR.EMPLOYEES返回的查询结果
    是一个number[]类型的数据,number类型不能与number[]类型进行比较所以报错.
    
    为此Oracle提供了in,any,all这样的运算符用于单个记录与记录集的比较.
    
    例子:可能有这样一个需求:查询出比John薪水高的员工
    分析:要比John薪水高,首先需要知道的是John的薪水,可通过查询得到
    SELECT SALARY FROM HR.EMPLOYEES WHERE FIRST_NAME='John';
    此时上面的结果返回的是多条记录;
    而现在的需求是比John薪水高,而叫John不仅仅是一个人,此时需要进行的比较是将每个员工的工资
    与其中一个John的比,只要比某一个叫John的薪水高,那么这个人就符合查询的条件.
    这种情况是是一个数据一组数据的比较,在Java中可以举例为:
    int a = 10;
    int[] arr = {10, 20, 30, 40, 100};需要判断a数字是不是属于arr内的数据,我们需要进行的操作
    是将数字a与arr中的每一个数字进行比较,在Java中使用循环进行遍历.
    而在Oracle数据库中提供了更为遍历的比较方式:
    in:表示某一个数据属于某一个数据集合(等于其中一个)
    any,all用于别的运算符的比较,
    例如:
    =any 表示等于其中一个(等同于in);
    >any 表示大于其中一个;等同关系: (a>arr[1] || a>arr[2] || a>arr[3] || ...)
    >all 表示大于其中的所有数据;等同关系: (a>arr[1] && a>arr[2] && a>arr[3] && ...)

    多列子查询

    可以理解为
    (单行子查询结果1, 单行子查询结果2, 单行子查询结果3, ...) 
    也可是如同单行子查询使用运算符=,如同多行子查询使用运算符 in, any, all
  • 相关阅读:
    常用数据结构之哈希表
    常用数据结构之队列
    常用的数据结构之栈
    常用的数据结构之链表
    Zabbix3.4监控Windows机器CPU使用率
    在Pycharm中导入第三方模块库(诸如:matplotlib、numpy等)
    WARNING: You are using pip version 20.2.4; however, version 20.3.1 is available.
    npm无法安装node-sass的解决方法
    常见的树形结构封装
    Mac安装MySql
  • 原文地址:https://www.cnblogs.com/superstudy/p/5120066.html
Copyright © 2011-2022 走看看