• MySQL内连接、外连接、交叉连接


    外连接:

    左连接:left join 或 left outer join

    以左边的表为基准,如果左表有数据,而右表没有数据,左表的数据正常显示,右表数据显示为空。


    创建user表,用于记录用户

    user_idusername
    1 王一
    2 李二
    3 张三

    创建log表,用于记录用户的消费情况

    user_idlogging
    1 100
    2 200

    分析用户的消费情况,每一个用户不一定都有消费,就要用到左连接,把每个用户的消费情况查出来,包括那些没有消费的用户。没有消费的显示为NULL。

    select * from user left outer join log on user.user_id=log.user_id;
    select * from user left join log on user.user_id=log.user_id;

    查询结果:

    user_idusernameuser_id1logging
    1 王一 1 100
    2 李二 2 200
    3 张三 NULL NULL

    右连接:right join 或 right outer join

    以右边的表为基准,如果右表有数据,而左表没有数据,右表的数据正常显示,左表显示为空,定义完全和左连接相反。

    select * from user right join log on user.user_id=log.user_id;
    select * from user right outer join log on user.user_id=log.user_id;

    查询结果:

    user_idusernameuser_id1logging
    1 王一 1 100
    2 李二 2 200

    右表中只有两条数据对应着左表中的两条数据,因为是右连接,以右面的为基础,右面没有的,左面有的就会被舍弃。


    全连接:

    注:MySQL并不支持full join,不过可以通过union 关键字来合并 left join 与 right join来模拟full join.

    创建course表:

    idcourse_namestu_id
    1 数学 1
    2 语文 2
    3 英语 4
    4 生物 3

    创建student表:

    stu_idstu_name
    1 王一
    2 李二
    3 张三
    5 李四

    执行下面语句:

    select * from student left join course on student.stu_id=course.stu_id
    union 
    select * from student right join course on student.stu_id=course.stu_id;

    查询结果:

    stu_idstu_nameidcourse_namestu_id1
    1 王一 1 数学 1
    2 李二 2 语文 2
    3 张三 4 生物 3
    5 李四 NULL NULL NULL
    NULL NULL 3 英语 4

    交叉连接 cross join:

    交叉连接得到的是两个表的乘积,也叫笛卡儿积

    还是上面的表执行sql语句:

    select * from student cross join course;

    得到结果如下:

    stu_idstu_nameidcourse_namestu_id1
    1 王一 1 数学 1
    2 李二 1 数学 1
    3 张三 1 数学 1
    5 李四 1 数学 1
    1 王一 2 语文 2
    2 李二 2 语文 2
    3 张三 2 语文 2
    5 李四 2 语文 2
    1 王一 3 英语 4
    2 李二 3 英语 4
    3 张三 3 英语 4
    5 李四 3 英语 4
    1 王一 4 生物 3
    2 李二 4 生物 3
    3 张三 4 生物 3
    5 李四 4 生物 3

    注:如果不写连接条件,默认也是得到表的笛卡儿积,下面的sql语句中两个表只用了,隔开,得到的结果和上面的一样

    select * from student,course;

    内连接(等值连接): inner join ,=,>=,<=,<,>

    注意内连接不分左表和右表,只是把两个表相对应的数据查出来,自动忽略不对应的数据。

    user表,用于记录用户

    user_idusername
    1 王一
    2 李二
    3 张三

    log表,用于记录用户的消费情况

    user_idlogging
    1 100
    2 200

    执行下面的语句

    select * from user inner join log on user.user_id=log.user_id;
    select * from user,log where user.user_id=log.user_id;

    查询结果:

    user_idusernameuser_id1logging
    1 王一 1 100
    2 李二 2 200
  • 相关阅读:
    springMVC学习 十二 拦截器
    SpringMVC 学习 十一 springMVC控制器向jsp或者别的控制器传递参数的四种方法
    SpringMVC 学习 十 SSM环境搭建(三)springMVC文件配置
    iconfont 在项目中的简单使用
    CSS实现带阴影效果的三角形
    前端以数组的方式传参
    JQuery的ajaxFileUpload的使用
    layer弹出层的关闭问题
    e.target与事件委托简例
    SpringBoot项目在IntelliJ IDEA中实现热部署(简单方式)
  • 原文地址:https://www.cnblogs.com/zquan/p/9722473.html
Copyright © 2020-2023  润新知