本節說明對值集合進行運算的彙總函式。它們通常與 GROUP BY
子句搭配使用,以將值分組為子集。
表 14.29 彙總函式
名稱 | 說明 |
---|---|
AVG() |
傳回引數的平均值 |
BIT_AND() |
傳回位元 AND |
BIT_OR() |
傳回位元 OR |
BIT_XOR() |
傳回位元 XOR |
COUNT() |
傳回傳回的列數計數 |
COUNT(DISTINCT) |
傳回不同值的數目計數 |
GROUP_CONCAT() |
傳回串連的字串 |
JSON_ARRAYAGG() |
以單一 JSON 陣列形式傳回結果集 |
JSON_OBJECTAGG() |
以單一 JSON 物件形式傳回結果集 |
MAX() |
傳回最大值 |
MIN() |
傳回最小值 |
STD() |
傳回母體標準差 |
STDDEV() |
傳回母體標準差 |
STDDEV_POP() |
傳回母體標準差 |
STDDEV_SAMP() |
傳回樣本標準差 |
SUM() |
傳回總和 |
VAR_POP() |
傳回母體標準變異數 |
VAR_SAMP() |
傳回樣本變異數 |
VARIANCE() |
傳回母體標準變異數 |
除非另有說明,否則彙總函式會忽略 NULL
值。
如果您在不包含 GROUP BY
子句的陳述式中使用彙總函式,則它相當於對所有列進行分組。如需更多資訊,請參閱第 14.19.3 節,「MySQL 的 GROUP BY 處理」。
大多數彙總函式可用作視窗函式。那些可以這樣使用的函式會在語法說明中以 [
表示,代表選用的 over_clause
]OVER
子句。over_clause
說明於第 14.20.2 節,「視窗函式概念和語法」,其中還包含有關視窗函式用法的其他資訊。
對於數值引數,變異數和標準差函式會傳回 DOUBLE
值。SUM()
和 AVG()
函式會針對精確值引數(整數或 DECIMAL
)傳回 DECIMAL
值,並針對近似值引數(FLOAT
或 DOUBLE
)傳回 DOUBLE
值。
SUM()
和 AVG()
彙總函式不適用於時間值。(它們會將值轉換為數字,遺失第一個非數字字元之後的所有內容。)若要解決此問題,請轉換為數字單位,執行彙總運算,然後轉換回時間值。範例
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col))) FROM tbl_name;
SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROM tbl_name;
諸如 SUM()
或 AVG()
等預期數值引數的函式會在必要時將引數轉換為數字。對於 SET
或 ENUM
值,轉換作業會導致使用基礎數值。
BIT_AND()
、BIT_OR()
和 BIT_XOR()
聚合函數執行位元運算。
MySQL 位元函數和運算子允許二進位字串型別的引數 (BINARY
、VARBINARY
和 BLOB
型別),並傳回相同型別的值,這使得它們能夠接受大於 64 位元的引數並產生傳回值。關於位元運算的引數評估和結果型別的討論,請參閱第 14.12 節「位元函數和運算子」中的介紹性討論。
AVG([DISTINCT]
expr
) [over_clause
]傳回
的平均值。可以使用expr
DISTINCT
選項來傳回expr
的相異值的平均值。如果沒有符合的列,
AVG()
會傳回NULL
。如果expr
為NULL
,此函數也會傳回NULL
。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述;它不能與DISTINCT
一起使用。mysql> SELECT student_name, AVG(test_score) FROM student GROUP BY student_name;
傳回
expr
中所有位元的按位AND
結果。結果型別取決於函數引數值是否被評估為二進位字串或數字
當引數值具有二進位字串型別,且引數不是十六進位文字、位元文字或
NULL
文字時,會發生二進位字串評估。否則會發生數值評估,並在必要時將引數值轉換為無號 64 位元整數。二進位字串評估會產生與引數值長度相同的二進位字串。如果引數值具有不同的長度,則會發生
ER_INVALID_BITWISE_OPERANDS_SIZE
錯誤。如果引數大小超過 511 個位元組,則會發生ER_INVALID_BITWISE_AGGREGATE_OPERANDS_SIZE
錯誤。數值評估會產生一個無號 64 位元整數。
如果沒有符合的列,
BIT_AND()
會傳回一個中性值(所有位元設定為 1),該值與引數值具有相同的長度。NULL
值不會影響結果,除非所有值都是NULL
。在這種情況下,結果是一個中性值,該值與引數值具有相同的長度。有關引數評估和結果型別的更多資訊討論,請參閱第 14.12 節「位元函數和運算子」中的介紹性討論。
如果從 mysql 客戶端內調用
BIT_AND()
,二進位字串結果會使用十六進位表示法顯示,具體取決於--binary-as-hex
的值。有關該選項的更多資訊,請參閱 第 6.5.1 節「mysql — MySQL 命令列客戶端」。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述。傳回
expr
中所有位元的按位OR
結果。結果型別取決於函數引數值是否被評估為二進位字串或數字
當引數值具有二進位字串型別,且引數不是十六進位文字、位元文字或
NULL
文字時,會發生二進位字串評估。否則會發生數值評估,並在必要時將引數值轉換為無號 64 位元整數。二進位字串評估會產生與引數值長度相同的二進位字串。如果引數值具有不同的長度,則會發生
ER_INVALID_BITWISE_OPERANDS_SIZE
錯誤。如果引數大小超過 511 個位元組,則會發生ER_INVALID_BITWISE_AGGREGATE_OPERANDS_SIZE
錯誤。數值評估會產生一個無號 64 位元整數。
如果沒有符合的列,
BIT_OR()
會傳回一個中性值(所有位元設定為 0),該值與引數值具有相同的長度。NULL
值不會影響結果,除非所有值都是NULL
。在這種情況下,結果是一個中性值,該值與引數值具有相同的長度。有關引數評估和結果型別的更多資訊討論,請參閱第 14.12 節「位元函數和運算子」中的介紹性討論。
如果從 mysql 客戶端內調用
BIT_OR()
,二進位字串結果會使用十六進位表示法顯示,具體取決於--binary-as-hex
的值。有關該選項的更多資訊,請參閱 第 6.5.1 節「mysql — MySQL 命令列客戶端」。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述。傳回
expr
中所有位元的按位XOR
結果。結果型別取決於函數引數值是否被評估為二進位字串或數字
當引數值具有二進位字串型別,且引數不是十六進位文字、位元文字或
NULL
文字時,會發生二進位字串評估。否則會發生數值評估,並在必要時將引數值轉換為無號 64 位元整數。二進位字串評估會產生與引數值長度相同的二進位字串。如果引數值具有不同的長度,則會發生
ER_INVALID_BITWISE_OPERANDS_SIZE
錯誤。如果引數大小超過 511 個位元組,則會發生ER_INVALID_BITWISE_AGGREGATE_OPERANDS_SIZE
錯誤。數值評估會產生一個無號 64 位元整數。
如果沒有符合的列,
BIT_XOR()
會傳回一個中性值(所有位元設定為 0),該值與引數值具有相同的長度。NULL
值不會影響結果,除非所有值都是NULL
。在這種情況下,結果是一個中性值,該值與引數值具有相同的長度。有關引數評估和結果型別的更多資訊討論,請參閱第 14.12 節「位元函數和運算子」中的介紹性討論。
如果從 mysql 客戶端內調用
BIT_XOR()
,二進位字串結果會使用十六進位表示法顯示,具體取決於--binary-as-hex
的值。有關該選項的更多資訊,請參閱 第 6.5.1 節「mysql — MySQL 命令列客戶端」。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述。傳回
SELECT
語句檢索的列中,expr
的非NULL
值的計數。結果是一個BIGINT
值。如果沒有符合的列,
COUNT()
會傳回0
。COUNT(NULL)
會傳回 0。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述。mysql> SELECT student.student_name,COUNT(*) FROM student,course WHERE student.student_id=course.student_id GROUP BY student_name;
COUNT(*)
有點不同,它會傳回檢索的列數,無論它們是否包含NULL
值。對於諸如
InnoDB
等交易式儲存引擎,儲存精確的列數是一個問題。可能會同時發生多個交易,每個交易都可能影響計數。InnoDB
不會保留資料表中列的內部計數,因為並行交易可能會在同一時間 「看到」不同的列數。因此,SELECT COUNT(*)
語句只會計算目前交易可見的列。如果沒有額外的子句,例如
WHERE
或GROUP BY
,InnoDB
資料表的SELECT COUNT(*) FROM
查詢效能會針對單執行緒工作負載進行最佳化。tbl_name
InnoDB
會透過遍歷可用的最小輔助索引來處理SELECT COUNT(*)
語句,除非索引或最佳化器提示指示最佳化器使用不同的索引。如果不存在輔助索引,InnoDB
會透過掃描叢集索引來處理SELECT COUNT(*)
語句。如果索引記錄並非完全在緩衝池中,處理
SELECT COUNT(*)
語句會需要一些時間。為了更快地計數,請建立一個計數器資料表,並讓您的應用程式根據它執行的插入和刪除來更新它。然而,當數千個並行交易正在啟動對同一個計數器資料表的更新時,此方法可能無法良好地擴展。如果近似的列數已足夠,請使用SHOW TABLE STATUS
。InnoDB
以相同的方式處理SELECT COUNT(*)
和SELECT COUNT(1)
操作。沒有效能上的差異。對於
MyISAM
資料表,如果SELECT
從一個資料表檢索、沒有檢索其他欄,且沒有WHERE
子句,則會最佳化COUNT(*)
以非常快速地傳回。例如mysql> SELECT COUNT(*) FROM student;
此最佳化僅適用於
MyISAM
資料表,因為會為此儲存引擎儲存精確的列數,並且可以非常快速地存取。COUNT(1)
只有在第一欄定義為NOT NULL
時才會受到相同的最佳化。COUNT(DISTINCT
expr
,[expr
...])傳回具有不同非
NULL
expr
值的列數。如果沒有符合的列,
COUNT(DISTINCT)
會傳回0
。mysql> SELECT COUNT(DISTINCT results) FROM student;
在 MySQL 中,您可以透過給定一個運算式清單來取得不包含
NULL
的相異運算式組合的數量。在標準 SQL 中,您必須在COUNT(DISTINCT ...)
內連接所有運算式。此函數傳回一個字串結果,其中包含來自群組的串連非
NULL
值。如果沒有非NULL
值,它會傳回NULL
。完整語法如下GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
mysql> SELECT student_name, GROUP_CONCAT(test_score) FROM student GROUP BY student_name;
或
mysql> SELECT student_name, GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ') FROM student GROUP BY student_name;
在 MySQL 中,您可以取得運算式組合的串連值。若要排除重複值,請使用
DISTINCT
子句。若要對結果中的值進行排序,請使用ORDER BY
子句。若要以相反的順序排序,請將DESC
(遞減)關鍵字新增至您正在排序的欄的名稱中,在ORDER BY
子句中。預設為遞增順序;可以使用ASC
關鍵字明確指定。群組中值之間的預設分隔符號是逗號 (,
)。若要明確指定分隔符號,請使用SEPARATOR
,後接應該插入群組值之間的字串文字值。若要完全排除分隔符號,請指定SEPARATOR ''
。結果會被截斷至系統變數
group_concat_max_len
所指定的最大長度,其預設值為 1024。此值可以設定得更高,但回傳值的有效最大長度會受到max_allowed_packet
的值所限制。在執行階段變更group_concat_max_len
值的語法如下,其中val
為不帶正負號的整數。SET [GLOBAL | SESSION] group_concat_max_len = val;
回傳值為非二進位或二進位字串,取決於引數是否為非二進位或二進位字串。結果類型為
TEXT
或BLOB
,除非group_concat_max_len
小於或等於 512,在這種情況下,結果類型為VARCHAR
或VARBINARY
。如果從 mysql 用戶端內調用
GROUP_CONCAT()
,二進位字串結果會使用十六進位表示法顯示,取決於--binary-as-hex
的值。如需該選項的詳細資訊,請參閱 第 6.5.1 節,「mysql — MySQL 命令列用戶端」。另請參閱
CONCAT()
和CONCAT_WS()
:第 14.8 節,「字串函數和運算符」。JSON_ARRAYAGG(
col_or_expr
) [over_clause
]將結果集匯總為單一的
JSON
陣列,其元素由各列組成。此陣列中元素的順序未定義。此函數作用於欄位或評估為單一值的表達式。如果結果不包含任何列或發生錯誤,則傳回NULL
。如果col_or_expr
為NULL
,則函數會傳回 JSON[null]
元素陣列。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述。mysql> SELECT o_id, attribute, value FROM t3; +------+-----------+-------+ | o_id | attribute | value | +------+-----------+-------+ | 2 | color | red | | 2 | fabric | silk | | 3 | color | green | | 3 | shape | square| +------+-----------+-------+ 4 rows in set (0.00 sec) mysql> SELECT o_id, JSON_ARRAYAGG(attribute) AS attributes -> FROM t3 GROUP BY o_id; +------+---------------------+ | o_id | attributes | +------+---------------------+ | 2 | ["color", "fabric"] | | 3 | ["color", "shape"] | +------+---------------------+ 2 rows in set (0.00 sec)
JSON_OBJECTAGG(
key
,value
) [over_clause
]接受兩個欄位名稱或表達式作為引數,第一個用作鍵,第二個用作值,並傳回包含鍵值對的 JSON 物件。如果結果不包含任何列或發生錯誤,則傳回
NULL
。如果任何鍵名稱為NULL
或引數數量不等於 2,則會發生錯誤。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述。mysql> SELECT o_id, attribute, value FROM t3; +------+-----------+-------+ | o_id | attribute | value | +------+-----------+-------+ | 2 | color | red | | 2 | fabric | silk | | 3 | color | green | | 3 | shape | square| +------+-----------+-------+ 4 rows in set (0.00 sec) mysql> SELECT o_id, JSON_OBJECTAGG(attribute, value) -> FROM t3 GROUP BY o_id; +------+---------------------------------------+ | o_id | JSON_OBJECTAGG(attribute, value) | +------+---------------------------------------+ | 2 | {"color": "red", "fabric": "silk"} | | 3 | {"color": "green", "shape": "square"} | +------+---------------------------------------+ 2 rows in set (0.00 sec)
重複鍵處理。當此函數的結果正規化時,具有重複鍵的值將被捨棄。根據不允許重複鍵的 MySQL
JSON
資料類型規範,只有遇到的最後一個值才會在傳回的物件中與該鍵一起使用(「最後一個重複鍵獲勝」)。這表示從SELECT
欄位中使用此函數的結果可能取決於傳回列的順序,而這無法保證。當用作視窗函數時,如果框架內存在重複鍵,則結果中僅會出現該鍵的最後一個值。如果
ORDER BY
規格保證這些值具有特定的順序,則來自框架中最後一列的鍵值是確定的。否則,鍵的結果值是不確定的。考慮以下情況
mysql> CREATE TABLE t(c VARCHAR(10), i INT); Query OK, 0 rows affected (0.33 sec) mysql> INSERT INTO t VALUES ('key', 3), ('key', 4), ('key', 5); Query OK, 3 rows affected (0.10 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT c, i FROM t; +------+------+ | c | i | +------+------+ | key | 3 | | key | 4 | | key | 5 | +------+------+ 3 rows in set (0.00 sec) mysql> SELECT JSON_OBJECTAGG(c, i) FROM t; +----------------------+ | JSON_OBJECTAGG(c, i) | +----------------------+ | {"key": 5} | +----------------------+ 1 row in set (0.00 sec) mysql> DELETE FROM t; Query OK, 3 rows affected (0.08 sec) mysql> INSERT INTO t VALUES ('key', 3), ('key', 5), ('key', 4); Query OK, 3 rows affected (0.06 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT c, i FROM t; +------+------+ | c | i | +------+------+ | key | 3 | | key | 5 | | key | 4 | +------+------+ 3 rows in set (0.00 sec) mysql> SELECT JSON_OBJECTAGG(c, i) FROM t; +----------------------+ | JSON_OBJECTAGG(c, i) | +----------------------+ | {"key": 4} | +----------------------+ 1 row in set (0.00 sec)
從最後一個查詢中選取的鍵是不確定的。如果查詢未使用
GROUP BY
(通常會強制實施自己的排序),並且您偏好特定的鍵排序,您可以透過包含帶有ORDER BY
規格的OVER
子句,將JSON_OBJECTAGG()
作為視窗函數調用,以便對框架列強制執行特定的順序。以下範例顯示在一些不同的框架規格中使用和不使用ORDER BY
時會發生什麼情況。不使用
ORDER BY
,框架為整個分割區mysql> SELECT JSON_OBJECTAGG(c, i) OVER () AS json_object FROM t; +-------------+ | json_object | +-------------+ | {"key": 4} | | {"key": 4} | | {"key": 4} | +-------------+
使用
ORDER BY
,其中框架為預設的RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
(升冪和降冪排序)mysql> SELECT JSON_OBJECTAGG(c, i) OVER (ORDER BY i) AS json_object FROM t; +-------------+ | json_object | +-------------+ | {"key": 3} | | {"key": 4} | | {"key": 5} | +-------------+ mysql> SELECT JSON_OBJECTAGG(c, i) OVER (ORDER BY i DESC) AS json_object FROM t; +-------------+ | json_object | +-------------+ | {"key": 5} | | {"key": 4} | | {"key": 3} | +-------------+
使用
ORDER BY
和整個分割區的明確框架mysql> SELECT JSON_OBJECTAGG(c, i) OVER (ORDER BY i ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS json_object FROM t; +-------------+ | json_object | +-------------+ | {"key": 5} | | {"key": 5} | | {"key": 5} | +-------------+
若要傳回特定的鍵值(例如最小或最大值),請在適當的查詢中加入
LIMIT
子句。例如mysql> SELECT JSON_OBJECTAGG(c, i) OVER (ORDER BY i) AS json_object FROM t LIMIT 1; +-------------+ | json_object | +-------------+ | {"key": 3} | +-------------+ mysql> SELECT JSON_OBJECTAGG(c, i) OVER (ORDER BY i DESC) AS json_object FROM t LIMIT 1; +-------------+ | json_object | +-------------+ | {"key": 5} | +-------------+
如需其他資訊和範例,請參閱JSON 值的正規化、合併和自動包裝。
MAX([DISTINCT]
expr
) [over_clause
]傳回
expr
的最大值。MAX()
可能會採用字串引數;在這種情況下,它會傳回最大字串值。請參閱第 10.3.1 節,「MySQL 如何使用索引」。可以使用DISTINCT
關鍵字來尋找expr
的相異值的最大值,但是,這會產生與省略DISTINCT
相同的結果。如果沒有符合的列,或者如果
expr
為NULL
,則MAX()
會傳回NULL
。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述;它不能與DISTINCT
一起使用。mysql> SELECT student_name, MIN(test_score), MAX(test_score) FROM student GROUP BY student_name;
對於
MAX()
,MySQL 目前會根據字串值而非字串在集合中的相對位置來比較ENUM
和SET
欄。這與ORDER BY
比較它們的方式不同。MIN([DISTINCT]
expr
) [over_clause
]傳回
expr
的最小值。MIN()
可能會採用字串引數;在這種情況下,它會傳回最小字串值。請參閱第 10.3.1 節,「MySQL 如何使用索引」。可以使用DISTINCT
關鍵字來尋找expr
的相異值的最小值,但是,這會產生與省略DISTINCT
相同的結果。如果沒有符合的列,或者如果
expr
為NULL
,則MIN()
會傳回NULL
。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述;它不能與DISTINCT
一起使用。mysql> SELECT student_name, MIN(test_score), MAX(test_score) FROM student GROUP BY student_name;
對於
MIN()
,MySQL 目前會根據字串值而非字串在集合中的相對位置來比較ENUM
和SET
欄。這與ORDER BY
比較它們的方式不同。傳回
expr
的母體標準差。STD()
是標準 SQL 函數STDDEV_POP()
的同義詞,作為 MySQL 擴充功能提供。如果沒有符合的列,或者如果
expr
為NULL
,則STD()
會傳回NULL
。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述。傳回
expr
的母體標準差。STDDEV()
是標準 SQL 函數STDDEV_POP()
的同義詞,為了與 Oracle 相容而提供。如果沒有符合的列,或者如果
expr
為NULL
,則STDDEV()
會傳回NULL
。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述。STDDEV_POP(
expr
) [over_clause
]傳回
expr
的母體標準差(VAR_POP()
的平方根)。您也可以使用STD()
或STDDEV()
,它們是等效的,但不是標準 SQL。如果沒有符合的列,或者如果
expr
為NULL
,則STDDEV_POP()
會傳回NULL
。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述。STDDEV_SAMP(
expr
) [over_clause
]傳回
expr
的樣本標準差(VAR_SAMP()
的平方根)。如果沒有符合的列,或者如果
expr
為NULL
,則STDDEV_SAMP()
會傳回NULL
。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述。SUM([DISTINCT]
expr
) [over_clause
]傳回
expr
的總和。如果傳回集合沒有列,則SUM()
會傳回NULL
。可以使用DISTINCT
關鍵字來僅加總expr
的相異值。如果沒有符合的列,或者如果
expr
為NULL
,則SUM()
會傳回NULL
。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述;它不能與DISTINCT
一起使用。傳回
expr
的母體標準變異數。它將各列視為整體母體,而非樣本,因此它以列數作為分母。您也可以使用VARIANCE()
,它是等效的,但不是標準 SQL。如果沒有符合的列,或者如果
expr
為NULL
,則VAR_POP()
會傳回NULL
。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述。傳回
expr
的樣本變異數。也就是說,分母為列數減一。如果沒有符合的列,或者如果
expr
為NULL
,則VAR_SAMP()
會傳回NULL
。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述。傳回
expr
的母體標準變異數。VARIANCE()
是標準 SQL 函數VAR_POP()
的同義詞,作為 MySQL 擴充功能提供。如果沒有符合的資料列,或者
expr
為NULL
,則VARIANCE()
會回傳NULL
。如果存在
over_clause
,則此函數會作為視窗函數執行。over_clause
如第 14.20.2 節「視窗函數的概念和語法」中所述。