0% acharam este documento útil (0 voto)
6 visualizações112 páginas

08_SQL

Enviado por

Tyrwz
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
6 visualizações112 páginas

08_SQL

Enviado por

Tyrwz
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 112

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;

• DML (Data Manipulation Language) - comandos que tratam


da manipulação de dados e incluem as instruções SQL mais
comuns, ex.: insert, select, update, delete;

• DCL (Data Control Language) - comandos para controle de


acesso relacionados a direitos, permissões, ex.: grant, revoke;

• TCL (Transaction Control Language) - para controle de


transações, ex.: commit, rollback.
DDL
[DDL] - Comando Create Database
• Uma base dados é um grupo de objetos, por exemplo, tabelas
relacionadas entre si, geralmente pertencente a um único usuário ou
aplicação.
• Ao criar uma base de dados no MySQL usamos o comando use nomeBD
para selecioná-la.

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)

• Data/Tempo: Date, DateTime, Time, Year

• 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.

• É uma forma de “guardar em uma tabela” uma consulta complexa.

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

• A visão vAltoEscalao poderia ser utilizada da seguinte forma:


SELECT nome, salario
FROM vAltoEscalao;
[DDL] - Outros Comandos

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

CREATE TABLE Actors(


... ,
sexo sexoDom,

);
[DDL] - Restrições Check
• Objetivo: Limitar uma faixa de valores que podem ser colocados em
uma coluna.
• Exemplo:
CREATE TABLE Pessoa (
id int NOT NULL AUTO_INCREMENT,
nome varchar(255),
sobrenome varchar(255) NOT NULL,
idade int,
CHECK (idade >= 18),
PRIMARY KEY (id)
);
[DDL] - Restrições de chaves
• Restringem os valores permitidos em determinados atributos de
relações.
• Primary Key: especifica um ou mais atributos que definem a chave
primária da relação.
• Foreign Key: define os atributos de chaves estrangeiras e de
onde(qual tabela e atributo) elas vieram.
• Unique: define chaves alternativas.
• Not Null: valores nulos não são permitidos no atributo.
[DDL] - Restrições de chaves
• Exemplo:
CREATE TABLE Usuarios(
username CHAR(30),
nome VARCHAR(200),
email VARCHAR(500),
id_cat INT,
CONSTRAINT email_u UNIQUE (email),
CONSTRAINT usuarios_pk PRIMARY KEY (username),
CONSTRAINT categoria_fk FOREIGN KEY (id_cat) REFERENCES Categorias(id)
);
DML
[DML] - Comando Insert
• Usamos o insert para inserir novos dados ou registros em uma tabela.

Sintaxe:
INSERT INTO <tabela> (atributos) VALUES (valores);
ou
INSERT INTO <tabela> VALUES (valores);

• Na primeira forma especificamos as colunas a serem inseridas, as não


selecionadas terão seu valor armazenado como null.
• Na Segunda o SGBD espera que se especifique para cada linha inserida todas
as colunas da tabela em questão na ordem.
[DML] - Comando Insert
Exemplos:
INSERT INTO Funcionarios VALUES Id Nome Sexo Salario Superv Depto
1 Maria Silva F 5000 null DG
(1, “Maria Silva”, “F”, 5000, null, “DG”),
2 João Goya M 4000 1 DG
(2, “João Goya”, “M”, 4000, 1, “DG”);

INSERT INTO Funcionarios (id, Nome, Sexo, Depto) VALUES


(3, “Abel Flores”, “M”, “DG”),
(4, “Carlos Gardel”, “M”, “DES”) Id Nome Sexo Salario Superv Depto
3 Abel Flores M null null DG
(12, “Noel Reis”, “M”, “DES”);
4 Carlos Gardel M null null DES
12 Noel Reis M null null DES
[DML] - Operadores
• Em SQL existem os operadores:
• Lógicos: AND, OR e NOT;
• Relacionais: =, >, <, >=, <=, != ou <>.
• Ambos podem ser usados nas cláusula WHERE e HAVING que serão
mostradas adiante.

• 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>;

• Usamos a condição para selecionar quais linhas serão atualizadas,


mudando o valor do atributo selecionado para um novo.
• É possível inserir mais de um par atributo-valor separando-os por vírgula.
[DML] - Comando Update
Exemplos:

