1 SQL (Structured Query Language) Linguagem padrão usada em BD relacionais –SQL1 ou SQL-86:...

Preview:

Citation preview

1

SQL (Structured Query Language) Linguagem padrão usada em BD relacionais

– SQL1 ou SQL-86: primeira versão do padrão.– SQL2 ou SQL-92: versão usada atualmente.– SQL3 ou SQL-99: versão que incorpora novos conceitos como

orientação a objetos, além de operações e tipos novos (boolean e e character, por exemplo).

A linguagem SQL:

– Linguagem de Definição de Dados (Data Definition Language - DDL)

– Linguagem de Manipulação de Dados (Data Manipulation Language - DML)

2

Linguagem de definição de dados (DDL) • Criação de esquemas: CREATE SCHEMA

• Criação de tabelas: CREATE TABLE

• Tipos de dados

• Criação de domínios: CREATE DOMAIN

• Restrições e valores default

• Remoção de esquemas: DROP SCHEMA

• Remoção de tabelas: DROP TABLE

• Alteração de tabelas: ALTER TABLE

3

Esquema • Serve para agrupar tabelas e outros elementos

(constraints, views, domínios) que pertencem a uma mesma aplicação de banco de dados.

• Pode ser associado a uma autorização para usá-lo:

• Catálogo: coleção de esquemas que possui um INFORMATION_SCHEMA, com informação sobre os elementos do esquema e usuários autorizados.– Restrições de integridade somente podem ser definidas entre

tabelas que pertencem ao mesmo catálogo.– Esquemas do mesmo catálogo podem compartilhar definições

de domínio.

CREATE SCHEMA BANCO AUTHORIZATION JSMITH;

4

Mapeamento para modelo relacional:Agencia(nroagencia,cidade)

Conta(nroagencia, nroconta, saldo)

Cliente_tem_Conta(nroagencia, nroconta, nrocliente)

Cliente(nrocliente, nome, idade, cidadeOrigem)

Exemplo: Esquema de uma aplicação bancária

cidade

nroagencia

nome

cidadeOrigemidade

nroclienteCliente

saldo

nroconta

N

AgênciaConta

Tem

M

PertenceN M

5

Criação de Tabelas

O esquema em que a tabela é declarada pode ser indicado:

CREATE TABLE nome_tabela( nome_coluna tipo [NOT NULL][SET DEFAULT value], ... PRIMARY KEY (nome_coluna) [CONSTRAINT (nome_restrição)] [UNIQUE (nome_coluna)] [FOREIGN KEY (nome_coluna) REFERENCES nome_tabela (nome_coluna) ON DELETE CASCADE/SET NULL/SET DEFAULT ON UPDATE CASCADE/SET NULL/SET DEFAULT]);

CREATE TABLE Banco.Agencia...

create table Agencia( nroagencia integer NOT NULL, cidade varchar2(30) NOT NULL, PRIMARY KEY(nroagencia));

6

Tipos de dados

• Numérico:– INTEGER (ou INT), SMALLINT– FLOAT, REAL, DOUBLE PRECISION– DECIMAL(i,j) ou DEC(i,j) ou NUMERIC(i,j), i é o total de dígitos

e j o número de casas decimais

• String/Caracter– Tamanho fixo: CHAR(n) ou CHARACTER(n)– Tamanho variável: VARCHAR(n), VARCHAR2(n) ou CHAR

VARYING(n)

• DATE (YYYY-MM-DD)• TIME (HH:MM:SS)• TIMESTAMP (time + date)

7

Domínios

• Pode-se criar domínios e usar como tipo de dados

• Criar a tabela Cliente

CREATE DOMAIN D_IDADE AS NUMERIC(2,0);

create table Cliente( nrocliente integer NOT NULL, nome varchar2(30) NOT NULL, idade D_IDADE, cidadeOrigem varchar2(15) NOT NULL DEFAULT = ‘Sao Carlos’, PRIMARY KEY(nrocliente));

8

Restrições (CONSTRAINTS) e Valores Default • NOT NULL• DEFAULT• PRIMARY_KEY• UNIQUE• FOREIGN KEY

• Restrições em ação referencial :– SET NULL, CASCADE,SET

DEFAULT

– evento: ON DELETE, ON UPDATE

