分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
--=========================
--SQL 基础--> 子查询
--=========================
/*
一、子查询
子查询就是位于SELECT、UPDATE、或DELETE语句中内部的查询
二、子查询的分类
单行子查询
返回零行或一行
多行子查询
返回一行或多行
多列子查询
返回多列
相关子查询
引用外部SQL语句中的一列或多列
嵌套子查询
位于其它子查询中的查询
三、子查询语法 */
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
/*
子查询(内部查询)在执行主查询之前执行一次
然后主查询(外部查询)会使用该子查询的结果
四、子查询的规则
将子查询括在括号中
将子查询放置在比较条件的右侧
只有在执行排序Top-N分析时,子查询中才需要使用ORDER BY 子句
单行运算符用于单行子查询,多行运算符用于多行子查询
五、单行子查询
仅返回一行
使用单行的表较运算符:= ,>, >= ,< , <= ,<>
在WHERE 子句中使用子查询 */
SQL> select ename,job from emp
2 where empno = (
3 select empno from emp
4 where mgr = 7902 );
ENAME JOB
---------- ---------
SMITH CLERK
--使用分组函数的子查询
SQL> select ename,job,sal
2 from emp
3 where sal >
4 (select avg(sal) from emp);
ENAME JOB SAL
---------- --------- ----------
JONES MANAGER 2975
BLAKE MANAGER 2850
CLARK MANAGER 2450
SCOTT ANALYST 3000
KING PRESIDENT 5000
FORD ANALYST 3000
--在HAVING子句中使用子查询
SQL> select deptno,min(sal)
2 from emp
3 group by deptno
4 having min(sal) >
5 (select min(sal)
6 from emp
7 where deptno = 20);
DEPTNO MIN(SAL)
---------- ----------
30 950
10 1300
--在FROM 子句中使用子查询
SQL> select empno,ename
2 from
3 (select empno,ename
4 from emp
5 where deptno = 20);
EMPNO ENAME
---------- ----------
7369 SMITH
7566 JONES
7788 SCOTT
7876 ADAMS
7902 FORD
--单行子查询中的常见错误
--子查询的结果返回多于一行
SQL> select empno,ename
2 from emp
3 where sal =
4 (select sal
5 from emp
6 where deptno = 20);
(select sal
*
ERROR at line 4:
ORA-01427: single-row subquery returns more than one row
--子查询中不能包含ORDER BY子句
SQL> select empno,ename
2 from emp
3 where sal >
4 (select avg(sal)
5 from emp
6 order by empno);
order by empno)
*
ERROR at line 6:
ORA-00907: missing right parenthesis
--子查询内部没有返回行,如下语句可以正确执行,但没有数据返回
SQL> select ename,job
2 from emp
3 where empno =
4 (select empno
5 from emp
6 where mgr = 8000);
no rows selected
/*
六、多行子查询
返回多个行
使用多行比较运算符IN ,ANY ,ALL
在多行子查询中使用IN 操作符 */
SQL> select empno,ename,job
2 from emp
3 where sal in
4 (select max(sal)
5 from emp
6 group by deptno);
EMPNO ENAME JOB
---------- ---------- ---------
7698 BLAKE MANAGER
7902 FORD ANALYST
7788 SCOTT ANALYST
7839 KING PRESIDENT
--在多行子查询中使用ANY 操作符
SQL> select empno,ename,job
2 from emp
3 where sal < any
4 (select avg(sal)
5 from emp
6 group by deptno);
EMPNO ENAME JOB
---------- ---------- ---------
7369 SMITH CLERK
7900 JAMES CLERK
7876 ADAMS CLERK
7521 WARD SALESMAN
7654 MARTIN SALESMAN
7934 MILLER CLERK
7844 TURNER SALESMAN
7499 ALLEN SALESMAN
7782 CLARK MANAGER
7698 BLAKE MANAGER
--在多行子查询中使用ALL 操作符
SQL> select empno,ename,job
2 from emp
3 where sal > all
4 (select avg(sal)
5 from emp
6* group by deptno)
EMPNO ENAME JOB
---------- ---------- ---------
7566 JONES MANAGER
7788 SCOTT ANALYST
7839 KING PRESIDENT
7902 FORD ANALYST
/*
七、相关子查询
子查询中使用了主查询中的某些字段,主查询每扫描一行都要执行一次子查询 */
--查询工资高于同一部门的员工的部门号,姓名,工资
SQL> select deptno,ename,sal
2 from emp outer
3 where sal >
4 (select avg(sal)
5 from emp inner
6 where inner.deptno
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow