目录
- 内容提要&相关资源
- 正文
-
- 第1课 了解SQL
- 第2课 检索数据
- 第3课 排序检索数据 ORDER BY
- 第4课 过滤数据
- 第5课 高级数据过滤
- 第6课 用通配符进行过滤
- 第7课 创建计算字段
- 第8课 使用函数处理数据
- 第9课 汇总数据
- 第10课 分组数据 GROUP BY & HAVING
- 第11课 使用子查询
- 第12课 联结表 JOIN
- 第13课 创建高级联结
- 第14课 组合查询 UNION
- 第15课 插入数据
- 第16课 更新和删除数据
- 第17课 创建和操纵表
- 第18课 使用视图
- 第19课 使用存储过程
- 第20课 管理事务处理(transaction processing)
- 第21课 使用游标(cursor)
- 第22课 高级SQL特性
内容提要&相关资源
- 本书由浅入深地讲解了 SQL的基本概念和语法,涉及数据的排序、过滤和分组,以及表、视图、联结、子查询、游标、存储过程和触发器等内容,实例丰富,便于查阅。
- 新版增加了针对 Apache Open Office Base、MariaDB、SQLite 等 DBMS 的描述,并根据最新版本的 Oracle、SQL Server、MySQL 和 PostgreSQL 更新了相关示例。
- 本书适合SQL初学者。
- 英文原版勘误表: Errata: Sams Teach Yourself SQL in 10 Minutes (Fourth Edition).
- 英文原版第5版:Sams Teach Yourself SQL in 10 Minutes (Fifth Edition)
正文
第1课 了解SQL
数据库基础
- 数据库(database):保存有组织的数据的容器(通常是一个文件或一组文件)。
- 数据库软件:数据库管理系统(DBMS/Database Management System)。
数据库是通过DBMS创建和操纵的容器。
- 表(table):某种特定类型的结构化清单。
数据库名和表名的组合是唯一的,即在相同数据库中表名唯一不可重复,但在不同数据库中可使用相同表名。 - 模式(schema):关于数据库和表的布局及特性的信息。
模式可用来描述数据库中特定的表,也可以用来描述整个数据库(和其中表的关系)。
- 列(column):表中的一个字段。所有表都是由一个或多个列组成的。
- 数据类型(datatype):所允许的数据的类型。每个表列都有相应的数据类型,它限制(或允许)该列中存储的数据。
不同的DBMS中,相同的数据类型可能有不同的名称。 - 行(row):表中的一个记录。
- 主键(primary key):一列(或一组列),其值能够唯一标识表中的每一行。
应该总是定义主键。 - 主键需要满足的条件:
- 任意两行都不具有相同的主键值(Not Null)
- 每一行都必须具有一个主键值
- 主键列中的值不允许修改或更新
- 主键值不能重用(如果删去某行,不可将它的主键赋给以后的新行)
主键可以是多个列的组合,多列作为主键时,它们及它们的组合必须满足以上条件,它们的组合必须是唯一的,但单个列的值可以不唯一。
- 外键
什么是SQL
SQL(sequel)是Structured Query Language(结构化查询语言)的缩写,是一种专门用来与数据库沟通的语言。
第2课 检索数据
检索单个列
SELECT prod_name
FROM Products;
- 默认不排序
- 以分号分隔多条SQL语句
- SQL语句不区分大小写,但一般关键字大写,列名表名小写
- 是否换行无影响,但分成多行更利于阅读调试
检索多个列
SELECT prod_id, prod_name, prod_price
FROM Products;
- 选择多个列时,记得在列名间加上逗号,但最后一个列名后不加
检索所有列
SELECT *
FROM Products;
- 通配符(*)
检索不同的值 DISTINCT
SELECT DISTINCT vend_id
FROM Products;
- DISTINCT作用于所有的列,不仅仅是跟在其后的那一列.
限制结果
- SQL Server、 Access - TOP
SELECT TOP 5 prod_name
FROM Products;
- DB2
SELECT prod_name
FROM Products
FETCH FIRST 5 ROWS ONLY;
- Oracle
SELECT prod_name
FROM Products
WHERE ROWNUM <=5;
- MySQL、MariaDB、PostgreSQL、SQLite - LIMIT
SELECT prod_name
FROM Products
LIMIT 6 OFFSET 5;
-- 返回从第6行起的5行数据,即第7、8、9、10、11行
-- 在MySQL和MariaDB中,可省略OFFSET,即 LIMIT 5,6,逗号前的值对应OFFSET,逗号后的值对应LIMIT
/* 给代码加注释的方法
SELECT prod_name, vend_id
FROM Products; */
第3课 排序检索数据 ORDER BY
- 子句(clause): SQL语句由子句构成,有些子句是必需的,有些则是可选的。一个子 句通常由一个关键字加上所提供的数据组成。
- ORDER BY 必须是SELECT语句中的最后一条子句;
- 可用非检索的列排序数据;
- 可按照多个列排序,排序顺序按规定进行
- 可按照列位置排序:
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
-- 按照列的相对位置对应列排序,即按照SELECT中的第二列prod_price、第三列prod_name排序
-- 按照这种方法将无法按照不在SELECT清单中的列排序
-- 两种排序方法(实际列名、相对列位置)可以混合使用
- 默认升序ASC,可使用DESC关键字进行降序。DESC关键字之应用到直接位于其前面的列名,如果想在多个列上进行降序排序,必须对每一列制定DESC关键字;
第4课 过滤数据
搜索条件(search criteria)/ 过滤条件(filter condition)
WHERE
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
SELECT prod_name
FROM Products
WHERE prod_price IS NULL;
第5课 高级数据过滤
- 操作符(operator): 用来联结或改变 WHERE 子句中的子句的关键字,也称为逻辑操作符 (logical operator)。
操作符 | 定义 |
---|---|
AND | 用在 WHERE 子句中的关键字,用来指示检索满足所有给定条件的行 |
OR | WHERE 子句中使用的关键字,用来表示检索匹配任一给定条件的行 |
注意 | SQL默认优先处理AND,后处理OR;所以最好用括号明确分组操作符以避免错误。 |
IN | WHERE 子句中用来指定要匹配值的清单的关键字,功能与 OR 相当 |
NOT | WHERE 子句中用来否定其后条件的关键字 |
说明 | MariaDB 中的 NOT MariaDB 支持使用 NOT 否定 IN、BETWEEN 和 EXISTS 子句。大多数 DBMS允许使用 NOT 否定任何条件。 |
SELECT prod_name, prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;
SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ( 'DLL01', 'BRS01' )
ORDER BY prod_name;
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
第6课 用通配符进行过滤
- 通配符(wildcard):用来匹配值的一部分的特殊字符。
通配符本身实际上是 SQL的 WHERE 子句中有特殊含义的字符。
通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用 通配符搜索。 - 搜索模式(search pattern):由字面值、通配符或两者组合构成的搜索条件。
LIKE操作符
通配符 | 含义 | 注意 |
---|---|---|
百分号(%) | 表示任何字符出现任意次数 | % 代表搜索模式中给定位置的0个、1个或多个字符; %不会匹配为 NULL 的行 |
下划线(_) | 只匹配单个字符 | _总是刚好匹配一个字符,不能多也不能少 |
方括号([]) | 用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符 | 此通配符可以用前缀字符^(脱字号)来否定;只有微软的 Access 和 SQL Server 支持集合 |
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE 'Fish%';
-- 检索任意以Fish起头的词,%告诉 DBMS接受 Fish 之后的任意字符,不管它有多少字符。
-- 说明:Access 通配符如果使用的是 Microsoft Access,需要使用*而不是%。
-- 说明:区分大小写 根据 DBMS的不同及其配置,搜索可以是区分大小写的。
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '%bean bag%';
-- 搜索模式'%bean bag%'表示匹配任何位置上包含文本 bean bag 的值,不论它之前或之后出现什么字符。
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '__ inch teddy bear'; -- 两个下划线
-- 这个 WHERE 子句中的搜索模式给出了后面跟有文本的两个通配符。
-- 结果只显示匹配搜索模式的行,如“12 inch teddy bear ”、“18 inch teddy bear ”,因为搜索模式要求匹配两个通配符。
-- 说明:DB2 通配符 DB2不支持通配符_。
-- 说明:Access 通配符 如果使用的是 Microsoft Access,需要使用?而不是_。
FROM Customers
WHERE cust_contact LIKE '[JM]%'
ORDER BY cust_contact;
-- 此语句的WHERE子句中的模式为'[JM]%'。这一搜索模式使用了两个不同的通配符。
-- [JM]匹配方括号中任意一个字符,它也只能匹配单个字符。因此,任何多于一个字符的名字都不匹配。
-- [JM]之后的%通配符匹配第 一个字符之后的任意数目的字符,返回所需结果。
- 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
- 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
- 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
第7课 创建计算字段
- 字段(field):基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常与计算字段一起使用。
计算字段并不实际存在于数据库表中。计算字段是运行时在 SELECT 语句内创建的。 - 拼接(concatenate):将值联结到一起(将一个值附加到另一个值)构成单个值。
DBMS | 拼接 |
---|---|
Access、SQL Server | + |
DB2、Oracle、PostgreSQL、SQLite、Open Office Base | II |
SELECT vend_name + ' (' + vend_country + ')'
FROM Vendors
ORDER BY vend_name;
SELECT vend_name || ' (' || vend_country || ')'
FROM Vendors
ORDER BY vend_name;
SELECT Concat(vend_name, ' (', vend_country, ')') --MySQL、MariaDB
FROM Vendors
ORDER BY vend_name;
去除值右边的所有空格 RTRIM()
许多数据库(不是所有)保存填充为列宽的文本值,而实际上你要的结果不需要这些空格。为正确返回格式化的数据,必须去掉这些空格。这可以使用 SQL的 RTRIM()函数来完成,如下所示:
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')' -- 去掉vend_name和vend_country中的