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查询会相当费时。