# *Session one:* Playlist Linguagem **SQL**
## Kalel Rodrigues
# DDL
### º show databases;
Para listar os bancos de dados disponiveis
-> Para executar essa linha de comando utilizamos: ctrl + enter
### º use (nome do banco de dados);
-> Selecionar o Banco de dados que desejarmos
### º show tables;
-> Mostrar as tabelas disponiveis nesse banco de dados
### º desc (nome da tabela);
-> Descrever as configurações de cada tabela

> `obs: uma coluna na desc de uma tabela, marcada como uma chave primaria: "não pode ser repetido, o valor dos campos não podem ser repetidos" e se tiver um: auto_increment, ele é um valor gerado, altomaticamente pelo proprio banco de dados.`
### º create database (nome do banco de dados);
-> Criar um banco de dados
### º create table (nome da tabela) (informar o nome de cada coluna);
-> exemplo:
create table filme (
**id** int primary key auto_increment,
**nome** varchar(100) *`> até 100 caracteres`*,
**estreia** datetime *`> data e hora`*,
**genero** varchar(100),
**disponivel** bool,
**avaliacao** decimal (15, 2) >*`podendo ter até 15 digitos, e o decimal 2`*
);
### º drop table(nome da tabela);
-> Apagar a tabela
# ABREVIAÇÕES
º tb_ -> Tabela
º nm_ -> Nome
º ds_ -> Descrição
º vl_ -> Valor
º bt_ -> Bit(Booleano)
º dt_ -> Data
### º not null
-> Colocar not null do lado do tipo do item, faz ele nao receber valores vazios
### º unique
-> Colocar unique do lado do tipo do item, ou do not null, faz ele nao receber valores iguais
exemplo: não poderiamos ter 2 filmes com o nome: Avangers
### º alter table (nome da tabela)
-> Este comando permite modificarmos a tabela, sem precisar recriala
-> Para adicionarmos um novo atributo á tabela, utilizamos: **add**
-> E para remover, utilizamos: **drop**
# DML
### º insert into (informar a tabela a qual vamos inserir o registro)(campos separados por virgulas, dentro do parenteses e um do lado do outro)
### º values
-> Os campos do tipo texto, serão utilizados, os apóstrofos:**''**
-> Os campos do tipo numero, **não** serão utilizados os apóstrofos
-> As casas decimais, serão utilizados o caractér: **.** não a virgula a qual estamos acostumados no portugues
-> Os campos booleanos, serão representados pelas palavras: **True** e **False**
-> Os campos de data, serão utilizados apóstrofos, igual o tipo texto, mas deve seguir o seguinte padrão: **'Ano-Mês-Dia'** - **'2022-04-21'**
-> A palavra **Values**, fica sempre alinhada a palavra **Into**, ou nas **aberturas dos parenteses**
## **EXEMPLOS**

### como os valores: disponivel e data, foram permitidos á terem valores nulos, podemos não inserir nada a eles, como mostrado no exemplo abaixo.

> `obs: não podemos trocar as ordens na hora de inserir registros, nem podemos alterar os nomes dos campos.`
### º SELECT * FROM (nome da tabela)
-> Utilizamos este comando para alterar um registro ne uma tabela

-> Podemos Substituir o *, pelas colunas que queremos mostrar, como no exemplo acima.
## INFORMAÇÕES UTEIS SOBRE TABELAS
- Cada Linha de uma tabela, chamamos de registro.
- Cada coluna de uma tabela, chamamos de campo.
- Cada valor que vincula uma linha a uma coluna, chamamos de célula.
### º UPDATE (nome da tabela) SET (oque queremos alterar) WHERE (qual chave primaria queremos alterar)

### º DELETE FROM (nome da tabela) WHERE (id dentro da tabela) = (numero do id)
-> Apagar um registro de uma tabela

