You are on page 1of 57

DEPARTAMENTO DE TECN.

DA INFORMAO E COMUNICAO ESTRUTURAS BASES DADOS

DE

_________________ 2 SEMESTRE
Versao 1.0

BASE

DE

DADOS

MODELO FISICO

SQL (Structured Query Language )

Comandos SQL

1. CONSULTAS NUMA NUMA NICA TABELA

Base de Dados

Comandos SQL

1 Consultas Com Uma Tabela Sintax:

Base de Dados

Comandos SQL

1. Consultas Com Uma Tabela


SELECT - especifica os atributos cujos valores interessa conhecer.

FROM - especifica as tabelas envolvidas no processamento em questo


Base de Dados

WHERE - especifica a condio de restrio que permite restringir o nmero de linhas a apresentar. GROUP BY - permite agrupar informao. HAVING - especifica as restries ao nvel dos grupos que so processados. ORDER BY - especifica a ordenao dos resultados.
7

Comandos SQL

1. Consultas Com Uma Tabela Exemplos:


ESTUDANTE (est_num, est_apelido, est_nome, est_sexo, est_bi, est_nacionalidade,est_morada, est_telef, est_email)

INSCRICAO(num_est, cod_disc, insc_data, nota)

(a) Imprimir o nmero e o nome de todos os estudantes. SELECT est_num, est_nome FROM estudante (b) Imprimir todos os dados de estudantes. SELECT * FROM estudante (c) Imprimir os nmeros dos inscritos. SELECT DISTINCT num_est FROM inscricao
8

DISCIPLINA (disc_cod, disc_nome)

Base de Dados

Comandos SQL

1.1 Clusula WHERE


Utilizamos para fazer filtragem de resultado.

Testes feitos:
Base de Dados

Comparao Intervalo Conjunto Valores nulos Correspondncia com padres


9

Comandos SQL

1.1 Clusula WHERE

10

Base de Dados

Comandos SQL

1.1 Clusula WHERE

11

Base de Dados

Comandos SQL

1.1 Clusula WHERE

Exemplos:
Dadas as seguintes tabelas

12

Base de Dados

Comandos SQL

1.1 Clusula WHERE

Exemplos:
(a) Imprimir todos os dados de empregados que esto no departamento 1. SELECT * FROM empregado WHERE cod_dept=1 (b) Imprimir o nmero, bi,nome e data de nascimento de todos os empregados cuja data de nascimento esta entre 01/01/1980 a 31/12/1985. SELECT emp_num, emp_bi, emp_nome, emp_data_nasc FROM empregado WHERE emp_data_nasc BETWEEN 01/01/1980AND 31/12/1985
13
Base de Dados

Comandos SQL

1.1 Clusula WHERE

Exemplos:
(c) Imprimir todos os empregados que estao nos departamentos 1, 2 e 4.

SELECT *
FROM empregado WHERE cod_dept IN (1,2,4) (d) Imprimir empregados sem telefone SELECT * FROM empregado WHERE emp_telef IS NULL (e) Imprimir bi e nome de empregados com nmero de telefone.
Base de Dados

SELECT emp_bi, emp_nome


FROM empregado WHERE emp_telef IS NOT NULL
14

Comandos SQL

1.1 Clusula WHERE

Exemplos:
(f) Imprimir os empregados cujo nome contm a palavra ca. SELECT * FROM empregado WHERE emp_nome LIKE %ca%
Base de Dados

(g) Imprimir os empregados cujo nome tem como segunda letra o SELECT * FROM empregado WHERE emp_nome like _o% (h) Imprimir os empregados cujo nome comea pela letra b SELECT *

FROM empregado
WHERE emp_nome like b %
15

Comandos SQL

Base de Dados

ACTIVIDADE

16

Comandos SQL

Exercicios de Consultas em uma table <Com estudantes>

ESTUDANTE (est_num, est_apelido, est_nome, est_sexo, est_bi, est_nacionalidade,est_morada, est_telef, est_email)


Base de Dados

INSCRICAO(num_est, cod_disc, insc_data, nota)

DISCIPLINA (disc_cod, disc_nome)

17

Comandos SQL

1.2 Condies Compostas

Sintax

18

Base de Dados

Comandos SQL

1.2 Condies Compostas

Exemplo:

Imprimir os nomes dos empregados que esto nos departamentos de 1 a 3 e sem nmero de telefone? SELECT emp_nome FROM empregado WHERE (cod_dept BETWEEN 1 AND 3) AND (emp_telef IS NULL)

