关于sql语句书写的理解

sql的基本结构

sql主要是由select from where三个关键字组成,由这三个关键字可以写成大部分的sql查询语句,我根据笛卡尔积是所有组合元组的集合,是个有所有组合的结果集得出这个结论。也就是说只要在from后面接的表,没有用连接运算的话,都是直接产生一个笛卡尔积结果集,包含了所有组合结果,然后再用where子句的条件去进一步筛选,最后用select字句进行投影想要的字段,最终形成一个符合条件的结果集。

sql语句得执行效率很大程度取决于数据库模式的设计,目前主要是用ER模型进行设计,自己学习以后,其实联系着面向对象的思想来学比较好学,主要记住实体间最好相互独立(一个个实体类),实体通过联系连接其他实体(业务类)。当然我们在写ER模型的时候,属性怎么放是根据实体间的映射基数来做决定的。

sql分类思想

sql主要是通过实体集合和联系集间的集合关系,来完成筛选的。在这个基础上,sql还能进一步通过分类的思想,对结果集进行进一步的操作,GROUP BY关键字,可以实现元组的分类。在大的结果集上会根据group by 关键字后的属性名,进行分类,每个分类作为一个新的组别,然后你还可以用HAVING子句加上你对每个组别的筛选条件,这个过程和对表的where子句筛选一样。

在分组的基础上,我们还可以使用聚集函数,聚集函数的使用范围其实你可以理解为一个个组,当你用了group by关键字后,sql执行引擎会按照你的分组属性,把大的表分为一个个小组,分别进行聚集函数运算;如果没有使用该关键字,那么默认整个大表是个单独的组。个人见解。


嵌套子查询思想

sql提供嵌套的子查询的思想,就是在基本查询结构里再嵌套基本查询结构,子查询可以嵌套在from子句后,也可以嵌套在where子句后。

where子句之后:

集合成员资格判断 INNOT IN,翻译为逻辑语言为“属于”,“不属于”。
集合的比较 SOMEALL,翻译为逻辑语言为“某一个”和“全部”。
空关系测试 EXISTSNOT EXISTS对应逻辑语言为“存在”,“不存在”。
重复元组存在性测试 UNIQUE,判断集合内是否有重复元组。

from子句之后:

可以代替使用了GROUP BY子句的HAVING子句,用外层查询的WHERE代替HAVING。

with子句

定义临时关系,下面的查询马上用到该临时关系。WITH(临时关系名) AS(查询语句)

标量子查询

只返回一个元组的子查询,通常是一个包含聚集函数的子查询。