《SQL必知必会》读书笔记(1)
《SQL必知必会》读书笔记(1)
SQL, 即Strutured Query Language
。由于具体实现的DBMS
之语法和特性不尽相同,下面示例只收录通用的和MySql的。
数据库
- 数据库管理系统
DBMS
,Database Management System
- 数据库
database
- 表
table
- 模式
schema
,描述表的信息 - 表名在同一数据库中唯一
- 模式
- 列
column
- 数据类型
datatype
- 数据类型
- 行
row
- 等同于
record
- 等同于
- 主键
primary key
- 唯一表示表中每一行,不能改,删后不可重用
- 可以用多列组合为主键
检索
SELECT
- 没有指明排序方式,则输出顺序不尽相同;
- 以分号
;
结束,按逻辑分成多行; - SQL关键字用大写,方便阅读;
- 子句
clause
SELECT prod_name
FROM Products;
检索多列
以逗号,
隔开,最后一个不加
SELECT prod_id, prod_name, prod_price
FROM Products;
检索所有列
*
号是通配符
SELECT *
FROM Products;
检索不同值
DISTINCT
关键字,只返回不同的值,作用于所有的列
SELECT DISTINCT vend_id
FROM Products;
限制结果
- 首行是第0行
LIMIT
关键字,最多返回n条SELECT prod_name FROM Products LIMIT 5;
OFFSET
关键字,从第n条开始算
SELECT prod_name
FROM Products
LIMIT 3 OFFSET 4;
简写如下,前值为OFFSET
,后值为LIMIT
SELECT prod_name
FROM Products
LIMIT 4, 3;
注释
--
或 #
或 /* */
SELECT prod_name -- 这是注释
FROM Products;
# 这是注释
SELECT prod_name
FROM Products;
/* 这是
多行注释 */
SELECT prod_name
FROM Products;
排序检索
排序数据
ORDER BY
关键字,只能放在最后一句
SELECT prod_name
FROM Products
ORDER BY prod_name;
多个排序字段
SELECT prod_name
FROM Products
ORDER BY prod_price, prod_name;
按列位置排序,下例即按prod_price, prod_name
排序
SELECT prod_name, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
排序方向
ASC
默认升序(从A到Z),DESC
降序(从Z到A),默认不区分大小写,Aa等同,除非改设置
SELECT prod_name, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC;
过滤数据
WHERE子句
- 搜索条件search criteria
- 过滤条件filter criteria
SELECT prod_name, prod_price, prod_name
FROM Products
WHERE prod_price = 3.49;
WHERE子句操作符
操作符 | 说明 | 操作符 | 说明 |
---|---|---|---|
= | 等于 | > | 大于 |
<> | 不等于 | >= | 大于等于 |
!= | 不等于 | !> | 不大于 |
< | 小于 | BETWEEN | 在两个值之间 |
<= | 小于等于 | IS NULL | 为NULL |
!< | 不小于 |
检查单个值
SELECT prod_name, prod_price
FROM Products
WHERE prod_price < 10;
比较字符串时要加引号
SELECT prod_name, prod_price
FROM Products
WHERE prod_name != 'abc';
BETWEEN
匹配范围时包含两端
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 0 AND 10;
空值检查, 只匹配NULL,不包含0
SELECT prod_name, prod_price
FROM Products
WHERE prod_price IS NULL;
组合WHERE子句
操作符operator
AND
操作符
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'D1' AND prod_price <= 4;
OR
操作符
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'D1' OR vend_id = 'D2';
IN
操作符
SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ( 'D1', 'D2' );
NOT
操作符
SELECT prod_name, prod_price
FROM Products
WHERE NOT vend_id = 'D1';
求值顺序
AND
优先级比OR
高,多个操作符应该用括号()
分割
通配符过滤
- 通配符wildcard
- 搜索模式search pattern
- 谓词predicate
百分号%
通配符, 可以匹配0个字符,但不匹配NULL
通配符 | 说明 |
---|---|
% | 可以匹配0-N个字符,但不匹配NULL |
_ | 只匹配单个字符 |
[] | 指定一个字符集,用^表示否定 |
SELECT prod_name, prod_price
FROM Products
WHERE NOT prod_name LIKE '%Fish%';
SELECT prod_name, prod_price
FROM Products
WHERE NOT prod_name LIKE '[^JM]%';
- 搜索区分大小写
- 不要过度使用通配符,其他操作符优先
- 确实需要用时,放在搜索模式最后
计算字段
- 字段field
- 拼接concatenate
拼接字段
||
操作符
SELECT vend_name + ' (' + vend_country + ')'
FROM Vendors
ORDER BY vend_name;
MySql使用Concat
函数
SELECT Concat(vend_name, ' (', vend_country, ')')
FROM Vendors
ORDER BY vend_name;
别名
- 别名alias
- 导出列derived column
AS
操作符, 可用于字段名不合法或易混淆时重新命名之。
SELECT vend_name AS vend_title
FROM Vendors
ORDER BY vend_name;
算数计算
加减乘除+-*/
SELECT prod_id, quantity, item_price, quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;