-
Notifications
You must be signed in to change notification settings - Fork 3
sql notes
cym edited this page Jan 10, 2018
·
1 revision
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用left join
时,on
和where
条件的区别如下:
-
on
条件是在生成临时表时使用的条件,它不管on
中的条件是否为真,都会返回左边表中的记录。 -
where
条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join
的含义(必须返回左边表的记录)了, 条件不为真的就全部过滤掉。
不管on
上的条件是否为真都会返回left
或right
表中的记录,full
则具有left
和right
的特性的并集。
而inner join
没这个特殊性,则条件放在on
中和where
中,返回的结果集是相同的
对非数值数据使用MAX() 虽然MAX()一般用来找出最大的数值或日期值,但许多(并非所有)DBMS允许将它用来返回任意列中的最大值, 包括返回文本列中的最大 值。在用于文本数据时,MAX()返回按该列排序后的最后一行。
在使用GROUP BY
子句前,需要知道一些重要的规定。
-
GROUP BY
子句可以包含任意数目的列,因而可以对分组进行嵌套,更细致地进行数据分组。 - 如果在
GROUP BY
子句中嵌套了分组,数据将在最后指定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不 能从个别的列取回数据)。 -
GROUP BY
子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY
子句中指定相同的表达式。不能使用别名。 - 大多数SQL实现不允许
GROUP BY
列带有长度可变的数据类型(如文本或备注型字段)。 - 除聚集计算语句外,
SELECT
语句中的每一列都必须在GROUP BY
子句中给出。 - 如果分组列中包含具有
NULL
值的行,则NULL将作为一个分组返回。如果列中有多行NULL
值,它们将分为一组。 -
GROUP BY
子句必须出现在WHERE
子句之后,ORDER BY
子句之前。
WHERE
过滤行,而HAVING
过滤分组。HAVING
支持所有WHERE
操作符
WHERE
在数据分组前进行过滤,HAVING
在数据分组后进行过滤。这是一个重要的区别,WHERE
排除的行不包括在分组 中。这可能会改变计算值,从而影响HAVING
子句中基于这些值过滤掉的分组。
视图的作用:
- 重用SQL语句。
- 简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道其基本查询细节。
- 使用表的一部分而不是整个表。
- 保护数据。可以授予用户访问表的特定部分的权限,而不是整个表的访问权限。
- 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
视图仅仅是用来查看存储在别处数据的一种设施。视图本身不包含数据,因此返回的数据是从其他表中检索出来的。在添加或更改这些表中的数据时,视图将返回改变过的数据。
性能问题:因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时需要的所有检索。如果你用多个联结和过滤创建了复杂的视图或者嵌套 了视图,性能可能会下降得很厉害。因此,在部署使用了大量视图的应用前,应该进行测试。