6338 111121071604-phpapp01

264 views
180 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
264
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

6338 111121071604-phpapp01

  1. 1. Introdução ao SQLProf. Claudio Azevedo Passos
  2. 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. 3. SQL (Structured Query Language)E. F. Codd: “A Relational Model of Data for LargeShared Data Banks”, junho 1970Definição de um modelo que propõe uma novaestrutura de armazenamento em banco de dados Modelo Relacional file: teorica_8.ppt Banco deDados I - Silvia Soares 3
  4. 4. SQL (Structured Query Language)IBM: linguagem SEQUEL (Structured English QueryLanguage)Ferramenta de acesso ao modelo proposto por CODD evoluçãoSQL (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 ArchitectureDatabase Interface – SAA SQL) em 1987 4
  5. 5. SQL (Structured Query Language) SQLSELECT GRANT CREATE SegurançaUPDATE REVOKE ALTERDELETE COMMIT DROP ControleINSERT ROLLBACK SAVEPOINT transaçõesDML DDL SET TRANSACTION Com COMMIT CONTROL “embutido” 5
  6. 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. 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. 8. SQL (Comandos da DDL)Comando CreateEste comando permite a criação de tabelas no banco de dados oumesmo de sua criação.Sintaxe:CREATE DATABASE < nome_db >;onde: nome_db - indica o nome do Banco de Dados a ser criado.
  9. 9. SQL (Comandos da DDL)• CREATE TABLE é o comando usado para criação databela e deve ser seguida pelo nome que daremos àtabela. Dentro do comando, devemos definir os nomes doscampos de acordo com a conveniência do banco dedados, e determinar o tipo de dado que poderá serincluí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 podeser repetido.• NOT NULL é usado quando desejamos que um camposeja de preenchimento obrigatório.
  10. 10. SQL (Comandos da DDL)Comando Create tableSintaxe: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. 11. SQL (Comandos da DDL)Comando Create tableExemploCREATE TABLE clima ( CREATE TABLE cidades ( cidade varchar(80), nome varchar(80), temp_min int, localizacao point temp_max int, ); Precipitacao real, data date);
  12. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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çãoimportado CHAR ( 1 ) DEFAULT N NOT NULL– A definição de valores padrões é particularmente importante para colunas NOT NULL
  23. 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. 24. Restrições de Integridade Integridade Referencial• As restrições de integridade referencial garantem a consistência dos relacionamentos entre as tabelas <<Table>> cidadescod_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. 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. 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. 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. 28. SQL – Chave Estrangeiras• Agora ao se tentar inserir um registroINSERT INTO clima VALUES (’Berkeley’, 45, 53, 0.0, ’1994-11-28’);• O que acontece :ERROR: <unnamed> referential integrity violation - key referencedfrom clima not found in cidadesO comportamento das chaves estrangeiras pode receber um ajustefino na aplicação. Não iremos além deste exemplo simples nestetutorial, mas consulte o Guia do Usuário do PostgreSQL para obtermais informações.Usar corretamente as chaves estrangeiras com certeza vai melhorar aqualidade dos seus aplicativos de banco de dados, portantoencorajamos muito que este tópico seja aprendido.
  29. 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. 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. 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. 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. 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. 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. 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. 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. 37. Exemplo- Restrições de Integridade nas Tabelas e nas Colunascreate 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. 38. Exemplo- Restrições de Integridade nas Tabelas e nas Colunascreate 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. 39. Exemplo- Restrições de Integridade nas Tabelas e nas Colunascreate 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. 40. SQL (Comandos da DDL)• DROP TABLE — remove uma tabela• DROP TABLE nome [, ...] [ CASCADE | RESTRICT ]ondeNOMEO nome (opcionalmente qualificado pelo esquema) da tabela a ser removida.CASCADERemove automaticamente os objetos dependentes da tabela (como visões).RESTRICTRecusa remover a tabela se existirem objetos dependentes. Este é o padrão.SaídasDROP TABLEMensagem retornada se a execução do comando for bem-sucedida.ERROR: table "nome" does not existSe a tabela especificada não existe no banco de dados.
  41. 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. 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. 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. 44. SQL (Comandos da DDL)• ALTER TABLE — SintaxeALTER 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 NULLALTER TABLE [ ONLY ] tabela [ * ]ALTER [ COLUMN ] coluna SET STATISTICS inteiroALTER TABLE [ ONLY ] tabela [ * ]ALTER [ COLUMN ] coluna SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }ALTER TABLE [ ONLY ] tabela [ * ]RENAME [ COLUMN ] coluna TO novo_nome_da_colunaALTER TABLE tabelaRENAME TO novo_nome_da_tabelaALTER TABLE [ ONLY ] tabela [ * ]ADD definição_de_restrição_de_tabelaALTER TABLE [ ONLY ] tabela [ * ]DROP CONSTRAINT nome_da_restrição [ RESTRICT | CASCADE ]ALTER TABLE tabelaOWNER TO novo_dono
  45. 45. SQL (Comandos da DML)• SELECT (DISTINCT) (*, COLUNA (SINÔNIMO), ...)FROM tabelaWHERE condição ou condiçõesORDER BY (coluna, expressão) (ASC/DESC)• Exemplo : SELECT registro, nome, cpf FROM cadastro;
  46. 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. 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. 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. 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. 50. SQL (Comandos da DML)• O Operador de ConcatenaçãoO Operador de Concatenação (||) permite que as colunassejam juntadas com outras colunas, expressões aritméticasou valores constantes para criar uma expressãoalfanumérica. Colunas ficam lado a lado com operadorespara formarem uma única coluna.• Exemplo : SELECT registro||nome FROM cadastro;
  51. 51. SQL (Comandos da DML)• Literais• Um literal são um ou mais caracteres, expressões, números incluídosna lista do SELECT o qual não é um nome de coluna ou de umsinônimo• Um literal na lista do SELECT terá uma saída para cada linharetornada. Literais de livre formatos de textos podem ser incluídos noresultado da pesquisa, e são tratados como uma coluna na lista doSELECT.•Datas e caracteres alfanuméricos devem ser colocados entre aspassimples(‘); números não precisam de aspas simples.• As declarações seguintes contém literais selecionados comconcatenação e colunas sinônimas.Exemplo : select registro||’-’||nome from cadastro
  52. 52. SQL (Comandos da DML)• Prevenindo a Seleção de Linhas DuplicadasA menos que você indique de outra maneira, SQL*Plus mostrará osresultados 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 DISTINCTPara eliminar valores duplicados no resultado, incluímos o DISTINCTqualificador no comando SELECT.Para eliminar os valores Duplicados mostrados no exemplo anterior, faça:Exemplo : SELECT DEPTBASE FROM CADASTRO;
  53. 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 aslinhas. Se usado, o ORDER BY precisa sempre ser a última clausula dadeclaração SELECT.Para ordenar pelo nome, faça:• Exemplo : SELECT nome, deptobase FROM cadastroORDER BY nome;SELECT nome, deptobase FROM cadastroORDER BY 1;
  54. 54. SQL (Comandos da DML)• Ordenação por várias colunas.• É possível na clausula ORDER BY usar mais de uma coluna. O limitede colunas é de fato o número de colunas da tabela. Na clausulaORDER BY especifica-se as colunas pelo que as linhas serãoordenadas, separando as por vírgula. Se algumas ou todas sãoinvertidas especifique DESC depois de alguma ou cada uma dascolunas• Exemplo :SELECT DEPTBASE, NOME FROM CADASTROORDER BY DEPTBASE, NOME DESC;
  55. 55. SQL (Comandos da DML)• A Clausula WHEREA clausula WHERE corresponde aos Operadores de Restrições daÁlgebra Relacional.Ele contém condições nas quais a linha precisa se encontrar emordem para ser mostrada.Estrutura da seleção com restrições.SELECT coluna(s)FROM tabela(s)WHERE certa condição a ser encontrada
  56. 56. SQL (Comandos da DML)A clausula WHERE pode comparar valores em uma coluna, valoresliterais, expressões aritméticas ou funções. A clausula WHEREconta com três elementos.1- Um nome de coluna2- Um operador de comparação3- Um nome de coluna, um constante, ou lista de valores.Operadores de Comparação são usados na clausula WHERE epodem 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. 57. SQL (Comandos da DML)• Para listar os nomes e departamentos de todos osempregados do departamento 1402• SELECT nome, deptobase FROM cadastro WHERE deptbase=1402;• Para encontrar todos os nomes de departamentos comnúmero de departamento maior que 1500, façaSELECT nome, deptobase FROM cadastro WHERE deptbase > 1500;
  58. 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, damesma forma com um valor constante.Por exemplo, suponhamos que você quer encontrar os empregados osquais a comissão está maior que seu salário, faça:SELECT nome FROM cadastroWHERE Com >= Sal;
  59. 59. SQL (Comandos da DML)• Operadores SQLExistem quatro operadores SQL os quais opera, com todos tipos dedados:Operador SignificadoBETWEEN ... AND ... Entre dois valores (inclusive)IN(Lista) compara uma lista de valoresLIKE Compara um parâmetro alfanuméricoIS NULL é um valor nulo
  60. 60. SQL (Comandos da DML)• O Operador BETWEENTesta para um faixa de valores, e inclusive do menor a maior faixa.Suponhamos que nós quisemos ver aqueles empregados nascidosdepois de 1960SELECT nome, datanasc from cadastro WHERE datanasc BETWEEN 1960-01-01 AND 2007-01-31;
  61. 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. 62. SQL (Comandos da DML)• O Operador LIKE Algumas vezes você precisa procurar valores que você não conheceexatamente Usando o operador LIKE é possível selecionar linhascombinando parâmetros alfanuméricos. Dois símbolos podem serusados 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. 63. SQL (Comandos da DML)• O Operador LIKEPara listar todos os empregados os quais o nome começa com a letraS, faça:SELECT nome FROM cadastro WHERE nome LIKE S%;Eles podem ser usados para encontrar um determinado número decaracteres.Por exemplo para listar todos empregados que tenham exatamentequatro caracteres de tamanho do nome.SELECT NOME FROM CADASTRO WHERE NOME LIKE ____
  64. 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. 65. SQL (Comandos da DML)• Expressões NegativasOs 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 queNOT COLUNA_NOME> não maior que
  66. 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 nuloPara encontrar aqueles empregados cujo os nomes não comecemcom a letra M, faça:SELECT NOME, DEPTOBASE FROM CADASTROWHERE NOME NOT LIKE M%;
  67. 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 Orsserão feitos.Se AND não interfere sobre o OR a seguinte declaração SQLretornará todos os gerentes com salário acima de 1500, etodos os vendedores.SELECT EMPNO, ENAME, JOB, SAL, DEPTNOFROM EMP WHERE SAL > 1500AND JOB = MANAGER‘ OR JOB = SALESMAN
  68. 68. SQL (Comandos da DML)Extraindo Dados de Mais de uma TabelaLigações (Joins)• Uma ligação é usada quando a pesquisa SQL requer dadosde mais de uma tabela do Banco de Dados.• Linhas em uma tabela devem ser ligadas a outras linhas deacordo com o valor comum existente na colunacorrespondente.Existem dois tipos principais de condições de ligações:1. Equi-join2. Non-equi-join
  69. 69. SQL (Comandos da DML)Extraindo Dados de Mais de uma TabelaEqui-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. 70. SQL (Comandos da DML)Extraindo Dados de Mais de uma TabelaUma condição de ligação é especificada na clausulaWHERE:SELECT coluna(s)FROM tabela(s)WHERE condição de ligaçãoPara ligar as duas tabelas CADASTRO e DEPTO, faça:SELECT CADASTRO.NOME, DEPTO.NOMEFROM CADASTRO, DEPTOWHERE CADASTRO.DEPTOBASE = DEPTO.CODIGO;
  71. 71. SQL (Comandos da DML)Extraindo Dados de Mais de uma TabelaUsando 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 clausulaFROM. Estes nomes temporários valem unicamente para a declaraçãode SELECT corrente. Tabelas sinônimas devem então ser declaradas naclausula SELECT. Isso agiliza a pesquisa em que a declaração contémmuitas informações.• Tabelas Sinônimas estão sendo usadas na seguinte declaração:SELECT C.NOME, D.NOMEFROM CADASTRO C, DEPTO DWHERE C.DEPTOBASE = D.CODIGOORDER BY D.CODIGO
  72. 72. SQL (Comandos da DML) Extraindo Dados de Mais de uma TabelaNom-Equi-Join• O relacionamento entre as tabelas CADASTRO e SALFAIXAé um nom-equi-join, em que a coluna na CADASTROcorresponde direto a uma coluna na SALFAIXA. Orelacionamento é obtido usando um outro operador que oigual(=).• Para avaliar um grau do salário de um empregado énecessário que o salário esteja entre o menor e maior faixade salário.• O operador BETWEEN é usado para construir a condição,faça:SELECT C.NOME, C.SAL, S.FAIXAFROM CADASTRO C, SALFAIXA SWHERE C.SAL BETWEEN S.LOSAL AND S.HISAL;
  73. 73. SQL (Comandos da DML) Extraindo Dados de Mais de uma Tabela1. Mostra todos os nomes dos empregados e o nome de seus departamentos em ordem de nome de departamento2. Mostrar o nome de todos os empregados, nome e número do departamento3. 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. 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. 75. SQL (Comandos da DML)Função Valor RetornadoAVG([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 nulasMAX([DISTINCT/ALL]expr) valor máximo da expressãoMIN([DISTINCT/ALL]expr) valor mínimo da expressãoSTDDEV([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. 76. SQL (Comandos da DML)Todas as funções do slide anterior operam sobre um númerode linhas (por exemplo, uma tabela inteira) e são portantofunções de GRUPO.• DISTINCT faz uma função de grupo considerar valores nãoduplicados;• ALL considera todos os valores sua declaração não énecessária.•Todas as funções de grupo exceto o COUNT(*) ignoram osvalores nulos
  77. 77. SQL (Comandos da DML)Funções de Grupo• AVGPara calcular a média das GQs dos alunos do curso 047 :SELECT AVG(gq1+gq2+gq3) FROM srhac01;SELECT AVG(sal) FROM cadastro;
  78. 78. SQL (Comandos da DML)Funções de GrupoMINUma função de grupo pode ser usada para subconjunto delinhas de uma tabela usando a clausula WHERE.Para encontrar o funcionário mais velho da UGF, dodeptobase 1711 faça:• SELECT MIN(datanasc) FROMCADASTRO WHERE deptobase = ‘1711;
  79. 79. SQL (Comandos da DML)Funções de GrupoCOUNTPara encontrar o número de empregados dodepartamento 1711, faça:SELECT COUNT(*) FROM CADASTROWHERE DEPTOBASE = 1711;Nota: A função COUNT usada dessa forma COUNT(1)tem o mesmo resultado que a acima e é mais rápida.
  80. 80. SQL (Comandos da DML)Funções de GrupoA clausula GROUP BY•A clausula GROUP BY pode ser usada para dividir aslinhas de uma tabela em um menor grupo. Funções degrupo devem ser usadas para resumir informações porcada grupo. Para mostrar os funcionários mais velhos pordepartamento, faça:• SELECT deptobase, min(datanasc) FROM cadastroGROUP BY deptobase;
  81. 81. SQL (Comandos da DML)Funções de GrupoExcluindo linhas quando estiver Usando o GROUP BYLinhas devem ser excluídas com a clausula WHERE, antesda divisão por grupos.Para mostrar o funcionário mais velho por deptobaseexcluindo o deptobase 1711, faça:SELECT deptobase, min(datanasc) FROM cadastroWHERE deptobase <> ‘1711‘GROUP BY deptobase;
  82. 82. SQL (Comandos da DML)Funções de GrupoGrupos dentro de GruposNós podemos então usar a clausula GROUP BY paraprover resultados para grupos dentro de grupos. Mostre o funcionário mais novo por cada funçãodentro de um departamento, faça:SELECT deptobase, funcao, max(datanasc) FROMcadastro GROUP BY deptobase, funcao;
  83. 83. SQL (Comandos da DML)Funções de GrupoFunções de Grupo e Resultados IndividuaisA seguinte declaração SQL retorna a maior idadepara cada grupo. O resultado não é significativoporque o deptobase não é mostrado no resultado.• SELECT MIN(datanasc) FROM cadastroGROUP BY deptobase;Mostrando o Departamento• SELECT MIN(datanasc),deptobase FROMcadastro GROUP BY deptobase;
  84. 84. SQL (Comandos da DML)Funções de GrupoSuponha na mente a seguinte regra quandousar funções de grupo:Se você inclui uma função de grupo nocomando SELECT, você não deve selecionarresultados que não estejam declarados noGROUP BY.
  85. 85. SQL (Comandos da DML)Funções de GrupoPor exemplo:SELECT DEPTOBASE, MIN(DATANASC) FROM CADASTRO;•ERROR: column "cadastro.deptobase" mustappear in the GROUP BY clause or be used inan aggregate function.O comando é inválido porque DEPTOBASE temum valor para cada linha da tabela, enquantoMIN(DATANASC) tem um valor para tabela inteira.
  86. 86. SQL (Comandos da DML)Funções de GrupoPara corrigir o erro, nós devemosagrupar o item individual:SELECT DEPTOBASE, MIN(DATANASC)FROM CADASTROGROUP BY DEPTOBASE;
  87. 87. SQL (Comandos da DML)Funções de GrupoA clausula HAVINGUse a clausula HAVING se você quiser especificaro qual grupo será mostrado.Para mostrar todos os departamentos que tiveremmais de três empregados, faça:SELECT DEPTOBASE FROM CADASTROGROUP BY DEPTNOHAVING COUNT(1) > 3;
  88. 88. SQL (Comandos da DML)Funções de GrupoPara mostrar só os departamentos, ondeexiste funcionários nascidos antes de1930-01-01, faça:SELECT deptobase, datanasc FROM cadastroGROUP BY deptobase, datanaschaving min(datanasc)<=1930-01-01
  89. 89. SQL (Comandos da DML)Funções de GrupoA clausula WHERE não pode ser usada para restringiritens de grupo.A seguinte declaração da clausula WHERE é errada.SELECT deptobase, datanasc FROM cadastroGROUP BY deptobase, datanascWHERE min(datanasc)<=1930-01-01Você pode unicamente usar WHERE para restringirlinhas individuais. Para restringir colunas de gruposusa-se a clausula HAVING.
  90. 90. SQL (Comandos da DML)Funções de GrupoNota:Você pode excluir todos os “gerentes”usando a clausula WHERE quandoestiver agrupando por cargo.SELECT funcao FROM cadastroWHERE funcao <> ‘035013GROUP BY funcao;
  91. 91. SQL (Comandos da DML)Funções de GrupoExercícios1. Encontrar o funcionário mais antigo2. Encontrar o funcionário mais antigo e o mais novo3. Listar o mais novo e o mais velho funcionário por cargo4. Encontrar quantos funcionários lecionam5. Mostre o departamento e a sua descrição que tiverem mais de 40 empregados6. Cheque se todos os números de funcionários são únicos
  92. 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. 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. 94. SQL (Comandos da DML)UPDATEUPDATE nomedatabelaSET campo 1 = valor 1,..., campo n = valor nExemplo :"UPDATE alunovestibularSET notaobjetiva=’20’, notaredacao=‘3.5’, classificacao=‘2WHERE matricula=".$matricula."";
  95. 95. SQL (Comandos da DML)DELETEDELETE FROM nomedatabelaWHERE <CONDIÇÃO>Exemplo : ?
  96. 96. SQL (Comandos da DML)Sub-Pesquisas• Pesquisas contendo na clausula WHERE ou HAVING deoutra declaração SQL• Uma sub-pesquisa é uma declaração SELECT que éaninhada com outra declaração SELECT e a qual retornaresultados intermediários.• Por exemplo:SELECT coluna1, coluna2, ...FROM tabelaWHERE coluna = (SELECT coluna FROM tabela WHERE condição)
  97. 97. SQL (Comandos da DML)Sub-Pesquisas• A sub-pesquisa é geralmente referida como SUB-SELECTou SELECT interno;• Geralmenteexecuta primeiro e a saída é usada paracompletar a condição da pesquisa principal ou outrapesquisa.
  98. 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. 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 cadastroWHERE salario = (menor salário o qual é desconhecido)
  100. 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 cadastroWHERE salario = SELECT MIN(salario) FROM cadastro;
  101. 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. 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. 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. 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. 105. SQL (Comandos da DML)Sub-Pesquisas que Retorna mais de Uma LinhaNote que a pesquisa interna tem a clausulaGROUP BY. Isso significa que ele pode retornarmais que um valor.Nós precisamos para usar múltiplas linhas de umoperador de comparação. Neste caso o operadorIN deve ser usado porque específica uma lista devalores
  106. 106. SQL (Comandos da DML)Sub-Pesquisas que Retorna mais de Uma Linha• Comparando mais de um valorA seguinte pesquisa encontrará aqueles empregados queganham o menor salário no seu respectivo departamento: A seguinte pesquisa encontrará aqueles empregados queganham 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. 107. SQL (Comandos da DML)Sub-Pesquisas que Retorna mais de Uma Linha• Erros EncontradosQuando uma sub-pesquisa retorna mais que uma linha eum operador de linha única é usado, a seguinte mensagemde 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. 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ãousados na clausula WHERE ou HAVING em conjunto comos operadores lógicos. (=,<>, <, >, >=, <=).• ANY compara um valor para cada valor retornado em umasub-pesquisa.Para mostrar os empregados que ganham mais que omenor 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. 109. SQL (Comandos da DML)Operadores ANY ou ALL• O menor salário do departamento 3003 é 500. A principalpesquisa tem que retornar os empregados que ganham osalário maior que o menor salário no departamento 3003.• ‘< ANY’ é equivalente ao IN.• Quando usamos ANY, a palavra chave DISTINCT é usadapara prevenir a seleção de linhas ocupadas.
  110. 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 quetodos 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. 111. SQL (Comandos da DML)Operadores Exists• O operador EXISTS é freqüentemente usado com Sub-pesquisascorrelatas. Ele testa quando um valor existe. (NOT EXISTS garante quenão existe). Se o valor existir será retornado Verdadeiro, se não existirserá retornado Falso.• Para encontrar os empregados que tem no mínimo uma pessoasubordinada 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. 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 nenhumempregado é: 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. 113. SQL (Comandos da DML)Clausula HAVING com Sub-pesquisas aninhadas• Lembre-se que WHERE refere-se para linha única eHAVING a grupos de linhas especificadas na clausulaGROUP BY.• Por exemplo, para mostrar os departamentos que tenhama média salarial maior que a do departamento 3003, faça:SELECT deptobase, AVG(salario) FROM cadastroHAVING AVG(salario) > (SELECT AVG(salario) FROM cadastro WHERE deptobase = 3003) GROUP BY deptobase;
  114. 114. SQL (Comandos da DML)Clausula HAVING com Sub-pesquisas aninhadasPara construir uma pesquisa que encontre a função commaior 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. 115. SQL (Comandos da DML)Sub-pesquisas aninhadasSub-pesquisas devem ser aninhadas (usadas com outrassub-pesquisas):• Mostrar o nome, cargo e admissão para os empregadoscuja o salário seja maior que o maior salário dodepartamento ‘NUCLEO DE TEC DA INFORMACAO ’.SELECT nome, funcao, dataadmissao, salario FROM cadastroWHERE salario > (SELECT MAX(salario) FROM cadastro WHERE deptobase = (SELECT deptobase FROM deptofunc WHERE descricao = NUCLEO DE TEC DA INFORMACAO ));
  116. 116. SQL (Comandos da DML)• Performance depende do uso dos índices, o número delinhas retornadas pela pesquisa, o tamanho da tabela e setabelas temporárias são requeridas para avaliar resultadostemporários.• As tabelas temporárias geradas pelo SGBD não sãoindexadas, e essa pode levar para o degradamento naperformance para sub-pesquisas usando IN, ANY e ALL.
  117. 117. SQL (Comandos da DML) Sub-pesquisas aninhadasExercícios1. Encontrar os empregados que ganham o maior salário em cada função e ordenar o salário da forma descendente2. 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. 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. 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. 120. SQL (Comandos da DML)Comandos da DDLExemplos : 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. 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;

×