comandos sql e exercicios avançados

Download Comandos sql e exercicios avançados

Post on 08-Aug-2015

421 views

Category:

Documents

2 download

Embed Size (px)

DESCRIPTION

dddddd

TRANSCRIPT

Juno de Tabelas

A figura abaixo resume as operaes de juno:

As operaes de juno dividem-se em dois grupos: horizontais e verticais. As horizontais actuam sobre linhas enquanto as verticais actuam sobre colunas. Juno horizontal Utiliza-se uma juno horizontal quando a consulta SQL requer dados de duas ou mais tabelas. Esta a operao que na prtica tira partido do conceito "base de dados relacional" pois permite mostrar os dados que esto armazenados em diferentes tabelas como se estivessem armazenados numa nica, desde que essas tabelas possuam um relacionamento entre si. A tabela resultado construda a partir de uma das tabelas originais, acrescentando colunas da segunda tabela, o que corresponde a um crescimento horizontal. A norma SQL99 define a sintaxe usada pelas clusulas do comando SELECT para fazer os diferentes tipos de juno. A base de dados Oracle suporta esta sintaxe desde a verso 9.0. Nas verses anteriores 9.0 era usada uma sintaxe antiga, que no caso da juno externa possuia uma notao proprietria. Por razes de compatibilidade com o passado a sintaxe antiga com as extenses

proprietrias contnua disponvel. Neste manual os comandos sero dados seguindo as duas abordagens: sintaxe antiga e SQL99.

Produto cartesiano

O produto cartesiano entre dois conjuntos um terceiro conjunto constitudo por todos os elementos do primeiro combinados com todos os elementos do segundo. Os comandos abaixo geram o produto cartesiado entre as tabelas EMP e DEP: Sintaxe antigaSELECT emp.empno, emp.ename, emp.deptno, dept.deptno, dept.dname FROM emp, dept; EMPNO ENAME DNAME ---------------------- ------------------ -------------7369 SMITH ACCOUNTING 7499 ALLEN ACCOUNTING 7521 WARD ACCOUNTING 7566 JONES ACCOUNTING 7654 MARTIN ACCOUNTING 7698 BLAKE ACCOUNTING 7782 CLARK ACCOUNTING 7788 SCOTT ACCOUNTING 7839 KING ACCOUNTING 7844 TURNER ACCOUNTING 7876 ADAMS ACCOUNTING 7900 JAMES ACCOUNTING 7902 FORD ACCOUNTING 7934 MILLER ACCOUNTING 7369 SMITH RESEARCH

SQL99SELECT emp.empno, emp.ename, emp.deptno, dept.deptno, dept.dname FROM emp CROSS JOIN dept; DEPTNO DEPTNO

---------------------- ------------20 30 30 20 30 30 10 20 10 30 20 30 20 10 20 10 10 10 10 10 10 10 10 10 10 10 10 10 10 20

7499 RESEARCH 7521 RESEARCH 7566 RESEARCH 7654 RESEARCH 7698 RESEARCH 7782 RESEARCH 7788 RESEARCH 7839 RESEARCH 7844 RESEARCH 7876 RESEARCH 7900 RESEARCH 7902 RESEARCH 7934 RESEARCH 7369 SALES 7499 SALES 7521 SALES 7566 SALES 7654 SALES 7698 SALES 7782 SALES 7788 SALES 7839 SALES 7844 SALES 7876 SALES 7900 SALES 7902 SALES 7934 SALES 7369 OPERATIONS 7499 OPERATIONS 7521 OPERATIONS 7566

ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER SMITH ALLEN WARD JONES

30 30 20 30 30 10 20 10 30 20 30 20 10 20 30 30 20 30 30 10 20 10 30 20 30 20 10 20 30 30 20

20 20 20 20 20 20 20 20 20 20 20 20 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 40 40 40 40

