Você está na página 1de 12

07/01/21

Modelação de Bases de Dados

Introdução ao SQL
Valéria Pequeno

DML – Modificação da BD
• Comando para inserir tuplos/registos em uma tabela:
• Insert
• Exemplo:
insert into professor values (‘10211’, ’Smith’, ’Biologia’, 66000);
• Comando para remover tuplos/registos de uma tabela:
• Delete
• Exemplo:
delete from estudante
delete from estudante where id = 1
• Comando para alterar valores de tuplos em uma tabela:
• update
• Exemplo:
update estudante set salario = 1500 where id = 1

DML - Estrutura Básica de uma


Consulta
• Uma típica consulta SQL tem a forma:

select A1, A2, ..., An


from r1, r2, ..., rm
[ where P ]

• Ai representa um atributo
• ri representa uma relação
• P é um predicado (condição de seleção)
• O [ ] indica que a cláusula where é opcional

• O resultado de uma consulta SQL é uma relação

1
07/01/21

A Cláusula Select
• Select é uma clásula SQL para listar no resultado da consulta
apenas os atributos desejados
• Corresponde na álgebra relacional à operação de projeção (π)
• Exemplo:
• Encontre o nome de todos os professores
select nome
from professores
πnome(professores)

Nome
professor
João Silva ID Nome Nome_depto Salario
Joana Santos 1 João Silva Biologia 1000
Eva Matos 2 Joana Santos Informática 1300
3 Eva Matos Informática 980

A Cláusula Select (Cont.)


• A cláusula select permite tuplos duplicados nas relações e nas
consultas
• Se desejarmos eliminar os duplicados, devemos acrescentar a
palavra distinct depois de select
• Exemplo:
• Encontre o nome dos departamentos de todos os professores e
remova os tuplos duplicados

Select distinct nome_depto


from professores

A Cláusula Select (Cont.)


• Um * na clásula select significa “todos os atributos”
• Exemplo: professor
Select * ID Nome Nome_depto Salario
from professores 1 João Silva Biologia 1000
2 Joana Santos Informática 1300
3 Eva Matos Informática 980

• A ordem pela qual as colunas são apresentadas no resultado


da consulta é a ordem pela qual são colocadas na cláusula
select ou, no caso de se usar o *, é a ordem pela qual foram
criadas

2
07/01/21

A Cláusula Where
• A cláusula where especifica uma restrição no número de
tuplos/registos que devem ser retornados pela consulta
• Corresponde ao predicado de seleção da álgebra relacional (σ)

select A1, A2, ..., An


from r1, r2, ..., rm
[ where condição ]
• A condição é um tipo de expressão que retorna sempre
verdadeiro ou falso
• Exemplo: Selecionar todos os atributos da tabela professor para
aqueles professores cujo salário é maior que 1000
professor
select *
from professor ID Nome Nome_depto Salario
where salario > 1000 2 Joana Santos Informática 1300

A Cláusula Where (Exemplos)


• Listar o nome dos professores que trabalham no
departamento de informática
Nome
Select nome
from professor Joana Santos
where nome_depto = ‘informatica’ Eva Matos

• Encontrar todos os professores que trabalham no


departamento informática e cujo salário é maior que 1000
Select nome Nome
from professor Joana Santos
where nome_depto = ‘informaticas’ and salario > 1000

10

Operadores Relacionais
Operador Descrição Exemplo Resultado
= Igual a 7=5 false
> Maior que 7>5 true
>= Maior ou igual a 7>=5 true
< Menor que 7<5 false
<= Menor ou igual a 7<=5 false
<> Ou != diferente 7<> 5 true

Operadores Lógicos
Operador Exemplo
AND Condição1 and condição2
OR Condição1 or condição2
NOT Not condição

11

3
07/01/21

Operadores (Exemplo)
• Selecionar o nome e o nome do departamento de todos os
professores com salário entre 900 e 2000

Select nome, nome_depto


from professor
Where salario >= 900 and salario <= 2000

Nome Nome_depto
João Silva Biologia
Joana Santos Informática
Eva Matos Informática

12

