SQL有两个主要的标准,分别是 (1)SQL92:92年提出的标准规范,SQL92的形式更简单,但是写的SQL语句会比较长,可读性差。也被叫做SQL-2标准。

(2)SQL99:相比于SQL92,语法更加复杂,但可读性更强。也被叫做SQL-3标准。

两个标准中的多表连接 两表外连接

平时我们比较常用的外连接方式如下,

1、左外连接

SELECT * FROM 表A LEFT OUTER JOIN 表B ON 表A.key = 表B.key;

表A在此语句中是主表,表B在此语句中是从表;

2、右外连接

SELECT * FROM 表A RIGHT OUTER JOIN 表B ON 表A.key = 表B.key;

表B在此语句中是主表,表A在此语句中是从表;

3、全外连接

SELECT * FROM 表A FULL OUTER JOIN 表B ON 表A.key = 表B.key;

以上使用的就是就是SQL99的标准,并且OUTER可以省略;

其中关键的语句就是

LEFT [OUTER] JOIN ... ON ... ,

RIGHT [OUTER] JOIN ... ON ... 和

FULL [OUTER] JOIN ... ON ...

需要注意的是,ORACLE中支持SQL99的全外连接;但是在MySQL中是不支持全外连接的,可以通过使用左外连接,右外连接,结合UNION来实现全外连接的功能

而在SQL92中,外联接使用(+),(+)所在位置代表了从表所在的位置,现在用SQL92可以将上面SQL修改一下:

-- 左外连接 SELECT * FROM 表A, 表B ON 表A.key = 表B.key(+);

-- 右外连接 SELECT * FROM 表A, 表B ON 表A.key(+) = 表B.key;

-- 全外连接 SQL92中好像没有全外连接,具体有时间再查看一下文档

ORACLE 对SQL92的此种表外连接有比较好的支持,MySQL不支持

两表内连接

SQL99中的各种写法如下:

1、笛卡尔积(交叉连接)

-- 以下三种情况都会出现笛卡尔积 SELECT * FROM 表A CROSS JOIN 表B; SELECT * FROM 表A INNER JOIN 表B; SELECT * FROM 表A JOIN 表B;

SELECT * FROM 表A JOIN 表B;在ORACLE中会报错,主要是因为ORACLE对sql的语法比较严格,单独使用JOIN内联接时,必须要搭配上ON使用;外连接时也是一样;但在MySQL中没有这些限制。

2、等值连接

SELECT * FROM 表A INNER JOIN 表B ON 表A.key = 表B.key;

3、不等值连接

SELECT * FROM 表A INNER JOIN 表B ON 表A.key != 表B.key;

对应的SQL92语法为:

-- 笛卡尔积(交叉连接)

-- 等值连接 SELECT * FROM 表A, 表B ON 表A.key = 表B.key; -- 不等值连接 SELECT * FROM 表A, 表B WHERE 表A.key != 表B.key; 微信图片_20230803110213.png