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;