A leitura é compilada de "MySQL Must Know and Know" - Zhu Xiaofeng . Para obter detalhes, faça login na coluna de compra no site oficial do Geek Time .
Diretório de artigos
função matemática
É usado principalmente para processar dados numéricos.Existem principalmente três tipos comumente usados, ou seja, a função de arredondamento ROUND(), CEIL(), FLOOR(), a função de valor absoluto ABS() e a função de resto MOD().
preparação de dados:
demo.transactiondetail
mysql> select transactionid, itemnumber, quantity, price, discount, salesvalue
-> from demo.transactiondetails
-> order by transactionid, itemnumber;
+---------------+------------+----------+-------+----------+------------+
| transactionid | itemnumber | quantity | price | discount | salesvalue |
+---------------+------------+----------+-------+----------+------------+
| 1 | 1 | 2 | 89.00 | 0.99 | 176.22 |
| 1 | 2 | 5 | 5.00 | 0.99 | 24.75 |
| 2 | 1 | 3 | 89.00 | 0.88 | 234.96 |
| 2 | 2 | 6 | 5.00 | 0.88 | 26.40 |
| 3 | 1 | 1 | 89.00 | 0.95 | 84.55 |
| 3 | 2 | 10 | 5.00 | 0.95 | 47.50 |
+---------------+------------+----------+-------+----------+------------+
demo.transacionhead
mysql> select transactionid, transactionno, cashierid, memberid, operatorid, transdate
-> from demo.transactionhead;
+---------------+------------------+-----------+----------+------------+---------------------+
| transactionid | transactionno | cashierid | memberid | operatorid | transdate |
+---------------+------------------+-----------+----------+------------+---------------------+
| 1 | 0120201201000001 | 1 | 1 | 1 | 2020-12-01 00:00:00 |
| 2 | 0120201202000001 | 1 | 2 | 2 | 2020-12-02 00:00:00 |
| 3 | 0120201202000002 | 1 | NULL | 1 | 2020-12-01 01:00:00 |
+---------------+------------------+-----------+----------+------------+---------------------+
demo.goodsmaster
mysql> select * from demo.goodsmaster;
+------------+---------+-----------+---------------+------+-----------+
| itemnumber | barcode | goodsname | specification | unit | saleprice |
+------------+---------+-----------+---------------+------+-----------+
| 1 | 0001 | 书 | | 本 | 89.00 |
| 2 | 0002 | 笔 | | 支 | 5.00 |
+------------+---------+-----------+---------------+------+-----------+
demo.membermaster
mysql> select memberid, branchid, cardno, membername, address, phone, pid, memeberpoints, memberdeposit from demo.membermaster;
+----------+----------+----------+------------+---------+-------------+--------------------+---------------+---------------+
| memberid | branchid | cardno | membername | address | phone | pid | memeberpoints | memberdeposit |
+----------+----------+----------+------------+---------+-------------+--------------------+---------------+---------------+
| 1 | 1 | 10000001 | 张三 | 天津 | 13698765432 | 475145197001012356 | 0.00 | 0.00 |
| 2 | 1 | 10000002 | 李四 | 上海 | 18758079161 | 123123199001012356 | 0.00 | 0.00 |
+----------+----------+----------+------------+---------+-------------+--------------------+---------------+---------------+
função de arredondamento
- Ceil(X) e teto(X): retorna o menor inteiro INT maior ou igual a X
- Floor(X): Retorna o maior inteiro INT menor ou igual a X
- Função de arredondamento round(X,D): X representa o número a ser processado, D representa o número de casas decimais reservadas, o método de processamento é o arredondamento, ROUND(X) representa 0 casas decimais
Requisitos : A regra de pontos é um ponto para um yuan, e nenhum ponto para menos de um yuan. Obviamente, é arredondado para baixo, então você pode usar a função FLOOR().
Obtenha informações relevantes sobre o consumo do membro através da consulta associada:
mysql> select c.membername as '会员',
-> b.transactionno as '单号',
-> b.transdate as '时间',
-> d.goodsname as '商品名称',
-> a.salesvalue as '交易金额'
-> from demo.transactiondetails a
-> join demo.transactionhead b on (b.transactionid = a.transactionid)
-> join demo.membermaster c on (c.memberid = b.memberid)
-> join demo.goodsmaster d on (d.itemnumber = a.itemnumber);
+------+------------------+---------------------+----------+----------+
| 会员 | 单号 | 时间 | 商品名称 | 交易金额 |
+------+------------------+---------------------+----------+----------+
| 张三 | 0120201201000001 | 2020-12-01 00:00:00 | 书 | 176.22 |
| 张三 | 0120201201000001 | 2020-12-01 00:00:00 | 笔 | 24.75 |
| 李四 | 0120201202000001 | 2020-12-02 00:00:00 | 书 | 234.96 |
| 李四 | 0120201202000001 | 2020-12-02 00:00:00 | 笔 | 26.40 |
+------+------------------+---------------------+----------+----------+
Use floor(a.salesvalue)
, arredonde para baixo o valor das vendas para obter o valor dos pontos do membro
select c.membername as '会员',
b.transactionno as '单号',
b.transdate as '时间',
d.goodsname as '商品名称',
floor(a.salesvalue) as '积分'
from demo.transactiondetails a
join demo.transactionhead b on (b.transactionid = a.transactionid)
join demo.membermaster c on (c.memberid = b.memberid)
join demo.goodsmaster d on (d.itemnumber = a.itemnumber);
+------+------------------+---------------------+----------+------+
| 会员 | 单号 | 时间 | 商品名称 | 积分 |
+------+------------------+---------------------+----------+------+
| 张三 | 0120201201000001 | 2020-12-01 00:00:00 | 书 | 176 |
| 张三 | 0120201201000001 | 2020-12-01 00:00:00 | 笔 | 24 |
| 李四 | 0120201202000001 | 2020-12-02 00:00:00 | 书 | 234 |
| 李四 | 0120201202000001 | 2020-12-02 00:00:00 | 笔 | 26 |
+------+------------------+---------------------+----------+------+
ou:
mysql> select 1.5 - mod(1.5, 1);
+-------------------+
| 1.5 - mod(1.5, 1) |
+-------------------+
| 1.0 |
+-------------------+
mysql> select 1.1 - mod(1.1, 1);
+-------------------+
| 1.1 - mod(1.1, 1) |
+-------------------+
| 1.0 |
+-------------------+
Requisito : Ao receber dinheiro, o valor a receber pode ser definido para qual dígito arredondar. Por exemplo, você pode definir o arredondamento para yuan, ângulo ou centavo.
mysql> select round(salesvalue, 2)
-> from demo.transactiondetails where transactionid=1 and itemnumber=1;
+----------------------+
| round(salesvalue, 2) |
+----------------------+
| 176.22 |
+----------------------+
mysql> select round(salesvalue, 1)
-> from demo.transactiondetails where transactionid=1 and itemnumber=1;
+----------------------+
| round(salesvalue, 1) |
+----------------------+
| 176.2 |
+----------------------+
mysql> select round(salesvalue)
-> from demo.transactiondetails where transactionid=1 and itemnumber=1;
+-------------------+
| round(salesvalue) |
+-------------------+
| 176 |
+-------------------+
funções de string
Existem 4 funções de string comumente usadas.
- concat(s1,s2,…): significa concatenar as strings s1, s2… para formar uma string
- cast(expression as char): Indica a conversão do valor da expressão em uma string
- char_length (string): Indica o comprimento da string obtida
- space(n): significa obter uma string composta por n espaços
Requisito : Após a conclusão da transação, o sistema deve emitir um recibo. Ao imprimir recibos, existem muitos requisitos para o formato. Por exemplo, um pequeno papel de bilhete com largura de 57 mm pode conter cerca de 32 caracteres, ou seja, 16 caracteres chineses. O usuário requer 2 linhas para um fluxo, a primeira linha é a informação do produto, e a segunda linha deve incluir quatro tipos de informação: quantidade, preço, desconto e valor. Então, como podemos imprimir claramente essas informações no recibo e imprimi-las de maneira organizada e bonita?
-
Imprima as informações do produto na primeira linha. As informações do produto incluem: nome do produto e especificação do produto, e a especificação do produto deve ser incluída entre colchetes. Dessa forma, o nome do produto e a especificação do produto devem ser unidos para formar uma cadeia de caracteres.
mysql> select concat(goodsname, '(', specification, ')') as 商品信息 -> from demo.goodsmaster where itemnumber=1; +----------+ | 商品信息 | +----------+ | 书(16开) | +----------+
-
Como imprimir a segunda linha. A segunda linha inclui quantidade, preço, desconto e valor, e há 4 tipos de informações no total.
converter para string
mysql> select cast(quantity as char) -- 把数量转换成字符串,把decimal类型转换成字符串 -> from demo.transactiondetails -> where transactionid=1 and itemnumber=1; +------------------------+ | cast(quantity as char) | +------------------------+ | 2 | +------------------------+
Calcular o comprimento de uma string
mysql> select char_length(cast(quantity as char)) as 长度 -> from demo.transactiondetails where transactionid=1 and itemnumber=1; +------+ | 长度 | +------+ | 1 | +------+
Preenchimento de espaço com comprimento de 7 dígitos
mysql> select concat(cast(quantity as char), space(7-char_length(cast(quantity as char)))) as 数量 -> from demo.transactiondetails where transactionid=1 and itemnumber=1; +---------+ | 数量 | +---------+ | 2 | +---------+
Funções de string: https://dev.mysql.com/doc/refman/8.0/en/string-functions.html
função de julgamento de condição
A principal função da função de julgamento de condição é retornar valores diferentes de acordo com condições específicas. Existem dois comumente usados:
ifnull(V1, V2)
: Indica que se o valor de V1 não for nulo, retorna V1, caso contrário, retorna V2if(表达式, V1, V2)
: Se a expressão for verdadeira (TRUE), retorna V1, caso contrário, retorna V2
mysql> select goodsname, specification, concat(goodsname, '(', ifnull(specification, ''), ')') as 拼接
-> from demo.goodsmaster;
+-----------+---------------+----------+
| goodsname | specification | 拼接 |
+-----------+---------------+----------+
| 书 | 16开 | 书(16开) |
| 笔 | NULL | 笔() |
+-----------+---------------+----------+
mysql> select goodsname, specification, if(isnull(specification), goodsname, concat(goodsname, '(', ifnull(specification, ''), ')')) as 拼接
-> from demo.goodsmaster;
+-----------+---------------+----------+
| goodsname | specification | 拼接 |
+-----------+---------------+----------+
| 书 | 16开 | 书(16开) |
| 笔 | NULL | 笔 | -- 去掉多余的()
+-----------+---------------+----------+
resumo
função | Função |
---|---|
função matemática | floor(x): Obtém o maior inteiro menor ou igual a x |
ceil(x): Obtém o menor inteiro maior ou igual a x | |
round(x, d): Arredondando, obtém o valor mais próximo de x, mantendo d casas decimais | |
abs(): obtém o valor absoluto de x | |
mod(x, y): Obtém o resto depois que x é dividido por y | |
concat(s1,s2,…): Concatena as strings s1, s2,… | |
char_length(s): Obtenha o número de caracteres na string s, um caractere chinês conta como um caractere | |
funções de string | space(n): Obtém uma string que consiste em n espaços |
substr() e mid(): obtém a substring na string | |
trim (): exclua a substring em ambas as extremidades do início da string | |
ltrim(): Remova os espaços no início da string | |
rtrim(): remove os espaços no final da string | |
função de julgamento de condição | ifnull(v1, v2): Se v1 for nulo, retorna v2, caso contrário, retorna v1 |
if(expressão, v1, v2): Se a expressão for verdadeira, retorna v1, caso contrário, retorna v2 |
A função também tem algumas armadilhas, como round(x) arredondar x não é necessariamente maior que o x original:
mysql> select round(-1.5);
+-------------+
| round(-1.5) |
+-------------+
| -2 |
+-------------+
mysql> select round(-1.5, 0);
+----------------+
| round(-1.5, 0) |
+----------------+
| -2 |
+----------------+
mysql> select round(-1.5, 1);
+----------------+
| round(-1.5, 1) |
+----------------+
| -1.5 |
+----------------+