Mysql join 连接查询

  • 连接查询:

    是将两个查询(或表)的每一行,以“两两横同对接”的方式, 所得到的所有行的结果,即一个表中的某行,跟另一个表中的某行。 进行“横向对接”,得到一个新行。

  • 连接查询包括以下这些不同形式,连接方式:

    交叉连接、内连接、外连接(分:左外连接,右外连接)

  • 连接查询语法:

    select * from 表名 [连接方式] join 表名 [on 连接条件] where ...;

  • 测试数据:

``` mysql> select * from test; +----+--------+------+------+ | id | name | sex | age | +----+--------+------+------+ | 1 | name1 | 女 | 15 | | 2 | name1 | 女 | 15 | | 4 | name2 | 男 | 30 | | 5 | name50 | 男 | 12 | +----+--------+------+------+

mysql> select * from user; +----+-------+------+ | id | name | age | +----+-------+------+ | 1 | name1 | 18 | | 2 | name2 | 15 | | 3 | name3 | 20 | | 4 | name4 | 30 | +----+-------+------+ ```



  • 交叉连接 (cross join)


1、交叉连接其实可以认为是连接查询的“完全版本”, 即所有行都无条件地都连接起来。 2、关键字 “cross” 可以省略; 3、交叉连接又称为“笛卡尔积”,通常应用价值不大

语法形式: select * from 表名, 表名; select * from 表名 join 表名; select * from 表名 cross join 表名;

``` 规范的交叉连接写法 mysql> select * from test cross join user; +----+--------+------+------+----+-------+------+ | id | name | sex | age | id | name | age | +----+--------+------+------+----+-------+------+ | 1 | name1 | 女 | 15 | 1 | name1 | 18 | | 2 | name1 | 女 | 15 | 1 | name1 | 18 | | 4 | name2 | 男 | 30 | 1 | name1 | 18 | | 5 | name50 | 男 | 12 | 1 | name1 | 18 | | 1 | name1 | 女 | 15 | 2 | name2 | 15 | | 2 | name1 | 女 | 15 | 2 | name2 | 15 | | 4 | name2 | 男 | 30 | 2 | name2 | 15 | | 5 | name50 | 男 | 12 | 2 | name2 | 15 | | 1 | name1 | 女 | 15 | 3 | name3 | 20 | | 2 | name1 | 女 | 15 | 3 | name3 | 20 | | 4 | name2 | 男 | 30 | 3 | name3 | 20 | | 5 | name50 | 男 | 12 | 3 | name3 | 20 | | 1 | name1 | 女 | 15 | 4 | name4 | 30 | | 2 | name1 | 女 | 15 | 4 | name4 | 30 | | 4 | name2 | 男 | 30 | 4 | name4 | 30 | | 5 | name50 | 男 | 12 | 4 | name4 | 30 | +----+--------+------+------+----+-------+------+

直接使用 join 进行连接,相当于 cross join,默认就是 交叉连接 mysql> select * from test join user; 查询结果跟上面一致!!!

还可以直接 from 表,表... 也相当于是交叉连接 mysql> select * from test, user; 查询结果跟上面一致!!! ```



  • 内连接 (inner join)


1、内连接其实是交叉连接的基础上,再通过 on 条件而筛选出来的部分数据。 2、关键字 "inner" 可以省略,但建议写上,真正有意义的是 on 连接条件。 3、内连接是应用最广泛的一种连接查询,其本质是根据条件筛选出“有意义的数据”。

语法形式: select * from 表名 join 表名 on 连接条件; select * from 表名 inner join 表名 on 连接条件;

``` 查出两个表中 name 字段相等的数据 mysql> select * from test inner join user on test.name=user.name; +----+-------+------+------+----+-------+------+ | id | name | sex | age | id | name | age | +----+-------+------+------+----+-------+------+ | 1 | name1 | 女 | 15 | 1 | name1 | 18 | | 2 | name1 | 女 | 15 | 1 | name1 | 18 | | 4 | name2 | 男 | 30 | 2 | name2 | 15 | +----+-------+------+------+----+-------+------+

查出两个表中 name 字段相等的数据,通过 as 给表取个别名进行使用 mysql> select * from test as t inner join user as u on t.name=u.name; 查询结果跟上面一致!!!

查出两个表中 name 字段相等,test 表中 age>15,user 表中 age>10 的数据 如果使用表中有重复的字段,那么就需要通过 [表名.字段名] 来使用,例如 age : mysql> select * from test inner join user on test.name=user.name where test.age>15 and user.age>10; +----+-------+------+------+----+-------+------+ | id | name | sex | age | id | name | age | +----+-------+------+------+----+-------+------+ | 4 | name2 | 男 | 30 | 2 | name2 | 15 | +----+-------+------+------+----+-------+------+

查出两个表中 name 字段相等,且 sex='男' 的数据。 如果使用表中没有重复的字段,那么可以通过 [表名.字段名] 或者直接使用 [字段名] 使用,例如 sex : mysql> select * from test as t inner join user as u on t.name=u.name where t.sex='男'; mysql> select * from test as t inner join user as u on t.name=u.name where sex='男'; +----+-------+------+------+----+-------+------+ | id | name | sex | age | id | name | age | +----+-------+------+------+----+-------+------+ | 4 | name2 | 男 | 30 | 2 | name2 | 15 | +----+-------+------+------+----+-------+------+ ```



  • 外连接 - 左外连接 (left join)


1、左外连接其实是保证左边表的数据都能够取出的一种连接 。 2、左外连接其实是在内连接的基础上,再加上左边表中所有不能满足条件的数据 3、关键字 “outer" 可以省略。

语法形式: select * from 表名 left [outer] join on 连接条件 where ...;

以左边的表为基准,保证左边表的数据全部显示,匹配不到的数据为 NULL mysql> select * from test left join user on test.name=user.name; +----+--------+------+------+------+-------+------+ | id | name | sex | age | id | name | age | +----+--------+------+------+------+-------+------+ | 1 | name1 | 女 | 15 | 1 | name1 | 18 | | 2 | name1 | 女 | 15 | 1 | name1 | 18 | | 4 | name2 | 男 | 30 | 2 | name2 | 15 | | 5 | name50 | 男 | 12 | NULL | NULL | NULL | +----+--------+------+------+------+-------+------+



  • 外连接 - 右外连接 (right join)


1、右外连接其实是保证右边表的数据都能够取出的一种连接 。 2、右外连接其实是在内连接的基础上,再加上右边表中所有不能满足条件的数据 3、关键字 “outer" 可以省略。

语法形式: select * from 表名 right [outer] join on 连接条件 where ...;

以右边的表为基准,保证右边表的数据全部显示,匹配不到的数据为 NULL mysql> select * from test right join user on test.name=user.name; +------+-------+------+------+----+-------+------+ | id | name | sex | age | id | name | age | +------+-------+------+------+----+-------+------+ | 1 | name1 | 女 | 15 | 1 | name1 | 18 | | 2 | name1 | 女 | 15 | 1 | name1 | 18 | | 4 | name2 | 男 | 30 | 2 | name2 | 15 | | NULL | NULL | NULL | NULL | 3 | name3 | 20 | | NULL | NULL | NULL | NULL | 4 | name4 | 30 | +------+-------+------+------+----+-------+------+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡尔特斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值