MySQL必知必会-笔记 5-11章

5章 排序检索数据

排序数据
子句的概念(clause) SQL语句由子句够成, 有些子句是必需的(from子句),有的是可选的(order by)。 子句由一个关键字和提供的数据组成

order by:

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   |
    +---------+------------+----------------+

仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序。如果prod_price列中所有的值都是唯一的,则不会按prod_name排序

指定排序方向

mysql> select prod_id, prod_price,prod_name from products order by prod_price desc;  //desc 降序排序    
    +---------+------------+----------------+
    | prod_id | prod_price | prod_name      |          
    | JP2000  |      55.00 | JetPack 2000   |
    | SAFE    |      50.00 | Safe           |
    | JP1000  |      35.00 | JetPack 1000   |
    | ANV03   |      14.99 | 2 ton anvil    |
    | DTNTR   |      13.00 | Detonator      |
    | FB      |      10.00 | Bird seed      |
    | TNT2    |      10.00 | TNT (5 sticks) |
    | ANV02   |       9.99 | 1 ton anvil    |
    | OL1     |       8.99 | Oil can        |
    | ANV01   |       5.99 | .5 ton anvil   |
    | SLING   |       4.49 | Sling          |
    | FU1     |       3.42 | Fuses          |
    | FC      |       2.50 | Carrots        |
    | TNT1    |       2.50 | TNT (1 stick)  |
    +---------+------------+----------------+    
//DESC关键字只应用到直接位于其前面的列名: 
mysql> select prod_id, prod_price,prod_name from products order by prod_price desc,prod_name;

ORDER BY和LIMIT的组合,找出列中最高和最低值

mysql> select prod_id, prod_price,prod_name from products order by prod_price desc limit 1;
    +---------+------------+--------------+
    | prod_id | prod_price | prod_name    |
    +---------+------------+--------------+
    | JP2000  |      55.00 | JetPack 2000 |
    +---------+------------+--------------+
注:ORDER BY子句位于FROM子句之后。如果使用LIMIT,它必须位于ORDER BY之后

6章 过滤数据

使用where子句指定搜索条件(search criteria)

mysql> select prod_name,prod_price from products where prod_price = 2.50;
    +---------------+------------+
    | prod_name     | prod_price |
    +---------------+------------+
    | Carrots       |       2.50 |
    | TNT (1 stick) |       2.50 |
    +---------------+------------+

mysql> select prod_name,prod_price from products where prod_price >= 20 order by prod_price desc;
    +--------------+------------+
    | prod_name    | prod_price |
    +--------------+------------+
    | JetPack 2000 |      55.00 |
    | Safe         |      50.00 |
    | JetPack 1000 |      35.00 |
    +--------------+------------+

             WHERE子句操作符
    +--------------------------------------+
    |   操 作 符   |     说 明               
    +-------------+------------------------+
    |   =         |     等于               
    |   <>        |     不等于              
    |   !=        |     不等于
    |   <         |     小于
    |   <=        |     小于等于
    |   >         |     大于
    |   >=        |     大于等于
    |   BETWEEN   |     在指定的两个值之间
    +-------------+------------------------+

检查单个值

mysql> select prod_name,prod_price from products where prod_name = "fuses";   //MySQL在执行匹配时默认不区分大小写
    +-----------+------------+
    | prod_name | prod_price |
    +-----------+------------+
    | Fuses     |       3.42 |
    +-----------+------------+

不匹配检查 不等于<>

mysql> select vend_id, prod_name,prod_price from products where vend_id <>1003;
    +---------+--------------+------------+
    | vend_id | prod_name    | prod_price |
    +---------+--------------+------------+
    |    1001 | .5 ton anvil |       5.99 |
    |    1001 | 1 ton anvil  |       9.99 |
    |    1001 | 2 ton anvil  |      14.99 |
    |    1002 | Fuses        |       3.42 |
    |    1005 | JetPack 1000 |      35.00 |
    |    1005 | JetPack 2000 |      55.00 |
    |    1002 | Oil can      |       8.99 |
    +---------+--------------+------------+

mysql> select vend_id, prod_name,prod_price from products where vend_id <>1003 and vend_id <>1001;  //and

检查值范围 between

