A sintaxe da linguagem de pro­gra­ma­ção SQL baseia-se na álgebra re­la­ci­o­nal e, por isso, distingue-se de outras lin­gua­gens de pro­gra­ma­ção. Para aprender a utilizar o SQL, é ne­ces­sá­rio ter co­nhe­ci­men­tos sobre a sintaxe da linguagem, e com exemplos ilus­tra­ti­vos torna-se mais fácil.

Noções básicas da sintaxe SQL

Em geral, a sintaxe é a**«notação»**de uma linguagem de pro­gra­ma­ção. A sintaxe determina que tipos de es­tru­tu­ras básicas de código existem e como estas se podem in­ter­li­gar. Com­pre­en­der a sintaxe é um requisito fun­da­men­tal para se poder ler e escrever código na respetiva linguagem de pro­gra­ma­ção.

As es­tru­tu­ras sin­tá­ti­cas mais im­por­tan­tes do SQL são as ins­tru­ções SQL com as res­pe­ti­vas cláusulas que estas podem conter. Embora tec­ni­ca­mente não seja to­tal­mente correto, ambas são ge­ral­mente de­sig­na­das por «comandos SQL». Além disso, existem outras cons­tru­ções sin­tá­ti­cas que apre­sen­ta­mos para maior clareza:

Termo Equi­va­lente em inglês Ex­pli­ca­çã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 de­ter­mi­nado valor 6 * 7
Iden­ti­fi­ca­dor Iden­ti­fi­ca­dor Nome de um objeto, uma variável ou um pro­ce­di­mento da base de dados; pode ser qua­li­fi­cado ou não qua­li­fi­cado 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 re­sul­ta­dos dos registos SELECT Name FROM People WHERE Age < 42;
Função Função Processa um ou mais valores; nor­mal­mente cria um novo valor UPPER('text') -- Devuelve 'TEXT'
Co­men­tá­rio Co­men­tá­rio É utilizada para inserir co­men­tá­rios no código SQL; o RDBMS ignora-a -- Comentario hasta el final de la línea / /*Si procede, comentario de varias líneas*/
Nota

Os comandos SQL, como SELECT e CREATE TABLE, costumam ser escritos em maiús­cu­las. No entanto, o SQL não distingue entre maiús­cu­las e mi­nús­cu­las. 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 in­ter­pre­ta­dor de SQL lê o código-fonte e converte-o em ações de um RDBMS. Existem duas abor­da­gens prin­ci­pais a este respeito:

  1. Executar código SQL numa sessão in­te­ra­tiva

Com esta abordagem, o código SQL é in­tro­du­zido ou copiado e colado di­re­ta­mente numa janela de texto. Em seguida, o código SQL é executado e o resultado é apre­sen­tado. Nessa altura, o uti­li­za­dor tem a opor­tu­ni­dade de alterar o código e executá-lo novamente. A rápida sequência de ma­ni­pu­la­ção do código e vi­su­a­li­za­ção dos re­sul­ta­dos torna esta abordagem a mais adequada para aprender e criar consultas complexas.

  1. Executar o código SQL como script

Com esta abordagem, todo um ficheiro com código SQL é executado linha a linha. O feedback só é trans­mi­tido ao uti­li­za­dor no final da execução. Esta abordagem é a mais adequada para au­to­ma­ti­zar 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 é in­tro­du­zido e executado, o resultado é apre­sen­tado na forma de texto mysql, psql, mysqlsh
Interface gráfica do uti­li­za­dor (GUI) O código SQL é in­tro­du­zido numa janela de texto e/ou gerado em resposta à interação do uti­li­za­dor; o código SQL é executado, o resultado é apre­sen­tado sob a forma de tabelas phpMyAd­min, MySQL Workbench, HeidiSQL
Interface de pro­gra­ma­ção de apli­ca­ções (API) Permite a co­mu­ni­ca­ção direta com um RDBMS; o código SQL é in­tro­du­zido como string no código da respetiva linguagem de pro­gra­ma­ção e é executado; os re­sul­ta­dos estão dis­po­ní­veis como es­tru­tu­ras de dados para uti­li­za­ção posterior PHP Data Objects (PDO), Connector/J (Java), Connector/Python, C API

Utilizar o SQL como exemplo para con­fi­gu­rar a gestão de produtos

A forma mais fácil de aprender uma linguagem de pro­gra­ma­çã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, uti­li­za­re­mos o in­ter­pre­ta­dor SQL online do site sql.js. Aceda ao link do site e substitua o código SQL já in­tro­du­zido pelo código dos nossos exemplos. Execute o código fragmento a fragmento para obter os re­sul­ta­dos apre­sen­ta­dos.

Pro­ce­di­mento básico para con­fi­gu­rar uma base de dados SQL

