【摘】《SQL必知必会》


Chapter1:了解SQL

数据类型兼容

数据类型及其名称是SQL不兼容的一个主要原因。虽然大多数基本数据类型得到了一致的支持,但是很多高级的数据类型却没有。更糟的是,偶尔会有相同的数据类型在不同的DBMS中具有不同的名称。对此用户毫无办法,重要的是在创建表结构时要记住这些差异。

主键(primary key)

主键用来表示一个特定的列。表中的任何一列都可以成为主键,只要它具有以下条件:

  • 任意两行都不具有相同的主键值;
  • 每一行必须具有一个主键值(主键列不允许NULL值);
  • 主键列中的值不允许修改或更新
  • 主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)

Chapter2:检索数据

SELECT DISTINCT vend_id, prod_price
FROM Products
LIMIT 3 OFFSET 4;

SQL语句和大小写

SQL语句不区分大小写,因此SELECT与select是相同的。同样,写成Select也没有关系。许多SQL开发人员喜欢对SQL关键字使用大写,而对列名和表名使用小写,这样做使得代码更易于阅读和调试。不过,一定要认识到,SQL不区分大小写,但是表名、列名和值可能有所不同(这依赖于具体的DBMS及其设置)。

当心逗号

在选择多列时,一定要在列名之间加上逗号,但最后一个列名后不加。如果在最后一个列名之后加了逗号,就会出现错误。

数据表示

SQL语句一般返回原始的、无格式的数据。数据的格式化是表示问题,而不是检索问题。因此,表示一般在显示数据的应用程序中规定。通常很少直接使用实际检索出的数据。

使用通配符

一般而言,除非你确实需要表中的每一列,否则最好别使用*通配符,因为检索不需要的列会降低检索的性能。

检所不同的值

DISTINCT关键字必须直接放在列名前面,而且不能部分使用DISTICT,DISTINCT关键字作用与所有列,不仅仅是跟在其后的那一列。

限制结果

LIMIT 3 OFFSET 4   --返回从第3行起的四个数据
LIMIT 3,4  --同上
LIMIT 0 OFFSET 1      --返回从第0行

第一个被检索的行是第0行,而不是第1行。

注释

-- 行内注释
# 单行注释
/* 多行注释 */ 

Chapter3:排序检索数据

SELECT prod_name
FROM Products
ORDER BY prod_name DESC;
/*等价于*/
SELECT prod_name
FROM Products
ORDER BY 1;

注意:
在指定 ORDER BY 子句时,应该保证它是 SELECT 语句中最后一条子句。如果它不是最后的子句,将会出现错误信息。通常, ORDER BY 子句中使用的列将是为现实而选择的列。但是,实际上用非检索列排序数据是完全合法的。ORDER BY 子句还可以通过多列进行排序。此外, ORDER BY 还支持按相对位置进行排序。这种排序方法的好处是不用重新输入列名,但它也有缺点。首先,不明确给出列名有可能造成错用列名排序。其次,在对SELECT 清单进行更改时容易错误地对数据进行排序(忘记ORDER BY 子句做相应的改动)。最后,如果进行排序的列不在 SELECT 清单中,显然不能使用这项技术。

DESC 关键字用于指定降序排列。 这个关键字只应用于直接位于其前面的列名,如果想在多个列上进行降序排列,必须对对每一列指定 DESC 关键字。


Chapter4:过滤数据

WHERE 子句操作符
操作符 说明 操作符 说明
= 等于 > 大于
<> 不等于 >= 大于等于
!= 不等于 !> 不大于
< 小于 BETWEEN 在指定的两个值之间
<= 小于等于 IS NULL 为NULL值
!< 不小于

字符串比较

SELECT vend_id, prod_name
FROM Products
WHERE vennd_id != 'DLL01'

提示:WHERE 子句中,单引号用来限定字符串。如果将值与字符串类型的列比较,就需要限定引号。而用来与数值列比较的值不用引号。

数值比较

SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10

提示:在使用BETWEEN时,必须指定两个值——所需范围的低端值和高端值。这两个值必须用AND关键字分隔。BETWEEN匹配范围中所有的值,包括开始值和结束值。

空值检查

在创建表时,表的设计人员可以指定其中的列能否不包含值。在一个列不包含值时,成其包含空值NULL。
确定值是否为空值不能简单的检查是否=NULL。SELECT语句中有一个特殊的WHERE子句,可用来检查具有NULL值得列。这个WHERE子句时IS NULL子句。

SELECT cust_name
FROM Customers
WHERE cust_email IS NULL

注意:NULL和非匹配
通过过滤选择不包含指定值的所有行时,你可能希望返回含有NULL值的列。但是,这做不到。因为unknown有特殊的含义,数据库不知道它们是否匹配,所以在进行匹配过滤时不会返回这些结果。
过滤数据时,一定要验证被过滤列中含NULL的行的确出现在返回数据中。


Chapter5:高级数据过滤

AND

用在WHERE子句中的关键字,用来检索满足所有给定条件的行。

OR

用在WHERE子句中的关键字,用来检索匹配任意给定条件的行。

IN

IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配 。IN 取一组由逗号分隔、括在圆括号中的合法值。
IN 操作符的优点:

  • 在有很多合法项时, IN 操作符的语法更清楚,更直观。
  • 在与其他AND 和 OR 操作符组合使用 IN 时求值顺序更容易管理。
  • IN 操作符一般比一组OR操作符执行的更快。
  • IN 操作符可以包含其它 SELECT 语句,能够更动态地建立WHERE子句。

NOT

WHERE 子句中用来否定其后条件的关键字。
分析:为什么使用 NOT ?
在与 IN 操作符联合使用时, NOT 可以非常简单的找出与条件列表不匹配的行。


Chapter6:用通配符进行过滤

通配符只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索。

%

%表示任何字符出现任意次数。%看起来好像可以匹配任何东西i,但是有个例外,那就是NULL。子句WHERE prod_name LIKE '%' 不会匹配NULL的行。

_

_刚好匹配一个字符,不能多也不能少。

[]

[]用来指定一个字符集,它必须匹配指定位置的一个字符。

通配符使用技巧

  • 不要过度使用通配符。在其他操作符可以达到相同目的时,应使用其他操作符。
  • 确定需要使用操作符时,尽量不要把它们用在搜索模式的开始处。把通配符放在开始处,搜索起来最慢。

Chapter7:创建计算字段

你可能感兴趣的:(【摘】《SQL必知必会》)