Base de Dados

19

Comandos SQL

1.3 Ordenao dos Resultados

Sintax

Base de Dados

ASCendente, DESCendente

20

Comandos SQL

1.3 Ordenao dos Resultados

Exemplos: (a) Imprimir todos empregados com nmero de telefone na ordem crescente de data de nascimento. SELECT * FROM empregado WHERE emp_telef IS NOT NULL ORDER BY emp_data_nasc ASC (b) Imprimir todos os empregados ordenado por idade e departamento. SELECT * FROM empregado ORDER BY emp_data_nasc, cod_dept
21
Base de Dados

Comandos SQL

1.4 Funes de Agregao

Tm por objectivo executar clculos sobre o resultado de um comando SELECT (resumir) e so elas: SUM ( ) - Devolve a soma de todos os valores da coluna AVG ( ) - Devolve a mdia de todos os valores da coluna MAX ( ) - Devolve o maior valor da coluna MIN ( ) - Devolve o menor valor da coluna COUNT ( ) - Devolve o nmero de valores de uma coluna COUNT (*) - Devolve o nmero de linhas

22

Base de Dados

Comandos SQL

1.4 Funes de Agregao

Sintax

23

Base de Dados

Comandos SQL

1.4 Funes de Agregao

Exemplos: (a) Quantos departamentos possuem empregados? SELECT COUNT(DISTINCT cod_dept) FROM empregado (b) Quantos empregados foram registados na base de dados? SELECT COUNT(*) FROM empregado
Base de Dados

(c) Qual o numero total de empregados e quantos tem telefone?


SELECT COUNT(*), COUNT(emp_telef) FROM empregado NB: Nas funces de agregao SUM( ), AVG( ), MIN( ), MAX( ), COUNT( ) os valores NULL so ignorados.
24

Comandos SQL

1.5 Consultas Agrupadas

Em algumas ocasies necessrio agrupar registos. Exemplo: Calcular a media de salrios para cada departamento. Sintax:
Base de Dados

Exemplo:
Imprimir o total de empregados por cada departamento. SELECT cod_dept, COUNT(*) FROM empregado GROUP BY cod_dept

