SlideShare ist ein Scribd-Unternehmen logo
1 von 121
Downloaden Sie, um offline zu lesen
Introdução ao SQL

Prof. Claudio Azevedo Passos
Modelo Relacional

• O Modelo Relacional prevê, desde sua concepção, a
  existência de uma linguagem baseada em caracteres
  que suporte a definição do esquema físico (tabelas,
  restrições, etc.), e sua manipulação (inserção, consulta,
  atualização e remoção)
SQL (Structured Query Language)

E. F. Codd: “A Relational Model of Data for Large
Shared Data Banks”, junho 1970


Definição de um modelo que propõe uma nova
estrutura de armazenamento em banco de dados



                       Modelo Relacional

 file: teorica_8.ppt       Banco deDados I - Silvia Soares   3
SQL (Structured Query Language)
IBM: linguagem SEQUEL (Structured English Query
Language)
Ferramenta de acesso ao modelo proposto por CODD
                          evolução
SQL (linguagem padrão para Banco de Dados Relacional)
1986 : American National Standards Institute (ANSI) e
       International Standards Organization (ISO)

            Padrão SQL (SQL 86)
IBM: padrão próprio (System Application Architecture
Database Interface – SAA SQL) em 1987
                                                  4
SQL (Structured Query Language)

              SQL




SELECT                       GRANT
            CREATE                     Segurança
UPDATE                      REVOKE
            ALTER
DELETE                      COMMIT
             DROP                      Controle
INSERT                    ROLLBACK
                          SAVEPOINT    transações
DML           DDL
                       SET TRANSACTION
          Com COMMIT        CONTROL
          “embutido”
                                             5
SQL (Structured Query Language)
    Propósito: interface para um banco de dados relacional
    (Oracle, DB2, SQL Server, Sybase, ...)

    A linguagem SQL tem diversas partes:
    Linguagem de definição de dados: DDL – comandos para a
     definição de esquemas de relações, exclusão de relações, criação
     de índices e modificação nos esquemas de relações
    Linguagem interativa de manipulação de dados: DML –
     linguagem de consulta baseada na álgebra e no cálculo relacional
     de tuplas. Engloba comandos para inserção, exclusão e modificação
     de tuplas no BD
    Incorporação DML (embedded DML): para aplicação em
     linguagens de programação (C, PL/I, COBOL, PHP, VB,...)
                                                                   6
SQL (Structured Query Language)

   Definição de visões: a SQL DDL possui comandos para definição
    de visões
   Autorização: a SQL DDL possui comandos para especificação de
    direitos de acesso a relações e visões
   Integridade: a SQL DDL possui comandos para especificação de
    regras de integridade que os dados que serão armazenados no BD
    devem satisfazer
   Controle de transações: a SQL DCL possui comandos para
    especificação de iniciação e finalização de transações. Algumas
    implementações permitem explicitar bloqueios de dados para
    controle de concorrência.

                                                                7
SQL (Comandos da DDL)

Comando Create
Este comando permite a criação de tabelas no banco de dados ou
mesmo de sua criação.

Sintaxe:
CREATE DATABASE < nome_db >;

onde:
 nome_db - indica o nome do Banco de Dados a ser criado.
SQL (Comandos da DDL)
• CREATE TABLE é o comando usado para criação da
tabela e deve ser seguida pelo nome que daremos à
tabela. Dentro do comando, devemos definir os nomes dos
campos de acordo com a conveniência do banco de
dados, e determinar o tipo de dado que poderá ser
incluído neste campo.

• PRIMARY KEY define a chave primária da tabela, isto é,
o campo que serve como chave da tabela e que não pode
ser repetido.

• NOT NULL é usado quando desejamos que um campo
seja de preenchimento obrigatório.
SQL (Comandos da DDL)
Comando Create table
Sintaxe:
CREATE TABLE < nome_tabela >
( nome_atributo1 < tipo > [ NOT NULL ],
nome_atributo2 < tipo > [ NOT NULL ],
......
nome_atributoN < tipo > [ NOT NULL ] )
PRIMARY KEY(nome_atributo_x,...) ;

onde:
   nome_table - indica o nome da tabela a ser criada.
   nome_atributo - indica o nome do campo a ser criado na tabela.
   tipo - indica a definição do tipo de atributo ( integer(n), char(n),
   real(n,m), date... ).
   n- número de dígitos ou de caracteres
   m- número de casas decimais
SQL (Comandos da DDL)

Comando Create table
Exemplo

CREATE TABLE clima (               CREATE TABLE cidades (
             cidade varchar(80),      nome varchar(80),
             temp_min int,            localizacao point
             temp_max int,         );
             Precipitacao real,
             data date
);
Tipos de dados

•   O SQL não diferencia letras maiúsculas e minúsculas nas palavras
    e nos identificadores, a não ser quando os identificadores estão
    entre aspas (") para preservar letras maiúsculas e minúsculas (o
    que não foi feito acima).

•    O PostgreSQL suporta os tipos SQL usuais int, smallint, real,
    double precision, char(N), varchar(N), date, time, timestamp e
    interval, assim bem como outros tipos de utilidade geral e um
    abrangente conjunto de tipos geométricos.
Tipos de dados
•   Bigint - inteiro de oito bytes com sinal
•   Bigserial - inteiro de oito bytes com auto-incremento
•   bit [ (n) ] cadeia de bits de comprimento fixo
•   bit varying [ (n) ] - cadeia de bits de comprimento variável
•   Boolean - booleano lógico (verdade/falso)
•   box - caixa retangular no plano
•   bytea - dados binários ("matriz de bytes")
•   character varying [ (n) ] varchar [ (n) ]cadeia de caracteres de comprimento
    variável
•   character [ (n) ] char [ (n) ] cadeia de caracteres de comprimento fixo
•   cidr endereço de rede IPv4 ou IPv6
•   circle círculo no plano
•   date data de calendário (ano, mês,dia)
•   double precision - número de ponto flutuante de precisão dupla
Tipos de dados
•   inet endereço de hospedeiro IPv4 ou IPv6
•   Integer inteiro de quatro bytes com sinal
•   interval [ (p) ] espaço de tempo
•   line linha infinita no plano
•   lseg segmento de linha no plano
•   macaddr endereço MAC
•   money quantia monetária
•   numeric [ (p, s) ] decimal [ (p, s) ] numérico exato com precisão
    selecionável
•   path caminho geométrico no plano
•   point ponto geométrico no plano
•   polygon caminho geométrico fechado no plano
•   Real - float de 4 bytes número de ponto flutuante de precisão simples
•   Smallint - inteiro de dois bytes com sinal
•   Serial inteiro de quatro bytes com auto-incremento
•   text cadeia de caracteres de comprimento variável
Tipos de dados

• time [ (p) ] [ without time zone ] hora do dia
• time [ (p) ] with time zone hora do dia, incluindo a zona
  horária
• timestamp [ (p) ] [ without time zone ] data e hora
• timestamp [ (p) ] with time zone data e hora, incluindo a
  zona horária
Create Table

• Exemplo:
  Como exemplo do uso do comando CREATE TABLE,
  imaginemos a necessidade de uma tabela que deva
  possuir os dados dos clientes de uma loja.

  CREATE TABLE Cliente     (
               Codigo INT NOT NULL,
               Nome VARCHAR (60) NOT NULL,
               Data_Nascimento DATE,
               Telefone CHAR (8),
               PRIMARY KEY (Codigo)
               );
Create table
•   Neste comando, criamos uma tabela chamada Cliente. Esta tabela contém quatro
    campos:
        O primeiro campo é o Código do cliente. Este campo será utilizado como chave primária de
        forma que não poderá se repetir nunca. Desta forma o campo deve ser sempre preenchido
        (NOT NULL), é numérico do tipo inteiro (INT).

        O campo Nome é do tipo VARCHAR (60), ou seja aceita dados alfa-numéricos com até 60
        caracteres. No entanto se um nome for inserido com menos de 60 caracteres, o número de
        bytes consumidos pelo campo será de acordo com o nome inserido.

        O campo de Data_Nascimento é do tipo DATE, ou seja, uma data, que no entanto não de
        preenchimento obrigatório (por isto não foi declarado o NOT NULL).

        O campo Telefone foi determinado como sendo alfa-numérico com oito caracteres definidos,
        e mesmo que sejam utilizados menos caracteres, o número de bytes consumidos serão
        sempre os mesmos independente dos dados. Isto é útil para dados alfanuméricos que não
        variam de tamanho, como o caso de UF no Brasil, cuja abreviação sempre são de dois
        caracteres.

        A instrução PRIMARY KEY define qual dos campos será a chave primária e não pode ser
        repetido, sendo o diferenciador entre os diversos clientes que sejam inseridos nesta tabela.
SQL - Visões
•   As visões permitem encapsular os detalhes da estrutura das
    tabelas, que podem mudar na medida em que os aplicativos
    evoluem, atrás de interfaces consistentes.

•   As visões podem ser utilizadas em praticamente todos os lugares
    em que uma tabela pode ser utilizada. Construir visões baseadas
    em visões não é raro.

Sintaxe

•   CREATE VIEW minha_visao AS
    SELECT cidade, temp_min, temp_max, prcp, data, localizacao FROM
    clima, cidades
    WHERE cidade = nome;


•   SELECT * FROM minha_visao;
REGRAS DE INTEGRIDADE

• Ao criarmos uma tabela dentro de um banco de dados
  devemos ter em mente as Regras de Integridade, que
  garantam a consistência, integridade e não redundância
  dos dados. Entre estas regras podemos englobar as
  chaves primárias, checagem e chave estrangeira.
Restrições de Integridade
          Integridade de Entidade
• Toda a tabela deve possuir, obrigatoriamente, uma
  coluna (ou uma composição de colunas) cujo valor é
  único para todas as instâncias  CHAVE PRIMÁRIA
  (PK)
• As chaves primárias funcionam como os campos que
  diferenciam os dados uns dos outros, e que não podem
  ser repetidos de nenhuma forma.
• Eventualmente, outras colunas além da chave primária
  podem ser únicas  CHAVE ALTERNATIVA (AK)
Restrições de Integridade
          Integridade de Domínio
• Cada coluna da tabela tem seus valores
  restringidos por
  – tipos de dados: definem o domínio de uma coluna
  – cod_cliente NUMBER ( 6 )
  – username      VARCHAR2 ( 20 )
• Restrições a valores nulos: definem se as
  colunas serão obrigatórias ou opcionais
  –   email VARCHAR2 ( 40 ) NOT NULL
  –   ddd NUMBER ( 3 )
Restrições de Integridade
       Integridade de Domínio
– valores padrão: define um valor padrão a ser
  associado a uma coluna se não for fornecido
  valor (ou for explicitamente fornecido um
  valor NULL) para esta durante a inserção

importado CHAR ( 1 ) DEFAULT 'N' NOT NULL

– A definição de valores padrões é particularmente
  importante para colunas NOT NULL
Restrições de Integridade
       Integridade de Domínio
– restrições de validação: restringem os
  valores que podem ser atribuídos a uma
  coluna
  CONSTRAINT CHK_PROD_IMPORTADO CHECK
  (importado in ('S','N'))
– tipos definidos pelo usuário: tipo de dado
  construído a partir de tipos pré-definidos,
  contendo restrição a valores nulos, regras
  de validação e um valor padrão
   • Não disponível em todos os SGBDs
Restrições de Integridade
                  Integridade Referencial
• As restrições de integridade referencial
  garantem a consistência dos relacionamentos
  entre as tabelas
      <<Table>>
       cidades
cod_cidade : NUMBER(4, 0)
nome : VARCHAR2(40)                                               <<Table>>
uf : CHAR(2)                       <<Non-Identifying>>             estados
                                                             uf : CHAR(2)
<<PK>> PK_CIDADES()         0..*
                                                         1   nome : VARCHAR2(20)
<<FK>> FK_EST_CID()                                          regiao : CHAR(2)

                                                             <<PK>> PK_ESTADOS()
Restrições de Integridade
         Integridade Referencial
• A chave estrangeira é uma cláusula que deve
  ser incluída quando possuímos mais de duas
  tabelas em um banco de dados.
• Através da chave estrangeira estabelecemos as
  relações entre duas ou mais tabelas. A chave
  estrangeira desta forma referencia o campo que
  é chave primária de outra tabela.

  FOREIGN KEY (Campo1, Campo2, Campo3 ...)
  REFERENCES Nome_Tabela2 (Nome_Chave);
Restrições de Integridade
          Integridade Referencial
• No exemplo, a definição da restrição de
  integridade referencial seria criada como segue

  CONSTRAINT FK_EST_CID FOREIGN KEY (uf) REFERENCES
  estados (uf)


• Esta restrição estabelece uma relação entre o
  atributo uf da tabela CIDADES e a chave
  primária da tabela ESTADOS
SQL – Chave Estrangeiras (Exemplo)
•    CREATE TABLE cidades (
      cidade varchar(80) primary key,
      localizacao point
);

•    CREATE TABLE clima (
      cidade varchar(80) references cidades,
      temp_min int,
      temp_max int,
      prcp real,
      data date
);
SQL – Chave Estrangeiras
• Agora ao se tentar inserir um registro
INSERT INTO clima VALUES (’Berkeley’, 45, 53, 0.0, ’1994-11-28’);


• O que acontece :
ERROR: <unnamed> referential integrity violation - key referenced
from clima not found in cidades

O comportamento das chaves estrangeiras pode receber um ajuste
fino na aplicação. Não iremos além deste exemplo simples neste
tutorial, mas consulte o Guia do Usuário do PostgreSQL para obter
mais informações.
Usar corretamente as chaves estrangeiras com certeza vai melhorar a
qualidade dos seus aplicativos de banco de dados, portanto
encorajamos muito que este tópico seja aprendido.
Restrições de Integridade
          Integridade Referencial
• O SGBD deve prover mecanismos para
  assegurar que a restrição de integridade seja
  respeitada, ou seja, uma linha violando a
  restrição de integridade referencial não poderá
  existir;
• Estes mecanismos prevêem a execução de uma
  ação em resposta a uma atualização, a fim de
  manter a integridade referencial.
Restrições de Integridade
          Integridade Referencial
• Existem diferentes ações possíveis para evitar
  que uma operação de atualização viole as
  restrições de integridade referencial
   – RESTRICT: impede a execução da operação
     Inserir uma Sala situada em um Prédio não
     existente
   – CASCADE: propaga a operação para respeitar as
     restrições de integridade referencial
     Remover uma Disciplina do Currículo, removendo
     todos os Pré-requisitos associados a esta
Restrições de Integridade
       Integridade Referencial