CREATE TABLE EMPREGADO( NROEMP CHAR(2) NOT NULL, NOME VARCHAR(20) NOT NULL, SUPERVISOR CHAR(2), NRODEPTO INTEGER DEFAULT 1, CONSTRAINT EMPPK PRIMARY KEY (NROEMP), CONSTRAINT EMPSK FOREIGN KEY(SUPERVISOR) REFERENCES EMPREGADO(NROEMP)

ON DELETE SET NULL ON UPDATE CASCADE CONSTRAINT EMPDEPTO FOREIGN KEY(NRODEPTO) REFERENCES DEPTO(NRODEPTO)

ON DELETE SET DEFAULT ON UPDATE CASCADE);

9

Restrições (CONSTRAINTS) e Valores Default

Exercícios: • criar as tabelas Cliente e Agencia (Script tabelas1.sql)

@ C:\Scripts\tabelas1.sql• criar as tabelas Conta e Cliente_tem_Conta

Conta(nroagencia, nroconta, saldo)

Cliente_tem_Conta(nroagencia, nroconta, nrocliente)

Cliente(nrocliente, nome, idade, cidadeOrigem)

create table Conta( nroconta integer not null, nroagencia integer not null, primary key (nroconta,nroagencia), foreign key (nroagencia) references Agencia(nroagencia) );

10

Restrições (CONSTRAINTS) e Valores Default

Exercício: criar a tabela Cliente_tem_Conta

create table Cliente_tem_Conta( nrocliente integer not null, nroconta integer not null , nroagencia integer not null, primary key (nrocliente,nroconta,nroagencia), foreign key (nrocliente) references Cliente(nrocliente), foreign key (nroconta,nroagencia) references Conta (nroconta,nroagencia));

11

Remoção de esquemas e tabelas

• DROP SCHEMA: – RESTRICT: somente apaga o esquema, se ele estiver vazio– CASCADE: apaga o esquema e todos seus elementos

• DROP TABLE:

– RESTRICT: a tabela é apagada somente se ela não referenciada ou não estiver em nenhuma view

– CASCADE: a tabela é apagada, e todas as outras tabelas que a referenciam e views também são.

Quais tabelas serão apagadas?Resposta: Cliente_tem_Conta e Conta

DROP SCHEMA BANCO CASCADE;

DROP TABLE CONTA CASCADE;

12

Alteração de tabelas

• Adicionar ou remover atributos e restrições: ALTER TABLE– RESTRICT: a operação só se completa se não existirem views

ou restrições referenciando a coluna a ser removida.– CASCADE: apaga todas as visões e restrições que referenciam a

coluna a ser removida.

• Exercícios– Adicione a coluna CPF à tabela Cliente– Exclua a coluna CPF da tabela Cliente

ALTER TABLE Cliente ADD email varchar2(12);ALTER TABLE Cliente DROP COLUMN cidadeOrigem CASCADE; ALTER TABLE Cliente ALTER cidadeOrigem DROP DEFAULT;ALTER TABLE Cliente ALTER cidadeOrigem SET DEFAULT = ‘Sao Paulo’;

13

Linguagem de manipulação de dados (DML) • Inserção de dados: INSERT INTO• Atualização de dados: UPDATE• Exclusão de dados: DELETE FROM• Consulta de dados: SELECT

– WHERE

– Operadores aritméticos e ORDER BY

– Operadores lógicos, IN, NOT IN, IS NULL

– BETWEEN, LIKE

– Consultas aninhadas

– ALL, ANY

– EXISTS, NOT EXISTS

– UNION, INTERSECT, MINUS

– Tipos de JOIN

– Funções de agregação e agrupamento

14

Inserção e atualização de dados

• Inserir dados: INSERT INTO

– Inserindo uma agência

• Atualizar dados: UPDATE

– Atualizando uma agência

INSERT INTO nome_tabela [(lista_de_valores)]VALUES (Lista_de_Valores);

INSERT INTO Agencia(nroagencia, cidade)VALUES (1,‘Sao Carlos’);

UPDATE nome_tabela SET nome_coluna = valor, ...WHERE (condição);

UPDATE Agencia SET cidade = ‘Campinas’WHERE nroagencia = 1;

15

Exclusão de dados

• Excluir dados: DELETE FROM

– Excluindo agência 1

– Excluindo todas agências

• Exercícios:– Inserir clientes:

– Atualizar cliente 2 com idade = 60 e cidadeOrigem = ‘Sao Carlos’– Excluir cliente Joao

DELETE FROM nome_tabela[WHERE (condição)];

DELETE FROM AgenciaWHERE nroagencia = 1;

DELETE FROM Agencia;

nrocliente nome cidadeOrigem idade

1 Maria Sao Paulo 24

2 Joao Ribeirao Preto 50

16