Precedência dos Operadores


• Como acontece em outras linguagens de programação, em
SQL os operadores tem diferentes precedências

Parêntesis ()
Multiplicação / divisão */
Adição / subtração +-
NOT NOT
AND AND
OR OR

Operadores mais acima são executados primeiro

13

Exercício 1
• Dada as seguintes tabelas:
Cd(Codigo,Nome,DataCompra,ValorPago,LocalCompra,Album)
Musica(codigoCd,Numero,Nome, Artista,Duracao)
Definir em SQL as seguintes consultas:
1. Mostrar todos os cds
2. Mostrar os campos nome e data da compra dos cds
3. Mostrar todas as músicas (todos os campos) dos cds com
código 1
4. Mostrar o nome da música e o artista de todas as músicas
5. Mostrar o número, nome e duração das músicas do cd 5
6. Mostre o nome de todos os cds comprados no Ebay
7. Mostrar o nome de todos os cds comprados no mês de
outubro de 2016

14

4
07/01/21

Expressões Aritméticas
• Podemos usar operações básicas em colunas tipo NUMBER e DATE:
• + para somar
• - para subtrair
• * para multiplicar
• / para dividir
• Exemplo: calcular o salário anual de todos os empregados
• Empregado(enome,eapelido,salario,depto,comissao)
ENOME SALARIO*12
SELECT enome, salario * 12
---------- -----------------
FROM empregado; ANA 9600
EVA 19200
JIM 15000
• Multiplicação e divisão tem prioridade sobre adição e subtração.
• Operadores com a mesma precedência são avaliados da esquerda
para a direita
• Pode-se usar parênteses para forçar precedência ou facilitar a leitura

20

Aliás
• Aliás são usados para renomear colunas e tabelas
• Especialmente útil com cálculos
• No exemplo anterior, poderiamos ter uma coluna “Salário
Annual” ao invés de sal * 12
• Aspas Duplas são necessárias se o alias contém espaços ou
caracteres especiais
• Dentro de um comando SQL um alias pode ser usado tanto pelo
comando SELECT com pelo ORDER BY
• Não se pode usar aliases com o comando WHERE
• Exemplo: calcular o salário anual de todos os empregados
ENOME SALÁRIO ANUAL
SELECT enome, salario * 12 “Salário anual” ---------- ----------------------
FROM empregado; ANA 9600
EVA 19200
JIM 15000

21

Operador de Concatenação
• É representado por duas barras verticais ||
• As barras variam aparência de acordo com o teclado e/ou ecrã
• Serve para combinar textos (strings)
• Cria uma coluna resultante somente para visualização do tipo
texto (VARCHAR2)
• Exemplo: listar o nome completo dos empregados
SELECT enome || ‘ ‘ || eapelido "Nome Completo"
FROM empregado;

ENOME EAPELIDO SALARIO DEPTO COMISSAO NOME COMPLETO


---------- ------------- ----------- --------- -------------- ------------------------
ANA SMITH 800 10 NULL ANA SMITH
EVA ALLEN 1600 20 400 EVA ALLEN
JIM WARD 1250 10 230 JIM WARD

22

5
07/01/21

Trabalhando com Valores Null


• Valor NULL pode ter três significados em SQL:
• Valor que não está disponível/desconhecido
• Valor inexistente
• Valor que não se aplica
• Valor NULL faz parte de qualquer domínio de uma coluna a
menos que explicitamente seja dito que não
• NOT NULL
• Exemplo: listar todos os empregados que possuem uma
comissão
SELECT enome ENOME EAPELIDO SALARIO DEPTO COMISSAO
FROM empregado ---------- ------------- ----------- --------- ---------------
WHERE comissao IS NOT NULL; ANA SMITH 800 10 NULL
EVA ALLEN 1600 20 400
ENOME JIM WARD 1250 10 230
------------------
EVA
JIM

23

Trabalhando com Valores Null


