数据库学习7- 子查询

子查询 
  sql操作的dml语句中出现嵌套了select语句,这个select语句就是子查询;
   总结:
  1.select子查询放在括号当中
  2.select、where、having的右边
  3.子查询可以嵌套
  4.子查询里不能有order by,外层的查询可以有order by
  5.单行比较运算符,多行比较运算符


  a.子查询分类
   2.1 单行子查询 返回单行单列
   2.2 多行子查询 返回一行记录以上
 
  b.关联子查询和非关联子查询
   
/**
  子查询:嵌套在dml(insert,update,delete,select)
           操作中的select语句
       1.出现在括号里的查询;
       2.子查询可以嵌套子查询
       3.子查询的位置可以在 select/from/where/having的右边    
*/
--分页查询
SELECT ROWNUM,e.* FROM emp e WHERE ROWNUM<8
   MINUS
SELECT ROWNUM,e.* FROM emp e WHERE ROWNUM<3;

SELECT * FROM
 (SELECT ROWNUM n,e.* FROM emp e)
 WHERE n>2 AND n<8;
 
SELECT * FROM
  (SELECT ROWNUM n,e.* FROM emp e WHERE ROWNUM<8)
 WHERE n>2; 
 
--子查询可以出现在select中
SELECT ename,
      (SELECT dname FROM dept d WHERE d.deptno = e.deptno)
   FROM emp e; 
 
--单行子查询:子查询返回的结果是单行单列
--单行比较操作:=,<>,>,<,>=,<=
--部门名称为SALES的员工信息
SELECT * FROM emp WHERE deptno=
  (SELECT deptno FROM dept 
     WHERE dname='SALES');

SELECT * FROM emp WHERE deptno IN
  (SELECT deptno FROM dept 
     WHERE dname='SALES');
     
--多行子查询: 
--多行比较运算:in, not in, exists,not exists,all,any    
--部门所在地在DALLAS和NEW YORK的员工信息  
SELECT * FROM emp WHERE deptno IN 
 (SELECT deptno FROM dept 
    WHERE loc = 'DALLAS' 
       OR loc = 'NEW YORK'); 

SELECT * FROM emp WHERE EXISTS        
  (SELECT * FROM dept 
    WHERE (loc = 'DALLAS' 
       OR loc = 'NEW YORK')
       AND emp.deptno = dept.deptno);
               
SELECT * FROM emp WHERE EXISTS        
  (SELECT * FROM dept 
    WHERE loc IN ('DALLAS', 'NEW YORK')
       AND emp.deptno = dept.deptno);
       
--大于部门20所有员工薪水的员工
-- >all 大于最大的
SELECT * FROM emp WHERE sal >ALL
 (SELECT sal FROM emp WHERE deptno = 20);
-- <all 小于最小的
SELECT * FROM emp WHERE sal <ALL
 (SELECT sal FROM emp WHERE deptno = 20);  
 
-- >any 大于最小的
SELECT * FROM emp WHERE sal >ANY
 (SELECT sal FROM emp WHERE deptno = 20); 

-- <any 小于最大的 
SELECT * FROM emp WHERE sal <ANY
 (SELECT sal FROM emp WHERE deptno = 20); 
 
--非关联子查询:子查询可以单独运行
--关联子查询: 子查询不可以单独运行 

/**
  如何选择in和exists?
  
  大表 in 小表
  小表 exsist 大表
*/      


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值