Consulta de dados

SELECT [DISTINCT] coluna1, coluna2, … ,colunaNFROM tabela1, tabela2,...,tabelaN[WHERE condições][GROUP BY coluna1, coluna2,...,colunaN][HAVING (condições)][{INTERSECT | MINUS | UNION} commando_select][ORDER BY coluna {ASC | DESC}, …];

17

Relações dos exemplos e exercícios

Clientenrocliente nome cidadeOrigem idade

1 Maria Sao Paulo 24

2 Joao Ribeirao Preto 80

3 Jose Sao Paulo 50

4 Ana Campinas 45

5 Sebastiao Brotas 70

nroagencia cidade

1 Sao Carlos

2 Sao Carlos

3 Ibitinga

4 Campinas

Agencianroagencia nroconta saldo

1 1111 100

1 2222 200

2 3333 100

2 1111 50

Conta

Cliente_tem_Conta

nroAgencia nroConta nroCliente

1 1111 1

1 1111 2

1 2222 1

1 2222 3

2 3333 3

2 1111 4

18

SELECT e DISTINCT

• Obtenha uma listagem de todas as cidades de origem dos clientes.

– Álgebra relacional

– SQL

• Exercício: Obtenha uma listagem de todas as cidades em que existem agências

π(cidadeOrigem)(σ (Cliente) )

SELECT DISTINCT cidadeOrigem FROM Cliente;

19

SELECT e DISTINCT

• Obtenha uma listagem de todas as cidades de origem dos clientes.

– Álgebra relacional

– SQL

• Exercício: Obtenha uma listagem de todas as cidades em que existem agências

π(cidadeOrigem)(σ (Cliente) )

SELECT DISTINCT cidadeOrigem FROM Cliente;

SELECT DISTINCT cidade FROM Agencia;

20

WHERE, operador relacional, uso explícito de relações, uso de variáveis

• Obtenha o nome e a cidade de origem dos clientes com mais de 60 anos.

– Álgebra relacional

– SQL

π( nome, cidadeOrigem) (σ(idade>60) (Cliente) )

SELECT nome,cidadeOrigemFROM ClienteWHERE idade > 60;

21

WHERE, operador relacional, uso explícito de relações, uso de variáveis

• Obtenha o nome dos clientes cujo saldo é inferior a

R$200,00 t1 σ(saldo<200) (Conta)

t2 π(nrocliente) (t1 |x| Cliente_tem_Conta) (t1.nroagencia = Cliente_tem_Conta.nroagencia AND

t1.nroconta = Cliente_tem_Conta.nroconta)

resp π(nome) (t2 |x| (t2.nrocliente= Cliente.nrocliente) Cliente)

SELECT nomeFROM Cliente, Cliente_tem_Conta CTC, ContaWHERE Conta.saldo < 200AND CTC.nroconta = Conta.nrocontaAND CTC.nroagencia = Conta.nroagenciaAND Cliente.nrocliente = CTC.nrocliente;

22

WHERE, operador relacional, uso explícito de relações, uso de variáveis

• Exercício: Obtenha o saldo dos clientes, cuja idade é maior que 60 anos.

23

WHERE, operador relacional, uso explícito de relações, uso de variáveis

• Exercício: Obtenha o saldo dos clientes, cuja idade é maior que 60 anos.

SELECT saldoFROM Cliente, Cliente_tem_Conta CTC, ContaWHERE idade > 60AND CTC.nroconta = Conta.nrocontaAND CTC.nroagencia = Conta.nroagenciaAND Cliente.nrocliente = CTC.nrocliente;

24

Operador aritmético e ORDER BY(DESC/ASC) • Obtenha a renda mensal de cada conta (2% ao mês) em

ordem descrescente de renda.

• Exercício: Obtenha qual seria o valor de CPMF a ser pago, em ordem crescente, com a movimentação de todo o saldo da conta (Dado: CPMF = 0,38%)

SELECT nroagencia, nroconta, saldo*0.02 As RendaFROM ContaORDER BY Renda DESC;

25

Operador aritmético e ORDER BY(DESC/ASC) • Obtenha a renda mensal de cada conta (2% ao mês) em

ordem descrescente de renda.

• Exercício: Obtenha qual seria o valor de CPMF a ser pago, em ordem crescente, com a movimentação de todo o saldo da conta (Dado: CPMF = 0,38%)

SELECT nroagencia, nroconta, saldo*0.02 As RendaFROM ContaORDER BY Renda DESC;

