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:
| Termo | Equivalente em inglês | Explicação | Exemplo |
|---|---|---|---|
| Sentença | Statement | Ordena ao DBMS que execute uma ação; termina com um ponto e vírgula | CREATE TABLE People;
|
| Cláusula | Cláusula | Modifica uma instrução; só pode ser utilizada dentro de uma instrução | WHERE, HAVING
|
| Expressão | Expressão | Quando avaliada, retorna um determinado valor | 6 * 7
|
| Identificador | Identificador | Nome de um objeto, uma variável ou um procedimento da base de dados; pode ser qualificado ou não qualificado | dbname.tablename / tablename
|
| Predicado | Predicado | Expressão que é avaliada como TRUE, FALSE ou UNKNOWN
|
Age < 42
|
| Consulta | Query | Instrução especial; retorna o conjunto de resultados dos registos | SELECT Name FROM People WHERE Age < 42;
|
| Função | Função | Processa um ou mais valores; normalmente cria um novo valor | UPPER('text') -- Devuelve 'TEXT'
|
| Comentário | Comentário | É utilizada para inserir comentários no código SQL; o RDBMS ignora-a | -- Comentario hasta el final de la línea / /*Si procede, comentario de varias líneas*/
|
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:
- 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.
- 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.
| Interface | Descrição | Exemplos |
|---|---|---|
| Interface de linha de comandos (CLI) | Interface baseada em texto; o código SQL é introduzido e executado, o resultado é apresentado na forma de texto | mysql, psql, mysqlsh |
| Interface gráfica do utilizador (GUI) | 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 | phpMyAdmin, MySQL Workbench, HeidiSQL |
| Interface de programação de aplicações (API) | 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 | PHP Data Objects (PDO), Connector/J (Java), Connector/Python, C API |
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 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:
- Criar o modelo
- Definir o esquema
- Introduzir os registos de dados
- 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:
- «Um proprietário pode ser dono de vários carros»
- «Um carro pertence apenas a um proprietário»
Surgem três possíveis modelos de relação entre duas entidades:
| Lista | Entidades | Da esquerda | A partir da direita |
|---|---|---|---|
| Relação 1:1 | Carro:Matrícula | „Um carro tem apenas uma matrícula“ | „Uma matrícula pertence apenas a um carro“ |
| Relação 1:n | Proprietário:Carro | „Um proprietário é potencialmente dono de vários carros“ | „Um carro pertence apenas a um proprietário“ |
| Relação m:n | Carro: Estrada | «Um carro circula em várias estradas» | „Numa estrada circulam vários carros“ |
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:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products ( product_id int, product_name text, stocked int, price int );sqlUtilize 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:
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);sqlDefinir as consultas
Elabore uma consulta simples para verificar o estado da tabela de produtos. Utilize o comando SELECT FROM e apresente a tabela completa:
SELECT * FROM Products;sqlCrie também uma consulta um pouco mais complexa que calcule o valor total dos produtos armazenados:
SELECT product_name AS 'Name', (stocked * price) AS 'Value' FROM Products;sqlImplementar 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:
DROP TABLE IF EXISTS Customers;
CREATE TABLE Customers ( customer_id int, customer_name text, contact text );sqlGuarda os registos de dados dos clientes. Neste exemplo, guardamos os de dois clientes:
INSERT INTO Customers VALUES (100, 'EDC Customer', 'ED@example.com');
INSERT INTO Customers VALUES (200, 'WVU Customer', 'WV@example.com');sqlPara verificar isso, gere a tabela de clientes:
SELECT * FROM Customers;sqlO próximo passo é criar a tabela de encomendas:
DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders ( order_id int, customer_id int, order_date text );sqlAqui, 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:
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');sqlEnvie os pedidos para verificação:
SELECT * FROM Orders;sqlPor 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:
DROP TABLE IF EXISTS OrderItems;
CREATE TABLE OrderItems ( orderitem_id int, order_id int, product_id int, count int );sqlIntroduza 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:
INSERT INTO OrderItems VALUES (10001, 1000, 10, 3);
INSERT INTO OrderItems VALUES (10002, 1000, 20, 2);
INSERT INTO OrderItems VALUES (10003, 1002, 30, 12);sqlImprima os produtos encomendados para confirmação:
SELECT * FROM OrderItems;sqlRealizar 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:
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;sqlPor último, mas não menos importante, utilizamos outro comando JOIN para calcular o custo total dos produtos encomendados:
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;sql