Introdução a Pesquisa de Dados - SQL
Tags: beginners, sql, mysql, braziliandevs
Published: 2022-02-22 20:53:38

## Tabela de Conteúdos

- [Query](#query)
- [`SELECT`](#select)
- [`CONCAT`](#concat)
- [`DISTINCT`](#distinct)
- [`COUNT`](#count)
- [`LIMIT`](#limit)
- [`LIMIT` `OFFSET`](#limit-offset)
- [`ORDER BY`](#order-by)
- [Links Úteis](#links-úteis)

---

## Query

### O que são?
São um ou mais comandos utilizados para interagir de alguma forma com o DB.

### O que fazem?
Esses comandos nos permitem interagir não só com os dados, mas também com as permissões dos usuários

Podemos realizar todas as operações de CRUD, não só com os dados das tabelas, mas também com os usuários cadastrados no DB.

*Obs: _Operação de CRUD: Criar/Create, Ler/Read, Atualizar/Update e Deletar/Delete_.

### Tipos
Os principais tipos de Queries são:

#### DDL (Data Definition Language)

São todos os comandos que lidam com o esquema, descrição e modo como os dados devem existir.

- __`CREATE`__: cria DBs, tabelas, índices, views, procedures, functions e triggers
- __`ALTER`__: altera a estrutura das tabelas
- __`DROP`__: permite deletar/_"dropar"_ tabelas
- __`TRUNCATE`__: esvazia os dados de uma tabela, mas não a exclui

#### DML (Data Manipulation Language)

São comandos utilizados para manipular dados, realizam o armazenamento, modificação, busca e exclusão de dados.

- __`SELECT`__: busca dados
- __`INSERT`__: insere dados
- __`UPDATE`__: altera dados
- __`DELETE`__: deleta dados

#### DCL (Data Control Language)

São comandos que manipulam as permissões e outros tipos de controle ao sistema do DB.

- __`GRANT`__: concede diferentes acessos a um usuário
- __`REVOKE`__: remove acessos concedidos através do comando GRANT

#### TCL (Transactional Control Language)

Lida com transações dentro das pesquisas

- __`COMMIT`__: muda as alterações temporárias para permanentes
- __`ROLLBACK`__: desfaz todo o impacto realizado por um comando
- __`SAVEPOINT`__: define pontos onde a transação pode voltar _("checkpoint")_
- __`TRANSACTION`__:  define onde, como e em qual escopo as transações são executadas

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## Select

### O que é?

É um comando utilizado para selecionar/buscar dados nas tabelas.

### Sintaxe

A sintaxe do comando é muito simples, para pesquisar em uma tabela utilizamos a palavra reservada `SELECT`, seguida do que desejamos selecionar e por fim utilizamos a palavra reservada `FROM` seguida do nome do DB, mais a tabela que desejamos consultar.

Podemos selecionar todos os dados utilizando asterisco `*`, ou selecionar uma ou mais colunas da tabela passando seu nome, no caso de pesquisarmos mais de uma coluna, separamos seus nomes com vírgula.

``` sql
SELECT <o que selecionar> FROM <DB>.<tabela>;
```
``` sql
SELECT * FROM sakila.actor;
```
``` sql
SELECT name FROM sakila.actor;
```
``` sql
SELECT name, age FROM sakila.actor;
```

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## Concat

### O que é?
É uma função que concatena _(junta)_ duas ou mais colunas de uma tabela, gerando uma nova coluna.

### Sintaxe
Para concatenarmos colunas primeiro precisamos selecioná-las, para isso usamos o comando `SELECT`, só então nós inserimos a função `CONCAT()`, informando as colunas que desejamos juntar e, opcionalmente, podemos nomear a nova coluna gerada com o `AS`.

``` sql
SELECT CONCAT(<colunas a serem concatenadas>) FROM <DB>.<tabela>;
```
``` sql
SELECT CONCAT(first_name, ' ', last_name) FROM sakila.actor;
```
``` sql
SELECT CONCAT(first_name, ' ', last_name) AS 'full_name' FROM sakila.actor;
```

No exemplo acima, utilizamos uma string com um espaço para separar os dados e deixá-los mais legíveis, porém isso é opcional.

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## Distinct

### O que é?
É um comando que remove dados duplicados do retorno das Queries, ou seja, __os dados não são apagados do DB, apenas omitidos no retorno__ de nossa pesquisa.

### Sintaxe
Para podermos filtrar dados repetidos, primeiro temos que pesquisar esses dados, logo utilizamos a sintaxe do `SELECT`, após o comando e antes das colunas a serem pesquisadas declaramos o `DISTINCT`.

``` sql
SELECT DISTINCT <o que selecionar> FROM <DB>.<tabela>;

SELECT DISTINCT first_name FROM sakila.actors;
```

No exemplo acima retornaremos os _first_name_ sem repetição, exemplificando, se tivermos duas pessoas chamadas Gabriel, apenas um nome Gabriel será retornado pela Query.

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## Count

### O que é?
É uma função que nos permite contar a quantidade de resultados de uma busca.

### Sintaxe
Assim como outras funções e comandos, o `COUNT()` também necessita que uma busca seja feita, para só então ser possível fazer a contagem.

Para isso nós utilizamos o comando `SELECT` e logo em seguido o `COUNT()`, passando como parâmetro a coluna ser contada.

``` sql
SELECT COUNT(<o que selecionar>) FROM <DB>.<tabela>;
```
``` sql
SELECT COUNT(last_name) FROM sakila.actors;
```
``` sql
SELECT COUNT(DISTINCT last_name) FROM sakila.actors;
```

O último exemplo mostra que é possível não apenas fazer a contagem, como também contar apenas os dados que não se repetem. Mais a frente veremos que podemos deixar nossos comandos ainda mais completos.

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## Limit

### O que é?

É um comando que limita a quantidade de resultados em uma pesquisa.

### Sintaxe

O `LIMIT` é um comando limitador para o `SELECT`, logo ele deve ser utilizado após a definição da tabela para pesquisa.

``` sql
SELECT <o que selecionar> FROM <DB>.<tabela> LIMIT <nº máx de resultados>;
```
``` sql
SELECT * FROM sakila.rental LIMIT 10;
```

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## Limit Offset

### O que é?

É um comando utilizado para pular uma certa quantidade de linhas do resultado, normalmente utilizado para paginação.

### Sintaxe

O `OFFSET` deve ser colocado após o `LIMIT`, sendo necessário informar o número de linhas a serem puladas.

``` sql
SELECT <coluna> FROM <DB>.<tabela> LIMIT <nº máx> OFFSET <nº>;
```
``` sql
SELECT * FROM sakila.rental LIMIT 10 OFFSET 3;
```

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## Order By

### O que é?

É um comando que ordena os resultados de Queries através de uma, ou mais colunas determinadas por nós.

### Sintaxe

O `ORDER BY` deve ser declarado após a sintaxe do `SELECT`, sendo necessário declarar por qual coluna o resultado deve ser ordenado e opcionalmente podemos informar se queremos os resultados em formato crescente `ASC` ou decrescente `DESC`.

``` sql
SELECT <o que selecionar> FROM <DB>.<tabela> ORDER BY <coluna>;
```
``` sql
SELECT * FROM sakila.actors ORDER BY first_name;
```
``` sql
SELECT * FROM sakila.actors ORDER BY age DESC;
```

Caso não informemos qual a ordenação dos resultados, o MySQL por padrão irá ordenar de forma crescente, o que nos permite omitir o comando `ASC`.

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

---

## Links Úteis

- [Exercícios Básicos com o `SELECT`](https://sqlzoo.net/wiki/SELECT_basics)

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>