<Direto ao Ponto 55> A Linguagem SQL
- #Informática Básica
Artigos desta série: ( < ) Anterior | Índice | Seguinte ( > )
Olá, dev!
Este é mais um artigo da série DIRETO AO PONTO, que eu estou escrevendo para a DIO. Hoje eu vou falar da linguagem SQL, oferecida pelos SGBDs para gerenciamento e manipulação de bancos de dados.
Sumário
1. Introdução
2. A linguagem SQL
3. Fazendo consultas
4. Juntando tabelas
5. Considerações finais
6. Referências
1 – Introdução
Eu criei a série de artigos DIRETO AO PONTO com o objetivo de apresentar, de forma simples e direta, conhecimentos básicos da programação e de computação, principalmente, para os iniciantes.
Aqui, são tratados de temas como lógica de programação, linguagens, hardware dos computadores, história da computação e assuntos relacionados à plataforma da DIO, como a escrita de artigos e os desafios de código.
Neste artigo, eu vou falar sobre a linguagem SQL, oferecida pelos SGBDs para gerenciamento e manipulação de bancos de dados. Este artigo complementa o anterior, que tratou dos bancos de dados e dos SGBDs.
Relembrando, um banco de dados é uma coleção de dados organizados que ficam armazenados em um SGBD. Já um SGBD é um sistema que permite o armazenamento de vários bancos de dados e oferece várias funções e comandos para criar um banco de dados e manipular os dados armazenados.
2 – A linguagem SQL
A linguagem SQL (“Structured Query Language”), ou linguagem de consulta estruturada, é a linguagem padrão para gerenciar e manipular bancos de dados. Ela foi desenvolvida originalmente para bancos de dados relacionais, mas seu uso não é exclusivo desse tipo de banco. Atualmente, outros tipos de SGBDs também oferecem suporte a ela ou a variações dela, de maneiras diferentes, como os bancos de dados NoSQL
A linguagem SQL realiza várias ações em um banco de dados, e os comandos são divididos em diferentes categorias, conforme a sua finalidade. Os grupos mais comuns são:
· DDL ("Data Definition Language");
· DML ("Data Manipulation Language");
· DCL ("Data Control Language");
· DCL ("Data Control Language");
I - DDL (“Data Definition Language”) — Linguagem de Definição de Dados, usada para definir e gerenciar a estrutura do banco de dados, como tabelas e índices. Os principais comandos são:
CREATE: Cria uma nova tabela, banco de dados, índice, ou outros objetos.
Por exemplo, o comando abaixo cria uma nova tabela (clientes), com 3 campos (id, nome e idade), indicando os tipos dos dados (2 inteiros e um string) e o campo id como chave primária.
CREATE TABLE clientes (
id INT PRIMARY KEY,
nome VARCHAR(50),
idade INT
);
ALTER: Modifica a estrutura de uma tabela existente, podendo adicionar, modificar ou remover colunas. Por exemplo, o comando abaixo adiciona uma coluna (endereco) à tabela clientes.
ALTER TABLE clientes ADD endereco VARCHAR(255);
DROP: Remove uma tabela, banco de dados, índice ou outros objetos. No exemplo abaixo, o comando remove (apaga, deleta) a tabela clientes.
DROP TABLE clientes;
TRUNCATE: Remove todos os registros de uma tabela, mas mantém sua estrutura. No exemplo a seguir, ele apaga todos os dados da tabela clientes, mas ela continua a existir no banco, vazia.
TRUNCATE TABLE clientes;
II - DML (“Data Manipulation Language”) — Linguagem de Manipulação de Dados. Esses comandos são usados para manipular e consultar os dados dentro das tabelas.
SELECT: Consulta os dados do banco de dados. No exemplo abaixo, os dados das colunas nome e idade, armazenados na tabela clientes, são listados, apenas os registros em que a idade seja maior do que 30 anos.
SELECT nome, idade FROM clientes WHERE idade > 30;
INSERT: Insere novos registros em uma tabela. No exemplo abaixo, na tabela clientes, é inserido um novo registro com os dados “Maria” e “28” anos.
INSERT INTO clientes (nome, idade) VALUES ('Maria', 28);
UPDATE: Atualiza registros existentes em uma tabela. No exemplo abaixo, na tabela clientes, a idade de Maria é alterada de 28 para 29 anos.
UPDATE clientes SET idade = 29 WHERE nome = 'Maria';
DELETE: Remove registros existentes de uma tabela. No exemplo abaixo, são removidos todos os registros da tabela clientes, para os quais o valor da idade é menor que 18 anos.
DELETE FROM clientes WHERE idade < 18;
III - DCL (“Data Control Language”)— Linguagem de Controle de Dados. Comandos usados para definir permissões de acesso aos dados no banco de dados.
GRANT: Concede permissões a usuários ou funções. No exemplo abaixo, é dada a permissão para o usuário “antonio” usar os comandos SELECT e INSERT na tabela “clientes”.
GRANT SELECT, INSERT ON clientes TO antonio;
REVOKE: Remove permissões previamente concedidas. No exemplo abaixo, é retirada a permissão para o usuário “antonio” usar o comando INSERT na tabela clientes.
REVOKE INSERT ON clientes FROM antonio;
IV - TCL (“Transaction Control Language”) — Linguagem de Controle de Transações . comandos usados para gerenciar transações no banco de dados, garantindo que as operações sejam executadas corretamente.
COMMIT: Salva todas as alterações feitas na transação atual.
ROLLBACK: Reverte todas as alterações feitas na transação atual. Exemplo.
SAVEPOINT: Cria um ponto de recuperação dentro de uma transação para que se possa fazer um rollback parcial. No exemplo, é criado um ponto de recuperação chamado “ponto1”.
SAVEPOINT ponto1;
3 – Fazendo consultas
Este é um dos principais comandos da linguagem SQL, pois ele permite consultar os dados armazenados em um banco de dados de um SGBD, possuindo várias subcomandos (?) e funções para detalhar a consulta desejada.
A sintaxe básica do comando SELECT é mostrada abaixo, juntamente com uma figura explicativa das ações realizadas sobre uma tabela genérica.
SELECT (colunas)
FROM (tabelas)
WHERE (condições atendidas pelos registros)
A palavra-chave SELECT seleciona as colunas da tabela (seta azul) que serão mostradas. Já FROM indica a tabela (ou tabelas) (em verde) consideradas na consulta. Por fim, WHERE estabelece as condições que os registros da tabela precisam obedecer (em laranja) para serem considerados para apresentação.
Como exemplo, considere a tabela “clientes” a seguir, que será usada como tabela base para todos os exemplos desta seção:
No comando abaixo, é consultada a tabela clientes (FROM), são considerados apenas os registros em que a idade for maior que 30 anos (WHERE) e mostradas apenas as colunas Nome e Cidade.
SELECT nome, cidade FROM clientes WHERE idade > 20;
O resultado é
| Nome | Cidade |
| Beatriz | João Pessoa |
| Carlos | João Pessoa |
Veja que o registro contendo a cliente Ana não foi mostrado no resultado porque ele não foi considerado na consulta, por ela não ter idade maior que 20 anos.
OBS: Note que, pela ordem de ocorrência das ações para a execução do comando, primeiro, as tabelas são definidas (FROM), depois, os registros que não satisfazem a condição (WHERE) são excluídos da consulta, por fim, as colunas para apresentação dos dados (SELECT) são escolhidas.
Assim, eu sempre achei que este comando deveria ser FROM-WHERE-SELECT, ao invés de SELECT-FROM-WHERE.
FROM (tabelas)
WHERE (condições atendidas pelos registros)
SELECT (colunas)
ORDER BY: Palavra-chave que ordena os resultados de uma consulta. Para ordenação descendente, usa-se o modificador DESC. Exemplo, usando a mesma tabela base:
SELECT nome, idade FROM clientes ORDER BY idade DESC;
A resposta é:
Nome | Idade |
Beatriz | 45 |
Carlos | 30 |
Ana | 20 |
DISTINCT: Remove valores duplicados nos resultados. Exemplo:
SELECT DISTINCT cidade FROM clientes;
A resposta é:
| Cidade |
| Campina Grande |
| João Pessoa |
GROUP BY: Agrupa registros que têm valores iguais em colunas especificadas, a partir de uma função de agregação.
Uma função de agregação retorna um valor calculado a partir do agrupamento de registros definido pelo termo GROUP BY. Por exemplo, a função COUNT() retorna a contagem (“count”) de registros (ou valores não nulos) obtidos na resposta à consulta.
Exemplo:
SELECT cidade, COUNT(*) FROM clientes GROUP BY cidade;
A resposta é:
| Cidade | Count(*) |
| Campina Grande | 1 |
| João Pessoa | 2 |
Ou seja, os registros que participam da consulta são agrupados por cidade, e foram encontrados 2 registros com a cidade de João pessoa e 1 com a cidade de Campina Grande, e esta contagem é feita pela função COUNT.
Outras funções de agregação que podem ser usadas com GROUP BY, sempre considerando apenas os registros considerados na consulta, que obedecem à condição do WHERE, são:
SUM(): Retorna a soma (“sum”) de uma coluna para os registros encontrados.
AVG(): Retorna a média (“average”) de uma coluna.
MIN(): Retorna o valor mínimo (“minimum”) de uma coluna.
MAX(): Retorna o valor máximo (“maximum”) de uma coluna.
OBS: O asterisco como parâmetro da função COUNT(*) significa que todos os registros retornados serão considerados na contagem. Outras funções de agregação especificam qual o campo (coluna) que vai ser considerado para o cálculo, por exemplo MAX(idade), AVG(notas), SUM(salários).
HAVING: desta palavra-chave filtra grupos de registros após o uso do “GROUP BY”. É como um comando WHERE específico para os registros que participam do GROUP BY. Exemplo:
SELECT cidade, COUNT(*)
FROM clientes
GROUP BY cidade
HAVING COUNT(*) > 1;
Ou seja, mostre a cidade e a quantidade de registros, da tabela clientes, que têm mais de um cliente na cidade.
A resposta é:
| Cidade | Count(*) |
| João Pessoa | 2 |
JOIN: Combina registros de duas ou mais tabelas com base em uma condição relacionada. Exemplo:
Considere uma segunda tabela deste banco de dados, “pedidos”, que tem os seguintes dados:
SELECT clientes.nome, pedidos.pedido_id
FROM clientes
JOIN pedidos ON clientes.cliente_id = pedidos.cliente_id;
Explicando: o comando mostra o nome dos clientes e o código do pedido, usando as tabelas clientes e pedidos, para os pedidos registrados. O comando chega ao nome dos clientes (que não estão na tabela pedidos) a partir do id do cliente em cada pedido. Ou seja, o JOIN junta os registros das duas tabelas a partir do mesmo valor do id do cliente.
A resposta é:
Nome | Pedido_id |
Carlos | 101 |
Carlos | 102 |
Ana | 103 |
4 – Juntando tabelas
Usa-se a palavra-chave JOIN para juntar (associar) tabelas de um banco de dados para consultar dados delas. Ele permite realizar consultas que tragam informações de várias tabelas ao mesmo tempo, com base em um relacionamento entre colunas dessas tabelas.
Por exemplo, uma tabela com os clientes de uma loja armazena os dados pessoais dos clientes, outra tabela com os produtos armazena dados sobre as características dos produtos comercializados, já uma terceira tabela pode armazenar os dados dos pedidos realizados pelos clientes, como data, preços, quantidades etc.
Associando estas tabelas, pode-se consultar quais clientes compraram determinados produtos, em que datas, e assim, obter informações importantes sobre os negócios feitos pela empresa.
Existem vários tipos diferentes de JOIN para algumas situações:
INNER JOIN: Retorna apenas as linhas que têm correspondências nas tabelas relacionadas;
LEFT JOIN (ou LEFT OUTER JOIN): Retorna todas as linhas da tabela à esquerda e as correspondências da tabela à direita. Se não houver correspondência, os valores da tabela à direita serão nulos;
RIGHT JOIN (ou RIGHT OUTER JOIN): Retorna todas as linhas da tabela à direita e as correspondências da tabela à esquerda. Se não houver correspondência, os valores da tabela à esquerda serão nulos;
FULL JOIN (ou FULL OUTER JOIN): Retorna todas as linhas quando há uma correspondência em uma das tabelas. Se não houver correspondência, as colunas sem correspondência terão valor nulo.
Por exemplo:
SELECT Clientes.Nome, Pedidos.Produto
FROM Clientes
INNER JOIN Pedidos ON Clientes.Cliente_id = Pedidos.Cliente_id;
Mas como funciona essa junção de tabelas? Vou tentar explicar como as tabelas do exemplo de JOIN da seção anterior foi implementado.
1. O comando realiza o produto cartesiano (juntando cada registro de uma tabela com cada registro da outra tabela) de todos os registros de uma tabela com os da outra, salvando em uma nova tabela conjunta em memória;
2. O JOIN será feito nas colunas Cliente_id de cada tabela;
3. Cada registro que possui o valor de Cliente_id da tabela Clientes igual ao valor de Cliente_id da tabela pedidos é marcado;
4. Cada registro que foi marcado permanece na tabela conjunta em memória, enquanto os outros são excluídos da memória;
5. Os campos nome, da tabela clientes e pedido_id, da tabela pedidos, presentes na tabela em memória, são usados para gerar a resposta;
6. Caso haja alguma palavra-chave modificadora, como ORDER BY, será aplicada a esta tabela final em memória para gerar o resultado.
As figuras abaixo ilustram o andamento deste processo:
Operação 1:
Operação 2:
Operação 3:
Operação 4:
Operação 5:
Operação 6:
A linguagem SQL ainda oferece várias funções para manipulação de dados, permitindo formatar strings, manipular datas, realizar cálculos matemáticos etc. Veja algumas delas:
CONCAT(): Concatena (une) dois ou mais strings. Exemplo:
SELECT CONCAT(Nome, ' ', Sobrenome) FROM Clientes;
SUBSTRING(): Extrai uma parte de uma string. Exemplo:
SELECT SUBSTRING(Nome, 1, 3) FROM Clientes; — Retorna os três primeiros caracteres do nome.
UPPER(): Converte uma string para letras maiúsculas. Exemplo:
SELECT UPPER(Nome) FROM Clientes;
NOW(): Retorna a data e hora atuais, do momento da consulta.
YEAR(), MONTH(), DAY(): Extraem o ano, mês ou dia de uma data. Exemplo:
SELECT YEAR(data_nascimento) FROM Clientes;
DATEDIFF(): Calcula a diferença (em dias) entre duas datas. Exemplo:
SELECT DATEDIFF('2024-10-16', '2024-10-01');
ROUND(): Arredonda um número para uma quantidade de casas decimais. Exemplo:
SELECT ROUND(preco, 2) FROM Produtos;
MOD(): Retorna o resto da divisão entre dois números. Exemplo:
SELECT MOD(10, 3);
IF(): Testa uma condição e retorna um valor com base no resultado. Exemplo:
SELECT IF(salario > 3000, 'Alto', 'Baixo') FROM Funcionarios;
CASE: Executa múltiplas verificações condicionais e retorna um valor. Exemplo:
SELECT Nome,
CASE
WHEN salario > 5000 THEN 'Excelente'
WHEN salario BETWEEN 3000 AND 5000 THEN 'Bom'
ELSE 'Regular'
END AS classificacao
FROM Funcionarios;
CAST() ou CONVERT(): Converte um valor de um tipo de dado para outro. Exemplo:
`SELECT CAST(salario AS CHAR) FROM Funcionarios;`
`SELECT CONVERT(data_nascimento, DATE) FROM Clientes;`
IFNULL(): Substitui valores nulos por um valor especificado. Exemplo:
`SELECT IFNULL(telefone, 'Sem telefone') FROM Clientes;`
Essas funções podem ser usadas para melhorar a eficácia das consultas SQL, manipulando e formatando dados para elaboração de relatórios, análises etc.
Cada SGBD pode ter algumas variações nas funções, mas a maioria dos sistemas oferece as funcionalidades essenciais.
5 – Considerações finais
Este é mais um artigo da série DIRETO AO PONTO, que eu estou escrevendo para a DIO. Neste artigo eu tratei da linguagem SQL (“Structured Query Language”), uma linguagem padronizada para gerenciamento e manipulação de dados armazenados em SGBDs (Sistemas de Gerenciamento de Bancos de Dados).
No artigo anterior, eu tratei dos bancos de dados e dos SGBDs em detalhes.
A linguagem SQL foi desenvolvida originalmente para bancos de dados relacionais, mas outros tipos de SGBDs também oferecem suporte a ela, como os bancos de dados NoSQL.
Os comandos são divididos em diferentes categorias, conforme a sua finalidade, sendo as mais comuns:
· DDL (“Data Definition Language”);
· DML (“Data Manipulation Language”);
· DCL (“Data Control Language”);
· DCL (“Data Control Language”);
Os comandos mais comuns da DDL são CREATE TABLE, para a criação de tabelas, e ALTER TABLE, que realiza a alteração delas.
O comando mais comum da DML é o SELECT, que permite a realização de consultas diversas em um banco de dados.
Este artigo tratou dos comandos principais de linguagem SQL, bem como das palavras-chaves modificadoras de consultas, fuções de agregação em comandos de agrupamento (GROUP BY) e listou algumas das funções principais de formatação e manipulação de dados, como CONCAT(), SUBSTRING(), NOW(), ROUND(), IF() e CASE.
O tema banco de dados é muito vasto e teria assunto para vários artigos adicionais, como modelagem de dados, normalização, aplicações em Ciências de Dados e IA, SGBDs orientados a objetos, NOSQL etc.
No entanto, o objetivo era dar uma ideia dos conceitos básicos sobre o tema.
6 – Referências
Praticamente todo o conteúdo deste artigo foi tirado do que eu aprendi (e me lembro) sobre o assunto desde o início da minha carreira como programador, desde os anos 80 até agora.
Para obter dados sobre a versão atual da linguagem SQL, eu consultei o ChatGPT.
Artigos desta série: ( < ) Anterior | Índice | Seguinte ( > )