### º SELECT * FROM (nome da tabela) ORDER BY (campo da tabela) (tipo de ordem)
-> Ordenar os registros
-> Campos vazios vem primeiro, e depois os com registros
-> exemplos de tipos de ordens:
- desc = decrescente
- asc = crescente, ou não colocamos nada( padrão )
### º SELECT (campo da tabela) as '' (nome da tabela)
-> Nome temporario do campo da tabela

### º SELECT * FROM (nome da tabela) WHERE (campo da tabela) = ''
-> Seleciona um valor para aparecer na tabela
[
-> Podemos trocar o *, por nomes de campos individuais que queremos visualizar

- <> operador **DIFERENTE**
- = operador **IGUAL**
-> Podemos fazer com que mais de um filtro seja acrescentado em nosso select, utilizando AND e OR

- :+1:

- Podemos utilizar o comando BEETWEN no lugar de = ou <>, para pegarmos valores dentro de 2 valores

- O operador LIKE faz com que possamos fazer buscas parciais

-> Utilizando o comando '(letra)%', faz com que todos os registros que começam com a letra... sejam buscados
-> Podemos pegar os registros que terminam com outras letrar utilizando o comando : '%(letra)'
-> E podemos pegar todos os que possuem uma letra, utilizando: '%(letra)%'

# Funções Built in
## Campos do Tipo **TEXT**
### `Funções Upper e Lower`

- **Upper** deixa todos os caracteres em maiusculo.
- e **Lower** deixa todos os caracteres em minusculo.
### `Função Lenght`

- Mostra quantas caracteres tem um texto.
### `Função Replace`

- Substitui um caracter, por outro.
### `Funções Left e Right`

- **Left** pega todos os caracteres da esquerda pra direita.
- **Right** pega todos os caracteres da direita pra esquerda.
### `Função Substring`

- Recorta um texto, recebendo 2 valores, o comeco e quantos irão ser recortados.
### `Função rpad e lpad`

- similares a **right e left**, a **rpad** recebe dois valores,o primeiro pega apenas os primeiros caracteres e se n tiver a quantidade informada, ele preenche com o caracter informado no segundo valor.
- a funcao **lpad** é a mesma logica, só que pega os ultimos caracteres.
### `Função instr`

- Pega a posição da primeira letra informada no comando.
## Campos do Tipo **NUMBER**
### `Funções ceiling e floor`

- São funções de **arredondamento**.
- **ceiling** arredonda pra cima.
- **floor** arredonda pra baixo.
### `Funções round e truncate`

- São funções de **arredondamento**.
- **Round** arredonda de 0.5 pra cima.
- **Truncate** mantem o valor sem decimais.
### `Funções abs e sign`

- **abs** sempre mantém o valor positivo.
- **sign** verifica se ele é um numero **positivo**, **negativo** ou **0**: podendo ser, **1** = positivo, **-1** = negativo, **0** = 0.
### `Funções pow e sqrt`

- **pow** recebe 2 valores, fazendo a conta de potencia.
- **sqrt** recebe 1 valor, fazendo a conta de raiz quadrada.
### `Funções mod e rand()`

- A função **mod** irá pegar o primeiro valor e dividir pelo segundo, e pegar o seu resto(em js, são chamados de %, ou módulo).
- A função **rand**, cria um valor aleatorio.
## Campos do Tipo **DATE AND TIME**
### `Funções date, year, month e day`

- A função **date** extrai apenas a parte da data, de um campo data e hora.
- **year** o ano.
- **month** o mês.
- **day** o dia.
### `Funções time, hour, minute e second`

- A função **time** extrai apenas a parte do horario, de um campo data e hora.
- **hour** as horas.
- **minute** os minutos.
- **second** os segundos.
### `Funções dayofweak e dayofyear`

- A função **dayofweak**, informa o dia da semana (baseado que a semana comeca no 1 = domingo e acaba no 7 = sabado).
- Já a função **dayofyear**, informa o dia do ano.
### `Funções date_add e datediff`

- A função **date_add**, adiciona dias, meses e anos ao campo, e tambem subitrai.
- A função **datediff**, verifica a diferenca em dias de uma data á outra.
### `Funções now(), sysdate(), current_date() e current_time()`

- As funções **now() e sysdate()**, retornam a hora completa e o dia completo do momento atual do sistema.
- Já a **current_date()**, retorna somente o dia do momento atual do sistema.
- Já a **current_time()**, retorna somente a hora do momento atual do sistema.
### `Função date_format(2 parametros)`

- O **primeiro** parametro é a data e hora que será formatada.
- Já o **segundo** é a formatação que será aplicada.
- **%d**, significa a parte do dia que será formatada.**%m**, significa a parte do mês. **%y**, significa o ano com 2 digitos. o **Y%** trás os 4 digitos do ano.
- Podendo junta-los para formar uma data mais legivel, como no exemplo abaixo.

## Campos do Tipo **AVANÇADAS**
### `Função concat()`

- Recebe 2 valores, e irá junta-los.
- Para colocar um espaço entre elas, utilizamos ' ', veja no exemplo abaixo.

### `Função ifnull()`

- Ele verifica se um campo é nulo, e passa um valor que voce atribuir.
### `Função case`

- Retorna um valor baseado em **testes**.

- Podendo ter quantos testes quiser.
### `Função convert e cast`

- O comando **convert**, converte um tipo de campo, para outro.
- O **cast** funciona de maneira similar.
# UNION, SUBQUERY E VIEW
## Fazer 2 Selects se unirem.
Vejamos que na tabela de filmes, temos esse banco de dados.

E na tabela de series, temos esses.

- Para unir os 2 selects, utilizamos: **union** entre os selects escolhidos

> `obs: temos que colocar a mesma quantidade de campos, nos 2 selects, senão ocorrerá um erro na união deles.`

## Fazer as tabelas terem 1 where.
- Para fazermos a uniao, ser uma tabela só, teremos que colocalos dentro de **um select** só, como no exemplo abaixo.

- Para fazermos aparecer apenas os que tem letra A, teremos que fazer igual o exemplo abaixo.

## Fazermos a tabela criada ficar menos poluida.
- Para Fazermos a tabela unica criada a cima, ficar menos poluida, usamos o conceito de **view**, veja no exemplo abaixo.

- Fazendo assim, podemos dar um select, apenas na view, e nao no comando poluido que estava quando criamos a unica tabela.
# Chave Estrangeira
- Para fazer o relacionamento entre 2 tabelas utilizamos a Chave Estrangeira, como mostrado no exemplo abaixo.

- Para adicionarmos algo a uma tabela que possue uma chave estrangeira, utilizamos o mesmo comando **INSERT INTO**, como no exemplo abaixo.

- Caso inserirmos um personagem em um campo de tabela errado, podemos facilmente arruma isso, utilizando o exemplo abaixo.

- Caso inserirmos um personagem errado e quisermos deleta-lo, podemos facilmente fazer isso, utilizando o exemplo abaixo.

- Para fazermos em **um unico select**, retornar as informações da tabela de personagem e na tabela de filme, ja que as tabelas estão relacionadas, podemos realizar essa tarefa utilizando o exemplo abaixo.
- O comando **JOIN** é uma abreviação a o comando **INNER JOIN**.

- Para fazermos com que mostre apenas o nome do personagem e do filme, fazemos igual o exemplo abaixo.

- Para definirmos qual tabela esta vindo a informação, fazemos igual no exemplo abaixo.

- O Comando Inner Join, retorna apenas os registros que estão **relacionados** as 2 tabelas, como no exemplo abaixo, onde Lu e In não tem nenhum registro, então eles nao apareceram no select do inner join.

- Para corrigirmos isso, podemos invez de colocar Inner Join, utilizamos **Left Join**, fazendo com que os campos que não tem personagem, fiquem nulos.

- O comando Cross Join, ignora as ligações e junta todos os campos com todos os campos, como no exemplo abaixo.
