FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram...
Transcript of FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram...
Profa. Msc. Fernanda Lígia Rodrigues Lopes
SQL
Disciplina: Fundamentos de Banco de Dados
� O que é SQL? � Breve Histórico da SQL � Usos da SQL � Comandos SQL – DDL � Comandos SQL – DML � Comandos para consultas SQL � Resumo dos comandos SQL � Referências
Roteiro
� SQL é sigla para Structured Query Language - Linguagem de Consulta Estruturada.
� Apesar do Query (Consulta) no nome da linguagem, não é uma linguagem apenas de consulta, pois permite: � Definição de Dados (DDL). � Manipulação de dados (DML) .
SQL
� Linguagem fundamentada no modelo relacional (álgebra relacional e cálculo relacional) � É a linguagem padrão para consulta a bancos de dados
relacionais. � Um dos motivos do sucesso dos bancos relacionais
comercialmente. � A ideia é que se trocarmos de SGBD, não tenhamos que
mexer em todas as consultas e definições do banco, pois a linguagem é padrão.
� No entanto, cada implementação de SQL pode possuir algumas adaptações para resolver certas particularidades do SGBD alvo (específico). Ou seja, os fabricantes de SGBDs podem estender a SQL.
SQL
� Primeira versão: SEQUEL, definida por Chamberlain em 1974 na IBM.
� Em 1975, foi implementado o primeiro protótipo. � Revisada e ampliada entre 1976 e 1977 e teve seu nome
alterado para SQL por razões jurídicas. � Em 1982, o American National Standard Institute (ANSI) tornou a
SQL o padrão oficial de linguagem em ambiente relacional. � A primeira versão padrão da SQL foi concebida em 1986. � Alguns ajustes e atualizações foram realizados e, em 1992, uma
segunda versão da SQL foi lançada. Esta segunda versão ficou com o nome de SQL-92. Desse período até hoje, houve mais quatro revisões da linguagem, em 1999, 2003, 2006 e 2008.
SQL – Breve Histórico
� Por ser uma linguagem abrangente, os comandos da SQL podem ser dividos em subconjuntos:
Usos da SQL
S Q L
DDL
Criar (CREATE) Modificar (ALTER) Destruir (DROP) ...
DML Inserir (INSERT) Atualizar (UPDATE) Remover (DELETE)
Recuperação de dados SELECT
Controle de Transações
COMMIT ROLLBACK SAVEPOINT
Segurança Administração
GRANT REVOKE ...
� Exemplo para explicações
SQL
Data Definition Languagem (DDL) Linguagem de Definição de Dados
SQL - DDL
� Criando um esquema
� Nem todos os usuários são autorizados a criarem esquemas ou elementos de esquema, como tabelas e colunas, por exemplo.
� Os privilégios para esse tipo de ação devem ser concedidos às contas de usuário pelo administrador do sistema ou o pelo DBA (administrador do banco de dados).
SQL - DDL
CREATE SCHEMA <nome do esquema>;
CREATE SCHEMA <nome do esquema> AUTHORIZATION <usuário dono do esquema>;
ou
� Criando um esquema
� Há variações para o comando de criação de esquemas. Nos SGBDs mySQL e SQLServer, por exemplo, o comando utilizado para criar esquemas é:
� Para o nosso exemplo, o comando será:
SQL - DDL
CREATE DATABASE <nome do banco de dados>;
CREATE SCHEMA Empresa;
� Criando de tabelas
SQL - DDL
CREATE TABLE <nome da tabela> (<descrição dos atributos> <restrições>);
� Descrição dos atributos: <nome do atributo> <tipo do atributo>
� Tipos básicos da SQL para atributos (domínios): � Numérico � Corresponde aos números inteiros (INT, INTEGER ou
SMALLINT) e os de ponto flutuante (FLOAT, REAL ou DOUBLE). Os tipos numéricos podem ser declarados nos formatos DECIMAL(i,j), DEC(i,j) ou NUMERIC(i,j), onde i é a precisão e j é a escala. A precisão é o número total de dígitos do número. A escala é a quantidade de dígitos após o ponto decimal, ou seja, tem a ver com a parte fracionária do número.
SQL – DDL
� Tipos básicos da SQL para atributos (domínios): � Cadeia (sequencia) de caracteres � Podem ter tamanho fixo ou variável. Cadeias de tamanho fixo
são expressas pelo construtor CHAR(n), onde n é o número de caracteres da cadeia. As cadeias de tamanho variável são designadas por VARCHAR(n) ou CHARACTER VARYING(n), onde n é o tamanho máximo que uma cadeia pode possuir.
� Para colunas que possuem grandes valores de texto, como documentos, pode ser usado o tipo CHARACTER LARGE OBJECT ou CLOB. O tamanho máximo do CLOB pode ser especificado em kilobytes (K), megabytes (M) ou gigabytes (G).
SQL – DDL
� Tipos básicos da SQL para atributos (domínios): � Cadeia de bits � Pode ser de tamanho fixo ou variável. Cadeias de tamanho
fixo são definidas pelo construtor BIT(n) e as de tamanho variável por BIT VARYING(n), onde n é o número máximo de bits.
� Para especificar colunas com grandes valores binários, como imagens, pode ser usado o construtor BINARY LARGE OBJECT ou BLOB. Assim como na cadeia de caracteres, especifica-se o tamanho máximo em kilobytes (K), megabytes (M) ou gigabytes (G).
SQL – DDL
� Tipos básicos da SQL para atributos (domínios): � Booleano � Admite os valores verdadeiro (true) ou falso (false). O
valor pode ainda ser desconhecido, uma vez que a coluna pode não estar preenchida.
SQL – DDL
� Tipos básicos da SQL para atributos (domínios): � Data:
� O tipo DATE (data) possui dez posições e seus componentes são dia (DAY), mês (MONTH) e ano (YEAR), na forma DD-MM-YYYY. Já o tipo TIME (tempo) possui oito posições com os componentes hora (HOUR), minutos (MINUTES) e segundos (SECOND) na forma HH:MM:SS.
� Somente dias e horas válidas são permitidas na implementação da SQL. � Alguns tipos de data possuem ainda o termo TIME WITH TIME ZONE.
Nesse caso, são adicionadas seis posições para especificar o deslocamento com base no fuso horário universal padrão. Caso o termo WITH TIME ZONE não seja incluído, o valor padrão é o fuso horário local. Exemplos de declarações de data e hora: DATE ‘20-04-2013’ ou TIME ‘09:12:47’. O tempo pode ainda ser especificado nas escadas de 12 ou 24 horas.
SQL – DDL
� Tipos básicos da SQL para atributos (domínios): � Timestamp � O TIMESTAMP (marcador de tempo) engloba os
tipos DATE e TIME, com mais seis posições para o WITH TIME ZONE. Exemplo de declaração de TIMESTAMP: ‘25-04-2013 10:15:07’.
� Observação: Os tipos mencionados são os principais da especificação da SQL. Pode haver outros tipos em diferentes implementações da SQL por fabricantes de SGBDs.
SQL – DDL
� É possível criar um novo domínio para um atributo, se necessário.
� Por exemplo, podemos criar novos domínios para TIPO_CPF (sendo um CHAR de tamanho 11) ou TIPO_SEXO (um CHAR possuindo os valores feminino ou masculino). Assim, quando formos declarar atributos desse tipo, utilizaremos tais domínios criados, ao invés dos tipos da SQL. A instrução para criar um domínio diretamente é a CREATE DOMAIN.
SQL – DDL
CREATE DOMAIN TIPO_CPF AS CHAR(11);
� Descrição das restrições � As restrições de chave, de integridade de entidade e de
integridade referencial podem ser criadas no momento da criação da tabela, logo após a criação dos atributos. Tais restrições também podem ser criadas depois, através do comando ALTER TABLE.
� Durante a criação de uma tabela, algumas chaves estrangeiras podem gerar um erro, caso se refiram a tabelas que ainda não foram criadas. Nessa situação, as restrições devem ser omitidas do CREATE TABLE e criadas posteriormente (no ALTER TABLE).
SQL – DDL
� Descrição das restrições � Chaves: Chave Primária
� Caso se queira, a PK pode ser definida como sendo auto incrementada automaticamente. Cada fabricante de SGBD tem a forma de declarar o auto incremento. � PostgreSQL: tipo serial � MySQL: auto_increment
SQL – DDL
CONSTRAINT <nome_da_restrição> PRIMARY KEY (<atributos>)
<descrição do atributo> PRIMARY KEY
PRIMARY KEY(<atributos>)
Restrição criada explicitamente
ou
ou
� Descrição das restrições � Chaves: Chave Candidata
SQL – DDL
<descrição do atributo> UNIQUE
CONSTRAINT <nome_da_restrição> UNIQUE (<atributos>)
UNIQUE(<atributos>)
Restrição criada explicitamente
ou
ou
� Descrição das restrições � Chaves: Chave Estrangeira
SQL – DDL
CONSTRAINT <nome_da_restrição> FOREIGN KEY (<atributos FK>) REFERENCES <tabela onde está a PK> (<atributos PK>)
FOREIGN KEY (<atributos FK>) REFERENCES <tabela onde está a PK> (<atributos PK>)
Restrição criada explicitamente
ou
� Descrição das restrições � Chaves: Chave Estrangeira � Como já vimos, quando tuplas são inseridas ou
modificadas, a restrição de integridade referencial pode ser violada.
� A opção padrão é impedir a operação (RESTRICT) � Podemos especificar o que fazer através do ON
DELETE e ON UPDATE. Opções: � SET NULL � CASCADE � SET DEFAULT
SQL – DDL
� Descrição das restrições � Definindo NOT NULL para atributos � <nome do atributo> <tipo> NOT NULL � Utilizamos quando não quisermos que o atributo
assuma valor nulo. � Quando não especificamos, o padrão é permitir nulo
(NULL)
SQL – DDL
� Descrição das restrições � Definindo valores DEFAULT (padrões) para
atributos � Quando um atributo possuir um valor padrão, podemos
definir tal valor no momento da criação do atributo:
� Observe que a palavra NOT NULL é opcional.
SQL – DDL
<descrição do atributo> [NOT NULL] DEFAULT <valor padrão>
� Descrição das restrições � Definindo valores permitidos com CHECK � O CHECK Permite verificar se os valores de um
atributo estão conforme o esperado. � Exemplo 1: o salário não pode ser inferior ao valor
do salário mínimo. � Exemplo 2: a data de criação do departamento não pode ser
maior que data de início do gerente no departamento.
SQL – DDL
CONSTRAINT <nome da restrição> CHECK (salario >= 678)
CONSTRAINT <nome da restrição> CHECK (dep_data_cricao <= data_inicio_gerente)
� A cláusula CHECK + DOMAIN � A cláusula CHECK pode ser usada em conjunto
com a instrução CREATE DOMAIN. � Exemplo: Os números dos departamentos devem
estar entre 1 e 20.
SQL – DDL
CREATE DOMAIN D_NUM AS INTEGER CHECK (D_NUM > 0 AND D_NUM <21);
� Exemplo para o esquema exibido � Tabela Funcionario
SQL – DDL
CREATE TABLE Empresa.Funcionario (CPF CHAR (11) PRIMARY KEY , Pnome VARCHAR (20) NOT NULL, Minicial VARCHAR (20), Unome VARCHAR (20) NOT NULL, Datanasc DATE NOT NULL, Endereco VARCHAR (50), Sexo CHAR (1) NOT NULL, Salario NUMERIC (10,2), CPF_supervisor CHAR(11), Dnr INTEGER, CONSTRAINT ck_sexo CHECK (sexo IN (‘F’, ‘M’)) );
� Exemplo para o esquema exibido � Tabela Departamento
SQL – DDL
CREATE TABLE Departamento ( Dnumero INTEGER PRIMARY KEY , Dnome VARCHAR (20) NOT NULL UNIQUE, CPF_gerente CHAR(11) NOT NULL DEFAULT ‘00437887878’, Data_inicio_gerente DATE, CONSTRAINT departamento_fk1 FOREIGN KEY (CPF_gerente) REFERENCES Funcionario (CPF) ON UPDATE CASCADE ON DELETE SET DEFAULT );
� Exemplo para o esquema exibido � Tabela Localizacoes_Dep
SQL – DDL
CREATE TABLE Localizacoes_Dep ( Dnumero INTEGER, Dlocal VARCHAR (30) NOT NULL, PRIMARY KEY (Dnumero, Dlocal), FOREIGN KEY (Dnumero) REFERENCES Departamento (Dnumero) ON UPDATE CASCADE ON DELETE CASCADE );
� Exemplo para o esquema exibido � Tabela Projeto
SQL – DDL
CREATE TABLE Projeto ( Projnumero INTEGER, Projnome VARCHAR (30) NOT NULL, Projlocal VARCHAR (40), Dnum INTEGER NOT NULL, CONSTRAINT Projeto_pk PRIMARY KEY (Projnumero), CONSTRAINT Projeto_fk1 FOREIGN KEY (Dnum) REFERENCES Departamento (Dnumero) );
� Exemplo para o esquema exibido � Tabela Trabalha_Em
SQL – DDL
CREATE TABLE Trabalha_Em ( Fcpf CHAR(11), Pnr INTEGER NOT NULL, Horas NUMERIC (2,1), CONSTRAINT Trabalha_Em_pk PRIMARY KEY (Fcpf,Pnr), CONSTRAINT Trabalha_Em_fk1 FOREIGN KEY (Fcpf) REFERENCES Funcionario (CPF), CONSTRAINT Trabalha_Em_fk2 FOREIGN KEY (Pnr) REFERENCES Projeto(Projnumero) );
� Exemplo para o esquema exibido � Tabela Dependente
SQL – DDL
CREATE TABLE Dependente ( Fcpf CHAR (11), nome_dependente VARCHAR (50) NOT NULL, datanasc DATE NOT NULL, sexo CHAR (1) NOT NULL, parentesco VARCHAR (20) NOT NULL, CONSTRAINT ck_sexo CHECK (sexo IN (‘F’, ‘M’)), CONSTRAINT Dependente_pk PRIMARY KEY (Fcpf,nome_dependente), CONSTRAINT Dependente_fk1 FOREIGN KEY (Fcpf) REFERENCES Funcionario (CPF) ON DELETE CASCADE ON UPDATE CASCADE );
� Alterando tabelas � Alterar definições de tabelas existentes → ALTER TABLE � Permite inserir/eliminar/modificar elementos da
definição de uma tabela
SQL - DDL
ALTER TABLE <nome da tabela> <ação>;
� Alterando tabelas � Exemplos � Acrescentar coluna na tabela Funcionario
� Remover coluna na tabela Funcionario
SQL - DDL
ALTER TABLE Funcionario ADD (Diploma VARCHAR(20));
ALTER TABLE Funcionario DROP (Diploma);
� Alterando tabelas � Acrescentando uma chave primária
� Removendo uma chave primária
SQL - DDL
ALTER TABLE <nome da tabela> ADD PRIMARY KEY (<atributos>);
ALTER TABLE <nome da tabela> ADD CONSTRAINT <nome_da_restrição> PRIMARY KEY (<atributos>)
ou
ALTER TABLE <nome da tabela> DROP PRIMARY KEY;
� Alterando tabelas � Acrescentando uma chave estrangeira
� Removendo uma chave estrangeira
SQL - DDL
ALTER TABLE <nome da tabela> ADD FOREIGN KEY (<atributos FK>) REFERENCES <tabela onde está a PK> (<atributos PK>)
ALTER TABLE <nome da tabela> ADD CONSTRAINT <nome_da_restrição> FOREIGN KEY (<atributos FK>) REFERENCES <tabela onde está a PK> (<atributos PK>)
ou
ALTER TABLE <nome da tabela> DROP FOREIGN KEY <nome_da_restrição_de_fk> ;
� Alterando tabelas � Adicionando uma restrição qualquer
� Removendo uma restrição qualquer (pk, fk, etc)
SQL - DDL
ALTER TABLE <nome da tabela> DROP CONSTRAINT <nome_da_restrição>;
ALTER TABLE <nome da tabela> ADD CONSTRAINT <nome_da_restrição> descrição da restrição
� Excluindo tabelas � Eliminar uma tabela que foi previamente criada → DROP
TABLE
� Exemplo:
� Observação: Os dados da tabela também são excluídos!
SQL - DDL
DROP TABLE <tabela>;
DROP TABLE Funcionario;
� Exemplo para o esquema exibido � Quando criamos a tabela Funcionario, não foi
possível criar as chaves estrangeiras relativas ao departamento e ao supervisor (que também é um funcionário), pois as tabelas ainda não haviam sido criadas, exista uma dependência.
� Agora podemos usar o comando ALTER TABLE
para completar a definição do nosso esquema.
SQL – DDL
� Exemplo para o esquema exibido
SQL – DDL
--Inserindo fk para supervisor ALTER TABLE Funcionario ADD CONSTRAINT Funcionario_fk1 FOREIGN KEY (CPF_supervisor) REFERENCES Funcionario (CPF); --Inserindo fk para departamento ALTER TABLE Funcionario ADD CONSTRAINT Funcionario_fk2 FOREIGN KEY (Dnr) REFERENCES Departamento (Dnumero);
Data Manipulation Languagem (DML) Linguagem de Manipulação de Dados
� Inserção de Dados em tabelas � Adicionar uma tupla em uma tabela → INSERT � Se a inserção for realizada em todos os atributos e na ordem em
que estão as colunas:
� Forma variante, caso queria se especificar explicitamente os atributos:
SQL - DML
INSERT INTO <nome_tabela> (<lista de atributos>) VALUES (<lista de valores>);
INSERT INTO <nome da tabela> VALUES (<lista de valores>);
� Inserção de Dados em tabelas � Exemplo:
SQL - DML
INSERT INTO Departamento (Dnumero, Dnome, CPF_gerente, Data_inicio_gerente) VALUES (1, ‘Recursos Humanos’, ‘0986754356’, ‘20-04-2011’);
� Atualização de Dados em tabelas � Com base nos critérios especificados, alterar valores de
campos de uma tabela → UPDATE
� Exemplo: Atualizar salário do funcionário 15 para R$2000,00
� Se a condição não for especificada, todas as tuplas da tabela são atualizadas. Cuidado!
SQL - DML
UPDATE <nome tabela> SET <nome atributo> = <valor> WHERE <expressão de condição>;
UPDATE Funcionario SET Salario = 2000.00 WHERE CPF = 15;
� Remoção de Dados em tabelas � Com base nos critérios especificados, remover dados de uma
tabela → DELETE
� Exemplo: Remover todos os funcionários com salário
superior a R$ 4000,00 e que trabalham no departamento 1.
� Se a condição não for especificada, todas as tuplas da tabela são removidas. Cuidado!
SQL - DML
DELETE FROM <tabela> WHERE <expressão de condição>;
DELETE FROM Funcionario WHERE Salario > 5000.00 AND Dnr = 1 ;
Recuperação de Dados (Consultas em SQL)
� Consultas básicas � Para consultar dados em uma tabela → SELECT � Uma consulta em SQL segue o seguinte padrão:
SQL - Consultas
SELECT <lista de atributos> FROM <lista de tabelas> [WHERE <condições de seleção>]
� Selecionando atributos (Projeção)
� Exemplo: Listar primeiro nome e salário de todos os funcionários.
Projeção - SELECT
SELECT <lista de atributos> FROM <tabela>;
SELECT Pnome, Salario FROM Funcionario;
� Selecionando todos os atributos
� Exemplo
� Observação: Deve ser usado com cautela pois pode comprometer o desempenho, pois seleciona tudo da tabela.
Projeção - SELECT
SELECT * FROM Funcionario;
SELECT * FROM <tabela>;
� Selecionando tuplas da tabela → cláusula WHERE
� Onde <condição> é: <condição> <nome atributo> <operador> <valor>
Seleção - WHERE
SELECT <lista de atributos> FROM <tabela> WHERE <condição>;
Uma constante, variável ou consulta aninhada
� Selecionando tuplas da tabela → cláusula WHERE
� Exemplos: � Listar nome e sexo dos funcionários do departamento 12
� Listar nome e sexo dos empregados do departamento 12 com salário maior que R$ 1.500,00
Seleção - WHERE
SELECT Pnome, Sexo FROM Funcionario WHERE Dnr = 12;
SELECT Pnome, Sexo FROM Funcionario WHERE Dnr = 12 AND Salario > 1500;
� Utilizando “Alias” (Apelidos) � Os apelidos substituem nomes de tabelas em
comandos SQL � Eles são definidos na cláusula FROM
Alias
SELECT D.Dnome FROM Departamento D WHERE D.DNumero = 10;
Alias
� Consultando dados de várias tabelas: Junção � Quando precisamos juntar dados de várias tabelas
baseados nos valores dos atributos de outra relação.
� Geralmente utilizamos as chaves estrangeiras para fazer as junções.
� Operador JOIN � As tabelas envolvidas são citadas na cláusula
FROM
Junção de tabelas
� Consultando dados de várias tabelas: Junção � É boa prática utilizar qualificadores de nomes (a qual tabela o
atributo pertence) para evitar ambiguidades, caso tabelas distintas tenham atributos com mesmo nome.
� Exemplo: suponha que haja o atributo “nome” tanto em Funcionario quanto em Departamento. Devemos referenciar os nomes de Funcionario e de Departamento para não causar confusão na consulta.
Junção de tabelas
Funcionario.Nome Departamento.Nome
� Exemplos � Listar o nome do funcionário e do departamento
no qual ele está alocado
� Listar os nomes dos departamentos que tem projetos
Junção de tabelas
SELECT F.PNome, D.DNome FROM Funcionario F, Departamento D WHERE F.Dnr = D.DNumero;
SELECT D.DNome FROM Departamento D, Projeto P WHERE P.Dnum = D.DNumero;
� Juntando mais de duas tabelas � Exemplos � Listar o nome dos funcionários, com o respectivo
departamento que trabalhem mais de 15 horas em algum projeto
Junção de tabelas
SELECT F.PNome, D.DNome FROM Funcionario F, Departamento D, Trabalha_em T WHERE T.Horas > 15 AND T.Fcpf = F.Cpf AND F.Dnr = D.DNumero;
� BETWEEN e NOT BETWEEN: substituem o uso dos operadores <= e >=
� Exemplo: Listar os nomes dos funcionários com salário entre R$ 1.500,00 e R$ 3.000,00
Operadores SQL
... WHERE <nome atributo> BETWEEN <valor1> AND <valor2>;
SELECT PNome FROM Funcionario WHERE Salario BETWEEN 1500 AND 3000;
� LIKE e NOT LIKE � A cláusula LIKE é responsável por comparar cadeias de
caracteres. � Operam como = e < >, utilizando os símbolos % (para
substituir uma palavra) e _ (para substituir um caractere)
Operadores SQL
...WHERE <nome atributo> LIKE <valor>;
� LIKE e NOT LIKE (continuação) � Exemplos:
� No primeiro exemplo, é recuperado o nome dos empregados que possuem a palavra “Benfica” em seu endereço.
� No segundo exemplo, é recuperado o nome dos empregados que nasceram no mês 11 (novembro)
� O operador NOT pode ser utilizado em conjunto com o LIKE (NOT LIKE), quando se quer recuperar tuplas que contenham a negação da condição de comparação entre as cadeias de caracteres.
Operadores SQL
SELECT nome FROM Empregado WHERE endereco like %Benfica%
SELECT nome FROM Empregado WHERE dt_nascimento like ‘_ _ 11_ _ _ _’
Substitui um número qualquer de caracteres
Substitui um único caractere
� IN e NOT IN: procuram dados que estão ou não contidos em um dado conjunto de valores
� Exemplo: Listar o nome e a data de nascimento dos
dependentes com grau de parentesco ‘M’ (mãe) ou ‘P’(pai).
Operadores SQL
... WHERE <nome atributo> IN <valores>;
SELECT Nome_dependente, Datanasc FROM Dependente WHERE Parentesco IN (‘M’, ‘P’);
� IS NULL e IS NOT NULL : identificam se o atributo tem valor nulo ou não.
� Exemplo: Listar os dados dos projetos que não tenham
local definido.
Operadores SQL
... WHERE <nome atributo> IS [NOT] NULL;
SELECT * FROM Projeto WHERE Projlocal IS NULL;
� Ordena os dados selecionados
� Exemplo 1: Listar todos os dados dos funcionários ordenados ascendentemente pelo primeiro nome.
� Exemplo 2: Listar todos os dados dos funcionários ordenados
descendentemente por salário.
A cláusula ORDER BY
SELECT <lista atributos> FROM <tabela> [WHERE <condição>]
ORDER BY <Nome atributo> {ASC | DESC};
SELECT * FROM Funcionario ORDER BY PNome;
SELECT * FROM Funcionario ORDER BY Salario DESC;
� Outro exemplo:
A cláusula ORDER BY
� Elimina valores repetidos do resultado de uma consulta. � Exemplo : Quais os diferentes salários dos funcionários?
A cláusula DISTINCT
SELECT DISTINCT Salario FROM Funcionario;
� Pode-se criar um campo que não pertença à tabela a partir de cálculos sobre atributos da tabela obtidas em uma consulta. � Uso de operadores aritméticos
Realizando cálculo com a Informação Selecionada
� Exemplo: Mostrar o novo salário dos funcionários calculado com base no reajuste de 60% para os que ganham abaixo de R$ 1.200,00.
Realizando cálculo com a Informação Selecionada
SELECT Nome, (Salario * 1.60) AS Novo_salario FROM Empregado WHERE Salario < 1200;
Renomear
� O resultado de uma consulta é utilizado por outra consulta, de forma encadeada e no mesmo comando SQL.
� O resultado do comando SELECT mais interno (subselect) é usado por outro SELECT mais externo para obter o resultado final.
� O SELECT mais interno (subconsulta ou consulta aninhada) pode ser usado apenas nas cláusulas e HAVING do comando mais externo ou em cálculos.
Consultas aninhadas (subconsultas)
� Subconsultas devem ser escritas entre parênteses ( ) � Existem 3 tipos de subconsultas � ESCALAR → Retornam um único valor � ÚNICA LINHA → Retornam várias colunas, mas apenas
uma única linha é obtida � TABELA → Retornam uma ou mais colunas e múltiplas
linhas
Consultas aninhadas (subconsultas)
subconsulta
� Exemplo 1 � Listar os funcionários que trabalham no departamento de
Informática
Consultas aninhadas (subconsultas)
SELECT CPF, PNome, Salario FROM Funcionario WHERE Dnr = (SELECT DNumero FROM Departamento WHERE Nome = ‘Informática’ );
� Exemplo 2 � Mais de um nível de aninhamento: Listar os dependentes dos
funcionários que trabalham no departamento de Informática
Consultas aninhadas (subconsultas)
SELECT PNome, Datanasc, Parentesco FROM Dependente WHERE Fcpf IN ( SELECT CPF FROM Funcionario WHERE Dnr = ( SELECT Dnumero FROM Departamento WHERE Dnome = ‘Informática’ ) );
� A condição de comparação ANY é utilizada para comparar um valor a uma lista ou subconsulta.
� Ele deve ser precedido por =, !=, >, <, <=, >= e seguido por uma lista ou subconsulta.
� O SOME e o ANY fazem exatamente a mesma coisa e podemos utilizar qualquer uma das expressões sem distinção.
� Essas expressões devem ser usadas com subconsultas que produzem uma única coluna de números.
Cláusulas ANY/SOME
� Exemplo 1: Selecione o CPF e o salário dos funcionários que possuem valor maior que R$ 2000 ou R$ 3000 ou R$ 4000.
� Exemplo 2: Listar o CPF e o salário dos funcionários cujos salários são
maiores do que o salário de pelo menos um funcionário do departamento 20.
Cláusulas ANY/SOME
SELECT CPF, Salario FROM Funcionario WHERE Salario > ANY (2000, 3000, 4000) ;
SELECT CPF, Salario FROM Funcionario WHERE Salario > SOME ( SELECT Salario FROM Funcionario WHERE Dnr = 20) ;
� A condição de comparação ALL é utilizada para comparar um valor a uma lista ou subconsulta.
� Ela deve ser precedida por =, !=, >, <, <=, >= e seguida por uma lista ou subconsulta.
� Essa expressão deve ser usada com subconsultas que produzem uma única coluna de números.
� Exemplo: Listar o CPF e o salário dos funcionários cujos salários são maiores do que o salário de todos os funcionário do departamento 15.
Cláusula ALL
SELECT CPF, Salario FROM Funcionario WHERE Salario > ALL (SELECT Salario
FROM Funcionario WHERE Dnr = 15) ;
� Permite especificar múltiplos valores na cláusula WHERE. � A cláusula é utilizada para comparar um valor a uma lista ou
subconsulta. � Procura um subconjunto.
� Exemplo: Listar o CPF e o salário dos funcionários que trabalham no departamento 10.
Cláusula IN
SELECT CPF, Salario FROM Funcionario WHERE Dnr IN (SELECT Dnumero
FROM Departamento WHERE Dnr = 10) ;
� Foram projetadas para uso apenas com subconsultas. � Sempre que uma condição na cláusula WHERE de uma consulta aninhada
referencia algum atributo de uma relação em uma consulta externa, dizemos que essas duas consultas estão correlacionadas.
� A função do EXISTS é verificar se o resultado de uma consulta aninhada correlacionada é vazio. Mais especificamente, o EXISTS irá recuperar cada tupla da relação da consulta interna que se relaciona com a tupla da consulta externa.
� NOT EXISTS funciona de maneira semelhante ao EXISTS, sendo a negação.
� EXISTS � Retorna TRUE ⇔ existe pelo menos uma linha produzida pela
subconsulta. � Retorna FALSE ⇔ a subconsulta produz uma tabela resultante vazia.
Cláusulas EXISTS e NOT EXISTS
� Exemplo 1: Listar o CPF dos funcionários que possuem algum dependente, ou seja, recuperar os funcionários que se correlacionam com algum dependente.
� Exemplo 2: Listar o CPF dos funcionários que não trabalham no departamento de Informática.
Cláusulas EXISTS e NOT EXISTS
SELECT F.CPF FROM Funcionario F WHERE EXISTS ( SELECT D.* FROM Depentente D WHERE F.CPF = D.Fcpf ) ;
SELECT E.CPF FROM Empregado E WHERE NOT EXISTS ( SELECT D.DNumero FROM Departamento D WHERE E.Dnr = D.DNumero AND D.DNome = ‘Informática’) ;
� Algumas consultas com comandos distintos podem recuperar um mesmo conjunto de tuplas. Dizemos que tais consultas são equivalentes.
� Exemplo: Recupere o CPF dos funcionários que trabalham no departamento financeiro. As consultas abaixo são equivalentes.
Equivalência de Consultas
SELECT E.CPF FROM Empregado E WHERE E.Dnr IN ( SELECT D.DNumero FROM Departamento D, Empregado E WHERE E.Dnr = D.DNumero AND D.DNome = ‘Financeiro’) ;
SELECT E.CPF FROM Departamento D, Empregado E WHERE E.Dnr = D.DNumero AND D.DNome = ‘Financeiro’ ;
� Algumas consultas com comandos distintos podem recuperar um mesmo conjunto de tuplas. Dizemos que tais consultas são equivalentes.
� A cláusula ORDER BY não pode ser usada em uma subconsulta � A lista de atributos especificados no SELECT de uma subconsulta
deve conter um único elemento (exceto para EXISTS) � Nomes de atributos especificados na subconsulta estão associados
às tabelas listadas na cláusula FROM da mesma � É possível referir-se a uma tabela da cláusula FROM da consulta
mais externa utilizando qualificadores de atributos (referância com “alias”).
� Quando a subconsulta é um dos operandos envolvidos em uma comparação, ela deve aparecer no lado direito da comparação.
Regras Genéricas de Subconsultas
� Utilização de funções sobre conjuntos � Disparadas a partir do SELECT � São funções que resumem as informações de várias
tuplas em uma única tupla. O SQL provê cinco funções de agregação que podem ser utilizadas em consultas.
Funções de Agregação
� MAX : Retorna o valor máximo entre o conjunto de valores de uma coluna em uma relação.
� MIN : Retorna o valor mínimo entre o conjunto de valores de uma coluna em uma relação.
� SUM: Retorna a soma dos valores de uma coluna em uma relação. � COUNT: Retorna o número de tuplas de uma relação. � AVG: Retorna a média aritmética dos valores de uma coluna em uma
relação.
Funções de Agregação
� Exemplo 1: � Selecione o maior valor de salário entre os funcionários
do departamento financeiro.
� Exemplo 2: � Selecione o menor valor de salário entre os funcionários
do departamento financeiro.
Funções de Agregação
SELECT MAX(F.Salario) FROM Funcionario F, Departamento D WHERE D.Dnumero = F.Dnr AND Dnome = ‘Financeiro’
SELECT MIN(F.Salario) FROM Funcionario F, Departamento D WHERE D.Dnumero = F.Dnr AND Dnome = ‘Financeiro’
� Exemplo 3: � Quanto funcionários do departamento financeiro ganham
mais de R$ 2000?
� Exemplo 4: � Retorne o valor da soma de todos os salários dos
funcionários do departamento financeiro.
Funções de Agregação
SELECT COUNT(F.*) FROM Funcionario F, Departamento D WHERE D.Dnumero = F.Dnr AND Dnome = ‘Financeiro’ AND F.Salario > 2000
SELECT SUM(F.Salario) FROM Funcionario F, Departamento D WHERE D.Dnumero = F.Dnr AND Dnome = ‘Financeiro’
� Exemplo 5: � Retorne a média dos salários dos funcionários do
departamento financeiro.
Funções de Agregação
SELECT AVG(F.Salario) FROM Funcionario F, Departamento D WHERE D.Dnumero = F.Dnr AND Dnome = ‘Financeiro’
� Funções agregadas podem estar em consultas aninhadas.
� Exemplo: Mostrar o valor do maior salário dos funcionários e o nome do funcionário que o recebe.
Funções de Agregação
SELECT PNome, Salario FROM Funcionario WHERE Salario IN (SELECT MAX (Salario) FROM Funcionario);
Consulta aninhada
� Em alguns casos, podemos querer aplicar as funções de agregação a subgrupos de tuplas de uma relação, de forma que os subgrupos sejam baseados em alguns valores de atributo.
� Por exemplo: � Qual salário médio dos funcionários em cada departamento? � Qual é o número de funcionários que trabalha em cada
projeto? � Nesses casos, precisamos particionar a relação em subconjuntos
ou grupos de tuplas que possuem o mesmo valor para determinados atributos, que são chamados de atributos agrupamento. Assim, podemos aplicar as funções de agregação a cada grupo separadamente.
Agrupamento: GROUP BY e HAVING
� A cláusula GROUP BY tem a finalidade de agrupar tuplas especificando os atributos de agrupamento.
� Esses atributos também devem aparecer na cláusula SELECT. Somente as funções de agregação podem aparecer no SELECT e não aparecerem no GROUP BY.
� Exemplo 1: Quantos funcionário do sexo masculino e do sexo feminino trabalham na empresa?
A Cláusula GROUP BY
SELECT Sexo, Count(*) FROM Funcionario GROUP BY Sexo;
Atributos do GROUP BY devem aparecer no SELECT
Exceção: Funções agregadas
� Resultado do Exemplo 1:
� Exemplo 2: Para cada departamento, recuperar o número do departamento, o número de funcionários no departamento e o salário médio no departamento.
A Cláusula GROUP BY
Sexo Count(*)
F 63
M 75
SELECT Dnr, Count(*), AVG (Salario) FROM Funcionario GROUP BY Dnr;
� Para o Exemplo 2: � As tuplas da tabela Funcionario são divididas em grupos: um grupo
correspondente a cada departamento (cada valor de Dnr). � As funções COUNT e AVG são aplicadas a cada grupo de tuplas. � Observe que a cláusula SELECT contém apenas o atributo de agrupamento
e as funções de agregação a serem aplicadas nos grupos.
A Cláusula GROUP BY
Agrupamento das tuplas pelo Dnr
Resultado da consulta
� Se houver valores nulos no atributo de agrupamento (funcionário sem departamento), é criado um grupo separado para todas as tuplas com valor NULL no atributo de agrupamento.
� Exemplo 3: Para cada projeto, recuperar o número do projeto, o nome do projeto e o número de funcionário que trabalham nesse projeto.
A Cláusula GROUP BY
SELECT Projnumero, Projnome, Count(*) FROM Projeto, Trabalham_em WHERE Projnumero = Pnr GROUP BY Projnumero, Projnome;
� Algumas vezes queremos queremos recuperar os valores das funções de agregação e do agrupamento somente para grupos que satisfazem certas condições. Ou seja: queremos aplicar condições sobre cada grupo!
� Para isso a cláusula HAVING deve ser utilizada em conjunto com o GROUP BY, logo em seguida deste.
� Somente os grupos que satisfazem a condição do HAVING são recuperados. Ou seja: HAVING serve para escolher grupos inteiros.
� Exemplo 4: Para cada projeto em que mais de dois funcionários trabalham, recupere o número e o nome do projeto e o número de funcionários que trabalham no projeto.
A Cláusula HAVING
SELECT Projnumero, Projnome, Count(*) FROM Projeto, Trabalham_em WHERE Projnumero = Pnr GROUP BY Projnumero, Projnome HAVING COUNT(*) > 2;
� Resultado do Exemplo 4:
A Cláusula HAVING Esses grupos não são selecionados pela condição da cláusula HAVING
� Observação! � Tanto o GROUP BY quanto o HAVING são aplicados
somente após a cláusula WHERE, após as condições de junção e demais condições.
� Primeiro, o SGBD seleciona as tuplas do WHERE e depois aplica HAVING.
Cláusulas GROUP BY e HAVING
� UNION � Une as tuplas de relações (oriundas de consultas). � Linhas duplicadas são removidas da tabela resultante. � As relações devem ser união compatíveis. � Exemplo: Selecione o CPF dos funcionários do departamento
de informática ou do departamento financeiro.
Operações de Conjuntos
SELECT F.CPF FROM Funcionario F, Departamento D WHERE D.Dnumero = F.Dnr AND Dnome = ‘Informática’ UNION SELECT F.CPF FROM Funcionario F, Departamento D WHERE D.Dnumero = F.Dnr AND Dnome = ‘Financeiro’
� UNION ALL � Une as tuplas de relações (oriundas de consultas). � Linhas duplicadas são mantidas da tabela resultante. � As relações devem ser união compatíveis. � Exemplo: Selecione o CPF dos funcionários do
departamento de informática ou do departamento financeiro.
Operações de Conjuntos
SELECT F.CPF FROM Funcionario F, Departamento D WHERE D.Dnumero = F.Dnr AND Dnome = ‘Informática’ UNION ALL SELECT F.CPF FROM Funcionario F, Departamento D WHERE D.Dnumero = F.Dnr AND Dnome = ‘Financeiro’
� INTERSECT � A cláusula INTERSECT tem como objetivo obter as interseções entre as tuplas
das relações (oriundas de consultas). Este operador também advém da teoria dos conjuntos.
� As tabelas unidas devem ser união compatíveis. � Exemplo: Selecione o nome dos projetos em que trabalhem tanto
funcionários cujos primeiros nomes sejam Luís quanto que sejam Marcos.
Operações de Conjuntos
SELECT P.Projnome FROM Projeto P, Funcionario F, Trabalha_em T WHERE P.ProjNumero = T.Pnr AND F.CPF = T.Fcpf AND F.Pnome = ‘Luís’ INTERSECT SELECT P.Projnome FROM Projeto P, Funcionario F, Trabalha_em T WHERE P.ProjNumero = T.Pnr AND F.CPF = T.Fcpf AND F.Pnome = ‘Marcos’
� EXCEPT (ou MINUS) � Diferença entre conjuntos. � Retira de uma relação os elementos que se repetem em outra relação. � Exemplo: Selecione o nome dos projetos em que trabalhem
funcionários cujos primeiros nomes sejam Cláudio e que não trabalhem funcionários com primeiro nome igual a Paulo.
Operações de Conjuntos
SELECT P.Projnome FROM Projeto P, Funcionario F, Trabalha_em T WHERE P.ProjNumero = T.Pnr AND F.CPF = T.Fcpf AND F.Pnome = ‘Cláudio’ EXCEPT SELECT P.Projnome FROM Projeto P, Funcionario F, Trabalha_em T WHERE P.ProjNumero = T.Pnr AND F.CPF = T.Fcpf AND F.Pnome = ‘Paulo’
� Entendendo Inner Join x Outer Join � Em SQL, algumas colunas podem possuir valor nulo em uma
tupla. Nesse caso, SQL considera que o valor é DESCONHECIDO.
� Portanto, temos três valores lógicos: VERDADEIRO, FALSO e DESCONHECIDO.
� Nas consultas seleção-projeção-junção somente as combinações de tuplas que avaliam a expressão lógica como VERDADEIRA são selecionadas. As junções internas (inner join) funcionam assim.
� Já as junções externas (outer join) podem retornar uma tupla mesmo que ela tenha um valor desconhecido (NULO).
Junção Externa (Outer Join)
� Inner join (às vezes chamada de "junção simples") � É uma junção de duas ou mais tabelas que retorna somente as tuplas que
satisfazem à condição de junção. O valor deve estar nas duas tabelas (tuplas comuns), se uma tupla é nula em alguma delas, não é retornada.
� Equivalente à junção natural. � É a que estudamos até agora. � Outra maneira de escrevê-la:
� Exemplo para uma consulta já exibida:
Junção Interna (Inner Join)
SELECT <atributos> FROM <tabela A> INNER JOIN <tabela B> ON <condição de junção>;
SELECT F.PNome, D.DNome FROM Funcionario F INNER JOIN Departamento D ON F.Dnr = D.DNumero;
� Outer join � Retorna todas as tuplas de uma tabela e as tuplas de outra
tabela somente se os campos de junção são iguais (condição de junção é encontrada).
� Para todas as tuplas de uma das tabelas que não tenha
nenhuma tupla correspondente na outra, pela condição de junção, é retornado null para todos os campos da lista do select que sejam colunas da outra tabela.
Junção Externa (Outer join)
� Outer join (continuação) � Para escrever uma consulta que executa uma outer join
das tabelas A e B e retorna todas as tuplas de A (tabela da esquerda), além das tuplas comuns, utilizamos:
Left Outer Join
SELECT <atributos> FROM <tabela A> LEFT [OUTER] JOIN <tabela B> ON <condição de junção>;
� Outer join (continuação) � Exemplo: Listar os nomes de todos os departamentos
da companhia e os nomes e locais dos projetos de esses departamentos são responsáveis.
� Essa consulta irá retornar todos os departamentos, mesmo os que não tenham projetos. Para os que possuem, os projetos são mostrados. Se utilizássemos o inner join, somente os departamentos com projetos seriam mostrados.
Left Outer Join
SELECT Departamento.DNome, Projeto.ProjNome, Projeto.Projlocal FROM Departamento LEFT OUTER JOIN Projeto ON Departamento.DNumero = Projeto.Dnum;
� Outer join (continuação) � Para escrever uma consulta que executa uma outer join
das tabelas A e B e retorna todas as tuplas de B (tabela da direita) além das tuplas comuns, utilizamos:
Right Outer Join
SELECT <atributos> FROM <tabela A> LEFT [OUTER] JOIN <tabela B> ON <condição de junção>;
� Outer join (continuação) � Exemplo: Listar os nomes dos departamentos da
companhia com os nomes e locais dos projetos de que são responsáveis e os nomes dos demais projetos.
� Essa consulta irá retornar todos os projetos, mesmo os que não estão vinculados a um departamento.
Right Outer Join
SELECT Departamento.DNome, Projeto.ProjNome, Projeto.Projlocal FROM Departamento RIGHT OUTER JOIN Projeto ON Departamento.DNumero = Projeto.Dnum;
� Outer join (continuação) � Para escrever uma consulta que executa uma outer join e
retorna todas as tuplas de A e B, estendidas com nulls se elas não satisfizerem à condição de junção, utilizamos:
Full Outer Join
SELECT <atributos> FROM <tabela A> FULL [OUTER] JOIN <tabela B> ON <condição de junção>;
� Outer join (continuação) � Exemplo: Listar os nomes de todos os departamentos da
companhia, os nomes e locais dos projetos de que sejam responsáveis e os nomes dos demais projetos.
� Essa consulta irá retornar todos os departamentos e todos os projetos e associar aqueles que possuem atributo de junção com os mesmos valores.
Full Outer Join
SELECT Departamento.DNome, Projeto.ProjNom, Projeto.Projlocal FROM Departamento FULL OUTER JOIN Projeto ON Departamento.DNumero = Projeto.Dnum;
� Equivalência em Outer Join � Por definição, pode-se concluir que uma junção à esquerda
entre duas relações A e B é equivalente a uma junção à direita entre B e A.
� Logo:
� É equivalente a:
Full Outer Join
SELECT <atributos> FROM <tabela A> LEFT [OUTER] JOIN <tabela B> ON <condição de junção>;
SELECT <atributos> FROM <tabela B> RIGHT [OUTER] JOIN <tabela A> ON <condição de junção>;
Resumo Geral dos comandos SQL
Resumo – Comandos SQL
DDL
Consultas
DML
� Sistemas de Banco de Dados. Autores: Elmasri e Natavathe. 6a edição, Pearson.
� Gerenciamento de Dados e Informação – Apresentação. Autores: Ana Carolina Salgado, Fernando Fonseca e Robson Fidalgo. Universidade Federal de Pernambuco, Centro de Informática (CIn –UFPE).
� Notas de aula de Banco de Dados I – Bernadette Lóscio - UFPE
� http://www.w3schools.com/sql
Referências