SQL必知必会(第4版)
作者:【美】Ben Forta
本书介绍了sql在不同数据库工具(Oracle、SQLite、SQL server、MySQL、MariaDB、PostgreSQL...)是怎么写不同的sql语句。
因工具的不同,对应的sql也有些变化,或者在这工具能用上,但是在另一个工具就用不上。
看这本书,就相当于纵览各个工具的写sql语句不同之处。
以下是我的一些摘抄,也许有些乱,请不要见外。
限制结果中,发现了新大陆。
在SQL Server和Access中使用SELECT时,可以使用TOP关键字来限制最多返回多少行,如下所示:
SELECT TOP 5 prod_name
FROM Products;
上面代码使用SELECT TOP 5语句,只检索前5行数据。
如果你使用的是DB2,很可能习惯使用下面这一DBMS特定的SQL语句,像这样
SELECT prod_name
FROM Products
FETCH FIRST 5 ROWS ONLY;
如果你使用MySQL、MariaDB、PostgreSQL或者SQLite,需要使用LIMIT子句,像这样:
SELECT prod_name
FROM Products
LIMIT 5;
上述代码使用SELECT语句来检索单独的一列数据。LIMIT 5指示MySQL等DBMS返回不超过5行的数据。这个语句的输出参见下面的代码。
LIMIT 5 OFFSET 5指示MySQL等DBMS返回从第5行起的5行数据。
要注意的是:第一个被检索的行是第0行,而不是第1行。因此,LIMIT 1 OFFSET 1会检索第2行,而不是第1行。
按列位置排序
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
指定排序方向
如果想在多个列上进行降序排序,必须对每一列指定DESC关键字。
WHERE子句操作符
确定值是否为NULL,不能简单地检查是否= NULL。SELECT语句有一个特殊的WHERE子句,可用来检查具有NULL值的列。这个WHERE子句就是IS NULL子句。
执行算术计算
SELECT语句为测试、检验函数和计算提供了很好的方法。虽然SELECT通常用于从表中检索数据,但是省略了FROM子句后就是简单地访问和处理表达式,例如SELECT 3 * 2;将返回6,SELECT Trim(' abc ');将返回abc,SELECT Now();使用Now()函数返回当前日期和时间。现在你明白了,可以根据需要使用SELECT语句进行检验。
提取字符串的组成部分
Access使用MID();DB2、Oracle、PostgreSQL和SQLite使用SUBSTR();MySQL和SQL Server使用SUBSTRING()
数据类型转换
Access和Oracle使用多个函数,每种类型的转换有一个函数;DB2和PostgreSQL使用CAST();MariaDB、MySQL和SQL Server使用CONVERT()
取当前日期
Access使用NOW();DB2和PostgreSQL使用CURRENT_DATE;MariaDB和MySQL使用CURDATE();Oracle使用SYSDATE;SQL Server使用GETDATE();SQLite使用DATE()
使用函数
SOUNDEX考虑了类似的发音字符和音节,使得能对字符串进行发音比较而不是字母比较。虽然SOUNDEX不是SQL概念,但多数DBMS都提供对SOUNDEX的支持。
这些函数很高效,它们返回结果一般比你在自己的客户端应用程序中计算要快得多。
过滤分组
说明:HAVING和WHERE的差别
这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。
创建组合查询
EXCEPT(有时称为MINUS)可用来检索只在第一个表中存在而在第二个表中不存在的行;而INTERSECT可用来检索两个表中都存在的行。实际上,这些UNION很少使用,因为相同的结果可利用联结得到。
删除数据
如果想从表中删除所有行,不要使用DELETE。可使用TRUNCATE TABLE语句,它完成相同的工作,而速度更快(因为不记录数据的变动)。
创建表
NULL值就是没有值或缺值。
视图
(嵌套视图可能会严重降低查询的性能,因此在产品环境中使用之前,应该对其进行全面测试)。
为什么要使用存储过程(面试总会问)
使用存储过程有三个主要的好处,即简单、安全、高性能
事务处理
事务处理用来管理INSERT、UPDATE和DELETE语句。不能回退SELECT语句(回退SELECT语句也没有必要),也不能回退CREATE或DROP操作。事务处理中可以使用这些语句,但进行回退时,这些操作也不撤销。
游标
游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。
触发器
一般来说,约束的处理比触发器快,因此在可能的时候,应该尽量使用约束。