– SET NULL: assegura as restrições de integridade
  referencial associando um valor NULL à chave
  estrangeira que poderia violá-las
  Remover um Professor, fazendo com que a coluna
  matricula_professor em DISCIPLINAS_TURMAS
  fosse atualizada para NULL em todas as disciplinas
  que atua
 NULL não é considerado um valor, portanto, não
  fere as restrições de integridade referencial
– SET DEFAULT: semelhante à ação de SET NULL,
  mas associa um valor padrão à chave estrangeira
Definindo Valores Padrão
• Pode ser definido um valor padrão para uma
  coluna (literais, expressões ou funções)
• Se não for definido um valor, será utilizado o
  padrão
  – create table pedidos (
    num_pedido number ( 7 ),
    cod_cliente number ( 6 ) not null,
    cod_endereco number ( 2 ) not null,
    data_emissao date not null default
    sysdate,
    constraint pk_pedidos primary key
    (num_pedido));
Utilizando Valores Padrão
  – insert into pedidos (num_pedido,
    cod_cliente, cod_endereco)
    values (17645, 540, 290);
• Foi omitida a coluna data_emissão, logo,
  será utilizado o valor padrão
  – insert into pedidos (num_pedido,
    cod_cliente, cod_endereco,
    data_emissao)
    values (17645, 540, 290, NULL);
• Foi explicitamente definido NULL
Restrições de Integridade
    Integridade Definida pelo Usuário
• O Projetista do Banco de Dados pode definir
  restrições de integridade complexas, utilizando,
  por exemplo, o conceito de triggers
• Triggers são porções de código ativadas após
  certos eventos (inserção, atualização ou
  exclusão de linhas da tabela)
Resumindo, temos : Restrições de
    Integridade de Tabelas
 – CONSTRAINT nome_da_restrição
   PRIMARY KEY (colunas)
 – CONSTRAINT nome_da_restrição
   FOREIGN KEY (colunas) REFERENCES
   nome_da_tabela_pai [ON DELETE
   CASCADE]
 – CONSTRAINT nome_da_restrição
   UNIQUE (colunas)
 – CONSTRAINT nome_da_restrição CHECK
   (expressao)
Restrições de Integridade de
           Colunas
– CONSTRAINT nome_da_restrição NOT NULL
– CONSTRAINT nome_da_restrição PRIMARY KEY
– CONSTRAINT nome_da_restrição REFERENCES
  nome_da_tabela_pai [ON DELETE CASCADE]
– CONSTRAINT nome_da_restrição UNIQUE
– CONSTRAINT nome_da_restrição CHECK
  (expressao)
Exemplo- Restrições de Integridade nas
         Tabelas e nas Colunas
create table usuarios (
  cod_usuario number ( 6 ),
  nome varchar2 ( 100 )
      constraint nn_usu_nome not null,
  cpf char ( 11 )
      constraint nn_usu_cpf not null,
  email varchar2 ( 40 )
      constraint nn_usu_email not null,
  username varchar2 ( 20 )
      constraint nn_usu_username not null,
  password varchar2 ( 20 )
      constraint nn_usu_password_not null,
  constraint pk_usuarios primary key (cod_usuario),
  constraint ak_usu_cpf unique (cpf),
  constraint ak_usu_username unique (username));
Exemplo- Restrições de Integridade nas
         Tabelas e nas Colunas
create table produtos (
  cod_produto number ( 5 ) not null,
  titulo varchar2 ( 200 ) not null,
  ano_lancamento date not null,
  importado char ( 1 ) not null,
  preco number ( 10, 2 ) not null,
  prazo_entrega number ( 3 ) not null,
  constraint pk_produtos
     primary key (cod_produto),
  constraint chk_prod_importado
     check (importado in (‘S',‘N'))
);
Exemplo- Restrições de Integridade nas
         Tabelas e nas Colunas
create table administradores (
  cod_administrador number ( 6 ),
  nivel_privilegio number ( 1 ) not null,
  constraint pk_administradores primary key
  (cod_administrador),
  constraint fk_usu_adm foreign key
  (cod_administrador) references usuarios
  (cod_usuario)
);
SQL (Comandos da DDL)
• DROP TABLE — remove uma tabela

• DROP TABLE nome [, ...] [ CASCADE | RESTRICT ]

onde
NOME
O nome (opcionalmente qualificado pelo esquema) da tabela a ser removida.
CASCADE
Remove automaticamente os objetos dependentes da tabela (como visões).
RESTRICT
Recusa remover a tabela se existirem objetos dependentes. Este é o padrão.

Saídas
DROP TABLE
Mensagem retornada se a execução do comando for bem-sucedida.
ERROR: table "nome" does not exist
Se a tabela especificada não existe no banco de dados.
SQL (Comandos da DDL) – Alter Table
•   Descrição
      O comando ALTER TABLE altera a definição de uma tabela
    existente. Existem várias formas alternativas:

•   ADD COLUMN Esta forma adiciona uma nova coluna à tabela
    usando a mesma sintaxe do comando CREATE TABLE.

•   DROP COLUMN Esta forma remove uma coluna da tabela. Os
    índices e as restrições da tabela que referenciam a coluna também
    serão automaticamente excluídos. É necessário especificar
    CASCADE se algum objeto fora da tabela depender da coluna
    como, por exemplo, referências de chaves estrangeiras ou visões.

•   SET/DROP DEFAULT Estas formas definem ou removem o valor
    padrão para a coluna. O valor padrão somente é aplicado nos
    próximos comandos INSERT; as linhas existentes na tabela não
    são modificadas. Valores padrão também podem ser criados para
    visões e, neste caso, são inseridos pelo comando INSERT na visão
    antes da regra ON INSERT da visão ser aplicada.
SQL (Comandos da DDL) – Alter Table
•   SET/DROP NOT NULL Estas formas mudam se a coluna está
    marcada para permitir valores nulos ou para rejeitar valores nulos. A
    forma SET NOT NULL somente pode ser utilizada quando não
    existem valores nulos na coluna.

•   SET STATISTICS Esta forma define o valor usado para a coleta de
    estatísticas por coluna para as próximas operações de ANALYZE.
    O valor pode ser definido no intervalo de 0 a 1000; como alternativa,
    pode ser definido como -1 para utilizar o valor padrão do sistema
    para as estatísticas.

•   SET STORAGE Esta forma define o modo de armazenamento para
    a coluna.

•   RENAME A forma RENAME muda o nome de uma tabela (de um
    índice, de uma seqüência ou de uma visão), ou o nome de uma
    coluna da tabela. Não ocasiona efeito sobre os dados
    armazenados.
SQL (Comandos da DDL) – Alter Table
• DROP CONSTRAINT Esta forma remove restrições de
  tabela. Atualmente, as restrições de tabela não
  necessitam ter nomes únicos e, portanto, pode haver
  mais de uma restrição correspondendo ao nome
  especificado. Todas estas restrições serão removidas.

• OWNER Esta forma muda o dono da tabela, índice,
  seqüência ou visão como sendo o usuário especificado.
  É necessário ser o dono da tabela para executar o
  comando ALTER TABLE, exceto para a forma ALTER
  TABLE OWNER que somente pode ser executada por
  um superusuário.
SQL (Comandos da DDL)
• ALTER TABLE — Sintaxe
ALTER TABLE [ ONLY ] tabela [ * ]
ADD [ COLUMN ] column tipo [ restrição_de_coluna [ ... ] ]
ALTER TABLE [ ONLY ] tabela [ * ]
DROP [ COLUMN ] coluna [ RESTRICT | CASCADE ]
ALTER TABLE [ ONLY ] tabela [ * ]
ALTER [ COLUMN ] coluna { SET DEFAULT valor | DROP DEFAULT }
ALTER TABLE [ ONLY ] tabela [ * ]
ALTER [ COLUMN ] coluna { SET | DROP } NOT NULL
ALTER TABLE [ ONLY ] tabela [ * ]
ALTER [ COLUMN ] coluna SET STATISTICS inteiro
ALTER TABLE [ ONLY ] tabela [ * ]
ALTER [ COLUMN ] coluna SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
ALTER TABLE [ ONLY ] tabela [ * ]
RENAME [ COLUMN ] coluna TO novo_nome_da_coluna
ALTER TABLE tabela
RENAME TO novo_nome_da_tabela
ALTER TABLE [ ONLY ] tabela [ * ]
ADD definição_de_restrição_de_tabela
ALTER TABLE [ ONLY ] tabela [ * ]
DROP CONSTRAINT nome_da_restrição [ RESTRICT | CASCADE ]
ALTER TABLE tabela
OWNER TO novo_dono
SQL (Comandos da DML)
• SELECT (DISTINCT) (*, COLUNA (SINÔNIMO), ...)
FROM tabela
WHERE condição ou condições
ORDER BY (coluna, expressão) (ASC/DESC)

• Exemplo :
   SELECT registro, nome, cpf FROM cadastro;
SQL (Comandos da DML)
• Note aqueles nomes de colunas estão separados por
  uma vírgula.
• Ele possibilita selecionar todas as colunas da tabela,
  especificando um * (asterisco) depois do SELECT
  palavra comando.


• SELECT * FROM CADASTRO;
SQL (Comandos da DML)
• Outros itens da clausula SELECT

  – É possível incluir outros itens na clausula SELECT.
  – Expressões Aritméticas.

  – Colunas sinônimas

  – Concatenação de colunas

  – Literais
SQL (Comandos da DML)

• Expressões
  Aritméticas                        Operadores   Descrições

• Uma expressão é a                  +            Adição
    combinação de um ou mais
    valores, operadores, e funções   -            Subtração
    os quais avaliam para um
    valor.                           *            Multiplicação

•    Expressões Aritméticas
    podem conter nome de             /            Divisão

    colunas, valores numéricos
    constantes e operadores
    aritméticos                             Ex. : SELECT nome, SAL*12
                                                    FROM cadastro;
SQL (Comandos da DML)

• Colunas Sinônimas
•   Quando mostramos o resultado de uma pesquisa, o PgAdmin
    normalmente usa o nome as colunas selecionadas como cabeçalho.
    Em alguns exemplos ele pode ser sem sentido. Você pode modificar
    o cabeçalho de uma coluna usando sinônimos(alias).

•   Uma coluna sinônima é um cabeçalho de coluna alternativo na saída.
    Especifique o sinônimo (alias) depois da coluna na lista do SELECT.
    O cabeçalho sinônimo padrão será fornecido sem espaços em
    branco, amenos que o sinônimo esteja dentro de aspas duplos (“ “).

•   Exemplo :
     select registro, nome, datanasc “data de nascimento” from cadastro
SQL (Comandos da DML)

• O Operador de Concatenação
O Operador de Concatenação (||) permite que as colunas
sejam juntadas com outras colunas, expressões aritméticas
ou valores constantes para criar uma expressão
alfanumérica. Colunas ficam lado a lado com operadores
para formarem uma única coluna.

• Exemplo :
   SELECT registro||nome FROM cadastro;
SQL (Comandos da DML)

• Literais
• Um literal são um ou mais caracteres, expressões, números incluídos
na lista do SELECT o qual não é um nome de coluna ou de um
sinônimo
• Um literal na lista do SELECT terá uma saída para cada linha
retornada. Literais de livre formatos de textos podem ser incluídos no
resultado da pesquisa, e são tratados como uma coluna na lista do
SELECT.
•Datas e caracteres alfanuméricos devem ser colocados entre aspas
simples(‘); números não precisam de aspas simples.
• As declarações seguintes contém literais selecionados com
concatenação e colunas sinônimas.

Exemplo : select registro||’-’||nome from cadastro
SQL (Comandos da DML)
• Prevenindo a Seleção de Linhas Duplicadas
A menos que você indique de outra maneira, SQL*Plus mostrará os
resultados da pesquisa sem eliminar as duplicações.
Para listar todos os números de departamentos da tabela EMP, faça:
• Exemplo :
  SELECT DEPTBASE FROM CADASTRO;



• A clausula DISTINCT
Para eliminar valores duplicados no resultado, incluímos o DISTINCT
qualificador no comando SELECT.

Para eliminar os valores Duplicados mostrados no exemplo anterior, faça:
Exemplo :
 SELECT DEPTBASE FROM CADASTRO;
SQL (Comandos da DML)
• A clausula ORDER BY
• Normalmente a ordem das linhas retornadas de uma pesquisa é
indefinida. A clausula ORDER BY pode ser usada para ordenar as
linhas. Se usado, o ORDER BY precisa sempre ser a última clausula da
declaração SELECT.
Para ordenar pelo nome, faça:

• Exemplo :
  SELECT nome, deptobase FROM cadastro
ORDER BY nome;

SELECT nome, deptobase FROM cadastro
ORDER BY 1;
SQL (Comandos da DML)
• Ordenação por várias colunas.
• É possível na clausula ORDER BY usar mais de uma coluna. O limite
de colunas é de fato o número de colunas da tabela. Na clausula
ORDER BY especifica-se as colunas pelo que as linhas serão
ordenadas, separando as por vírgula. Se algumas ou todas são
invertidas especifique DESC depois de alguma ou cada uma das
colunas

• Exemplo   :

SELECT DEPTBASE, NOME FROM CADASTRO
ORDER BY DEPTBASE, NOME DESC;
SQL (Comandos da DML)
• A Clausula WHERE
A clausula WHERE corresponde aos Operadores de Restrições da
Álgebra Relacional.
Ele contém condições nas quais a linha precisa se encontrar em
ordem para ser mostrada.

Estrutura da seleção com restrições.
SELECT        coluna(s)
FROM          tabela(s)
WHERE         certa condição a ser encontrada
SQL (Comandos da DML)
A clausula WHERE pode comparar valores em uma coluna, valores
literais, expressões aritméticas ou funções. A clausula WHERE
conta com três elementos.
1- Um nome de coluna
2- Um operador de comparação
3- Um nome de coluna, um constante, ou lista de valores.
Operadores de Comparação são usados na clausula WHERE e
podem ser divididos em duas categorias, Lógicos e SQL.
     Operadores Lógicos
     Esses operadores lógicos testam as seguintes condições:
     Operador   Significado


     =          igual a

     >          maior que

     >=         maior e igual a

     <          menor que

     <=         menor e igual a
SQL (Comandos da DML)
• Para
     listar os nomes e departamentos de todos os
empregados do departamento 1402

• SELECT nome, deptobase FROM cadastro
   WHERE deptbase=1402;

• Para encontrar todos os nomes de departamentos com
número de departamento maior que 1500, faça

SELECT nome, deptobase FROM cadastro
  WHERE deptbase > 1500;
SQL (Comandos da DML)
Comparando uma coluna com outra coluna na mesma linha:
Você pode comparar uma coluna com outra coluna na mesma linha, da
mesma forma com um valor constante.

Por exemplo, suponhamos que você quer encontrar os empregados os
quais a comissão está maior que seu salário, faça:

