SQL笔记

来源:互联网 发布:c语言中表示等于什么 编辑:程序博客网 时间:2024/06/07 14:57

1、 SQL 是一种声明式语言

2、 SQL 的语法并不按照语法顺序执行
SQL 语句的语法顺序是:
SELECT[DISTINCT]
FROM
WHERE
GROUP BY
HAVING
UNION
ORDER BY

其执行顺序为:
FROM
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
UNION
ORDER BY

3、 SQL 语言的核心是对表的引用(table references)
联合表里的数据是 a*b,即 a 和 b 的笛卡尔积。换句话说,也就是 a 表中的每一条数据都要跟 b 表中的每一条数据配对。如果 a 表有3 条数据, b 表有 5 条数据,那么联合表就会有 15 ( =5*3)条数据。

4、 灵活引用表能使 SQL 语句变得更强大
严格的说 JOIN 语句并非是 SELECT 中的一部分,而是一种特殊的表引用语句。

5、 SQL 语句中推荐使用表连接
尽量不要使用逗号来代替 JOIN 进行表的连接,使用JOIN会提高你的 SQL 语句的可读性,并且可以避免一些错误。

6、 SQL 语句中不同的连接操作
SQL 语句中,表连接的方式从根本上分为五种:
EQUI JOIN【包含INNER JOIN(或者是 JOIN ),OUTER JOIN(包括: LEFT 、 RIGHT、 FULL OUTER JOIN)】

SEMI JOIN【这种连接关系在 SQL 中有两种表现方式:使用 IN,或者使用 EXISTS。】
尽管没有严格的规定说明你何时应该使用 IN ,何时应该使用 EXISTS ,但是这些事情你还是应该知道的:
IN比 EXISTS 的可读性更好
EXISTS 比IN 的表达性更好(更适合复杂的语句)
二者之间性能没有差异(但对于某些数据库来说性能差异会非常大)
in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in;

ANTI JOIN
这种连接的关系跟 SEMI JOIN 刚好相反。在 IN 或者 EXISTS 前加一个 NOT 关键字就能使用这种连接。

CROSS JOIN
这个连接过程就是两个连接的表的乘积:即将第一张表的每一条数据分别对应第二张表的每条数据。我们之前见过,这就是逗号在 FROM 语句中的用法。

DIVISION

7、 SQL 中如同变量的派生表

8、 SQL 语句中 GROUP BY 是对表的引用进行的操作
GROUP BY A.x, A.y, B.z
上面语句的结果就是产生出了一个包含三个字段的新的表的引用。

9、 SQL 语句中的 SELECT 实质上是对关系的映射
SELECT 语句有很多特殊的规则,至少你应该熟悉以下几条:
1.你仅能够使用那些能通过表引用而得来的字段;
2.如果你有 GROUP BY 语句,你只能够使用 GROUP BY 语句后面的字段或者聚合函数;
3.当你的语句中没有 GROUP BY 的时候,可以使用开窗函数代替聚合函数;
4.当你的语句中没有 GROUP BY 的时候,你不能同时使用聚合函数和其它函数;
5.有一些方法可以将普通函数封装在聚合函数中;
6.……

10、 SQL 语句中的几个简单的关键词: DISTINCT , UNION , ORDER BY 和 OFFSET
集合运算( set operation):

集合运算主要操作在于集合上,事实上指的就是对表的一种操作。从概念上来说,他们很好理解:
DISTINCT 在映射之后对数据进行去重
UNION 将两个子查询拼接起来并去重
UNION ALL 将两个子查询拼接起来但不去重
EXCEPT 将第二个子查询中的结果从第一个子查询中去掉
INTERSECT 保留两个子查询中都有的结果并去重

0 0
原创粉丝点击