mysql> select vend_id, prod_name,prod_price from products where prod_price between 5 and 10;
    +---------+----------------+------------+
    | vend_id | prod_name      | prod_price |
    +---------+----------------+------------+
    |    1001 | .5 ton anvil   |       5.99 |
    |    1001 | 1 ton anvil    |       9.99 |
    |    1003 | Bird seed      |      10.00 |
    |    1002 | Oil can        |       8.99 |
    |    1003 | TNT (5 sticks) |      10.00 |
    +---------+----------------+------------+

空值检查
mysql> select cust_id,cust_email from customers where cust_email is null;
mysql> select cust_id,cust_email from customers where cust_email is not null;

7章 数据过滤

组合WHERE子句

为了进行更强的过滤控制,MySQL允许给出多个WHERE子句,以AND子句的方式或OR子句的方式使用。

AND:
mysql> select prod_id,prod_price,prod_name from products where vend_id = 1003 and prod_price <=10;
OR:
mysql> select prod_id,prod_price,prod_name from products where vend_id = 1003 or vend_id =1002;

计算次序

mysql> select prod_id,prod_price,prod_name,vend_id from products where (vend_id = 1003 or vend_id =1002) and prod_price>10;
    +---------+------------+-----------+---------+
    | prod_id | prod_price | prod_name | vend_id |
    +---------+------------+-----------+---------+
    | DTNTR   |      13.00 | Detonator |    1003 |
    | SAFE    |      50.00 | Safe      |    1003 |
    +---------+------------+-----------+---------+

SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符, 即于AND在计算次序中优先级更高,or部分要用圆括号()对操作符分组

IN操作符

圆括号在WHERE子句中还有另外一种用法。IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配;
mysql> select prod_id,prod_price,prod_name from products where vend_id in (1002,1003) order by prod_name;
()内为in取合法值清单。 

IN操作符优点:

--在使用长的合法选项清单时,in操作符的语法更清楚且更直观
--在使用in时,计算次序更容易管理
--in操作符一般比or操作符执行更快
--IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句 (后面会讲。)

NOT操作符

WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件
mysql> select prod_id,prod_price,vend_id from products where vend_id not in (1002,1003) order by prod_name;

8章 用通配符进行过滤

通配符(wildcard) : 用来匹配值的一部分的特殊字符

搜索模式(search pattern): 由字面值、通配符或两者组合构成的搜索条件。

LIKE操作符: 为在搜索子句中使用通配符,必须使用LIKE操作符

百分号(%)通配符 : %表示任何字符出现任意次数

搜索模式'jet%'。在执行这条子句时,将检索任意以jet起头的词
mysql> select prod_id,prod_price,prod_name,vend_id from products where prod_name LIKE 'jet%';
    +---------+------------+--------------+---------+
    | prod_id | prod_price | prod_name    | vend_id |
    +---------+------------+--------------+---------+
    | JP1000  |      35.00 | JetPack 1000 |    1005 |
    | JP2000  |      55.00 | JetPack 2000 |    1005 |
    +---------+------------+--------------+---------+
注:区分大小写 根据MySQL的配置方式,搜索可以是区分大小写的。如果区分大小写,'jet%'与JetPack 1000将不匹配。

通配符可在搜索模式中任意位置使用,并且可以使用多个通配符。下面的例子使用两个通配符,它们位于模式的两端
mysql> select prod_id,prod_price,prod_name,vend_id from products where prod_name LIKE '%anvil%';
    +---------+------------+--------------+---------+
    | prod_id | prod_price | prod_name    | vend_id |
    +---------+------------+--------------+---------+
    | ANV01   |       5.99 | .5 ton anvil |    1001 |
    | ANV02   |       9.99 | 1 ton anvil  |    1001 |
    | ANV03   |      14.99 | 2 ton anvil  |    1001 |
    +---------+------------+--------------+---------+

通配符%位于中间,匹配1个\多个\0个字符
mysql> select prod_id,prod_price,prod_name,vend_id from products where prod_name LIKE 's%e'; //匹配多个字符
    +---------+------------+-----------+---------+
    | prod_id | prod_price | prod_name | vend_id |
    +---------+------------+-----------+---------+
    | SAFE    |      50.00 | Safe      |    1003 |
    +---------+------------+-----------+---------+

