前言
SQL,作为数据库管理的一门重要的语言,如今对其的应用越来越广泛,在学习的过程中,我发现在多表查询这一知识点中具有很多值得注意的地方
正文
-
在多表查询中,如果同时查询多个表时没有约束条件,则会引发笛卡尔积错误
-
在多表查询中,表与表之间的连接遵循的语法不同,可能会引起DBMS的不兼容问题,
例如使用SQL92语法进行表的连接会在 MySQL 中报错,而在 Oracle 中就不会出现这样的情况,即:
``` SELECT employee_id,department_id
FROM employees e, departments d
WHERE e.department_id=d.department_id(+);
-- 此为SQL92下的写法,哪一边的数据比较少,则在对应属性后加(+)
在MySQL中会显示如下的错误:
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 3
所以在MySQL中应该使用SQL99语法进行表之间的连接,即:
``` SELECT employee_id,e.department_id
FROM employees e JOIN departments d
ON e.department_id=d.department_id;
- 在多表查询中,对于满外连接,实现时也具有语法不同,DBMS不兼容的问题例如使用SQL99语法进行满外连接在 MySQL 中会报错,而在 Oracle 中就没有这种情况,即:
``` SELECT employee_id,e.department_id
FROM employees e FULL OUTER JOIN departments d
ON e.department_id=d.department_id
在 MySQL 中会报错并显示如下信息:
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FULL OUTER JOIN departments d ON e.department_id=d.department_id' at line 2
所以在MySQL中应该使用UNION(ALL)进行满外连接,而在这里,我想提一嘴
- UNION 可以检查两个表的重复部分,并使重复部分仅保留一份
- UNION ALL 不会对两个表进行检查,也就是说,如果有重复部分,那么重复部分就会保留两份。
总结
- 不同的DBMS对 SQL92 , SQL99 语法的兼容性不同