多表查询

数据库 waitig 451℃ 百度已收录 0评论
  1. 笛卡尔积产生的条件

    a.省略连接条件
        SELECT * FROM DEPT D,EMP E;
    b.连接条件无效
    c.所有表中的所有行互相连接
  2. 等值连接

    查询员工信息:员工号 姓名 月薪和部门名称
        SELECT E.EMPNO,E.ENAME,E.SAL,D.DNAME FROM EMP E ,DEPT D WHERE D.DEPTNO = E.DEPTNO;

    使用 表名前缀或表别名 可以在多个表中区分相同的列
    使用表的别名可以简化查询、提高执行效率、但不能再使用表的真名
    连接n个表,至少需要 n-1 个连接条件

  3. 不等值连接

    a.查询员工信息:员工号 姓名 月薪和工作级别
        SELECT E.EMPNO,E.ENAME,E.SAL,S.GRADE FROM EMP E,SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
    b.查询员工信息:员工号 姓名 月薪和部门名称
        SELECT E.EMPNO,E.ENAME,E.SAL,D.DNAME FROM EMP E ,DEPT D WHERE D.DEPTNO != E.DEPTNO;
  4. 外连接

    oralce、mysql通用:左外连接/右外连接
    查询员工信息:员工号 姓名 月薪和部门名称
        SELECT E.EMPNO,E.ENAME,E.SAL,D.DNAME FROM DEPT D LEFT JOIN EMP E ON D.DEPTNO = E.DEPTNO;
    oralce专用:外连接符号(+)
    a.查询员工信息:员工号 姓名 月薪和部门名称(包括没有员工的部门也可以显示)
        SELECT E.EMPNO,E.ENAME,E.SAL,D.DNAME FROM EMP E ,DEPT D WHERE D.DEPTNO(+) = E.DEPTNO;
    b.按部门统计员人数:部门号 部门名称和部门总人数
        SELECT D.DEPTNO 部门号,D.DNAME 部门名称,COUNT(E.EMPNO) 部门总人数
            FROM EMP E ,DEPT D WHERE E.DEPTNO(+) = D.DEPTNO GROUP BY D.DEPTNO,D.DNAME;
  5. 自连接

    查询员工信息:员工名称和员工的上级名称
        SELECT E.ENAME,B.ENAME FROM EMP E,EMP B WHERE E.MGR = B.EMPNO;
  6. 练习

    查询员工信息:员工姓名 员工部门名称 员工工资等级 员工领导名称 员工领导部门名称 员工领导工资等级
        SELECT E1.ENAME 员工名称,D1.DNAME 员工部门,
               CASE S1.GRADE
                   WHEN 1 THEN '一级'
                       WHEN 2 THEN '二级'
                           WHEN 3 THEN '三级'
                               WHEN 4 THEN '四级'
                                   ELSE '五级'
                                       END 员工工资等级,
               E2.ENAME 员工领导名称,D2.DNAME 员工领导部门,S2.GRADE || '级' 员工领导工资等级
        FROM EMP E1,EMP E2,DEPT D1,DEPT D2,SALGRADE S1,SALGRADE S2
        WHERE E1.DEPTNO = D1.DEPTNO AND E2.DEPTNO = D2.DEPTNO
              E1.SAL BETWEEN S1.LOSAL AND S1.HISAL AND E2.SAL BETWEEN S2.LOSAL AND S2.HISAL;

本文由【waitig】发表在等英博客
本文固定链接:多表查询
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)