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

110
Profa. Msc. Fernanda Lígia Rodrigues Lopes SQL Disciplina: Fundamentos de Banco de Dados

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

Page 1: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

Profa. Msc. Fernanda Lígia Rodrigues Lopes

SQL

Disciplina: Fundamentos de Banco de Dados

Page 2: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 3: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 4: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 5: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

�  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

Page 6: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 7: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� Exemplo para explicações

SQL

Page 8: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

Data Definition Languagem (DDL) Linguagem de Definição de Dados

SQL - DDL

Page 9: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 10: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 11: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� Criando de tabelas

SQL - DDL

CREATE TABLE <nome da tabela> (<descrição dos atributos> <restrições>);

Page 12: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 13: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 14: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 15: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 16: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 17: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 18: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� É 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);

Page 19: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 20: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 21: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 22: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 23: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 24: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 25: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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>

Page 26: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versã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)

Page 27: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 28: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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’)) );

Page 29: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 30: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 31: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 32: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 33: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 34: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 35: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versã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);

Page 36: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 37: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 38: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 39: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versã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;

Page 40: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 41: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 42: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

Data Manipulation Languagem (DML) Linguagem de Manipulação de Dados

Page 43: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 44: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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’);

Page 45: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 46: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 47: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

Recuperação de Dados (Consultas em SQL)

Page 48: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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>]

Page 49: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versã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;

Page 50: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 51: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 52: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 53: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 54: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 55: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 56: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 57: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 58: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 59: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 60: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 61: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

�  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’);

Page 62: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 63: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 64: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� Outro exemplo:

A cláusula ORDER BY

Page 65: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 66: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 67: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 68: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 69: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 70: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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’ );

Page 71: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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’ ) );

Page 72: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 73: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 74: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 75: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 76: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

�  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

Page 77: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

�  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’) ;

Page 78: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

�  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’ ;

Page 79: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

�  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

Page 80: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 81: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versã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

Page 82: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versã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’

Page 83: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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’

Page 84: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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’

Page 85: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 86: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

�  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

Page 87: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

�  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

Page 88: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 89: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

�  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

Page 90: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 91: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 92: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� Resultado do Exemplo 4:

A Cláusula HAVING Esses grupos não são selecionados pela condição da cláusula HAVING

Page 93: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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

Page 94: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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’

Page 95: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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’

Page 96: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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’

Page 97: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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’

Page 98: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 99: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 100: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 101: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 102: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versã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;

Page 103: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 104: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versã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;

Page 105: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 106: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versã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;

Page 107: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

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

Page 108: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

Resumo Geral dos comandos SQL

Page 109: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

Resumo – Comandos SQL

DDL

Consultas

DML

Page 110: FBD - 20132 - 07 SQLif976/aulas/material_extra_SQL.pdf · Alguns ajustes e atualizações foram realizados e, em 1992, uma segunda versão da SQL foi lançada. Esta segunda versão

� 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