#SQL na unha: recursos do SGBD
Tags: database, sql, mysql
Published: 2022-02-03 15:52:25

Seja muito bem vindo, caso seja sua primeira vez aqui, saiba que este é o 4º artigo abordando sobre banco de dados. Confira abaixo os artigos anteriores antes de prosseguir a leitura deste:
- [Banco de dados e primeiros comandos](https://dev.to/erandirjunior/sql-na-unha-banco-de-dados-e-primeiros-comandos-h4o)
- [Definindo estrutura do banco](https://dev.to/erandirjunior/sql-na-unha-definindo-estrutura-do-banco-3p1m)
- [Manipulando dados](https://dev.to/erandirjunior/sql-na-unha-manipulando-dados-d3n)

## Resumão
Nos artigos anteriores, vimos como criar um banco, tabelas e como manipular registros. Aquilo tudo é o básico para que uma pessoa consiga fazer uma atividade de um nível de complexidade não muito alta.

Caso ainda não tenha percebido, o conteúdo passado até agora é só uma fração dos inúmeros recursos disponíveis. Veremos hoje mais alguns mecanismos à nossa disposição. Apesar de tudo, deixo aqui novamente a minha recomendação para que visite a documentação do SGBD utilizado.

## Funções da data
Não importa a linguagem que esteja utilizando, não é nada fácil manipular uma data. Pensando nisso, vamos ver alguns recursos que podem simplificar nossa vida, vejam abaixo:
```sql
select now(); -- retorna a data e hora atual

select year('2000-01-01'); -- retorna o ano da data informada

select month('2010-10-12');  -- retorna o mês da data informada

select monthname('2014-01-07'); -- retorna o nome do mês da data informada

select day(now()); -- retorna o dia da data informada

select dayname(now()); -- retorna o nome do dia da data informada

select dayofmonth(now()); -- retorna o dia do mês da data passada

select dayofweek(now()); -- retorna o dia da semana, onde domingo = 1, segunda = 2, terça = 3, quarta = 4, quinta = 5, sexta = 6, sábado = 7

select dayofyear(now()); -- retorna o dia do ano da data informada

select datediff('2022-06-07', '2020-06-07'); -- retorna a diferença em dias, das datas duas datas informadas

select date_add(now(), INTERVAL 10 DAY); -- retorna uma data incrementada nos dias informados

select date_add(now(), INTERVAL 3 MONTH); -- retorna uma data incrementada nos meses informados

select date_add(now(), INTERVAL 4 YEAR); -- retorna uma data incrementada nos anos informados

select date_add(now(), INTERVAL 5 HOUR); -- retorna uma data incrementada nas horas informadas

select date_format(now(), '%d/%m/%Y'); -- retorna uma data formatada

select date_format(now(), '%d/%m/%y %H:%i:%s'); -- outro exemplo de formatação de data, lembrando que letras maiúsculas e minúsculos alteram o formato de saída
```

## Funções de String
Assim como existem funções para manipulação de datas, também temos funções para manipulação de strings, vejamos algumas delas:
```sql
select concat('a', 'b','c', '...'); -- concatena os dados passados

select concat_ws(',', 'a', 'b','c', '...'); -- concatena os dados enviados pelo separador informado no primeiro parâmetro

select char_length('erandir'); -- retorna o tamanho da string

select character_length('erandir'); -- retorna o tamanho da string

select replace(email, 'email', 'company') as email from user; -- substitui um parte da string por nos valores da coluna informada no primeiro parâmetro
```

## Funções de fluxo
Algumas vezes queremos **retornar um valor alternativo se o valor de um determinado campo estiver vazio**, para isso, temos uma função específica, veja seu uso:
```sql
select IFNULL(description, 'Campo vazio') as description from product;
```

Podemos **aplicar uma condição para retornar um valor específico**:
```sql
select if (value >= 2000, 2000 - (2000 * 0.1), value) as product_price from product; -- se o valor do produto for maior ou igual a 2000, damos um desconto de 10%, caso não, retorna o valor normal do produto
```

## Funções agregadas
Podemos **verificar a quantidade de registros em uma tabela**:
```sql
select count(id) as total from user;
```

Podemos **pegar a média de valor de alguma coluna**:
```sql
select avg(value) as total from product; -- é somado todos os valores da coluna informada e dividido pela quantidade de registros
```

Podemos **pegar o maior valor de uma determinada coluna**:
```sql
select max(value) as max from product;
```

Podemos **pegar o menor valor de uma determinada coluna**:
```sql
select min(value) as min from product;
```

## Finalizando
Vimos mais uma série de funcionalidades bem úteis, mesmo assim, volto a dizer que a melhor amiga de vocês é a **documentação**. Minha dica final é que pratiquem bastante, e caso queiram se aprofundar ainda mais a **documentação** é o caminho. Por hoje é só, até mais.