《SQL必知必会》第五版学习笔记
SQL不区分大小写,一般将关键字大写有助于我们区分关键字和列名、表名。
检索多个列
SELECT prod_id,prod_name,prod_price
FROM Products;
检索所有列
SELECT *
FROM Products;
检索不同的值
使用DISTINCT关键字,它指示数据库只返回不同的值,必须直接放在列名的前面。
DISTINCT关键字作用于其后的所有的列。
SELECT DISTINCT vend_id
FROM Products;
限制结果
要返回一定数量的行,不用数据库的语句不同。
# 只检索前五行
# SQL Sever:
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:
SELECT prod_name
FROM Products
LIMIT 5;
# 返回第五行起的五行数据:
# 第一个数字是检索的行数,第二个数字是指从哪儿开始
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;
# 可以把LIMIT 4 OFFSET 3语句简化为LIMIT 3,4
# 使用这个语法,逗号之前的值对应OFFSET,逗号之后的值对应LIMIT
注释
# 这是一条注释
SELECT prod_name -- 这是一条注释
FROM Products;
/*
多行注释
SELECT prod_id,prod_name,prod_price
FROM Products;
*/
排序数据
# 在指定一条ORDER BY子句时,应保证它是SELECT语句中最后一条子句,否则将会出错
# 可以通过非选择列进行排序
SELECT prod_name
FROM Products
ORDER BY prod_name;
按多个列排序
# 先按价格,然后按名称排序
# 仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序
SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY prod_price,prod_name;
按列位置排序
# 按SELECT清单中的相对列位置进行排序
SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY 2,3;
# 好处:不用重复输入列名
# 坏处:
# 不明确给出列名有可能造成错用列名排序;
# 在对SELECT清单进行更改时容易错误地对数据进行排序
# 如果进行排序的列不在SELECT清单中,显然不能使用这种语句
# 如果有必要,可以混合使用实际列名和相对列位置
指定排序方向
# 默认升序排序(ASC),可以指定DESC关键字进行降序排序
# DESC关键字只应用到直接位于其前面的列名
# 如果想在多个列上进行降序排序,必须对每一列指定DESC关键字
SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY prod_price DESC,prod_name;
使用WHERE子句
# 在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误。
SELECT prod_name,prod_price
FROM Products
WHERE prod_price = 3.49;
WHERE子句操作符
# 不同DBMS支持不同的操作符,具体情况请参阅相应的文档
= 等于
<>或者!= 不等于
< 小于
<= 小于等于
!< 不小于
(大于 同理)
(not) BETWEEN AND (不)在两个值之间
(not) IN (不)在
IS NULL 为NULL值
组合WHERE子句
# AND操作符
SELECT prod_id,prod_price,prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
# OR操作符
SELECT prod_id,prod_price,prod_name
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
# 由于AND在求值过程中优先级更高,有时操作符会被错误的组合,我们可以使用圆括号对操作符进行明确的分组。
SELECT prod_id,prod_price,prod_name
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;
# IN操作符
# 取一组由逗号分隔、括在圆括号中的合法值,用来指定条件范围
SELECT prod_name,prod_price
FROM Products
WHERE vend_id IN ('DLL01','BRS01')
ORDER BY prod_name;
# NOT操作符
# 用来否定其后的条件
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
用通配符进行过滤
通配符:用来匹配值的一部分的特殊字符
搜索模式:由字面值、通配符或两者组合构成的搜索条件
# LIKE操作符
# 百分号(%)通配符
# %表示任何字符出现任意次数,包括零次
# 不能匹配NULL
# 找出所有以词Fish起头的产品
SELECT prod_id,prod_name
FROM Products
WHERE prod_name LIKE 'Fish%';
# 下划线(_)通配符
# 只匹配单个字符
SELECT prod_id,prod_name
FROM Products
WHERE prod_name LIKE '__ inch teddy bear';
# 方括号([])通配符
# 用来指定一个字符集,它必须匹配指定位置(通配符位置)的一个字符
# 找出所有名字以J或M起头的联系人
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[JM]%'
ORDER BY cust_contact;
# 此通配符可以用前缀字符^(脱字号)来否定
# 查询匹配以J和M之外的任意字符起头的联系人
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[^JM]%'
ORDER BY cust_contact;
# 也可以使用NOT操作符
SELECT cust_contact
FROM Customers
WHERE NOT cust_contact LIKE '[JM]%'
ORDER BY cust_contact;
# 使用通配符的技巧
# 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
# 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
# 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。