SELECT nome FROM cadastro
WHERE Com >= Sal;
SQL (Comandos da DML)
• Operadores SQL
Existem quatro operadores SQL os quais opera, com todos tipos de
dados:
Operador                   Significado


BETWEEN ... AND ...        Entre dois valores (inclusive)


IN(Lista)                  compara uma lista de valores


LIKE                       Compara um parâmetro alfanumérico


IS NULL                    é um valor nulo
SQL (Comandos da DML)
• O Operador BETWEEN

Testa para um faixa de valores, e inclusive do menor a maior faixa.
Suponhamos que nós quisemos ver aqueles empregados nascidos
depois de 1960

SELECT nome, datanasc from cadastro
 WHERE datanasc BETWEEN '1960-01-01' AND '2007-01-31';
SQL (Comandos da DML)
• O Operador IN
  Testa os valores especificados em uma lista.
Para encontrar empregados que esteja um dos três departamentos,
faça:

SELECT nome, deptobase FROM cadastro
 WHERE deptobase IN (1402,1502,1503)
SQL (Comandos da DML)
• O Operador LIKE

 Algumas vezes você precisa procurar valores que você não conhece
exatamente Usando o operador LIKE é possível selecionar linhas
combinando parâmetros alfanuméricos. Dois símbolos podem ser
usados para construir uma linha de procura.

       Símbolo        Representa
       %              Várias seqüência de zero ou mais
                      caracteres



       _              um     número         desejado       de
                      caracteres
SQL (Comandos da DML)
• O Operador LIKE

Para listar todos os empregados os quais o nome começa com a letra
S, faça:

SELECT nome FROM cadastro
 WHERE nome LIKE 'S%';


Eles podem ser usados para encontrar um determinado número de
caracteres.
Por exemplo para listar todos empregados que tenham exatamente
quatro caracteres de tamanho do nome.

SELECT NOME FROM CADASTRO
 WHERE NOME LIKE '____'
SQL (Comandos da DML)
• Operador IS NULL
 Unicamente encontrar todos os empregados que não tenham telefone,
você testará um valor nulo:

SELECT nome FROM cadastro WHERE telefoneres IS NULL;
SQL (Comandos da DML)
• Expressões Negativas
Os operadores seguintes são testes de negação:


Operador                Descrição
!=                      não igual para (VAX,UNIX,PC)
^=                      não igual para (IBM)
<>                      não igual para         (todos   sistemas
                        operacionais)
NOT COLUNA_NOME= não igual que


NOT COLUNA_NOME> não maior que
SQL (Comandos da DML)
 • Operadores SQL

  Operador           Descrição
  NOT BETWEEN        tudo que estiver fora da faixa
  NOT IN             tudo que não estiver na lista
  NOT LIKE           tudo que não conter a linha de caracteres
  IS NOT NULL        tudo que não for nulo


Para encontrar aqueles empregados cujo os nomes não comecem
com a letra M, faça:

SELECT NOME, DEPTOBASE FROM CADASTRO
WHERE NOME NOT LIKE 'M%';
SQL (Comandos da DML)
Você pode combinar AND e OR na mesma expressão lógica.
 Quando AND e OR aparecer na mesma clausula WHERE,
todos os ANDs serão feitos primeiros e então todos os Ors
serão feitos.

Se AND não interfere sobre o OR a seguinte declaração SQL
retornará todos os gerentes com salário acima de 1500, e
todos os vendedores.

SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
FROM EMP WHERE SAL > 1500
AND JOB = 'MANAGER‘ OR JOB = 'SALESMAN'
SQL (Comandos da DML)
Extraindo Dados de Mais de uma Tabela


Ligações (Joins)

• Uma ligação é usada quando a pesquisa SQL requer dados
de mais de uma tabela do Banco de Dados.

• Linhas em uma tabela devem ser ligadas a outras linhas de
acordo com o valor comum existente na coluna
correspondente.

Existem dois tipos principais de condições de ligações:
1. Equi-join
2. Non-equi-join
SQL (Comandos da DML)
Extraindo Dados de Mais de uma Tabela


Equi-Join
• Na ordem para descobrir, manualmente, qual
  departamento vários empregados estão, nós
  comparamos a coluna DEPTOBASE da tabela
  CADASTRO com a mesmo valor de DEPTOBASE na
  tabela DEPT.
• O relacionamento entre a tabela EMP e a DEPT é um
  equi-join, em que o valor da coluna DEPTNO seja igual
  para ambas as tabelas( o = operador de comparação é
  usado).
SQL (Comandos da DML)
Extraindo Dados de Mais de uma Tabela


Uma condição de ligação é especificada na clausula
WHERE:

SELECT      coluna(s)
FROM        tabela(s)
WHERE       condição de ligação

Para ligar as duas tabelas CADASTRO e DEPTO, faça:
SELECT        CADASTRO.NOME, DEPTO.NOME
FROM          CADASTRO, DEPTO
WHERE         CADASTRO.DEPTOBASE = DEPTO.CODIGO;
SQL (Comandos da DML)
Extraindo Dados de Mais de uma Tabela


Usando Tabelas com Sinônimos

• Pode ser tedioso repetir o nome inteiro de um tabela em uma coluna.
Nomes temporários (ou sinônimos) podem ser usados na clausula
FROM. Estes nomes temporários valem unicamente para a declaração
de SELECT corrente. Tabelas sinônimas devem então ser declaradas na
clausula SELECT. Isso agiliza a pesquisa em que a declaração contém
muitas informações.

• Tabelas Sinônimas estão sendo usadas na seguinte declaração:

SELECT      C.NOME, D.NOME
FROM        CADASTRO C, DEPTO D
WHERE       C.DEPTOBASE = D.CODIGO
ORDER BY D.CODIGO
SQL (Comandos da DML)
 Extraindo Dados de Mais de uma Tabela

Nom-Equi-Join
• O relacionamento entre as tabelas CADASTRO e SALFAIXA
é um nom-equi-join, em que a coluna na CADASTRO
corresponde direto a uma coluna na SALFAIXA. O
relacionamento é obtido usando um outro operador que o
igual(=).
• Para avaliar um grau do salário de um empregado é
necessário que o salário esteja entre o menor e maior faixa
de salário.

• O operador BETWEEN é usado para construir a condição,
faça:
SELECT       C.NOME, C.SAL, S.FAIXA
FROM         CADASTRO C, SALFAIXA S
WHERE        C.SAL BETWEEN S.LOSAL AND S.HISAL;
SQL (Comandos da DML)
 Extraindo Dados de Mais de uma Tabela

1.   Mostra todos os nomes dos empregados e o nome de
     seus departamentos em ordem de nome de
     departamento
2.   Mostrar o nome de todos os empregados, nome e
     número do departamento
3.   Mostrar o nome e departamento dos empregados que
     nasceram antes de 1966.
4.   Mostrar todos os alunos do curso de cinema (225)
5.   Mostrar matricula, nome, curso e disciplina dos alunos do
     curso de filosofia que já cursaram a disciplina FIL311.
SQL (Comandos da DML)

Funções de Grupo
•     Funções de grupo operam sobre conjuntos de linhas.
      Elas retornam resultados baseados sobre um grupo de
      linhas, antes que um resultado por linha tenha retornado
      como uma função de linha única.


Group by
•     Como padrão todas as linhas de um tabela são trilhadas
      como um grupo. A clausula GROUP BY da declaração do
      SELECT é usada para dividir as linhas em menores
      grupos.
SQL (Comandos da DML)
Função                        Valor Retornado
AVG([DINSTINCT/ALL]n)         Valor médio de n, ignorando os valores
                              nulos.
COUNT([DINSTINCT/ALL]expr*)   Contador

                              * conta todas as linhas selecionadas,
                              incluindo duplicadas e linhas nulas

MAX([DISTINCT/ALL]expr)       valor máximo da expressão

MIN([DISTINCT/ALL]expr)       valor mínimo da expressão

STDDEV([DISTINCT/ALL]n)       Desvio padrão de n, ignorando valores
                              nulos.
SUM([DISTINCT/ALL]n)          Valor soma de n, ignorando valores
                              nulos.
VARIANCE([DISTINCT/ALL],n)    variação de n, ignorando valores nulos.
SQL (Comandos da DML)
Todas as funções do slide anterior operam sobre um número
de linhas (por exemplo, uma tabela inteira) e são portanto
funções de GRUPO.

• DISTINCT faz uma função de grupo considerar valores não
duplicados;

• ALL considera todos os valores sua declaração não é
necessária.

•Todas as funções de grupo exceto o COUNT(*) ignoram os
valores nulos
SQL (Comandos da DML)
Funções de Grupo
• AVG
Para calcular a média das GQs dos alunos
  do curso 047 :

SELECT AVG(gq1+gq2+gq3) FROM srhac01;
SELECT AVG(sal) FROM cadastro;
SQL (Comandos da DML)
Funções de Grupo
MIN
Uma função de grupo pode ser usada para subconjunto de
linhas de uma tabela usando a clausula WHERE.
Para encontrar o funcionário mais velho da UGF, do
deptobase 1711 faça:


• SELECT MIN(datanasc) FROM
CADASTRO WHERE deptobase = ‘1711';
SQL (Comandos da DML)
Funções de Grupo
COUNT
Para encontrar o número de empregados do
departamento 1711, faça:

SELECT COUNT(*) FROM CADASTRO
WHERE DEPTOBASE = 1711;

Nota: A função COUNT usada dessa forma COUNT(1)
tem o mesmo resultado que a acima e é mais rápida.
SQL (Comandos da DML)
Funções de Grupo
A clausula GROUP BY
•A clausula GROUP BY pode ser usada para dividir as
linhas de uma tabela em um menor grupo. Funções de
grupo devem ser usadas para resumir informações por
cada grupo.

 Para mostrar os funcionários mais velhos por
departamento, faça:
• SELECT deptobase, min(datanasc) FROM cadastro
GROUP BY deptobase;
SQL (Comandos da DML)
Funções de Grupo
Excluindo linhas quando estiver Usando o GROUP BY
Linhas devem ser excluídas com a clausula WHERE, antes
da divisão por grupos.

Para mostrar o funcionário mais velho por deptobase
excluindo o deptobase 1711, faça:

SELECT deptobase, min(datanasc)
 FROM cadastro
WHERE deptobase <> ‘1711‘
GROUP BY deptobase;
SQL (Comandos da DML)
Funções de Grupo
Grupos dentro de Grupos

Nós podemos então usar a clausula GROUP BY para
prover resultados para grupos dentro de grupos.

       Mostre o funcionário mais novo por cada função
dentro de um departamento, faça:

SELECT deptobase, funcao, max(datanasc) FROM
cadastro GROUP BY deptobase, funcao;
SQL (Comandos da DML)
Funções de Grupo
Funções de Grupo e Resultados Individuais
A seguinte declaração SQL retorna a maior idade
para cada grupo. O resultado não é significativo
porque o deptobase não é mostrado no resultado.
• SELECT MIN(datanasc) FROM cadastro
GROUP BY deptobase;

Mostrando o Departamento
• SELECT MIN(datanasc),deptobase FROM
cadastro GROUP BY deptobase;
SQL (Comandos da DML)
Funções de Grupo
Suponha na mente a seguinte regra quando
usar funções de grupo:

Se você inclui uma função de grupo no
comando SELECT, você não deve selecionar
resultados que não estejam declarados no
GROUP BY.
SQL (Comandos da DML)
Funções de Grupo
Por exemplo:
SELECT DEPTOBASE, MIN(DATANASC)
 FROM CADASTRO;
•ERROR: column "cadastro.deptobase" must
appear in the GROUP BY clause or be used in
an aggregate function.
O comando é inválido porque DEPTOBASE tem
um valor para cada linha da tabela, enquanto
MIN(DATANASC) tem um valor para tabela inteira.
SQL (Comandos da DML)
Funções de Grupo
Para corrigir o erro, nós devemos
agrupar o item individual:

SELECT DEPTOBASE, MIN(DATANASC)
FROM CADASTRO
GROUP BY DEPTOBASE;
SQL (Comandos da DML)
Funções de Grupo
A clausula HAVING
Use a clausula HAVING se você quiser especificar
o qual grupo será mostrado.

Para mostrar todos os departamentos que tiverem
mais de três empregados, faça:
SELECT DEPTOBASE FROM CADASTRO
GROUP BY DEPTNO
HAVING COUNT(1) > 3;
SQL (Comandos da DML)
Funções de Grupo
Para mostrar só os departamentos, onde
existe funcionários nascidos antes de
1930-01-01, faça:

SELECT deptobase, datanasc FROM cadastro
GROUP BY deptobase, datanasc
having min(datanasc)<='1930-01-01'
SQL (Comandos da DML)
Funções de Grupo
A clausula WHERE não pode ser usada para restringir
itens de grupo.
A seguinte declaração da clausula WHERE é errada.

SELECT deptobase, datanasc FROM cadastro
GROUP BY deptobase, datanasc
WHERE min(datanasc)<='1930-01-01'


Você pode unicamente usar WHERE para restringir
linhas individuais. Para restringir colunas de grupos
usa-se a clausula HAVING.
SQL (Comandos da DML)
Funções de Grupo
Nota:
Você pode excluir todos os “gerentes”
usando a clausula WHERE quando
estiver agrupando por cargo.

SELECT funcao FROM cadastro
WHERE funcao <> ‘035013'
GROUP BY funcao;
SQL (Comandos da DML)
Funções de Grupo
Exercícios
1.    Encontrar o funcionário mais antigo
2.    Encontrar o funcionário mais antigo e o mais novo
3.    Listar o mais novo e o mais velho funcionário por
     cargo
4.    Encontrar quantos funcionários lecionam
5.    Mostre o departamento e a sua descrição que
     tiverem mais de 40 empregados
6.    Cheque se todos os números de funcionários são
     únicos
SQL (Comandos da DML)
INSERT
 insert into nomedatabela
(campo 1,...,campo n)
Values (valor 1,...,valor n)

Exemplo 1:
INSERT INTO alunovestibular
(matricula,notaobjetiva,notaredacao,classificacao)
 VALUES (‘20061000001’,’20’,’2.5’,1);
SQL (Comandos da DML)
INSERT
 insert into nomedatabela
(campo 1,...,campo n)
Values (valor 1,...,valor n)

Exemplo 2:
INSERT INTO alunovestibular
  VALUES (‘20061000001’,’20’,’2.5’,1);
SQL (Comandos da DML)
UPDATE
UPDATE nomedatabela
SET campo 1 = valor 1,..., campo n = valor n

Exemplo :
"UPDATE alunovestibular
SET notaobjetiva=’20’,
    notaredacao=‘3.5’,
    classificacao=‘2'
