关系型数据库管理系统:MySQL8.0
数据库管理工具:Navicat Premium 12
下面,为了更好的理解这几种连接查询,我们先自己设计数据表。
SQL代码如下:
-- 创建表A,B
CREATE TABLE DMBJ_A(
ID INT NOT NULL,
A_NAME VARCHAR(10) NULL,
A_HEIGHT INT NULL,
CONSTRAINT A_DMBJ_PK PRIMARY KEY (A_ID)
);
CREATE TABLE DMBJ_B(
ID INT NOT NULL,
B_NAME VARCHAR(10) NULL,
B_HEIGHT INT NULL,
CONSTRAINT B_DMBJ_PK PRIMARY KEY (B_ID)
);
-- 插入数据
INSERT INTO DMBJ_A VALUES (1,'吴邪',185);
INSERT INTO DMBJ_A VALUES (2,'王胖子',184);
INSERT INTO DMBJ_A VALUES (3,'小哥',182);
INSERT INTO DMBJ_A VALUES (4,'小白',168);
INSERT INTO DMBJ_B VALUES (2,'王胖子',120);
INSERT INTO DMBJ_B VALUES (4,'小白',55);
INSERT INTO DMBJ_B VALUES (5,'黑瞎子',75);
INSERT INTO DMBJ_B VALUES (6,'潘子',70);
内连接包括等值与非等值连接,区别在连接条件上
等值连接:就是连接条件为等号(=)时
非等值连接:就是连接条件为等号(=)以外的条件时,比如,!=、 > 、< 、BETWEEN、LIKE等
关键字:INNER JOIN(等同于JOIN)
作用:返回两个表中满足匹配连接条件的数据(下图阴影部分)。
-- 操作范例
SELECT A.*,B.*
FROM DMBJ_A A
INNER JOIN DMBJ_B B
ON A.ID = B.ID; --这里是连接条件,返回两个表ID相等的共有数据。
/*后面还可以加WHERE、GROUP BY、ORDER BY等子句进行筛选分组排序*/
返回结果如下:
如果实现N表连接查询的话,需要N-1个连接条件。
自连接就是将一个表用了两个别名,与自身进行连接查询。
就是用来处理列之间的多种逻辑关系(顺序、因果)。
语句简单,理解略微复杂,这里将这两个别名的表,看做成两个独立的表,然后根据匹配连接条件返回数据,就很容易理解了。
-- 操作范例
SELECT A.*,B.A_NAME,B.A_HEIGHT
FROM DMBJ_A A
INNER JOIN DMBJ_A B
WHERE A.A_HEIGHT > B.A_HEIGHT
ORDER BY A.ID;
--这个就是返回表中比较人员的身高,看看谁比谁高。
返回结果如下:
按照我的理解,从别名为A的表中取出数据按照连接条件依次与别名为B的表数据进行匹配,匹配成功则返回该数据,匹配失败,则继续进行匹配下一个数据。
自然连接是一种特殊的等值连接,它会把重复列消除。
注意:要求两个关系表中进行连接的必须是相同的属性列(名字相同),无须添加连接条件。
SELECT * FROM DMBJ_A NATURAL JOIN DMBJ_B;
外连接包括左外连接、右外连接,看下面的范例就很容易理解了。
关键字:LEFT JOIN(等同于LEFT OUTER JOIN)
作用:返回两个表中满足匹配连接条件的数据(下图阴影部分)。
以左表为基准,返回左表所有行及右表相匹配的行,如果左表的某行在右表中没有匹配行,则以NULL值进行填充。
--操作范例
SELECT * FROM DMBJ_A A
LEFT JOIN DMBJ_B B
ON A.ID = B.ID;
关键字:RIGHT JOIN(等同于RIGHT OUTER JOIN)
作用:返回两个表中满足匹配连接条件的数据(下图阴影部分)。
这里和左连接原理一样,只不过是反过来了。
SELECT * FROM DMBJ_A A
RIGHT JOIN DMBJ_B B
ON A.ID = B.ID;
返回结果如下:
关键字:CROSS JOIN
作用:返回两个表所有行的所有排列组合,这也称为可怕的笛卡尔积
-- 操作范例
SELECT * FROM DMBJ_A A
CROSS JOIN DMBJ_B B
返回结果如下:
一般情况下,数据规模比较大,后面会跟WHERE子句进行筛选,去除不必要的结果。