# Aprender a usar SQL: introdução com exemplos

A sintaxe da linguagem de programação SQL baseia-se na **álgebra relacional** e, por isso, distingue-se de outras linguagens de programação. Para aprender a utilizar o SQL, é necessário ter conhecimentos sobre a sintaxe da linguagem, e com exemplos ilustrativos torna-se mais fácil.

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

Em geral, a sintaxe é a\*\*«notação»\*\*de uma linguagem de programação. A sintaxe determina que tipos de estruturas básicas de código existem e como estas se podem interligar. Compreender a sintaxe é um requisito fundamental para se poder ler e escrever código na respetiva linguagem de programação.

As estruturas sintáticas mais importantes do SQL são as **instruções SQL com as respetivas cláusulas que estas podem conter**. Embora tecnicamente não seja totalmente correto, ambas são geralmente designadas por «comandos SQL». Além disso, existem outras construções sintáticas que apresentamos para maior clareza:

<table>
  <thead>
    <tr>
      <th><strong>Termo</strong></th>
      <th><strong>Equivalente em inglês</strong></th>
      <th><strong>Explicação</strong></th>
      <th><strong>Exemplo</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sentença</td>
      <td>Statement</td>
      <td>Ordena ao DBMS que execute uma ação; termina com um ponto e vírgula</td>
      <td>`CREATE TABLE People;`</td>
    </tr>
    <tr>
      <td>Cláusula</td>
      <td>Cláusula</td>
      <td>Modifica uma instrução; só pode ser utilizada dentro de uma instrução</td>
      <td>`WHERE, HAVING`</td>
    </tr>
    <tr>
      <td>Expressão</td>
      <td>Expressão</td>
      <td>Quando avaliada, retorna um determinado valor</td>
      <td>`6 * 7`</td>
    </tr>
    <tr>
      <td>Identificador</td>
      <td>Identificador</td>
      <td>Nome de um objeto, uma variável ou um procedimento da base de dados; pode ser qualificado ou não qualificado</td>
      <td>`dbname.tablename / tablename`</td>
    </tr>
    <tr>
      <td>Predicado</td>
      <td>Predicado</td>
      <td>Expressão que é avaliada como `TRUE, FALSE` ou `UNKNOWN`</td>
      <td>`Age < 42`</td>
    </tr>
    <tr>
      <td>Consulta</td>
      <td>Query</td>
      <td>Instrução especial; retorna o conjunto de resultados dos registos</td>
      <td>`SELECT Name FROM People WHERE Age < 42;`</td>
    </tr>
    <tr>
      <td>Função</td>
      <td>Função</td>
      <td>Processa um ou mais valores; normalmente cria um novo valor</td>
      <td>`UPPER('text') -- Devuelve 'TEXT'`</td>
    </tr>
    <tr>
      <td>Comentário</td>
      <td>Comentário</td>
      <td>É utilizada para inserir comentários no código SQL; o RDBMS ignora-a</td>
      <td>`-- Comentario hasta el final de la línea / /*Si procede, comentario de varias líneas*/`</td>
    </tr>
  </tbody>
</table>

Nota Os comandos SQL, como SELECT e CREATE TABLE, costumam ser escritos em maiúsculas. No entanto, o SQL não distingue entre maiúsculas e minúsculas. Trata-se apenas de uma convenção muito comum.

## Como é executado o código SQL?

O código SQL existe como código-fonte num ficheiro de texto e só pode ser executado num ambiente de execução adequado. Um **interpretador de SQL** lê o código-fonte e converte-o em ações de um RDBMS. Existem duas abordagens principais a este respeito:

1. **Executar código SQL numa sessão interativa**

Com esta abordagem, o código SQL é introduzido ou copiado e colado diretamente numa janela de texto. Em seguida, o código SQL é executado e o resultado é apresentado. Nessa altura, o utilizador tem a oportunidade de alterar o código e executá-lo novamente. A rápida sequência de manipulação do código e visualização dos resultados torna esta abordagem a mais adequada para aprender e criar consultas complexas.

2. Executar o código SQL como script

