《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;