SQL必知必会
第四版 Ben Forta
2.3 检索多个列
SELECT column1, column2, column3... FROM table1;
-- 注意多个列之间以逗号分隔
2.4 检索所有列
SELECT * FROM table;
2.5 检索不同的值
使用DISTINCT关键词
SELECT DISTINCT column1 FROM table1;
2.6 限制结果
- 返回不超过n行数据
SELECT column1 FROM table1 LIMIT number;
- 返回从第n1行起的n2行数据
SELECT column1 FROM table1 LIMIT number1 OFFSET number2;
-- 第一个数字是检索的行数,第二个数字是开始的位置
2.7 使用注释
注释可以用“–”(行内)、“#”(单行)、“/**/”(多行)
第3课 排序检索数据
3.1 排序数据
- 子句(clause):SQL语句由子句构成,有些子句是必需的,有些则是可选的,一个子句通常由一个关键字加上所提供的数据组成。例如SELECT语句的FROM子句
- 排序数据可以使用ORDER BY子句
SELECT column1 FROM table1 ORDER BY column1;
-- 注意:应该保证 ORDER BY 子句是最后一条子句,否则会报错
-- ORDER BY 子句使用的列是作为显示而选择的列,可以使用非检索列
3.2 按多个列排序
SELECT column1, column2, column3... FROM table1
ORDER BY column4, column5...;
-- 只有当column4的值相同时,才会按照column5排序
SELECT column1, column2, column3... FROM table1
ORDER BY 2, 3...;
-- 也可以按照列的相对位置进行排序,其中2代表column2,3代表column3,也可以名称和位置混用
3.4 指定排序方向
使用**DESC(DESCENDING)**关键字
SELECT column1, column2, column3... FROM table1ORDER BY column4 DESC, column5...;-- DESC只应用到位于其前面的列名,如果相对多个列进行降序排列,必须对每一列指定DESC关键字
第4课 过滤数据
4.1 使用WHERE子句
只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)
SELECT column1, column2, column3... FROM table1 WHERE column1 = x;
4.2 WHERE 子句操作符
-- <> / != 不等于-- BETWEEN 在指定的两个值之间-- IS NULL 为NULL值
4.2.2 不匹配检查
SELECT column1, column2, column3... FROM table1 WHERE column1 != 'string1';-- 如果比较的值为字符串类型,需要加''
4.2.3 范围值检查
SELECT column1, column2, column3... FROM table1 WHERE column1 BETWEEN number1 AND number2;-- BETWEEN匹配范围中所有的值,包括开始值和结束值
4.2.4 空值检查
NULL:无值(no value),它与字段包含0、空字符串或仅仅包含空格不同
SELECT column1 FROM table1 WHERE column1 IS NULL;
第5课 高级数据过滤
5.1 组合WHERE子句
操作符(operator):用来联结或改变WHERE子句中的子句的关键字,也称为逻辑操作符(logical operator)
5.1.1 AND 操作符
- AND:用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行
SELECT column1, column2, column3... FROM table1 WHERE column1 = 'string1' AND column2 <= x;
5.1.2 OR 操作符
- OR:用在WHERE子句中的关键字,用来指示检索匹配任一给定条件的行
SELECT column1, column2, column3... FROM table1 WHERE column1 = 'string1' OR column2 <= x;
5.1.3 求值顺序
SELECT column1, column2, column3... FROM table1 WHERE column1 = 'string1' OR column2 = x AND column3 <= y;-- 在上述语句中,SQL会优先执行‘column2=x AND column<=y’这个子句,因为SQL中,AND的优先级高于OR,如果想要优先过滤OR,可以使用圆括号,圆括号具有比AND和OR更高的求值顺序,如下:SELECT column1, column2, column3... FROM table1 WHERE (column1 = 'string1' OR column2 = x) AND column3 <= y;
5.2 IN 操作符
IN:用来指定条件范围,范围中的每个条件都可以进行匹配。IN取一组由逗号分隔、括在圆括号中的合法值,与OR作用相当。推荐使用IN(更直观、更清楚;求值顺序容易管理;执行更快;能够更动态建立)
SELECT column1, column2, column3... FROM table1 WHERE column1 IN ('string1', 'string2');
5.3 NOT 操作符
NOT:WHERE子句中用来否定其后条件的关键字
SELECT column1 FROM table1 WHERE NOT column1 = 'string1';
第6课 用通配符进行过滤
6.1 LIKE 操作符
通配符(wildcard):用来匹配值的一部分的特殊字符
搜索模式(search pattern):由字面值、通配符或两者组合构成的搜索条件
6.1.1 百分号(%)通配符
最常使用的通配符是百分号(%),%表示任何字符出现任意次数
SELECT column1, column2 FROM table1 WHERE column1 LIKE 'string%'
6.1.2 下划线(_)通配符
下划线(_)代表单个字符
SELECT column1, column2 FROM table1 WHERE column1 LIKE '_string'
第7课 创建计算字段
7.1 计算字段
字段(field):基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常与计算字段一起使用
7.2 拼接字段
拼接(concatenate):将值联结到一起(将一个值附加到另一个值)构成单个值
Access和SQL Server 使用**+号;DB2、Oracle、PostgreSQL、SQLite和Open Office Base使用||**,MySQL和MariaDB需要使用语句
SELECT Concat(vend_name, '(', vend_country, ')') FROM Vendors ORDER BY vend_name;-- 有的数据库可能会再两列中自动填充空格,这时可以用 RTRIM() 去掉右空格,LTRIM() 去掉左空格,TRIM() 去掉两侧空格
- 使用别名:别名(alias)也称为导出列(derived column),是一个字段或值的替换名,使用AS关键字。如果别名需要使用字符串,则需要使用单引号括起来(一般不推荐使用字符串)
SELECT Concat(vend_name, '(', vend_country, ')') AS vend_title FROM vendors ORDER BY vend_name;
7.3 执行算数计算
可以使用 + - * / 进行算数计算
SELECT prod_id, quantity, item_price, quantity*item_price FROM orderitems WHERE order_num = 20008;
第8课 使用函数处理数据
8.1 函数
可移植(portable):所编写的代码可以再多个系统上运行
不同DBMS的函数用法很不一样,在使用时需要查阅文档
8.2 使用函数
8.2.1 文本处理函数
- 常用文本处理函数
函数 说明-------------------------------------------LEFT() 返回字符串左边的字符LENGTH() 返回字符串的长度LOWER() 将字符串转换为小写LTRIM() 去掉字符串左边的空格RIGHT() 去掉字符串右边的字符RTRIM() 去掉字符串右边的空格SOUNDEX() 转换为字母的语言UPPER() 将字符串转换为大写
SELECT vend_name, UPPER(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name;
8.2.2 日期和时间处理函数
- 举例:检索2012年的所有订单
-- MySQLSELECT order_num FROM orders WHERE YEAR(order_date) = 2012;-- PostgreSQLSELECT order_num FROM orders WHERE DATE_PART('year', order_date) = 2012;
8.2.3 数值处理函数
- 常用数值处理函数
函数 说明
ABS() 返回一个数的绝对值COS() 返回一个弧度的余弦EXP() 返回一个数的指数值PI() 返回圆周率SIN() 返回一个弧度的正弦SQRT() 返回一个数的平方根TAN() 返回一个弧度的正切