Professional Documents
Culture Documents
DE
_________________ 2 SEMESTRE
Versao 1.0
BASE
DE
DADOS
MODELO FISICO
Comandos SQL
Base de Dados
Comandos SQL
Base de Dados
Comandos SQL
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
(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
Base de Dados
Comandos SQL
Testes feitos:
Base de Dados
Comandos SQL
10
Base de Dados
Comandos SQL
11
Base de Dados
Comandos SQL
Exemplos:
Dadas as seguintes tabelas
12
Base de Dados
Comandos SQL
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
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
Comandos SQL
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
17
Comandos SQL
Sintax
18
Base de Dados
Comandos SQL
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
Sintax
Base de Dados
ASCendente, DESCendente
20
Comandos SQL
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
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
Sintax
23
Base de Dados
Comandos SQL
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
Comandos SQL
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
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
Base de Dados
Figura 1
28
Comandos SQL
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
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.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.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
RESULTADO:
Base de Dados
33
Comandos SQL
34
Comandos SQL
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
35
Comandos SQL
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
Comandos SQL
RESULTADO:
37
Base de Dados
Comandos SQL
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
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
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
RESULTADO:
41
Base de Dados
Comandos SQL
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.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.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
Ossufo
Adrito Aquiliama Daniela
null Tuaha
Tuaha Tuaha
44
Comandos SQL
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.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.
<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
49
Comandos SQL
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
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
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
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
56
Base de Dados
Comandos SQL
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.
primeiro semestre.