• 多表连接查询


    注: 所谓连接, 指的是把两张表的字段“连接”起来, 放在一个结果集里,即连接的是两张表的字段!

    有三张表,person_info学生信息;class_schedule选课信息;class_size班级人数。

    如下:

    image

    格式:

    SELECT table_name1.field1 table_name2.field1 … FROM table_name1 JOIN_TYPE table_name2 ON 连接条件

    一、内部连接。(只输出相同字段中的匹配记录)

    意义:只有两个表相匹配的行才能在结果集中出现 。

    问题:对person_info和class_size表,内连接查找学生姓名对应的班级人数。

    分析:zhangsan是个奇葩,TA不属于任何班级,即表class_size里没有行和TA匹配,因此zhangsan这一行是不会出现在结果集里的;同理class_size里的class 3班也没有学生与之匹配,因此可以预见结果集里有两行lisi和wangwu.

    这里的内连接即,先找到person_info和class_size表中相同的字段class,再输出字段class中相匹配的1和2,如下图:

     

    解答:

    INNER JOIN:

    image

    当然,where也可实现上面的结果:

    image

    小技巧,若表名多次被用到,可以使用别名简化:

    image 

    二、左外连接。

    意义:左表全部输出,然后输出右表与左表想匹配的行。

    问题:查找person_info表中学生所在班级的人数,虽然zhangsan不属于任何班级,也要输出

    TA。

    解答:

    image

    三、右外连接。

    意义:右表全部输出,然后输出左表与右表想匹配的行。

    问题:输出class_size的班级人数,以及1,2,3个班级的学生姓名。

    解答:

    image

    完全外连接FULL OUTER JOIN。

    四、自连接。

    是一张表!把一个表的某一行与同一表中的另一行连接起来。

    如我们想在person_info表中找出和zhangsan相同gender的学生。

    当然可以用子查询复合语句完成,如下:

    image

    也可用自连接(相比子查询更高效)完成,如下:

    image

    五、自然连接。

    有时候连接查询会出现重复的列,如上面的内部连接改为下面就会出现重复的列:

    image

    如何消除重复的列呢,没什么高招,只有手动消除了(一般是对一张表使用通配符,其他表的列使用明确的子集),改为下面的语句就行了:

    image

  • 相关阅读:
    Django的路由层 路由控制之有名分组
    Django的路由层 路由控制之简单配置
    django 静态文件配置
    基于Django实现的一个简单示例
    Java线程池Executor
    Java 多线程Thread
    Java 异常
    Elementary OS 使用fcitx安装搜狗词库、搜狗输入法(Ubuntu通用)
    Elementary OS常见软件(TIM、微信、企业微信)安装(二)
    dpkg 批量卸载
  • 原文地址:https://www.cnblogs.com/helloweworld/p/3351692.html
Copyright © 2020-2023  润新知