• Expressões aritméticas envolvendo NULL sempre retornam
NULL como resultado
• Existe em SQL um comando que converte este “nada” em algo
aproveitável:
• NVL (expr1, expr2)
• expr1 é o valor da coluna ou expressão que pode conter NULL
• expr2 é o valor resultante em caso de NULL
• Aplica-se aos tipos de dados: Numérico, Datas e Texto (Number,
Date, Char e Varchar2)
• Exemplo:listar todos os empregados com os respectivos
salários e comissão. Trocar NULL por 0 (zero) nos casos em
que a comissão tiver o valor NULL ENOME SALÁRIO COMISSÃO
---------- ------------- ---------------
SELECT enome, salario as “Salário”,
ANA 800 0
NVL(comissao,0) as “Comissão”
EVA 1600 400
FROM empregado
JIM 1250 230

24

Exercício 2
• Escrever as seguintes consultas, dada a tabela abaixo:
cliente(nome,apelido,localidade,concelho,pais)
1. Mostrar os dados de todos os clientes
2. Mostrar o apelido, localidade e concelho de todos os
clientes de Portugal
3. Mostrar todos os clientes em que não se sabe a qual
concelho pertencem
4. Mostrar todos os concelhos (sem duplicação) que tem
algum cliente

• Nota: Se for executar as consultas no Apex, tem antes que


criar a tabela e inserir dados nela

25

6
07/01/21

Like
• Usado em expressões SQL quando queremos comparar strings
apenas especificando uma parte do texto
• Like é usado juntamente com os caracteres: % e _
• O caractere % é utilizado para indicar a posição (no início, em
qualquer posição ou no final) que um conteúdo será procurado no
valor string da coluna
• O caractere _ indica o número de caracteres envolvido na pesquisa
• Exemplo: obter o nome e apelido dos empregados cujo nome
começa por M
• Empregado(enome,eapelido,salario,depto,comissao)
SELECT enome, eapelido
FROM empregado
WHERE enome LIKE ‘M%’;

26

Like – cont.

Expressão Resultado
LIKE ’Ponte% Qualquer string que iniciem com Ponte
LIKE '%Ponte' Qualquer string que terminem com Ponte
LIKE ’%Ponte%' Qualquer string que tenha Ponte em qualquer
posição
LIKE 'A_' String de dois caracteres que tenham a primeira
letra A e o segundo caractere seja qualquer outr

27

IN
• Usado quando temos uma lista de valores para comparar na
cláusula WHERE
• Exemplo: obter o nome dos alunos e respectiva cidade dos
alunos que vieram de Lisboa, Porto ou Braga