WHERE matricula='".$matricula."'";
SQL (Comandos da DML)
DELETE
DELETE FROM nomedatabela
WHERE <CONDIÇÃO>

Exemplo : ?
SQL (Comandos da DML)
Sub-Pesquisas
• Pesquisas contendo na clausula WHERE ou HAVING de
outra declaração SQL

• Uma sub-pesquisa é uma declaração SELECT que é
aninhada com outra declaração SELECT e a qual retorna
resultados intermediários.

• Por exemplo:
SELECT coluna1, coluna2, ...
FROM tabela
WHERE coluna = (SELECT coluna
                  FROM tabela
                    WHERE condição)
SQL (Comandos da DML)
Sub-Pesquisas
• A sub-pesquisa é geralmente referida como SUB-SELECT
ou SELECT interno;


• Geralmenteexecuta primeiro e a saída é usada para
completar a condição da pesquisa principal ou outra
pesquisa.
SQL (Comandos da DML)
Sub-Pesquisas de Linha Única
•   Para encontrar o empregado que ganha o
    mínimo salário na companhia (o mínimo
    salário é uma quantidade desconhecida),
    dois passos devem ser seguidos:

1. Encontrar o salário mínimo:
SELECT MIN(salario) FROM cadastro;
SQL (Comandos da DML)
Sub-Pesquisas de Linha Única
•   2. Encontrar o empregado que ganha o
    salário mínimo:

SELECT nome, salario FROM cadastro
WHERE salario = (menor salário o qual é
  desconhecido)
SQL (Comandos da DML)
Sub-Pesquisas de Linha Única
• Nós podemos combinar os dois comandos
  como uma sub-pesquisa aninhada:

SELECT nome, salario FROM cadastro
WHERE salario = SELECT MIN(salario)
                 FROM cadastro;
SQL (Comandos da DML)
Sub-Pesquisas de Linha Única
•   Como são processadas as Sub-pesquisas
    Aninhadas?
• Uma declaração SELECT pode ser considerada
  como uma pesquisa em bloco. O exemplo
  anterior consiste de duas pesquisas em bloco - a
  principal pesquisa e a pesquisa interna.
• A interna declaração SELECT é executada
  primeiro, produzindo um resultado : 800. A
  principal pesquisa em bloco está então
  processando e usa o valor retornado pela
  pesquisa interna para completar a condição
  procurada.
SQL (Comandos da DML)
Sub-Pesquisas de Linha Única
•   Na essência, a principal pesquisa finaliza-se
    olhando como isso:
    SELECT nome, salario FROM cadastro
    WHERE salario = 800;

•   No exemplo acima, o 800 é um valor único. A
    sub-pesquisa que retorna o valor 800 é
    chamada de sub-pesquisa de linha única.
    Quando uma sub-pesquisa retorna uma única
    linha: uma linha ou operador lógico deve ser
    usado. Por exemplo: =, <, >, <=, etc.
SQL (Comandos da DML)
Sub-Pesquisas de Linha Única
•   Para encontrar todos os empregados que trabalham no
    mesmo departamento do Camarão nós fazemos:

    SELECT nome, deptobase
     FROM cadastro
     WHERE deptobase = (SELECT deptobase
           FROM cadastro
           WHERE nome = ‘Camarão');

     A pesquisa interna retorna o departamento do
     Camarão, o qual é usado na condição WHERE da
     pesquisa principal
SQL (Comandos da DML)
Sub-Pesquisas que Retorna mais de Uma Linha

• A seguinte pesquisa atende para
  encontrar os empregados que ganham o
  menor salário nos departamentos.

    SELECT nome, salario, deptobase
    FROM cadastro
    WHERE salario IN (SELECT MIN(salario)
                        FROM cadastro
                   GROUP BY deptobase);
SQL (Comandos da DML)
Sub-Pesquisas que Retorna mais de Uma Linha

Note que a pesquisa interna tem a clausula
GROUP BY. Isso significa que ele pode retornar
mais que um valor.

Nós precisamos para usar múltiplas linhas de um
operador de comparação. Neste caso o operador
IN deve ser usado porque específica uma lista de
valores
SQL (Comandos da DML)
Sub-Pesquisas que Retorna mais de Uma Linha

• Comparando mais de um valor

A seguinte pesquisa encontrará aqueles empregados que
ganham o menor salário no seu respectivo departamento:

 A seguinte pesquisa encontrará aqueles empregados que
ganham o menor salário no seu respectivo departamento:

    SELECT nome, salario, deptobase FROM cadastro
    WHERE (salario,deptobase) IN (SELECT MIN(salario), deptobase
                                      FROM cadastro
                                       GROUP BY deptobase);
SQL (Comandos da DML)
Sub-Pesquisas que Retorna mais de Uma Linha

• Erros Encontrados
Quando uma sub-pesquisa retorna mais que uma linha e
um operador de linha única é usado, a seguinte mensagem
de erro:
    SELECT nome, salario, deptobase
    FROM cadastro
    WHERE salario = (SELECT MIN(salario)
           FROM cadastro
           GROUP BY deptobase);

    ERROR -> more than one row returned by a subquery used as an
     expression
SQL (Comandos da DML)
Operadores ANY ou ALL
• Os operadores ANY ou ALL devem ser usados para sub-
pesquisas que retornam mais de uma linha. Eles são
usados na clausula WHERE ou HAVING em conjunto com
os operadores lógicos. (=,<>, <, >, >=, <=).
• ANY compara um valor para cada valor retornado em uma
sub-pesquisa.
Para mostrar os empregados que ganham mais que o
menor salário no departamento 3003, faça:

    SELECT nome, salario, funcao, deptobase FROM cadastro
    WHERE salario >ANY (SELECT DISTINCT salario
             FROM cadastro WHERE deptobase = 3003)
    ORDER BY salario DESC;
SQL (Comandos da DML)
Operadores ANY ou ALL

• O menor salário do departamento 3003 é 500. A principal
pesquisa tem que retornar os empregados que ganham o
salário maior que o menor salário no departamento 3003.

• ‘< ANY’ é equivalente ao IN.

• Quando usamos ANY, a palavra chave DISTINCT é usada
para prevenir a seleção de linhas ocupadas.
SQL (Comandos da DML)
Operadores ANY ou ALL
• ALL compara um valor com todos os valores retornados em uma sub-
pesquisa
• A seguinte pesquisa encontra os empregados que ganham mais que
todos os empregados no departamento 3003.

  SELECT nome, salario, funcao, deptobase
  FROM cadastro
  WHERE salario>ALL (SELECT DISTINCT salario
         FROM cadastro
         WHERE deptobase = 3003)
  ORDER BY salario DESC;

  O maior salário no departamento 3003 é 6500, a pesquisa tem que
  retornar aqueles empregados que ganham mais que 6500. Existe
  salário maior que o maior do departamento 3003.

  O operador NOT podem ser usado com IN, ANY ou ALL.
SQL (Comandos da DML)
Operadores Exists
• O operador EXISTS é freqüentemente usado com Sub-pesquisas
correlatas. Ele testa quando um valor existe. (NOT EXISTS garante que
não existe). Se o valor existir será retornado Verdadeiro, se não existir
será retornado Falso.

• Para encontrar os empregados que tem no mínimo uma pessoa
subordinada a ele, faça:
  SELECT EMPNO, ENAME, JOB, DEPTNO
  FROM EMP E
  WHERE EXISTS (SELECT EMPNO
          FROM EMP
          WHERE EMP.MGR = E.EMPNO)
  ORDER BY EMPNO;
SQL (Comandos da DML)
Operadores Exists
• Encontrar os empregados que o departamento não é o da tabela DEPT:

 SELECT, ENAME, DEPTNO
 FROM EMP
 WHERE NOT EXISTS (SELECT DEPTNO
          FROM DEPT
          WHERE DEPT.DEPTNO = EMP.DEPTNO);

• Outro caminho para encontrar o departamento que não tem nenhum
empregado é:

 SELECT DEPTNO, DNAME
 FROM DEPT D
 WHERE NOT EXISTS (SELECT 'X'
         FROM EMP E
         WHERE E.DEPTNO = D.DEPTNO);

• Note que o SELECT interno não precisa retornar um valor específico,
unicamente um literal para ser selecionado.
SQL (Comandos da DML)
Clausula HAVING com Sub-pesquisas aninhadas
• Lembre-se que WHERE refere-se para linha única e
HAVING a grupos de linhas especificadas na clausula
GROUP BY.
• Por exemplo, para mostrar os departamentos que tenham
a média salarial maior que a do departamento 3003, faça:


SELECT deptobase, AVG(salario) FROM cadastro
HAVING AVG(salario) > (SELECT AVG(salario)
                        FROM cadastro
                        WHERE deptobase = 3003)
                        GROUP BY deptobase;
SQL (Comandos da DML)
Clausula HAVING com Sub-pesquisas aninhadas
Para construir uma pesquisa que encontre a função com
maior média salarial, faça:

  SELECT funcao, AVG(salario)
  FROM cadastro
  GROUP BY funcao
  HAVING AVG(salario) = (SELECT MAX(AVG(salario))
                       FROM cadastro
                       GROUP BY funcao);
SQL (Comandos da DML)
Sub-pesquisas aninhadas
Sub-pesquisas devem ser aninhadas (usadas com outras
sub-pesquisas):
• Mostrar o nome, cargo e admissão para os empregados
cuja o salário seja maior que o maior salário do
departamento ‘NUCLEO DE TEC DA INFORMACAO ’.

SELECT nome, funcao, dataadmissao, salario FROM cadastro
WHERE salario > (SELECT MAX(salario) FROM cadastro
     WHERE deptobase = (SELECT deptobase FROM deptofunc
               WHERE descricao = ' NUCLEO DE TEC DA
                                  INFORMACAO '));
SQL (Comandos da DML)
• Performance depende do uso dos índices, o número de
linhas retornadas pela pesquisa, o tamanho da tabela e se
tabelas temporárias são requeridas para avaliar resultados
temporários.
• As tabelas temporárias geradas pelo SGBD não são
indexadas, e essa pode levar para o degradamento na
performance para sub-pesquisas usando IN, ANY e ALL.
SQL (Comandos da DML)
 Sub-pesquisas aninhadas

Exercícios
1.    Encontrar os empregados que ganham o maior salário em cada
     função e ordenar o salário da forma descendente
2.    Encontrar os empregados que ganham o mínimo salário para sua
     função. Mostrar o resultado em ordem ascendente de salário.
3.    Encontrar o mais recente admitido empregado em cada
     departamento. Ordenado por admissão.
4.    Mostre o nome, salário e departamento para qualquer empregado
     que ganhe um salário maior que a média para seu departamento.
     Ordenar pelo número de departamento.
5.    Lista todos os departamentos onde não existem empregados.
(Usando dessa vez um sub-pesquisa).
SQL (Comandos da DCL)
    Comandos da DCL
•      GRANT
•     GRANT — concede privilégios de acesso
•     Sinopse
•     GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES |
      TRIGGER }
      [,...] | ALL [ PRIVILEGES ] }
      ON [ TABLE ] nome_da_tabela [, ...]
      TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]
•     GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
      ON DATABASE nome_bd [, ...]
      TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]
•     GRANT { EXECUTE | ALL [ PRIVILEGES ] }
      ON FUNCTION nome_da_função ([tipo, ...]) [, ...]
      TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]
•     GRANT { USAGE | ALL [ PRIVILEGES ] }
      ON LANGUAGE nome_da_linguagem [, ...]
      TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]
•     GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
      ON SCHEMA nome_do_esquema [, ...]
      TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]
SQL (Comandos da DML)
    Comandos da DDL
•     O comando GRANT concede privilégios específicos sobre um
      objeto (tabela, visão, seqüência, banco de dados, função,
      linguagem procedural ou esquema) para um ou mais usuários ou
      grupos de usuários.

•     Estes privilégios são adicionados aos já concedidos, caso existam.


•      Exemplos:
1.    GRANT SELECT ON minha_tabela TO PUBLIC;
2.    GRANT SELECT,UPDATE,INSERT ON minha_tabela TO GROUP
      todos;
SQL (Comandos da DML)
Comandos da DDL
Exemplos :
 Conceder, para todos os usuários, o privilégio de inserir na
 tabela filmes:
• GRANT INSERT ON filmes TO PUBLIC;

Conceder todos os privilégios na visão tipos para o usuário
 manuel:
• GRANT ALL PRIVILEGES ON tipos TO manuel;
SQL (Comandos da DML)
Comandos da DDL
• O comando REVOKE é utilizado para revogar privilégios
 de acesso.


Exemplos :
• Revogar o privilégio de inserção na tabela filmes concedido
 para todos os usuários:
 REVOKE INSERT ON filmes FROM PUBLIC;

• Revogar todos os privilégios concedidos ao usuário manuel
 relativos à visão vis_tipos:
REVOKE ALL PRIVILEGES ON vis_tipos FROM manuel;

Weitere ähnliche Inhalte

Was ist angesagt? (19)

TOTVS LINHA RM TREINAMENTO SQL
TOTVS LINHA RM TREINAMENTO SQLTOTVS LINHA RM TREINAMENTO SQL
TOTVS LINHA RM TREINAMENTO SQL
 
Banco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQLBanco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQL
 
Aprofundamento de DDL e DML
Aprofundamento de DDL e DMLAprofundamento de DDL e DML
Aprofundamento de DDL e DML
 
Banco de Dados - MySQL Basico
Banco de Dados - MySQL BasicoBanco de Dados - MySQL Basico
Banco de Dados - MySQL Basico
 
Aula 10 banco de dados
Aula 10   banco de dadosAula 10   banco de dados
Aula 10 banco de dados
 
Aula de SQL - Básico
Aula de SQL - BásicoAula de SQL - Básico
Aula de SQL - Básico
 
Aula 11 banco de dados
Aula 11   banco de dadosAula 11   banco de dados
Aula 11 banco de dados
 
Banco de dados aula 4
Banco de dados aula 4Banco de dados aula 4
Banco de dados aula 4
 
Aula 10 banco de dados
Aula 10   banco de dadosAula 10   banco de dados
Aula 10 banco de dados
 
Aula 12 banco de dados
Aula 12   banco de dadosAula 12   banco de dados
Aula 12 banco de dados
 
Hands on Labs - SQL Server 2008
Hands on Labs - SQL Server 2008Hands on Labs - SQL Server 2008
Hands on Labs - SQL Server 2008
 
Comandos DDL para o MySQL
Comandos DDL para o MySQLComandos DDL para o MySQL
Comandos DDL para o MySQL
 
Exercícios de mysql
Exercícios de mysqlExercícios de mysql
Exercícios de mysql
 
