Esse artigo foi feito no intuito de servir como fixação dos conteúdos que estou estudando no momento, ministrado pelo professor Gabriel Ribeiro Diniz para as aulas de Banco de Dados no curso de Gestão de TI - FAPAM.
Linguagem SQL
SQL (Structured Query Language) é uma linguagem de consulta estruturada, que é usada para manipular e recuperar dados de um banco de dados relacional. SQL é uma linguagem padrão para acessar e manipular bancos de dados.
Tem como base a álgebra relacional e o cálculo relacional.
O SQL é dividido em três partes principais:
DDL (Data Definition Language) - Linguagem de Definição de Dados
Define esquemas e tabelas, chaves primárias, chaves estrangeiras, exclusão de esquemas, tabelas e colunas, alteração de tabelas.
Diz respeito à estrutura das tabelas e esquemas no DB.
DML (Data Manipulation Language) - Linguagem de Manipulação de Dados
Consulta, inserção de dados no DB, exclusão de dados, alteração de dados. Diz respeito aos dados das tabelas do BD - CRUD 1
DCL (Data Control Language) - Linguagem de Controle de Dados
Define permissões.
SQL = DDL + DML + DCL
Principais comandos
DDL - Definição de dados: CREATE
, DROP
, ALTER
.
DML - Manipulação de dados: SELECT
, INSERT
, UPDATE
, DELETE
.
DCL - Controle de dados: GRANT
, REVOKE
.
Conceitos
Termo | Descrição |
---|---|
Table | Relação (tabela) |
Row | Tupla (linha) |
Column | Atributo (coluna) |
DDL - Data Definition Language
DDL - Data Definition Language (Linguagem de Definição de Dados) é usada para definir a estrutura que armazenará os dados. Define a estrutura das tabelas, índices, chaves primárias, chaves estrangeiras, etc.
Propriedades
A DDL permite não só a especificação de um conjunto de relações (tabelas), como também informações acerca de cada uma das relações, incluindo:
- O esquema de cada relação (estrutura)
- O domínio dos valores associados a cada atributo (
int
,float
,varchar
, etc) - As regras de integridade de cada uma das relações
- O conjunto de índice para manutenção de cada uma das relações
- Informações sobre segurança e autoridade sobre cada relação
- A estrutura de armazenamento físico de cada relação no disco.
Criar banco de dados/esquema
Antes de qualquer tabela, é necessário criar um database (banco de dados) ou um schema (esquema). Em SQL uma base de dados (ou esquema) é identificada atravez de um nome. Os elementos do esquema incluem tabelas, restrições, etc.
Sintaxe:
ou
Exemplos:
Tipos de domínios
Numéricos
INTEGER
: É um inteiro, originado da palavra integer (em inglês).
NUMERIC(p,d)
: É um número de ponto fixo cuja precisão é definida pelo usuário. O número consiste de dígitos (mais o sinal), sendo que dos dígitos estão à direita do ponto decimal.
Ex. NUMERIC(4,2)
: 42,00
SERIAL
: Números inteiros auto incrementados.
Caracteres (Strings)
CHAR(n)
: É uma cadeia de caracteres de tamanho fixo, com o tamanho definido pelo DBA2. Abreviação de character (em inglês).
Ex. CHAR(12)
: Jack Sparrow
VARCHAR(n)
: É uma cadeia de caracteres de tamanho variável, com o tamanho definido pelo DBA. Abreviação de character varying (em inglês).
Booleano
BOOLEAN
: É um tipo de dado que pode ter um dos dois valores possíveis: TRUE
ou FALSE
(verdadeiro ou falso).
Data/Tempo
DATE
: É um tipo de dado que contém um ano (com 4 dígitos) mês e dia do mês sendo o formato "aaaa/mm/dd" o padrão do MySQL Workbench.
- Year (date) - retorna o ano de uma data
- Month (date) - retorna o mês de uma data
- Day (date) - retorna o dia de uma data
TIME
: Representa um horário, com o formato "hh:mm:ss" (00:00:00).
Alguns SGBDs oferecem o domínio TIMESTAMP
que contém a data (ano, mês e dia) e o horário (hora, minuto, segundo e milissegundos). Como é o caso do PostgreSQL.
Observações
- Uma chave estrangeira deve possuir o mesmo típo de domínio da chave primária correspondente.
- O valor nulo
NULL
é um membro de todos os tipos de domínio, isto é, qualquer atributo pode receber o valorNULL
exceto aqueles que são chaves primárias (restrição de integridade de entidade). - O SQL permite que a declaração de domínio de qualquer atributo inclua a especificação de
NOT NULL
(não nulo), proibindo assim, a inserção de um valor nulo para esse tipo de atributo (obrigatório na PK).
Criar tabela
CREATE TABLE
define a estrutura de uma tabela, suas restrições de integridade e cria uma tabela vazia.
Sintaxe:
Exemplos:
Criação de um código que gere códigos automáticos não e padrão SQL, mas caso seja necessario, pode-se utilizar o SERIAL
na criação do campo. Muito utilizado em relações que possuiem IDs.
Exemplo:
Remover tabela
DROP TABLE
remove todos os dados e a própria tabela, estando vazia ou não.
Sintaxe:
Exemplo:
Alterar tabela
ALTER TABLE
usado para alterar o esquema da tabela, permite modificar a estrutura de uma tabela existente.
Para operações de insersão, alteração e exclusão, atenção aos atributos e restrições de integridade.
Atributos chave não podem ser removidos!
Sintaxe:
- Sintaxe básica para inclusão de uma coluna:
Ex.:
- Sintaxe básica para exclusão de uma coluna:
Ex.:
- Sintaxe básica para alteração do nome de uma coluna:
Ex.:
Observe que...
- A instrução
ADD COLUMN
adiciona uma nova coluna com o valor vazio para todas as linhas, isto é, sem nenhum valor armazenado. - O mesmo acontece quando há a criação de uma tabela (
CREATE TABLE
). A princípio ela não está "povoada" com dados, está vazia, ausente de valores (em outras palavras: não há linhas/tuplas na tabela). - Os valores para as diversas linhas devem ser adicionadas através de instruções da DML (
INSERT INTO
).
Atributos
Chave Primária PRIMARY KEY
: É um atributo ou conjunto de atributos que identifica unicamente uma tupla em uma relação. A PK é um atributo ou conjunto de atributos que não pode ter valores repetidos.
Chave Estrangeira FOREIGN KEY
: É um atributo ou conjunto de atributos que faz referência a uma chave primária ou única em outra tabela. A FK é um atributo ou conjunto de atributos que pode ter valores repetidos.
A FK pode ser declarada com algumas opções de ação para deleção (ON DELETE
) e atualização (ON UPDATE
) de registros:
CASCADE
SET NULL
SET DEFAULT
RESTRICT
NO ACTION
Restrição de Atributos (PostgreSQL):
NOT NULL
- NN - O valor não pode ser nulo.DEFAULT <valor>
- O valor padrão para o atributo caso não seja passado.
Cláusulas da FK
ON DELETE
Cascata - CASCADE
Quando um registro é deletado da tabela referenciada, todos os registros que possuem a chave estrangeira referenciando o registro deletado também são deletados.
Sintaxe:
Onde cpf_cliente
é o atributo da tabela atual e Cliente(cpf)
é a tabela e atributo referenciado.
Restrito - RESTRICT
Quando um registro é deletado da tabela referenciada, a operação é restringida (da erro), ou seja, não é permitido deletar o registro pai se houver outros registros filhos á referenciando.
Sintaxe:
Não faz nada - NO ACTION
padrão - default
Quando um registro é deletado da tabela referenciada, um erro é exibido, e a operação de DELETE
é revertida.
Sintaxe:
Define como nulo - SET NULL
Quando um registro é deletado da tabela referenciada, a chave estrangeira é definida como NULL
.
Sintaxe:
Valor Padrão - SET DEFAULT
Quando um registro é deletado da tabela referenciada, a chave estrangeira é definida como o valor padrão DEFAULT
.
Sintaxe:
ON UPDATE
Restrito - RESTRICT
Quando um registro é atualizado na tabela referenciada, a operação é restringida (da erro), ou seja, não é permitido atualizar o registro pai se houver outros registros filhos á referenciando.
Sinatxe:
Define como nulo - SET NULL
Quando um registro é atualizado na tabela referenciada de modo que não exista mais a chave primária da tabela alterada, a chave estrangeira é definida como NULL
.
Sintaxe:
Define como padrão - SET DEFAULT
Quando um registro é atualizado na tabela referenciada de modo que não exista mais a chave primária da tabela alterada, a chave estrangeira é definida como o valor padrão DEFAULT
.
Sintaxe:
Não faz nada - NO ACTION
padrão - default
Quando um registro é atualizado na tabela referenciada, de modo que a chave primária referenciada não exista mais, um erro é exibido, e a operação de UPDATE
é revertida.
Sintaxe:
Remover base de dados (DB)
DROP
remove toda a base de dados, incluindo todas as tabelas, dados, índices, etc.
Sintaxe:
Exemplo:
Atenção! A instrução DROP DATABASE
remove todos os dados, tabelas e relacionamentos na base de dados, e não é possível recuperar os dados após a execução dessa instrução!
DML - Data Manipulation Language
DML - Data Manipulation Language (Linguagem de Manipulação de Dados) é usada para gerenciar os dados armazenados em um banco de dados. Manipula os dados de uma tabela, como inserir, atualizar, excluir e selecionar.
Propriedades
A linguagem DML é composta por 4 operações de manipulação de dados:
- Inserção de dados -
INSERT
- Exclusão de dados -
DELETE
- Atualização de dados -
UPDATE
- Seleção de dados (consulta) -
SELECT
Inserir Dados
INSERT INTO
é usado para inserir novos registros em uma tabela.
Sintaxe:
Exemplo:
Dependendo da ordem em que os atributos são declarados na tabela, é possível omitir a lista de atributos na instrução INSERT INTO
. Nesse caso, os valores devem ser inseridos na ordem em que os atributos foram declarados na tabela.
Por exemplo, se criarmos a tabela seguindo a ordem nome-salario-cargo:
Poderemos inserir omitindo a lista de atributos, dês de que os valores estejam na ordem correta:
Para caracteres usamos aspas simples!
"Frodo Bolseiro"
'Frodo Bolseiro'
Excluir Dados
DELETE FROM
é usado para excluir registros (tupla/linha) de uma tabela (relação).
Sintaxe:
Exemplo:
Atualizar dados
UPDATE
/SET
é usado para atualizar registros existentes em uma tabela. Quando há mudança de endereço, nome, etc...
Sintaxe:
Exemplo:
Selecionar Dados
SELECT
é usado para selecionar dados de um banco de dados. A instrução SELECT
é usada para recuperar registros de uma ou mais tabelas.
Sintaxe:
Exemplo:
O caractere *
é um wildcard (coringa) usado para selecionar todos os atributos de uma tabela.
Cláusula WHERE
(condição)
A cláusula WHERE
é usada para filtrar registros. A cláusula WHERE
é usada para extrair apenas os registros que atendem a uma condição específica.
Usa conectores lógicos:
AND
- EOR
- OUNOT
- NÃO
Usa operadores de comparação:
>
- Maior<
- Menor=
- Igual<=
- Menor ou igual>=
- Maior ou igualBETWEEN
- Entre um intervalo (incluindo os extremos). Facilita a especificação de condições númericas que envolvam um intervalo, ao invés de usar os operadores<=
e>=
.
Exemplos
Iremos fazer algumas operações de busca SELECT
usando cláusulas de condição/filtro WHERE
na tabela abaixo:
cod_peca | nome_peca | preco | qtd |
---|---|---|---|
56 | Peça X | 23.90 | 10 |
99 | Peça Y | 56.99 | 5 |
200 | Peça Z | 80.00 | 0 |
EXEMPLO 1 - Selecionar o código e o nome das peças com o preço menor que
Resultado:
cod_peca | nome_peca |
---|---|
56 | Peça X |
99 | Peça Y |
EXEMPLO 2 - Selecionar o nome e o preço das peças com preço maior que e menor do que
Resultado:
nome_peca | preco |
---|---|
Peça Y | 56.99 |
EXEMPLO 3 - Selecionar todas as informações das peças cuja quantidade em estoque seja maior ou igual a .
Resultado:
cod_peca | nome_peca | preco | qtd |
---|---|---|---|
56 | Peça X | 23.90 | 10 |
EXEMPLO 4 - Selecionar o código, nome, preço e quantidade de peças no estoque cujo código é .
Resultado:
cod_peca | nome_peca | preco | qtd |
---|---|---|---|
200 | Peça Z | 80.00 | 0 |
Cláusula ORDER BY
(ordenação)
A cláusula ORDER BY
é usada para ordenar o resultado de uma consulta em ordem crescente ou decrescente. Ela é aplicada somente à operações de consulta SELECT
, após a cláusula WHERE
.
Para especificar a forma de ordenação, devemos indicar
ASC
- Crescente padrão - defaultDESC
- Decrescente
Sintaxe:
Exemplo:
Resultado:
nome_peca | quantidade |
---|---|
Peça Z | 0 |
Peça Y | 5 |
Peça X | 10 |
Funções de agregação
As funções de agregação são usadas para calcular algo a partir de um conjunto de valores. As funções de agregação são usadas com a cláusula SELECT
.
As principais são:
COUNT
- Conta o número de linhas (tuplas)SUM
- Soma os valores da coluna - apenas em dados numéricosAVG
- Calcula a média dos valores da coluna (average3) - apenas em dados numéricosMIN
- Retorna o menor valor da colunaMAX
- Retorna o maior valor da coluna
Atenção SUM
é diferente de COUNT
EXEMPLO 1 - Encontrar a soma dos preços de todas as peças, o maior preço, o menor preço e a média dos preços.
Resultado:
SUM(preco) | MAX(preco) | MIN(preco) | AVG(preco) |
---|---|---|---|
160.89 | 80.00 | 23.90 | 53.62999999995 |
EXEMPLO 2 - Contar o número de peças que há no estoque.
ou
Resultado:
COUNT(*) | |
---|---|
3 |
Valores NULL
(nulo)
Suponhamos que temos a tabela Peça
criada anteriormente, estruturada e preenchida da seguinte forma:
Coluna (tupla) | Data Type (Tipo) | Length/Precision (Comprimento) | Scale (Escala) | Not Null? (Não Nulo?) | Primary Key? (Chave Primária?) | Default (Padrão) |
---|---|---|---|---|---|---|
cod_peca | INTEGER | Sim | Sim | |||
nome_peca | VARCHAR | 30 | Sim | Não | ||
preco | NUMERIC | 6 | 2 | Não | Não | |
qtd | INTEGER | Não | Não | 0 |
cod_peca | nome_peca | preco | qtd |
---|---|---|---|
1 | Peça A | 15.00 | 10 |
2 | Peça B | 8.00 | 20 |
3 | Peça C | 8.00 | 30 |
4 | Peça D | 8.00 | 10 |
Código SQL
Inserindo valores nulos
Quando realizamos um INSERT
e não passamos o campo, o banco de dados vai automaticamente inserir NULL
no valor da célula.
Resultado:
cod_peca | nome_peca | preco | qtd |
---|---|---|---|
1 | Peça A | 15.00 | 10 |
2 | Peça B | 8.00 | 20 |
3 | Peça C | 8.00 | 30 |
4 | Peça D | 8.00 | 10 |
5 | Peça E | null | 15 |
Cuidado com o DEFAULT
!
Lembre-se que colunas que tem o valor DEFAULT
definido, não serão preenchidas com NULL
, mas sim com o valor DEFAULT
especificado no momento da criação da tabela.
Resultado:
cod_peca | nome_peca | preco | qtd |
---|---|---|---|
1 | Peça A | 15.00 | 10 |
2 | Peça B | 8.00 | 20 |
3 | Peça C | 8.00 | 30 |
4 | Peça D | 8.00 | 10 |
5 | Peça E | null | 15 |
6 | Peça F | 20.00 | 0 |
Existe um outra forma de definir um valor como NULL
. Deixando explícito no comando INSERT
que a coluna deve receber o valor NULL
.
Resultado:
cod_peca | nome_peca | preco | qtd |
---|---|---|---|
1 | Peça A | 15.00 | 10 |
2 | Peça B | 8.00 | 20 |
3 | Peça C | 8.00 | 30 |
4 | Peça D | 8.00 | 10 |
5 | Peça E | null | 15 |
6 | Peça F | 20.00 | 0 |
7 | Peça G | 17.00 | null |
Repare que mesmo o campo qtd
possuindo um valor DEFAULT
, foi definido de forma explícita no INSERT
que essa coluna deveria possuir um valor NULL
.
Atenção! - Mesmo se você tentar inserir o valor NULL
em uma coluna definida como NOT NULL
, uma exceção (erro) será lançada pelo banco de dados.
Resultado:
Selecionando valores nulos
Caso você queira selecionar somente as linhas com valores nulos em uma determinada célula, a forma correta é utilizar o IS NULL
, e não ... = NULL
.
Selecionando valores não nulos
Caso você queira selecionar apenas as linhas que não possuem valores nulos em uma determinada coluna, é só utilizar o c omando IS NOT NULL
.
Resultado:
cod_peca | nome_peca | preco | qtd |
---|---|---|---|
1 | Peça A | 15.00 | 10 |
2 | Peça B | 8.00 | 20 |
3 | Peça C | 8.00 | 30 |
4 | Peça D | 8.00 | 10 |
6 | Peça F | 20.00 | 0 |
7 | Peça G | 17.00 | null |
Repare que a peça de código não foi incluída no resultado, por possuir o valor null
na coluna preco
.
Ordenando colunas com NULL
Por default, caso você ordene um SELECT
por uma coluna que possui células com valor NULL
, essas células serão as últimas a serem retornadas.
Resultado:
cod_peca | nome_peca | preco | qtd |
---|---|---|---|
4 | Peça D | 8.00 | 10 |
2 | Peça B | 8.00 | 20 |
3 | Peça C | 8.00 | 30 |
1 | Peça A | 15.00 | 10 |
6 | Peça F | 20.00 | 0 |
7 | Peça G | 17.00 | null |
5 | Peça E | null | 15 |
Caso você deseje que as células com valores NULL
sejam as primeiras a serem retornadas no SELECT
, utilizamos o ORDER BY ... NULLS FIRST
.
Resultado:
cod_peca | nome_peca | preco | qtd |
---|---|---|---|
5 | Peça E | null | 15 |
2 | Peça B | 8.00 | 20 |
3 | Peça C | 8.00 | 30 |
4 | Peça D | 8.00 | 10 |
1 | Peça A | 15.00 | 10 |
6 | Peça F | 20.00 | 0 |
7 | Peça G | 17.00 | null |
Selecionar Dados II
Cláusula DISTINCT
(linhas únicas)
Linhas duplicadas podem aparecer nas relações. No caso de desejarmos a eliminação de duplicidade, devemos inserir a palavra DISTINCT
na cláusula SELECT
.
Observações
- Funções agregadas normalmente consideram as tuplas duplicadas.
- Não é permitido o uso do
DISTINCT
com oCOUNT(*)
. - É válido usar o
DISTINCT
comMAX
ouMIN
, mesmo não alterando o resultado.
Tabela neste momento:
cod_peca | nome_peca | preco | qtd |
---|---|---|---|
1 | Peça A | 15.00 | 10 |
2 | Peça B | 8.00 | 20 |
3 | Peça B | 8.00 | 10 |
4 | Peça A | 8.00 | 30 |
5 | Peça C | 17.00 | 0 |
6 | Peça C | 17.00 | null |
7 | Peça A | null | 15 |
Sinatxe:
Exemplo:
Selecionar o nome de todas as peças, sem o DISTINCT
:
nome_peca | |
---|---|
Peça A | |
Peça B | |
Peça B | |
Peça A | |
Peça C | |
Peça C | |
Peça A |
Selecionar o nome de todas as peças, com o DISTINCT
:
nome_peca | |
---|---|
Peça C | |
Peça A | |
Peça B |
Cláusula GROUP BY
(agrupar)
A cláusula GROUP BY
é usada para agrupar linhas que possuem o mesmo valor em uma ou mais colunas. É normalmente usada em conjunto com funções de agregação para agrupar os resultados de acordo com um ou mais campos. Desta forma, as funções de agregação será aplicada a cada grupo, e não a todas as tuplas.
Tabela neste momento:
cod_peca | nome_peca | preco | qtd | veiculo |
---|---|---|---|---|
1 | Peça A | 15.00 | 10 | CARRO |
2 | Peça B | 8.00 | 20 | MOTO |
3 | Peça C | 8.00 | 30 | CAMINHAO |
4 | Peça D | 8.00 | 10 | CARRO |
5 | Peça E | null | 15 | CAMINHAO |
6 | Peça F | 17.00 | 0 | MOTO |
7 | Peça G | 17.00 | null | CARRO |
Sintaxe:
EXEMPLO 1 - Selecionar o nome de todas as peças e agrupar por veículo (contar por grupo):
Resultado:
veiculo | count |
---|---|
MOTO | 2 |
CAMINHAO | 2 |
CARRO | 3 |
EXEMPLO 2 - Obter a soma da quantidade de peças por tipo de veículo
Resultado:
veiculo | sum |
---|---|
MOTO | 20 |
CAMINHAO | 45 |
CARRO | 20 |
Cláusula HAVING
(filtro)
A cláusula HAVING
é usada para filtrar grupos de registros que resultam de uma operação de GROUP BY
. A cláusula HAVING
é usada em conjunto com a cláusula GROUP BY
.
Sintaxe:
EXEMPLO 2 anterior (alterado) - Obter a soma da quantidade de peças por tipo de veículo que sejam maiores que 20
Resultado:
veiculo | sum |
---|---|
CAMINHAO | 45 |
Footnotes
-
CRUD é a abreviatura de Create, Read, Update e Delete. É um acrônimo que se refere às quatro funções básicas de um sistema de banco de dados: Criar, Ler, Atualizar e Excluir. ↩
-
DBA é a abreviatura de Database Administrator (Administrador de Banco de Dados.) ↩
-
Average é a palavra em inglês para média. ↩