【摘】《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的行。
_
_刚好匹配一个字符,不能多也不能少。
[]
[]用来指定一个字符集,它必须匹配指定位置的一个字符。
通配符使用技巧
- 不要过度使用通配符。在其他操作符可以达到相同目的时,应使用其他操作符。
- 确定需要使用操作符时,尽量不要把它们用在搜索模式的开始处。把通配符放在开始处,搜索起来最慢。