Id Nome Sexo Salario Superv Depto


UPDATE Funcionarios 3 Abel Flores M null null DG

SET Salario = 4000, Superv = 1


WHERE id = 3;
[DML] - Comando Update
Exemplos:

Id Nome Sexo Salario Superv Depto


UPDATE Funcionarios 3 Abel Flores M null null DG

SET Salario = 4000, Superv = 1


WHERE id = 3; Id Nome Sexo Salario Superv Depto
3 Abel Flores M 4000 1 DG
[DML] - Comando Update
Exemplos:
Id Nome Sexo Salario Superv Depto
3 Abel Flores M 4000 1 DG
UPDATE Funcionarios 4 Carlos Gardel M null null DES

SET Salario = 2000, Superv = 3 12 Noel Reis M null null DES

WHERE Depto = “DES”;


[DML] - Comando Update
Exemplos:
Id Nome Sexo Salario Superv Depto
3 Abel Flores M 4000 1 DG
UPDATE Funcionarios 4 Carlos Gardel M null null DES

SET Salario = 2000, Superv = 3 12 Noel Reis M null null DES

WHERE Depto = “DES”;


Id Nome Sexo Salario Superv Depto
3 Abel Flores M 4000 1 DG
4 Carlos Gardel M 2000 3 DES
12 Noel Reis M 2000 3 DES
[DML] - Comando Delete
• Usamos o delete para remover registros.

Sintaxe:
DELETE FROM <tabela>
WHERE <condição>;

• O comando irá remover todas as linhas de uma tabela que satisfazerem


determinada condição.
[DML] - Comando Delete
Exemplos: Id Nome Sexo Salario Superv Depto
1 Maria Silva F 5000 null DG
2 João Goya M 4000 1 DG
3 Abel Flores M 4000 1 DG
DELETE FROM Funcionarios 4 Carlos Gardel M 2000 3 DES
WHERE id = 3; 12 Noel Reis M 2000 3 DES
[DML] - Comando Delete
Exemplos: Id Nome Sexo Salario Superv Depto
1 Maria Silva F 5000 null DG
2 João Goya M 4000 1 DG
3 Abel Flores M 4000 1 DG
DELETE FROM Funcionarios 4 Carlos Gardel M 2000 3 DES
WHERE id = 3; 12 Noel Reis M 2000 3 DES

Id Nome Sexo Salario Superv Depto


1 Maria Silva F 5000 null DG
2 João Goya M 4000 1 DG
4 Carlos Gardel M 2000 3 DES
12 Noel Reis M 2000 3 DES
[DML] - Comando Delete
Exemplos:
Id Nome Sexo Salario Superv Depto
1 Maria Silva F 5000 null DG

DELETE FROM Funcionarios 2 João Goya M 4000 1 DG


4 Carlos Gardel M 2000 3 DES
WHERE Depto = “DES”;
12 Noel Reis M 2000 3 DES
[DML] - Comando Delete
Exemplos:
Id Nome Sexo Salario Superv Depto
1 Maria Silva F 5000 null DG

DELETE FROM Funcionarios 2 João Goya M 4000 1 DG


4 Carlos Gardel M 2000 3 DES
WHERE Depto = “DES”;
12 Noel Reis M 2000 3 DES

Id Nome Sexo Salario Superv Depto


1 Maria Silva F 5000 null DG
2 João Goya M 4000 1 DG
[DML] - Delete x Truncate
• DELETE
• possível usar a cláusula WHERE e especificar linhas a serem deletadas;
• pode ser seguido de COMMIT e ROLLBACK.

• 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.

• O comando também especifica quais colunas serão exibidas na saída.

Sintaxe simplificada:
SELECT <atributos>
FROM <tabelas>
WHERE <condição>;
Tabelas usadas nos exemplos

Id Nome Snome Sexo Salario Superv Depto

1 João Silva M 30000 2 PES Cod Nome Gerente


2 Fernando Wong M 40000 8 PES ADM Administração 4
3 Alice Zelaya F 25000 4 ADM MAT Matriz 8
4 Jennifer Souza F 43000 8 ADM PES Pesquisa 2
5 Ronaldo Lima M 38000 1 PES
Departamento
6 Joice Leite F 25000 1 PES
7 André Pereira M 25000 4 ADM
8 Jorge Brito M 55000 null MAT