Com esta abordagem, todo um ficheiro com código SQL é executado linha a linha. O feedback só é transmitido ao utilizador no final da execução. Esta abordagem é a mais adequada para automatizar processos e importar cópias de segurança de bases de dados MySQL com o 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 comandos (CLI)</td>
      <td>Interface baseada em texto; o código SQL é introduzido e executado, o resultado é apresentado na forma de texto</td>
      <td>mysql, psql, mysqlsh</td>
    </tr>
    <tr>
      <td>Interface gráfica do utilizador (GUI)</td>
      <td>O código SQL é introduzido numa janela de texto e/ou gerado em resposta à interação do utilizador; o código SQL é executado, o resultado é apresentado sob a forma de tabelas</td>
      <td>phpMyAdmin, MySQL Workbench, HeidiSQL</td>
    </tr>
    <tr>
      <td>Interface de programação de aplicações (API)</td>
      <td>Permite a comunicação direta com um RDBMS; o código SQL é introduzido como string no código da respetiva linguagem de programação e é executado; os resultados estão disponíveis como estruturas de dados para utilização posterior</td>
      <td>PHP Data Objects (PDO), Connector/J (Java), Connector/Python, C API</td>
    </tr>
  </tbody>
</table>

## Utilizar o SQL como exemplo para configurar a gestão de produtos