mysql> select prod_id,prod_price,prod_name,vend_id from products where prod_name LIKE 'saf%e'; //匹配0个字符
    +---------+------------+-----------+---------+
    | prod_id | prod_price | prod_name | vend_id |
    +---------+------------+-----------+---------+
    | SAFE    |      50.00 | Safe      |    1003 |
    +---------+------------+-----------+---------+
注意: 
1、  注意尾空格 尾空格可能会干扰通配符匹配。解决办法,在最后再加一个% 。 更好的办法是使用函数,后面讲。
2、  注意NULL,虽然似乎%通配符可以匹配任何东西,但有一个例外,即NULL。 即使是WHERE prod_name LIKE '%'也不能匹配\
   用值NULL作为产品名的行

下划线(_)通配符

下划线(_)。下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符
mysql> select prod_id,prod_price,prod_name,vend_id from products where prod_name LIKE '_ ton anvil';
    +---------+------------+-------------+---------+
    | prod_id | prod_price | prod_name   | vend_id |
    +---------+------------+-------------+---------+
    | ANV02   |       9.99 | 1 ton anvil |    1001 |
    | ANV03   |      14.99 | 2 ton anvil |    1001 |
    +---------+------------+-------------+---------+

使用通配符的技巧

-   不要过度使用通配符,如果其他操作符能达到相同的目的,应该使用其他操作符。
-   在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处,把通配符置于搜索模式的开始处,搜索起来是最慢
-   仔细注意通配符的位置

9章 用正则表达式进行搜索

使用MySQL正则表达式

基本字符匹配: regexp

mysql> select * from products where prod_name regexp '1000' order by prod_name;
    +---------+---------+--------------+------------+---------------------------------------+
    | prod_id | vend_id | prod_name    | prod_price | prod_desc                             |
    +---------+---------+--------------+------------+---------------------------------------+
    | JP1000  |    1005 | JetPack 1000 |      35.00 | JetPack 1000, intended for single use |
    +---------+---------+--------------+------------+---------------------------------------+

mysql> select * from products where prod_name regexp '.000' order by prod_name;
.是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符, 1000和2000都能匹配到。 

匹配不区分大小写
 MySQL中的正则表达式匹配(自版本3.23.4后)不区分大小写(即,大写和小写都匹配)。
为区分大小写,可使用BINARY关键字,如WHERE prod_name REGEXP BINARY 'JetPack .000'。

进行OR匹配

mysql> select * from products where prod_name regexp '1000|2000' order by prod_name; //|两边不能有空格
    +---------+---------+--------------+------------+---------------------------------------+
    | prod_id | vend_id | prod_name    | prod_price | prod_desc                             |
    +---------+---------+--------------+------------+---------------------------------------+
    | JP1000  |    1005 | JetPack 1000 |      35.00 | JetPack 1000, intended for single use |
    | JP2000  |    1005 | JetPack 2000 |      55.00 | JetPack 2000, multi-use               |
    +---------+---------+--------------+------------+---------------------------------------+

匹配几个字符之一

mysql> select prod_id, vend_id, prod_name from products where prod_name regexp '[123] Ton' order by prod_name;
mysql> select prod_id, prod_name from products where prod_name regexp '[1|2|3] Ton' order by prod_name;
    +---------+---------+-------------+    
    | prod_id | vend_id | prod_name   |
    +---------+---------+-------------+       //[123]定义一组字符,它的意思是匹配1或2或3
    | ANV02   |    1001 | 1 ton anvil |
    | ANV03   |    1001 | 2 ton anvil |
    +---------+---------+-------------+
    
mysql> select prod_id, vend_id, prod_name from products where prod_name regexp '1|2|3 Ton' order by prod_name;
    +---------+---------+---------------+
    | prod_id | vend_id | prod_name     |
    +---------+---------+---------------+
    | ANV02   |    1001 | 1 ton anvil   |
    | ANV03   |    1001 | 2 ton anvil   |
    | JP1000  |    1005 | JetPack 1000  |
    | JP2000  |    1005 | JetPack 2000  |
    | TNT1    |    1003 | TNT (1 stick) |
    +---------+---------+---------------+
[1|2|3] Ton 或 [123] Ton: 匹配 ‘1 ton’ 或‘2 ton’ 或‘3 ton’
1|2|3 Ton : 匹配'1'或'2'或'3 ton'
[^123] Ton : 匹配除这些字符外的任何字符。

匹配范围

