Mysql使用实际02---SQL表连接
作者:互联网
1. 表连接的常见类型
在SQL语句中,关于表连接,若按照表的数量来划分,可以划分为单表连接、两表连接和两表以上连接。
关于表连接有很多种类,主要分为交叉连接,内连接,外连接(左外部连接,右外部连接,全连接),自连接。
测试样表和Sql:
业务场景:有两张表,分为为顾客表Customers和顾客订单表Orders,SQL语句分别如下:
创建Customes并初始化
-- ---------------------------- -- Table structure for customers -- ---------------------------- DROP TABLE IF EXISTS `customers`; CREATE TABLE `customers` ( `CustID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, `CustName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, `CustCompany` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of customers -- ---------------------------- INSERT INTO `customers` VALUES ('SXN-DD-01', '赵武', 'A'); INSERT INTO `customers` VALUES ('SXN-DD-02', '刘杨', 'B'); INSERT INTO `customers` VALUES ('SXN-DD-03', '张永为', 'C'); INSERT INTO `customers` VALUES ('SXN-DD-04', '李龙飞', 'D'); INSERT INTO `customers` VALUES ('SXN-FF-01', '邓华', 'E'); INSERT INTO `customers` VALUES ('SXN-HH-01', '张涛明', 'F');
查询结果为:
创建Order表并初始化
-- ---------------------------- -- Table structure for orders -- ---------------------------- DROP TABLE IF EXISTS `orders`; CREATE TABLE `orders` ( `CustID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, `OrdetID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of orders -- ---------------------------- INSERT INTO `orders` VALUES ('SXN-DD-01', 'SCCCCFFFFFSSOX002'); INSERT INTO `orders` VALUES ('SXN-DD-02', 'SCCCCFFFFFSSOX0X2'); INSERT INTO `orders` VALUES ('SXN-DD-03', ''); INSERT INTO `orders` VALUES ('SXN-DD-04', ''); INSERT INTO `orders` VALUES ('SXN-DD-05', 'SCCCCFFFFFSSOX0H2'); INSERT INTO `orders` VALUES ('SXN-DD-06', '');
查询结果为:
2.交叉连接
2.1 SQL示例及示例结果
2.2 示例结果分析
交叉连接使用关键字CROSS JOIN进行查询,查询的结果为笛卡儿积,从如上结果可以看出,查询出的结果共有36行数据,因为Customers表和Orders表分别有6条记录,6X6=36;
2.3 小结
a.在逻辑上,交叉连接是一种最简单的联接;
b.交叉连接只实现一个逻辑处理步骤———笛卡儿积;
c.操作:对输入的两个表进行操作,把它们连接起来,生成两者的笛卡儿积,即将一个输入表的每行与另一个表的所有行进行匹配,如果一个表有m行,而另一个表有n行,将得到m x n行的接果集;
d.结构: SELECT tb1.tb1ConumName,tb2.tb2ConumName FROM table1 AS tb1 CROSS JOIN table2 AS tb2
e.交叉连接使用的关键字:CROSS JOIN ; f.交叉连接生成的接果集是一个虚拟表,虚拟表中的各列直接源于参与连接的两个表;
3. 内连接
3.1 SQL示例及示例结果
SELECT C.CustID,C.CustName,C.CustCompany,O.CustID,O.OrdetID FROM Customers AS C INNER JOIN Orders AS O ON C.CustID=O.CustID
3.2 示例结果分析
内连接在交叉连接的基础上外加过滤条件ON,如上例子中用Customers.CustID=Orders.CustID作为过滤条件,结果显而易见
3.3 小结
内联接规则为笛卡尔积+用户谓词过滤:它首先像交叉连接一样,对两个输入表进行笛卡尔积运算,然后根据用户指定的谓词对结果进行过滤;
4 外连接
4.1 左外连接
(1)SQL示例及示例结果
SELECT C.CustID,C.CustName,C.CustCompany,O.CustID,O.OrdetID FROM Customers AS C LEFT OUTER JOIN Orders AS O ON C.CustID=O.CustID
(2)示例结果分析
如上以Cutomers表作为左保留表,连接右表Orders列CustID缺少SXN-FF-01和SXN-HH-01,为了以左保留表为基准,用NULL占位符来填充。
参考文献:https://www.cnblogs.com/wangjiming/p/7153533.html
标签:02,utf8mb4,--,Mysql,SXN,VALUES,SQL,CustID,连接 来源: https://www.cnblogs.com/luckyplj/p/16600083.html