08_SQL
08_SQL
Fábio Coutinho
fabio@ic.ufal.br
Roteiro
• Introdução
• Comandos DDL
• Create, Tipos, Drop, Alter, View.
• Comandos DML
• Operadores, Insert, Update, Delete, Select
• Joins
• Subconsultas
• Referências
Introdução
• SQL - Structured Query Language
• Inicialmente chamada SEQUEL (Structured English Query Language), foi
projetada e implementada pela IBM.
• Combina construtores da álgebra relacional e do cálculo relacional de
tupla e proporciona uma interface declarativa e amigável.
• Suportada por todos os SGBDs relacionais comerciais.
• Num esforço conjunto da ANSI (American Nacional Standars Institute) e
da ISO (International Standards Organization) criou-se a primeira versão
padrão da SQL, a SQL-86, substituída posteriormente pela SQL-92 e
depois pela SQL-99.
Comandos SQL - Classificação
Comandos SQL - Classificação
• A linguagem SQL pode ser dividida em:
• DDL (Data Definition Language) - comandos para definição
da estrutura dos dados, ex.: create, drop, alter;
Sintaxe:
CREATE DATABASE <nome>;
Exemplo:
CREATE DATABASE empresa;
[DDL] - Comando Create Table
• Utilizado para especificar uma nova tabela.
Sintaxe:
CREATE TABLE <nome>
(<descrição das colunas>);
(<descrição das chaves>);
[DDL] - Comando Create Table
Exemplo:
CREATE TABLE Empregado (
Nome varchar(60) not null,
Matricula char(9) not null,
DataNasc date,
Sexo enum(“M”, “F”),
Salario decimal(10, 2),
Supervisor char(9),
Depto char(5) not null,
primary key(Matricula),
foreign key (Supervisor) references Empregado(Matricula)
foreign key (Depto) references Departamento (DeptoSigla));
[DDL] - Tipos
Alguns tipos de dados no MySQL:
• Numéricos:
• Inteiros (TinyInt, Int, BigInt)
• Reais (Decimal, Real)
• Lógico (Boolean)
• Literais:
• Caractere (VarChar)
• Texto (Text)
• Binário (Blob)
• Coleção (Enum, Set)
[DDL] - Comando Drop
• Usado para eliminar elementos do esquema. Podemos usá-lo para
tabelas, domínios, restrições ou o próprio esquema.
Sintaxe:
DROP <atributo> <nome>;
Exemplos:
DROP DATABASE empresa;
DROP TABLE Empregado;
DROP PRIMARY Matricula;
[DDL] - Comando Alter
• Usado para alterar atributos.
Sintaxe:
ALTER TABLE <tabela> <ADD | DROP | MODIFY> (<descrição da coluna>);
Exemplos:
ALTER TABLE Empregado ADD Endereco varchar(60);
ALTER TABLE Empregado DROP Supervisor;
ALTER TABLE Empregado MODIFY Matricula int;
[DDL] - Comando View
• Uma view pode ser entendida como uma tabela virtual, não armazena
dados de fato e é composta dinamicamente por uma consulta
previamente analisada e otimizada.
Sintaxe:
CREATE VIEW <nome> <expressão de consulta>;
[DDL] - Comando View
Exemplo de definição de uma visão:
CREATE VIEW vAltoEscalao AS
SELECT codEmp, nome, salario
FROM Empregado
WHERE salario > 15000
TRUNCATE
• Exclui todos os dados de uma tabela (todas as linhas são removidas), mas
não a tabela em si.
• Utiliza menos recursos de sistema e log de transações.
• Exemplo: TRUNCATE TABLE Empregados;
RENAME
Usado para renomear tabelas.
Exemplo: RENAME TABLE Empregados TO Funcionarios;
[DDL] - Outros Comandos
COMMENT
• Objetivo: Adicionar comentários ao dicionário de dados.
• Exemplo: COMMENT ON TABLE Funcionarios IS ‘Tabela de funcionarios
celetistas’;
[DDL] - Auto_Increment
• Objetivo: Declarar tipos sequenciais na própria estrutura da tabela
• Exemplo:
CREATE TABLE Pessoa (
id int NOT NULL AUTO_INCREMENT,
nome varchar(255),
sobrenome varchar(255) NOT NULL,
idade int,
PRIMARY KEY (id)
);
[DDL] - Restrições de Domínio
Permite que um tipo de dados seja compartilhado por vários atributos.
Exemplo:
CREATE DOMAIN sexoDom CHAR(1) CHECK (VALUE IN ('F','M'));
Sintaxe:
INSERT INTO <tabela> (atributos) VALUES (valores);
ou
INSERT INTO <tabela> VALUES (valores);
• Há ainda os operadores:
• Aritméticos: +, -, *, /, %;
• Bitwise: &, |, ^.
[DML] - Comando Update
• Usamos o update para atualizar dados já existentes.
Sintaxe:
UPDATE <tabela>
SET <atributo> = valor
WHERE <condição>;
Sintaxe:
DELETE FROM <tabela>
WHERE <condição>;
• TRUNCATE
• remove todas as linhas de uma tabela;
• mais rápido (utiliza menos recursos de sistema e log de transações).
[DML] - Comando Select
• Usamos o select para retornar registros de uma tabela mediante uma
condição para filtrar as linhas de interesse.
Sintaxe simplificada:
SELECT <atributos>
FROM <tabelas>
WHERE <condição>;
Tabelas usadas nos exemplos
Funcionario
Tabelas usadas nos exemplos id Num Horas
1 1 32.5
1 2 7.5
Nome Salario
SELECT DISTINCT Salario Jorge 55000
FROM Funcionario Jennifer 43000
Fernando 40000
ORDER BY Salario DESC; Ronaldo 38000
João 30000
Alice 25000
Joice 25000
André 25000
[DML] - Comando Select - distinct
• Usamos o distinct para eliminar registros duplicados.
Nome Salario
SELECT Nome, João 30000
Salario * 1.10 AS ‘Novo Salário’ Fernando 40000
Alice 25000
FROM Funcionario; Jennifer 43000
Ronaldo 38000
Joice 25000
André 25000
Jorge 55000
[DML] - Comando Select
• É possível retornar valores computados.
Nome Salario
SELECT Nome, João 30000
Nome Novo Salário
João 33000
Salario * 1.10 AS ‘Novo Salário’ Fernando 40000
Fernando 44000
Alice 25000
FROM Funcionario; Jennifer 43000
Alice 27500
Jennifer 47300
Ronaldo 38000
Ronaldo 41800
Joice 25000
Joice 27500
André 25000
André 27500
Jorge 55000
Jorge 60500
[DML] - Comando Select - in
• Usamos o operador in para verificar se o valor de um campo faz parte de
um conjunto de valores.
• O operador IN é uma alternativa à especificação de múltiplas condições
OR.
Nome Salario Depto
WHERE Depto IN (MAT, ADM); Jennifer 43000 ADM Jorge 55000 MAT
Ronaldo 38000 PES
Joice 25000 PES
André 25000 ADM
Jorge 55000 MAT
[DML] - Comando Select - between
• Usamos o operador between para especificar um intervalo de valores a
serem selecionados. É inclusivo: começo e fim são incluídos.
Nome
João
SELECT Nome Fernando
Nome Nome
João João
SELECT Nome Fernando Joice
SELECT Nome
FROM Funcionario Nome
SELECT Nome
FROM Funcionario Nome Nome
Exemplo:
média(2, 4, 0) = 2 ( 6 / 3)
média(2, 4, null) = 3 ( 6 / 2)
[DML] - Comando Select - valor nulo
• É importante notar que um valor nulo indica um dado ignorado, não
preenchido ou que não tem valor naquela linha.
• Não participam de computações.
Nome Superv
Nome Salario
João 30000
SELECT MAX(Salario) AS “Maior Salário” Fernando 40000
Nome Salario
Nome Salario
SELECT MIN(Salario) AS “Menor Salário” João 30000
FROM Funcionario; Fernando 40000
Alice 25000
Jennifer 43000
Ronaldo 38000
Joice 25000
André 25000
Jorge 55000
[DML] - Comando Select - agregação
• MIN retorna o valor mínimo entre os valores de uma coluna.
Alice 25000
Jennifer 43000
Ronaldo 38000
Joice 25000
André 25000
Jorge 55000
[DML] - Comando Select - agregação
• AVG (average) retorna a média dos valores de uma coluna.
Nome Salario
SELECT AVG(Salario) AS “Media”
João 30000
FROM Funcionario; Fernando 40000
Alice 25000
Jennifer 43000
Ronaldo 38000
Joice 25000
André 25000
Jorge 55000
[DML] - Comando Select - agregação
• AVG (average) retorna a média dos valores de uma coluna.
Nome Salario
SELECT AVG(Salario) AS “Media” Media
João 30000
FROM Funcionario; Fernando 40000
35125
Alice 25000
Jennifer 43000
Ronaldo 38000
Joice 25000
André 25000
Jorge 55000
[DML] - Comando Select - agregação
• SUM retorna a soma dos valores de uma coluna.
Nome Salario
SELECT SUM(Salario) AS “Soma”
João 30000
FROM Funcionario; Fernando 40000
Alice 25000
Jennifer 43000
Ronaldo 38000
Joice 25000
André 25000
Jorge 55000
[DML] - Comando Select - agregação
• SUM retorna a soma dos valores de uma coluna.
Nome Salario
SELECT SUM(Salario) AS “Soma” Soma
João 30000
FROM Funcionario; Fernando 40000
281000
Alice 25000
Jennifer 43000
Ronaldo 38000
Joice 25000
André 25000
Jorge 55000
[DML] - Comando Select - group by
• Usamos o operador GROUP BY para sumarizar linhas com os mesmos valores.
• Geralmente usado com funções de agregação (sem estas, se comporta como o
DISTINCT).
Nome Salario Depto
PES 33250
GROUP BY Depto; Jennifer 43000 ADM
ADM 31000
Ronaldo 38000 PES
MAT 55000
Joice 25000 PES
André 25000 ADM
Jorge 55000 MAT
[DML] - Comando Select - having
• Usado após o GROUP BY, o operador HAVING serve para especificar uma
condição após o resultado ter sido agrupado.
• Irá ocorrer um erro ao usar o WHERE em uma coluna que não exista na
tabela agrupada;
• O mesmo acontecerá com o HAVING caso ela só exista na tabela não
agrupada.
[DML] - Comando Select - having/where
Exemplo 1:
Nome Sexo Salario
João M 30000
SELECT Sexo, AVG(Salario) Fernando M 40000
Teria sido retornado um erro caso tentássemos filtrar AVG(Salario) com o WHERE
[DML] - Comando Select - having/where
Exemplo 2:
Nome Sexo Salario
João M 30000
SELECT Sexo, AVG(Salario) Fernando M 40000
Não seria possível especificar “Salario > 31000” com o HAVING, visto que essa
coluna não existe na tabela agrupada.
[DML] - Junções
• Usadas para correlacionar linhas de várias tabelas.
• Existem os tipos:
• Cross join (produto cartesiano)
• Junção interna
• Self join
• Junção externa (esquerda e direita)
[DML] - Junções - cross join
• Retorna o produto cartesiano entre duas tabelas: cada linha de uma
tabela A será combinada com todas as linhas de uma tabela B.
SELECT * FROM A, B;
A B
C1 C2 C3 C4
a b x y
c d a b
[DML] - Junções - cross join
• Retorna o produto cartesiano entre duas tabelas: cada linha de uma
tabela A será combinada com todas as linhas de uma tabela B.
SELECT * FROM A, B;
A×B
C1 C2 C3 C4
A B
a b x y
C1 C2 C3 C4
a b a b
a b x y
c d x y
c d a b
c d a b
[DML] - Junções - inner join
• A junção interna combina linhas entre tabelas, tendo a diferença de que
são retornadas apenas linhas as relacionadas por uma condição.
1 João 2
F2.Nome AS ‘Supervisor’ 2 Fernando 8
FROM Funcionario F1 3 Alice 4
4 Jennifer 8
JOIN Funcionario F2 5 Ronaldo 1
ON F1.Superv = F2.id; 6 Joice 1
7 André 4
8 Jorge null
[DML] - Junções - self join
• O self join é uma junção de uma tabela com ela mesma.
João PES
Cod Nome
Fernando PES
ADM Administração
Alice ADM
MAT Matriz
Jennifer ADM
PES Pesquisa
Ronaldo PES
VEN Vendas
Joice PES
André ADM
Jorge MAT
[DML] - Junções - right outer join
Nome Depto
Cod Nome
ADM Administração
MAT Matriz
PES Pesquisa
VEN Vendas
[DML] - Junções - right outer join
Nome Depto
Jennifer Administração
FROM Funcionario F Jennifer ADM
Alice Administração
Ronaldo PES
RIGHT JOIN Departamento D Joice PES
Jorge Matriz
Joice Pesquisa
ON F.Depto = D.Cod; André ADM
Ronaldo Pesquisa
Jorge MAT
Fernando Pesquisa
Cod Nome
João Pesquisa
ADM Administração
null Vendas
MAT Matriz
PES Pesquisa
VEN Vendas
[DML] - Subconsultas
• Subconsulta diz respeito à especificação de um comandos select dentro
de outro;
• Existem subconsultas:
• Não correlacionadas
• Correlacionadas
[DML] - Subconsultas - não correlacionadas
• Uma subconsulta não correlacionada é feita de dentro para fora:
• Consulta interna resolvida primeiro;
• Após isso a consulta externa será baseada nos valores obtidos.
Id Nome id Num Horas
SELECT id, Nome 1 João
4 20 15
2 Fernando
FROM Funcionario 3 Alice
4 30 20
5 3 40
WHERE id IN ( 4 Jennifer
6 1 20
5 Ronaldo
SELECT id 6 Joice
6 2 20
7 10 35
FROM Trabalha_em 7 André
7 30 5
8 Jorge
WHERE Horas = 40 8 20 null
);
[DML] - Subconsultas - não correlacionadas
• Uma subconsulta não correlacionada é feita de dentro para fora:
• Consulta interna resolvida primeiro;
• Após isso a consulta externa será baseada nos valores obtidos.
Id Nome id Num Horas
SELECT id, Nome 1 João
4 20 15
2 Fernando
FROM Funcionario 3 Alice
4 30 20
5 3 40 Id Nome
WHERE id IN ( 4 Jennifer
6 1 20 5 Ronaldo
5 Ronaldo
SELECT id 6 Joice
6 2 20
7 10 35
FROM Trabalha_em 7 André
7 30 5
8 Jorge
WHERE Horas = 40 8 20 null
);
[DML] - Subconsultas - correlacionadas
• Uma subconsulta correlacionada é feita de fora para dentro;
• Consulta externa provê valores: para cada tupla resolvida da consulta
externa, resolve-se a consulta interna;
• A consulta interna é dependente.
[DML] - Subconsultas - correlacionadas
Exemplo:
SELECT id, Nome
FROM Funcionario f
WHERE 40 IN ( Id Nome id Num Horas
1 João
SELECT Horas 2 Fernando
4 20 15
4 30 20
FROM Trabalha_em t 3 Alice
5 3 40
4 Jennifer
WHERE t.id = f.id 5 Ronaldo
6 1 20
6 2 20
); 6 Joice
7 10 35
7 André
7 30 5
8 Jorge
8 20 null
[DML] - Subconsultas - correlacionadas
Exemplo:
SELECT id, Nome
FROM Funcionario f
WHERE 40 IN ( Id Nome id Num Horas
1 João
SELECT Horas 2 Fernando
4 20 15
4 30 20
FROM Trabalha_em t 3 Alice
5 3 40 Id Nome
4 Jennifer
WHERE t.id = f.id 5 Ronaldo
6 1 20 5 Ronaldo
6 2 20
); 6 Joice
7 10 35
7 André
7 30 5
8 Jorge
8 20 null
[DML] - Subconsultas - tipos
Tipos:
• Retornam um único valor
• Operador de comparação não modificado
• Teste de existência
• Operador EXISTS
[DML] - Subconsultas - in id Num Horas
1 1 32.5
1 2 7.5
1 João 3 10 10
SELECT id 2 Fernando 3 30 30
4 Jennifer 4 30 20
WHERE Horas = 40 5 Ronaldo 5 3 40
); 6 Joice 6 1 20
7 André 6 2 20
8 Jorge 7 10 35
7 30 5
8 20 null
[DML] - Subconsultas - in id Num Horas
1 1 32.5
1 2 7.5
1 João 3 10 10 1 João
SELECT id 2 Fernando 3 30 30 2 Fernando
FROM Trabalha_em 3 Alice 4 20 15 3 Alice
4 Jennifer 4 30 20 4 Jennifer
WHERE Horas = 40 5 Ronaldo 5 3 40 6 Joice
); 6 Joice 6 1 20 7 André
7 André 6 2 20 8 Jorge
8 Jorge 7 10 35
7 30 5
8 20 null
[DML] - Subconsultas - any
• O operador ANY retornará verdadeiro se existir algum elemento que faça
com que a condição seja verdadeira.
• Retornando falso caso contrário.
Nome Salario Depto
);
[DML] - Subconsultas - all
• O operador ALL retornará verdadeiro se, para todos os elementos a
condição seja verdadeira.
• Retornando falso caso contrário.
);
[DML] - Subconsultas - all
• O operador ALL retornará verdadeiro se, para todos os elementos a
condição seja verdadeira.
• Retornando falso caso contrário.
);
[DML] - Subconsultas - exists
• O operador EXISTS retorna verdadeiro caso exista uma linha que
satisfaça a consulta, retornando falso caso contrário.
id Num Horas
); 8 20 null
[DML] - Subconsultas - exists
• Selecionando funcionários que trabalham no projeto de Número 20.
); 7 10 35
8 20 null
[DML] - Subconsultas - exists
• Intersecção: funcionários cujos departamentos possuem projetos.
Jorge MAT
);
[DML] - Subconsultas - exists
• Intersecção: funcionários cujos departamentos possuem projetos.
Jorge MAT
);
[DML] - Subconsultas - exists
• Diferença: funcionários cujos departamentos não possuem projetos.
Jorge MAT
);
[DML] - Subconsultas - exists
• Divisão: funcionários que trabalham em todos os projetos.
• (Adicionando um funcionário para o exemplo - Maria, id 9).
(SELECT * FROM R)
UNION C1 C2 C1 C3
(SELECT * FROM S); a b x y
c d a b
R S
[DML] - Subconsultas - union
• Com UNION é possível unir o resultado de várias consultas desde que os
tipos de dados sejam os mesmos.
(SELECT * FROM R)
C1 C3
UNION C1 C2 C1 C3
a b
(SELECT * FROM S); a b x y
c d
c d a b
x y
R S
R∪S
Referências
• Sistemas de Banco de Dados, Elmasri, Ranmez e Navathe, Shamkant B.,
Pearson, 6ª edição.
• Notas de aula da Profa. Yoko (IME-RJ).