理解SQL

  1. SQL是一种声明式的语言

    SQL语言只是告知数据库你想取得什么样的数据结果,不告知数据库如何去取得这个数据结果

  2. SQL执行顺序不同于语法顺序

    一般情况下SQL的语法顺序如下:

SELECT [DISTINCT] 
FROM
JOIN
ON
WHERE
GROUP BY
HAVING
UNION
ORDER BY

     SQL的执行顺序如下:

FROM       对FROM中的前两个表执行笛卡尔积,生成虚拟表VT_1
ON         对VT_1使用ON条件进行过滤,生成虚拟表VT_2
JOIN       根据不同的连接类型确定保留表和需要插入到VT_2中的数据,生成虚拟表VT_3,若FROM多张表则重复上述操作WHERE      对VT_3表使用WHERE条件进行过滤,生成虚拟表VT_4
GROUP BY   对VT_4表使用GROUP BY中的列进行分组,生成虚拟表VT_5
HAVING     对VT_5表使用HAVING条件进行过滤,生成虚拟表VT_6
SELECT     选择出SELECT列出的列,生成虚拟表VT_7
DISTINCT   去除VT_7表中重复的行,生成虚拟表VT_8
UNION      
ORDER BY   对VT_8按照ORDER BY中的列进行排序,返回一个游标

     应注意如下几点:

  (1)SQL是基于集合理论的,集合仅仅是数据的逻辑集合,不会对数据进行排序,所以不要为表中的行假定任何顺序

  (2)FROM是整个SQL语句执行的起点,它将数据从磁盘加载到数据缓冲区中

  (3)SELECT语句在FROM、WHERE和GROUP BY之句之后执行,所以,不能在WHERE子句中引用SELECT设定的别名

  (4)SQL语法和执行上UNION都在ORDER BY之前,所以不是每个UNION中的字段都能进行排序

  (5)ORDER BY是唯一可以使用SELECT子句中设定的别名的地方,它返回的不再是虚拟表,而是一个游标,所以使用了ORDER BY的子查询不能用作表表达式(视图、子查询、派生表等)

三、SQL的核心是对表的引用

    从上面SQL的执行中可以看到每一步都是产生一张表(ORDER BY除外),所以SQL的核心是对表的引用,从集合理论的角度来看一张数据库表对应一组数据元,每个SQL子句的执行就会改变数据元的关系,从而生成新的数据元,也就产生了新的表

四、SQL的表连接

     SQL中尽量使用JOIN而不要使用逗号在FROM中连接表

     SQL中的连接可以分为5类:EQUI JOIN、SEMI JOIN、ANTI JOIN、CROSS JOIN、DIVISION

     EQUI JOIN主要包括两种连接:INNER JOIN和OUTER JOIN(LEFT、RIGHT、FULL OUTER JOIN)

     SEMI JOIN主要包括IN和EXISTS,SEMI在拉丁文中是半的意思,只连接目标表的一部分,使用IN与EXISTS之间并没有性能上的差异(尽管有些数据性能上的差异非常大),通常我们会有通过INNER JOIN后DISITINCT进行去重操作,但这样性能非常低下,所以不建议这么做

     ANTI JOIN与SEMI JOIN相反,有NOT IN与NOT EXISTS

     CROSS JOIN连接的结果时两个表的乘积

     DIVISION是JOIN的一个逆过程,比较少用

五、SQL语句中GROUP BY是对表的引用进行的操作

     注意:当你是使用GROUP BY子句时,SELECT后没有使用聚合函数的列都要出现在GROUP BY后面,但MySQL并非这样

你可能感兴趣的:(理解SQL)