• 多表查询 笔记


    目录

    多表查询

     自连接

    子查询

    (单行子查询)

    多行子查询

    子查询临时表

     all和any

    多列子查询

    表复制 

    合并查询

     表外连接查询


    多表查询

     解决多表查询的关键就是过滤出要显示的列 where语句进行过滤

    举例

    -- 显示雇员名,雇员工资和所在部门的名字 

    1. -- 当需要指定显示某个表的列是,需要 表.列名
    2. SELECT ename,sal,dname,dept.deptno
    3. FROM emp, dept
    4. WHERE emp.deptno = dept.deptno

    -- 显示部门号为10的部门名,员工名,和工资 

    1. SELECT dname,ename,sal,dept.deptno
    2. FROM dept,emp
    3. where emp.deptno = dept.deptno and dept.deptno = 10

     -- 显示各个员工的姓名,工资和工资的级别

    1. SELECT ename,sal,grade
    2. FROM emp,salgrade
    3. WHERE sal BETWEEN losal AND hisal

     自连接

    自连接是指在同一张表的连接查询【将一张表看做两张表】

     思考:显示公司员工和他的上级名字

    -- 自连接 要给表取别名
    -- 显示员工名字和他的上级 把emp表当两个表使用()

    1. SELECT worker.ename 职员名,boss.ename boss名
    2. FROM emp worker,emp boss
    3. WHERE worker.mgr = boss.empno

    子查询

     

    (单行子查询)

    -- 如何显示与smith同一个部门的所有员工 

     --         1.先得到与smith的部门

    1. SELECT deptno
    2. FROM emp
    3. WHERE ename = 'SMITH'

    --    2.把上面的sql语句当作一个子查询来使用

    1. SELECT * FROM emp
    2. WHERE deptno = (SELECT deptno
    3. FROM emp
    4. WHERE ename = 'SMITH')

    多行子查询

    -- 如何查询和部门10的工作相同的雇员的 名字,岗位,工资,部门号,但不包括10自己的

    1. SELECT ename,job,sal,deptno
    2. FROM emp
    3. WHERE job in (SELECT job FROM emp
    4. WHERE deptno = 10) AND deptno != 10 

    子查询临时表

    1. -- 子查询临时表
    2. -- 查询emp表中各个部门工资最高的员工
    3. -- 1.先求出各个部门的最高工资,把他当成一张临时表 max_sal
    4. SELECT deptno,MAX(sal) max FROM emp
    5. GROUP BY deptno
    6. -- 员工信息
    7. SELECT ename,job,sal,emp.deptno
    8. FROM(SELECT deptno,MAX(sal) max FROM emp
    9. GROUP BY deptno) max_sal,emp
    10. where max_sal.deptno = emp.deptno AND max_sal.max = emp.sal

     all和any

    1. -- all和any
    2. -- 显示工资比部门30所有员工工资都要高的员工信息
    3. -- 1.部门30工资最高的人
    4. SELECT MAX(sal) FROM emp WHERE deptno = 30
    5. -- 方法1,子查询
    6. SELECT ename,job,sal,deptno FROM emp
    7. WHERE sal > (SELECT MAX(sal) FROM emp WHERE deptno = 30)
    8. -- 方法2 all
    9. SELECT ename,job,sal,deptno FROM emp
    10. where sal>ALL(SELECT sal from emp WHERE deptno = 30)
    11. -- 显示工资比部门30的其中一个员工工资高的人
    12. -- any方法,或者用用工资>30部门工资最低的那个员工
    13. SELECT ename,job,sal,deptno FROM emp
    14. WHERE sal >ANY(SELECT sal FROM emp WHERE deptno = 30)

    多列子查询

     -- 得到与smith的部门和岗位完全相同的所有雇员信息,包括smith自己

    1. -- 多列子查询
    2. -- 1.得到smith的部门和岗位
    3. SELECT deptno ,job FROM emp
    4. WHERE ename = 'SMITH'
    5. -- 2.把上面的语句单子查询语句并使用多列查询
    6. SELECT * FROM emp
    7. WHERE (deptno,job) = (SELECT deptno ,job FROM emp
    8. WHERE ename = 'SMITH')

    表复制 

     演示如何自我复制表

    1. -- 1.先创建一个空表
    2. CREATE TABLE mytable(
    3. id INT,
    4. `name` VARCHAR(20),
    5. `sal` INT,
    6. `job` VARCHAR(10),
    7. deptno int)
    8. -- 将emp表的数据复制过来 使用insert语句
    9. INSERT INTO mytable
    10. (id,`name`,sal,job,deptno)
    11. SELECT empno,ename,sal,job,deptno FROM emp
    12. -- 查询mytable
    13. SELECT * FROM mytable

    演示如何删除表中的重复数据

    1. -- 删除mytable表中的重复记录
    2. -- 1.先创建一个临时表 tmp该表的结构和mytable一样
    3. CREATE TABLE tmp LIKE mytable
    4. -- 2.mytable 的记录,通过distinct关键字 处理后 ,把记录复制到tmp
    5. INSERT INTO tmp
    6. SELECT DISTINCT * FROM mytable
    7. -- 3.清楚mytable表中的数据
    8. DELETE FROM mytable
    9. -- 4.把临时表的数据复制到mytable中,并删除临时表
    10. INSERT INTO mytable
    11. SELECT * FROM tmp;
    12. DROP TABLE tmp

    合并查询

    SELECT ename,sal,job FROM emp WHERE sal>2500 -- 5

    SELECT ename,sal,job FROM emp WHERE job = 'MANAGER' -- 3

     

    如果要将两个查询结果合并起来 可以通过union all或者union

    union all 不会去重

     union会去重

     

     表外连接查询

    -- 列出部门名称和这些部门的员工名称和工资,同时要求显示出那些没有员工的部门

    用之前多表查询的sql 通过两表的deptno进行连接效果如下

     因为编号为40的部门没有与员工,所有没显示,这不能解决问题,故应使用表外连接

    练习

    1. -- 左外连接
    2. SELECT dname ,ename,job
    3. FROM dept LEFT JOIN emp
    4. ON dept.deptno = emp.deptno;
    5. -- 右外连接
    6. SELECT dname ,ename,job
    7. FROM emp RIGHT JOIN dept
    8. ON dept.deptno = emp.deptno;

     

     本质上左右连接都是一样的,要确认是哪张表没有的需要显示,然后根据位置在左还是在右选择左右连接

  • 相关阅读:
    基于Oracle数据库高校学生宿舍管理系统
    基于springboot实现问卷调查系统项目【项目源码+论文说明】计算机毕业设计
    手写 Promise(2)实例方法与静态方法的实现
    Python测试框架之Pytest基础入门
    信息服务上线渗透检测网络安全检查报告和解决方案4(XSS漏洞修复)
    【23种设计模式】桥接模式(七)
    Wireshark抓包工具解析HTTPS包
    Android 10.0 SystemUI启动流程
    i18n国际化配置文件配置步骤
    在企业微信里面添加h5页面 进行登录授权
  • 原文地址:https://blog.csdn.net/hagong9/article/details/126172665