OPERATIONS 7654 OPERATIONS 7698 OPERATIONS 7782 OPERATIONS 7788 OPERATIONS 7839 OPERATIONS 7844 OPERATIONS 7876 OPERATIONS 7900 OPERATIONS 7902 OPERATIONS 7934 OPERATIONS 56 rows selected

MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER

30 30 10 20 10 30 20 30 20 10

40 40 40 40 40 40 40 40 40 40

Na sintaxe proprietria o produto cartesiano obtido quando se faz referencia a mais que duas tabelas e no se coloca uma condio de JOIN na clusula WHERE; Na sintaxe SQL99 o produto cartesiano obtido usando a clusula CROSS JOIN; A sintaxe SQL99 menos susceptvel a erros, pois preciso usar explicitamente a clusula CROSS JOIN, enquanto que na sintaxe proprietria, se houver esquecimento da clusula de JOIN ou erro na sua construo, sai um produto cartesiano; O resultado do produto cartesiano raramente til, pois mostra combinaes de linhas que no tm relao entre si e por isso no so teis para o utilizador. A sua execuo causa muito I/O na base de dados;

Juno Interna

Sumrio

A juno interna uma operao de juno horizontal entre duas tabelas, que usa uma comparao por igualdade entre a(s) coluna(s) comum(ns). Normalmente a(s) coluna(s) comum(ns) (so) Foreign Key numa tabela e Primary Key ou Unique Key na outra. A juno interna pode ser vista como um produto cartesiano filtrado, pois exige que as linhas da tabela da esquerda tenham correspondente na tabela da direita, sendo o valor da coluna comum igual. O diagrama apresentado a seguir mostra como funciona a juno interna entre duas tabelas:

A juno interna a operao mais importante nas bases de dados relacionais, pelo que suportada desde sempre. A norma SQL99 propos uma nova sintaxe para esta operao, tendo disponibilizado vrias clusulas que sero analisadas nos exemplos abaixo, onde tambm faremos a comparao com a sintaxe antiga. Os temas abordados sero:

Clusula ON Clusula USING Clusula NATURAL JOIN Comparao entre ON, USING e NATURAL JOIN Sinnimos para nomes de tabelas Juno com mais de duas tabelas A clusula de juno e a clusula de filtro A juno feita com coluna(s) UNIQUE

Clusula ON As tabelas EMP e DEPT possuem uma relao entre si, implementada atravs da coluna comum DEPTNO. Na tabela EMP sabemos qual o nmero do departamento em que o empregado trabalha. Na tabela DEPT sabemos o nmero, nome e localizao desse departamento. Para juntar os dois conjuntos efectuamos uma JUNO horizontaldas duas tabelas, usando uma igualdade de valores na coluna comum, como ilustrado nos exemplos abaixo:

Sintaxe antigaSELECT emp.empno,

SQL99SELECT emp.empno,

emp.ename, emp.deptno, dept.deptno, dept.dname, dept.loc FROM emp, dept WHERE emp.deptno=dept.deptno;

emp.ename, emp.deptno, dept.deptno, dept.dname, dept.loc FROM emp INNER JOIN dept ON (emp.deptno=dept.deptno); DEPTNO ------------20 30 30 20 30 30 10 20 10 30 20 30 20 10

EMPNO ENAME DEPTNO DNAME LOC ---------------------- ---------- ------------------------------ -------------- ------------7369 SMITH 20 RESEARCH DALLAS 7499 ALLEN 30 SALES CHICAGO 7521 WARD 30 SALES CHICAGO 7566 JONES 20 RESEARCH DALLAS 7654 MARTIN 30 SALES CHICAGO 7698 BLAKE 30 SALES CHICAGO 7782 CLARK 10 ACCOUNTING NEW YORK 7788 SCOTT 20 RESEARCH DALLAS 7839 KING 10 ACCOUNTING NEW YORK 7844 TURNER 30 SALES CHICAGO 7876 ADAMS 20 RESEARCH DALLAS 7900 JAMES 30 SALES CHICAGO 7902 FORD 20 RESEARCH DALLAS 7934 MILLER 10 ACCOUNTING NEW YORK 14 rows selected

