连接查询

#连接查询
/**根据表连接的方式分类:
            内连接:
                    等值连接
                    非等值连接
                    自连接
                    
            外连接:
                    左外连接(左连接)
                    右外连接(右连接)
            
            全连接
*/
SELECT * FROM EMP;
SELECT * FROM DEPT;
#当两张表进行连接查询时,没有任何条件的限制,最终查询条件结果条数,是两张表条数的乘积,这就是笛卡尔积现象
#查询每个员工所在的部门名称。
SELECT ENAME,DNAME FROM EMP,DEPT;

#如何避免,连接查询时添加条件
SELECT 
    ENAME,DNAME 
FROM 
    EMP,DEPT
WHERE
    EMP.DEPTNO = DEPT.deptno
ORDER BY
    DNAME;
    
#表起别名,很重要,效率问题    
SELECT 
    e.ENAME,d.DNAME 
FROM 
    EMP e,DEPT d
WHERE
    e.DEPTNO = d.deptno
ORDER BY
    DNAME;
#最终查询条数显示是减少了,但是过程中匹配的次数没有减少。
#笛卡尔积现象表名,表的连接次数越多,效率越低,尽量避免。

#内连接之等值连接
#案例:查询每个员工所在部门名称,显示员工名和部门名?
#SQL92语法
SELECT 
    e.ename,d.dname
FROM
    EMP e,DEPT d
WHERE
    e.DEPTNO = d.DEPTNO
ORDER BY
    DNAME;
#SQL92的缺点,结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面

#SQL99语法:
SELECT
    e.ename,d.dname 
FROM
    EMP e
JOIN
    DEPT d
ON 
    e.DEPTNO = d.DEPTNO
ORDER BY
  DNAME;
    
#INNER 可以省略,加上的话可以看出是内连接.(可读性更好)
SELECT
    e.ename,d.dname 
FROM
    EMP e
INNER JOIN
    DEPT d
ON 
    e.DEPTNO = d.DEPTNO #条件是等量关系,所以被称为等值连接
ORDER BY
  DNAME;
#SQL99:表连接的条件是独立的,连接之后如果还需要进一步筛选,再往后继续添加where
#SQL99语法
SELECT
    ...
FROM
    ...
JOIN
    ...
ON
    a和b 的连接条件
WHERE
  筛选条件
    
#内连接之非等值连接
#案列:找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级。
SELECT 
    e.ENAME,e.sal,s.GRADE
FROM
    EMP e
JOIN
    SALGRADE s
ON
    e.SAL BETWEEN s.LOSAL AND s.HISAL #条件不是一个等量关系,称为非等值连接。
ORDER BY
    s.GRADE;

#内连接之自连接
#案列:查询员工的上级领导,要求显示员工名和对应的领导名。
SELECT  DISTINCT
    e.ENAME,m.ENAME HINAME
FROM
    EMP e
JOIN
    EMP m
ON
    e.MGR = m.EMPNO #员工的领导编号,等于领导的员工编号
ORDER BY
    ename;
#以上就是内连接中的:自连接,一张表看做两张表。

#内连接(A和B连接,AB两张表没有主次关系,平等的)
SELECT
    e.ENAME,d.DNAME
FROM
    EMP e
JOIN
    DEPT d
ON
    e.DEPTNO = d.DEPTNO; #内连接特点:就是完全能够匹配上这个条件的数据查询出来。
    
#外连接(右外连接)
SELECT
    e.ENAME,d.DNAME
FROM
    EMP e 
RIGHT OUTER JOIN #OUTER可以省略,带着可读性强
    DEPT d
ON
    e.DEPTNO = d.DEPTNO; 
#RIGHT 表示将JOIN关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表。
#在外连接当中,两张表连接产生了主次关系。

#外连接(左外连接)
SELECT
    e.ENAME,d.DNAME
FROM
    DEPT d  
LEFT OUTER JOIN #OUTER可以省略,带着可读性强 
  EMP e
ON
    e.DEPTNO = d.DEPTNO; 
#带有right的是右外连接,又叫右连接
#带有left的是左外连接,又叫左连接
#任何一个右连接都有左连接的写法
#任何一个左连接都有一个右连接的写法

#注意:外连接的查询结果条数一定是>=内连接的查询结果条数
#案列:查询每个员工的上级领导,要求显示所有员工的名字和领导们
SELECT
    e.ENAME,d.ENAME
FROM
    EMP e
LEFT JOIN
    EMP d
ON 
    e.MGR = d.EMPNO;
    
#三张表连接,四张表连接
/**语法:
            SELECT
                    ...
            FROM
                    a
            JOIN 
                    b
            ON
                a和b的连接条件
            Join
                o
            ON
                a和c的连接条件
            JOIN
                c
            ON
                a和c的连接条件
            RIGHT JOIN
                d
            ON
                a和d的连接
            
            一条SQL中内连接和外连接可以混合,都可以出现
*/
#案列:找出每个员工的部门名称以及工资等级,
#要求显示员工名、部门名、薪资、和薪资等级
SELECT
    e.ENAME,d.DNAME,e.SAL,s.GRADE
FROM
    EMP e
JOIN
    DEPT d
ON
    e.DEPTNO = d.DEPTNO
JOIN
    SALGRADE s
ON
    e.SAL BETWEEN s.LOSAL AND s.HISAL;
    
#案列:找出每个员工的部门名称以及工资等级,以及上级领导
#要求显示员工名、部门名、薪资、和薪资等级
SELECT
    e.ENAME,m.ENAME as MGRNAME,d.DNAME,e.SAL,s.GRADE
FROM
    EMP e
JOIN
    DEPT d
ON
    e.DEPTNO = d.DEPTNO
JOIN
    SALGRADE s
ON
    e.SAL BETWEEN s.LOSAL AND s.HISAL
LEFT JOiN
    EMP m
ON
    e.MGR = m.EMPNO;

 

posted @ 2021-10-20 15:13  钟心意  阅读(204)  评论(0)    收藏  举报