MYSQL_JOIN

学习完mysql 的JOIN语句之后做个总结。

JOIN 用于根据两个或多个表中的字段之间的关系,从这些表中得到数据。

样表1table1:

   

样表2table2:

 

一、INNER JOIN(内连接):取得两个表中存在连接匹配关系的记录。

例如,查询报名了课程的并且有uid的学生信息。

SQL语句:SELECT `table1`.`name`,`table1`.uid,`table2`.class,`table2`.teacher FROM `table1` INNER JOIN `table2` ON `table1`.`name`=`table2`.`name`;

上述语句的大概格式为 SELECT 所需要查询的表的字段 FROM  表1 INNER JOIN 表2 ON 限制条件(表间匹配条件),其中在INNER JOIN 两侧表1和表2的放置顺序可以任意,ON 的作用相当于 WHERE 。运行结果如下:

上述语句作用等同于:SELECT `table1`.`name`,`table1`.uid,`table2`.class,`table2`.teacher FROM `table1`,`table2` WHERE `table1`.`name`=`table2`.`name`;

 

二、LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录。

例如,展示表1所有内容,并展示学生报名的课程。

SQL语句:SELECT `table1`.`name`,`table1`.uid,`table2`.class,`table2`.teacher FROM `table1` LEFT JOIN `table2` ON `table1`.`name`=`table2`.`name`;

从结果图中可以看出,左表的所有记录全部展示了出来,对于右表中没有匹配到的记录(赵六不在表2内)被记为了NULL。

如果想要特别筛选出在表1但是不在表2的学生,可以加上 IS NULL 的限制条件:

SELECT `table1`.`name`,`table1`.uid,`table2`.class,`table2`.teacher FROM `table1` LEFT JOIN `table2` ON `table1`.`name`=`table2`.`name` WHERE `table2`.class IS NULL;

运行结果如下:

 

三、RIGHT JOIN(右连接):与 LEFT JOIN 相反,取得右表(table2)完全记录,即是左表(table1)并无匹配对应记录。

例如,与LEFT JOIN中的例子相反的,要展示表2所有内容,并展示学生的uid。只需把LEFT改成JOIN就可以了。

SQL语句:SELECT `table1`.`name`,`table1`.uid,`table2`.class,`table2`.teacher FROM `table1` RIGHT JOIN `table2` ON `table1`.`name`=`table2`.`name`;运行结果如下:

 

四、CROSS JOIN:无限制条件。

该语句查询的结果记录总数为笛卡儿积(表1记录数*表2记录数)。

例如,SELECT `table1`.`name`,`table1`.uid,`table2`.class,`table2`.teacher FROM `table1` CROSS JOIN `table2`; 运行结果如下:

结果总记录数为4*5=20,也是查询记录数为20。

无论是INNER JOIN,LEFT JOIN 还是 RIGHT JOIN,他们在执行时的查询记录数都是笛卡儿积,只不过因为加了限制条件所以展示出来的结果不同。所以在表1和表2记录数较多时,JOIN查询会相当费时。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值