加大整合力度网站集约建设,wordpress首页标题,网络开发与维护是做什么的,公司电脑租用表关联是频率非常高的一种数据库操作#xff0c;在MySQL中#xff0c;这种JOIN操作有很多类型#xff0c;包括内联接、左外连接、右外连接等等#xff0c;而每种连接的含义都不一样#xff0c;如果死记硬背#xff0c;不仅很难记住#xff0c;而且也容易搞混淆#xff…表关联是频率非常高的一种数据库操作在MySQL中这种JOIN操作有很多类型包括内联接、左外连接、右外连接等等而每种连接的含义都不一样如果死记硬背不仅很难记住而且也容易搞混淆今天我们尝试使用图解的方式来讲解各种连接的内涵因为结合了具体的例子相信会让大家印象深刻。 MySQL中常见的表关联有如下几种
INNER JOINLEFT JOINRIGHT JOINFULL OUTER JOINLEFT JOIN EXCLUDING INNER JOINRIGHT JOIN EXCLUDING INNER JOINOUTER JOIN EXCLUDING INNER JOINCROSS JOIN 1 准备环境
先创建两张表一张是订单表一张是客户表订单表中的字段customer_id与客户表的主键关联。数据表创建完成后再往表里插入简单的测试数据
先是订单表
CREATE TABLE t_order (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键,order_no int(11) DEFAULT NULL COMMENT 订单号,customer_id int(11) DEFAULT NULL COMMENT 客户id,PRIMARY KEY (id)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4;-- 插入数据
INSERT INTO t_order VALUES (1, 1001, 1);
INSERT INTO t_order VALUES (2, 1002, 26);
然后是客户表
CREATE TABLE t_customer (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键,customer_name varchar(255) DEFAULT NULL COMMENT 客户姓名 ,PRIMARY KEY (id)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4;-- 插入数据
INSERT INTO t_customer VALUES (1, John);
INSERT INTO t_customer VALUES (2, Tom);
两张表中的数据分别如下 2 INNER JOIN
INNER JOIN应该是最常用的表连接了它只返回两个表中满足关联条件的数据 以内连接的方式关联查询订单表和客户表
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A INNER JOIN t_customer B
ON A.customer_idB.id
查询结果如下可以看出只返回了一行记录内连接可以理解为查询两个表的交集 3 LEFT JOIN
LEFT JOIN是左连接它会返回左表中所有数据即使右表没有匹配行如果右表没有相匹配的记录则返回NULL SQL语句和查询结果如下
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A LEFT JOIN t_customer B
ON A.customer_idB.id 可以看出左连接返回了左表的数据对于客户id为26的记录在客户表中并不存在所以它们的值为NULL。 4 RIGHT JOIN
而RIGHT JOIN是右连接跟左连接的逻辑类似只不过它以右表为基准进行关联它返回右表中所有数据即使左表没有匹配行如果左表没有相匹配的记录则返回NULL SQL语句和查询结果如下
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A RIGHT JOIN t_customer B
ON A.customer_idB.id 它返回了客户表右表中的所有数据对于客户id为2的记录订单表中没有对应的数据所以相应的字段值为NULL。 5 FULL OUTER JOIN
对于上面提到的LEFT JOIN和RIGHT JOIN它们分别表示左外连接和右外连接完整的写法还需要加上OUTER关键字也就是LEFT OUTER JOIN和RIGHT OUTER JOIN。
除了左外连接和右外连接有时候还需要把两个表中的数据都查询出来也就是满外连接相当于是两个表的并集。目前使用的版本5.7还不支持这样的查询可以使用UNION来进行模拟 SQL语句和查询结果如下
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A LEFT JOIN t_customer B
ON A.customer_idB.id
UNION
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A RIGHT JOIN t_customer B
ON A.customer_idB.id 6 LEFT JOIN EXCLUDING INNER JOIN
返回左表有但右表没有的数据 SQL语句和查询结果如下
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A LEFT JOIN t_customer B
ON A.customer_idB.id
WHERE B.id IS NULL; 7 RIGHT JOIN EXCLUDING INNER JOIN
返回右表有但左表没有的数据 SQL语句和查询结果如下
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A RIGHT JOIN t_customer B
ON A.customer_idB.id
WHERE A.id IS NULL; 8 OUTER JOIN EXCLUDING INNER JOIN
返回左表和右表没有相互关联的数据 SQL语句和查询结果如下
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A LEFT JOIN t_customer B
ON A.customer_idB.id
WHERE B.id IS NULL
UNION
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A RIGHT JOIN t_customer B
ON A.customer_idB.id
WHERE A.id IS NULL