SQL - Tópicos

download SQL - Tópicos

of 29

Transcript of SQL - Tópicos

  • 8/8/2019 SQL - Tpicos

    1/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara SantosSQL (Tpicos) 1

    SQL (Tpicos)SQL (Tpicos)Structured Query LanguageStructured Query Language

    ISI Introduo aos Sistemas deInformao

    Semestre de Vero 2005/2006

    ISEL-DEETC-SSIC

    Lara Santos

    http://www.deetc.isel.ipl.pt/sinfoconhecimento/isi/

  • 8/8/2019 SQL - Tpicos

    2/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara SantosSQL (Tpicos) 2

    SQL: componentes

    SQL / DDL (Data Definition Language)

    Permite definir os Esquemas de Relao Permite definir os atributos dos Esquemas de Relao

    Permite definir restries (chaves primrias, estrangeiras,etc.)

    SQL / DML (Data Manipulation Language)

    Permite aceder informao armazenada na base de dados Permite inserir, eliminar e alterar a informao presenta nabase de dados

  • 8/8/2019 SQL - Tpicos

    3/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara SantosSQL (Tpicos) 3

    Comandos Principais Definio de Dados

    CREATE Criar estruturas de dados(tabelas, vistas,ndices)

    ALTER Alterar estruturas de dados

    DROP Remover estruturas de dados

    Interrogao

    SELECT

    Manipulao de Dados INSERT Inserir novos registos UPDATE Alterar registos existentes DELETE Apagar registos

    SQL / DDL

    SQL / DML

  • 8/8/2019 SQL - Tpicos

    4/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara SantosSQL (Tpicos) 4

    Comandos Principais

    Controlo de Transaes COMMIT SAVEPOINT

    ROLLBACK

    Segurana GRANT Usado para atribuir direitos de acesso

    DENY Usado para negar direitos de acesso REVOKE Usado para anular ordem direitos de

    acesso

  • 8/8/2019 SQL - Tpicos

    5/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara SantosSQL (Tpicos) 5

    Comando CREATE

    A sintaxe do geral do CREATE, para este caso:

    CREATE TABLE

    ( {

    [DEFAULT ]

    []

    }+

    [restrio de tabela]

    )

    restrio a aplicar a uma coluna aplica-se a mais de uma coluna

  • 8/8/2019 SQL - Tpicos

    6/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 6

    Sintaxe das restries:

    [CONSTRAINT nome_restrio]

    [{PRIMARY KEY | UNIQUE]} ( coluna, )] |

    [FOREIGN KEY ( coluna, ) {REFERENCES tabela [( coluna, )]|

    [CHECK( condio )]

    [ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}] |

    [ON UPDATE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}}]

  • 8/8/2019 SQL - Tpicos

    7/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 7

    INSERTE, UPDATE e DELETE

    INSERT (insere linhas numa tabela)INSERT INTO [(coluna1, coluna2, ...)]

    VALUES (valor1, valor2, ...) |

    UPDATE (actualiza linhas de uma tabela)UPDATE

    SET coluna = valor | expresso, coluna = valor |expresso, ...

    [WHERE ]

    DELETE (remove linhas de uma tabela)DELETE FROM [WHERE ]

  • 8/8/2019 SQL - Tpicos

    8/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 8

    Comando SELECT

    A sintaxe geral de uma interrogao SQL a seguinte:

    SELECT [DISTINCT] | *

    FROM[WHERE ]

    DISTINCT indica que se quer remover os duplicados no resultadofinal

    O smbolo * utilizado quando se pretendem seleccionar todos osatributos das tabelas especificadas na clusula FROM

  • 8/8/2019 SQL - Tpicos

    9/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 9

    Juno Interna e Externa

    INNER JOIN = JOIN

    OUTER JOIN

    LEFT OUTER JOIN

    RIGHT OUTER JOIN FULL OUTER JOIN

  • 8/8/2019 SQL - Tpicos

    10/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 10

    INNER JOINEx: Seja

    Material(codigoMaterial ,nome)Fornecedor(codigoFornecedor, nome)Fornece(codigoFornecedor, codigoMaterial)

    Qual o nome do fornecedor e os nomes dos materiais por elefornecido?

    SELECT Fornecedor.nome,Material.nomeFROM FornecedorINNER JOIN ForneceON (Fornecedor.codigoFornecedor = Fornece. codigoFornecedor)INNER JOIN MaterialON (Fornece.codigoMaterial=Material.codigoMaterial)

  • 8/8/2019 SQL - Tpicos

    11/29

  • 8/8/2019 SQL - Tpicos

    12/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 12

    Funes de Agregao

    Existem um conjunto de funes que efectuamoperaes sobre conjunto de linhas

    COUNT conta o nmero de linhas SUM efectua o somatrio de valoresAVG encontra a mdia de valores MAX determina o maior valor MIN determina o menor valor

    Ex.: SELECT COUNT(codEmpregado) FROM Empregado

  • 8/8/2019 SQL - Tpicos

    13/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 13

    Group By

    A clusula GROUP BY tem a forma:GROUP BY

    Onde uma lista de colunas separadas porvrgula, sobre as quais ser feito o agrupamento

    Ex:

    SELECT codigo, MAX(ordenado)

    FROM DEPARTAMENTO

    GROUP BY codigo

  • 8/8/2019 SQL - Tpicos

    14/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 14

    Having

    A clusula WHERE verificada para cada linha databela, ficando essa linha no resultado final se verificar acondio

    Por vezes, apenas se querem obter resultados sobregrupos quando estes verificam uma determinadacondio;

    Com a clusula WHERE no se consegue isso!!!

    A clusula HAVING verificada para o conjunto delinhas; s os grupos que verificarem a condio soconsiderados

  • 8/8/2019 SQL - Tpicos

    15/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 15

    Having (exemplo)

    Quais os cdigos dos departamentos e o maior dossalrios, onde a mdia seja maior que 1000?

    SELECT codDepartamento , MAX(Ordenado)FROM FUNCIONARIOGROUP BY codDepartamentoHAVING AVG(ordenado)>1000

    Uma diferena entre as clusulas HAVING e WHERE:

    A clusula HAVING deve sempre conter funes de agregao A clusula WHERE nunca contm funes de agregao

  • 8/8/2019 SQL - Tpicos

    16/29

  • 8/8/2019 SQL - Tpicos

    17/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 17

    ORDER BY

    Ex:

    Qual o nome e o departamento dos

    funcionrios existentes, ordenadosalfabeticamente?

    SELECT nome, codDepartamento

    FROM FUNCIONARIO

    ORDER BY nome ASC

  • 8/8/2019 SQL - Tpicos

    18/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 18

    GROUP BY, HAVING e ORDER BY

    A sintaxe do SELECT, com a incluso dasclusulas GROUP BY, HAVING e ORDER BY:

    SELECT [DISTINCT] | *

    FROM

    [WHERE ]

    [GROUP BY ]

    [HAVING ]

    [ORDER BY ]

  • 8/8/2019 SQL - Tpicos

    19/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 19

    GROUP BY, HAVING e ORDER BY

    Ex:Quais os cdigos dos departamentos e o maiordos salrios, onde a mdia seja maior que1000, ordenados por ordem decrescente desalrios?

    SELECT codDepartamento, MAX(Ordenado)FROM FUNCIONARIO

    GROUP BY codDepartamentoHAVINGAVG(ordenado)>1000ORDER BY 2 DESC

  • 8/8/2019 SQL - Tpicos

    20/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 20

    Sub-Interrogaes e Predicados

    Consideremos:

    CATEGORIA( codCat, nome, salarioBase )

    DEPARTAMENTO( codDep, nome, localizacao )

    EMPREGADO( codEmp, nome, salarioEfectivo, codCat, codDep )

  • 8/8/2019 SQL - Tpicos

    21/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 21

    Sub-Interrogao

    Ex:Qual o nome dos empregados que trabalham no mesmodepartamento que o(s) empregado(s) com nome JooMaria' ?

    SELECT nomeFROM EMPREGADO as EP1 INNER JOIN EMPREGADO as EP2ON(EP1.codDep=EP2.codDep)

    WHERE EP1.nomeEP2.nome AND EP1.nome=Joo Maria

    Existe no entanto outra soluo possvel:Separar a interrogao em duas partes!!!

  • 8/8/2019 SQL - Tpicos

    22/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 22

    Utilizando o predicado IN

    SELECT DISTINCT E1.nomeFROM EMPREGADO AS E1WHERE E1.nome Joo Maria'

    AND E1.codDep IN ( SELECT DISTINCT E2.codDepFROM EMPREGADO AS E2WHERE E2.nome = Joo Maria')

    Foi utilizada uma sub interrogao (SELECT interior) pararesponder questo.

    Ateno: o resultado da sub-interrogao pode corresponder a maisdo que um cdigo de departamento.

    Foi utilizado o predicado IN

  • 8/8/2019 SQL - Tpicos

    23/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 23

    Utilizando a comparao =

    Ex:

    Qual o cdigo e nome dos empregados que trabalhamno mesmo departamento que o empregado com cdigo

    4 ?SELECT E1.codEmp, E1.nomeFROM EMPREGADO AS E1

    WHERE E1.codEmp 4

    AND E1.codDep = ( SELECT E2.codDep

    FROM EMPREGADO AS E2WHERE E2.codEmp = 4 )

    Ateno : o resultado da sub-interrogao corresponde apenas a 1 cdigo

  • 8/8/2019 SQL - Tpicos

    24/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 24

    Utilizando o predicadoALL

    Ex:Quais os empregados cujo salrio base superior ouigual a todos os salrios base dos empregados dodepartamento 2?

    SELECT E1.codEmp, E1.nomeFROM EMPREGADO AS E1 INNER JOIN CATEGORIA AS C1ON (E1.codCat = C1.codCat)WHERE

    C1.salarioBase >= ALL ( SELECT C2.salarioBaseFROM EMPREGADO AS E2, CATEGORIA AS C2WHERE E2.codCat = C2.codCat

    AND E2.codDep = 2 )

  • 8/8/2019 SQL - Tpicos

    25/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 25

    Utilizando o predicadoANY

    Ex:Quais os empregados cujo salrio base superior aalgum dos salrios base dos empregados dodepartamento 2?

    SELECT E1.codEmp, E1.nomeFROM EMPREGADO AS E1 INNER JOIN CATEGORIA AS C1ON (E1.codCat = C1.codCat)WHERE

    C1.salarioBase > ANY ( SELECT C2.salarioBaseFROM EMPREGADO AS E2, CATEGORIA AS C2WHERE E2.codCat = C2.codCat

    AND E2.codDep = 2 )

  • 8/8/2019 SQL - Tpicos

    26/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 26

    Utilizando o predicado EXISTS

    Ex:Cdigo e nome dos departamentos que tmempregados (i.e. onde existe pelo menos umempregado)?

    SELECT D1.codDep, D1.nomeFROM DEPARTAMENTO AS D1WHERE EXISTS ( SELECT *

    FROM EMPREGADO AS E1

    WHERE E1.codDep =D1.codDep)

    Ateno: sub-interrogao correlacionada!!!

    A condio verdadeira se oresultado da sub-interrogaoforno vazio!!!!

  • 8/8/2019 SQL - Tpicos

    27/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 27

    Utilizando o predicado EXISTS

    Ex:

    Cdigo e nome dos departamentos que no tmempregados (i.e. onde no existe qualquer empregado)?

    SELECT D1.codDep, D1.nome

    FROM DEPARTAMENTO AS D1

    WHERE NOT EXISTS ( SELECT *

    FROM EMPREGADO AS E1

    WHERE E1.codDep =D1.codDep)

    Ateno: sub-interrogao correlacionada!!!

    A condio verdadeira se oresultado da sub-interrogaoforvazio!!!!

  • 8/8/2019 SQL - Tpicos

    28/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 28

    A Diviso utilizando o EXISTS

    Ex:Quais os departamentos que tm empregados de todas ascategorias?

    Outra forma de colocar a questo:

    Quais os departamentos para os quais no existe nenhumacategoria da qual no existem empregados nesse departamento.

    o mesmo que dizer que:

    Se existir uma categoria da qual determinado departamento notem empregados, ento no queremos esse departamento.

  • 8/8/2019 SQL - Tpicos

    29/29

    ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 29

    A divisoEx:

    Quais os departamentos que tm empregados de todasas categorias?

    SELECT D1.codDep, D1.nomeFROM DEPARTAMENTO AS D1WHERE NOT EXISTS

    (SELECT *FROM CATEGORIA AS C1WHERE NOT EXISTS

    ( SELECT *FROM EMPREGADO AS E1

    WHERE E1.codDep =D1.codDepAND E1.codCat =C1.codCat ))