SELECT nome,cidade
FROM alunos
WHERE cidade IN(”Lisboa", ”Porto", ”Braga");
• Mesma consulta:
SELECT nome,cidade
FROM alunos
WHERE cidade =”Lisboa” OR cidade = ”Porto”
OR cidade = ”Braga;

28

7
07/01/21

Ordenação
• Normalmente a ordem dos registos em uma BD é a ordem de
inclusão dos mesmos na tabela
• ORDER BY é o operador da SQL para mostrar o resultado de
uma consulta na ordem indicada na consulta
• Por defeito, a ordenação é ascentende, sendo que valores
nulos aparecem primeiro
• Para mostrar numa ordem descente usa-se a palavra DESC
• Exemplo: lista os nomes dos empregados ordenados por
nome
SELECT enome SELECT enome
FROM empregado FROM empregado
ORDER BY enome; ORDER BY enome DESC;

29

Exercício 3
• Considere a tabela PESSOA e registos definidos abaixo:

CREATE TABLE PESSOA (


id integer constraint pessoa_PK primary key,
nome varchar2(20),
bi varchar2(14),
nascimento date);

INSERT INTO PESSOA VALUES (1,’João Soares','11109865424','20-06-1994');


INSERT INTO PESSOA VALUES (2,'Maria Joaquina','87604465334','20-07-1981');
INSERT INTO PESSOA VALUES (3,'José da Silva','54279835424','08-03-1999');
INSERT INTO PESSOA VALUES (4,'João Henrique','283835424','28-08-1981');
INSERT INTO PESSOA VALUES (5,'Eliézio Mesquita','1087865424','28-02-1985');
INSERT INTO PESSOA VALUES (6,'Gustavo Souza','7464465334','17-12-1995');
INSERT INTO PESSOA VALUES (8,'Edson Arantes','90874465334','02-04-2005');
INSERT INTO PESSOA VALUES (9,'Silvio Santos','54279835424','17-07-1955');

30

Exercício 3 – cont.
• Escreva em SQL as seguintes consultas:
1. Listar todas as pessoas cujo nome começa com “J”
2. Listar as pessoas cujo nome comece com um caractere
qualquer, em seguida contenha uma letra “o”, e depois
qualquer valor
3. Listar os nomes das pessoas cujo ID é 3, 5 ou 9
4. Listar todas as pessoas por ordem alfabética de nome
5. Listar todas as pessoas por ordem alfabética descentente de
nome

31

8
07/01/21

Combinando Tabelas
• Nas últimas aulas aprendemos como interrogar a base de
dados, uma tabela em cada consulta SELECT
• Para realizar consultas em mais de uma tabela normalmente é
preciso definir condições de junção entre elas
• Condições de junção normalmente ocorrem entre a chave
primária de uma tabela e a chave estrangeira de outra
• Em SQL podemos combinar tabelas usando:
• Operadores de junção:
• Inner join, natural join, equijoin, selfjoin, outerjoin
• Produto cartesiano (ou cross join)
• Operadores de conjunto: união, intersecção e diferença

35

Inner Join
• Quando um produto cartesiano aparece numa consulta,
provavelmente foi por lapso:
• Esquecemos de por uma clásula WHERE no SELECT
• Para o nosso exemplo, uma interrogação com mais sentido
seria:
• Identificar os cargos existentes e o nome dos funcionários que
desempenham esses cargos
• Para isso usamos a clásula INNER JOIN
• O INNER é opcional, muitas vezes usamos apenas o JOIN
• Na nossa consulta:
SELECT C.nomeCargo, F.nome as funcionario, F.salario
FROM cargo C INNER JOIN funcionario F
ON F.idCargo = C.idCargo

38

Inner Join – cont.


SELECT C.nomeCargo, F.nome as funcionario, F.salario
FROM cargo C INNER JOIN funcionario F
ON F.idCargo = C.idCargo ;

idFuncionario idCargo nome salario idCargo nomeCargo


1 A Ana 300 A tecnico
2 B Eva 560 B dba

nomeCargo funcionario salario


tecnico Ana 300
dba Eva 560

39

9
07/01/21

Inner Join – cont.


• Também podemos escrever um INNER JOIN usando apenas a
cláusula WHERE:
• Na nossa consulta:
SELECT C.nomeCargo, F.nome as funcionario, F.salario
FROM cargo C, funcionario F
WHERE F.idCargo = C.idCargo ;

• Uma vez que a clásula WHERE também é usada para restringir o


número de registos retornados por uma consulta (através das
condições de seleção), aconselha-se usar a clásula JOIN ao invés da
cláusula WHERE
• Quando as colunas usadas na condição de junção tem o mesmo
nome, podemos usar JOIN com USING ao invés de JOIN com ON
• Na nossa consulta:
SELECT C.nomeCargo, F.nome as funcionario, F.salario
FROM cargo C INNER JOIN funcionario F USING idCargo;

40

Self Join
• É usada quando queremos combinar dados que estão numa
mesma tabela
• Não existe uma clásula SELF JOIN, ao invés usa-se o JOIN
normalmente, excepto que apenas uma mesma tabela é
usada em ambos os lados do JOIN
• Para evitar ambiguidades, ambas as tabelas devem usar um
aliás
• Exemplo:
SELECT e.nome as empregado, c.nome as chefe
FROM empregado e JOIN empregado c
ON e.chefe_id = c.empregado_id
ORDER BY e.nome;

43

Mesma BD da ficha 8, com apenas


alguns registos diferentes
Exercício 4
• Dado o esquema relacional abaixo e as instâncias mostradas no
slide a seguir, escreva em SQL as consultas pedidas

CLIENTE(nif:integer,nome:varchar2(60),dtNasc:date)
VEICULO(matricula:varchar2(8),codModelo:integer,
nif_cliente:nteger, cor:varchar2(20), ano:number(4,0))
MODELO(codModelo:integer,descricao:varchar2(40))
ESTACIONA(cod:integer,num_patio:integer,
matricula_veiculo: varchar2(8),dtEntrada:date,
dtSaida:date, HsEntrada:varchar2(10),
hsSaida:varchar2(10))
PATIO(num:integer,endereco:varchar2(40),capacidade:integer)

44

10
07/01/21

Cliente Veículo
NIF nome dtNasc matricula codModelo NIF_cliente cor ano
223456 José 01-01-1973 JJJ-2020 1 111111 verde 1999
123456 Ana 09-09-1974 JEG-1010 1 223456 azul 2000
111111 João 13-04-1964 AJJ-3333 2 123456 verde 2005
444444 Eva 22-02-1956 JJX-1010 3 444444 azul 2000
Estaciona
cod Num_patio Matricula_veiculo Dt_entrada Dt_saida hsEntrada hsSaida
1 1 JJJ-2020 13-06-2005 13-06-2005 13:00 18:00
2 1 JEG-1010 23-05-2006 23-06-2006 7:00 18:00
3 1 AJJ-3333 17-09-2005 17-09-2005 9:00 18:00
4 2 JJX-1010 02-02-2004 03-02-2004 13:00 9:00
5 2 JEG-1010 16-04-2005 17-04-2005 13:00 18:00
Modelo Patio
codModelo descrição num endereco capacidade
1 Onix 1 Rato 40
2 Cobalt 2 Chiado 30

45

Exercício 4 – cont.
1. Exiba a matrícula e o nome dos donos de todos os veículos
2. Exiba o NIF e o nome do cliente que possui um veículo de
matrícula “JJJ-2020”
3. Exiba a matrícula e a cor do veículo que possui o código de
estacionamento 1
4. Exiba a matrícula, o ano do veículo e a descrição de seu
modelo, se o veículo possuir ano apartir de 2000
5. Exiba o endereço, a data de entrada e de saída dos
estacionamentos do veículo de placa “JEG-1010”
6. Exiba todos os clientes que possuem carro de modelo 1
7. Liste as matrículas, os horários de entrada e de saída dos
veículos de cor verde

46

Exercício 4 – cont.
8. Liste todos os estacionamentos do veículo de matrícula JJJ-2020
9. Exiba o nome do cliente que possui o veículo cujo código do
estacionamento é 2
10. Exiba o NIF do cliente que possui o veículo cujo código do
estacionamento é 3
11. Exiba a descrição do modelo do veículo cujo código do
estacionamento é 2
12. Exiba a matrícula, o nome dos donos e a descrição dos modelos
de todos os veículos que estiveram estacionados (data de
entrada) no período de 01-01-2005 e 31-12-2005
13. Liste todos os donos de veículos e matrícula de veículos, cujas
matrículas tenham as letas “JJ”

47

11
07/01/21

Exercício 4
• Dadas as seguintes tabelas, escrevas em SQL as consultas que
se pede.
FUNCIONARIO(codigo,primeiroNome,apelido,dtNasc,cidade,sala
rio,codSupervisor,codFuncao)
FUNCAO(codigo,descricao)

1. Listar o nome e apelido como “Nome Completo”, a


descrição da função como “Função” para aqueles
funcionários que moram no “Porto”, ordenado por primeiro
nome do funcionário
2. Listar o nome e apelido do empregado e nome e apelido de
seu supervisor para todos os funcionários
3. Listar o nome, a data de nascimento e o salário do
funcionário mais novo para o mais velho

48

Exercício 4 – cont.
FUNCIONARIO(codigo,primeiroNome,apelido,dtNasc,cidade,sala
rio,codSupervisor,codFuncao)
FUNCAO(codigo,descricao)

4. Listar o nome, a cidade e a função de todos os funcioários,


ordenado por cidade e função
5. Listar o nome dos funcionários que moram em “Coimbra” e
exerçam a função de “Telefonista”

49

12

Você também pode gostar