匹配数字0到9: [0123456789], 为了简化这种集合,可以用-来定义一个范围, [0-9]等同于[0123456789]
同理,[a-z]匹配任意字母字符。

mysql> select prod_id, vend_id, prod_name from products where prod_name regexp '[1-5] ton' order by prod_name;
    +---------+---------+--------------+
    | prod_id | vend_id | prod_name    |
    +---------+---------+--------------+
    | ANV01   |    1001 | .5 ton anvil |
    | ANV02   |    1001 | 1 ton anvil  |
    | ANV03   |    1001 | 2 ton anvil  |
    +---------+---------+--------------+

匹配特殊字符

mysql> select * from vendors where vend_name regexp  '\\.' order by vend_name;
    +---------+--------------+-----------------+-----------+------------+----------+--------------+
    | vend_id | vend_name    | vend_address    | vend_city | vend_state | vend_zip | vend_country |
    +---------+--------------+-----------------+-----------+------------+----------+--------------+
    |    1004 | Furball Inc. | 1000 5th Avenue | New York  | NY         | 11111    | USA          |
    +---------+--------------+-----------------+-----------+------------+----------+--------------+

使用转义(escaping),特殊字符包括.| []等必须转义,\\也用来引用元字符。
    +-----------+-------------------+
    |   元 字 符 说 明               |
    +-----------+-------------------+
    |   \\f     |       换页          |
    |   \\n     |       换行          |
    |   \\r     |       回车          |
    |   \\t     |       制表          |
    |   \\v     |       纵向制表        |
    +-----------+-------------------+
匹配\ 为了匹配反斜杠(\)字符本身,需要使用\\\

匹配字符类(character class)

            字符类
    +--------------------------------------------------------+
        类          说 明
    [:alnum:]   任意字母和数字(同[a-zA-Z0-9])
    [:alpha:]   任意字符(同[a-zA-Z])
    [:blank:]   空格和制表(同[\\t])
    [:cntrl:]   ASCII控制字符(ASCII 0到31和127)
    [:digit:]   任意数字(同[0-9])
    [:graph:]   与[:print:]相同,但不包括空格
    [:lower:]   任意小写字母(同[a-z])
    [:print:]   任意可打印字符
    [:punct:]   既不在[:alnum:]又不在[:cntrl:]中的任意字符
    [:space:]   包括空格在内的任意空白字符(同[\\f\\n\\r\\t\\v])
    [:upper:]   任意大写字母(同[A-Z])
    [:xdigit:]  任意十六进制数字(同[a-fA-F0-9])
    +--------------------------------------------------------+

匹配多个实例

使用元字符

        重复元字符
    +-------------------------------------+
    元字符       说明
    *         0个或多个匹配
    +         1个或多个匹配(等于{1,})
    ?         0个或1个匹配(等于{0,1})
    {n}       指定数目的匹配
    {n,}      不少于指定数目的匹配
    {n,m}     匹配数目的范围(m不超过255)
    +-------------------------------------+

举几个例子:
mysql> select prod_name from products where prod_name regexp '\\([0-9] sticks?\\)' order by prod_name;
    +----------------+
    | prod_name      |
    +----------------+
    | TNT (1 stick)  |
    | TNT (5 sticks) |
    +----------------+
[0-9]匹配任意数字(这个例子中为1和5);
s后的?使s可选因为?匹配它前面的任何字符的0次或1次出现;
\\( \\)转义()

mysql> select prod_name from products where prod_name regexp '[[:digit:]]{4}' order by prod_name;
    +--------------+
    | prod_name    |
    +--------------+
    | JetPack 1000 |
    | JetPack 2000 |
    +--------------+
[:digit:]匹配任意数字,因而它为数字的一个集合。{4}确切地要求它前面的字符(任意数字)出现4次
所以[[:digit:]]{4}匹配连在一起的任意4位数字
mysql> select prod_name from products where prod_name regexp '[0-9][0-9][0-9][0-9]' order by prod_name;

定位符

        定位元字符
    +-------------------------------------+
    元 字 符            说 明
    ^                   文本的开始
    $                   文本的结尾
    [[:<:]]             词的开始
    [[:>:]]             词的结尾
    +-------------------------------------+

举例

