• SQL 连接


    查询 :子查询(嵌套查询)
     


    连接查询

    1.什么是连接查询
    目前我们所接触的数据库都是关系型数据库,表和表之间存在关联关系,通常的业务需要我们多张表联合结合获取数据.
    这种多表联合获取数据的方式,叫做连接查询

    在实际开发的时候,通过单表获取数据的情况比较少见


    2.连接查询的分类
    -按照连接查询的方式分
    *内连接
    两张表进行连接查询,如果只查询两张表完全匹配的记录,那么这种查询方式叫内连接
    等值练级,非等值连接,自连接

    *外连接
    在内连接的基础之上(完全匹配),将其中一张表的数据全部显示出来,那么另外一张表肯定会有数据
    无法与其匹配,会自动模拟出空值,进行匹配,那么这种查询方式叫外连接

    左(外)连接,右(外)连接

    -按照连接查询的语法出现的年代分
    *SQL92
    *SQL99

    3.连接查询如果不加连接条件会出现什么情况?
    笛卡尔积

    4.如果避免笛卡尔积?
    连接的时候加上查询条件
    但是匹配的次数并没有减少

    5.案例:查询员工所在的部门,要求显示员工编号,员工姓名以及对应的部门编号和部门名称
    emp e员工表 dept d部门表

    -SQL92内连接中的等值连接
    select e.empno,e.ename,d.deptno,d.dname from emp e,dept d where e.deptno = d.deptno;

    -SQL99内连接中的等值连接 inner可以省略
    select e.empno,e.ename,d.deptno,d.dname from emp e (inner) join dept d on e.deptno = d.deptno;

    SQL92和SQL99的比较
    SQL92:连接条件和查询条件混合在一起,可读性差

    SQL99:连接条件和查询条件分开,语句更清晰


    6.案例:查询员工的工资对应的等级,要求显示员工的编号,员工姓名以及对应的工资等级
    emp e 员工表 salgrade s工资等级表

    -SQL92内连接中的非等值连接
    select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal;
    select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal>=s.losal and e.sal<=s.hisal;

    -SQL99内连接中的非等值连接
    select e.empno,e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;


    7.案例:查询员工对应的上级领导,要求要是员工的编号,员工姓名以及对应的上级领导的姓名
    emp e 员工表 emp m领导表

    -SQL92内连接中的自连接
    select e.empno,e.ename,m.ename from emp e,emp m where e.mgr = m.empno;

    -SQL99内连接中的自连接
    select e.empno,e.ename,m.ename from emp e join emp m on e.mgr = m.empno;


    8.案例:查询员工所在的部门,要求显示员工编号,员工姓名以及对应的部门编号和部门名称,要求:显示所有的部门
    emp e 员工 dept d部门

    任何一个左外连接都对应一个右外连接

    -SQL99外连接中的左外连接
    select e.empno,e.ename,d.deptno,d.dname from dept d left join emp e on e.deptno = d.deptno;

    -SQL99外连接中的右外连接
    select e.empno,e.ename,d.deptno,d.dname from emp e right join dept d on e.deptno = d.deptno;

    -SQL92外连接中的左外连接
    select e.empno,e.ename,d.deptno,d.dname from emp e,dept d where d.deptno = e.deptno(+);

    -SQL92外连接中的右外连接
    select e.empno,e.ename,d.deptno,d.dname from emp e,dept d where e.deptno(+) = d.deptno;

    9.案例:查询员工的上级领导,要求显示员工的编号,员工姓名以及对应的上级领导的姓名 要求:将所有员工显示出来

    -SQL99外连接中的左外连接
    select e.empno,e.ename,nvl(m.ename,'这是Boss') from emp e left join emp m on e.mgr = m.empno;


    10.多张表如何进行连接查询? a b c a->b a->c
    学生选课的设计
    学生表 t_student s
    id name
    ----------------------
    1 张三
    2 李四
    3 王五

    课程表 t_course c
    id name
    -----------------
    100 C++
    200 Java
    300 Jsp


    学生选课表 t_student_course_relation sc
    sid cid sid是一个外键,关联学生表中的主键;cid也是一个外键,关联课程表中的主键 sid+cid是联合主键
    ---------------------------------------------------
    1 100
    1 200
    1 300
    2 100
    2 300
    3 200

    要求:编写查询语句,将2号学生选的课程查询出来,显示学生的姓名,课程名称

    select
    s.name,c.name
    from
    t_student_course_relation sc
    join
    t_student s
    on
    s.id = sc.sid
    join
    t_course c
    on
    c.id = sc.cid
    where
    s.id = 2;

     

  • 相关阅读:
    数仓备机DN重建:快速修复你的数仓DN单点故障
    深度学习分类任务常用评估指标
    云小课 | MRS基础入门之HDFS组件介绍
    华为云数据库GaussDB(for Cassandra)揭秘第二期:内存异常增长的排查经历
    为什么vacuum后表还是继续膨胀?
    Go 自定义日志库
    Go time包
    Go 文件操作
    Go 包相关
    【程序人生】跟小伙伴们聊聊我有趣的大学生活和我那两个好基友!
  • 原文地址:https://www.cnblogs.com/2016-cxp/p/8654853.html
Copyright © 2020-2023  润新知