2013-06-18:
1 主键-primary key
一列或者一组列,其值能够唯一标示表中的每一行
任意两行都不具有相同的主键值
每一行都必须具有一个主键值,即主键列不允许NUL值
主键列中的值不允许修改或更新
主键值不能重用,如果某行从表中删除,它的主键不能赋给以后的新行

2 DISTINCT关键字,指示数据库只返回不同的值,如果使用DISTINCT关键字,它必须直接放在列名的前面
Eg:SELECT DISTINCT vend_id FROM Products;

3 LIMIT关键字,返回检索结果的第一行或者一定数量的行
LIMIT number 指定返回的行数
LIMIT index OFFSET number 从哪儿开始以及检索的行数
注意:index是从0开始

4 注释
行内注释 -- 两个连字符 嵌在行内 之后的文本就是注释
Eg:SELECT prod_name -- 这是一条注释 FROM Products
# 在一行的开始处使用#,这一整行都将作为注释
/**/ 多行注释, 可以在脚本的任何位置停止和开始

2013-06-21:
5 排序 ORDER BY
关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出来的数据的顺序有任何意义
为了明确排序用SELECT语句检索出的数据,可以使用ORDER BY子句
ORDER BY 子句取一个或者多个字段,据此对输出进行排序
Eg: SELECT prod_name FROM Products ORDER BY prod_name
注意:在指定一条ORDER BY 子句时,应该保证它是SELECT语句中最后一条子句,否则将会出现错误消息 要按多个字段排序,简单指定字段名,字段之间用逗号分开即可,这样排序时是从左往右依次按字段来排序 除了能用列名指出排序顺序外,ORDER BY还支持按选择列的相对位置进行排序(位置从1开始)
默认是升序排序,可以用DESC来显性降序排序,ASC为升序排序
Eg:SELECT prod_id, prod_price, prod_nameFROM Products ORDER BY prod_price DESC;
DESC关键字只应用到直接位于其前面的列名,如果想在多个列上进行降序排序,必须对每一列指定DESC关键字
学习了如何用SELECT 语句的ORDER BY 子句对检索出的数据进行排序。这个子句必须是SELECT 语句中的最后一条子句。根据需要,可以利用它在一个或多个列上对数据进行排序

6 子句 clause
SQL语句由子句构成,有些子句是必需的,有些则是可选的
一个子句通常由一个关键字加上所提供的数据组成
子句的例子有我们在前面看到的SELECT语句的FROM子句

7 WHERE子句
SELECT语句的WHERE子句指定搜索条件,只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)
SQL过滤与应用过滤
数据也可以在应用层过滤,为此SQL的SELECT语句为客户端应用检索出超过实际所需的数据,然后客户端代码对返回的数据进行遍历,提取出需要的行
通常这种做法极其不妥 优化数据库后可以更快速有效地对数据进行过滤,而让客户端应用或者开发语言处理数据库的工作将会极大地影响应用的性能,并且使所创建的应用完全不具备可伸缩性,此外如果在客户端过滤数据,服务器不得不通过网络发送多余的数据,这将导致网络带宽的浪费
WHERE子句的位置,应该在ORDER BY子句之前
WHERE子句操作符

何时使用引号?单引号用来限定字符串,如果将值与字符串类型的列进行比较,就需要限定引号用来与数值列进行比较的值不用引号
BETWEEN操作符,在使用时必须指定两个值—所需范围的低端值和高端值,这两个值必须用AND关键字分隔。BETWEEN匹配范围中所有的值,包括指定的开始值和结束值
eg:SELECT pro_name, prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10;
空值检测,在一个列不包含值时,称其包含空值NULL(NULL与字段包含0、空字符串或仅仅包含空格不同)。IS NULL子句用来检测具有NULL值的列,其语法如下:WHERE column_name IS NULL;
在过滤数据时,一定要验证被过滤列中含NULL的行确实出现在返回的数据中,因为数据库不知道它们是否匹配,所以在进行匹配过滤或者非匹配过滤时,不会返回这些结果

