You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
需求分析
在 SQL 中,所谓的表并不一定实际代表某个物理表,而可能是别的东西。最容易想到的就是视图,但是从 ORM 层面上来看,视图和物理表并无多大的区别。真正有影响的其实是两个:
也就是说,在 ORM 层面上看过去,实际上要处理的”表“就是三种:
user_tab
,这个也可以直接理解为普通表;场景分析
普通表
大多数查询,都是针对某一个表的简单查询。例如说:
用户也可能会给
user_tab
指定别名,例如这个别名可以用于指定列,构建查询条件(WHERE 或者 HAVING)。例如:
当然也可以用于聚合函数:
JOIN 查询和子查询
JOIN 查询其实有很多种,在不同的方言里面支持程度差别很大。在这个阶段,我们暂时不考虑支持 JOIN 查询。后面在考虑支持 JOIN 查询的时候再来详细讨论 JOIN 的问题。
子查询也类似。子查询倒不是
方言
对于不同的方言来说,”表“的抽象都是类似的。
MySQL
在 MySQL 里面,SELECT, UPDATE, DELETE 和 INSERT 所能操作的表是不一样的。
SELECT 语句规范(截取部分):
其中
table_references
的完整定义:table_reference
里面主要涉及到了:table_factor
joined_table
而
table_factor
还提及了一个table_subquery
,实际上它代表的是所谓的drived table
:目前来说,我们不需要关注
JSON_TABLE
这种形态的drived table
,我们只需要考虑通常意义上的子查询就可以。和 SELECT 语句比起来,UPDATE、DELETE 和 INSERT 就要简单一些。虽然从语法形态上来说,MySQL 并不禁止在 UPDATE 里面使用子查询或者JOIN查询,但是我们并不需要考虑这些情况。
对于 UPDATE, DELETE 和 INSERT 来说,它们操作的目标表只能是普通的表,而不能是子查询,也不能是 JOIN 查询,更不能是其它的
drived table
。SQL 2003 标准
SQL 2003 标准解读起来比较麻烦,SELECT 语句关于表的表述是:
![image](https://user-images.githubusercontent.com/9923838/171029168-991ef2c0-427b-4362-a57b-bb1822d7d90c.png)
从 eorm 的角度来说,没有必要支持全部的特性,毕竟很多用法在日常的开发中是很难接触到的。
那么从 SQL 2003 总结下来,可以得出和 MySQL 类似的结论:
行业
其它
参考资料
Beta Was this translation helpful? Give feedback.
All reactions