O MySQL Deve Saber 10: Cálculo Matemático, Processamento de String e Julgamento Condicional

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 .

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?

  1. 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) |
    +----------+
    
  2. 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 V2
  • if(表达式, 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 |
+----------------+

Acho que você gosta

Origin blog.csdn.net/qq_31362767/article/details/123602671
Recomendado
Clasificación