SQL必知必会第4版学习笔记
说明
本书实操关系表共包括下图所示(Access2016)的5个:
Customers, OrderItems, Orders, Products和Vendors。
分别对应:顾客表,订单清单,订单,产品和供应商。
Orders表包含收到的所有订单,OrderItems表包含每个订单中的各项物品
表关系如下图:
第1课 了解SQL
1.1 数据库基础
数据库 区分Database和DBMS。
数据库:保存有组织的数据的容器(通常是一个文件或一组文件)。
数据库管理系统:数据库软件
表(table) 表是一种结构化的文件,可用来存储某种特定类型的数据。(某种特定类型数据的结构化清单)
模式(schema) 关于数据库和表的布局及特性的信息。
列(column) 表中的一个字段。所有表都是由一个或多个列组成的。
行(row) 表中的一个记录。表中的数据是按行储存的。
主键(primary key) 一列(或一组列),其值能够唯一标识表中每一行。
- 任意两行都不具有相同的主键值;
- 每一行都必须具有一个主键值(主键列不允许NULL值);
- 主键列中的值不允许修改或更新;
- 主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)。
1.2 什么是SQL
发音 字母S-Q-L或sequel。
全称 Structured Query Language 结构化查询语言。
第2课 检索数据
2.1 SELECT语句
关键字(keyword) 作为SQL组成部分的保留字。关键字不能用作表或列的名字。
2.2 检索单个列
输入↓
SELECT prod_name
FROM Products;
2.3 检索多个列
输入↓
SELECT prod_name, prod_name, prod_price
FROM Products;
输出↓
2.4 检索所有列
输入↓
SELECT *
FROM Products;
输出↓
2.5 检索不同的值
SELECT DISTINCT vend_id
FROM Products;
2.6 限制结果
输入↓
SELECT TOP 5 prod_name
FROM Products;
Access语句–只检索前5行数据。
输出↓
第3课 排序检索数据
3.1 排序数据
ORDER BY子句
- 位置:保证它是SELECT语句中最后一条子句。
- 可以用非检索的列对数据进行排序。
输入↓
SELECT prod_name
FROM products
ORDER BY prod_name;
输出↓
3.2 按多个列排序
首先按价格,然后按名称排序。
输入↓
SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price, prod_name;
输出↓
3.3 按列位置排序
输入↓
SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY 2,3;
输出↓
按列位置进行排序的优缺点:
优点: 不用重新输入列名;
缺点:
- 不明确给出列名可能造成错用列名排序;
- 在对SELECT清单进行改动时容易错误地对数据进行排序(忘记对ORDER BY 子句做相应的改动);
- 如果进行排序的列不在SELECT清单中则不能使用。
3.4 指定排序方向
降序排序关键字DESC。
DESC是DESCENDING的缩写。
输入↓
SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price DESC, prod_name;
输出↓
如图,可以发现prod_price列按降序进行排列;而prod_name列(在每个价格内)以升序进行排列(A-Z)。
如果想在多个列上进行降序排序,必须对每一列指定DESC关键字。
第4课 过滤数据
4.1 使用WHERE子句
4.2 WHERE子句操作符
4.2.1 检查单个值
操作符 | 说明 |
---|---|
= | 等于 |
> | 大于 |
>= | 大于 |
< | 小于 |
<= | 小于等于 |
1. = 检验相等
需求:列出所有价格等于3.49美元的产品。
输入↓
SELECT prod_price, prod_name
FROM products
WHERE prod_price = 3.49;
输出↓
只返回prod_price值为3.49的行。
2.<
需求:列出所有价格小于10美元的产品。
输入↓
SELECT prod_name, prod_price
FROM Products
WHERE prod_price < 10;
输出↓
3. <=
需求:检索所有价格小于等于10美元的产品。
输入↓
SELECT prod_name, prod_price
FROM Products
WHERE prod_price <= 10;
输出↓
4.2.2 不匹配检查
操作符 | 说明 |
---|---|
!= | 不等于 |
<> | 不等于 |
!< | 不小于 |
!> | 不大于 |
需求:列出所有不是供应商DLL01制造的产品
输入↓
SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01';
输出↓
4.2.3 范围值检查
操作符 | 说明 |
---|---|
BETWEEN | 在指定的两个值之间 |
需求:检索价格在5美元和10美元之间的所有产品
输入↓
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
输出↓
范围值检查需要两个值,用AND关键字进行分隔。
4.2.4 空值检查
NULL:无值(no value),与字段包含0、空字符串或仅仅包含空格不同。
返回所有没有价格的产品。
输入↓
SELECT prod_name
FROM Products
WHERE prod_price IS NULL;
输出↓
表中没有这样的行,所以没有返回数据。
返回没有电子邮件的顾客姓名。
输入↓
SELECT cust_name
FROM Customers
WHERE cust_email IS NULL;
输出↓
第5课 高级数据过滤
5.1 组合WHERE子句
【概念】
操作符(operator):用来联结或改变WHERE子句中子句的关键字,也称为逻辑操作符(logical operator)。
5.1.1 AND操作符
需求:检索由供应商DLL01制造且价格小于等于4美元的所有产品的名称和价格。
输入↓
SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4
输出↓
△ 可以增加多个过滤条件,每个条件间都要使用AND关键字。
△ ORDER BY子句应放在WHERE子句之后。
5.1.2 OR操作符
OR: WHERE子句中使用的关键字,用来表示检索匹配任一给定条件的行。
需求:检索由任一个指定供应商DLL01/BRS01制造的所有产品的产品名和价格。
首先是错误示范(这也是我自己做的)
输入↓SELECT prod_price, prod_name FROM Products WHERE vend_id = 'DLL01' OR 'BRS01'
输出↓
然后是正确示范:
SELECT prod_price,prod_name FROM Products WHERE vend_id = 'DLL01' OR vend_id ='BRS01'
输出↓
错误和正确之间的区别在WHERE子句的OR操作符后半部分。
正确的写法应为:
WHERE vend_id = 'DLL01' OR vend_id ='BRS01'
错误的写法是:
WHERE vend_id = 'DLL01' OR 'BRS01'
我自己的理解是,单独的字符串’BRS01’在OR后是没有意义的。
5.1.3 求值顺序
圆括号>AND>OR
5.2 IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。
IN取一组由逗号分隔、括在圆括号中的合法值。
功能与OR相当。
需求:检索由供应商DLL01和BRS01制造的所有产品。
输入↓
SELECT prod_name,prod_price
FROM Products
WHERE vend_id IN