SELECT nroagencia, nroconta, saldo*0.038 As cpmfFROM ContaORDER BY cpmf ASC;

26

Operador lógico, IN, NOT IN, IS NULL

• Obtenha as contas da agência 2 ou dos clientes cujo saldo seja R$100 ou 200 ou 300.

• Obtenha as contas cujo saldo seja nulo.

• Exercício: Obtenha as contas da agência 1, cujo saldo não seja R$100 nem 300 (Use NOT IN).

SELECT nroagencia, nrocontaFROM ContaWHERE nroagencia = 2OR saldo IN (100,200,300);

SELECT nroagencia,nrocontaFROM contaWHERE saldo IS NULL;

27

Operador lógico, IN, NOT IN, IS NULL

• Obtenha as contas da agência 2 ou dos clientes cujo saldo seja R$100 ou 200 ou 300.

• Obtenha as contas cujo saldo seja nulo.

• Exercício: Obtenha as contas da agência 1, cujo saldo não seja R$100 nem 300 (Use NOT IN).

SELECT nroagencia, nrocontaFROM ContaWHERE nroagencia = 2OR saldo IN (100,200,300);

SELECT nroagencia,nrocontaFROM contaWHERE saldo IS NULL;

SELECT nroagencia, nrocontaFROM ContaWHERE nroagencia = 1AND saldo NOT IN (100,300);

28

BETWEEN, LIKE

• Obtenha as cidades de origem dos clientes que possuam ‘José’ no nome e cuja idade esteja entre 50 e 70 anos.

• Selecionar o nome dos clientes que nasceram na década de 50.

• % e _ são usados somente com Strings (char, varchar).

SELECT DISTINCT cidadeOrigemFROM ClienteWHERE (idade BETWEEN 50 AND 70)AND nome LIKE ‘%Jose%’;

SELECT nomeFROM ClienteWHERE anoNascimento LIKE ’195_’;

29

Consultas aninhadas (SUB-SELECTS)

• Obtenha o número das agências em que a cliente ‘Maria’ tem conta.

• Exercício: Obtenha as cidades em que a cliente ‘Maria’ tem conta.

π(nroagencia) ( σ(nome=’Maria’) ( Cliente |x| Cliente_tem_Conta)) (Cliente.nrocliente= Cliente_tem_Conta.nrocliente)

SELECT nroagencia FROM Cliente_tem_Conta WHERE nrocliente IN (SELECT nrocliente FROM Cliente

WHERE nome = ‘Maria’);

30

Consultas aninhadas (SUB-SELECTS)

• Exercício: Obtenha as cidades em que a cliente ‘Maria’ tem conta.

SELECT DISTINCT cidade FROM AgenciaWHERE nroagencia IN (SELECT nroagencia FROM Cliente, Cliente_tem_Conta CTC

WHERE nome = ‘Maria’ AND Cliente.nrocliente = CTC.nrocliente);

31

ALL e ANY

• ALL: Selecione os nomes dos clientes que não possuam conta na agência 1.

• ANY: Selecione os nomes dos clientes que possuam pelo menos uma conta em qualquer agência de São Carlos.

SELECT nome FROM Cliente WHERE nrocliente <> ALL ( SELECT nrocliente FROM Cliente_Tem_Conta

WHERE nroagencia = 1);

SELECT nome FROM Cliente WHERE nrocliente IN ( SELECT nrocliente FROM Cliente_Tem_Conta WHERE nroagencia = ANY (SELECT nroagencia

FROM Agencia WHERE CIDADE = ‘Sao Carlos’));

32

EXISTS e NOT EXISTS

• Testa se o retorno de uma determinada consulta é ou não vazio.

– Obtenha os nomes dos clientes que tenham alguma conta.

– Exercício: Obtenha os nomes dos clientes que não tenham nenhuma conta (NOT EXISTS).

SELECT nome FROM Cliente CWHERE EXISTS( SELECT * FROM Cliente_Tem_Conta CTC WHERE C.nrocliente = CTC.nrocliente );

33

EXISTS e NOT EXISTS

• Testa se o retorno de uma determinada consulta é ou não vazio.

– Obtenha os nomes dos clientes que tenham alguma conta.

– Exercício: Obtenha os nomes dos clientes que não tenham nenhuma conta (NOT EXISTS).

SELECT nome FROM Cliente CWHERE EXISTS( SELECT * FROM Cliente_Tem_Conta CTC WHERE C.nrocliente = CTC.nrocliente );

SELECT nome FROM Cliente CWHERE NOT EXISTS( SELECT * FROM Cliente_Tem_Conta CTC WHERE C.nrocliente = CTC.nrocliente );

