单行和多行子查询
单行和多行子查询
--子查询(单行子查询,多行子查询)
--查询比"CLARK"工资高的员工的信息?
--[1]'CLARK'的工资是多少?
SELECT SAL FROM EMP WHERE ENAME ='CLARK'; --2450
--[2]比2450高的员工信息
SELECT * FROM EMP WHERE SAL >2450;
----子查询:
--将一个查询的结果作为另外一个查询的条件来使用
SELECT * FROM EMP WHERE SAL >(SELECT SAL FROM EMP WHERE ENAME ='CLARK');
语法:
SELECT 字段列名 FROM 表名
WHERE 条件 比较符 (SELECT * FROM 表名);
-- 特点:
--子查询在主查询前执行一次
--主查询使用子查询的结果
--【1】子查询可以作为另外的一个查询的条件来使用
--查询工资高于平均工资的雇员的名字和工资
--[1]平均工资
SELECT AVG (SAL) FROM EMP;
SELECT ENAME ,SAL
FROM EMP
WHERE SAL >( SELECT AVG (SAL) FROM EMP)
ORDER BY SAL;
--查询和SCOTT同一部门且比他工资低的雇员的名字和工资
--'SCOTT'在哪个部门?
SELECT DEPTNO FROM EMP WHERE ENAME ='SCOTT'; --20
--'SCOTT'的工资?
SELECT SAL FROM EMP WHERE ENAME ='SCOTT'; --3000
SELECT ENAME,SAL
FROM EMP
WHERE DEPTNO = ( SELECT DEPTNO FROM EMP WHERE ENAME ='SCOTT')
AND SAL<(SELECT SAL FROM EMP WHERE ENAME ='SCOTT');
--注意:子查询的字段不能多于一个,只能有一个
--【2】子查询可以作为insert语句的值来使用
--今天新入职一个员工,与'SCOTT'同一个部门
INSERT INTO EMP (EMPNO,ENAME,DEPTNO,HIREDATE)
VALUES
(1001,'码上成功',
(SELECT DEPTNO FROM EMP WHERE ENAME ='SCOTT'),SYSDATE);
SELECT * FROM emp;
--【3】子查询可以作为update的条件或修改的值来使用
--将 ‘新员工’ 的工作修改为与‘SMITH’的工作相同
--[1]smith的工作
SELECT job FROM EMP WHERE ENAME = 'SMITH';
UPDATE EMP
SET JOB =( SELECT job FROM EMP WHERE ENAME = 'SMITH')
WHERE ENAME = '成功';
--将比FORD工资低的员工都加1000块钱
--[1]'FORD'的工资是
SELECT SAL FROM EMP WHERE ENAME = 'FORD';
UPDATE EMP SET SAL =SAL+1000
WHERE SAL<(SELECT SAL FROM EMP WHERE ENAME = 'FORD');
SELECT * FROM EMP;
--【4】子查询可以作为delete的条件使用
--比FORD工资高的都删除
DELETE EMP
WHERE SAL >(SELECT SAL FROM EMP WHERE ENAME = 'FORD');
--【5】子查询的结果可以作为一个表来使用
SELECT EMPNO AS 经理编号,ENAME AS 经理姓名 FROM EMP;
--查询员工的编号,姓名,经理姓名
SELECT E.EMPNO 员工编号,E.ENAME 员工姓名 ,M.经理姓名
FROM EMP E,( SELECT EMPNO AS 经理编号,ENAME AS 经理姓名 FROM EMP) M
WHERE E.MGR = M.经理编号(+); --92标准
SELECT E.EMPNO 员工编号,E.ENAME 员工姓名 ,M.经理姓名
FROM EMP E LEFT JOIN
( SELECT EMPNO AS 经理编号,ENAME AS 经理姓名 FROM EMP) M
ON E.MGR = M.经理编号; --99
--多行子查询
--子查询的结果返回是 多行数据
--all:和子查询返回的所有值比较
--any:和子查询返回的任意一个值比较
--in :等于列表中的任何一个
--查询工资低于任何一个“CLERK”岗位的工资的雇员信息。
--查询CLERK这个职位的工资是多少? 1300
SELECT SAL FROM EMP WHERE JOB = 'CLERK';
SELECT MAX(SAL) FROM EMP WHERE JOB = 'CLERK';
SELECT * FROM EMP
WHERE SAL <(SELECT MAX(SAL) FROM EMP WHERE JOB = 'CLERK');
SELECT * FROM emp;
SELECT * FROM EMP
WHERE SAL < ANY (SELECT SAL FROM EMP WHERE JOB = 'CLERK');
--查询工资比所有的'SALESMAN'职位都高的雇员的编号,名字和工资
--[1]'SALESMAN'工资都是多少?
SELECT SAL FROM EMP WHERE JOB = 'SALESMAN';
SELECT EMPNO,ENAME,SAL
FROM EMP
WHERE SAL >ALL (SELECT SAL FROM EMP WHERE JOB = 'SALESMAN') ;
--查询部门20中的职务同部门10的雇员一样的雇员信息.
--[2]部门10是什么职务
SELECT JOB FROM EMP WHERE DEPTNO = 10;
SELECT * FROM EMP
WHERE JOB IN(SELECT JOB FROM EMP WHERE DEPTNO = 10)
AND DEPTNO = 20;
--查询在雇员中那些是经理人
--查询经理人的编号
--查询每个部门平均薪水的等级
--小结:
--[1]多表连接查询 --92标准
--等值连接查询 -->两个表之间,存在主外键关系
--非等值连接 -->两个表之间没有直接关系 >= ,<= .....
--以上两个查询,参与查询的表是平级关系
--左外连接,右外连接 --参与查询的两个表之间有主次之分
--[2]多表连接查询--99标准
--交叉连接 croos join -->笛卡尔积
--自然连接 natural join
-->相当于等值连接(前提是两个参与表中有同名列,要求同名列类型完全一致)
--using连接
-->参与查询的两个表中多个同名列,使用using制定使用特定的列进行连接
--inner join ....on...where --等值连接
--左外链接 left join
--右外连接 right join
--全连接 full join
--[3] 单行子查询
--子查询的结果是单行单列
--使用>=,<=,=,<,>,<> 进行where后的条件判断
--[4]多行子查询
--子查询的结果是多行单列的
--使用 any :任意一个 , all(全部), in(等值)