欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SQL学习小结

程序员文章站 2022-05-07 14:35:38
...

这些关于SQL的链接不错:
w3school:
http://www.w3school.com.cn/sql/

“十步完全理解SQL”:
http://blog.jobbole.com/55086/

下面是关于上面链接的一些学习笔记。

1.SQL语句的语法顺序和其语句的执行顺序不一致。
一个典型的SQL语句的语法顺序是:
SELECT[DISTINCT]
FROM
WHERE
GROUP BY
HAVING
UNION
ORDER BY

该SQL语句的执行顺序是:
FROM
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
UNION
ORDER BY

而且好像不同的数据库对SQL语句解析方式也不一定一样。

2. FROM 语句是SQL语句执行的第一步(而不是SELECT)。该语句会通过文件系统将数据从硬盘加载到数据缓冲区中,以便对这些数据进行操作。

SELECT 语句是大部分语句执行了之后再执行的,严格说是在FROM和GROUP BY之后执行的。所以下面SQL语句错误

SELECT A.x + A.y AS z
FROM A
WHERE z = 10 -- z在此处不可用,因为SELECT是最后执行的语句

一个方法是重新写一遍 z 所代表的表达式:

SELECT A.x + A.y AS z
FROM A
WHERE (A.x + A.y) = 10 

或者求助于衍生表、通用数据表达式或者视图,以避免别名重用。

3.不管是语法顺序还是执行顺序,UNION总是排在ORDER BY之前。好像并不一定每个UNION段都能使用ORDER BY排序 ??
“某些数据库允许 SQL 语句对子查询(subqueries)或者派生表(derived tables)进行排序,但是这并不说明这个排序在 UNION 操作过后仍保持排序后的顺序。”

4. SQL 语言的核心是对表的引用(table references)
根据 SQL 标准,FROM 语句被定义为:

<from clause> ::= FROM <table reference> [ { <comma> <table reference> }... ]

FROM 语句的“输出”是一张联合表,来自于所有引用的表在某一维度上的联合。

FROM a, b

上面这句 FROM 语句的输出是一张联合表,联合了表 a 和表 b 。如果 a 表有三个字段, b 表有 5 个字段,那么这个“输出表”就有 8 ( =5+3)个字段。

这个联合表里的数据是 a*b,即 a 和 b 的笛卡尔积。换句话说,也就是 a 表中的每一条数据都要跟 b 表中的每一条数据配对。如果 a 表有3 条数据, b 表有 5 条数据,那么联合表就会有 15 =5*3条数据。

FROM 输出的结果被 WHERE 语句筛选后要经过 GROUP BY 语句处理,从而形成新的输出结果。

从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个 SQL 语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。

5. 尽量使用 JOIN 进行表的连接
不要在 FROM 后面使用逗号连接表。这样会提高SQL 语句的可读性,并且可以避免一些错误。比如说下面的语句很容易引起混乱:

FROM a, b, c, d, e, f, g, h
WHERE a.a1 = b.bx
AND a.a2 = c.c1
AND d.d1 = b.bc

而使用JOIN的话会更安全,JOIN 和要连接的表离得非常近,这样就能避免错误。JOIN 语句能去区分出来外连接和内连接等。

6. SQL 语句中不同的连接操作
关于JOIN的操作,下面这个图不错 (来源”画图解释SQL join 语句”)。

SQL学习小结

SQL 语句中,表连接的方式从根本上分为五种:
EQUI JOIN
SEMI JOIN
ANTI JOIN
CROSS JOIN
DIVISION

EQUI JOIN
未完待续

相关标签: Database