# Aprender SQL: Tutorial introdutório

A linguagem de programação SQL é baseada em **álgebra relacional**, por isso ela difere das demais linguagens em importantes aspectos. Para aprender SQL é essencial que se compreenda sua sintaxe. Os exemplos práticos do nosso tutorial introdutório certamente ajudarão você a começar.

## Noções básicas de sintaxe SQL

Sintaxe nada mais é que a forma como uma linguagem de programação é “**escrita**”. Ela estabelece as construções básicas de um código e determina como estas podem se relacionar. Compreender a sintaxe de uma linguagem é pré-requisito imprescindível para se ler e escrever códigos.

As estruturas de sintaxe mais importantes do SQL são as **declarações SQL que contêm cláusulas**. Embora esta não seja, tecnicamente, a nomenclatura mais correta, declarações SQL são geralmente chamadas de “comandos SQL”. Existem, ainda, outras estruturas de sintaxe SQL relevantes. Apresentamo-las abaixo, somente para fins informativos.

<table>
  <thead>
    <tr>
      <th><strong>Termo</strong></th>
      <th><strong>Termo em inglês</strong></th>
      <th><strong>Explicação</strong></th>
      <th><strong>Exemplo</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Declaração</td>
      <td>*Statement*</td>
      <td>Instrui o DBMS a executar uma ação; termina com ponto e vírgula.</td>
      <td>`CREATE TABLE People;`</td>
    </tr>
    <tr>
      <td>Cláusula</td>
      <td>*Clause*</td>
      <td>Modifica uma declaração; só pode ser inserida dentro de declarações.</td>
      <td>`WHERE, HAVING`</td>
    </tr>
    <tr>
      <td>Expressão</td>
      <td>*Expression*</td>
      <td>Retorna um valor ao realizar uma análise.</td>
      <td>`6 * 7`</td>
    </tr>
    <tr>
      <td>Identificador</td>
      <td>*Identifier*</td>
      <td>Nomeia um objeto, variável ou procedimento do banco de dados; pode ser qualificado ou não qualificado.</td>
      <td>`dbname.tablename / tablename`</td>
    </tr>
    <tr>
      <td>Predicado</td>
      <td>*Predicate*</td>
      <td>Expressão que é classificada como `TRUE`, `FALSE` ou `UNKNOWN`.</td>
      <td>`Age < 42`</td>
    </tr>
    <tr>
      <td>Consulta</td>
      <td>*Query*</td>
      <td>Declaração especial; retorna um conjunto de resultados de registros.</td>
      <td>`SELECT Name FROM People WHERE Age < 42;`</td>
    </tr>
    <tr>
      <td>Função</td>
      <td>*Function*</td>
      <td>Processa um ou mais valores; geralmente resulta em um novo valor.</td>
      <td>`UPPER('text') -- Retorna 'TEXT'`</td>
    </tr>
    <tr>
      <td>Comentário</td>
      <td>*Comment*</td>
      <td>Usado para inserir comentários em um código SQL; é ignorado pelo RDBMS.</td>
      <td>`-- Comentário até o final da linha / /*Comentário de várias linhas, caso se aplique*/`</td>
    </tr>
  </tbody>
</table>

Nota Comandos SQL, como SELECT e CREATE TABLE, geralmente são escritos em letras maiúsculas, mas isso não passa de uma mera convenção amplamente difundida. O SQL não faz distinção entre letras maiúsculas e minúsculas.

## Como códigos SQL são executados?

Códigos-fonte SQL são arquivos de texto que ganham vida somente quando no ambiente de execução adequado. Eles são lidos por um **interpretador SQL** e convertidos em ações por um sistema gerenciador de banco de dados relacional (SGBDR — ou RDBMS, se em inglês). O processo pode se dar de duas formas:

1. **Executar código SQL em sessão interativa**Nessa abordagem, um código SQL é inserido ou copiado diretamente em uma janela de texto para ser executado e ter o resultado exibido. Aqui, existe a possibilidade de se ajustar e reexecutar o código, em caso de necessidade. A rapidez com a qual códigos podem ser sequenciados e/ou manipulados para exibir resultados torna essa abordagem mais adequada ao aprendizado e à realização de consultas complexas.
2. **Executar código SQL como script**Permite a execução, linha por linha, de um arquivo de código-fonte SQL completo. Aqui, o feedback só é apresentado ao final da execução, o que torna a abordagem mais adequada à automatização de processos e à importação de [backups de bancos de dados MySQL com MySQL dump](https://www.ionos.com/pt-br/digitalguide/servidor/seguranca/mysql-dump/).

<table>
  <thead>
    <tr>
      <th><strong>Interface</strong></th>
      <th><strong>Descrição</strong></th>
      <th><strong>Exemplos</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Interface de linha de comando (CLI)</td>
      <td>Interface baseada em texto: o código SQL é inserido, executado e seu resultado é exibido em forma de texto.</td>
      <td>mysql, psql, mysqlsh</td>
    </tr>
    <tr>
      <td>Interface gráfica do usuário (GUI)</td>
      <td>O código SQL é inserido na janela de texto e/ou gerado em resposta à interação de um usuário; ao ser executado, seu resultado é exibido em forma de tabela.</td>
      <td>phpMyAdmin, MySQL Workbench, HeidiSQL</td>
    </tr>
    <tr>
      <td>Interface de programação (API)</td>
      <td>Permite a comunicação direta com um RDBMS; o código SQL é integrado como string no código da respectiva linguagem de programação e então executado; resultados são disponibilizados como estruturas de dados, para uso posterior.</td>
      <td>PHP Data Objects (PDO), Connector/J (Java), Connector/Python, C API</td>
    </tr>
  </tbody>
</table>

## SQL para criar um sistema de gerenciamento de produtos fictício

O jeito mais fácil de aprender SQL, assim como qualquer outra linguagem de programação, é escrevendo e executando códigos na prática. Entenda, a seguir, **como criar um mini banco de dados e executar consultas dentro dele**. Faça isso utilizando o [interpretador SQL on-line](https://sql.js.org/examples/GUI/ "Interpretador SQL on-line — sql.js demo") do *sql.js*. Ao acessar o site, substitua o código SQL já inserido pelos códigos dos nossos exemplos. Execute-os parte a parte para obter os mesmos resultados que este tutorial.

### Procedimento básico para configurar um banco de dados SQL

Criaremos um **gerenciador de produtos** comerciais como exemplo, para ser usado por uma loja fictícia, virtual ou física. Neste primeiro momento, definiremos seus requisitos de forma generalizada:

- Oferecemos uma gama variada de produtos, cada um estocado em diferentes quantidades.
- Nossa clientela também é variada.
- Um cliente pode fazer um pedido que contenha mais de um produto.
- Cada pedido deve ser armazenado com a data da compra, com os produtos encomendados e com as quantidades correspondentes.

Para começar, traduziremos esses requisitos em **descrições abstratas** para, em seguida, escrevermos o código SQL. Seguiremos o procedimento abaixo:

1. Criar modelo
2. Definir esquema
3. Inserir registros de dados
4. Definir consultas

### Criar modelo entidade-relacionamento

O primeiro passo é dado no papel ou utilizando ferramentas de modelagem especiais. Ele consiste em **coletar informações sobre o sistema a ser modelado para extrair dele entidades-relacionamento**. Geralmente essa etapa é representada por diagramas entidade-relacionamento (ER).

O que são entidades-relacionamento? **Entidades são, simplesmente, classes de coisas**. Nosso exemplo de gerenciador de produtos tem três entidades: produto, cliente e pedido. Cada uma exige a criação de uma tabela. Devido a recursos especiais presentes em modelos relacionais, tabelas adicionais devem ser inseridas para modelar os respectivos relacionamentos. Identificá-los e implementá-los requer conhecimento e experiência.

Como entidades-relacionamento se conectam? É importante entender como se dá o processo de ligação entre entidades-relacionamento. Observe aqui **ambas as direções de um relacionamento**, que distinguimos entre **singular e plural**. Utilizaremos a relação proprietário-carro para melhor exemplificação:

1. “Um dono de carro tem, potencialmente, outros veículos.”
2. “Um carro pertence, exclusivamente, a um único proprietário.”

Assim sendo, existem **três padrões de relacionamento possíveis** entre as duas entidades:

<table>
  <thead>
    <tr>
      <th><strong>Relacionamento</strong></th>
      <th><strong>Entidade</strong></th>
      <th><strong>Da esquerda</strong></th>
      <th><strong>Da direita</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Relacionamento 1-1</td>
      <td>Carro:identificador</td>
      <td>“Um carro tem somente uma placa de identificação.”</td>
      <td>“Uma placa de identificação pertence, exclusivamente, a um carro.”</td>
    </tr>
    <tr>
      <td>Relacionamento 1:n</td>
      <td>Proproetário:carro</td>
      <td>Potencialmente, o proprietário de um carro tem mais de um veículo.”</td>
      <td>“Um carro pertence exatamente a um único proprietário.”</td>
    </tr>
    <tr>
      <td>Relacionamento m:n</td>
      <td>Carro:estrada</td>
      <td>“Um carro anda em variadas estradas.”</td>
      <td>“Por uma estrada passam vários carros.”</td>
    </tr>
  </tbody>
</table>

### Implementar produto

Agora implementaremos a tabela de produtos. Para tanto, definimos um esquema, inserimos registros de dados e executamos algumas consultas simples, para fim de teste. Cada etapa será abordada individualmente, em detalhes.

#### Definir esquema

O principal comando SQL para definir tabelas de banco de dados é “CREATE TABLE”. Além de **criar uma tabela já nomeada e definir as propriedades das colunas**, ele estabelece os tipos de dados e, quando necessário, restrições de valores a serem armazenados:

```sql
DROP TABLE IF EXISTS Products;
CREATE TABLE Products ( product_id int, product_name text, stocked int, price int );
```

Nota Você pode usar a declaração “DROP TABLE IF EXISTS” antes de definir uma tabela. Ela removerá qualquer tabela existente, permitindo que o mesmo código SQL seja executado várias vezes, sem que erros sejam reportados.

#### Inserir registros de dados

Criamos alguns **registros de teste**. Usamos o comando SQL “INSERT INTO” e a função “VALUES” para preencher os campos:

```sql
INSERT INTO Products VALUES (10, 'ABC Product', 74, 1050);
INSERT INTO Products VALUES (20, 'KLM Product', 23, 750);
INSERT INTO Products VALUES (30, 'XYZ Product', 104, 350);
```

### Definir consultas

Para **verificar o status da tabela de produtos**, escrevemos um código de consulta simples. Usamos o comando “SELECT FROM” para gerar a tabela completa:

```sql
SELECT * FROM Products;
```

Ainda, escrevemos uma consulta um pouco mais complexa para calcular o **valor total dos produtos armazenados**:

```sql
SELECT product_name AS 'Name', (stocked * price) AS 'Value' FROM Products;
```

### Implementar outras tabelas

Agora criaremos **as demais tabelas necessárias**. Executaremos, para tanto, o mesmo processo da tabela de produtos. Primeiramente geraremos a tabela de clientes:

```sql
DROP TABLE IF EXISTS Customers;
CREATE TABLE Customers ( customer_id int, customer_name text, contact text );
```

Vamos inserir registros de dados para dois clientes fictícios:

```sql
INSERT INTO Customers VALUES (100, 'EDC Customer', 'ED@example.com');
INSERT INTO Customers VALUES (200, 'WVU Customer', 'WV@example.com');
```

Para verificação, geraremos uma tabela de clientes:

```sql
SELECT * FROM Customers;
```

Em seguida criaremos a tabela de pedidos:

```sql
DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders ( order_id int, customer_id int, order_date text );
```

**Inserimos três pedidos** fictícios. Observe que atribuímos como primeiro valor de registros um ID com uma chave primária. Em contrapartida, o segundo valor (com uma chave estrangeira) corresponde a IDs de clientes já existentes. Além disso, armazenamos a data de cada pedido.

```sql
INSERT INTO Orders VALUES (1000, 100, '2022-05-03');
INSERT INTO Orders VALUES (1001, 100, '2022-05-04');
INSERT INTO Orders VALUES (1002, 200, '2022-05-08')
```

Para verificação, emitiremos uma encomenda:

```sql
SELECT * FROM Orders;
```

Por fim, precisamos de uma tabela para organizar os **produtos contidos em um pedido e seu respectivo número**. Este se trata de um relacionamento m:n, porque um pedido pode conter vários produtos, assim como um produto pode estar presente em vários pedidos. Definimos uma tabela que contém IDs de pedidos e produtos como chaves estrangeiras:

```sql
DROP TABLE IF EXISTS OrderItems;
CREATE TABLE OrderItems ( orderitem_id int, order_id int, product_id int, count int );
```

Inserimos alguns produtos encomendados. Selecionamos IDs de pedidos e produtos, de modo que estejam presentes um pedido com dois produtos e um pedido com um único produto:

```sql
INSERT INTO OrderItems VALUES (10001, 1000, 10, 3);
INSERT INTO OrderItems VALUES (10002, 1000, 20, 2);
INSERT INTO OrderItems VALUES (10003, 1002, 30, 12);
```

Para a verificação, fornecemos os produtos solicitados:

```sql
SELECT * FROM OrderItems;
```

### Escrever consultas complexas

Se tiver executado todos os trechos de código apresentados por nosso tutorial de como aprender SQL, você já será capaz de entender a estrutura do banco de dados de teste. Assim sendo, é hora de seguir para consultas mais complexas, que demonstram, na prática, o poder do SQL.

Vamos escrever, agora, uma **consulta que combina dados distribuídos entre várias tabelas**. Para unir dados presentes na tabela de clientes e na tabela de pedidos, usaremos o comando “[SQL JOIN](https://www.ionos.com/digitalguide/hosting/technical-matters/sql-join/ "SQL Join")”. Ao fazermos uso da condição “JOIN”, atribuímos nomes a algumas colunas e definimos o ID do cliente correspondente. Veja que usamos identificadores qualificados para diferenciar as colunas de cada tabela:

```sql
SELECT customers.customer_name as 'Customer', customers.customer_id, orders.order_id, orders.order_date AS 'Date' FROM Customers JOIN Orders ON Orders.customer_id = Customers.customer_id ORDER BY Customers.customer_id;
```

Finalmente, usamos mais um [comando “JOIN”](https://www.ionos.com/pt-br/digitalguide/servidor/configuracao/sql-join/), desta vez para calcular o **custo total dos produtos encomendados**:

```sql
SELECT OrderItems.order_id, OrderItems.orderitem_id AS 'Order Item', Products.product_name AS 'Product', Products.price AS 'Unit Price', OrderItems.count AS 'Count', (OrderItems.count * Products.price) AS 'Total' FROM OrderItems JOIN Products ON OrderItems.product_id = Products.product_id;
```

Dica Se você quer aprender SQL mais detalhadamente, acesse o artigo [“O que é SQL”](https://www.ionos.com/pt-br/digitalguide/servidor/configuracao/aprender-sql-com-exemplos/). Nosso Digital Guide também pode ajudar com outras questões relativas à linguagem de banco de dados SQL:

- [Aprender MySQL de forma fácil](https://www.ionos.com/digitalguide/server/know-how/learn-mysql-in-simple-steps/ "Aprender MySQL de forma fácil")
- [MariaDB vs. MySQL](https://www.ionos.com/pt-br/digitalguide/hospedagem/tecnologia-de-hospedagem/mariadb-vs-mysql/)
- [Instalar e usar MySQL/MariaDB](https://www.ionos.com/pt-br/digitalguide/hospedagem/tecnologia-de-hospedagem/instalar-mariadb-mysql/ "Instalar MySQL Maria DB")
- [Conectar MySQL/MariaDB ao Linux Cloud Server](https://www.ionos.com/digitalguide/server/know-how/connect-to-a-mysql-mariadb-database-with-php-on-a-linux-cloud-server/ "Conectar banco de dados MySQL MariaDB ao servidor em nuvem do Linux usando PHP")
- [Corrigir erro “Too many connections” no MySQL/MariaDB](https://www.ionos.com/digitalguide/websites/web-development/solve-mysqlmariadb-too-many-connections-error/)
- [Redefinir senha root do MySQL/MariaDB](https://www.ionos.com/digitalguide/hosting/technical-matters/reset-mysql-mariadb-root-password/ "Redefinir senha root MySQL/MariaDB")


This is a markdown version of: [https://www.ionos.com/pt-br/digitalguide/servidor/configuracao/aprender-sql-com-exemplos/](https://www.ionos.com/pt-br/digitalguide/servidor/configuracao/aprender-sql-com-exemplos/) for AI/LLM consumption.