8 组合WHERE子句
操作符(operator)用来联结或者改变WHERE子句中的子句关键字,也称为逻辑操作符(logical operator),如AND和OR
AND用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行,当进行多个过滤条件时,每个条件间都要用AND关键字
OR操作符与AND操作符正好相反,它指示检索匹配任一条件的行,一般情况下会进行短路操作
WHERE子句可以包含任意数目的AND和OR操作符,允许两者结合以进行复杂、高级的过滤,需要注意的是OR操作符的优先级高于AND操作符,所以需要用圆括号对操作符进行明确分组
IN操作符用来指定条件范围,范围中的每一个条件都可以进行匹配,IN取一组由逗号分隔、括在圆括号中的合法值
eg:SELECT prod_name, prod_price FROM Products WHERE vend_id IN (‘ddl01’, ‘brs01’) ORDER BY prod_name;
为什么使用IN操作符?
1 在很多合法选项时,IN操作符的语法更清楚、更直观
2 在与其他AND和OR操作符组合使用IN时,求值顺序更容易理解和管理
3 IN操作符一般比一组OR操作符执行的更快
4 IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句
NOT操作符,在WHERE子句中的NOT操作符有且只有一个功能,那就是否定其后所跟的任何条件,因为NOT从不单独使用(总是和其他操作符一起使用),所以它的语法与其他操作符有所不同
NOT关键字可以用在要过滤的前面,不仅是在其后
eg:SELECT prod_name FROM Products WHERE NOT vend_id = ‘dll01’;
在简单的WHERE子句里使用NOT关键字,确实没啥优势,但是在更复杂的子句中,NOT是非常有用的,如在与IN操作符联合使用时,NOT可以非常简单地找出与条件列表不匹配的行

9 通配符进行过滤
通配符(wildcard)用来匹配值的一部分的特殊字符,实际上是SQL的WHERE子句中有特殊含义的字符 搜索模式(search pattern)由字面值、通配符或两者组合构成的搜索条件
为了在搜索子句中使用通配符,必须使用LIKE操作符
操作符何时不是操作符?答案是,它作为谓词(predicate)时,从技术上说,LIKE是谓词而不是操作符,虽然最终的结果是相同的
%操作符,在搜索条件中,它表示任何字符出现任意次数
eg:SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE ‘Fish%’;
(注意,如果使用的是Microsoft Access,需要使用*而不是%; 区分大小写,根据DBMS的不同及其配置,搜索可以区分大小写的)
通配符%看起来像是可以匹配任何东西,但有个例外,这个就是NULL
通配符可以在搜索模式中的任意位置使用,并且可以使用多个通配符
下划线()通配符,跟%一样,但是它只能匹配单个字符,而不是多个字符(注:DB2不支持通配符,Access的为?),下划线_总是刚好匹配一个字符,不多也不少
方括号([])通配符用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符
并不是所有的DBMS都支持创建集合的 [] ,只有Access和SQL Server支持集合,为确定你使用的DBMS是否支持集合,请参阅相应的文档
Eg:SELECT cust_contact FROM Customers WHERE cust_contact LIKE ‘[JM]’;
此通配符可以用前缀字符^来否定(类似正则表达式),
Eg:SELECT cust_contact FROM Customers WHERE cust_contact LIKE ‘[^JM]’;
当然也可以用NOT操作符得出相同的结果
Eg:SELECT cust_contact FROM Customers WHERE NOT cust_contact LIKE ‘[JM]’;
是不是感受到SQL通配符的强大之处了?但是这种强大是需要付出代价的,即通配符搜索一般比前面讨论的其他搜索需要花费更长的处理时间,这里给出一些使通配符时要记住的技巧:
1 不要过度使用通配符,如果其他操作符能达到相同的目的,应该使用其他操作符
2 确实需要使用通配符时,尽量不要把它们放在搜索模式的开始处(短路搜索)
3 仔细注意通配符的位置,如果放错地方,可能不会返回相要的数据