关于SQL多表查询

408 阅读2分钟

前言

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 语法的兼容性不同