Funcionario
Tabelas usadas nos exemplos id Num Horas

1 1 32.5
1 2 7.5

Num Nome Depto 2 2 10


2 3 10
1 Produto X PES
2 10 10
2 Produto Y PES
2 20 10
3 Produto Z PES
3 10 10
10 Informatização ADM
3 30 30
20 Reorganização MAT
4 20 15
30 Novos Benefícios ADM
4 30 20
Projeto 5 3 40
6 1 20
6 2 20
7 10 35
7 30 5
Trabalha_em 8 20 null
[DML] - Comando Select - order by
• Usamos o order by para ordenar os registros por uma ou várias colunas
específicas. Por padrão a ordenação será asc (ascendente), sendo
possível especificar desc (descendente) também.
Nome Salario
SELECT Nome, Salario João 30000

FROM Funcionario Fernando 40000


Alice 25000
ORDER BY Salario DESC; Jennifer 43000
Ronaldo 38000
Joice 25000
André 25000
Jorge 55000
[DML] - Comando Select - order by
• Usamos o order by para ordenar os registros por uma ou várias colunas
específicas. Por padrão a ordenação será asc (ascendente), sendo
possível especificar desc (descendente) também.
Nome Salario Nome Salario
SELECT Nome, Salario João 30000 Jorge 55000

FROM Funcionario Fernando 40000 Jennifer 43000


Alice 25000 Fernando 40000
ORDER BY Salario DESC; Jennifer 43000 Ronaldo 38000
Ronaldo 38000 João 30000
Joice 25000 Alice 25000
André 25000 Joice 25000
Jorge 55000 André 25000
[DML] - Comando Select - distinct
• Usamos o distinct para eliminar registros duplicados.

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 Salario


SELECT DISTINCT Salario Jorge 55000 55000
FROM Funcionario Jennifer 43000 43000
Fernando 40000 40000
ORDER BY Salario DESC; Ronaldo 38000 38000
João 30000 30000
Alice 25000 25000
Joice 25000
André 25000
[DML] - Comando Select
• É possível retornar valores computados.

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

SELECT Nome, Salario João 30000 PES


Fernando 40000 PES
FROM Funcionario Alice 25000 ADM

WHERE Depto IN (MAT, ADM); Jennifer 43000 ADM


