SQL

Propaganda
SQL
Structured Query Language
Ana Gavinho
Fevereiro 2001
Banco de Dados
1
SQL - Structured Query Language
• A álgebra relacional especifica uma seqüência de operações que
determina como obter os dados.
• SGBD comerciais provem uma linguagem declarativa de alto nível
para acesso a banco de dados, onde se especifica o que se deseja
como resposta. A mais conhecida é a SQL.
• Originalmente projetada e implementada pela IBM, possui as versões
SQL1 (86), SQL2 (92) e SQL3 (conceitos de OO).
• Usa os termos tabela / linha / coluna para relação / tupla / atributo.
• Possui comandos para:
> consulta de dados (query)
> manipulação de dados (inclusão, exclusão, alteração)
> definição de dados
Fevereiro 2001
Banco de Dados
2
Tabelas usadas
EMPREGADO
Nome Matricula DataNasc Endereco Sexo Salario Supervisor Depto
DEPARTAMENTO
DeptoNum DeptoNome MatrGerente
TRABALHA-EM
DEPTO-LOCAL
Matricula PCodigo Horas
Depto Localizacao
PROJETO
PNome PCodigo PLocalizacao Depto
DEPENDENTE
Matricula NomeDepend Sexo DataNasc Parentesco
Fevereiro 2001
Banco de Dados
3
Comandos para consulta de dados
• Uma consulta (query) em SQL consiste de 6 cláusulas, onde as
duas primeiras são obrigatórias.
• As cláusulas entre {...} são opcionais.
SELECT [ ALL / DISTINCT ] < lista-atributos >
FROM tabela1 { , tabela2 ... }
{ WHERE < condição > }
{ GROUP BY atributo1 { , atributo2 ... } }
{ HAVING < condição > }
{ ORDER BY atributo1 { , atributo2 ... } }
Fevereiro 2001
Banco de Dados
4
Select - seleção de campos
• A seleção de campos pode ser efetuada:
> pelos nomes dos campos
> por um asterisco (*), que seleciona todos os campos
»Liste todos os dados de todos os empregados.
SELECT *
FROM
EMPREGADO ;
» Liste o nome e matricula de todos os funcionários.
SELECT Nome, Matricula
FROM
EMPREGADO ;
» Liste o nome e salário de todos os funcionários.
SELECT Nome, Salario
FROM
EMPREGADO ;
Fevereiro 2001
Banco de Dados
5
Select - condição para a seleção de linhas
• A condição do ‘WHERE’ indica as linhas da tabela a serem
selecionadas.
»Liste o nome e matrícula dos funcionários do departamento 20.
SELECT Nome, Matricula
FROM EMPREGADO
WHERE Depto = 20 ;
»Liste o nome e matricula dos funcionários mulheres.
SELECT Nome, Matricula
FROM EMPREGADO
WHERE Sexo = `F` ;
»Liste o nome e matrícula das mulheres do departamento 20.
SELECT
FROM
WHERE
AND
Fevereiro 2001
Nome, Matricula
EMPREGADO
Depto = 20
Sexo = `F` ;
Banco de Dados
6
Select - seleção de linhas por substrings
• Recuperação por aproximação usando LIKE :
> “_” - uma ocorrência de qualquer carater
> “%” - nenhuma ou várias ocorrências de quaisquer caracteres
» Liste os nomes de funcionários que começam por `J`.
SELECT
FROM
WHERE
Nome
EMPREGADO
Nome LIKE ‘J%’ ;
»Liste os nomes de funcionários que tenham ‘Silva’ como parte do
nome.
SELECT
FROM
WHERE
Fevereiro 2001
Nome
EMPREGADO
Nome LIKE ‘%Silva%’
Banco de Dados
7
Select - eliminando linhas duplicadas
• As palavras-chave ‘distinct’ and ‘all’ especificam o que fazer com
linhas duplicadas no resultado da seleção:
> linhas duplicada são eliminadas pela palavra ‘DISTINCT’
> ‘ALL’ é o default e retorna todas as linhas selecionas
» Liste os salários dos empregados.
SELECT Salário
FROM EMPREGADO ;
ou
SELECT ALL Salário
FROM EMPREGADO ;
» Liste os diferentes salários pagos aos empregados.
SELECT DISTINCT Salario
FROM EMPREGADO ;
Fevereiro 2001
Banco de Dados
8
Select - ordenando linhas da consulta
• A clausula ORDER BY faz a ordenação de linhas a partir dos
valores de colunas em ordem ascendente (ASC), que é seu default, ou
em ordem descendente (DESC).
» Liste o nome e salário dos funcionários ordenados pelo nome do
funcionário.
SELECT
Nome, Salario
FROM
EMPREGADO
ORDER BY Nome ;
» Liste o nome e salário dos funcionários ordenados do maior ao
menor salário e pelo nome do funcionário.
SELECT
Nome, Salario
FROM
EMPREGADO
ORDER BY Salario DESC, Nome ;
Fevereiro 2001
Banco de Dados
9
Select - operações aritméticas com colunas
• Os operadores aritméticos + , - , * e / podem ser usados em
colunas numéricas.
• Os valores da tabela original NÃO são alterados
» Liste os diferentes salários pagos e o novo salário com aumento
de 10%.
SELECT
FROM
Salario, 1.1 * Salario
EMPREGADO ;
» Liste o nome e salário dos funcionários com aumento de 10%.
SELECT
FROM
Nome, 1.1 * Salario
EMPREGADO ;
» Liste o nome dos funcionários e o aumento a receber.
SELECT
FROM
Fevereiro 2001
Nome, (1.1 * Salario - Salario)
EMPREGADO ;
Banco de Dados
10
Select - renomeando colunas, incluindo textos
• Para facilitar o entendimento do resultado de uma pesquisa,
podemos definir um novo nome para uma coluna ou incluir um texto
no resultado.
» Liste os diferentes salários pagos e o novo salário com aumento de
10%.
SELECT
FROM
Salario
AS
1.1 * Salario AS
EMPREGADO ;
`Salario atual`,
`Novo salario`
» Liste o nome de funcionários e o aumento a receber.
SELECT
FROM
Fevereiro 2001
`O funcionário `,
Nome
AS `nome funcionario`,
`recebera um aumento de `,
0.1 * Salario AS `aumento`
EMPREGADO ;
Banco de Dados
11
Exercícios 1 - uso do comando Select
• Liste o nome e data de nascimento dos funcionários ordenados por data de
nascimento.
• Liste o nome e salário dos funcionários ordenados por nome.
• Liste o nome e parentesco dos dependentes.
• Liste o nome dos projetos e sua localização ordenados por localização.
• Liste a matricula, nome e salário dos empregados que ganham entre R$
200,00 e R$500,00.
• Liste o nome dos dependentes do sexo masculino.
• Liste o nome dos projetos localizados no Meier, em ordem decrescente.
• Liste o nome do departamento de numero 10.
• Liste o nome das mulheres que trabalham no departamento 10.
• Liste o número do departamento de Compras.
• Liste o numero e nome dos departamento começados pela letra ´C´.
Fevereiro 2001
Banco de Dados
12
Exercícios 1 - uso do comando Select (cont.)
• Liste a matrícula e nome dos funcionários que tenham ‘Silva’ como parte
do nome.
• Liste a matrícula e nome dos funcionários que tenham ‘Silva’ como
último sobrenome.
• Liste o numero dos departamentos que tenham algum projeto.
• Liste o numero dos departamentos que tenham algum projeto, sem
duplicação de linhas.
• Liste os parentescos que existem na tabela DEPENDENTE.
• Liste os diferentes parentescos da tabela DEPENDENTE.
• Liste as localizações dos departamentos.
• Liste as diferentes localizações dos departamentos.
• Liste as localizações dos projetos.
• Liste as diferentes localizações dos projetos.
Fevereiro 2001
Banco de Dados
13
Select - uso de funções de agregação
•Sumarizam valores em um conjunto de linhas.
»Liste o total de empregados, a soma de salários, o maior salário, o
menor salário e a média.
SELECT COUNT (*), SUM(Salario), MAX(Salario), MIN(Salario),
AVG (Salario)
FROM EMPREGADO ;
»Liste a média salarial dos funcionários do departamento 20.
SELECT AVG (Salario) AS ‘Media salarial do depto 20’
FROM EMPREGADO
WHERE Depto = 20 ;
» Liste o número de departamentos da empresa.
SELECT COUNT (*) AS ‘Quantidade de depto`
FROM DEPARTAMENTO ;
Fevereiro 2001
Banco de Dados
14
Select - uso de funções de agregação (cont.)
• A cláusula ‘Distinct’ pode ser usada nas funções ‘Count’, ‘Sum’ e
‘Avg’ .
» Liste o total de diferentes valores de salários.
SELECT COUNT (DISTINCT Salario)
AS ‘Quantidade de diferentes salários pagos’
FROM EMPREGADO ;
» Liste o total pago aos funcionários da empresa.
SELECT SUM (Salario)
AS
‘Valor total dos salários pagos’ `
FROM EMPREGADO ;
» Liste o valor total de diferentes salário pagos na empresa.
SELECT SUM (DISTINCT Salario)
AS
‘Valor total dos diferentes salários pagos’ `
FROM EMPREGADO ;
Fevereiro 2001
Banco de Dados
15
Select - uso de funções de agregação (cont.)
• As funções retornam um valor numérico, e não um conjunto (set) de
valores.
»Liste o nome dos funcionários que tem dois ou mais dependentes.
SELECT Nome
FROM EMPREGADO E
WHERE (SELECT COUNT (*)
FROM DEPENDENTE D
WHERE E.Matricula = D.Matricula)  2 ;
Fevereiro 2001
Banco de Dados
16
Select - agrupando resultados
• A cláusula ‘Group By’ pode aplicar funções em grupos de linhas
com os mesmos valores de atributos.
» Liste o número de empregados por departamento.
SELECT
Depto, COUNT(*)
FROM
EMPREGADO
GROUP BY Depto ;
» Liste, por departamento, o total de funcionários e a média salarial.
SELECT
Depto, COUNT (*), AVG(Salario)
FROM
EMPREGADO
GROUP BY Depto ;
» Liste a quantidade de homens e mulheres da empresa.
SELECT
Sexo, COUNT(*)
FROM
EMPREGADO
GROUP BY Sexo ;
Fevereiro 2001
Banco de Dados
17
Select - selecionando resultados agrupados
• A cláusula ‘Having’ seleciona as linhas a partir de condições
aplicadas sobre os valores de funções.
» Liste os departamentos que possuem mais de 2 funcionários.
SELECT
Depto
FROM
EMPREGADO
GROUP BY Depto
HAVING COUNT (*) > 2 ;
» Liste para cada departamento que tenha mais de dois funcionários,
o total de funcionários e a média salarial.
SELECT
Depto, COUNT (*), AVG(Salario)
FROM
EMPREGADO
GROUP BY Depto
HAVING COUNT(*) > 2 ;
Fevereiro 2001
Banco de Dados
18
Select - having X where
• Where: seleciona linhas antes da agregação.
• Having: seleciona linhas depois da agregação.
» Liste, por departamento, o número de funcionários que ganham
mais de 300,00.
SELECT
FROM
WHERE
GROUP BY
Depto, COUNT (*)
EMPREGADO
Salario > 300
Depto ;
» Liste, para os departamentos que tenham média salarial > 300,00,
o total de funcionários e a média salarial.
SELECT
FROM
GROUP BY
HAVING
Fevereiro 2001
Depto, COUNT (*), AVG(Salario)
EMPREGADO
Depto
AVG(Salario ) > 300 ;
Banco de Dados
19
Select - valor nulo
• Indica um campo que não tenha valor naquele registro
• Não participa nas funções:
> média (2, 4, 0
) = 2
> média (2, 4, NULL ) = 3
(6/3)
(6/2)
» Liste o nome dos funcionários que não tem um supervisor.
SELECT Nome
FROM
EMPREGADO
WHERE Supervisor IS NULL ;
» Liste total de funcionários da empresa, e o total de funcionário que
possuam um supervisor.
SELECT COUNT (*)
AS ‘Total de empregados’,
COUNT (Supervisor)
AS ‘Total de empregados supervisionados’
FROM
EMPREGADO ;
Fevereiro 2001
Banco de Dados
20
Exercícios 2 - uso do comando Select
• Liste o nome dos departamentos que não tem gerente.
• Liste o nome e matrícula dos funcionários que não tem supervisor.
• Liste a soma dos salários, o maior salário, o menor salário e a média salarial
dos empregados do departamento 10.
• Liste o total de funcionários.
• Liste o total de funcionários do departamento 10.
• Liste o total de funcionários por número de departamento.
• Liste o número identificador dos departamentos que tenham dois ou mais
funcionários.
• Liste o total de projetos por localização.
• As localizações que possuem mais de um projeto.
• Liste o total de departamentos por localização.
• As localizações que possuem mais de um departamento.
Fevereiro 2001
Banco de Dados
21
Exercícios 2 - uso do comando Select (cont.)
• Liste o total de diferentes parentescos da tabela DEPENDENTES.
• Liste o total de dependentes por tipo de parentesco.
• Liste o total de dependentes por sexo.
• Liste o total de dependentes do funcionário de matrícula 1001.
• A matrícula dos funcionários que possuam mais de dois dependentes.
• Liste a matricula dos supervisores e o número de funcionários que
supervisionam.
• Liste a matricula dos supervisores que supervisionam mais de 2
funcionários.
• Liste a matrícula dos gerentes e o número de departamentos que gerenciam.
• Liste a matricula dos gerentes que gerenciam mais de um departamento.
Fevereiro 2001
Banco de Dados
22
Select - produto cartesiano
• No produto cartesiano, temos mais de uma tabela declarada na
cláusula ‘FROM’.
• Temos a combinação de cada linha de uma tabela com cada uma
das linhas da outra tabela.
» Junte as linhas da tabela EMPREGADO com as linhas da tabela
DEPARTAMENTO.
SELECT *
FROM EMPREGADO, DEPARTAMENTO ;
» Junte as linhas da tabela EMPREGADO com as linhas da tabela
DEPENDENTE.
SELECT *
FROM EMPREGADO, DEPENDENTE ;
Fevereiro 2001
Banco de Dados
23
Select - junção de tabelas
• A junção de tabelas é executada ao se declarar uma condição na
cláusula ‘WHERE’ em um produto cartesiano.
• Ela em geral indica o relacionamento entre as tabelas
»Liste o nome dos empregados e do departamento em que trabalham.
SELECT Nome, DeptoNome
FROM EMPREGADO, DEPARTAMENTO
WHERE Depto = DeptoNum ;
»Liste nome e endereço dos empregados do departamento ‘Compras’.
SELECT Nome, Endereco
FROM EMPREGADO, DEPARTAMENTO
WHERE Depto = DeptoNum AND DeptoNome = ‘Compras’ ;
»Liste o nome dos departamentos e de seus gerentes.
SELECT DeptoNome , Nome
FROM EMPREGADO, DEPARTAMENTO
WHERE Matricula = MatrGerente ;
Fevereiro 2001
Banco de Dados
24
Select - junção de tabelas: apelidos
• Podemos criar apelidos para as tabelas utilizadas
» Liste o nome dos empregados e de seus dependentes.
SELECT Nome, NomeDepend
FROM EMPREGADO E, DEPENDENTE D
WHERE E.Matricula = D.Matricula ;
»Liste o nome dos empregados e dos projetos em que trabalharam 20
horas.
SELECT
FROM
WHERE
AND
Nome, PNome
EMPREGADO E, TRABALHA-EM T, PROJETO P
E.Matricula = T.Matricula AND T.PCodigo = P.PCodigo
Horas = 20 ;
»Liste o nome de funcionários e seus supervisores.
SELECT E.Nome AS NomeEmp,
S.Nome AS NomeSupervisor
FROM
EMPREGADO E, EMPREGADO S
WHERE E.Supervisor = S.Matricula ;
Fevereiro 2001
Banco de Dados
25
Select - junção de tabelas: outer join
• A junção de tabelas mostra apenas as linhas que satisfazem a condição
especificada mas, ocasionalmente, podemos quer ver as linhas de uma
tabela que não satisfaçam a condição.
• O OUTER JOIN mostra, alem das linhas que satisfazem a condição, as
linhas de uma das tabelas que não satisfazem.
• A implementação, dependendo do fabricante, pode ser feita na cláusula
FROM ou na cláusula WHERE.
» LEFT JOIN: inclui as linhas da 1ª tabela que não satisfazem a condição.
FROM
TAB1 LEFT [OUTER] JOIN
WHERE Tab1.Coluna *= Tab2.Coluna
» RIGHT JOIN: inclui as linhas da 2ª tabela que não satisfazem a condição
FROM
TAB1 RIGHT [OUTER] JOIN
WHERE Tab1.Coluna =* Tab2.Coluna
Fevereiro 2001
Banco de Dados
26
Select - junção de tabelas: outer join
• Liste o nome de matricula de todos os empregados, e de seus
dependentes, se houver.
SELECT Nome, E.Matricula, D.Matricula , NomeDepend
FROM
EMPREGADO E LEFT JOIN DEPENDENTE D
ON
E.Matricula = D.Matricula ;
ou
SELECT Nome, E.Matricula, D.Matricula , NomeDepend
FROM
EMPREGADO E, DEPENDENTE D
WHERE E.Matricula *= D.Matricula ;
Fevereiro 2001
Banco de Dados
27
Exercícios 3 - uso do comando Select
• Liste o nome das mulheres que trabalham no departamento ’Vendas’.
• Liste o nome do departamento e o nome das mulheres que trabalham no
departamento 10, ordenado por departamento.
• Liste os nomes dos departamentos e de seus gerentes em ordem crescente.
• Liste o nome do gerente do departamento ‘Compras’.
• Liste o nome e matricula dos funcionários homônimos.
• Liste o nome e matricula dos empregados que tenham um dependente
com o mesmo nome que seu.
• Liste o nome, matricula e data de nascimento dos funcionários que
nasceram no mesmo dia.
• Liste o nome do departamento e o nome dos funcionários subordinados ao
gerente ‘Mario Souza’.
• Liste o nome dos funcionários que trabalharam mais de 20 horas no
projeto ‘Varejo’.
Fevereiro 2001
Banco de Dados
28
Exercícios 3 - uso do comando Select (cont.)
• Liste o nome, endereço e data de nascimento dos gerentes dos
departamentos localizados no ‘Meier’.
• Liste todos os dados de projetos do departamento ´Compras´.
• Liste o nome, matricula e departamento dos funcionários que trabalham
no projeto ‘FornecNorte’ ou no projeto ‘FornecSul’.
• Liste o nome, matricula e departamento dos funcionários que trabalham
no projeto ‘FornecNorte’ ou no projeto ‘FornecSul’, sem duplicação de
linhas.
• Liste a soma do salário, o maior salário, o menor salário e a média salarial
dos empregados do departamento ‘Compras’.
• Liste o total de funcionários por nome de departamento.
• Liste o total de funcionários do departamento ‘Compras’.
• Liste o nome dos departamentos com mais de um funcionário.
Fevereiro 2001
Banco de Dados
29
Exercícios 3 - uso do comando Select (cont.)
• Liste o nome e matricula dos funcionários com mais de dois dependentes.
• Liste o total de dependentes do funcionário ‘José Silva’.
• Liste o nome dos funcionários que trabalham em dois ou mais projetos.
• Liste o nome dos funcionários que gerenciam mais de um departamento.
• Liste a matricula e nome dos supervisores.
• Liste a matricula e o nome dos supervisores que supervisionam mais de
2 funcionários.
• Liste, para cada projeto, seu código, nome, número de funcionários que
nele trabalham e a média de horas.
Fevereiro 2001
Banco de Dados
30
Select - queries aninhadas
• Em queries aninhadas, temos a cláusula ‘WHERE’ usando outra
query.
• A query interna retorna como resposta uma tabela ou conjunto (set),
que pode ser vazio.
• Utiliza diferentes operadores.
• Operador [NOT] IN
» compara um valor ‘v’ com um conjunto de valores ‘V’ e retorna
‘true’ se ‘v’ é um elemento de ‘V’.
• Operador [NOT] EXISTS
»retorna ‘true’ quando o valor de uma query aninhada é vazio
Fevereiro 2001
Banco de Dados
31
Select - queries aninhadas (cont.)
• Operador v > ALL
» compara um valor ‘v’ com um conjunto de valores ‘V’ e retorna
‘true’ se ‘v’ for maior que TODOS os elementos de ‘V’.
• Operador v > ANY
» compara um valor ‘v’ com um conjunto de valores ‘V’ e retorna
‘true’ se ‘v’ for maior que ALGUM dos elementos de ‘V’.
OBS: pode-se usar os comparadores lógicos:
. >
. >=
. <
. <=
. =
. <> ou
!=
Fevereiro 2001
Banco de Dados
32
Select - queries aninhadas, operador IN
» Liste o nome e endereço dos empregados do departamento ‘Compras’.
SELECT Nome, Endereco
FROM EMPREGADO
WHERE Depto IN
( SELECT Deptonum
FROM
DEPARTAMENTO
WHERE DeptoNome = ‘Compras’ ) ;
» Liste o nome dos funcionários que não tem dependentes.
SELECT Nome
FROM EMPREGADO E
WHERE Matricula NOT IN
( SELECT Matricula
FROM DEPENDENTE D
WHERE E.Matricula = D.Matricula ) ;
Fevereiro 2001
Banco de Dados
33
Select - queries aninhadas, operador EXISTS
» Liste o nome e endereço dos empregados do departamento ‘Compras’.
SELECT Nome, Endereco
FROM EMPREGADO E
WHERE EXISTS
( SELECT
FROM
WHERE
AND
*
DEPARTAMENTO D
DeptoNome = ‘Compras’
E.Depto = D. Deptonum ) ;
» Liste o nome dos funcionários que não tem dependentes.
SELECT Nome
FROM EMPREGADO E
WHERE NOT EXISTS
( SELECT *
FROM DEPENDENTE D
WHERE E.Matricula = D.Matricula ) ;
Fevereiro 2001
Banco de Dados
34
Select - queries aninhadas, operador ALL
» Liste o nome dos empregados que ganham os maiores salários da
empresa.
SELECT Nome
FROM EMPREGADO
WHERE Salario >= ALL
( SELECT Salario
FROM
EMPREGADO ) ;
» Liste o nome dos empregados que tem salário maior que o salário de
todos os empregados do departamento de ‘Compras’.
SELECT Nome
FROM EMPREGADO
WHERE Salario > ALL
( SELECT
FROM
WHERE
AND
Fevereiro 2001
Salario
EMPREGADO, DEPARATAMENTO
Depto = Deptonum
Deptonome = ‘Compras’ ) ;
Banco de Dados
35
Select - queries aninhadas, operador ANY
» Liste o nome dos empregados que ganham mais que o menor salário da
empresa.
SELECT Nome
FROM EMPREGADO
WHERE Salario > ANY
( SELECT Salario
FROM EMPREGADO ) ;
» Liste o nome dos empregados que não ganham o maior salário da
empresa.
SELECT Nome
FROM EMPREGADO
WHERE Salario < ANY
( SELECT Salario
FROM EMPREGADO ) ;
Fevereiro 2001
Banco de Dados
36
Select - sets explícitos
• Podemos usar um conjunto explícito de valores para comparação na
cláusula ‘WHERE’.
» Liste o nome e a matricula dos funcionários que trabalham no projeto
1, 2 ou 3.
SELECT
FROM
WHERE
AND
Nome, Matricula
EMPREGADO E, TRABALHAEM T
E.MATRICULA = T.MATRICULA
PCodigo IN ( 1, 2, 3) ;
» Liste o nome dos projetos localizados no ‘Meier’ ou no ‘Centro’.
SELECT PNome
FROM PROJETO
WHERE Plocalizacao IN ( ‘Meier’, ‘Centro’) ;
Fevereiro 2001
Banco de Dados
37
Select - união de tabelas
• Podemos unir o resultado de várias consultas, desde que o tipo dos
resultados sejam os mesmos.
» Liste o nome e matricula dos funcionários que ganham mais de R$100,00
juntamente com os funcionários do departamento de Vendas.
( SELECT
FROM
WHERE
UNION
( SELECT
FROM
WHERE
Nome, Matricula
EMPREGADO
Salario > 1000 )
Nome, Matricula
EMPREGADO, DEPARTAMENTO
Depto = DeptoNum AND DeptoNome = ‘Vendas’ ) ;
» Liste a localização dos departamentos juntamente com a localização dos
projetos.
( SELECT
FROM
UNION
( SELECT
FROM
Fevereiro 2001
DISTINCT Localizacao
DEPARTAMENTO )
DISTINCT PLocalizacao
PROJETO ) ;
Banco de Dados
38
Exercícios 4 - uso do comando Select
• Liste o nome das mulheres que trabalham no departamento ’Compras’.
• Liste o nome do gerente do departamento ‘Compras’.
• Liste a soma do salário, o maior salário, o menor salário e a média salarial
dos empregados do departamento ‘Compras’.
• Liste o total de funcionários do departamento ‘Compras’.
• Liste o nome dos departamentos com mais de um funcionário.
• Liste a matricula e nome dos supervisores e o numero de funcionários que
supervisionam.
• Liste a matricula e o nome dos supervisores que supervisionam mais de 2
funcionários.
• Liste o nome do departamento e o nome dos funcionários subordinados ao
gerente ‘Mario Souza’.
• Liste o nome dos funcionários que gerenciam mais de um departamento.
• Liste o nome, endereço e data de nascimento dos gerentes dos
departamentos localizados no ‘Meier’.
Fevereiro 2001
Banco de Dados
39
Exercícios 4 - uso do comando Select (cont.)
• Liste o nome e matricula dos funcionários com mais de dois dependentes.
• Liste o total de dependentes do funcionário ‘Mario Souza’.
• Liste o nome dos funcionários que tem algum dependente.
• Liste o nome dos gerentes que tem algum dependente.
• Liste o nome e matricula dos empregados que tenham um dependente
com o mesmo nome que o seu.
• Liste o nome dos funcionários que trabalham em dois ou mais projetos.
• Liste o nome dos funcionários que trabalharam mais de 20 horas no
projeto ‘FornecNorte’.
• Liste o nome, matricula e departamento dos funcionários que trabalham
no projeto ‘FornecNorte’ ou no projeto ‘FornecSul’.
• Liste o nome, matricula e departamento dos funcionários que trabalham
no projeto ‘FornecNorte’ e no projeto ‘FornecSul’.
Fevereiro 2001
Banco de Dados
40
Comandos para manipulação de dados
• INSERT
-
incluindo registros
• DELETE
-
removendo registros
• UPDATE
-
alterando registros
Fevereiro 2001
Banco de Dados
41
Comando INSERT
• Os valores devem seguir a ordem dos campos na criação da tabela.
INSERT INTO nome-tab
VALUES
(valor {, valor … } )
• Ao especificar o nome dos campos, os que tem valor NULL ou default
não precisam constar na lista.
INSERT INTO nome-tab ( campo1, {, campo2 …} )
VALUES
(valor1 {, valor2 … } )
• Varias linhas podem ser inseridas utilizando uma query.
INSERT INTO nome-tab ( campo1, {, campo2 …} )
SELECT <lista-atributos>
FROM
nome-tab {, nome-tab … }
WHERE <condição>
Fevereiro 2001
Banco de Dados
42
Comandos DELETE e UPDATE
• O comando ‘delete’ remove linhas de uma tabela. A clausula ‘WHERE’ é
opcional e quando não usada, todas as linhas da tabela são excluídas .
DELETE FROM nome-tab
{ WHERE <condição> }
• O comando ‘update’ modifica valores de campos para uma ou mais linhas
da tabela.
UPDATE nome-tab
SET
campo = valor {, campo = valor … }
{ WHERE <condição> }
Fevereiro 2001
Banco de Dados
43
Comandos para manipulação de dados - exemplos
» Inclua o departamento de Marketing que tem o numero 30 e é
gerenciado pelo funcionário de matricula 1020.
INSERT INTO Departamento
VALUES
(30, ‘Marketing’, 1020)
» Inclua o departamento de Pessoal que tem o numero 30 e não
possui gerente.
INSERT INTO Departamento (DeptoNome, DeptoNum)
VALUES
(‘Pessoal’, 30)
» Exclua o funcionário de matricula 1001.
DELETE FROM Empregado
WHERE
Matricula = 1001
» De 10% de aumento salarial aos funcionários do depto 10.
UPDATE Empregado
SET
Salario = 1.1 * Salario
WHERE Depto = 10
Fevereiro 2001
Banco de Dados
44
Exercícios - comandos para manipulação de dados
• Inclua as 20 horas de trabalho do funcionário de matricula 3001 no
projeto P21.
• Inclua o funcionário de matricula 3001 como trabalhador do projeto P20,
sem nenhuma hora trabalhada.
• Exclua os funcionários do departamento 30.
• Exclua os funcionários do departamento ‘Compras’.
• Exclua todos os dependentes.
• Altere o endereço do funcionário ‘Marcelo Sousa’ para ‘Rua da Matriz,
25’.
• Torne o funcionário de matricula 1002 o novo gerente do departamento de
‘Compras’ .
• Atualiza o número de horas trabalhas pelo empregado de matrícula 3001
no projeto 'P20' para 8 horas .
Fevereiro 2001
Banco de Dados
45
Comandos de definição de dados
• CREATE
> schema
> domain
> table
> index
> view
> assertion
Fevereiro 2001
• DROP
> schema
> domain
> table
> view
> index
> assertion
Banco de Dados
• ALTER
> schema
> table
> view
> index
46
Create schema
• O esquema de um banco de dados relacional agrupa um conjunto
de tabelas e outras construções que pertencem a uma mesma
aplicação.
• Possui o nome do esquema, o identificador de autorização que
define o dono do esquema, e opcionalmente a descrição de cada
elemento do esquema (tabelas, views, domínios, ...). Os elementos do
esquema podem ser definidos posteriormente.
Ex:
CREATE SCHEMA Empresa AUTHORIZATION Grupo;
Fevereiro 2001
Banco de Dados
47
Create domain
• O domínio define um tipo de dado.
• Pode ser usado por vários campos de tabela de um esquema.
• Facilita a mudança de um tipo de dado usado em vários atributos.
CREATE DOMAIN nome-dominio tipo-dado
{ DEFAULT valor }
{ CONSTRAINT nome-rotina }
{ CHECK ( condição ) } ;
Ex: CREATE DOMAIN Nome char (40);
CREATE DOMAIN CorValida char (6) DEFAULT ’???’
CONSTRAINT CoresValidas
CHECK ( value in (‘azul’, ‘amarelo’, ‘verde’, ‘???’) ) ;
CREATE TABLE T ( ...,
cor
);
CorValida ,
Fevereiro 2001
Banco de Dados
48
Create table
CREATE TABLE nome-tab
( nome-coluna tipo-coluna {NOT NULL} {DEFAULT valor},
{nome-coluna tipo-coluna {NOT NULL} {DEFAULT valor}, ... }
{tc} PRIMARY KEY (nome-coluna {, nome-coluna ...} ),
{tc} UNIQUE
(nome-coluna {, nome-coluna ...} ),
{tc} FOREIGN KEY (nome-coluna {, nome-coluna ...} )
REFERENCES nome-tab(nome-coluna {, nome-coluna ...} )
ON UPDATE CASCATE
ON DELETE SET [ NULL / DEFAULT / CASCATE ]
{tc}
)
tc = tab constraint: CONSTRAINT nome-rotina
Fevereiro 2001
Banco de Dados
49
Create table - exemplo 1
Exemplo 1:
CREATE TABLE
( DeptoNum
DeptoNome
MatricGerente
Departamento
INT
NOT NULL,
VARCHAR(15) NOT NULL,
CHAR(9),
CONSTRAINT DeptoPK
PRIMARY KEY (DeptoNum),
CONSTRAINT DeptoUN
UNIQUE
(DeptoNome),
CONSTRAINT DeptoFK
FOREIGN KEY (MatricGerente)
REFERENCES Empregado(Matricula)
ON UPDATE CASCATE
ON DELETE
SET NULL ) ;
Fevereiro 2001
Banco de Dados
50
Create table - exemplo 2
Exemplo 2:
CREATE TABLE TrabalhaEm
( Matricula
CHAR(9)
PCodigo
INT
Horas
DECIMAL (3,1),
NOT NULL,
NOT NULL,
PRIMARY KEY
(Matricula, PCodigo),
FOREIGN KEY
(Matricula)
REFERENCES Empregado(Matricula)
ON UPDATE CASCATE
ON DELETE
CASCATE,
FOREIGN KEY
(PCodigo)
REFERENCES Projeto(PCodigo)
ON UPDATE CASCATE
ON DELETE
CASCATE ) ;
Fevereiro 2001
Banco de Dados
51
Create index
• Um índice torna mais eficiente o acesso às linhas de uma tabela.
• A ordenação dos valores do índice é ascendente por default.
• Os campos que são chave (não possuem repetição de valores nas
linhas da tabela) são especificados como ‘UNIQUE’.
CREATE {UNIQUE} INDEX nome-índice
ON nome-tabela ( nome-coluna { ASC / DESC }
{ , nome-coluna { ASC / DESC } … }
)
Ex:
CREATE UNIQUE INDEX Nome-Depto-Index
ON Departamento ( DeptoNome )
Fevereiro 2001
Banco de Dados
52
Create view
• Uma view é uma tabela derivada de outras tabelas. Estas outras
tabelas podem ser tabelas base ou outras views pré-definidas.
• É considerada uma tabela virtual.
• Em sua criação é dado um nome para a tabela virtual, uma lista de
atributos (opcional) e uma query que determina o conteúdo da view.
CREATE VIEW nome-view { nome-coluna {, nome-coluna …} }
AS <comando select>
Ex:
CREATE VIEW Info-Depto (Nome-Depto, Num-Func, Total-Sal)
AS SELECT DeptoNome, COUNT(*), SUM(Salario)
FROM Departamento, Empregado
WHERE DeptoNum = Depto
GROUP BY DeptoNome
Fevereiro 2001
Banco de Dados
53
Exercícios - comandos de definição de dados
• Crie um domínio para o campo ‘Sexo’ da tabela ‘Empregado’, com
formato char(1), valores ‘M’ e ‘F’, e valor default ‘M’.
• Crie a tabela Empregado com todos os valores NOT NULL, formato INT
para os campos Matricula, Depto e Supervisor, formato DATE para
DataNasc, formato DECIMAL(10,2) para Salario, e formato VARCHAR
para os demais campos com o tamanho apropriado. Declarar Matricula
como chave primária, e Depto e Supervisor como chaves estrangeiras.
•Crie a tabela TrabalhaEm com todos os campos no formato INT, campos
Matricula e PCodigo como NOT NULL. Declarar a chave primária com os
campos Matricula e PCodigo, que são também chave estrangeira.
•Crie um índice com o campo Nome da tabela Empregado.
Fevereiro 2001
Banco de Dados
54
Drop Schema
DROP SCHEMA nome-esquema [ CASCATE / RESTRICT ]
• A opção ‘cascate’ remove também todos os elementos (tabelas,
domínios, ...) do esquema.
• A opção ‘restrict’ só permite a remoção do esquema se ele não
contiver nenhum elemento.
Ex :
DROP SCHEMA Empresa CASCATE ;
Fevereiro 2001
Banco de Dados
55
Drop Table
DROP TABLE nome-tab [ CASCATE / RESTRICT ] ;
• Na opção ‘cascate’, todas as views e constraints que referenciam a
tabela são também removidas..
• Na opção ‘restrict’, a tabela é removida apenas quando não é
referenciada em alguma constraint (FK) ou view.
Ex:
DROP TABLE nome-tab CASCATE ;
Fevereiro 2001
Banco de Dados
56
Drop View
-
Drop Index
DROP VIEW nome-view ;
Ex:
DROP VIEW Info-Depto ;
DROP INDEX nome-index ;
Ex:
DROP INDEX Nome-Depto-Index ;
Fevereiro 2001
Banco de Dados
57
Alter table
• Para incluir um novo campo:
ALTER TABLE nome-tab ADD nome-coluna tipo-coluna
{NOT NULL} {DEFAULT valor} ;
- not null: um valor deve ser atribuído ao novo campo das linhas que já
existem na tabela, pela clausula default ou pelo comando update.
- default: quando não especificada, o novo campo terá o valor NULL.
• Para remover um campo:
ALTER TABLE nome-tab DROP nome-coluna [ CASCATE /
RESTRICT ] ;
- cascate: todas as constraints e views que referenciam o campo serão
também removidas.
- restrict: o comando e’ executado quando nenhuma view ou constraint se
referencia ao campo.
Fevereiro 2001
Banco de Dados
58
Alter table
•Para alterar a clausula default de um campo:
ALTER TABLE nome-tab ALTER nome-coluna
[ DROP DEFAULT /
SET DEFAULT valor ] ;
• Para remover ou incluir uma constraint:
ALTER TABLE nome-tab DROP CONSTRAINT nome-rotina;
ALTER TABLE nome-tab ADD CONSTRAINT nome-rotina;
Fevereiro 2001
Banco de Dados
59
Alter table - exemplos
Exemplos:
ALTER TABLE Empregado ADD DataNasc DATE ;
ALTER TABLE Empregado DROP Endereco CASCATE ;
ALTER TABLE Empregado ALTER Sexo DROP DEFAULT ;
ALTER TABLE Empregado ALTER Sexo SET DEFAULT ‘F’ ;
ALTER TABLE Departamento DROP CONSTRAINT DeptoPK ;
ALTER TABLE Departamento ADD CONSTRAINT DeptoXVE ;
Fevereiro 2001
Banco de Dados
60
Update View
UPDATE nome-view
SET
coluna = {expressão}
WHERE condição
Ex:
UPDATE
InfoDepto
SET
NomeDepto = ‘Compras’
WHERE NomeDepto = ‘Compra’
Fevereiro 2001
Banco de Dados
61
Bibliografia
• Introdução aos Sistemas de Banco de Dados
J. C. Date.
• The practical SQL HandBook
Judith S. Bownman, sandra L. Emerson, Marcy Darnovsky
Fevereiro 2001
Banco de Dados
62
Download