NB: Qualquer coluna que no seja uma funo de agregao s pode estar na clusula SELECT se estiver na clusula GROUP BY.
(rigidamente obrigatrio no Oracle- vede http://raelcunha.com/oracle.php) 25

Comandos SQL

1.5 Consultas Agrupadas

Restries sobre os Grupos: Clusula HAVING

HAVING actua unicamente sobre o resultado dos grupos e esta utilizada sempre que se pretende restringir o conjunto dos GRUPOS de registos a considerar.
Base de Dados

Sintax:

Exemplo:

Imprimir o total de empregados por idade, mas somentes para idades que ocuparam no mnimo trs departamentos.
SELECT emp_data_nasc, COUNT (*) FROM empregado GROUP BY emp_data_nasc HAVING COUNT (DISTINCT cod_dept)>=3
26

Comandos SQL

2. CONSULTAS MULTITABELAS

27

Base de Dados

Comandos SQL

2. Consultas em Mltiplas Tabelas

Base de Dados

Figura 1
28

Comandos SQL

2. Consultas em Multiplas Tabelas

Exemplos: Imprimir nmero, nome do empregado e nome e local do seu departamento. A soluo para este problema seria unir as duas tabelas atravs do campo
Base de Dados

comum e efectuar a consulta. Para que possamos acessar dados de duas ou mais tabelas em uma consulta, utilizamos a clausula JOIN. O JOIN efetuado com base em uma coluna que seja comum a duas ou mais tabelas. Por exemplo, na figura 1, para fazer um JOIN entre as tabelas EMPREGADO e DEPARTAMENTO, devemos usar a coluna dept_cod, que a coluna que relaciona as duas tabelas. Na tabela EMPREGADO, a coluna cod_dept utilizada para indicar em que DEPARTAMENTO o EMPREGADO est lotado.

29

Comandos SQL

2. Consultas em Multiplas Tabelas

Embora diferentes implementaes de banco de dados (Oracle, MySQL, Firebird, etc.) possam ter muitas maneiras de efetuar juno (JOIN) de tabelas , veremos os tipos de junes mais comuns que so utilizadas pelo MySQL, que so: INNER JOIN ou EQUIJOIN OUTER JOIN (LEFT JOIN e RIGHT JOIN) SELF JOIN CROSS JOIN ou FULL JOIN

30

Base de Dados

Comandos SQL

2. Consultas em Multiplas Tabelas

2.1 INNER JOIN ou EQUIJOIN - Juno de Igualdade Talvez a juno mais utilizada e a mais importante seja a INNER JOIN, que efetua a juno de duas tabelas com uma coluna que estas tenham em comum e que apresentem contedo equivalente.
Base de Dados

Na edio do comando, podemos abreviar a palavra INNER JOIN, colocando apenas JOIN.

Este tipo de juno retorna apenas os dados que existirem nas duas tabelas. A linha de dados que no tiver uma correspondncia com nenhuma outra linha de dados da outra tabela, no parecer no resultado da consulta. Sintax: Select <campos> from tab1 inner Join tab2 on<tab1.campo1>=<tab2.campo2> Inner join tabn on <tabn-1.campon-1> = <tabn.campon>
31

Comandos SQL

2. Consultas em Multiplas Tabelas

2.1 INNER JOIN ou EQUIJOIN - Juno de Igualdade Exemplo 2.1 : Imprimir nmero, nome do empregado e nome e local do seu departamento.
Base de Dados

A soluo para este problema seria unir as duas tabelas atravs do campo comum e efectuar a consulta. (A) SELECT emp_num, emp_nome, dept_nome, dept_localizacao FROM empregado inner Join departamento on cod_dept=dept_cod

32

Comandos SQL

2. Consultas em Multiplas Tabelas

2.1 INNER JOIN ou EQUIJOIN - Juno de Igualdade

RESULTADO:
Base de Dados

33

Comandos SQL

2. Consultas em Mltiplas Tabelas

ALIASES Em algumas vezes (casos de coincidncia de nomes de colunas duma tabela

com a outra ) esta soluo no ideal porque pode haver ambiguidade de


nomes.
Base de Dados

Para resolver este problema, vamos aplicar o conceito de ALIASES.


ALIASES consiste em renomear as tabelas na consulta.

34

Comandos SQL

2. Consultas em Multiplas Tabelas

2.1 INNER JOIN ou EQUIJOIN - Juno de Igualdade Repetindo o exemplo 2.1 (A) usando ALIASES Teremos: SELECT emp.emp_num, emp.emp_nome, dept.dept_nome,
Base de Dados

dept.dept_localizacao FROM empregado emp JOIN departamento dept ON emp.cod_dept=dept.dept_cod Por este mesmo conceito, tambm podemos renomear as colunas na consulta

como o seguinte.
SELECT emp.emp_num AS EMP_NUM, emp.emp_nome AS EMP_NOME, dept.dept_nome AS DEPT_NOME, dept.dept_localizacao AS DEPT_CIDADE

FROM empregado emp JOIN departamento dept


ON emp.cod_dept=dept.dept_cod.

35

Comandos SQL

2. Consultas em Multiplas Tabelas

2.1 INNER JOIN x CLAUSULA WHERE Sintax: Select <campos> from tab1, tab2, , tabn WHERE <tab1.campo1>=<tab2.campo2> AND AND <tabn-1.campon-1> = <tabn.campon> Exemplo 2.1: Imprimir nmero, nome do empregado e nome e local do seu departamento. (B) SELECT emp.emp_num, emp.emp_nome, dept.dept_nome, dept.dept_localizacao
Base de Dados

FROM empregado emp, departamento dept


WHERE emp.cod_dept=dept.dept_cod
36

Comandos SQL

2. Consultas em Multiplas Tabelas

2.1 INNER JOIN x CLAUSULA WHERE

RESULTADO:

37

Base de Dados

Comandos SQL

2. Consultas em Multiplas Tabelas

2.1 INNER JOIN x CLAUSULA WHERE As principais diferencas entre Exemplo 2.1(A) e 2.1(B) so: (i) No A temos juncao na clausula FROM, enquanto que no B na clausula WHERE;

Base de Dados

(ii) Embora o exemplo B seja mais simples e mais usado, computacionalmente tem menor desempenho comparado com A

38

Comandos SQL

2. Consultas em Multiplas Tabelas

2.2 OUTER JOIN (LEFT JOIN e RIGHT JOIN)

As OUTER JOINs so junes externas usadas para retornar todas as linhas que existem em uma tabela, mesmo que no existam linhas correspondentes na outra tabela que est sendo unida.
Base de Dados

Temos dois tipos de junes externas a LEFT OUTER JOIN e RIGHT OUTER JOIN. Na edio dos comandos SQL, podemos omitir a palavra OUTER. Sintax: Select <campos> from tab1 LEFT/RIGHT Join tab2 on <tab1.campo1>=<tab2.campo2> LEFT/RIGHT join tabn on <tabn-1.campon-1> = <tabn.campon>

39

Comandos SQL

2. Consultas em Multiplas Tabelas

2.2 OUTER JOIN (LEFT JOIN e RIGHT JOIN)

Exemplo 2.2 : Alistar todos os departamentos com seus respectivos empregados.


Base de Dados

NB: Dado que queremos alistar todos os departamentos, ate os que no tem empregados, vamos recorrer a OUTER JOIN e no a Inner Join. SELECT dept.dept_nome, dept.dept_localizacao, emp.emp_num, emp.emp_nome FROM departamento dept LEFT JOIN empregado emp ON dept.dept_cod= emp.cod_dept

40

Comandos SQL

2. Consultas em Multiplas Tabelas

2.2 OUTER JOIN (LEFT JOIN e RIGHT JOIN)

RESULTADO:

41

Base de Dados

Comandos SQL

2. Consultas em Multiplas Tabelas

2.2 OUTER JOIN (LEFT JOIN e RIGHT JOIN) x WHERE Sintax: Select <campos> from tab1, tab2, , tabn WHERE <tab1.campo1>*=<tab2.campo2> AND AND <tabn-1.campon-1>* = <tabn.campon>
Base de Dados

NB: * - colocado a esquerda de sinal de igualdade se for LEFT JOIN e a direita se for RIGHT JOIN

REPETINDO O EXEMPLO 2.2 SELECT dept.dept_nome, dept.dept_localizacao, emp.emp_num, emp.emp_nome FROM departamento dept , empregado emp WHERE dept.dept_cod*= emp.cod_dept
42

Comandos SQL

2. Consultas em Multiplas Tabelas

2.3 SELF JOIN (Auto juno) SELF JOIN usada para efetuar juno de uma tabela com dados dela mesma, como se a tabela na verdade fossem duas tabelas distintas. Isso possvel atravs do uso de ALIASES, como mencionado anteriormente. Sobre a juno de dados de uma mesma tabela, em que situao poderamos ter que fazer uma consulta deste tipo? Vejamos o seguinte exemplo:
Base de Dados

em nossa tabela EMPREGADO temos um campo que armazena o cdigo do chefe do EMPREGADO (cod_supervisor). Alguns EMPREGADOS possuem outro EMPREGADO como superior hierrquico, e outros no. Vamos fazer uma consulta para mostrar os EMPREGADOS que so supervisionados e os que no so.

43

Comandos SQL

2. Consultas em Mltiplas Tabelas

2.3 SELF JOIN (Auto juno) Select E1.emp_nome as Empregado, E2.emp_nome as Supervisor From Empregado E1 Left Join Empregado E2 On E1.cod_supervisor= E2.emp_cod WHERE E2.emp_cod <> E2.cod_supervisor RESULTADO:
Base de Dados

Empregado Supervisor Hermnia Tuaha Ossufo null

Ossufo
Adrito Aquiliama Daniela

null Tuaha
Tuaha Tuaha
44

Comandos SQL

2. Consultas em Multiplas Tabelas

2.4 CROSS JOIN ou FULL JOIN FULL JOIN ou CROSS JOIN ou ainda PRODUCTO CARTESIANO uma consulta que na verdade no utiliza a associao entre duas tabelas, apresentando um resultado que, muitas vezes, fruto de erros na sintaxe do comando, pois o resultado ser a associao de todos os campos da primeira tabela com todos os campos das demais tabelas. Se na minha primeira tabela (tabela esquerda) river dez linhas de dados e na segunda (tabela direita) mais dez linhas de dados e fizer uma consulta utilizando um JOIN entre as duas, o resultado trar no mximo dez linhas, isto , o resultado no pode ser maior do que a quantidade de linhas da maior tabela.

Em uma FULL JOIN, teremos como resultado 100 linhas de dados (10 linhas de uma tabelas multiplicadas por dez linhas da outra tabela). Este tipo de resultado tem um nome, chamado de produto cartesiano ou juno cruzada (CROSS JOIN), que a associao de cada linha de uma tabela com cada linha da outra tabela. Caso as tabelas sejam muito grandes (tenham muitas linhas de dados), o resultado poder conter centenas de milhares, ou at milhes de linhas de dados. Dependendo do resultado e do equipamento 45 envolvido, poderemos ter at o congelamento do servidor.

Base de Dados

Comandos SQL

2. Consultas em Multiplas Tabelas

2.4 CROSS JOIN ou FULL JOIN Exemplo 2.4 : Apresentar o Resultado de Cruzamento entre o Empregado e Departamento
Base de Dados

Select emp_num, emp_nome, dept_nome from epregado, departamento RESULTADO: UMA RELACAO COM 24 REGISTOS

46

Comandos SQL

3. SUBCONSULTAS

47

Base de Dados

Comandos SQL

SUBCONSULTA uma instruo SELECT aninhada dentro de uma instruo SELECT, INSERT, DELETE ou UPDATE ou dentro de uma outra subconsulta.

Podemos utilizar trs formas de sintax para criar uma subconsulta:


Base de Dados

<comparao> [ANY | ALL | SOME] (<instruo_sql>) <expresso> [NOT] IN (<instruo_sql>) [NOT] EXISTS (<instruo_sql>)

NB: Utilizamos subconsulta no lugar de uma expresso no campo de uma instruo SELECT ou em uma clusula WHERE ou HAVING.

48

Comandos SQL

Exemplo:

Listar Disciplinas com peso superior a media dos pesos de todas as disciplinas.
Base de Dados

Select * from disciplina where disc_peso>(select AVG(disc_peso) from disciplina);

49

Comandos SQL

3.1 ANY ou SOME

Utilizamos o predicado ANY/SOME, para recuperar registos na consulta principal que satisfaam a comparao com algum dos registos recuperados na subconsulta.
Base de Dados

Exemplo: Liste estudantes com idade superior a algum residente do Bairro Central. SELECT * FROM estudante WHERE est_morada NOT LIKE %B.Central% and est_data_nasc > ANY (SELECT est_data_nasc FROM estudante where est_morada LIKE %B.Central%);

50

Comandos SQL

3.2 ALL

Utilizamos o predicado ALL para na consulta principal recuperar apenas os registos que satisfaam a comparao com todos os registos recuperados na subconsulta.
Base de Dados

Exemplo: Liste estudantes com idade superior a todos residentes do Bairro Central. SELECT * FROM estudante WHERE est_morada NOT LIKE %B.Central% and est_data_nasc > ALL (SELECT est_data_nasc FROM estudante where est_morada LIKE %B.Central %);

51

Comandos SQL

3.3 IN/ NOT IN

Utilizamos o predicado IN para na consulta principal recuperar apenas os registos para os quais alguns registos na subconsulta contm um valor igual.

Exemplo1:
Base de Dados

Liste estudantes cujo apelido conscide com alguns residentes do Bairro de Central. SELECT * FROM estudante WHERE est_morada NOT LIKE %B.Central% and est_apelido IN (SELECT est_apelido FROM estudante where est_morada LIKE %B.Central%);

52

Comandos SQL

3.3 IN/ NOT IN

Exemplo2:

Liste estudantes cujo apelido no conscide com algum residente do Bairro de Central.
Base de Dados

SELECT * FROM estudante WHERE est_morada NOT LIKE %B.Central% and est_apelido NOT IN (SELECT est_apelido FROM estudante where est_morada LIKE %B.Central%);

53

Comandos SQL

3.4 EXISTS

Utilizamos o predicado EXISTS em comparaes true/false para determinar se a subconsulta retorna algum registro.

Exemplo:
Base de Dados

Liste todos estudantes inscritos.

SELECT * FROM estudante as e WHERE EXISTS (SELECT * FROM inscricao i WHERE i.num_est= e.est_num)

54

Comandos SQL

Base de Dados

ACTIVIDADE

55

Comandos SQL

Exercicios de Subconsultas<Com estudantes>

56

Base de Dados

Comandos SQL

1. Listar Disciplinas com peso superior ao minimo peso das disciplinas.


2. Listar Estudantes com maxima nota na disciplina de Base de Dados para o ano de 2008. 3. Listar Estudantes cuja nota na disciplina de base de dados para o ano
Base de Dados

de 2008 e superior a media das notas na mesma disciplina para o mesmo ano. 4. Liste a nota global de cada estudante tomando em consideracao somente as disciplinas que teve nota igual ou superior a 10.

5. Liste estudantes com idade supeior a todos estudantes do B. Central.


6. Liste todos estudantes inscritos. 7. Liste todos estudantes que nunca se inscreveram.

8. Liste todos estudantes inscritos na disciplina Sistemas de Informacao,


57

primeiro semestre.

You might also like