高级子查询【weber出品必属精品】

  1. 多列子查询

    where条件中出现多列与子查询进行比较

    多列子查询分为:成对比较和非成对比较

    成对比较:

    SQL> select ename,sal,job from emp where (deptno,job) in(select deptno,job from emp where ename=‘SCOTT‘);
    
    ENAME    SAL JOB
    ------ ----- ---------
    FORD    3000 ANALYST
    SCOTT   4000 ANALYST

    非成对比较:

    select ename,sal,job from emp
     where deptno=(select deptno from emp where ename=‘SCOTT‘)
    and   job = (select job from emp where ename=‘SCOTT‘)
    
    ENAME    SAL JOB
    ------ ----- ---------
    SCOTT   4000 ANALYST
    FORD    3000 ANALYST
  2. 标量子查询表达式

    标量子查询是从一行中返回一列值的子查询

    标量子查询可用于:

    1. DECODE 和CASE的条件和表达式部分

    2. 除了GROUP BY之外的所有SELECT语句

    CASE表达式中使用标量子查询:CASE表达式可以实现if --then-- else的功能

    SQL> select employee_id,last_name,(      case             when department_id=(select department_id from departments where location_id=1800)             then ‘CANDA‘ else‘USA‘ end ) location       from employees;
    
    EMPLOYEE_ID LAST_NAME                 LOCAT
    ----------- ------------------------- -----
            198 OConnell                  USA
            199 Grant                     USA
            200 Whalen                    USA
            201 Hartstein                 CANDA
            202 Fay                       CANDA
            203 Mavris                    USA
            204 Baer                      USA
            205 Higgins                   USA
            206 Gietz                     USA
            100 King                      USA
            101 Kochhar                   USA
            .......................107 rows selected.
  3. ORDER BY子句中使用标量子查询

    SQL> select ename,sal,deptno from emp order by (select dname from dept where emp.deptno=dept.deptno);
    
    ENAME             SAL     DEPTNO
    ---------- ---------- ----------
    CLARK            2450         10
    KING             5000         10
    MILLER           1300         10
    JONES            2975         20
    FORD             3000         20
    ADAMS            1100         20
    SMITH             800         20
    SCOTT            3000         20
    WARD             1250         30
    TURNER           1500         30
    ALLEN            1600         30
    JAMES             950         30
    BLAKE            2850         30
    MARTIN           1250         30
    
    14 rows selected.
  4. 相互关联的子查询

    相互关联子查询用于行-执行-行的处理主查询的每一行子查询都要执行一次:通俗的说就是,主查询--->子查询--->主查询。就是这个执行顺序。

    ---从emp表中查询 薪水大于 部门平均薪水 的用户名,部门编号和薪水,没有大于的则不会被显示出来。select ename,deptno,sal
    from emp outer
    where sal>(select avg(sal) from emp inner where outer.deptno=inner.deptno );
    
    ENAME  DEPTNO   SAL
    ------ ------ -----
    ALLEN      30  1600
    JONES      20  2975
    BLAKE      30  2850
    SCOTT      20  4000
    KING       10  5000
    FORD       20  3000
  5. 再举一个相互关联的例子

    ---查询至少换了两次工作的员工---SQL> select employee_id,last_name,job_id from employees e where 2<=(select count(*) from job_history j where e.employee_id=j.employee_id);
    
    EMPLOYEE_ID LAST_NAME                 JOB_ID
    ----------- ------------------------- ----------
            200 Whalen                    AD_ASST
            101 Kochhar                   AD_VP
            176 Taylor                    SA_REP
  6. 使用EXISTS

    EXISTS 检测子查询中行的存在性

    1.如果值存在于子查询中:
       终止在子查询中的查找
       条件返回TRUE

    2.如果值不存在于子查询中:
       条件返回FALSE
       继续在子查询中的查找

    ---示例:查找是领导的员工SQL> select empno,ename from emp outer where  exists(select mgr from emp inner where outer.empno=inner.mgr);
    
         EMPNO ENAME
    ---------- ----------
          7566 JONES
          7698 BLAKE
          7782 CLARK
          7788 SCOTT
          7839 KING
          7902 FORD
    
    6 rows selected.

    另一种写法:

    SQL> select empno ,ename from emp  where empno in(select mgr from emp);
    
         EMPNO ENAME
    ---------- ----------
          7566 JONES
          7698 BLAKE
          7782 CLARK
          7788 SCOTT
          7839 KING
          7902 FORD
    
    6 rows selected.
  7. 我们来做另一个实验:查找不是领导的员工,也就是最基层的员工了。

    SQL> select empno,ename from emp outer where not exists (select 1 from emp inner where outer.empno=inner.mgr);
    
         EMPNO ENAME
    ---------- ----------
          7369 SMITH
          7499 ALLEN
          7521 WARD
          7654 MARTIN
          7844 TURNER
          7876 ADAMS
          7900 JAMES
          7934 MILLER
    
    8 rows selected.---这里解释一下:not exists里的整数1的作用,只要是个整数即可,‘abc’字符串也可以。