34

UNION, INTERSECT, MINUS • Obtenha os nomes dos clientes cuja idade seja menor que

60 ou a cidade de origem seja ‘Sao Paulo’.

• Exercícios:– Obtenha os nomes dos clientes cuja idade seja menor que 60 e a

cidade de origem seja ‘Sao Paulo’ (INTERSECT).– Obtenha os nomes dos clientes cuja idade seja menor que 60 e a

cidade de origem não seja ‘Sao Paulo’ (MINUS).

SELECT nome FROM Cliente WHERE idade < 60UNIONSELECT nome FROM Cliente WHERE cidadeOrigem=‘Sao Paulo’;

35

Tipos de JOIN

• INNER JOIN ou JOIN: deve-se especificar os atributos de junção, somente tuplas resultantes são retornadas.

– Obtenha os nomes dos clientes cujo número da conta é 1.

• NATURAL JOIN: Junção automática sobre campos do mesmo tipo e com mesmo nome.

– Obtenha os números das contas dos clientes cuja idade seja 24 anos.

SELECT nome FROM (Cliente JOIN (Cliente_tem_Conta CTC) ON Cliente.nrocliente = CTC.nrocliente)WHERE nroconta = 1;

SELECT nroconta, nroagencia FROM (Cliente NATURAL JOIN Cliente_tem_Conta)WHERE idade = 24;

36

Tipos de JOIN

• LEFT OUTER JOIN , RIGHT OUTER JOIN, FULL OUTER JOIN: conserva o lado especificado.

– Obtenha todas as agências existentes, e suas respectivas contas.

SELECT *FROM (Agencia LEFT OUTER JOIN Conta ON Agencia.nroagencia = Conta.nroagencia);

nroagencia cidade nroagencia nroconta saldo

1 Sao Carlos 1 1111 100

1 Sao Carlos 1 2222 200

2 Sao Carlos 2 3333 100

2 Sao Carlos 2 1111 50

3 Ibitinga - - -

4 Campinas - - -

37

Funções de Agregação e Agrupamento

• SUM, MIN, MAX, AVG, COUNT• GROUP BY: agrupa por campos, esses campos devem

aparecer na cláusula SELECT.• HAVING: permite estabelecer condições sobre as funções

de agrupamento.– Obtenha a média dos saldos dos clientes por agência.

– Obtenha as agências cujo total de dinheiro seja maior que R$100.

SELECT nroagencia, AVG(saldo)FROM ContaGROUP BY nroagencia;

SELECT nroagencia, SUM(saldo) FROM ContaGROUP BY nroagenciaHAVING SUM(saldo) > 100;

38

Funções de Agregação e Agrupamento

– Selecione os nomes dos clientes que possuam pelo menos duas contas.

– Exercício: Obtenha a média dos saldos por agência, considerando no resultado somente as agências que tenham contas com saldo maior que R$50.

SELECT nome FROM ClienteWHERE nrocliente IN ( SELECT nrocliente FROM Cliente_Tem_Conta GROUP BY nrocliente HAVING COUNT(nroconta) >= 2);

39

Funções de Agregação e Agrupamento

– Selecione os nomes dos clientes que possuam pelo menos duas contas.

– Exercício: Obtenha a média dos saldos por agência, considerando no resultado somente as agências que tenham contas com saldo maior que R$50.

SELECT nome FROM ClienteWHERE nrocliente IN ( SELECT nrocliente FROM Cliente_Tem_Conta GROUP BY nrocliente HAVING COUNT(nroconta) >= 2);

SELECT nroagencia, AVG(saldo) FROM ContaGROUP BY nroagenciaHAVING MIN(saldo) > 50;

40

Criação de visões

• Visões são consultas predefinidas carregadas na memória– WITH CHECK OPTION: atualiza a visão ao atualizar dados nas

tabelas.– CASCADED: atualização em cascata se tiver outras views

– LOCAL: atualiza unicamente essa view

CREATE VIEW nome_visao [ (column list) ] AS query1[WITH [CASCADED|LOCAL] CHECK OPTION];

CREATE VIEW clientes_em_debito ASSELECT Cliente.nomeFROM Cliente, Cliente_tem_Conta CTC, ContaWHERE Conta.saldo < 0AND CTC.nroconta = Conta.nrocontaAND CTC.nroagencia = Conta.nroagenciaAND CTC.nrocliente = Cliente.nroclienteWITH CHECK OPTION;

Recommended