Aula10 sql-ddl
Aula10 sql-ddlAula10 sql-ddl
Aula10 sql-ddl
 
Aula 9 banco de dados
Aula 9   banco de dadosAula 9   banco de dados
Aula 9 banco de dados
 
Aula2 - SQL
Aula2 - SQLAula2 - SQL
Aula2 - SQL
 
Basesdedados
BasesdedadosBasesdedados
Basesdedados
 
Agbd aula4 sql_ddl
Agbd aula4 sql_ddlAgbd aula4 sql_ddl
Agbd aula4 sql_ddl
 
Sql - Introdução ao mysql
Sql - Introdução ao mysqlSql - Introdução ao mysql
Sql - Introdução ao mysql
 

Ähnlich wie Introdução ao SQL

364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdfQuitriaSilva550
 
modulo-15-sql-criar-e-manipular-tabelas1-2-flipbook-pdf.docx
modulo-15-sql-criar-e-manipular-tabelas1-2-flipbook-pdf.docxmodulo-15-sql-criar-e-manipular-tabelas1-2-flipbook-pdf.docx
modulo-15-sql-criar-e-manipular-tabelas1-2-flipbook-pdf.docxAnaAlmeida462833
 
Minicurso PostgreSQl
Minicurso PostgreSQlMinicurso PostgreSQl
Minicurso PostgreSQlCezar Souza
 
Bdm aula 9 - operações sql - ticianne darin
Bdm   aula 9 - operações sql - ticianne darinBdm   aula 9 - operações sql - ticianne darin
Bdm aula 9 - operações sql - ticianne darinTicianne Darin
 
Conceitos inicias de banco de dados Mysql
Conceitos inicias de banco de dados MysqlConceitos inicias de banco de dados Mysql
Conceitos inicias de banco de dados Mysqlbinhoetec
 
Modulo-02-Aula-02-conteudo-de-certi.pptx
Modulo-02-Aula-02-conteudo-de-certi.pptxModulo-02-Aula-02-conteudo-de-certi.pptx
Modulo-02-Aula-02-conteudo-de-certi.pptxAugustoNicolau2
 
Fundamentos de Banco de Dados Relacionais
Fundamentos de Banco de Dados RelacionaisFundamentos de Banco de Dados Relacionais
Fundamentos de Banco de Dados RelacionaisÁlvaro Farias Pinheiro
 
Primeira Aula BANCO DE DADOS II_2024.pptx
Primeira Aula BANCO DE DADOS II_2024.pptxPrimeira Aula BANCO DE DADOS II_2024.pptx
Primeira Aula BANCO DE DADOS II_2024.pptxsuellencarolinerosa
 
Apresentação básica de my sql
Apresentação básica de my sqlApresentação básica de my sql
Apresentação básica de my sqlMarcus Couto
 
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6Wagner Bianchi
 

Ähnlich wie Introdução ao SQL (20)

364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
 
modulo-15-sql-criar-e-manipular-tabelas1-2-flipbook-pdf.docx
modulo-15-sql-criar-e-manipular-tabelas1-2-flipbook-pdf.docxmodulo-15-sql-criar-e-manipular-tabelas1-2-flipbook-pdf.docx
modulo-15-sql-criar-e-manipular-tabelas1-2-flipbook-pdf.docx
 
Minicurso PostgreSQl
Minicurso PostgreSQlMinicurso PostgreSQl
Minicurso PostgreSQl
 
Bdm aula 9 - operações sql - ticianne darin
Bdm   aula 9 - operações sql - ticianne darinBdm   aula 9 - operações sql - ticianne darin
Bdm aula 9 - operações sql - ticianne darin
 
Aulas_SQL.pdf
Aulas_SQL.pdfAulas_SQL.pdf
Aulas_SQL.pdf
 
Conceitos inicias de banco de dados Mysql
Conceitos inicias de banco de dados MysqlConceitos inicias de banco de dados Mysql
Conceitos inicias de banco de dados Mysql
 
07 sql - parte 01
07   sql - parte 0107   sql - parte 01
07 sql - parte 01
 
Boa apostila sql
Boa  apostila sqlBoa  apostila sql
Boa apostila sql
 
Otimizando a performance com in memory no sql 2016
Otimizando a performance com in memory no sql 2016Otimizando a performance com in memory no sql 2016
Otimizando a performance com in memory no sql 2016
 
Bd sql (1)
Bd sql (1)Bd sql (1)
Bd sql (1)
 
Sql01
Sql01Sql01
Sql01
 
Sql
SqlSql
Sql
 
Modulo-02-Aula-02-conteudo-de-certi.pptx
Modulo-02-Aula-02-conteudo-de-certi.pptxModulo-02-Aula-02-conteudo-de-certi.pptx
Modulo-02-Aula-02-conteudo-de-certi.pptx
 
Fundamentos de Banco de Dados Relacionais
Fundamentos de Banco de Dados RelacionaisFundamentos de Banco de Dados Relacionais
Fundamentos de Banco de Dados Relacionais
 
Aula 11 banco de dados
Aula 11   banco de dadosAula 11   banco de dados
Aula 11 banco de dados
 
Introdução ao BD Postgre
Introdução ao BD PostgreIntrodução ao BD Postgre
Introdução ao BD Postgre
 
Primeira Aula BANCO DE DADOS II_2024.pptx
Primeira Aula BANCO DE DADOS II_2024.pptxPrimeira Aula BANCO DE DADOS II_2024.pptx
Primeira Aula BANCO DE DADOS II_2024.pptx
 
Apresentação básica de my sql
Apresentação básica de my sqlApresentação básica de my sql
Apresentação básica de my sql
 
SQL.ppt
SQL.pptSQL.ppt
SQL.ppt
 
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
 

