SQL必知必会(第3版)
Ben Forta 著
钟鸣, 刘晓霞等 译
第1章 了解SQL
- 基础:数据库、数据库技术
数据库
区别于数据库软件(数据库管理系统,DBMS)
表(table)
- 某种特定类型(类别)数据的结构化清单
- 模式(shhema):关于数据库和表的布局及特性的信息。
列和数据类型
- 列(colomn):表中的一个字段
- 每个列都有相应的数据类型(datatype)
- 数值、日期、文本、注释等
行(row)/记录(record)
- 数据按行存储
主键(primary key)
- 每一行应该有可以唯一标识自己的一列(或一组列)
- 应该总是定义主键(即使不一定用到)
- 作为主键的列应满足以下条件:
- 任意两行都不具有相同的主键值
- 每个行都必须具有一个主键值(主键列不允许NULL值)
- 主键列中的值不允许修改或更新
- 主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)
什么是SQL
- 结构化查询语言(Structured Query Language),用来与数据库通信的语言。
- SQL由很少的词构成。
第2章 检索数据
SELECT语句
- 从一个或多个表中检索信息
- 关键字(keyword):SQL保留字
检索单个列
SELECT prod_name
FROM Products;
注意
- SQL语句并不区分大小写。
- SQL语句可以分成多行,所有空格都被忽略
- 多条SQL语句必须以分号分隔,单条SQL语句并不需要
检索多个列
SELECT prod_id, prod_name, prod_price
FROM Products;
检索所有列 *通配符
SELECT *
FROM Products;
第3章 排序检索数据
- SELECT语句的 ORDER BY子句
排序数据
关系数据库设计理论认为:如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义。
子句(clause)
- ORDER BY子句取一个或多个列的名字,据此对输出进行排序
SELECT prod_name
FROM Products
ORDER BY prod_name;
- ORDER BY子句,应保证它是SELECT语句中最后一条子句。
- 也可以通过非选择列进行排序
按多个列排序
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;
按列位置排序
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
- 分析:2, 3代表SELECT清单中的prod_price, prod_name
指定排序方向
- 默认升序排序(A-Z)
- 降序操作:DESC关键字
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC;
- 多列排序
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name;
- 分析:DESC关键字只作用于直接位于其前面的列名,想在多个列上进行降序排序,必须对每个列指定DESC关键字。
- DESC为DESCENDING的缩写,反义词是ASC(ASCENDING)
注意:排序时是否区分大小写要视DBMS而定。
第4章 过滤数据
- WHERE子句(指定搜索条件(search criteria),即过滤条件(filter condition))
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;
- ORDER BY子句位于WHERE之后
WHERE子句操作符
- != 不等于
- BETWEEN 介于
- IS NULL 为NULL值
检查单个值
SELECT prod_name, prod_price
FROM Products
WHERE prod_price < 10;
不匹配检查
SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01';
- Access中,不支持!=
- ‘DLL01’不能用双引号
范围值检查
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
- BETWEEN包含两端的值。
- 最小值和最大值在AND前后的位置可互换。
空值检查
- 空值NULL
SELECT vend_id
FROM Vendors
WHERE vend_state IS NULL;
第5章 高级数据过滤
- WHERE组合(AND, OR)
- NOT
- IN
AND操作符
SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
OR操作符
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
计算次序
- AND优先级要高
- 必要时用括号()
IN操作符
SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ('DLL01', 'BRS01')
ORDER BY prod_name;
- 类似于OR的组合
- 优点:
- 使用长的选项清单时,IN操作符清楚直观
- 计算次序容易管理
- 执行更快
- 可以包含其他SELECT语句,能够更动态地建立WHERE子句
NOT操作符
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
- 类似于<>不等于,但是在复杂语句中更强大
- 与IN操作符搭配使用