Skip to content

Commit

Permalink
增加函数
Browse files Browse the repository at this point in the history
增加函数
  • Loading branch information
WangLaoShi committed Jul 19, 2023
1 parent c0dd0d0 commit fcc8f2d
Show file tree
Hide file tree
Showing 9 changed files with 919 additions and 84 deletions.
58 changes: 29 additions & 29 deletions Task05.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,44 +38,44 @@

### MySQL日期和时间函数

* [CURDATE](func-mysql-curdate.html) - 返回当前日期。
* [DATEDIFF](func-mysql-datediff.html) - 计算两个`DATE`值之间的天数 。
* [DAY](func-mysql-day.html) - 获取指定日期的月份日期。
* [DATE_ADD](func-mysql-date-add.html) - 将日期值添加到日期值。
* [DATE_SUB](func-mysql-date-sub.html) - 从日期值中减去时间值。
* [DATE_FORMAT](func-mysql-date-format.html "MySQL DATE_FORMAT函数") - 根据指定的日期格式格式化日期值。
* [DAYNAME](func-mysql-dayname.html) - 获取指定日期的工作日名称。
* [DAYOFWEEK](func-mysql-dayofweek.html) - 返回日期的工作日索引。
* [EXTRACT](func-mysql-extract.html) - 提取日期的一部分。
* [NOW](func-mysql-now.html "MySQL NOW() 函数") - 返回执行语句的当前日期和时间。
* [MONTH](https://www.begtut.com/mysql/mysql-month.html) - 返回表示指定日期月份的整数。
* [STR_TO_DATE](func-mysql-str-to-date.html "MySQL STR_TO_DATE() 函数") - 根据指定的格式将字符串转换为日期和时间值。
* [SYSDATE](func-mysql-sysdate.html) - 返回当前日期。
* [TIMEDIFF](func-mysql-timediff.html) - 计算两个`TIME``DATETIME`值之间的差异。
* [TIMESTAMPDIFF](func-mysql-timestampdiff.html) - 计算两个`DATE``DATETIME`值之间的差异。
* [WEEK](func-mysql-week.html) - 返回一个星期的日期。
* [WEEKDAY](func-mysql-weekday.html) - 返回日期的工作日索引。
* [YEAR](func-mysql-year.html) -返回日期值的年份部分。
* [CURDATE](functions/func-mysql-curdate.md) - 返回当前日期。
* [DATEDIFF](functions/func-mysql-datediff.md) - 计算两个`DATE`值之间的天数 。
* [DAY](functions/func-mysql-day.html) - 获取指定日期的月份日期。
* [DATE_ADD](functions/func-mysql-date-add.html) - 将日期值添加到日期值。
* [DATE_SUB](functions/func-mysql-date-sub.html) - 从日期值中减去时间值。
* [DATE_FORMAT](functions/func-mysql-date-format.html "MySQL DATE_FORMAT函数") - 根据指定的日期格式格式化日期值。
* [DAYNAME](functions/func-mysql-dayname.html) - 获取指定日期的工作日名称。
* [DAYOFWEEK](functions/func-mysql-dayofweek.html) - 返回日期的工作日索引。
* [EXTRACT](functions/func-mysql-extract.html) - 提取日期的一部分。
* [NOW](functions/func-mysql-now.html "MySQL NOW() 函数") - 返回执行语句的当前日期和时间。
* [MONTH](functions/mysql-month.html) - 返回表示指定日期月份的整数。
* [STR_TO_DATE](functions/func-mysql-str-to-date.html "MySQL STR_TO_DATE() 函数") - 根据指定的格式将字符串转换为日期和时间值。
* [SYSDATE](functions/func-mysql-sysdate.html) - 返回当前日期。
* [TIMEDIFF](functions/func-mysql-timediff.html) - 计算两个`TIME``DATETIME`值之间的差异。
* [TIMESTAMPDIFF](functions/func-mysql-timestampdiff.html) - 计算两个`DATE``DATETIME`值之间的差异。
* [WEEK](functions/func-mysql-week.html) - 返回一个星期的日期。
* [WEEKDAY](functions/func-mysql-weekday.html) - 返回日期的工作日索引。
* [YEAR](functions/func-mysql-year.html) -返回日期值的年份部分。

### MySQL比较功能

* [COALESCE](func-mysql-coalesce.html) - 返回第一个非null参数,这对于替换null非常方便。
* [GREATEST&LEAST](func-mysql-greatest.html) - 取n个参数并分别返回n个参数的最大值和最小值。
* [ISNULL](https://www.begtut.com/mysql/mysql-isnull-function.html) - 如果参数为null,则返回1,否则返回零。
* [COALESCE](functions/func-mysql-coalesce.html) - 返回第一个非null参数,这对于替换null非常方便。
* [GREATEST&LEAST](functions/func-mysql-greatest.html) - 取n个参数并分别返回n个参数的最大值和最小值。
* [ISNULL](functions/mysql-isnull-function.html) - 如果参数为null,则返回1,否则返回零。

### MySQL数学函数

* [ABS](func-mysql-abs.html) - 返回数字的绝对值。
* [CEIL](func-mysql-ceil.html) - 返回大于或等于输入数字的最小整数值。
* [FLOOR](func-mysql-floor.html) - 返回不大于参数的最大整数值。
* [MOD](func-mysql-mod.html) - 返回数字的余数除以另一个。
* [ROUND](func-mysql-round.html) - 将数字四舍五入到指定的小数位数。
* [TRUNCATE](func-mysql-truncate.html) - 将数字截断为指定的小数位数。
* [ABS](functions/func-mysql-abs.html) - 返回数字的绝对值。
* [CEIL](functions/func-mysql-ceil.html) - 返回大于或等于输入数字的最小整数值。
* [FLOOR](functions/func-mysql-floor.html) - 返回不大于参数的最大整数值。
* [MOD](functions/func-mysql-mod.html) - 返回数字的余数除以另一个。
* [ROUND](functions/func-mysql-round.html) - 将数字四舍五入到指定的小数位数。
* [TRUNCATE](functions/func-mysql-truncate.html) - 将数字截断为指定的小数位数。

### 其他MySQL功能

* [LAST_INSERT_ID](func-mysql-last-insert-id.html) - 获取最后生成的最后一个插入记录的序列号。
* [CAST](func-mysql-cast.html "MySQL CAST") - 将任何类型的值转换为具有指定类型的值。
* [LAST_INSERT_ID](functions/func-mysql-last-insert-id.html) - 获取最后生成的最后一个插入记录的序列号。
* [CAST](functions/func-mysql-cast.html "MySQL CAST") - 将任何类型的值转换为具有指定类型的值。


## 5.1 窗口函数
Expand Down
147 changes: 147 additions & 0 deletions functions/func-mysql-case.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
在本教程中,我们将向您展示如何使用 MySQL `CASE` 表达式来构造条件查询。

## MySQL CASE 表达式简介

MySQL `CASE` 表达式是一个流控制结构,允许您在查询中构造条件,例如:SELECT 或 WHERE 子句。 MySQL 为您提供了两种形式的 `CASE` 表达式。

以下说明了 `CASE` 表达式的第一种形式。

```sql
CASE value
WHEN compare_value_1 THEN result_1
WHEN compare_value_2 THEN result_2
ELSE result END
```

如果 `value` 等于 `compare_value`,例如 `compare_value_1``compare_value_2` 等,则 `CASE` 表达式返回相应的结果,即 `result_1``result_2`。 如果值不与任何 `compare_value` 匹配,则 `CASE` 表达式将返回 `ELSE` 子句中指定的结果。

`CASE` 表达式的第二种形式如下:

```sql
CASE
WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2
ELSE result END
```

在第二种形式中,如果条件为 `True`,则 `CASE` 表达式返回结果,如 `result_1``result_2` 等。 如果所有条件都为 `false`,则返回 `ELSE` 部分中的结果。如果省略 `ELSE` 部分,`CASE` 表达式将返回 `NULL`

`CASE` 表达式返回的数据类型取决于使用它的上下文的结果。 例如,如果在字符串上下文中使用 `CASE` 表达式,则会以字符串形式返回结果。 如果在数值上下文中使用 `CASE` 表达式,则会以整数,小数或实数值的形式返回结果。

## MySQL CASE 函数示例

让我们来看看示例数据库 (yiibaidb) 中的 `customers` 表,其结构如下所示 -

```sql
mysql> desc customers;
+------------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+---------------+------+-----+---------+-------+
| customerNumber | int(11) | NO | PRI | NULL | |
| customerName | varchar(50) | NO | | NULL | |
| contactLastName | varchar(50) | NO | | NULL | |
| contactFirstName | varchar(50) | NO | | NULL | |
| phone | varchar(50) | NO | | NULL | |
| addressLine1 | varchar(50) | NO | | NULL | |
| addressLine2 | varchar(50) | YES | | NULL | |
| city | varchar(50) | NO | | NULL | |
| state | varchar(50) | YES | | NULL | |
| postalCode | varchar(15) | YES | | NULL | |
| country | varchar(50) | NO | | NULL | |
| salesRepEmployeeNumber | int(11) | YES | MUL | NULL | |
| creditLimit | decimal(10,2) | YES | | NULL | |
+------------------------+---------------+------+-----+---------+-------+
13 rows in set
```

假设您要按状态对客户进行排序,如果状态为 `NULL`,则要使用国家作为排序标准。要实现这一点,您可以使用第一种形式的 `CASE` 表达式如下:

```sql
SELECT
customerName, state, country
FROM
customers
ORDER BY (CASE
WHEN state IS NULL THEN country
ELSE state
END);
```

执行上面查询语句,得到以下结果 -

```sql
+------------------------------------+---------------+--------------+
| customerName | state | country |
+------------------------------------+---------------+--------------+
| Salzburg Collectables | NULL | Austria |
| Mini Auto Werke | NULL | Austria |
| Canadian Gift Exchange Network | BC | Canada |
| Royal Canadian Collectables, Ltd. | BC | Canada |
| Petit Auto | NULL | Belgium |
| Royale Belge | NULL | Belgium |
| Mini Gifts Distributors Ltd. | CA | USA |
| Mini Wheels Co. | CA | USA |
************ 此处省略了一大波数据 *************************************
| AV Stores, Co. | NULL | UK |
| UK Collectables, Ltd. | NULL | UK |
| Stylish Desk Decors, Co. | NULL | UK |
| Double Decker Gift Stores, Ltd | NULL | UK |
| Australian Collectors, Co. | Victoria | Australia |
| Australian Collectables, Ltd | Victoria | Australia |
+------------------------------------+---------------+--------------+
122 rows in set
```

在本示例中,我们使用 ORDER BY 子句中的 `CASE` 表达式来确定要排序的字段为: `state``country`

在接下来的一个示例中,我们将使用示例数据库 (yiibaidb) 中的 `orders` 表来演示 `CASE` 表达式的第二种形式。

如果您希望通过按状态查看销售订单数量,例如发货订单数量,待发货订单等,则可以使用 `CASE` 表达式的第二种形式,如下所示:

```sql
SELECT
SUM(CASE
WHEN status = 'Shipped' THEN 1
ELSE 0
END) AS 'Shipped',
SUM(CASE
WHEN status = 'On Hold' THEN 1
ELSE 0
END) AS 'On Hold',
SUM(CASE
WHEN status = 'In Process' THEN 1
ELSE 0
END) AS 'In Process',
SUM(CASE
WHEN status = 'Resolved' THEN 1
ELSE 0
END) AS 'Resolved',
SUM(CASE
WHEN status = 'Cancelled' THEN 1
ELSE 0
END) AS 'Cancelled',
SUM(CASE
WHEN status = 'Disputed' THEN 1
ELSE 0
END) AS 'Disputed',
COUNT(*) AS Total
FROM
orders;
```

执行上面查询语句,得到以下结果 -

```sql
+---------+---------+------------+----------+-----------+----------+-------+
| Shipped | On Hold | In Process | Resolved | Cancelled | Disputed | Total |
+---------+---------+------------+----------+-----------+----------+-------+
| 303 | 4 | 7 | 4 | 6 | 3 | 327 |
+---------+---------+------------+----------+-----------+----------+-------+
1 row in set
```

在 SELECT 语句中,如果状态等于 `Shipped``On Hold` 等,则 `CASE` 表达式返回 `1`,否则返回 `0`,我们使用 `SUM` 函数计算每种状态的订单的销售总数。

在本教程中,我们向您展示了如何在 `SELECT` 语句中使用 MySQL `CASE` 表达式来构造条件查询。
57 changes: 57 additions & 0 deletions functions/func-mysql-curdate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
在本教程中,您将学习如何使用 MySQL `CURDATE()` 函数获取当前日期。

## MySQL CURDATE 功能介绍

如果在数字上下文中使用字符串上下文或 `YYYMMDD` 格式,`CURDATE()` 函数将以“`YYYY-MM-DD`”格式的值返回当前日期。

以下示例显示了如何在字符串上下文中使用 `CURDATE()` 函数。

```sql
sql> SELECT CURDATE();
+------------+
| CURDATE() |
+------------+
| 2017-08-10 |
+------------+
1 row in set (0.00 sec)
```

以下示例说明 `CURDATE()` 函数如何在数字上下文中使用:

```sql
mysql> SELECT CURDATE() + 0;
+---------------+
| CURDATE() + 0 |
+---------------+
| 20170810 |
+---------------+
1 row in set
```

`CURRENT_DATE``CURRENT_DATE()``CURDATE()` 的同义词。

```sql
mysql> SELECT CURRENT_DATE(), CURRENT_DATE, CURDATE();
+----------------+--------------+------------+
| CURRENT_DATE()| CURRENT_DATE | CURDATE() |
+----------------+--------------+------------+
| 2017-08-10 | 2017-08-10 | 2017-08-10 |
+----------------+--------------+------------+
1 row in set
```

## CURDATE 与 NOW 函数

`CURDATE()` 函数只返回当前日期,而 NOW() 函数返回当前时间的日期和时间部分。`CURDATE()` 函数的结果等同于以下表达式:

```sql
mysql> SELECT DATE(NOW());
+-------------+
| DATE(NOW()) |
+-------------+
| 2017-08-10 |
+-------------+
1 row in set
```

在本教程中,您学习了如何使用 MySQL `CURDATE()` 函数获取当前日期值。
Loading

0 comments on commit fcc8f2d

Please sign in to comment.