Introdução ao SQL

  • 1. Introdução ao SQL Prof. Claudio Azevedo Passos
  • 2. Modelo Relacional • O Modelo Relacional prevê, desde sua concepção, a existência de uma linguagem baseada em caracteres que suporte a definição do esquema físico (tabelas, restrições, etc.), e sua manipulação (inserção, consulta, atualização e remoção)
  • 3. SQL (Structured Query Language) E. F. Codd: “A Relational Model of Data for Large Shared Data Banks”, junho 1970 Definição de um modelo que propõe uma nova estrutura de armazenamento em banco de dados Modelo Relacional file: teorica_8.ppt Banco deDados I - Silvia Soares 3
  • 4. SQL (Structured Query Language) IBM: linguagem SEQUEL (Structured English Query Language) Ferramenta de acesso ao modelo proposto por CODD evolução SQL (linguagem padrão para Banco de Dados Relacional) 1986 : American National Standards Institute (ANSI) e International Standards Organization (ISO) Padrão SQL (SQL 86) IBM: padrão próprio (System Application Architecture Database Interface – SAA SQL) em 1987 4
  • 5. SQL (Structured Query Language) SQL SELECT GRANT CREATE Segurança UPDATE REVOKE ALTER DELETE COMMIT DROP Controle INSERT ROLLBACK SAVEPOINT transações DML DDL SET TRANSACTION Com COMMIT CONTROL “embutido” 5
  • 6. SQL (Structured Query Language) Propósito: interface para um banco de dados relacional (Oracle, DB2, SQL Server, Sybase, ...) A linguagem SQL tem diversas partes:  Linguagem de definição de dados: DDL – comandos para a definição de esquemas de relações, exclusão de relações, criação de índices e modificação nos esquemas de relações  Linguagem interativa de manipulação de dados: DML – linguagem de consulta baseada na álgebra e no cálculo relacional de tuplas. Engloba comandos para inserção, exclusão e modificação de tuplas no BD  Incorporação DML (embedded DML): para aplicação em linguagens de programação (C, PL/I, COBOL, PHP, VB,...) 6
  • 7. SQL (Structured Query Language)  Definição de visões: a SQL DDL possui comandos para definição de visões  Autorização: a SQL DDL possui comandos para especificação de direitos de acesso a relações e visões  Integridade: a SQL DDL possui comandos para especificação de regras de integridade que os dados que serão armazenados no BD devem satisfazer  Controle de transações: a SQL DCL possui comandos para especificação de iniciação e finalização de transações. Algumas implementações permitem explicitar bloqueios de dados para controle de concorrência. 7
  • 8. SQL (Comandos da DDL) Comando Create Este comando permite a criação de tabelas no banco de dados ou mesmo de sua criação. Sintaxe: CREATE DATABASE < nome_db >; onde: nome_db - indica o nome do Banco de Dados a ser criado.
  • 9. SQL (Comandos da DDL) • CREATE TABLE é o comando usado para criação da tabela e deve ser seguida pelo nome que daremos à tabela. Dentro do comando, devemos definir os nomes dos campos de acordo com a conveniência do banco de dados, e determinar o tipo de dado que poderá ser incluído neste campo. • PRIMARY KEY define a chave primária da tabela, isto é, o campo que serve como chave da tabela e que não pode ser repetido. • NOT NULL é usado quando desejamos que um campo seja de preenchimento obrigatório.
  • 10. SQL (Comandos da DDL) Comando Create table Sintaxe: CREATE TABLE < nome_tabela > ( nome_atributo1 < tipo > [ NOT NULL ], nome_atributo2 < tipo > [ NOT NULL ], ...... nome_atributoN < tipo > [ NOT NULL ] ) PRIMARY KEY(nome_atributo_x,...) ; onde: nome_table - indica o nome da tabela a ser criada. nome_atributo - indica o nome do campo a ser criado na tabela. tipo - indica a definição do tipo de atributo ( integer(n), char(n), real(n,m), date... ). n- número de dígitos ou de caracteres m- número de casas decimais
  • 11. SQL (Comandos da DDL) Comando Create table Exemplo CREATE TABLE clima ( CREATE TABLE cidades ( cidade varchar(80), nome varchar(80), temp_min int, localizacao point temp_max int, ); Precipitacao real, data date );
  • 12. Tipos de dados • O SQL não diferencia letras maiúsculas e minúsculas nas palavras e nos identificadores, a não ser quando os identificadores estão entre aspas (") para preservar letras maiúsculas e minúsculas (o que não foi feito acima). • O PostgreSQL suporta os tipos SQL usuais int, smallint, real, double precision, char(N), varchar(N), date, time, timestamp e interval, assim bem como outros tipos de utilidade geral e um abrangente conjunto de tipos geométricos.
  • 13. Tipos de dados • Bigint - inteiro de oito bytes com sinal • Bigserial - inteiro de oito bytes com auto-incremento • bit [ (n) ] cadeia de bits de comprimento fixo • bit varying [ (n) ] - cadeia de bits de comprimento variável • Boolean - booleano lógico (verdade/falso) • box - caixa retangular no plano • bytea - dados binários ("matriz de bytes") • character varying [ (n) ] varchar [ (n) ]cadeia de caracteres de comprimento variável • character [ (n) ] char [ (n) ] cadeia de caracteres de comprimento fixo • cidr endereço de rede IPv4 ou IPv6 • circle círculo no plano • date data de calendário (ano, mês,dia) • double precision - número de ponto flutuante de precisão dupla
  • 14. Tipos de dados • inet endereço de hospedeiro IPv4 ou IPv6 • Integer inteiro de quatro bytes com sinal • interval [ (p) ] espaço de tempo • line linha infinita no plano • lseg segmento de linha no plano • macaddr endereço MAC • money quantia monetária • numeric [ (p, s) ] decimal [ (p, s) ] numérico exato com precisão selecionável • path caminho geométrico no plano • point ponto geométrico no plano • polygon caminho geométrico fechado no plano • Real - float de 4 bytes número de ponto flutuante de precisão simples • Smallint - inteiro de dois bytes com sinal • Serial inteiro de quatro bytes com auto-incremento • text cadeia de caracteres de comprimento variável
  • 15. Tipos de dados • time [ (p) ] [ without time zone ] hora do dia • time [ (p) ] with time zone hora do dia, incluindo a zona horária • timestamp [ (p) ] [ without time zone ] data e hora • timestamp [ (p) ] with time zone data e hora, incluindo a zona horária
  • 16. Create Table • Exemplo: Como exemplo do uso do comando CREATE TABLE, imaginemos a necessidade de uma tabela que deva possuir os dados dos clientes de uma loja. CREATE TABLE Cliente ( Codigo INT NOT NULL, Nome VARCHAR (60) NOT NULL, Data_Nascimento DATE, Telefone CHAR (8), PRIMARY KEY (Codigo) );
  • 17. Create table • Neste comando, criamos uma tabela chamada Cliente. Esta tabela contém quatro campos: O primeiro campo é o Código do cliente. Este campo será utilizado como chave primária de forma que não poderá se repetir nunca. Desta forma o campo deve ser sempre preenchido (NOT NULL), é numérico do tipo inteiro (INT). O campo Nome é do tipo VARCHAR (60), ou seja aceita dados alfa-numéricos com até 60 caracteres. No entanto se um nome for inserido com menos de 60 caracteres, o número de bytes consumidos pelo campo será de acordo com o nome inserido. O campo de Data_Nascimento é do tipo DATE, ou seja, uma data, que no entanto não de preenchimento obrigatório (por isto não foi declarado o NOT NULL). O campo Telefone foi determinado como sendo alfa-numérico com oito caracteres definidos, e mesmo que sejam utilizados menos caracteres, o número de bytes consumidos serão sempre os mesmos independente dos dados. Isto é útil para dados alfanuméricos que não variam de tamanho, como o caso de UF no Brasil, cuja abreviação sempre são de dois caracteres. A instrução PRIMARY KEY define qual dos campos será a chave primária e não pode ser repetido, sendo o diferenciador entre os diversos clientes que sejam inseridos nesta tabela.
  • 18. SQL - Visões • As visões permitem encapsular os detalhes da estrutura das tabelas, que podem mudar na medida em que os aplicativos evoluem, atrás de interfaces consistentes. • As visões podem ser utilizadas em praticamente todos os lugares em que uma tabela pode ser utilizada. Construir visões baseadas em visões não é raro. Sintaxe • CREATE VIEW minha_visao AS SELECT cidade, temp_min, temp_max, prcp, data, localizacao FROM clima, cidades WHERE cidade = nome; • SELECT * FROM minha_visao;
  • 19. REGRAS DE INTEGRIDADE • Ao criarmos uma tabela dentro de um banco de dados devemos ter em mente as Regras de Integridade, que garantam a consistência, integridade e não redundância dos dados. Entre estas regras podemos englobar as chaves primárias, checagem e chave estrangeira.
  • 20. Restrições de Integridade Integridade de Entidade • Toda a tabela deve possuir, obrigatoriamente, uma coluna (ou uma composição de colunas) cujo valor é único para todas as instâncias  CHAVE PRIMÁRIA (PK) • As chaves primárias funcionam como os campos que diferenciam os dados uns dos outros, e que não podem ser repetidos de nenhuma forma. • Eventualmente, outras colunas além da chave primária podem ser únicas  CHAVE ALTERNATIVA (AK)
  • 21. Restrições de Integridade Integridade de Domínio • Cada coluna da tabela tem seus valores restringidos por – tipos de dados: definem o domínio de uma coluna – cod_cliente NUMBER ( 6 ) – username VARCHAR2 ( 20 ) • Restrições a valores nulos: definem se as colunas serão obrigatórias ou opcionais – email VARCHAR2 ( 40 ) NOT NULL – ddd NUMBER ( 3 )
  • 22. Restrições de Integridade Integridade de Domínio – valores padrão: define um valor padrão a ser associado a uma coluna se não for fornecido valor (ou for explicitamente fornecido um valor NULL) para esta durante a inserção importado CHAR ( 1 ) DEFAULT 'N' NOT NULL – A definição de valores padrões é particularmente importante para colunas NOT NULL
  • 23. Restrições de Integridade Integridade de Domínio – restrições de validação: restringem os valores que podem ser atribuídos a uma coluna CONSTRAINT CHK_PROD_IMPORTADO CHECK (importado in ('S','N')) – tipos definidos pelo usuário: tipo de dado construído a partir de tipos pré-definidos, contendo restrição a valores nulos, regras de validação e um valor padrão • Não disponível em todos os SGBDs
  • 24. Restrições de Integridade Integridade Referencial • As restrições de integridade referencial garantem a consistência dos relacionamentos entre as tabelas <<Table>> cidades cod_cidade : NUMBER(4, 0) nome : VARCHAR2(40) <<Table>> uf : CHAR(2) <<Non-Identifying>> estados uf : CHAR(2) <<PK>> PK_CIDADES() 0..* 1 nome : VARCHAR2(20) <<FK>> FK_EST_CID() regiao : CHAR(2) <<PK>> PK_ESTADOS()
  • 25. Restrições de Integridade Integridade Referencial • A chave estrangeira é uma cláusula que deve ser incluída quando possuímos mais de duas tabelas em um banco de dados. • Através da chave estrangeira estabelecemos as relações entre duas ou mais tabelas. A chave estrangeira desta forma referencia o campo que é chave primária de outra tabela. FOREIGN KEY (Campo1, Campo2, Campo3 ...) REFERENCES Nome_Tabela2 (Nome_Chave);
  • 26. Restrições de Integridade Integridade Referencial • No exemplo, a definição da restrição de integridade referencial seria criada como segue CONSTRAINT FK_EST_CID FOREIGN KEY (uf) REFERENCES estados (uf) • Esta restrição estabelece uma relação entre o atributo uf da tabela CIDADES e a chave primária da tabela ESTADOS
  • 27. SQL – Chave Estrangeiras (Exemplo) • CREATE TABLE cidades ( cidade varchar(80) primary key, localizacao point ); • CREATE TABLE clima ( cidade varchar(80) references cidades, temp_min int, temp_max int, prcp real, data date );
  • 28. SQL – Chave Estrangeiras • Agora ao se tentar inserir um registro INSERT INTO clima VALUES (’Berkeley’, 45, 53, 0.0, ’1994-11-28’); • O que acontece : ERROR: <unnamed> referential integrity violation - key referenced from clima not found in cidades O comportamento das chaves estrangeiras pode receber um ajuste fino na aplicação. Não iremos além deste exemplo simples neste tutorial, mas consulte o Guia do Usuário do PostgreSQL para obter mais informações. Usar corretamente as chaves estrangeiras com certeza vai melhorar a qualidade dos seus aplicativos de banco de dados, portanto encorajamos muito que este tópico seja aprendido.
  • 29. Restrições de Integridade Integridade Referencial • O SGBD deve prover mecanismos para assegurar que a restrição de integridade seja respeitada, ou seja, uma linha violando a restrição de integridade referencial não poderá existir; • Estes mecanismos prevêem a execução de uma ação em resposta a uma atualização, a fim de manter a integridade referencial.
  • 30. Restrições de Integridade Integridade Referencial • Existem diferentes ações possíveis para evitar que uma operação de atualização viole as restrições de integridade referencial – RESTRICT: impede a execução da operação Inserir uma Sala situada em um Prédio não existente – CASCADE: propaga a operação para respeitar as restrições de integridade referencial Remover uma Disciplina do Currículo, removendo todos os Pré-requisitos associados a esta
  • 31. Restrições de Integridade Integridade Referencial – SET NULL: assegura as restrições de integridade referencial associando um valor NULL à chave estrangeira que poderia violá-las Remover um Professor, fazendo com que a coluna matricula_professor em DISCIPLINAS_TURMAS fosse atualizada para NULL em todas as disciplinas que atua  NULL não é considerado um valor, portanto, não fere as restrições de integridade referencial – SET DEFAULT: semelhante à ação de SET NULL, mas associa um valor padrão à chave estrangeira
  • 32. Definindo Valores Padrão • Pode ser definido um valor padrão para uma coluna (literais, expressões ou funções) • Se não for definido um valor, será utilizado o padrão – create table pedidos ( num_pedido number ( 7 ), cod_cliente number ( 6 ) not null, cod_endereco number ( 2 ) not null, data_emissao date not null default sysdate, constraint pk_pedidos primary key (num_pedido));
  • 33. Utilizando Valores Padrão – insert into pedidos (num_pedido, cod_cliente, cod_endereco) values (17645, 540, 290); • Foi omitida a coluna data_emissão, logo, será utilizado o valor padrão – insert into pedidos (num_pedido, cod_cliente, cod_endereco, data_emissao) values (17645, 540, 290, NULL); • Foi explicitamente definido NULL
  • 34. Restrições de Integridade Integridade Definida pelo Usuário • O Projetista do Banco de Dados pode definir restrições de integridade complexas, utilizando, por exemplo, o conceito de triggers • Triggers são porções de código ativadas após certos eventos (inserção, atualização ou exclusão de linhas da tabela)
  • 35. Resumindo, temos : Restrições de Integridade de Tabelas – CONSTRAINT nome_da_restrição PRIMARY KEY (colunas) – CONSTRAINT nome_da_restrição FOREIGN KEY (colunas) REFERENCES nome_da_tabela_pai [ON DELETE CASCADE] – CONSTRAINT nome_da_restrição UNIQUE (colunas) – CONSTRAINT nome_da_restrição CHECK (expressao)
  • 36. Restrições de Integridade de Colunas – CONSTRAINT nome_da_restrição NOT NULL – CONSTRAINT nome_da_restrição PRIMARY KEY – CONSTRAINT nome_da_restrição REFERENCES nome_da_tabela_pai [ON DELETE CASCADE] – CONSTRAINT nome_da_restrição UNIQUE – CONSTRAINT nome_da_restrição CHECK (expressao)
  • 37. Exemplo- Restrições de Integridade nas Tabelas e nas Colunas create table usuarios ( cod_usuario number ( 6 ), nome varchar2 ( 100 ) constraint nn_usu_nome not null, cpf char ( 11 ) constraint nn_usu_cpf not null, email varchar2 ( 40 ) constraint nn_usu_email not null, username varchar2 ( 20 ) constraint nn_usu_username not null, password varchar2 ( 20 ) constraint nn_usu_password_not null, constraint pk_usuarios primary key (cod_usuario), constraint ak_usu_cpf unique (cpf), constraint ak_usu_username unique (username));
  • 38. Exemplo- Restrições de Integridade nas Tabelas e nas Colunas create table produtos ( cod_produto number ( 5 ) not null, titulo varchar2 ( 200 ) not null, ano_lancamento date not null, importado char ( 1 ) not null, preco number ( 10, 2 ) not null, prazo_entrega number ( 3 ) not null, constraint pk_produtos primary key (cod_produto), constraint chk_prod_importado check (importado in (‘S',‘N')) );
  • 39. Exemplo- Restrições de Integridade nas Tabelas e nas Colunas create table administradores ( cod_administrador number ( 6 ), nivel_privilegio number ( 1 ) not null, constraint pk_administradores primary key (cod_administrador), constraint fk_usu_adm foreign key (cod_administrador) references usuarios (cod_usuario) );
  • 40. SQL (Comandos da DDL) • DROP TABLE — remove uma tabela • DROP TABLE nome [, ...] [ CASCADE | RESTRICT ] onde NOME O nome (opcionalmente qualificado pelo esquema) da tabela a ser removida. CASCADE Remove automaticamente os objetos dependentes da tabela (como visões). RESTRICT Recusa remover a tabela se existirem objetos dependentes. Este é o padrão. Saídas DROP TABLE Mensagem retornada se a execução do comando for bem-sucedida. ERROR: table "nome" does not exist Se a tabela especificada não existe no banco de dados.
  • 41. SQL (Comandos da DDL) – Alter Table • Descrição O comando ALTER TABLE altera a definição de uma tabela existente. Existem várias formas alternativas: • ADD COLUMN Esta forma adiciona uma nova coluna à tabela usando a mesma sintaxe do comando CREATE TABLE. • DROP COLUMN Esta forma remove uma coluna da tabela. Os índices e as restrições da tabela que referenciam a coluna também serão automaticamente excluídos. É necessário especificar CASCADE se algum objeto fora da tabela depender da coluna como, por exemplo, referências de chaves estrangeiras ou visões. • SET/DROP DEFAULT Estas formas definem ou removem o valor padrão para a coluna. O valor padrão somente é aplicado nos próximos comandos INSERT; as linhas existentes na tabela não são modificadas. Valores padrão também podem ser criados para visões e, neste caso, são inseridos pelo comando INSERT na visão antes da regra ON INSERT da visão ser aplicada.
  • 42. SQL (Comandos da DDL) – Alter Table • SET/DROP NOT NULL Estas formas mudam se a coluna está marcada para permitir valores nulos ou para rejeitar valores nulos. A forma SET NOT NULL somente pode ser utilizada quando não existem valores nulos na coluna. • SET STATISTICS Esta forma define o valor usado para a coleta de estatísticas por coluna para as próximas operações de ANALYZE. O valor pode ser definido no intervalo de 0 a 1000; como alternativa, pode ser definido como -1 para utilizar o valor padrão do sistema para as estatísticas. • SET STORAGE Esta forma define o modo de armazenamento para a coluna. • RENAME A forma RENAME muda o nome de uma tabela (de um índice, de uma seqüência ou de uma visão), ou o nome de uma coluna da tabela. Não ocasiona efeito sobre os dados armazenados.
  • 43. SQL (Comandos da DDL) – Alter Table • DROP CONSTRAINT Esta forma remove restrições de tabela. Atualmente, as restrições de tabela não necessitam ter nomes únicos e, portanto, pode haver mais de uma restrição correspondendo ao nome especificado. Todas estas restrições serão removidas. • OWNER Esta forma muda o dono da tabela, índice, seqüência ou visão como sendo o usuário especificado. É necessário ser o dono da tabela para executar o comando ALTER TABLE, exceto para a forma ALTER TABLE OWNER que somente pode ser executada por um superusuário.
  • 44. SQL (Comandos da DDL) • ALTER TABLE — Sintaxe ALTER TABLE [ ONLY ] tabela [ * ] ADD [ COLUMN ] column tipo [ restrição_de_coluna [ ... ] ] ALTER TABLE [ ONLY ] tabela [ * ] DROP [ COLUMN ] coluna [ RESTRICT | CASCADE ] ALTER TABLE [ ONLY ] tabela [ * ] ALTER [ COLUMN ] coluna { SET DEFAULT valor | DROP DEFAULT } ALTER TABLE [ ONLY ] tabela [ * ] ALTER [ COLUMN ] coluna { SET | DROP } NOT NULL ALTER TABLE [ ONLY ] tabela [ * ] ALTER [ COLUMN ] coluna SET STATISTICS inteiro ALTER TABLE [ ONLY ] tabela [ * ] ALTER [ COLUMN ] coluna SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ALTER TABLE [ ONLY ] tabela [ * ] RENAME [ COLUMN ] coluna TO novo_nome_da_coluna ALTER TABLE tabela RENAME TO novo_nome_da_tabela ALTER TABLE [ ONLY ] tabela [ * ] ADD definição_de_restrição_de_tabela ALTER TABLE [ ONLY ] tabela [ * ] DROP CONSTRAINT nome_da_restrição [ RESTRICT | CASCADE ] ALTER TABLE tabela OWNER TO novo_dono
  • 45. SQL (Comandos da DML) • SELECT (DISTINCT) (*, COLUNA (SINÔNIMO), ...) FROM tabela WHERE condição ou condições ORDER BY (coluna, expressão) (ASC/DESC) • Exemplo : SELECT registro, nome, cpf FROM cadastro;
  • 46. SQL (Comandos da DML) • Note aqueles nomes de colunas estão separados por uma vírgula. • Ele possibilita selecionar todas as colunas da tabela, especificando um * (asterisco) depois do SELECT palavra comando. • SELECT * FROM CADASTRO;
  • 47. SQL (Comandos da DML) • Outros itens da clausula SELECT – É possível incluir outros itens na clausula SELECT. – Expressões Aritméticas. – Colunas sinônimas – Concatenação de colunas – Literais
  • 48. SQL (Comandos da DML) • Expressões Aritméticas Operadores Descrições • Uma expressão é a + Adição combinação de um ou mais valores, operadores, e funções - Subtração os quais avaliam para um valor. * Multiplicação • Expressões Aritméticas podem conter nome de / Divisão colunas, valores numéricos constantes e operadores aritméticos Ex. : SELECT nome, SAL*12 FROM cadastro;
  • 49. SQL (Comandos da DML) • Colunas Sinônimas • Quando mostramos o resultado de uma pesquisa, o PgAdmin normalmente usa o nome as colunas selecionadas como cabeçalho. Em alguns exemplos ele pode ser sem sentido. Você pode modificar o cabeçalho de uma coluna usando sinônimos(alias). • Uma coluna sinônima é um cabeçalho de coluna alternativo na saída. Especifique o sinônimo (alias) depois da coluna na lista do SELECT. O cabeçalho sinônimo padrão será fornecido sem espaços em branco, amenos que o sinônimo esteja dentro de aspas duplos (“ “). • Exemplo : select registro, nome, datanasc “data de nascimento” from cadastro
  • 50. SQL (Comandos da DML) • O Operador de Concatenação O Operador de Concatenação (||) permite que as colunas sejam juntadas com outras colunas, expressões aritméticas ou valores constantes para criar uma expressão alfanumérica. Colunas ficam lado a lado com operadores para formarem uma única coluna. • Exemplo : SELECT registro||nome FROM cadastro;
  • 51. SQL (Comandos da DML) • Literais • Um literal são um ou mais caracteres, expressões, números incluídos na lista do SELECT o qual não é um nome de coluna ou de um sinônimo • Um literal na lista do SELECT terá uma saída para cada linha retornada. Literais de livre formatos de textos podem ser incluídos no resultado da pesquisa, e são tratados como uma coluna na lista do SELECT. •Datas e caracteres alfanuméricos devem ser colocados entre aspas simples(‘); números não precisam de aspas simples. • As declarações seguintes contém literais selecionados com concatenação e colunas sinônimas. Exemplo : select registro||’-’||nome from cadastro
  • 52. SQL (Comandos da DML) • Prevenindo a Seleção de Linhas Duplicadas A menos que você indique de outra maneira, SQL*Plus mostrará os resultados da pesquisa sem eliminar as duplicações. Para listar todos os números de departamentos da tabela EMP, faça: • Exemplo : SELECT DEPTBASE FROM CADASTRO; • A clausula DISTINCT Para eliminar valores duplicados no resultado, incluímos o DISTINCT qualificador no comando SELECT. Para eliminar os valores Duplicados mostrados no exemplo anterior, faça: Exemplo : SELECT DEPTBASE FROM CADASTRO;
  • 53. SQL (Comandos da DML) • A clausula ORDER BY • Normalmente a ordem das linhas retornadas de uma pesquisa é indefinida. A clausula ORDER BY pode ser usada para ordenar as linhas. Se usado, o ORDER BY precisa sempre ser a última clausula da declaração SELECT. Para ordenar pelo nome, faça: • Exemplo : SELECT nome, deptobase FROM cadastro ORDER BY nome; SELECT nome, deptobase FROM cadastro ORDER BY 1;
  • 54. SQL (Comandos da DML) • Ordenação por várias colunas. • É possível na clausula ORDER BY usar mais de uma coluna. O limite de colunas é de fato o número de colunas da tabela. Na clausula ORDER BY especifica-se as colunas pelo que as linhas serão ordenadas, separando as por vírgula. Se algumas ou todas são invertidas especifique DESC depois de alguma ou cada uma das colunas • Exemplo : SELECT DEPTBASE, NOME FROM CADASTRO ORDER BY DEPTBASE, NOME DESC;
  • 55. SQL (Comandos da DML) • A Clausula WHERE A clausula WHERE corresponde aos Operadores de Restrições da Álgebra Relacional. Ele contém condições nas quais a linha precisa se encontrar em ordem para ser mostrada. Estrutura da seleção com restrições. SELECT coluna(s) FROM tabela(s) WHERE certa condição a ser encontrada
  • 56. SQL (Comandos da DML) A clausula WHERE pode comparar valores em uma coluna, valores literais, expressões aritméticas ou funções. A clausula WHERE conta com três elementos. 1- Um nome de coluna 2- Um operador de comparação 3- Um nome de coluna, um constante, ou lista de valores. Operadores de Comparação são usados na clausula WHERE e podem ser divididos em duas categorias, Lógicos e SQL. Operadores Lógicos Esses operadores lógicos testam as seguintes condições: Operador Significado = igual a > maior que >= maior e igual a < menor que <= menor e igual a
  • 57. SQL (Comandos da DML) • Para listar os nomes e departamentos de todos os empregados do departamento 1402 • SELECT nome, deptobase FROM cadastro WHERE deptbase=1402; • Para encontrar todos os nomes de departamentos com número de departamento maior que 1500, faça SELECT nome, deptobase FROM cadastro WHERE deptbase > 1500;
  • 58. SQL (Comandos da DML) Comparando uma coluna com outra coluna na mesma linha: Você pode comparar uma coluna com outra coluna na mesma linha, da mesma forma com um valor constante. Por exemplo, suponhamos que você quer encontrar os empregados os quais a comissão está maior que seu salário, faça: SELECT nome FROM cadastro WHERE Com >= Sal;
  • 59. SQL (Comandos da DML) • Operadores SQL Existem quatro operadores SQL os quais opera, com todos tipos de dados: Operador Significado BETWEEN ... AND ... Entre dois valores (inclusive) IN(Lista) compara uma lista de valores LIKE Compara um parâmetro alfanumérico IS NULL é um valor nulo
  • 60. SQL (Comandos da DML) • O Operador BETWEEN Testa para um faixa de valores, e inclusive do menor a maior faixa. Suponhamos que nós quisemos ver aqueles empregados nascidos depois de 1960 SELECT nome, datanasc from cadastro WHERE datanasc BETWEEN '1960-01-01' AND '2007-01-31';
  • 61. SQL (Comandos da DML) • O Operador IN Testa os valores especificados em uma lista. Para encontrar empregados que esteja um dos três departamentos, faça: SELECT nome, deptobase FROM cadastro WHERE deptobase IN (1402,1502,1503)
  • 62. SQL (Comandos da DML) • O Operador LIKE Algumas vezes você precisa procurar valores que você não conhece exatamente Usando o operador LIKE é possível selecionar linhas combinando parâmetros alfanuméricos. Dois símbolos podem ser usados para construir uma linha de procura. Símbolo Representa % Várias seqüência de zero ou mais caracteres _ um número desejado de caracteres
  • 63. SQL (Comandos da DML) • O Operador LIKE Para listar todos os empregados os quais o nome começa com a letra S, faça: SELECT nome FROM cadastro WHERE nome LIKE 'S%'; Eles podem ser usados para encontrar um determinado número de caracteres. Por exemplo para listar todos empregados que tenham exatamente quatro caracteres de tamanho do nome. SELECT NOME FROM CADASTRO WHERE NOME LIKE '____'
  • 64. SQL (Comandos da DML) • Operador IS NULL Unicamente encontrar todos os empregados que não tenham telefone, você testará um valor nulo: SELECT nome FROM cadastro WHERE telefoneres IS NULL;
  • 65. SQL (Comandos da DML) • Expressões Negativas Os operadores seguintes são testes de negação: Operador Descrição != não igual para (VAX,UNIX,PC) ^= não igual para (IBM) <> não igual para (todos sistemas operacionais) NOT COLUNA_NOME= não igual que NOT COLUNA_NOME> não maior que
  • 66. SQL (Comandos da DML) • Operadores SQL Operador Descrição NOT BETWEEN tudo que estiver fora da faixa NOT IN tudo que não estiver na lista NOT LIKE tudo que não conter a linha de caracteres IS NOT NULL tudo que não for nulo Para encontrar aqueles empregados cujo os nomes não comecem com a letra M, faça: SELECT NOME, DEPTOBASE FROM CADASTRO WHERE NOME NOT LIKE 'M%';
  • 67. SQL (Comandos da DML) Você pode combinar AND e OR na mesma expressão lógica. Quando AND e OR aparecer na mesma clausula WHERE, todos os ANDs serão feitos primeiros e então todos os Ors serão feitos. Se AND não interfere sobre o OR a seguinte declaração SQL retornará todos os gerentes com salário acima de 1500, e todos os vendedores. SELECT EMPNO, ENAME, JOB, SAL, DEPTNO FROM EMP WHERE SAL > 1500 AND JOB = 'MANAGER‘ OR JOB = 'SALESMAN'
  • 68. SQL (Comandos da DML) Extraindo Dados de Mais de uma Tabela Ligações (Joins) • Uma ligação é usada quando a pesquisa SQL requer dados de mais de uma tabela do Banco de Dados. • Linhas em uma tabela devem ser ligadas a outras linhas de acordo com o valor comum existente na coluna correspondente. Existem dois tipos principais de condições de ligações: 1. Equi-join 2. Non-equi-join
  • 69. SQL (Comandos da DML) Extraindo Dados de Mais de uma Tabela Equi-Join • Na ordem para descobrir, manualmente, qual departamento vários empregados estão, nós comparamos a coluna DEPTOBASE da tabela CADASTRO com a mesmo valor de DEPTOBASE na tabela DEPT. • O relacionamento entre a tabela EMP e a DEPT é um equi-join, em que o valor da coluna DEPTNO seja igual para ambas as tabelas( o = operador de comparação é usado).
  • 70. SQL (Comandos da DML) Extraindo Dados de Mais de uma Tabela Uma condição de ligação é especificada na clausula WHERE: SELECT coluna(s) FROM tabela(s) WHERE condição de ligação Para ligar as duas tabelas CADASTRO e DEPTO, faça: SELECT CADASTRO.NOME, DEPTO.NOME FROM CADASTRO, DEPTO WHERE CADASTRO.DEPTOBASE = DEPTO.CODIGO;
  • 71. SQL (Comandos da DML) Extraindo Dados de Mais de uma Tabela Usando Tabelas com Sinônimos • Pode ser tedioso repetir o nome inteiro de um tabela em uma coluna. Nomes temporários (ou sinônimos) podem ser usados na clausula FROM. Estes nomes temporários valem unicamente para a declaração de SELECT corrente. Tabelas sinônimas devem então ser declaradas na clausula SELECT. Isso agiliza a pesquisa em que a declaração contém muitas informações. • Tabelas Sinônimas estão sendo usadas na seguinte declaração: SELECT C.NOME, D.NOME FROM CADASTRO C, DEPTO D WHERE C.DEPTOBASE = D.CODIGO ORDER BY D.CODIGO
  • 72. SQL (Comandos da DML) Extraindo Dados de Mais de uma Tabela Nom-Equi-Join • O relacionamento entre as tabelas CADASTRO e SALFAIXA é um nom-equi-join, em que a coluna na CADASTRO corresponde direto a uma coluna na SALFAIXA. O relacionamento é obtido usando um outro operador que o igual(=). • Para avaliar um grau do salário de um empregado é necessário que o salário esteja entre o menor e maior faixa de salário. • O operador BETWEEN é usado para construir a condição, faça: SELECT C.NOME, C.SAL, S.FAIXA FROM CADASTRO C, SALFAIXA S WHERE C.SAL BETWEEN S.LOSAL AND S.HISAL;
  • 73. SQL (Comandos da DML) Extraindo Dados de Mais de uma Tabela 1. Mostra todos os nomes dos empregados e o nome de seus departamentos em ordem de nome de departamento 2. Mostrar o nome de todos os empregados, nome e número do departamento 3. Mostrar o nome e departamento dos empregados que nasceram antes de 1966. 4. Mostrar todos os alunos do curso de cinema (225) 5. Mostrar matricula, nome, curso e disciplina dos alunos do curso de filosofia que já cursaram a disciplina FIL311.
  • 74. SQL (Comandos da DML) Funções de Grupo • Funções de grupo operam sobre conjuntos de linhas. Elas retornam resultados baseados sobre um grupo de linhas, antes que um resultado por linha tenha retornado como uma função de linha única. Group by • Como padrão todas as linhas de um tabela são trilhadas como um grupo. A clausula GROUP BY da declaração do SELECT é usada para dividir as linhas em menores grupos.
  • 75. SQL (Comandos da DML) Função Valor Retornado AVG([DINSTINCT/ALL]n) Valor médio de n, ignorando os valores nulos. COUNT([DINSTINCT/ALL]expr*) Contador * conta todas as linhas selecionadas, incluindo duplicadas e linhas nulas MAX([DISTINCT/ALL]expr) valor máximo da expressão MIN([DISTINCT/ALL]expr) valor mínimo da expressão STDDEV([DISTINCT/ALL]n) Desvio padrão de n, ignorando valores nulos. SUM([DISTINCT/ALL]n) Valor soma de n, ignorando valores nulos. VARIANCE([DISTINCT/ALL],n) variação de n, ignorando valores nulos.
  • 76. SQL (Comandos da DML) Todas as funções do slide anterior operam sobre um número de linhas (por exemplo, uma tabela inteira) e são portanto funções de GRUPO. • DISTINCT faz uma função de grupo considerar valores não duplicados; • ALL considera todos os valores sua declaração não é necessária. •Todas as funções de grupo exceto o COUNT(*) ignoram os valores nulos
  • 77. SQL (Comandos da DML) Funções de Grupo • AVG Para calcular a média das GQs dos alunos do curso 047 : SELECT AVG(gq1+gq2+gq3) FROM srhac01; SELECT AVG(sal) FROM cadastro;
  • 78. SQL (Comandos da DML) Funções de Grupo MIN Uma função de grupo pode ser usada para subconjunto de linhas de uma tabela usando a clausula WHERE. Para encontrar o funcionário mais velho da UGF, do deptobase 1711 faça: • SELECT MIN(datanasc) FROM CADASTRO WHERE deptobase = ‘1711';
  • 79. SQL (Comandos da DML) Funções de Grupo COUNT Para encontrar o número de empregados do departamento 1711, faça: SELECT COUNT(*) FROM CADASTRO WHERE DEPTOBASE = 1711; Nota: A função COUNT usada dessa forma COUNT(1) tem o mesmo resultado que a acima e é mais rápida.
  • 80. SQL (Comandos da DML) Funções de Grupo A clausula GROUP BY •A clausula GROUP BY pode ser usada para dividir as linhas de uma tabela em um menor grupo. Funções de grupo devem ser usadas para resumir informações por cada grupo. Para mostrar os funcionários mais velhos por departamento, faça: • SELECT deptobase, min(datanasc) FROM cadastro GROUP BY deptobase;
  • 81. SQL (Comandos da DML) Funções de Grupo Excluindo linhas quando estiver Usando o GROUP BY Linhas devem ser excluídas com a clausula WHERE, antes da divisão por grupos. Para mostrar o funcionário mais velho por deptobase excluindo o deptobase 1711, faça: SELECT deptobase, min(datanasc) FROM cadastro WHERE deptobase <> ‘1711‘ GROUP BY deptobase;
  • 82. SQL (Comandos da DML) Funções de Grupo Grupos dentro de Grupos Nós podemos então usar a clausula GROUP BY para prover resultados para grupos dentro de grupos. Mostre o funcionário mais novo por cada função dentro de um departamento, faça: SELECT deptobase, funcao, max(datanasc) FROM cadastro GROUP BY deptobase, funcao;
  • 83. SQL (Comandos da DML) Funções de Grupo Funções de Grupo e Resultados Individuais A seguinte declaração SQL retorna a maior idade para cada grupo. O resultado não é significativo porque o deptobase não é mostrado no resultado. • SELECT MIN(datanasc) FROM cadastro GROUP BY deptobase; Mostrando o Departamento • SELECT MIN(datanasc),deptobase FROM cadastro GROUP BY deptobase;
  • 84. SQL (Comandos da DML) Funções de Grupo Suponha na mente a seguinte regra quando usar funções de grupo: Se você inclui uma função de grupo no comando SELECT, você não deve selecionar resultados que não estejam declarados no GROUP BY.
  • 85. SQL (Comandos da DML) Funções de Grupo Por exemplo: SELECT DEPTOBASE, MIN(DATANASC) FROM CADASTRO; •ERROR: column "cadastro.deptobase" must appear in the GROUP BY clause or be used in an aggregate function. O comando é inválido porque DEPTOBASE tem um valor para cada linha da tabela, enquanto MIN(DATANASC) tem um valor para tabela inteira.
  • 86. SQL (Comandos da DML) Funções de Grupo Para corrigir o erro, nós devemos agrupar o item individual: SELECT DEPTOBASE, MIN(DATANASC) FROM CADASTRO GROUP BY DEPTOBASE;
  • 87. SQL (Comandos da DML) Funções de Grupo A clausula HAVING Use a clausula HAVING se você quiser especificar o qual grupo será mostrado. Para mostrar todos os departamentos que tiverem mais de três empregados, faça: SELECT DEPTOBASE FROM CADASTRO GROUP BY DEPTNO HAVING COUNT(1) > 3;
  • 88. SQL (Comandos da DML) Funções de Grupo Para mostrar só os departamentos, onde existe funcionários nascidos antes de 1930-01-01, faça: SELECT deptobase, datanasc FROM cadastro GROUP BY deptobase, datanasc having min(datanasc)<='1930-01-01'
  • 89. SQL (Comandos da DML) Funções de Grupo A clausula WHERE não pode ser usada para restringir itens de grupo. A seguinte declaração da clausula WHERE é errada. SELECT deptobase, datanasc FROM cadastro GROUP BY deptobase, datanasc WHERE min(datanasc)<='1930-01-01' Você pode unicamente usar WHERE para restringir linhas individuais. Para restringir colunas de grupos usa-se a clausula HAVING.
  • 90. SQL (Comandos da DML) Funções de Grupo Nota: Você pode excluir todos os “gerentes” usando a clausula WHERE quando estiver agrupando por cargo. SELECT funcao FROM cadastro WHERE funcao <> ‘035013' GROUP BY funcao;
  • 91. SQL (Comandos da DML) Funções de Grupo Exercícios 1. Encontrar o funcionário mais antigo 2. Encontrar o funcionário mais antigo e o mais novo 3. Listar o mais novo e o mais velho funcionário por cargo 4. Encontrar quantos funcionários lecionam 5. Mostre o departamento e a sua descrição que tiverem mais de 40 empregados 6. Cheque se todos os números de funcionários são únicos
  • 92. SQL (Comandos da DML) INSERT insert into nomedatabela (campo 1,...,campo n) Values (valor 1,...,valor n) Exemplo 1: INSERT INTO alunovestibular (matricula,notaobjetiva,notaredacao,classificacao) VALUES (‘20061000001’,’20’,’2.5’,1);
  • 93. SQL (Comandos da DML) INSERT insert into nomedatabela (campo 1,...,campo n) Values (valor 1,...,valor n) Exemplo 2: INSERT INTO alunovestibular VALUES (‘20061000001’,’20’,’2.5’,1);
  • 94. SQL (Comandos da DML) UPDATE UPDATE nomedatabela SET campo 1 = valor 1,..., campo n = valor n Exemplo : "UPDATE alunovestibular SET notaobjetiva=’20’, notaredacao=‘3.5’, classificacao=‘2' WHERE matricula='".$matricula."'";
  • 95. SQL (Comandos da DML) DELETE DELETE FROM nomedatabela WHERE <CONDIÇÃO> Exemplo : ?
  • 96. SQL (Comandos da DML) Sub-Pesquisas • Pesquisas contendo na clausula WHERE ou HAVING de outra declaração SQL • Uma sub-pesquisa é uma declaração SELECT que é aninhada com outra declaração SELECT e a qual retorna resultados intermediários. • Por exemplo: SELECT coluna1, coluna2, ... FROM tabela WHERE coluna = (SELECT coluna FROM tabela WHERE condição)
  • 97. SQL (Comandos da DML) Sub-Pesquisas • A sub-pesquisa é geralmente referida como SUB-SELECT ou SELECT interno; • Geralmenteexecuta primeiro e a saída é usada para completar a condição da pesquisa principal ou outra pesquisa.
  • 98. SQL (Comandos da DML) Sub-Pesquisas de Linha Única • Para encontrar o empregado que ganha o mínimo salário na companhia (o mínimo salário é uma quantidade desconhecida), dois passos devem ser seguidos: 1. Encontrar o salário mínimo: SELECT MIN(salario) FROM cadastro;
  • 99. SQL (Comandos da DML) Sub-Pesquisas de Linha Única • 2. Encontrar o empregado que ganha o salário mínimo: SELECT nome, salario FROM cadastro WHERE salario = (menor salário o qual é desconhecido)
  • 100. SQL (Comandos da DML) Sub-Pesquisas de Linha Única • Nós podemos combinar os dois comandos como uma sub-pesquisa aninhada: SELECT nome, salario FROM cadastro WHERE salario = SELECT MIN(salario) FROM cadastro;
  • 101. SQL (Comandos da DML) Sub-Pesquisas de Linha Única • Como são processadas as Sub-pesquisas Aninhadas? • Uma declaração SELECT pode ser considerada como uma pesquisa em bloco. O exemplo anterior consiste de duas pesquisas em bloco - a principal pesquisa e a pesquisa interna. • A interna declaração SELECT é executada primeiro, produzindo um resultado : 800. A principal pesquisa em bloco está então processando e usa o valor retornado pela pesquisa interna para completar a condição procurada.
  • 102. SQL (Comandos da DML) Sub-Pesquisas de Linha Única • Na essência, a principal pesquisa finaliza-se olhando como isso: SELECT nome, salario FROM cadastro WHERE salario = 800; • No exemplo acima, o 800 é um valor único. A sub-pesquisa que retorna o valor 800 é chamada de sub-pesquisa de linha única. Quando uma sub-pesquisa retorna uma única linha: uma linha ou operador lógico deve ser usado. Por exemplo: =, <, >, <=, etc.
  • 103. SQL (Comandos da DML) Sub-Pesquisas de Linha Única • Para encontrar todos os empregados que trabalham no mesmo departamento do Camarão nós fazemos: SELECT nome, deptobase FROM cadastro WHERE deptobase = (SELECT deptobase FROM cadastro WHERE nome = ‘Camarão'); A pesquisa interna retorna o departamento do Camarão, o qual é usado na condição WHERE da pesquisa principal
  • 104. SQL (Comandos da DML) Sub-Pesquisas que Retorna mais de Uma Linha • A seguinte pesquisa atende para encontrar os empregados que ganham o menor salário nos departamentos. SELECT nome, salario, deptobase FROM cadastro WHERE salario IN (SELECT MIN(salario) FROM cadastro GROUP BY deptobase);
  • 105. SQL (Comandos da DML) Sub-Pesquisas que Retorna mais de Uma Linha Note que a pesquisa interna tem a clausula GROUP BY. Isso significa que ele pode retornar mais que um valor. Nós precisamos para usar múltiplas linhas de um operador de comparação. Neste caso o operador IN deve ser usado porque específica uma lista de valores
  • 106. SQL (Comandos da DML) Sub-Pesquisas que Retorna mais de Uma Linha • Comparando mais de um valor A seguinte pesquisa encontrará aqueles empregados que ganham o menor salário no seu respectivo departamento: A seguinte pesquisa encontrará aqueles empregados que ganham o menor salário no seu respectivo departamento: SELECT nome, salario, deptobase FROM cadastro WHERE (salario,deptobase) IN (SELECT MIN(salario), deptobase FROM cadastro GROUP BY deptobase);
  • 107. SQL (Comandos da DML) Sub-Pesquisas que Retorna mais de Uma Linha • Erros Encontrados Quando uma sub-pesquisa retorna mais que uma linha e um operador de linha única é usado, a seguinte mensagem de erro: SELECT nome, salario, deptobase FROM cadastro WHERE salario = (SELECT MIN(salario) FROM cadastro GROUP BY deptobase); ERROR -> more than one row returned by a subquery used as an expression
  • 108. SQL (Comandos da DML) Operadores ANY ou ALL • Os operadores ANY ou ALL devem ser usados para sub- pesquisas que retornam mais de uma linha. Eles são usados na clausula WHERE ou HAVING em conjunto com os operadores lógicos. (=,<>, <, >, >=, <=). • ANY compara um valor para cada valor retornado em uma sub-pesquisa. Para mostrar os empregados que ganham mais que o menor salário no departamento 3003, faça: SELECT nome, salario, funcao, deptobase FROM cadastro WHERE salario >ANY (SELECT DISTINCT salario FROM cadastro WHERE deptobase = 3003) ORDER BY salario DESC;
  • 109. SQL (Comandos da DML) Operadores ANY ou ALL • O menor salário do departamento 3003 é 500. A principal pesquisa tem que retornar os empregados que ganham o salário maior que o menor salário no departamento 3003. • ‘< ANY’ é equivalente ao IN. • Quando usamos ANY, a palavra chave DISTINCT é usada para prevenir a seleção de linhas ocupadas.
  • 110. SQL (Comandos da DML) Operadores ANY ou ALL • ALL compara um valor com todos os valores retornados em uma sub- pesquisa • A seguinte pesquisa encontra os empregados que ganham mais que todos os empregados no departamento 3003. SELECT nome, salario, funcao, deptobase FROM cadastro WHERE salario>ALL (SELECT DISTINCT salario FROM cadastro WHERE deptobase = 3003) ORDER BY salario DESC; O maior salário no departamento 3003 é 6500, a pesquisa tem que retornar aqueles empregados que ganham mais que 6500. Existe salário maior que o maior do departamento 3003. O operador NOT podem ser usado com IN, ANY ou ALL.
  • 111. SQL (Comandos da DML) Operadores Exists • O operador EXISTS é freqüentemente usado com Sub-pesquisas correlatas. Ele testa quando um valor existe. (NOT EXISTS garante que não existe). Se o valor existir será retornado Verdadeiro, se não existir será retornado Falso. • Para encontrar os empregados que tem no mínimo uma pessoa subordinada a ele, faça: SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP E WHERE EXISTS (SELECT EMPNO FROM EMP WHERE EMP.MGR = E.EMPNO) ORDER BY EMPNO;
  • 112. SQL (Comandos da DML) Operadores Exists • Encontrar os empregados que o departamento não é o da tabela DEPT: SELECT, ENAME, DEPTNO FROM EMP WHERE NOT EXISTS (SELECT DEPTNO FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO); • Outro caminho para encontrar o departamento que não tem nenhum empregado é: SELECT DEPTNO, DNAME FROM DEPT D WHERE NOT EXISTS (SELECT 'X' FROM EMP E WHERE E.DEPTNO = D.DEPTNO); • Note que o SELECT interno não precisa retornar um valor específico, unicamente um literal para ser selecionado.
  • 113. SQL (Comandos da DML) Clausula HAVING com Sub-pesquisas aninhadas • Lembre-se que WHERE refere-se para linha única e HAVING a grupos de linhas especificadas na clausula GROUP BY. • Por exemplo, para mostrar os departamentos que tenham a média salarial maior que a do departamento 3003, faça: SELECT deptobase, AVG(salario) FROM cadastro HAVING AVG(salario) > (SELECT AVG(salario) FROM cadastro WHERE deptobase = 3003) GROUP BY deptobase;
  • 114. SQL (Comandos da DML) Clausula HAVING com Sub-pesquisas aninhadas Para construir uma pesquisa que encontre a função com maior média salarial, faça: SELECT funcao, AVG(salario) FROM cadastro GROUP BY funcao HAVING AVG(salario) = (SELECT MAX(AVG(salario)) FROM cadastro GROUP BY funcao);
  • 115. SQL (Comandos da DML) Sub-pesquisas aninhadas Sub-pesquisas devem ser aninhadas (usadas com outras sub-pesquisas): • Mostrar o nome, cargo e admissão para os empregados cuja o salário seja maior que o maior salário do departamento ‘NUCLEO DE TEC DA INFORMACAO ’. SELECT nome, funcao, dataadmissao, salario FROM cadastro WHERE salario > (SELECT MAX(salario) FROM cadastro WHERE deptobase = (SELECT deptobase FROM deptofunc WHERE descricao = ' NUCLEO DE TEC DA INFORMACAO '));
  • 116. SQL (Comandos da DML) • Performance depende do uso dos índices, o número de linhas retornadas pela pesquisa, o tamanho da tabela e se tabelas temporárias são requeridas para avaliar resultados temporários. • As tabelas temporárias geradas pelo SGBD não são indexadas, e essa pode levar para o degradamento na performance para sub-pesquisas usando IN, ANY e ALL.
  • 117. SQL (Comandos da DML) Sub-pesquisas aninhadas Exercícios 1. Encontrar os empregados que ganham o maior salário em cada função e ordenar o salário da forma descendente 2. Encontrar os empregados que ganham o mínimo salário para sua função. Mostrar o resultado em ordem ascendente de salário. 3. Encontrar o mais recente admitido empregado em cada departamento. Ordenado por admissão. 4. Mostre o nome, salário e departamento para qualquer empregado que ganhe um salário maior que a média para seu departamento. Ordenar pelo número de departamento. 5. Lista todos os departamentos onde não existem empregados. (Usando dessa vez um sub-pesquisa).
  • 118. SQL (Comandos da DCL) Comandos da DCL • GRANT • GRANT — concede privilégios de acesso • Sinopse • GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] nome_da_tabela [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] • GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE nome_bd [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] • GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION nome_da_função ([tipo, ...]) [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] • GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE nome_da_linguagem [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] • GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA nome_do_esquema [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]
  • 119. SQL (Comandos da DML) Comandos da DDL • O comando GRANT concede privilégios específicos sobre um objeto (tabela, visão, seqüência, banco de dados, função, linguagem procedural ou esquema) para um ou mais usuários ou grupos de usuários. • Estes privilégios são adicionados aos já concedidos, caso existam. • Exemplos: 1. GRANT SELECT ON minha_tabela TO PUBLIC; 2. GRANT SELECT,UPDATE,INSERT ON minha_tabela TO GROUP todos;
  • 120. SQL (Comandos da DML) Comandos da DDL Exemplos : Conceder, para todos os usuários, o privilégio de inserir na tabela filmes: • GRANT INSERT ON filmes TO PUBLIC; Conceder todos os privilégios na visão tipos para o usuário manuel: • GRANT ALL PRIVILEGES ON tipos TO manuel;
  • 121. SQL (Comandos da DML) Comandos da DDL • O comando REVOKE é utilizado para revogar privilégios de acesso. Exemplos : • Revogar o privilégio de inserção na tabela filmes concedido para todos os usuários: REVOKE INSERT ON filmes FROM PUBLIC; • Revogar todos os privilégios concedidos ao usuário manuel relativos à visão vis_tipos: REVOKE ALL PRIVILEGES ON vis_tipos FROM manuel;