Com esta operao o utilizador consegue visualizar o nome do empregado, o nome do departamento em que trabalha e a sua localizao, ou seja, v os dados de duas tabelas relacionadas como se fossem uma nica; Esta juno pode ser interpretada como um produto cartesiano ao qual foram eliminadas as linhas que no satisfazem a condio de juno; O comentrio anterior mostra como interpretar a juno em comparao com o produto cartesiano, mas no revela a forma como o

motor da base de dados efectivamente resolve a operao. Esta operao to importante que os construtores de motores relacionais investem muitos recursos para optimizar o desempenho, o que resulta na existncia de vrios meios para executar a juno, que dependem da dimenso das tabelas envolvidas, da existncia de ndices e da selectividade das colunas comuns. Produzir um produto cartesiano e depois filtrar linhas um meio muito dispendioso em termos de I/O e processamento, pelo que os motores recorrem a outros caminhos, cuja explicao mais detalhada est fora do mbito deste curso; As tabelas DEPT e EMP tm em comum a coluna DEPTNO pelo que nos comandos houve necessidade de distinguir de qual das tabelas queremos obter a coluna. Sempre que h ambiguidade nos nomes das colunas o utilizador obrigado a indicar o nome da tabela a que pertence a coluna pretendida. Por exemploEMP.DEPTNO e DEPT.DEPTNO; A maioria das operaes de juno so internas (INNER) pelo que a palavra reservada INNER facultativa;

Topo

Clusula USING A clusula USING est disponvel na sintaxe SQL99 e pode ser usada em vez da clusula ON sempre que a(s) coluna(s) usada(s) na juno tenha(m) o mesmo nome em ambas as tabelas. Esta clusula pode ser usada mesmo que existam outras colunas com o mesmo nome em ambas as tabelas. No caso das tabelas EMP e DEPT a juno pode ser feita com USING: Sintaxe antigaSELECT emp.empno, emp.ename, emp.deptno, dept.deptno, dept.dname, dept.loc FROM emp, dept WHERE emp.deptno=dept.deptno;

SQL99SELECT emp.empno, emp.ename, deptno, dept.dname, dept.loc FROM emp INNER JOIN dept USING (deptno);

Esta clusula facilita a escrita do query, mas requer a validao prvia de que a(s) coluna(s) usada(s) na juno tem(m) o mesmo nome em ambas as tabelas; A clusula USING obriga a que a(s) coluna(s) usada(s) na juno seja(m) referenciada(s) sem o nome da tabela a que pertence(m);

Topo

Clusula NATURAL JOIN A clusula NATURAL JOIN est disponvel na sintaxe SQL99 e pode ser usada em vez da clusula ON ou em vez da clusula USING sempre que:

A(s) coluna(s) usada(s) na juno tenha(m) o mesmo nome em ambas as tabelas; A(s) coluna(s) usada(s) na juno (so) a(s) nica(s) com o mesmo nome em ambas as tabelas;

No caso das tabelas EMP e DEPT a juno pode ser feita com NATURAL JOIN: Sintaxe antigaSELECT emp.empno, emp.ename, emp.deptno, dept.deptno, dept.dname, dept.loc FROM emp, dept WHERE emp.deptno=dept.deptno;

SQL99SELECT emp.empno, emp.ename, deptno, dept.dname, dept.loc FROM emp NATURAL JOIN dept;

Esta clusula facilita a escrita do query pois o utilizador no tem que referir qual(ais) a(s) coluna(s) que vai usar na juno; Esta clusula requer a validao prvia no s de que a(s) coluna(s) usada(s) na juno tem(m) o mesmo nome em ambas as tabelas mas tambm que (so) a(s) nica(s) coluna(s) comum(ns); A clusula NATURAL JOIN obriga a que a(s) coluna(s) usada(s) na juno seja(m) referenciada(s) sem o nome da tabela a que pertence(m);

Topo

Recommended

View more >