《SQL必知必会》笔记

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操作。事务处理中可以使用这些语句,但进行回退时,这些操作也不撤销。

 游标
游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。

 触发器
一般来说,约束的处理比触发器快,因此在可能的时候,应该尽量使用约束。

原文地址:https://www.cnblogs.com/zttjava/p/4999869.html