SQL 必知必会(第 4 版)(2013)
第一课 了解 SQL
- 数据库基础
- 数据库
- 数据库(database),数据库是一个以某种有组织的方式存储的数据集合。
- 表
- 表(table),某种特定类型数据的结构化清单。
- 模式,关于数据库和表的布局及特性的信息。
- 列和数据类型
- 表由列组成。列存储表中某部分的信息。
- 列(column),表中的一个字段。所有表都是由一个或多个列组成的。
- 数据类型,所允许的数据的类型。每个表列都有相应的数据类型,它限制(或允许)该列中存储的数据。
- 行
- 表中的数据是按行存储的,所保存的每个记录存储在自己的行内。
- 行(row),表中的一个记录。
- 主键
- 表中每一行都应该有一列(或几列)可以唯一标识自己。
- 主键(primary key),一列(或一组列),其值能够唯一标识表中每一行。
- 应该总是定义主键。
- 数据库
- 什么是 SQL
- SQL 是 Structured QueryLanguage(结构化查询语言)的缩写。SQL 是一种专门用来与数据库沟通的语言。
- SQL 有如下的优点:
- SQL 不是某个特定数据库供应商专有的语言。
- SQL 简单易学。
- SQL 虽然看上去很简单,但实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。
第二课 索引数据
- SELECT 语句
- 关键字(keyword)作为 SQL 组成部分的保留字。关键字不能用作表或列的名字。
- 检索单个列
SELECT prod_name FROM Products;
- 多条 SQL 语句必须以分号(;)分隔。
- 请注意,SQL 语句不区分大小写,因此 SELECT 与 select 是相同的。
- 检索多个列
- 在选择多个列时,一定要在列名之间加上逗号,但最后一个列名后不加。
- SQL语句一般返回原始的、无格式的数据。数据的格式化是表示问题,而不是检索问题。
- 检索所有列
- 除了指定所需的列外(如上所述,一个或多个列), SELECT 语句还可以检索所有的列而不必逐个列出它们。在实际列名的位置使用星号(*)通配符可以做到这点。
- 一般而言,除非你确实需要表中的每一列,否则最好别使用 * 通配符。
- 检索不同的值
- 使用 DISTINCT 关键字,顾名思义,它指示数据库只返回不同的值。
- DISTINCT 关键字作用于所有的列,不仅仅是跟在其后的那一列。
- 限制结果
- 并非所有的 SQL 实现都一样。
- 使用注释
- 注释从
/*
开始,到*/
结束,/*
和*/
之间的任何内容都是注释。这种方式常用于给代码加注释。 - 注释使用
--
(两个连字符)嵌在行内。--
之后的文本就是注释。
- 注释从
第三课 排序检索数据
- 排序数据
- SQL 语句由子句构成,有些子句是必需的,有些则是可选的。一个子句通常由一个关键字加上所提供的数据组成。
- 为了明确地排序用 SELECT 语句检索出的数据,可使用 ORDER BY 子句。ORDER BY 子句取一个或多个列的名字,据此对输出进行排序。
- 在指定一条 ORDER BY 子句时,应该保证它是 SELECT 语句中最后一条子句。
- 通常,ORDER BY 子句中使用的列将是为显示而选择的列。
- 按多个列排序
- 要按多个列排序,简单指定列名,列名之间用逗号分开即可(就像选择多个列时那样)。
- 按列位置排序
- 除了能用列名指出排序顺序外,ORDER BY 还支持按相对列位置进行排序。
- 指定排序方向
- 数据排序不限于升序排序(从 A 到 Z),这只是默认的排序顺序。还可以使用 ORDER BY 子句进行降序(从 Z 到 A)排序。为了进行降序排序,必须指定 DESC 关键字。
- DESC 关键字只应用到直接位于其前面的列名。
- 如果想在多个列上进行降序排序,必须对每一列指定 DESC 关键字。
第四课 过滤数据
- 使用 WHERE 子句
- 在 SELECT 语句中,数据根据 WHERE 子句中指定的搜索条件进行过滤。WHERE 子句在表名(FROM 子句)之后给出。
- 在同时使用 ORDER BY 和 WHERE 子句时,应该让 ORDER BY 位于 WHERE 之后,否则将会产生错误。
- WHERE 子句操作符
- 想确定你的 DBMS 支持哪些操作符,请参阅相应的文档。
- 检查单个值
SELECT prod_name, prod_price FROM Products WHERE prod_price < 10;
- 不匹配检查
- 如果将值与字符串类型的列进行比较,就需要限定引号。用来与数值列进行比较的值不用引号。
- 范围值检查
- 要检查某个范围的值,可以使用 BETWEEN 操作符。其语法与其他 WHERE 子句的操作符稍有不同,因为它需要两个值,即范围的开始值和结束值。
- 在使用 BETWEEN 时,必须指定两个值——所需范围的低端值和高端值。这两个值必须用 AND 关键字分隔。BETWEEN 匹配范围中所有的值,包括指定的开始值和结束值。
- 空值检查
- 在创建表时,表设计人员可以指定其中的列能否不包含值。在一个列不包含值时,称其包含空值 NULL。
- NULL 无值(no value),它与字段包含0、空字符串或仅仅包含空格不同。
- 过滤数据时,一定要验证被过滤列中含NULL的行确实出现在返回的数据中。
第五课 高级数据过滤
- 组合 WHERE 子句
- 有两种使用方式,即以 AND 子句或 OR 子句的方式使用。
- 操作符(operator)用来联结或改变 WHERE 子句中的子句的关键字,也称为逻辑操作符(logical operator)。
- AND 操作符
- 要通过不止一个列进行过滤,可以使用 AND 操作符给 WHERE 子句附加条件。
- AND 用在 WHERE 子句中的关键字,用来指示检索满足所有给定条件的行。
- 可以增加多个过滤条件,每个条件间都要使用AND关键字。
- 可以加上一个 ORDER BY 子句,它应该放在 WHERE 子句之后。
- OR 操作符
- OR 操作符与 AND 操作符正好相反,它指示 DBMS 检索匹配任一条件的行。
- WHERE 子句中使用的关键字,用来表示检索匹配任一给定条件的行。
- 求值顺序
- WHERE 子句可以包含任意数目的 AND 和 OR 操作符。允许两者结合以进行复杂、高级的过滤。
- SQL(像多数语言一样)在处理 OR 操作符前,优先处理 AND 操作符。解决方法是使用圆括号对操作符进行明确分组。
- 任何时候使用具有AND和OR操作符的 WHERE 子句,都应该使用圆括号明确地分组操作符。
- IN 操作符
- IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN 取一组由逗号分隔、括在圆括号中的合法值。
- 使用 IN 操作符,其优点如下:
- 在有很多合法选项时,IN 操作符的语法更清楚,更直观。
- 在与其他 AND 和 OR 操作符组合使用 IN 时,求值顺序更容易管理。
- IN 操作符一般比一组 OR 操作符执行得更快。
- IN 的最大优点是可以包含其他 SELECT 语句,能够更动态地建立 WHERE 子句。
- WHERE 子句中用来指定要匹配值的清单的关键字,功能与 OR 相当。
- NOT 操作符
- WHERE 子句中的 NOT 操作符有且只有一个功能,那就是否定其后所跟的任何条件。因为 NOT 从不单独使用(它总是与其他操作符一起使用),所以它的语法与其他操作符有所不同。NOT 关键字可以用在要过滤的列前,而不仅是在其后。
第六课 用通配符进行过滤
- LIKE 操作符
- 利用通配符,可以创建比较特定数据的搜索模式。
- 通配符(wildcard)用来匹配值的一部分的特殊字符。
- 搜索模式(search pattern)由字面值、通配符或两者组合构成的搜索条件。
- 为在搜索子句中使用通配符,必须使用 LIKE 操作符。LIKE指示 DBMS,后跟的搜索模式利用通配符匹配而不是简单的相等匹配进行比较。
- 通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索。
- 百分号(%)通配符
- 在搜索串中,% 表示任何字符出现任意次数:
SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE 'Fish%';
,执行这条子句时,将检索任意以 Fish 起头的词。% 告诉 DBMS 接受 Fish 之后的任意字符,不管它有多少字符。 - 通配符可在搜索模式中的任意位置使用,并且可以使用多个通配符。
- 通配符%看起来像是可以匹配任何东西,但有个例外,这就是NULL。
- 在搜索串中,% 表示任何字符出现任意次数:
- 下划线(_)通配符
- 下划线的用途与 % 一样,但它只匹配单个字符,而不是多个字符:
SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE '_ inch teddy bear';
。
- 下划线的用途与 % 一样,但它只匹配单个字符,而不是多个字符:
- 方括号([])通配符
- 方括号([])通配符用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符:
SELECT cust_contact FROM Customers WHERE cust_contact LIKE '[JM]%' ORDER BY cust_contact;
,[JM]
匹配方括号中任意一个字符,它也只能匹配单个字符。
- 方括号([])通配符用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符:
- 使用通配符的技巧
- 通配符搜索一般比前面讨论的其他搜索要耗费更长的处理时间。
- 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
- 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
- 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
- 通配符搜索一般比前面讨论的其他搜索要耗费更长的处理时间。