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 。运行结果如下:

扫描二维码关注公众号,回复: 2367223 查看本文章


上述语句作用等同于: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查询会相当费时。

猜你喜欢

转载自blog.csdn.net/lingting12116/article/details/77842621