mysql> select prod_name from products where prod_name regexp '^[0-9\\.]' order by prod_name;
    +--------------+
    | prod_name    |
    +--------------+
    | .5 ton anvil |
    | 1 ton anvil  |
    | 2 ton anvil  |
    +--------------+
^匹配串的开始。因此,^[0-9\\.]只在.或任意数字为串中第一个字符时才匹配它们。 没有^,还会检索出别的中间有数字的行

^的双重用途:

1.  在集合中(用[和]定义),用它来否定该集合 :     [^123] Ton : 匹配除这些字符外的任何字符
2.  除1以外,用来指定串的开始

REGEXP和LIKE的区别:

1. LIKE匹配整个串而REGEXP匹配子串
2. 利用定位符,通过用^开始每个表达式,用$结束每个表达式

简单的正则表达式测试

可以在不使用数据库表的情况下用SELECT来测试正则表达式,返回0(没有匹配)或1(匹配),例如:
mysql> select 'hello' regexp '[0-9]';
    +------------------------+
    | 'hello' regexp '[0-9]' |
    +------------------------+
    |                      0 |
    +------------------------+
mysql> select 'hello' regexp '[a-z]';
    +------------------------+
    | 'hello' regexp '[a-z]' |
    +------------------------+
    |                      1 |
    +------------------------+

10章 创建计算字段

计算字段

字段的概念:字段(field) 基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常用在计算字段的连接上。

拼接字段: 拼接(concatenate) 将值联结到一起构成单个值。在MySQL的SELECT语句中,可使用Concat()函数来拼接两个列

注意:多数DBMS使用+或||来实现拼接,MySQL则使用Concat()函数来实现。当把SQL语句转换成MySQL语句时一定要把这个区别铭记在

举例:

mysql> select concat(vend_name,'(',vend_country,')') from vendors order by vend_name;
    +----------------------------------------+
    | concat(vend_name,'(',vend_country,')') |
    +----------------------------------------+
    | ACME(USA)                              |
    | Anvils R us(USA)                       |
    | Furball Inc.(USA)                      |
    | Jet Set(England)                       |
    | Jouets Et Ours(France)                 |
    | LT Supplies(USA)                       |
    +----------------------------------------+

去空格

在第8章中曾提到通过删除数据右侧多余的空格来整理数据,可以使用mysql的RTrim()函数。
MySQL除了支持RTrim(),去掉串右边的空格,还支持LTrim()(去掉串左边的空格)以及Trim()(去掉串左右两边的空格)。

mysql> select concat(ltrim(vend_name), '(',ltrim(vend_country),')') from vendors order by vend_name;
    +-------------------------------------------------------+
    | concat(ltrim(vend_name), '(',ltrim(vend_country),')') |
    +-------------------------------------------------------+
    | ACME(USA)                                             |
    | Anvils R us(USA)                                      |
    | Furball Inc.(USA)                                     |
    | Jet Set(England)                                      |
    | Jouets Et Ours(France)                                |
    | Jouets Et Ours(France)  //此处已经去掉左边空格          |
    | LT Supplies(USA)                                      |
    +-------------------------------------------------------+

mysql> select concat(vend_name,'(',vend_country,')') from vendors order by vend_name;
    +----------------------------------------+
    | concat(vend_name,'(',vend_country,')') |
    +----------------------------------------+
    | ACME(USA)                              |
    | Anvils R us(USA)                       |
    | Furball Inc.(USA)                      |
    | Jet Set(England)                       |
    | Jouets Et Ours(France)                 |
    | Jouets Et Ours( France)  //此处未去空格  |
    | LT Supplies(USA)                       |
    +----------------------------------------+

使用别名: AS

mysql> select concat(vend_name,'(',vend_country,')') as vend_title from vendors order by vend_name;
    +-------------------------+
    | vend_title <--别名        |    //as vend_title 
    +-------------------------+
    | ACME(USA)               |
    | Anvils R us(USA)        |
    | Furball Inc.(USA)       |
    +-------------------------+

执行算术计算

mysql> select prod_id,quantity,item_price,quantity*item_price as expanded_price from orderitems 
    -> where order_num = 20005;
算数计算 : quantity*item_price as expanded_price
MySQL算术操作符: + - * / 加减乘除

如何测试计算

mysql> select 2*3;
    +-----+
    | 2*3 |
    +-----+
    |   6 |
    +-----+
