【MySQL笔记】2 SELECT语句拓展
MySQL笔记基于教材,笔记中用到的数据库可以点击该链接下载
用SELECT的ORDER BY子句排序
子句 (clause) :SQL语句由子句构成,有些子句是必须的,有些子句是可选的。一个子句通常由一个关键字和所提供的数据组成。
如果使用了ORDER BY子句,则结果按ORDER BY后指定的列排序。可以指定多个排序的列,优先级从左到右。注意ORDER BY
应放在FROM
后
mysql> SELECT prod_id, prod_price, prod_name
-> FROM products
-> ORDER BY prod_price, prod_name;
+---------+------------+----------------+
| prod_id | prod_price | prod_name |
+---------+------------+----------------+
| FC | 2.50 | Carrots |
| TNT1 | 2.50 | TNT (1 stick) |
| FU1 | 3.42 | Fuses |
| SLING | 4.49 | Sling |
| ANV01 | 5.99 | .5 ton anvil |
| OL1 | 8.99 | Oil can |
| ANV02 | 9.99 | 1 ton anvil |
| FB | 10.00 | Bird seed |
| TNT2 | 10.00 | TNT (5 sticks) |
| DTNTR | 13.00 | Detonator |
| ANV03 | 14.99 | 2 ton anvil |
| JP1000 | 35.00 | JetPack 1000 |
| SAFE | 50.00 | Safe |
| JP2000 | 55.00 | JetPack 2000 |
+---------+------------+----------------+
14 rows in set (0.01 sec)
例子里的排序prod_price
优先于prod_name
,仅在prod_price
相同时依据prod_name
排序。
还可以对排序的每个列指定升序 (ascending) 或降序 (descending)。用到ASC
和DESC
关键字。不指定时默认升序。
ORDER BY prod_price ASC, prod_name DESC;
ORDER BY
和LIMIT 1
一起用可以实现找最大/小的值。
用SELECT的WHERE子句指定搜索条件
搜索条件 (search criteria):只搜索需要的数据。
WHERE子句限定了某列的值与某已知值的关系(等于,不等于,大于,小于等)。关系由WHERE子句的操作符给出。
操作符 | 说明 |
---|---|
= | 等于 |
<> 或 != | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN a AND b | 在值a和值b之间 |
IS NULL | 值为NULL |
值为NULL时,只要限定的条件不是IS NULL,一定不会返回。
WHERE子句还可以使用AND、OR、IN、NOT等逻辑连接词组合条件。
-
AND
的运算优先级高于OR
- IN后的合法值清单用圆括号括起来
- MySQL的NOT可以对IN、BETWEEN、EXISTS子句取反
在WHERE中使用带LIKE关键字的通配符搜索
通配符 (wildcard):用来匹配值的一部分的特殊字符。
搜索模式 (search pattern):由字面值、通配符或两者组合构成的搜索条件。
LIKE
表示后跟的条件中使用了通配符,而非普通的相等匹配
两种常用的通配符:%
和_
通配符 | 作用 |
---|---|
% |
匹配任意长度(包括0)的字符,但不能匹配NULL |
_ |
恰好匹配一个字符 |
- 通配符会拖慢搜索速度。如非必要,用别的操作代替通配符
- 将通配符放在搜索模式的开头会大大延长搜索用时。因此不建议把通配符放在开头
- 如果结尾处有一些空格,最好在搜索模式最后加上
%
进行匹配
mysql> SELECT prod_id, prod_name
-> FROM products
-> WHERE prod_name LIKE '%anvil%';
+---------+--------------+
| prod_id | prod_name |
+---------+--------------+
| ANV01 | .5 ton anvil |
| ANV02 | 1 ton anvil |
| ANV03 | 2 ton anvil |
+---------+--------------+
3 rows in set (0.01 sec)
在WHERE中使用正则表达式搜索
关键字REGEXP
,表示后跟的内容作为正则表达式处理。注意REGEXP
与LIKE
的一个重要区别是,LIKE
一定会匹配整个列值,而REGEXP
只会从整个列值中寻找匹配的字段。如果想要正则表达式匹配整个列值,则需要用到^
和$
定位符。
MySQL支持典型的正则表达式语法,在此不赘述。
在SELECT中使用计算字段
拼接 (concatenate):将值联结到一起构成单个值。MySQL中,函数
Concat()
用来拼接字段。
计算字段 (field) 在地位上与列 (column) 等同,在结果中也像列一样显示。可以在计算字段后加上AS
关键字对该计算字段命名,方便客户机上对计算结果的使用。
mysql> SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') AS vend_title
-> FROM vendors
-> ORDER BY vend_name;
+------------------------+
| vend_title |
+------------------------+
| ACME(USA) |
| Anvils R Us(USA) |
| Furball Inc.(USA) |
| Jet Set(England) |
| Jouets Et Ours(France) |
| LT Supplies(USA) |
+------------------------+
6 rows in set (0.01 sec)
除了Concat()
拼接列值外,MySQL还支持对数值的四则运算(+
、-
、*
、/
)
mysql> SELECT prod_id,
-> quantity,
-> item_price,
-> quantity * item_price AS expanded_price
-> FROM orderitems
-> WHERE order_num = 20005;
+---------+----------+------------+----------------+
| prod_id | quantity | item_price | expanded_price |
+---------+----------+------------+----------------+
| ANV01 | 10 | 5.99 | 59.90 |
| ANV02 | 3 | 9.99 | 29.97 |
| TNT2 | 5 | 10.00 | 50.00 |
| FB | 1 | 10.00 | 10.00 |
+---------+----------+------------+----------------+
4 rows in set (0.01 sec)
用Trim函数去除空格
函数 | 作用 |
---|---|
RTrim() |
去除右端的空格 |
LTrim() |
去除左端的空格 |
Trim() |
去除左右两端的空格 |
用SELECT进行函数测试
Now()
函数返回当前日期与时间
mysql> SELECT Now();
+---------------------+
| Now() |
+---------------------+
| 2018-02-22 16:07:14 |
+---------------------+
1 row in set (0.01 sec)
MySQL系列笔记