A forma mais fácil de aprender uma linguagem de programação é escrever e executar o código por conta própria. Para isso, devemos primeiro criar uma **pequena base de dados para podermos executar consultas nela**. Depois, utilizaremos o [interpretador SQL online](https://sql.js.org/examples/GUI/ "sql.js demo: Online SQL interpreter") do site *sql.js*. Aceda ao link do site e substitua o código SQL já introduzido pelo código dos nossos exemplos. Execute o código fragmento a fragmento para obter os resultados apresentados.

### Procedimento básico para configurar uma base de dados SQL

A título de exemplo, vamos **criar um sistema de gestão de produtos** comerciais, tal como seria utilizado numa loja física ou online. Para tal, vamos definir os requisitos em linhas gerais:

- Temos sempre em stock uma determinada quantidade de uma série de produtos.
- A nossa carteira é composta por vários clientes.
- Um cliente faz uma encomenda que pode conter vários produtos.
- Registamos a data e a pessoa que faz cada pedido, além dos produtos e da quantidade pedida de cada um.

Primeiro, transformamos esses requisitos numa **descrição abstrata e, em seguida, em código SQL**. Seguimos o seguinte roteiro:

1. Criar o modelo
2. Definir o esquema
3. Introduzir os registos de dados
4. Definir as consultas

### Criar um modelo de entidades e relações

O primeiro passo é realizado em papel ou com ferramentas específicas de modelagem. Recolhemos informações sobre o **sistema que vamos modelar e extraímos as suas entidades e relações**. Isto é normalmente feito através de um diagrama Entidade-Relação (ER).

Que entidades existem e como se relacionam? As **entidades são categorias de objetos**. No nosso exemplo de gestão de produtos, existem as entidades produto, cliente e encomenda. Cada entidade requer uma tabela. Devido às características específicas do modelo relacional, podem ser adicionadas outras tabelas para modelar as relações. Para compreender bem tudo isto e aplicá-lo corretamente, é necessária experiência.

Uma questão fundamental é a forma como as entidades se relacionam entre si. Para tal, é necessário ter em conta os **dois sentidos de uma relação** e distinguir entre **singular e plural**. Tomando como exemplo a relação proprietário-carro:

1. «Um proprietário pode ser dono de vários carros»
2. «Um carro pertence apenas a um proprietário»

Surgem **três possíveis modelos de relação** entre duas entidades:

<table>
  <thead>
    <tr>
      <th><strong>Lista</strong></th>
      <th><strong>Entidades</strong></th>
      <th><strong>Da esquerda</strong></th>
      <th><strong>A partir da direita</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Relação 1:1</td>
      <td>Carro:Matrícula</td>
      <td>„Um carro tem apenas uma matrícula“</td>
      <td>„Uma matrícula pertence apenas a um carro“</td>
    </tr>
    <tr>
      <td>Relação 1:n</td>
      <td>Proprietário:Carro</td>
      <td>„Um proprietário é potencialmente dono de vários carros“</td>
      <td>„Um carro pertence apenas a um proprietário“</td>
    </tr>
    <tr>
      <td>Relação m:n</td>
      <td>Carro: Estrada</td>
      <td>«Um carro circula em várias estradas»</td>
      <td>„Numa estrada circulam vários carros“</td>
    </tr>
  </tbody>
</table>

### Implementar produtos

O primeiro passo é implementar a tabela de produtos. Para tal, é necessário definir um esquema, introduzir os registos de dados e executar algumas consultas simples a título de teste. Vamos analisar em pormenor cada um dos passos.

#### Definir o esquema

O principal comando SQL utilizado para definir as tabelas da base de dados é o CREATE TABLE. Este comando **cria uma tabela, atribui-lhe um nome e define as propriedades das colunas**. Ao mesmo tempo, são definidos os tipos de dados e, se necessário, as restrições dos valores a armazenar:

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

Nota Utilize uma instrução DROP TABLE IF EXISTS antes de definir a tabela, para eliminar qualquer tabela que já existisse e permitir que o mesmo código SQL possa ser executado várias vezes sem gerar mensagens de erro.

#### Introduzir registos de dados

Crie vários **registos de teste** e, em seguida, utilize tanto o comando SQL INSERT INTO como 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 as consultas

Elabore uma consulta simples para **verificar o estado da tabela de produtos**. Utilize o comando SELECT FROM e apresente a tabela completa:

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

Crie também uma consulta um pouco mais complexa que calcule o **valor total dos produtos armazenados**:

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

### Implementar as restantes tabelas

Na secção seguinte, terá de criar **as restantes tabelas necessárias**. Proceda da mesma forma que fez com a tabela de produtos. Primeiro, é necessário criar a tabela de clientes:

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

Guarda os registos de dados dos clientes. Neste exemplo, guardamos os de dois clientes:

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

Para verificar isso, gere a tabela de clientes:

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

O próximo passo é criar a tabela de encomendas:

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

**Aqui, introduzimos três pedidos a título de exemplo**. Repara que atribuímos um identificador de chave primária como primeiro valor dos registos. No entanto, o segundo valor é o identificador de clientes já existentes, a servir de chaves externas. Além disso, também armazenamos a data do 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');
```

Envie os pedidos para verificação:

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

Por fim, é necessária uma tabela para os **produtos incluídos num pedido e os respetivos números**. Trata-se de uma relação m:n, uma vez que um pedido pode conter vários produtos e um produto pode aparecer em vários pedidos. Defina uma tabela que contenha os identificadores dos pedidos e dos produtos como chaves externas:

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

Introduza alguns produtos dos pedidos. Selecione os identificadores (ID) dos pedidos e dos produtos, de modo a que haja um pedido com dois produtos e outro com apenas um 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);
```

Imprima os produtos encomendados para confirmação:

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

### Realizar consultas complexas

Se executou todos os trechos de código apresentados até agora, deverá ser capaz de compreender a estrutura da nossa base de dados de teste. Passemos agora a consultas mais complexas que demonstram o potencial da linguagem SQL. Primeiro, faremos uma **consulta que agrupe dados espalhados por várias tabelas**. Utilizaremos um comando SQL JOIN para unir os dados da tabela de clientes com os da tabela de pedidos. Ao fazê-lo, nomeamos algumas das colunas e estabelecemos que o identificador do cliente coincida como condição JOIN. Tenha em conta que utilizamos identificadores qualificados para distinguir as colunas das duas tabelas:

```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;
```

Por último, mas não menos importante, utilizamos outro comando JOIN 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 deseja saber [o que é o SQL](https://www.ionos.com/pt-pt/digitalguide/servidores/configuracao/introducao-ao-sql-com-exemplos/), precisa de ajuda com problemas específicos relacionados com esta linguagem de bases de dados ou simplesmente quer aprofundar os seus conhecimentos, recomendamos os seguintes artigos:

- Guia para aprender a utilizar o MySQL
- MariaDB vs. MySQL
- Instalar o MySQL-MariaDB
- Resolver o erro MySQL/MariaDB “Too many connections”


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