高级子查询【weber出品必属精品】

时间: 2024-10-11 16:23:28

高级子查询【weber出品必属精品】的相关文章

使用DML语句【weber出品必属精品】

DML语句包含以下语法: INSERT:往一个表中增加新行 DELETE:从一个表中删除掉现有的行 UPDATE:更改一个表中现有的行 INSERT语句语法:INSERT INTO TABLE(COLUMN1,COLUMN2,....) VALUES(VAL1,VAL2,...)使用这种方法只能一次插入一行数据 插入包含每一个列值的新行,按缺省顺序列出表中所有的列值. 创建带有结构的空表 SQL> create table t as select * from emp where 1=2;---

静默安装ORACLE【weber出品必属精品】

由于本次的实验我是将上次的虚拟机直接拷贝过来,然后将里面图形化界面安装好了的oracle给删除,再次重新安装,所以这里要修改一些配置. 首先修改的是我们的IP地址 # system-config-network 完成后我们修改一下hosts文件,将里面的ip地址给修改一下 # vi /etc/hosts 接着我们删除上次安装过的ORACLE文件 # cd $ORACLE_BASE # ls # rm -rf * 进入root:rm -rf /etc/ora* 还是在安装前进行配置. 接下来进行静

ORACLE SQL单行函数(二)【weber出品必属精品】

11.dual:虚表,任何用户都可以使用,表结构如下: SQL> desc dual Name Null? Type ----------------------------------------- -------- ---------------------------- DUMMY VARCHAR2(1) 12.dual的作用: 1. 查询数据库系统日期 2. 进行四则运算 SQL> select sysdate from dual; ---这里查询数据库系统日期 SYSDATE ---

全世界最详细的图形化VMware中linux环境下oracle安装(一)【weber出品必属精品】

安装流程:前期准备工作--->安装ORACLE软件--->安装升级补丁--->安装odbc创建数据库--->安装监听器--->安装EM <前期准备工作> 安装配置系统环境安装linux ,所有服务都不选择,只是选择安装开发工具,不要安装防火墙(当然也可以在后面关闭) 打开终端,执行如下命令,检查安装包,没有的都要安装 make, glibc, libaio compat-libstdc++, compat-gcc-34, compat-gcc-34-c++, gc

创建和管理表【weber出品必属精品】

创建表 必须有 : 1. CREATE TABLE 的权限 SQL> conn /as sysdba 已连接. SQL> create user test default tablespace users identified by a; 用户已创建. SQL> conn test/a ERROR: ORA-01045: user TEST lacks CREATE SESSION privilege; logon denied 警告: 您不再连接到 ORACLE. SQL> co

oracle数据库事务相关【weber出品必属精品】

事务的概念:事务:一个事务由一组构成一个逻辑操作的DML语句组成 事务有开始有结束,事务以DML语句开始,以Conmmit和Rollback结束.以下情况会使得事务结束: 1. 执行COMMIT 或者 ROLLBACK 语句 2. 执行DDL或者 DCL语句 3. 用户退出 4. 系统崩溃 一个事务可以包含下列语句: 1. 对数据做出一致性修改的DML语句 2. 一个 DDL 语句 3. 一个 DCL语句 DDL与和DCL语句执行的过程: 1. 首先发出COMMIT; 2. 执行对数据字典的DM

LAMP架构搭建+Discuz论坛搭建【weber出品必属精品】

一.     本机简介: 本机系统: CentOS-6.4-x86_64 主机名:oracle.ywb IP地址:192.168.146.129 二.     在Linux环境下安装Apache步骤 首先将准备好的文件通过PSCP发送至Linux的/Root/test/soft目录下 在windows下按住Ctrl+R,打开运行,输入CMD进入DOS命令行.在dos命令行中使用pscp –scp  命令将要上传的文件上传至Linux中. 上传成功后.我们总共要安装四个文件.第一个我们首先解压:a

linux删除ORACLE【weber出品必属精品】

关闭数据库 sqlplus / as sysdba shutdown abort 清除oracle软件 su - oracle cd $ORACLE_BASE rm -rf * rm -rf /etc/ora* 删除之前的设置的配置文件的内容 如果之前改过版本,编辑文件 /etc/redhat-release 把Red Hat Enterprise Linux Server release 4 (Tikanga) 改成版本5 vi /etc/pam.d/login 行末删除以下内容 sessio

ORACLE SQL单行函数(一)【weber出品必属精品】

1.SUBSTR:求父串中的子串 SUBSTR('HelloWorld',1,5) 1:代表子串的起始位置,如果为正,正数,如果为负,倒数 5:代表字串的终止位置,只能向右数,可以省略,如果省略就是数到最后 SUBSTR:求父串中的子串 SUBSTR('HelloWorld',1,5) 1:代表子串的起始位置,如果为正,正数,如果为负,倒数 5:代表字串的终止位置,只能向右数,可以省略,如果省略就是数到最后 2.LENGTH:求字符串的长度 SQL> select LENGTH('HELLOWO