mysql> SELECT Trim( '  abc       ');  //左右空格全去了
    +-----------------------+
    | Trim( '  abc       ') |
    +-----------------------+
    | abc                   |
    +-----------------------+

11章 使用数据处理函数

使用函数:
1. 用于处理文本串(如删除或填充值,转换值为大写或小写)的文本函数。
2. 用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)的数值函数
3. 用于处理日期和时间值并从这些值中提取特定成分(例如,返回两个日期之差,检查日期有效性等)的日期和时间函数。
4. 返回DBMS正使用的特殊信息(如返回用户登录信息,检查版本细节)的系统函数。

文本处理函数

mysql> select vend_name,Upper(vend_name) as vend_name_uocase from vendors order by  vend_name;
+----------------+------------------+
| vend_name      | vend_name_uocase |
+----------------+------------------+
| ACME           | ACME             |
| Anvils R us    | ANVILS R US      |
| Furball Inc.   | FURBALL INC.     |
| Jet Set        | JET SET          |
| Jouets Et Ours | JOUETS ET OURS   |
| Jouets Et Ours | JOUETS ET OURS   |
| LT Supplies    | LT SUPPLIES      |
+----------------+------------------+
Upper()将文本转换为大写

常用的文本处理函数:
     函数             说 明
    Left()          返回串左边的字符
    Length()        返回串的长度
    Locate()        找出串的一个子串
    Lower()         将串转换为小写
    Upper()         将串转换为大写
    LTrim()         去掉串左边的空格
    Right()         返回串右边的字符
    RTrim()         去掉串右边的空格
    Soundex()       返回串的SOUNDEX值
    SubString()     返回子串的字符

    SOUNDEX是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。 举例:
    customers表中有一个顾客Coyote Inc.,其联系名为Y.Lee。但如果这是输入错误,此联系名实际应该是Y.Lie,怎么办?
    mysql> select cust_name,cust_contact from customers where soundex(cust_contact)=soundex('Y lie');
    +-------------+--------------+
    | cust_name   | cust_contact |
    +-------------+--------------+
    | Coyote Inc. | Y Lee        |
    +-------------+--------------+

日期和时间处理函数

常用日期和时间处理函数
+-------------------+--------------------------------------+
|       函 数        |            说 明
|   AddDate()       |   增加一个日期(天、周等)
|   AddTime()       |   增加一个时间(时、分等)
|   CurDate()       |   返回当前日期
|   CurTime()       |   返回当前时间
|   Date()          |   返回日期时间的日期部分
|   DateDiff()      |   计算两个日期之差
|   Date_Add()      |   高度灵活的日期运算函数
|   Date_Format()   |   返回一个格式化的日期或时间串
|   Day()           |   返回一个日期的天数部分
|   DayOfWeek()     |   对于一个日期,返回对应的星期几
|   Hour()          |   返回一个时间的小时部分
|   Minute()        |   返回一个时间的分钟部分
|   Month()         |   返回一个日期的月份部分
|   Now()           |   返回当前日期和时间
|   Second()        |   返回一个时间的秒部分
|   Time()          |   返回一个日期时间的时间部分
|   Year()          |   返回一个日期的年份部分
+-------------------+--------------------------------------+

数据经常需要用日期进行过滤   MySQL使用的日期格式必须为yyyy-mm-dd,如2017年12月6日,给出为2017-12-06
mysql> select cust_id, order_num from orders where order_date = '2005-09-01';
mysql> select cust_id, order_num from orders where date(order_date) = '2005-09-01';  
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
+---------+-----------+
使用date()函数,检索更可靠。 下面例子:检索出2005年9月下的所有订单:
mysql> select cust_id, order_num from orders where date(order_date) between '2005-09-01' and '2005-09-30';
或者使用下面语句:
mysql> select cust_id, order_num from orders where Year(order_date)=2005 and month(order_date)=9;

数值处理函数

常用数值处理函数
函 数             说 明
Abs()       返回一个数的绝对值
Cos()       返回一个角度的余弦
Exp()       返回一个数的指数值
Mod()       返回除操作的余数
Pi()        返回圆周率
Rand()      返回一个随机数
Sin()       返回一个角度的正弦
Sqrt()      返回一个数的平方根
Tan()       返回一个角度的正切

你可能感兴趣的:(MySQL必知必会-笔记 5-11章)