随着业务量的不断复杂,多表查询与多表连接成为了我们在数据查询时必要的一部分。本文将介绍Mysql的INNER JOIN ON(内连接)、LEFT OUTER JOIN ON(左外连接)、RIGHT OUTER JOIN ON(右外连接)等语法结构及示例。
语法结构:
table_reference {[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN} table_reference ON conditional_expr
内连接INNER JOIN … ON
在Mysql中,JOIN,CROSS JOIN和INNER JOIN是等价的。
ON关键字用于设定连接条件,也可以使用WHERE来代替。
但是通常,我们使用ON关键字来设定连接条件,使用WHERE关键字对结果集记录进行过滤。
内连接仅显示符合条件的记录,即在查询时,两张表都存在的相对应的数据,可理解为两张表的交集部分。
… INNER JOIN users AS u ON u.tb_column1 = tb_column2 …
多表处理,将需要操作的外表与users表内连接,users表中的列1,参照外表中的列2。
一个无厘头的示例:
UPDATE tb_province AS p INNER JOIN users AS u ON u.pid = p.id SET u.province = p.name
该操作根据users表中的pid字段到tb_province表中查找对应的省份名称,并更新到users表的province字段中。
外连接(左外连接)
左外连接即显示左表的全部记录及右表中符合连接条件的记录:
… LEFT JOIN users AS u ON u.tb_column1 = tb_column2 …
示例:
SELECT u.id, u.name, u.age, p.name FROM users AS u LEFT JOIN tb_province AS p ON p.id = u.pid
该方式通过左外连接查询,查询的结果为users的全部数据,相参照的tb_province中所不符合不存在的数据,p.name字段将会被置NULL。
外连接(右外连接)
右外连接即显示右表的全部记录及左表中符合连接条件的记录:
… RIGHT JOIN users AS u ON u.tb_column1 = tb_column2 …
总结
使用内连接进行联表查询时,只会查询到双方都不为空的结果;常用的左外连接会查询到左边表的所有内容,右表中没有对应的数据将会以NULL的形式返回。
骚操作,建表的同时插入已存在的数据
CREATE TABLE [IF NOT EXISTS] tbl_name [(create_definition, …)] select_statement
示例:
CREATE TABLE tb_user ( id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, name VARCHAR(40) NOT NULL ) SELECT id, name FROM users;
创建一个新表,同时将users表的id和name插入进去。