A título de exemplo, vamos criar um sistema de gestão de produtos co­mer­ci­ais, tal como seria utilizado numa loja física ou online. Para tal, vamos definir os re­qui­si­tos em linhas gerais:

  • Temos sempre em stock uma de­ter­mi­nada quan­ti­dade 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.
  • Re­gis­ta­mos a data e a pessoa que faz cada pedido, além dos produtos e da quan­ti­dade pedida de cada um.

Primeiro, trans­for­ma­mos esses re­qui­si­tos numa descrição abstrata e, em seguida, em código SQL. Seguimos o seguinte roteiro:

  1. Criar o modelo
  2. Definir o esquema
  3. In­tro­du­zir os registos de dados
  4. Definir as consultas

Criar um modelo de entidades e relações

O primeiro passo é realizado em papel ou com fer­ra­men­tas es­pe­cí­fi­cas de modelagem. Re­co­lhe­mos in­for­ma­ções sobre o sistema que vamos modelar e extraímos as suas entidades e relações. Isto é nor­mal­mente feito através de um diagrama Entidade-Relação (ER).

Que entidades existem e como se re­la­ci­o­nam? As entidades são ca­te­go­rias de objetos. No nosso exemplo de gestão de produtos, existem as entidades produto, cliente e encomenda. Cada entidade requer uma tabela. Devido às ca­rac­te­rís­ti­cas es­pe­cí­fi­cas do modelo re­la­ci­o­nal, podem ser adi­ci­o­na­das outras tabelas para modelar as relações. Para com­pre­en­der bem tudo isto e aplicá-lo cor­re­ta­mente, é ne­ces­sá­ria ex­pe­ri­ên­cia.

Uma questão fun­da­men­tal é a forma como as entidades se re­la­ci­o­nam entre si. Para tal, é ne­ces­sá­rio ter em conta os dois sentidos de uma relação e dis­tin­guir entre singular e plural. Tomando como exemplo a relação pro­pri­e­tá­rio-carro:

  1. «Um pro­pri­e­tá­rio pode ser dono de vários carros»
  2. «Um carro pertence apenas a um pro­pri­e­tá­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 Pro­pri­e­tá­rio:Carro „Um pro­pri­e­tá­rio é po­ten­ci­al­mente dono de vários carros“ „Um carro pertence apenas a um pro­pri­e­tá­rio“
Relação m:n Carro: Estrada «Um carro circula em várias estradas» „Numa estrada circulam vários carros“

Im­ple­men­tar produtos

O primeiro passo é im­ple­men­tar a tabela de produtos. Para tal, é ne­ces­sá­rio definir um esquema, in­tro­du­zir 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 pro­pri­e­da­des das colunas. Ao mesmo tempo, são definidos os tipos de dados e, se ne­ces­sá­rio, as res­tri­ções dos valores a armazenar:

DROP TABLE IF EXISTS Products;
CREATE TABLE Products ( product_id int, product_name text, stocked int, price int );
sql
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.

In­tro­du­zir 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);
sql

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:

SELECT * FROM Products;
sql

Crie também uma consulta um pouco mais complexa que calcule o valor total dos produtos ar­ma­ze­na­dos:

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

Im­ple­men­tar as restantes tabelas

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

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

Guarda 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');
sql

Para verificar isso, gere a tabela de clientes:

SELECT * FROM Customers;
sql

O próximo passo é criar a tabela de en­co­men­das:

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

Aqui, in­tro­du­zi­mos três pedidos a título de exemplo. Repara que atri­buí­mos um iden­ti­fi­ca­dor de chave primária como primeiro valor dos registos. No entanto, o segundo valor é o iden­ti­fi­ca­dor de clientes já exis­ten­tes, a servir de chaves externas. Além disso, também ar­ma­ze­na­mos 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');
sql

Envie os pedidos para ve­ri­fi­ca­ção:

SELECT * FROM Orders;
sql

Por fim, é ne­ces­sá­ria uma tabela para os produtos incluídos num pedido e os res­pe­ti­vos 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 iden­ti­fi­ca­do­res 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 );
sql

Introduza alguns produtos dos pedidos. Selecione os iden­ti­fi­ca­do­res (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);
sql

Imprima os produtos en­co­men­da­dos para con­fir­ma­ção:

SELECT * FROM OrderItems;
sql

Realizar consultas complexas

Se executou todos os trechos de código apre­sen­ta­dos até agora, deverá ser capaz de com­pre­en­der a estrutura da nossa base de dados de teste. Passemos agora a consultas mais complexas que de­mons­tram o potencial da linguagem SQL. Primeiro, faremos uma consulta que agrupe dados es­pa­lha­dos por várias tabelas. Uti­li­za­re­mos 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 es­ta­be­le­ce­mos que o iden­ti­fi­ca­dor do cliente coincida como condição JOIN. Tenha em conta que uti­li­za­mos iden­ti­fi­ca­do­res qua­li­fi­ca­dos para dis­tin­guir 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;
sql

Por último, mas não menos im­por­tante, uti­li­za­mos outro comando JOIN para calcular o custo total dos produtos en­co­men­da­dos:

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
Ir para o menu principal