FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram...

Post on 18-Jul-2020

1 views 0 download

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