Ronaldo 38000 PES
Joice 25000 PES
André 25000 ADM
Jorge 55000 MAT
[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 Nome Salario Depto

SELECT Nome, Salario João 30000 PES Alice 25000 ADM


Fernando 40000 PES Jennifer 43000 ADM
FROM Funcionario Alice 25000 ADM André 25000 ADM

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.

SELECT Nome, Salario Nome Salario

FROM Funcionario João 30000


Fernando 40000
WHERE Salario Alice 25000
BETWEEN (25000, 3000); Jennifer 43000
Ronaldo 38000
Joice 25000
André 25000
Jorge 55000
[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.

SELECT Nome, Salario Nome Salario Nome Salario

FROM Funcionario João 30000 João 30000


Fernando 40000 Alice 25000
WHERE Salario Alice 25000 Joice 25000
BETWEEN (25000, 3000); Jennifer 43000 André 25000
Ronaldo 38000
Joice 25000
André 25000
Jorge 55000
[DML] - Comando Select - like
• O operador like serve para especificar por aproximação um texto.
• “_” - uma ocorrência de qualquer caractere;
• “%” - nenhuma ou várias ocorrências de quaisquer caracteres.

Nome

João
SELECT Nome Fernando

FROM Funcionario Alice


Jennifer
WHERE Nome LIKE “Jo%”; Ronaldo
Joice
André
Jorge
[DML] - Comando Select - like
• O operador like serve para especificar por aproximação um texto.
• “_” - uma ocorrência de qualquer caractere;
• “%” - nenhuma ou várias ocorrências de quaisquer caracteres.

Nome Nome

João João
SELECT Nome Fernando Joice

FROM Funcionario Alice Jorge


Jennifer
WHERE Nome LIKE “Jo%”; Ronaldo
Joice
André
Jorge
[DML] - Comando Select - like
Exemplo:

SELECT Nome
FROM Funcionario Nome

WHERE Nome LIKE ‘%d_’; João


Fernando
Alice
Jennifer
Ronaldo
Joice
André
Jorge
[DML] - Comando Select - like
Exemplo:

SELECT Nome
FROM Funcionario Nome Nome

WHERE Nome LIKE ‘%d_’; João Fernando


Fernando Ronaldo
Alice
Jennifer
Ronaldo
Joice
André
Jorge
[DML] - Comando Select - is null
• Para checar se um valor é nulo, usamos o operador is null.

Nome Salario Superv


SELECT Nome, Salario João 30000 2

FROM Funcionario Fernando 40000 8


Alice 25000 4
WHERE Superv IS NULL; Jennifer 43000 8
Ronaldo 38000 1
Joice 25000 1
André 25000 4
Jorge 55000 null
[DML] - Comando Select - is null
• Para checar se um valor é nulo, usamos o operador is null.

Nome Salario Superv


SELECT Nome, Salario João 30000 2

FROM Funcionario Fernando 40000 8


Alice 25000 4
Nome Salario
WHERE Superv IS NULL; Jennifer 43000 8
Jorge 55000
Ronaldo 38000 1
Joice 25000 1
André 25000 4
Jorge 55000 null
[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.

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

SELECT COUNT(*) AS "N° func", João 2


Fernando 8
COUNT(Superv) AS "N° func supervisionados"
Alice 4

FROM Funcionario; Jennifer 8


Ronaldo 1
Joice 1
André 4
Jorge null
[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 N° func
N° func
supervisionados
SELECT COUNT(*) AS "N° func", João 2
Fernando 8 8 7
COUNT(Superv) AS "N° func supervisionados"
Alice 4

FROM Funcionario; Jennifer 8


Ronaldo 1
Joice 1
André 4
Jorge null
[DML] - Comando Select - agregação
• Temos as seguintes funções de agregação: COUNT(), MAX(), MIN(), SUM(), AVG()
• MAX retorna o valor máximo entre os valores de uma coluna.

Nome Salario

João 30000
SELECT MAX(Salario) AS “Maior Salário” Fernando 40000

FROM Funcionario; Alice 25000


Jennifer 43000
Ronaldo 38000
Joice 25000
André 25000
Jorge 55000
[DML] - Comando Select - agregação
• Temos as seguintes funções de agregação: COUNT(), MAX(), MIN(), SUM(), AVG()
• MAX retorna o valor máximo entre os valores de uma coluna.

Nome Salario

João 30000 Maior


SELECT MAX(Salario) AS “Maior Salário” Fernando 40000 Salário

FROM Funcionario; Alice 25000 55000


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.

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.

Nome Salario Menor


SELECT MIN(Salario) AS “Menor Salário” João 30000
Salário

FROM Funcionario; Fernando 40000


25000

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

SELECT Depto, AVG(Salario) João 30000 PES


Fernando 40000 PES
FROM Funcionario Alice 25000 ADM

GROUP BY Depto; Jennifer 43000 ADM


Ronaldo 38000 PES
Joice 25000 PES
André 25000 ADM
Jorge 55000 MAT
[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

SELECT Depto, AVG(Salario) João 30000 PES


Fernando 40000 PES
FROM Funcionario Alice 25000 ADM
Depto Salario

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.

Nome Salario Depto


SELECT Depto, COUNT(*)
João 30000 PES
FROM Funcionario Fernando 40000 PES

GROUP BY Depto Alice 25000 ADM


Jennifer 43000 ADM
HAVING COUNT(*) > 2; Ronaldo 38000 PES
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.

Nome Salario Depto


SELECT Depto, COUNT(*)
João 30000 PES
FROM Funcionario Fernando 40000 PES
Depto Count(*)
GROUP BY Depto Alice 25000 ADM
Jennifer 43000 ADM PES 4
HAVING COUNT(*) > 2; Ronaldo 38000 PES ADM 3

Joice 25000 PES


André 25000 ADM
Jorge 55000 MAT
[DML] - Comando Select - having/where
• WHERE - as linhas são filtradas antes de serem agrupadas;
• HAVING - as linhas são filtradas após serem agrupadas.

• 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

FROM Funcionario Alice F 25000


Jennifer F 43000
WHERE Salario > 25000 Ronaldo M 38000

GROUP BY Sexo; Joice F 25000


André M 25000
Jorge M 55000
[DML] - Comando Select - having/where
Exemplo 1:
Nome Sexo Salario Sexo AVG(Salario)

João M 30000 M 40750


SELECT Sexo, AVG(Salario) Fernando M 40000 F 43000

FROM Funcionario Alice F 25000


Jennifer F 43000
WHERE Salario > 25000 Ronaldo M 38000

GROUP BY Sexo; Joice F 25000


André M 25000
Jorge M 55000

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

FROM Funcionario Alice F 25000


Jennifer F 43000
GROUP BY Sexo Ronaldo M 38000

HAVING AVG(Salario) > 31000; Joice F 25000


André M 25000
Jorge M 55000
[DML] - Comando Select - having/where
Exemplo 2:
Nome Sexo Salario Sexo AVG(Salario)

João M 30000 M 37600


SELECT Sexo, AVG(Salario) Fernando M 40000

FROM Funcionario Alice F 25000


Jennifer F 43000
GROUP BY Sexo Ronaldo M 38000

HAVING AVG(Salario) > 31000; Joice F 25000


André M 25000
Jorge M 55000

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.

Nome Depto Cod Nome


SELECT F.Nome, D.Nome João PES ADM Administração

FROM Funcionario F Fernando PES MAT Matriz

Alice ADM PES Pesquisa


JOIN Departamento D Jennifer ADM

ON F.Depto = D.Cod; Ronaldo PES


Joice PES
André ADM
Jorge MAT
[DML] - Junções - inner join
Nome Depto Cod Nome

SELECT F.Nome, D.Nome João PES ADM Administração


MAT Matriz
FROM Funcionario F Fernando PES
PES Pesquisa
Alice ADM
JOIN Departamento D Jennifer ADM

ON F.Depto = D.Cod; Ronaldo PES


F.Nome D.Nome
Joice PES
João Pesquisa
André ADM
Fernando Pesquisa
Jorge MAT
Alice Administração
Jennifer Administração
Ronaldo Pesquisa
Joice Pesquisa
André Administração
Jorge Matriz
[DML] - Junções - inner join
• O mesmo resultado seria obtido da seguinte forma:

SELECT F.Nome, D.Nome


FROM Funcionario F, Departamento D
WHERE F.Depto = D.Cod;
[DML] - Junções - self join
• O self join é uma junção de uma tabela com ela mesma.

SELECT F1.Nome, Id Nome Superv

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.

SELECT F1.Nome, Id Nome Superv Nome Supervisor


1 João 2
F2.Nome AS ‘Supervisor’ 2 Fernando 8
João Fernando
Fernando Jorge
FROM Funcionario F1 3 Alice 4
Alice Jennifer
4 Jennifer 8
JOIN Funcionario F2 5 Ronaldo 1
Jennifer Jorge
Ronaldo João
ON F1.Superv = F2.id; 6 Joice 1
Joice João
7 André 4
André Jennifer
8 Jorge null
[DML] - Junções - left outer join
• A junção externa esquerda retorna todas as linhas da tabela à esquerda
além das que satisfaçam à condição de junção.
• As linhas sem uma igualdade à direita são completadas com valores
nulos.
Id Nome Superv

SELECT F1.Nome, 1 João 2


2 Fernando 8
F2.Nome AS ‘Supervisor’ 3 Alice 4

FROM Funcionario F1 4 Jennifer 8


5 Ronaldo 1
LEFT JOIN Funcionario F2 6 Joice 1

ON F1.Superv = F2.id; 7 André 4


8 Jorge null
[DML] - Junções - left outer join
• A junção externa esquerda retorna todas as linhas da tabela à esquerda
além das que satisfaçam à condição de junção.
• As linhas sem uma igualdade à direita são completadas com valores
nulos.
Id Nome Superv Nome Supervisor

SELECT F1.Nome, 1 João 2 João Fernando


2 Fernando 8 Fernando Jorge
F2.Nome AS ‘Supervisor’ 3 Alice 4 Alice Jennifer

FROM Funcionario F1 4 Jennifer 8 Jennifer Jorge


5 Ronaldo 1 Ronaldo João
LEFT JOIN Funcionario F2 6 Joice 1 Joice João

ON F1.Superv = F2.id; 7 André 4 André Jennifer


8 Jorge null Jorge null
[DML] - Junções - right outer join
• A junção externa direita retorna todas as linhas da tabela à direita além
das que satisfaçam à condição de junção.
• As linhas sem uma igualdade à direita são completadas com valores
nulos.
• Adicionando um departamento sem funcionários (VEN), teremos:
Nome Depto

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

SELECT F.Nome, João PES


Fernando PES
D.Nome AS “Depto” Alice ADM

FROM Funcionario F Jennifer ADM


Ronaldo PES
RIGHT JOIN Departamento D Joice PES

ON F.Depto = D.Cod; André ADM


Jorge MAT

Cod Nome
ADM Administração
MAT Matriz
PES Pesquisa
VEN Vendas
[DML] - Junções - right outer join
Nome Depto

SELECT F.Nome, João PES


Nome Depto
Fernando PES
D.Nome AS “Depto” Alice ADM
André Administração

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;

• Representa uma outra forma de consultar dados de diferentes tabelas;

• 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

• Retornam zero ou mais itens


• Operador IN ou comparação com ANY/ALL

• Teste de existência
• Operador EXISTS
[DML] - Subconsultas - in id Num Horas

1 1 32.5
1 2 7.5

SELECT id, Nome 2 2 10


2 3 10
FROM Funcionario 2 10 10

WHERE id NOT IN ( Id Nome 2 20 10

1 João 3 10 10
SELECT id 2 Fernando 3 30 30

FROM Trabalha_em 3 Alice 4 20 15

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

SELECT id, Nome 2 2 10


2 3 10
FROM Funcionario 2 10 10

WHERE id NOT IN ( Id Nome 2 20 10 Id Nome

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

SELECT Nome João 30000 PES


Fernando 40000 PES
FROM Funcionario Alice 25000 ADM

WHERE Salario > ANY ( Jennifer 43000 ADM


Ronaldo 38000 PES
SELECT Salario Joice 25000 PES

FROM Funcionario André 25000 ADM


Jorge 55000 MAT
WHERE Depto = “PES”
);
[DML] - Subconsultas - any
Nome Salario Depto Nome Salario Depto
SELECT Nome João 30000 PES João 30000 PES

FROM Funcionario Fernando 40000 PES Fernando 40000 PES


Alice 25000 ADM Jennifer 43000 ADM
WHERE Salario > ANY ( Jennifer 43000 ADM Ronaldo 38000 PES

SELECT Salario Ronaldo 38000 PES Jorge 55000 MAT


Joice 25000 PES
FROM Funcionario André 25000 ADM

WHERE Depto = “PES” Jorge 55000 MAT

);
[DML] - Subconsultas - all
• O operador ALL retornará verdadeiro se, para todos os elementos a
condição seja verdadeira.
• Retornando falso caso contrário.

SELECT Nome Nome Salario Depto

Fernando 40000 PES


FROM Funcionario Ronaldo 38000 PES

WHERE Salario >= ALL ( João 30000 PES


Joice 25000 PES
SELECT Salario Alice 25000 ADM

FROM Funcionario Jennifer 43000 ADM


André 25000 ADM
WHERE Depto = “PES” Jorge 55000 MAT

);
[DML] - Subconsultas - all
• O operador ALL retornará verdadeiro se, para todos os elementos a
condição seja verdadeira.
• Retornando falso caso contrário.

SELECT Nome Nome Salario Depto

Fernando 40000 PES


FROM Funcionario Ronaldo 38000 PES
Nome Salario Depto
WHERE Salario >= ALL ( João 30000 PES
Fernando 40000 PES
Joice 25000 PES
SELECT Salario Alice 25000 ADM
Jennifer 43000 ADM
Jorge 55000 MAT
FROM Funcionario Jennifer 43000 ADM
André 25000 ADM
WHERE Depto = “PES” Jorge 55000 MAT

);
[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

SELECT Nome Id Nome 1 1 32.5


2 10 10
FROM Funcionario f 1 João
2 20 10
2 Fernando
WHERE EXISTS ( 3 Alice
3 30 30
4 20 15
SELECT * 4 Jennifer
4 30 20
5 Ronaldo
FROM Trabalha_em t 6 Joice
5 3 40
6 1 20
WHERE f.id = t.id 7 André
6 2 20
8 Jorge
AND t.Num = 20 7 10 35

); 8 20 null
[DML] - Subconsultas - exists
• Selecionando funcionários que trabalham no projeto de Número 20.

SELECT Nome id Num Horas

FROM Funcionario f Id Nome 1 1 32.5 Id Nome


2 10 10
1 João 2 Fernando
WHERE EXISTS ( 2 Fernando
2 20 10
4 Jennifer
SELECT * 3 Alice
3 30 30
8 Jorge
4 20 15
4 Jennifer
FROM Trabalha_em t 5 Ronaldo
4 30 20

WHERE f.id = t.id 6 Joice


5 3 40
6 1 20
7 André
AND t.Num = 20 8 Jorge
6 2 20

); 7 10 35
8 20 null
[DML] - Subconsultas - exists
• Intersecção: funcionários cujos departamentos possuem projetos.

SELECT Nome Nome Depto

FROM Funcionario f João PES Nome Depto

Fernando PES Produto X PES


WHERE EXISTS ( Alice ADM Produto Y PES

SELECT * Jennifer ADM Produto Z PES

Ronaldo PES Informatização ADM


FROM Projeto Joice PES Reorganização MAT

WHERE f.depto = p.depto André ADM Novos Benefícios ADM

Jorge MAT
);
[DML] - Subconsultas - exists
• Intersecção: funcionários cujos departamentos possuem projetos.

SELECT Nome Nome Depto Nome Depto

FROM Funcionario f João PES Nome Depto João PES


Fernando PES Produto X PES Fernando PES
WHERE EXISTS ( Alice ADM Produto Y PES Alice ADM
SELECT * Jennifer ADM Produto Z PES Jennifer ADM
Ronaldo PES Informatização ADM Ronaldo PES
FROM Projeto Joice PES Reorganização MAT Joice PES
WHERE f.depto = p.depto André ADM Novos Benefícios ADM André ADM
Jorge MAT Jorge MAT
);
[DML] - Subconsultas - exists
• Diferença: funcionários cujos departamentos não possuem projetos.

SELECT Nome Nome Depto

FROM Funcionario f João PES Nome Depto

Fernando PES Produto X PES


WHERE NOT EXISTS ( Alice ADM Produto Y PES

SELECT * Jennifer ADM Produto Z PES

Ronaldo PES Informatização ADM


FROM Projeto Joice PES Reorganização MAT

WHERE f.depto = p.depto André ADM Novos Benefícios ADM

Jorge MAT
);
[DML] - Subconsultas - exists
• Diferença: funcionários cujos departamentos não possuem projetos.

SELECT Nome Nome Depto

FROM Funcionario f João PES Nome Depto

Fernando PES Produto X PES


WHERE NOT EXISTS ( Alice ADM Produto Y PES

SELECT * Jennifer ADM Produto Z PES Nome Depto

Ronaldo PES Informatização ADM


FROM Projeto Joice PES Reorganização MAT

WHERE f.depto = p.depto André ADM Novos Benefícios ADM

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).

Id Nome Num Nome


SELECT Nome FROM Funcionario f id Num
5 Ronaldo 1 Produto X
WHERE NOT EXISTS ( 6 Joice
9 1
2 Produto Y
9 2
SELECT * FROM Projeto p 7 André
9 3
3 Produto Z
10 Informatização
WHERE NOT EXISTS ( 8 Jorge
9 10
9 Maria 20 Reorganização
SELECT * FROM Trabalha_em t 9 20
30 Novos Benefícios
9 30
WHERE f.id = t.id
AND p.Num = t.NUM
));
[DML] - Subconsultas - exists
• Divisão: funcionários que trabalham em todos os projetos.
• (Adicionando um funcionário para o exemplo).

Id Nome Num Nome


SELECT Nome FROM Funcionario f id Num
5 Ronaldo 1 Produto X
WHERE NOT EXISTS ( 6 Joice
9 1
2 Produto Y
9 2
SELECT * FROM Projeto p 7 André
9 3
3 Produto Z
10 Informatização
WHERE NOT EXISTS ( 8 Jorge
9 10
9 Maria 20 Reorganização
SELECT * FROM Trabalha_em t 9 20
30 Novos Benefícios
9 30
WHERE f.id = t.id
AND p.Num = t.NUM
Nome
)); Maria
[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)
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).

Você também pode gostar

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy