【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)。用到ASCDESC关键字。不指定时默认升序

ORDER BY prod_price ASC, prod_name DESC;

ORDER BYLIMIT 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,表示后跟的内容作为正则表达式处理。注意REGEXPLIKE的一个重要区别是,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系列笔记

  • 1 MySQL入门
  • 2 SELECT语句拓展
  • 3 MySQL函数与SELECT的更多功能
  • 4 子查询与创建联结
  • 5 组合查询

你可能感兴趣的:(【MySQL笔记】2 SELECT语句拓展)