您的位置:首页 > 数据库

理解SQL

2016-04-13 14:28 134 查看
SQL是一种声明式的语言
SQL语言只是告知数据库你想取得什么样的数据结果,不告知数据库如何去取得这个数据结果

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并非这样
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: