SlideShare uma empresa Scribd logo
APOSTILA DE SQL<br />O objetivo da Apostila é trazer os principais comandos<br />SQL usados em aplicações ORACLE, com exemplos, comentários e<br />explicações.2<br />FINALIDADE DO CAPITULO:<br />No final deste capitulo você será capaz de criar scripts<br />permitindo que o usuário entre com valores diversos.<br />A finalidade dos exemplos abaixo é demostrar como<br />permitir que o usuário entre com os valores que possibilitem<br />a  execução de um comando  SQL, isso tudo em tempo de<br />execução.<br />Verifique o uso do \"
&\"
 que permite  que o usuário entre<br />com dados. No exemplo abaixo temos um pedido de entrada de um<br />numero, por isso é que o  &numero_do_dept  não está entre<br />aspas. Podemos notar também que aparece o  old  valor e o  new<br />valor, isso é devido ao cmdo set verify on, se quisermos que<br />não apareça, devemos  usar o set verify off.<br />Vamos ao Exemplo:<br />SQL> set verify on<br />SQL> select id,last_name,salary<br />  2  from   s_emp<br />  3  where  dept_id=&numero_do_dept;<br />Enter value for numero_do_dept: 31<br />old   3: where  dept_id=&numero_do_dept<br />new   3: where  dept_id=31<br />       ID LAST_NAME                    SALARY<br />--------- ------------------------- ---------<br />        3 Nagayama                       1400<br />       11 Magee                          1400<br />Agora não aparecerá o new e old valor porque estamos<br />usando o SET VERIFY OFF.<br />SQL> set verify off<br />SQL> select id,last_name,salary<br />  2  from   s_emp<br />  3  where  dept_id=&numero_do_dept;<br />Enter value for numero_do_dept: 31<br />       ID LAST_NAME                    SALARY<br />--------- ------------------------- ---------3<br />        3 Nagayama                       1400<br />       11 Magee                          1400<br />Vimos anteriormente como que temos que proceder para que<br />o usuário entre com valores numéricos, para que seja<br />realizada<br />uma pesquisa, agora vamos possibilitar que o usuário ente com<br />valores do tipo caracter, a principal diferença é o uso das<br />aspas, mas temos que ter atenção  para o formato na hora de<br />digitarmos, porque tem que ser o mesmo do conteúdo que está<br />na tabela, com maiúsculas e minúsculas.<br />Vamos ao Exemplo:<br />SQL> select id,last_name,salary<br />  2  from s_emp<br />  3  where title ='&job_title';    {possibilitando que o<br />usuário entre com o nome<br />do title}<br />Enter value for job_title: Stock Clerk<br />       ID LAST_NAME                    SALARY<br />--------- ------------------------- ---------<br />       16 Maduro                         1400<br />       17 Smith                           940<br />       18 Nozaki                         1200<br />       19 Patel                           795<br />       20 Newman                          750<br />       21 Markarian                       850<br />       22 Chang                           800<br />       23 Patel                           795<br />       24 Dancs                           860<br />       25 Schwartz                       1100<br />10 rows selected.<br />Nos exemplos anteriores o usuário entrou com a condição<br />de pesquisa quer seja numérica ou caracter, cada qual com<br />suas características, agora  vamos ver como que<br />possibilitamos ao usuário entrar com o nome da coluna e com a<br />própria condição de pesquisa que será estabelecida na<br />cláusula WHERE. Neste caso temos um exemplo onde é requerida<br />a entrada de um dado numérico.4<br />Vamos ao exemplo:<br />SQL> select id,&nome_coluna<br />  2  from s_emp<br />  3  where &condição;<br />Enter value for nome_coluna: LAST_NAME<br />Enter value for condição:  SALARY > 100<br />       ID LAST_NAME<br />--------- -------------------------<br />        1 Velasquez<br />        2 Ngao<br />        3 Nagayama<br />        4 Quick-To-See<br />        5 Ropeburn<br />        6 Urguhart<br />        7 Menchu<br />        8 Biri<br />Temos um outro exemplo em que o usuário entra com o<br />valor da coluna e da condição da WHERE.<br />SQL> select id,&nome_coluna<br />  2  from  s_ord<br />  3  where &condição;<br />Enter value for nome_coluna: date_ordered<br />Enter value for condição: total>30000<br />       ID DATE_ORDE<br />--------- ---------<br />      100 31-AUG-92<br />      104 03-SEP-92<br />      107 07-SEP-92<br />      108 07-SEP-92<br />      109 08-SEP-92<br />       97 28-AUG-92<br />6 rows selected.5<br />CONSTRUINDO SCRIPTS USANDO OPÇÕES PARA O USUÁRIO ENTRE COM<br />DADOS E TAMBÉM PARA SÓ MOSTRAR NA TELA O PROMPT.<br />No exemplo abaixo estamos usando os seguintes comandos<br />que na da mais é do que a soma de tudo aquilo que vimos neste<br />capitulo mas também algo mais:<br />O cmdo SET ECHO OFF serve para em tempo de execução não<br />se exiba os comandos do  SQL e  SET ECHO ON serve  para<br />retornar a forma anterior.<br />O cmdo  ACCEPT serve para que preparemos um  PROMPT para<br />receber um valor.<br />Neste exemplo também temos a criação de uma variável chamada<br />V_NAME que recebe valores.<br />Estamos preparando o ambiente para receber valores que<br />serão armazenados dentro de uma variável, para após isto,<br />serem feitas  comparações dentro da cláusula WHERE.<br />Estamos usando duas tabelas  S_DEPT e  S_REGION, o  AND  é<br />uma função onde complementa a cláusula  WHERE, e o  UPPER no<br />DPT.NAME está passando o conteúdo do nome do dept para<br />maiúsculo para que seja efetuada a comparação com um nome que<br />será digitado pelo  usuário, que por sua vez recebe um UPPER<br />que o transforma em maiúsculo. Essa alternativa é feita<br />porque não sabemos qual é o formato do dado na tabela.<br />Vamos ao exemplo:<br />SET ECHO OFF<br />ACCEPT V_NAME PROMPT 'DÊ O NOME DO DEPARTAMENTO:'<br />SELECT DPT.NAME, REG.ID, REG.NAME \"
 NOME DA REGIÃO\"
<br />FROM S_DEPT DPT, S_REGION REG {veja a criação de apelidos}<br />WHERE DPT.REGION_ID = REG.ID {veja o join}<br />AND UPPER(DPT.NAME) LIKE UPPER('%&V_NAME%') {valor digitado }<br />/<br />SET ECHO ON<br />Como estamos gerando um SCRIPT, os comandos devem ficar<br />armazenados dentro de um arquivo que possua a extensão SQL  e<br />preparado da forma  descrita acima quando estivermos no SQL e<br />desejarmos executar o nosso SCRIPT temos que seguir o<br />procedimento descrito abaixo, usando \"
@\"
 e o nome do arquivo,<br />ou \"
 START\"
 e o nome do arquivo.6<br />Vamos ao exemplo:<br />SET ECHO ON<br />SQL> @TEST.SQL<br />SQL> SET ECHO OFF<br />DÊ O NOME DO DEPARTAMENTO:sales<br />old   4: AND UPPER(DPT.NAME) LIKE UPPER('%&V_NAME%')<br />new   4: AND UPPER(DPT.NAME) LIKE UPPER('%sales%')<br />NAME                             ID  NOME DA REGIÃO<br />------------------------- --------- -------------------------<br />--------------------<br />Sales                             1 North America<br />Sales                             2 South America<br />Sales                             3 África / Middle East<br />Sales                             4 Ásia<br />Sales                             5 Europe<br />Podemos notar que por ocasião da execução o exemplo<br />anterior  mostrou o OLD e o NEW valores da variável, para não<br />mostrar temos que usar o SET VERIFY OFF veja abaixo:<br />Vamos ao exemplo:<br />SET VERIFY OFF<br />SET ECHO OFF<br />ACCEPT V_NAME PROMPT 'DÊ O NOME DO DEPARTAMENTO:'<br />SELECT DPT.NAME, REG.ID, REG.NAME \"
 NOME DA REGIÃO\"
<br />FROM S_DEPT DPT, S_REGION REG<br />WHERE DPT.REGION_ID = REG.ID<br />AND UPPER(DPT.NAME) LIKE UPPER('%&V_NAME%')<br />/<br />SET ECHO ON<br />Executando o SCRIPT:<br />SQL> START TEST.SQL<br />SQL> SET VERIFY OFF<br />SQL> SET ECHO OFF<br />DÊ O NOME DO DEPARTAMENTO:SALES<br />NAME                             ID  NOME DA REGIÃO<br />------------------------- --------- -------------------------<br />--------------------<br />Sales                             1 North America<br />Sales                             2 South America7<br />Sales                             3 Africa / Middle East<br />Sales                             4 Ásia<br />Sales                             5 Europe<br />Input truncated to 11 characters<br />OUTRO EXEMPLO DE GERAÇÃO DE SCRIPT:<br />Mais uma vez vamos usar alguns comandos já vistos em<br />exemplos anteriores, mas também alguns comandos novos e<br />precisamos<br />Mostrar a descrição de tais comandos:<br />O comando  SET ECHO OFF tem a finalidade de não deixar<br />aparecer os cmdos feitos para a execução.<br />O cmdo  VERIFY OFF tem a finalidade de não mostrar os<br />valores recebidos pelas as  variáveis que no exemplo em<br />questão são MENOR_DT e MAIOR_DT.<br />O ACCEPT é usado para criar variáveis e o  PROMPT para<br />receber valores para as variáveis.<br />Criadas as variáveis, observe a sintaxe e o \"
-\"
 entre a<br />definição do formato de data o uso de  DATE,  o  FORMAT    e  a<br />especificação 'MM/DD/YY'.<br />Estamos usando também o COLUMN FORMAT A30 para formatar<br />o tamanho da coluna  EMPREGADO e logo depois estamos<br />concatenando as colunas FIRST_NAME  e LAST_NAME.<br />Estamos também usando o  BETWEEN para pesquisarmos<br />valores que estão entre uma data e outra.<br />Observe o uso do TO_DATE antes da colocação da variável<br />com o  \"
&\"
 para receber valores que o usuário digita, e<br />observe também a forma que foi colocado o formato da data<br />'MM/DD/YY' e o uso do AND que faz parte da WHERE.<br />O UNDEFINE serve para que as variáveis percam os valores<br />após a execução.<br />Vamos ao Exemplo:<br />SET ECHO OFF<br />SET VERIFY OFF<br />ACCEPT MENOR_DT DATE FORMAT 'MM/DD/YY' -<br />PROMPT 'ENTRE MENOR DATA (MM/DD/AA) :'<br />ACCEPT MAIOR_DT DATE FORMAT 'MM/DD/YY' -<br />PROMPT 'ENTRE MAIOR DATA (MM/DD/AA) :'<br />COLUMN EMPREGADO FORMAT A30<br />SELECT USERID,FIRST_NAME||' '||LAST_NAME \"
EMPREGADO\"
,8<br />START_DATE FROM S_EMP<br />WHERE START_DATE BETWEEN TO_DATE('&MENOR_DT','MM/DD/YY')<br />AND TO_DATE('&MAIOR_DT','MM/DD/YY')<br />/<br />UNDEFINE MENOR_DT<br />UNDEFINE MAIOR_DT<br />COLUMN EMPREGADO CLEAR<br />SET ECHO ON<br />SET VERIFY ON<br />OUTRO EXEMPLO DE SCRIPT:<br />Estamos montando um script com a finalidade de receber<br />um valor que pesquise registros, no caso estamos querendo<br />pesquisar o ID e o NOME de um CUSTOMER e para isso recebendo<br />um dos nomes do CUSTOMER, por isso estamos usando o  LIKE  e<br />\"
%&NOME%\"
 estamos transformando a coluna NAME da tabela a ser<br />pesquisada em maiúsculo para que qualquer nome que seja<br />digitado em maiúsculo seja pesquisado.<br />Está sendo criado a variável NOME pelo ACCEPT e o PROMPT<br />possibilita a recepção de um valor, observe a sintaxe  \"
-\"
<br />após a variável NOME.<br />Vamos ao exemplo:<br />SET ECHO OFF<br />SET VERIFY OFF<br />ACCEPT NOME -<br />PROMPT ' ENTRE COM O NOME DESEJADO :'<br />SELECT ID, NAME FROM S_CUSTOMER<br />WHERE UPPER(NAME) LIKE '%&NOME%'<br />/<br />SET ECHO ON<br />SET VERIFY ON<br />FINAL DE CAPITULO9<br /> FINALIDADE DO CAPITULO:<br /> O COMANDO ALTER TABLE E SUAS VARIAÇÕES:<br />Adicionado uma coluna em uma tabela:<br />No exemplo a seguir estamos usando o cmdo  ALTER TABLE<br />para adicionar uma  coluna em uma tabela, a coluna adicionada<br />a tabela sempre será a última, importante saber que não<br />podemos deletar uma coluna de uma tabela mas somente<br />adicionar, se precisarmos dropar uma coluna a solução é<br />dropar a tabela e recriá – la  sem a coluna.<br />Vamos ao exemplo:<br />SQL> ALTER TABLE S_REGION<br />ADD      (comments VARCHAR(255));<br />Table altered.<br />O COMD MODIFY:<br />No exemplo abaixo estamos modificando uma coluna usando<br />o comando  modify,  no caso estamos aumentando o tamanho da<br />coluna  title para  50, é permitido aumentar o tamanho da<br />coluna mas diminuir não é permitido.<br />SQL> ALTER TABLE s_emp<br /> 2   MODIFY     (title VARCHAR(50));<br />Table altered.<br />ADCIONANDO UMA CONSTRAINT:<br />Para adicionarmos uma constraint temos que usar O ALTER TABLE<br />criar um nome para nossa constraint  no<br />caso's_emp_maneger_id_fk', escrevendo de onde ela é colocando<br />a referência com o id de s_emp.<br />Vamos ao exemplo:<br />SQL><br />ALTER TABLE s_emp<br />ADD CONSTRAINT s_emp_manager_id_fk<br />FOREIGN KEY (MANAGER_ID)<br />REFERENCES s_emp(id)10<br />DROPANDO UMA CONSTRAINT:<br />Este exemplo mostra como dropar uma CONSTRAINT, Neste caso  o<br />nome da constraint é s_emp_maneger_id_fk, verifique  a forma<br />como foi escrito o exemplo abaixo:<br />SQL>  ALTER TABLE S_EMP<br />  2   DROP CONSTRAINT s_emp_manager_id_fk;<br />Table altered.<br />DROPANDO REGISTROS EMCACATA:<br />Para dropar uma chave primaria em cascata ou seja,<br />deletá - la de forma que seja deletada em todas as tabelas<br />com quem tenha relação, temos prosseguir da seguinte forma:<br />Vamos ao exemplo:<br />SQL> ALTER TABLE s_dept<br />  2  DROP  primary key cascade; {observe o cmdo cascade}<br />Table altered.<br />Desabilitando CONSTRAINTS de uma tabela:<br />Verifique o cmdo  CACADE sendo usado no  ALTER TABLE,  a<br />finalidade de seu uso é permitir que todos os objetos que<br />fazem referência ao campo ID de S_EMP aceitem a desabilitação<br />da constraint.<br />Vamos ao exemplo:<br />SQL> ALTER TABLE s_emp<br />  2  DISABLE CONSTRAINT  s_emp_id_pk CASCADE;<br />Table altered.<br />Habilitando  uma constraint:<br />Para habilitarmos uma constraint  não precisamos usar o<br />cmdo cascade, porque é criada de forma automática<br />a UK ou FK.11<br />Vamos ao exemplo<br />SQL> ALTER TABLE s_emp<br />  2  ENABLE CONSTRAINT  s_emp_id_pk;<br />Table altered.<br />FINAL DE CAPITULO12<br />FINALIDADE DO CAPITULO:<br />O COMANDO SELECT TO_CHAR:<br />O exemplo abaixo temos um select que está selecionando<br />id,date_ordered da tabela s_ord onde o sales_rep_id é igual a<br />11, podemos notar que a date_ordered(data) é igual ao formato<br />de data padrão do oracle, ou seja, mês por extenso abreviado<br />e o ano com os dois últimos números do ano.<br />Vamos ao exemplo:<br />SQL>  SELECT ID,DATE_ORDERED<br />  2   FROM S_ORD<br />  3   WHERE<br />  4   SALES_REP_ID = 11;<br />       ID DATE_ORDE<br />--------- ---------<br />      100 31-AUG-92<br />      105 04-SEP-92<br />      109 08-SEP-92<br />      110 09-SEP-92<br />      111 09-SEP-92<br />No  exemplo abaixo estamos com o comando \"
 to_char \"
 mudando<br />o formato da data para o modelo que nós estamos querendo<br />mostrar em tela, ou seja, estamos mudando o formato padrão do<br />oracle para um novo formato correspondente ao que queremos,<br />no caso 'mm/yy' que corresponde ao mês e o ano.<br />Vamos ao exemplo:<br />SQL> SELECT ID,TO_CHAR(DATE_ORDERED,'MM/YY') ORDERED<br />  2  FROM S_ORD<br />  3  WHERE SALES_REP_ID = 11;<br />       ID ORDERED<br />--------- ------------------------------------------<br />      100 08/92<br />      105 09/92<br />      109 09/92<br />      110 09/92<br />      111 09/9213<br />Agora vamos converter a data colocando o dia por extenso<br />ou seja usando, \"
day\"
(extenso), para o dia e colocando o mês<br />por extenso usando,  \"
month\"
 para mês e colocando o ano por<br />extenso usando o \"
yyyy\"
 para ano.<br />Vamos ao Exemplo:<br />SELECT ID,TO_CHAR(DATE_ORDERED,'DAY/MONTH/YYYY') ORDERED<br />FROM S_ORD<br />WHERE SALES_REP_ID = 11<br /> ID ORDERED<br />--- ---------------------------------------------------------<br />100 MONDAY   /AUGUST   /1992<br />105 FRIDAY   /SEPTEMBER/1992<br />109 TUESDAY  /SEPTEMBER/1992<br />110 WEDNESDAY/SEPTEMBER/1992<br />111 WEDNESDAY/SEPTEMBER/1992<br />Agora estamos colocando o nome da ano escrito por<br />extenso usando a FUNÇÃO \"
YEAR\"
.<br />SELECT ID,TO_CHAR(DATE_ORDERED,'DAY/MONTH/YEAR') ORDERED<br />  FROM S_ORD<br />WHERE SALES_REP_ID = 11;<br />  ID ORDERED<br />---- -----------------------------------------------------<br /> 100 MONDAY   /AUGUST   /NINETEEN NINETY-TWO<br /> 105 FRIDAY   /SEPTEMBER/NINETEEN NINETY-TWO<br /> 109 TUESDAY  /SEPTEMBER/NINETEEN NINETY-TWO<br /> 110 WEDNESDAY/SEPTEMBER/NINETEEN NINETY-TWO<br /> 111 WEDNESDAY/SEPTEMBER/NINETEEN NINETY-TWO<br />Agora estamos usando o cmdo \"
 dy \"
 para mudar o dia da<br />semana, passando da escrita por extenso para abreviado em<br />três dígitos, observe o exemplo.<br />Vamos ao exemplo:<br />SQL> SELECT ID,TO_CHAR(DATE_ORDERED,'DY/MONTH/YEAR') ORDERED<br />  2   FROM S_ORD<br />  3   WHERE SALES_REP_ID = 11;14<br />       ID ORDERED<br />--------- ---------------------------------------------------<br />      100 MON/AUGUST   /NINETEEN NINETY-TWO<br />      105 FRI/SEPTEMBER/NINETEEN NINETY-TWO<br />      109 TUE/SEPTEMBER/NINETEEN NINETY-TWO<br />      110 WED/SEPTEMBER/NINETEEN NINETY-TWO<br />      111 WED/SEPTEMBER/NINETEEN NINETY-TWO<br />O exemplo abaixo demostra como colocar o dia em formato<br />numérico \"
FMDD\"
 e o mês e o ano por extenso.<br /> Select LAST_NAME, TO_CHAR(START_DATE,'FMDD  \"
OF\"
 MONTH<br />YYYY') HIREDATE<br /> FROM  S_EMP<br /> WHERE START_DATE LIKE '%91'<br />LAST_NAME<br />-----------------------<br />HIREDATE<br />-----------------------<br />Nagayama<br />17  OF JUNE      1991<br />Urguhart<br />18  OF JANUARY   1991<br />Havel<br />27  OF FEBRUARY  1991<br />Sedeghi<br />18  OF FEBRUARY  1991<br />Dumas<br />09  OF OCTOBER   1991<br />Nozaki<br />09  OF FEBRUARY  1991<br />Patel<br />LAST_NAME<br />-----------------------<br />HIREDATE<br />-----------------------<br />06  OF AUGUST    199115<br />Newman<br />21  OF JULY      1991<br />Markarian<br />26  OF MAY       1991<br />Dancs<br />17  OF MARCH     1991<br />Schwartz<br />09  OF MAY       1991<br />No exemplo abaixo estamos usando a função to_char<br />novamente, agora para formatarmos um numero e concatenarmos<br />uma coluna numérica com um comentário caracter.<br />Vamos ao Exemplo:<br />SQL><br />    SELECT 'O PEDIDO ' ||TO_CHAR(ID)||'<br />    TEM UM TOTAL DE: '||TO_CHAR(TOTAL,'FM$9,999,999')<br />    FROM S_ORD<br />   WHERE DATE_SHIPPED ='21-SEP-92'<br />/<br />'OPEDIDO'||TO_CHAR(ID)||'TEMUMTOTALDE:'||TO_CHAR(TOTAL,'FM$9,<br />999,999')<br />-------------------------------------------------------------<br />-----------<br />O PEDIDO 107<br />TEM UM TOTAL DE: $142,171<br />O PEDIDO 110<br />TEM UM TOTAL DE: $1,539<br />O PEDIDO 111<br />TEM UM TOTAL DE: $2,770<br />FINAL DE CAPÍTULO.16<br />Finalidade do Capitulo:<br />Demostrar o uso do Comando TO_DATE.<br />Verifique que no exemplo abaixo estamos querendo fazer uma<br />pesquisa usando um campo data onde escrevemos a data, o mês e<br />o ano e o cmdo to_date transforma o que digitamos em data<br />para a pesquisa, só que deve ser obedecida uma seqüência<br />lógica nas posições por isso o exemplo abaixo está incorreto.<br />Vamos ao exemplo:<br />SQL>  SELECT DATE_ORDERED<br />  2   FROM S_ORD<br />  3    WHERE DATE_ORDERED =<br />  4   TO_DATE('31 1992, AUGUST','DD MONTH, YYYY');<br />ERROR:<br />ORA-01843: not a valid month<br />Vamos tentar corrigir o exemplo acima. A função do cmdo<br />to_date é converter valores digitados, numéricos e caracters<br />para data, a ordem da data procurada no exemplo abaixo tem<br />que ser a mesma do formato de data colocado da seguinte<br />forma:<br />SQL> SELECT DATE_ORDERED<br />  2  FROM S_ORD<br />  3   WHERE DATE_ORDERED =<br />  4  TO_DATE('31 1992, AUGUST','DD, YYY MONTH');<br />DATE_ORDE<br />---------<br />31-AUG-92<br />31-AUG-92<br />31-AUG-92<br />31-AUG-92<br />31-AUG-92<br />FINAL DE CAPÍTULO17<br />Finalidade do Capítulo:<br />Demostrar o uso dos comandos COMMIT,ROLLBACK E SAVE<br />POINT.<br />Os cmdos COMMIT , ROLLBACK e SAVE POINT são usados para<br />controle de execução, de confirmação e de retorno.Veja abaixo<br />que estamos  alterando o valor de SALARY na tabela S_EMP<br />usando o  UPDATE e SET, após alterá-los nós criamos um<br />SAVEPOINT, que serve simplesmente para o controle de ponto,<br />para se quisermos dar um  ROLLBACK nas alterações feitas até<br />então, termos condições de limitar o espaço atingindo pelo<br />ROLLBACK.<br />Vamos ao Exemplo de Update:<br />SQL> EDIT<br />Wrote file afiedt.buf<br />  1  UPDATE S_EMP<br />  2  SET   SALARY = SALARY * 1.1<br />  3* WHERE TITLE ='Stock Clerk'<br />SQL> /<br />10 rows updated.<br />Agora vamos criar um SAVEPOINT.<br />Vamos ao Exemplo:<br />SQL> savepoint update_ponto;<br />Savepoint created.<br />Agora usando o cmdo INSERT INTO estamos inserindo<br />registros<br /> na tabela s_region.<br />SQL> insert into s_region (id,name)<br />  2  values (8,'central');<br />1 row created.<br />Estamos selecionando os registros de s_region para<br />confirmamos a inserção ou seja, se realmente foi incluído<br />registros nesta tabela.18<br />SQL> select * from<br />  2  s_region<br />  3  where id = 8;<br />       ID NAME<br />--------- ------------------------------------<br />        8 central<br />Agora após confirmarmos a inclusão dos registros, nós<br />decidirmos que não queremos que seja incluído registros na<br />referida tabela  s_region e para voltarmos a nossa ação temos<br />então que dar um ROLLBACK, para desfazer o INSERT, só que<br />somente até o ponto da inserção, ou seja até o SAVE POINT,<br />que foi criado anteriormente ou seja tudo que está antes do<br />SAVE POINT continua com suas alterações preservadas, é bom<br />observar que para o SAVE POINT foi criado um nome no caso<br />UPDATE_PONTO, isso serve para que possamos referenciar de<br />forma correta até que ponto queremos cancelar nossas ações ou<br />seja até que ponto não queremos que sejam salvas nossas<br />ações.<br />Vamos ao exemplo:<br />SQL> ROLLBACK TO UPDATE_PONTO;<br />Rollback complete.<br />Agora vamos dar novamente um select para confirmarmos se<br />o nosso  ROLLBACK  realmente fez efeito, observe que as<br />alterações feitas anteriormente não foram concretizadas.<br />SQL> select * from<br />  2  s_region<br />  3  where id = 8;<br />no rows selected<br />O CMDO ROLLBACK serve para que seja desfeitas as<br />alterações que foram efetuadas em uma tabela.<br />Vamos ao exemplo:<br />SQL> delete from test;<br />25,000 rows deleted<br />para cancelar o DELETE na tabela test.19<br />SQL> ROLLBACK;<br />Rollback complete.<br />O uso do COMMIT:<br />O CMDO COMMIT é o contrário do ROLLBACK ou seja serve<br />para confirmar as alterações que por ventura sejam feitas.<br />Uma vez dado um COMMIT não podemos retornar mais atrás.<br />SQL> delete from test;<br />25,000 rows deleted<br />Vamos confirmar o DELETE com o COMMIT.<br />SQL> COMMIT;<br />Commit complete.<br />FINAL DE CAPÍTULO20<br />Finalidade do Capítulo é demostrar como criar comentários<br />a respeito de tabelas.<br />O comentários criado  a respeito de tabelas e colunas<br />são armazenados no dicionário de dados em:<br />ALL_COL_COMMENTS<br />USER_COL_COMMENTS<br />ALL_TAB_COMMENTS<br />USER_TAB_COMMENTS<br />Criando  comentários para uma tabela:<br />SQL> COMMENT ON TABLE s_emp is ' informação sobre<br />funcionário';<br />Comment created.<br />Como criar comentários para uma coluna:<br />SQL> COMMENT ON COLUMN s_emp.last_name IS ' ultimo';<br />Comment created.COMMENT ON COLUMN s_emp.last_name IS '<br />último'<br />Como verificar os comentários existentes dentro de uma<br />tabela ou coluna:<br />Primeiramente vamos verificar os comentários relativos<br />as colunas pertencentes a uma tabela  all_col_comments, para<br />depois realizarmos um select em seu conteúdo pesquisando pelo<br />nome da tabela ou coluna para sabermos qual é o comentário<br />específico a respeito.<br />SQL> desc all_col_comments<br /> Name                            Null?    Type<br /> ------------------------------- -------- ----<br /> OWNER                           NOT NULL VARCHAR2(30)<br /> TABLE_NAME                      NOT NULL VARCHAR2(30)<br /> COLUMN_NAME                     NOT NULL VARCHAR2(30)<br /> COMMENTS                                 VARCHAR2(2000)21<br />Vamos realizando um  SELECT ALL_COL_COMMENTS  para<br />vermos quais os comentários relativos a todas as colunas da<br />tabela s_emp que são armazenados em COMMENTS  :<br />SQL> select COMMENTS<br />  2  from all_col_comments<br />  3  where TABLE_NAME = 'S_EMP';<br />COMMENTS<br />------------<br /> ultimo<br />COMMENTS<br />------------<br />Agora queremos saber o comentário a respeito da tabela s_emp<br />veja abaixo:<br />SQL> SELECT  COMMENTS<br />  2  FROM  ALL_TAB_COMMENTS<br />  3  WHERE TABLE_NAME ='S_EMP';<br />COMMENTS<br />----------------------------------<br /> informação sobre funcionário<br />FIM DE CAPÍTULO22<br />Finalidade do Capítulo Tratar de Assuntos Relativos a<br />Constraints.<br />Vamos ver como verificar as constraints de uma tabela<br />O seus tipos e nomes ou seja se é not null, se é foreing<br />key,unique key ou primary key.<br />SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE,<br />SEARCH_CONDITION,<br />  2  R_CONSTRAINT_NAME<br />  3  FROM USER_CONSTRAINTS<br />  4  WHERE TABLE_NAME = 'S_DEPT';<br />CONSTRAINT_NAME                C<br />------------------------------ -<br />SEARCH_CONDITION<br />-------------------------------------------------------------<br />-------------------<br />R_CONSTRAINT_NAME<br />------------------------------<br />S_DEPT_ID_NN                   C<br />ID IS NOT NULL<br />S_DEPT_NAME_NN                 C<br />NAME IS NOT NULL<br />S_DEPT_ID_PK                   P<br />S_DEPT_NAME_REGION_ID_UK       U<br />S_DEPT_REGION_ID_FK            R<br />----------------------------<br />S_REGION_ID_PK23<br />Para vermos o nome das colunas envolvidas com<br />constraints e seus respectivos nomes naturais temos que fazer<br />um select na tabela  user_cons_columns  conforme o exemplo a<br />seguir:<br />SQL> SELECT CONSTRAINT_NAME, COLUMN_NAME<br />  2  FROM USER_CONS_COLUMNS<br />  3  WHERE TABLE_NAME = 'S_DEPT';<br />CONSTRAINT_NAME                COLUMN_NAME<br />------------------------------ ---------------------<br />S_DEPT_ID_NN                   ID<br />S_DEPT_ID_PK                   ID<br />S_DEPT_NAME_NN                 NAME<br />S_DEPT_NAME_REGION_ID_UK       NAME<br />S_DEPT_NAME_REGION_ID_UK       REGION_ID<br />S_DEPT_REGION_ID_FK            REGION_ID<br />6 rows selected.<br />FINAL DE CAPÍTULO24<br />Finalidade do Capítulo é o Uso do Create, Drop Table.<br />O comando  DROP é usado para deletar a tabela ou seja,<br />apagá-la fisicamente.<br />O comando  CREATE é usado na criação de tabelas e o<br />INSERT na inserção de dados em tabelas.<br />Vamos ao exemplo de como DROPAR uma tabela, VIEW ou SEQUENCE:<br />DROP TABLE EMP;<br />DROP TABLE DEPT;<br />DROP TABLE BONUS;<br />DROP TABLE SALGRADE;<br />DROP TABLE DUMMY;<br />DROP TABLE ITEM;<br />DROP TABLE PRICE;<br />DROP TABLE PRODUCT;<br />DROP TABLE ORD;<br />DROP TABLE CUSTOMER;<br />DROP VIEW SALES;<br />DROP SEQUENCE ORDID;<br />DROP SEQUENCE CUSTID;<br />DROP SEQUENCE PRODID;<br />Vamos ao exemplo de como criar uma tabela, observe os<br />detalhes em relação aos parênteses, nome das colunas ,data<br />type e constraints.<br />CREATE TABLE DEPT (<br /> DEPTNO              NUMBER(2) NOT NULL,<br /> DNAME               CHAR(14),<br /> LOC                 CHAR(13),<br /> CONSTRAINT DEPT_PRIMARY_KEY PRIMARY KEY (DEPTNO));<br />Após criarmos a tabela vamos inserir dados a mesma, em<br />um comando INSERT<br />INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');<br />INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');<br />INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');<br />INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON');25<br />CREATE TABLE EMP<br />( EMPNO               NUMBER(4) NOT NULL,<br />  ENAME               CHAR(10),<br />  JOB                 CHAR(9),<br />  MGR                 NUMBER(4) CONSTRAINT EMP_SELF_KEY<br />REFERENCES EMP (EMPNO),<br /> HIREDATE            DATE,<br /> SAL                 NUMBER(7,2),<br /> COMM                NUMBER(7,2),<br /> DEPTNO              NUMBER(2) NOT NULL,<br /> CONSTRAINT EMP_FOREIGN_KEY FOREIGN KEY (DEPTNO) REFERENCES<br />DEPT (DEPTNO),<br /> CONSTRAINT EMP_PRIMARY_KEY PRIMARY KEY (EMPNO));<br />Inserindo Registros na Tabela Criada Usando o cmdo INSERT.<br />INSERT INTO EMP VALUES (7839,'KING','PRESIDENT',NULL,'17-NOV-<br />81',5000,NULL,10);<br />INSERT INTO EMP VALUES (7698,'BLAKE','MANAGER',7839,'1-MAY-<br />81',2850,NULL,30);<br />INSERT INTO EMP VALUES (7782,'CLARK','MANAGER',7839,'9-JUN-<br />81',2450,NULL,10);<br />INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,'2-APR-<br />81',2975,NULL,20);<br />INSERT INTO EMP VALUES (7654,'MARTIN','SALESMAN',7698,'28-<br />SEP-81',1250,1400,30);<br />INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,'20-FEB-<br />81',1600,300,30);<br />INSERT INTO EMP VALUES (7844,'TURNER','SALESMAN',7698,'8-SEP-<br />81',1500,0,30);<br />INSERT INTO EMP VALUES (7900,'JAMES','CLERK',7698,'3-DEC-<br />81',950,NULL,30);<br />INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,'22-FEB-<br />81',1250,500,30);<br />INSERT INTO EMP VALUES (7902,'FORD','ANALYST',7566,'3-DEC-<br />81',3000,NULL,20);<br />INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,'17-DEC-<br />80',800,NULL,20);<br />INSERT INTO EMP VALUES (7788,'SCOTT','ANALYST',7566,'09-DEC-<br />82',3000,NULL,20);<br />INSERT INTO EMP VALUES (7876,'ADAMS','CLERK',7788,'12-JAN-<br />83',1100,NULL,20);<br />INSERT INTO EMP VALUES (7934,'MILLER','CLERK',7782,'23-JAN-<br />82',1300,NULL,10);26<br />Outro Exemplo de Como Criar uma Tabela:<br />CREATE TABLE BONUS (<br /> ENAME               CHAR(10),<br /> JOB                 CHAR(9),<br /> SAL                 NUMBER,<br /> COMM                NUMBER);<br />CREATE TABLE SALGRADE (<br /> GRADE               NUMBER,<br /> LOSAL               NUMBER,<br /> HISAL               NUMBER);<br />Inserindo Valores na Nova Tabela.<br />INSERT INTO SALGRADE VALUES (1,700,1200);<br />INSERT INTO SALGRADE VALUES (2,1201,1400);<br />INSERT INTO SALGRADE VALUES (3,1401,2000);<br />INSERT INTO SALGRADE VALUES (4,2001,3000);<br />INSERT INTO SALGRADE VALUES (5,3001,9999);<br />Para criarmos uma tabela temos antes que mais nada ter<br />permissão para isto ou seja  “GRANT”, que nos é concedido<br />através do  DBA, depois não podemos nos esquecer de criar as<br />CONSTRAINTS que são as PK os campos NOT NULL as FK. O observe<br />a sintaxe da criação de tabela, a definição do tipo e tamanho<br />das colunas ( Data Type), a referencia a chave estrangeira e<br />a criação, as colunas de formato  DATE  usa-se o padrão<br />SYSDATE que corresponde a data do sistema.<br />Vamos ao Exemplo:<br />CREATE TABLE S_TEST<br />(ID          NUMBER(7)<br />CONSTRAINT S_TEST_ID_PK PRIMARY KEY,<br />NAME         VARCHAR2(25)<br />CONSTRAINT S_TEST_NAME_NN NOT NULL,<br /> REGION_ID    NUMBER(7)<br />CONSTRAINT S_TEST_REGION_ID_FK REFERENCES<br />S_REGION(ID),<br />START_DATE    DATE DEFAULT SYSDATE)<br />/27<br />No próximo exemplo vamos criar uma tabela em função de<br />uma outra onde se traz somente as constrains NOT NULL, o tipo<br />e tamanho das colunas são também automaticamente trazidos,<br />assim também como o conteúdo dos mesmos. Verifique o exemplo<br />abaixo como isto é feito e veja o formato de S_EMP e o novo<br />formato  do que chamamos de  EMP_41, veja também que ele<br />somente traz  os registros referentes ao dept 41. Observe a<br />sintaxe \"
AS\"
 e a sub query dentro do Create table.<br />SQL> Create table emp_41<br />  2  AS<br />  3  SELECT ID,LAST_NAME,USERID,START_DATE,<br />  4  SALARY,TITLE<br />  5  FROM S_EMP<br />  6  WHERE DEPT_ID = 41;<br />Table created.<br />O formato da tabela criada, é o mesmo da s_emp veja:<br />SQL> DESC EMP_41<br /> Name                            Null?    Type<br /> ------------------------------- -------- ----<br /> ID                              NOT NULL NUMBER(7)<br /> LAST_NAME                       NOT NULL VARCHAR2(25)<br /> USERID                          NOT NULL VARCHAR2(8)<br /> START_DATE                               DATE<br /> SALARY                                   NUMBER(11,2)<br /> TITLE                                    VARCHAR2(25)<br />SQL> desc s_emp<br /> Name                            Null?    Type<br /> ------------------------------- -------- ----<br /> ID                              NOT NULL NUMBER(7)<br /> LAST_NAME                       NOT NULL VARCHAR2(25)<br /> FIRST_NAME                               VARCHAR2(25)<br /> USERID                          NOT NULL VARCHAR2(8)<br /> START_DATE                               DATE<br /> COMMENTS                                 VARCHAR2(255)<br /> MANAGER_ID                               NUMBER(7)<br /> TITLE                                    VARCHAR2(25)<br /> DEPT_ID                                  NUMBER(7)<br /> SALARY                                   NUMBER(11,2)<br /> COMMISSION_PCT                           NUMBER(4,2)28<br />Veja os dados da nova tabela.<br />SQL> select id,last_name<br />  2  from EMP_41;<br />       ID LAST_NAME<br />--------- -------------------------<br />        2 Ngao<br />        6 Urguhart<br />       16 Maduro<br />       17 Smith<br />Observe que os dados abaixo são os mesmos da tabela<br />criada que foram justamente criada a partir do departamento<br />41.<br />SQL>  select id,last_name<br />  2  from s_emp<br />  3  where dept_id = 41;<br />       ID LAST_NAME<br />--------- ------------------------<br />        2 Ngao<br />        6 Urguhart<br />       16 Maduro<br />       17 Smith<br />Como  descobrir quais são as tabelas que estão a nossa<br />disposição:<br />select object_name from user_Objects<br /> where object_type = 'TABLE';<br />FIM DE CAPÍTULO29<br />Finalidade do Capítulo:<br />Demostrar o uso do comando DELETE:<br />O Cmdo  DELETE serve para delatarmos registros em uma<br />tabela, usamos o DELETE from e o nome da tabela.Neste exemplo<br />abaixo estamos querendo deletar todos<br />os registros da tabela s_emp que tenham como start_date<br />o dia 01.01.1996, para isso temos que usar na clausula WHERE<br />o TO_DATE colocando o valor do que nós estamos querendo e seu<br />correspondente dia, mês e ano conforme o formato, no caso não<br />deletou nenhum registro porque não existia nenhum que<br />satisfazia as condições.<br />Vamos ao exemplo:<br />SQL> EDIT<br />Wrote file afiedt.buf<br />  1  DELETE FROM s_emp<br />  2  WHERE START_DATE ><br />  3* TO_DATE ('01.01.1996','DD.MM.YYYY')<br />SQL> /<br />0 rows deleted<br />Agora estamos tentando deletar um registro que existe,<br />como o registro existente é uma FK que logicamente existe uma<br />outra tabela não se aceita a deleção, veja a mensagem de erro<br />de violação de constraint.<br />SQL> DELETE FROM s_emp<br />2  WHERE START_DATE > TO_DATE ('01.01.1991','dd.mm.yyyy');<br />DELETE FROM s_emp<br />            *<br />ERROR at line 1:<br />ORA-02292: integrity constraint<br />(GUIMA.S_WAREHOUSE_MANAGER_ID_FK)<br />violated - child record found<br />Para deletar todos os registros de uma tabela procede-se da<br />seguinte forma:<br />SQL> DELETE FROM test;<br />25,000 rows deleted.30<br />Para  confirmarmos a deleção usamos o comando select na table<br />deletada.<br />SELECT * FROM<br />2 test;<br />no rows selected;<br />FIM DE CAPÍTULO31<br />Finalidade do Capítulo é Mostrar com Trabalhar com o<br />Dicionário de Dados.<br />O dicionário de dados serve dentre outras coisas para<br />possibilitar a visualização de quais  objetos que estão<br />disponíveis para manipulação, por exemplo: se temos acesso a<br />tabelas, views ou etc.<br />No exemplo abaixo estamos fazendo um select na tabela<br />user_objects usando o comando 'distinct'  com a finalidade de<br />vermos quais os objetos a serem manipulados.<br />Vamos ao exemplo:<br />SQL> SELECT DISTINCT OBJECT_TYPE<br />  2  FROM USER_OBJECTS;<br />OBJECT_TYPE<br />-------------<br />INDEX<br />SEQUENCE<br />TABLE<br />/<br />Para vermos quais são as tabelas ou outros objetos que<br />estão a nossa disposição, ou seja aqueles que temos permissão<br />para manipulá – los temos que fazer um select  no dicionário<br />de dados, incluindo neste o   object_name na tabela<br />user_objects usando o tipo desejado 'table' ou 'view' e etc.<br />SELECT OBJECT_NAME<br />FROM USER_OBJECTS<br />WHERE OBJECT_TYPE = 'TABLE'<br />/<br />OBJECT_NAME<br />---------------------<br />FUNCIONÁRIO<br />SEÇÃO<br />S_CUSTOMER<br />S_DEPT<br />S_EMP<br />S_IMAGE<br />S_INVENTORY<br />S_ITEM<br />S_LONGTEXT<br />S_ORD<br />S_PRODUCT32<br />S_REGION<br />S_TITLE<br />S_WAREHOUSE<br />14 rows selected.<br />Ainda usando o dicionário de dados podemos verificar<br />quais são as  constraints de uma tabela, é bom lembrar que<br />estamos fazendo uma consulta na tabela   USER_CONSTRAITS que<br />assim como a USER_OBJECTS pertence ao dicionário de dados.<br />SQL> select constraint_name,constraint_type,search_condition,<br />      r_constraint_name<br />  2   from user_constraints<br />  3   where table_name = 'S_EMP';<br />CONSTRAINT C SEARCH_CONDITION   R_CONSTRAINT_NAME<br />---------- - ------------------ ---------------------<br />S_EMP_ID_N C ID IS NOT NULL<br />N<br />S_EMP_LAST C LAST_NAME IS NOT N<br />_NAME_NN     ULL<br />S_EMP_USER C USERID IS NOT NULL<br />ID_NN<br />S_EMP_ID_P P<br />K<br />S_EMP_USER U<br />ID_UK<br />S_EMP_COMM C commission_pct IN<br />ISSION_PCT   (10, 12.5, 15, 17.<br />_CK          5, 20)<br />S_EMP_MANA R                    S_EMP_ID_PK<br />GER_ID_FK<br />CONSTRAINT C SEARCH_CONDITION   R_CONSTRAINT_NAME<br />---------- - ------------------ ---------------------<br />S_EMP_DEPT R                    S_DEPT_ID_PK33<br />_ID_FK<br />S_EMP_TITL R                    S_TITLE_TITLE_PK<br />E_FK<br />9 rows selected.<br />Tentando refinar ainda mais o exemplo acima vamos<br />verificar quais são as constraints referentes as colunas de<br />uma determinada tabela que no caso é a s_emp.<br />Vamos ao Exemplo:<br />SQL><br />  SELECT CONSTRAINT_NAME,COLUMN_NAME<br />  FROM USER_CONS_COLUMNS<br />  WHERE TABLE_NAME ='S_EMP'<br />CONSTRAINT_NAME           COLUMN_NAME<br />------------------------- -------------------<br />S_EMP_COMMISSION_PCT_CK   COMMISSION_PCT<br />S_EMP_DEPT_ID_FK          DEPT_ID<br />S_EMP_ID_NN               ID<br />S_EMP_ID_PK               ID<br />S_EMP_LAST_NAME_NN        LAST_NAME<br />S_EMP_MANAGER_ID_FK       MANAGER_ID<br />S_EMP_TITLE_FK            TITLE<br />S_EMP_USERID_NN           USERID<br />S_EMP_USERID_UK           USERID<br />9 rows selected.<br />FIM  DE CAPÍTULO<br />Finalidade deste capítulo é apresentar o uso de funções<br />de grupo do cmdo group by, funções de grupo MAX,MIN,SUM,AVG e<br />ainda o uso do HAVING:<br />Dica importante: geralmente o que está dentro do comando<br />select deve estar no group by.<br />Neste exemplo estamos vendo o uso da função AVG que tem a<br />finalidade de trazer a média de uma determinada soma. Estamos<br />também usando a função MAX e MIN que tem como função trazer o<br />máximo e o mínimo valor. Também temos a função SUM que faz a<br />soma de valores de colunas, todas essas funções são funções<br />de grupo. Ainda no exemplo abaixo temos o uso da função UPPER<br />que transforma o conteúdo a ser pesquisado e a função  LIKE<br />que faz a pesquisa somente nos registros que começarem por<br />'sales'.<br />SQL> select avg(SALARY),MAX(SALARY),MIN(SALARY),<br />  2         SUM(SALARY)<br />  3  FROM   S_EMP<br />  4  WHERE  UPPER(TITLE) LIKE 'SALES%';<br />AVG(SALARY) MAX(SALARY) MIN(SALARY) SUM(SALARY)<br />----------- ----------- ----------- -----------<br />       1476        1525        1400        7380<br />Neste exemplo abaixo, temos o menor nome e o maior nome<br />dentro da ordem alfabética, demostrando que não somente os<br />valores numéricos que são manipuláveis com as funções  MIN  e<br />MAX, é bom salientar que as datas também são passíveis de<br />manipulação.<br />Vamos ao exemplo:<br />SQL> select MIN(LAST_NAME),MAX(LAST_NAME)<br />  2  FROM S_EMP;<br />MIN(LAST_NAME)            MAX(LAST_NAME)<br />------------------------- -------------------------<br />Biri                      Velasquez35<br />No exemplo abaixo estamos tentando selecionar o ID de<br />departamento igual a 41 trazendo seu numero de repetições,<br />mas não dá certo pois a função COUNT é de grupo e não estamos<br />usando o GROUP BY.<br />Vamos ao exemplo:<br />SQL> select dept_id, count(*) \"
number\"
<br />  2  from   s_emp<br />  3  where  dept_id = 41;<br />select dept_id, count(*) \"
number\"
<br />       *<br />ERROR at line 1:<br />ORA-00937: not a single-group group function<br />Fazendo o select abaixo temos quantas vezes o dept 41 se<br />repete.<br />SQL> select dept_id<br />  2  from   s_emp<br />  3  where  dept_id = 41;<br />  DEPT_ID<br />---------<br />       41<br />       41<br />       41<br />       41<br />Agora usando a função de grupo COUNT(*) que no caso esta<br />contando a quantidade de registros onde o dept_id é igual a<br />41 ou seja quantas vezes ele se repete, teremos o grupamento<br />feito. O que está no select deve estar no group by.<br />Vamos ao exemplo:<br />SQL> select dept_id, count(*) \"
number\"
<br />  2  from   s_emp<br />  3  where  dept_id = 41<br />  4  group by dept_id;<br />  DEPT_ID    number<br />--------- ---------<br />       41         436<br />Agora estamos contando quantos registros temos para cada<br />CREDIT_RATING da tabela s_customer.<br />SQL> select credit_rating,count(*) \"
# custo\"
<br />  2  from   s_customer<br />  3  group by credit_rating;<br />CREDIT_RA   # custo<br />--------- ---------<br />EXCELLENT         9<br />GOOD              3<br />POOR              3<br />No próximo exemplo é bom destacar o uso do NOT LIKE onde<br />determina que não seja trazido registros parecidos com uma<br />uma certa condição. Veja também o uso da função de grupo SUM<br />que trás a soma dos salários.<br />SQL> select title, sum(salary) soma_total<br />  2  from   s_emp<br />  3  where  title not like 'VP%'<br />  4  group by title<br />  5  order by<br />  6  sum(salary);<br />TITLE                     SOMA_TOTAL<br />------------------------- ----------<br />President                       2500<br />Warehouse Manager               6157<br />Sales Representative            7380<br />Stock Clerk                     9490<br />Um outro exemplo do uso de ORDER BY, onde estamos<br />grupando por Title.<br />SQL> select title,max(salary)<br />  2  from   s_emp<br />  3  group by title;<br />TITLE                     MAX(SALARY)<br />------------------------- -----------<br />President                        2500<br />Sales Representative             1525<br />Stock Clerk                      1400<br />VP, Administration               1550<br />VP, Finance                      145037<br />VP, Operations                   1450<br />VP, Sales                        1400<br />Warehouse Manager                1307<br />8 rows selected.<br />Nossa intenção no select abaixo é fazermos a média dos<br />salários dos campos da coluna SALARY da tabela s_emp, e<br />trazer a tela somente a média que der acima de 2000.<br />Não dá certo porque não usamos a clausula  where dentro do<br />group by mas sim  a função  HAVING, isso quando queremos<br />trazer dados a tela obedecendo uma certa condição.<br />SQL> SELECT DEPT_ID,AVG(SALARY)<br />  2  FROM S_EMP<br />  3  WHERE AVG(SALARY) > 2000<br />  4  GROUP BY DEPT_ID;<br />WHERE AVG(SALARY) > 2000<br />      *<br />ERROR at line 3:<br />ORA-00934: group function is not allowed here<br />Veja a maneira correta de se fazer o exercício anterior<br />onde usamos a função  HAVING  que se dá da seguinte forma ,<br />sempre após o group by.<br />SQL> SELECT DEPT_ID,AVG(SALARY)<br />  2  FROM S_EMP<br />  3  GROUP BY DEPT_ID<br />  4  HAVING AVG(SALARY) > 2000;<br />  DEPT_ID AVG(SALARY)<br />--------- -----------<br />       50        2025S<br />No exemplo abaixo estamos selecionando, contando e<br />separando  em grupos os departamentos isso pelo dept_id e<br />depois o title, perceba a seqüência do grupo.<br />SQL> select dept_id,title, count(*)<br />  2  from   s_emp<br />  3  group by dept_id,title;<br />  DEPT_ID TITLE                      COUNT(*)<br />--------- ------------------------- ---------38<br />       10 VP, Finance                       1<br />       31 Sales Representative              1<br />       31 VP, Sales                         1<br />       32 Sales Representative              1<br />       33 Sales Representative              1<br />       34 Sales Representative              1<br />       34 Stock Clerk                       1<br />       35 Sales Representative              1<br />       41 Stock Clerk                       2<br />       41 VP, Operations                    1<br />       41 Warehouse Manager                 1<br />       42 Stock Clerk                       2<br />       42 Warehouse Manager                 1<br />       43 Stock Clerk                       2<br />       43 Warehouse Manager                 1<br />       44 Stock Clerk                       1<br />       44 Warehouse Manager                 1<br />       45 Stock Clerk                       2<br />       45 Warehouse Manager                 1<br />       50 President                         1<br />       50 VP, Administration                1<br />21 rows selected.<br />Agora estamos grupando primeiro pelo title e depois pelo<br />dept_id, veja a diferença.<br />SQL> select title,dept_id, count(*)<br />  2  from   s_emp<br />  3  group by title,dept_id;<br />TITLE                       DEPT_ID  COUNT(*)<br />------------------------- --------- ---------<br />President                        50         1<br />Sales Representative             31         1<br />Sales Representative             32         1<br />Sales Representative             33         1<br />Sales Representative             34         1<br />Sales Representative             35         1<br />Stock Clerk                      34         1<br />Stock Clerk                      41         2<br />Stock Clerk                      42         2<br />Stock Clerk                      43         2<br />Stock Clerk                      44         1<br />Stock Clerk                      45         2<br />VP, Administration               50         139<br />VP, Finance                      10         1<br />VP, Operations                   41         1<br />VP, Sales                        31         1<br />Warehouse Manager                41         1<br />Warehouse Manager                42         1<br />Warehouse Manager                43         1<br />Warehouse Manager                44         1<br />Warehouse Manager                45         1<br />Observe o uso do HAVING em substituição a clausula<br />WHERE, além de outros SELECTS.<br />Quando quisermos trazer um registro que inicie por uma<br />letra qualquer temos podemos usamos o cmdo LIKE procedendo da<br />seguinte forma:<br />SQL>  select last_name, title<br />  1  from s_emp<br />  2 where last_name like 'V%'<br />LAST_NAME                 TITLE<br />------------------------- -------------------------<br />Velasquez                 President<br />No exemplo abaixo estamos fazendo a seleção de todos os<br />cargos de  funcionários existentes assim como contando seus<br />componentes  COUNT  e ainda trazendo as  suas respectivas<br />medias salariais usando a função AVG, multiplicadas por 12.<br />SQL> SELECT TITLE, 12 * AVG(SALARY) \"
 Salário Anual\"
,<br />  2  count(*) \"
 numero de funcionários\"
<br />  3  from s_emp<br />  4  group by title;<br />TITLE                   Salário Anual  numero de funcionários<br />President                  $30,000.00                       1<br />Sales Representative       $17,712.00                       5<br />Stock Clerk                $11,388.00                      10<br />VP, Administration         $18,600.00                       1<br />VP, Finance                $17,400.00                       1<br />VP, Operations             $17,400.00                       1<br />VP, Sales                  $16,800.00                       140<br />Warehouse Manager          $14,776.80                       5<br />8 rows selected.<br />Um pouco diferente do exemplo anterior o abaixo está<br />primeiramente  formatando a coluna Salário Anual para receber<br />valores após ter sido feito um select em  TITLE.  Estamos<br />multiplicando por 12 a soma da média dos salários feita pela<br />função  AVG, e então usamos a função  COUNT para contar o<br />numero de funcionários de s_emp grupados por  title e que<br />tenha no máximo 2 funcionários, olhando para o exemplo<br />anterior podemos entender melhor e também destacar que o<br />HAVING está fazendo a função de um WHERE dentro do GROUP BY.<br />Vamos ao Exemplo:<br />SQL> column \"
 Salário Anual\"
 FORMAT $99,999.99<br />SQL> SELECT TITLE, 12 * AVG(SALARY) \"
 Salário Anual\"
,<br />  2  count(*) \"
 numero de funcionários\"
<br />  3  from s_emp<br />  4  group by title<br />  5  having count(*) > 2;<br />TITLE                  Salário Anual  numero de funcionários<br />------------------------- -------------- --------------------<br />Sales Representative    $17,712.00                       5<br />Stock Clerk             $11,388.00                      10<br />Warehouse Manager       $14,776.80                       5<br />Mais um exemplo do uso do HAVING:<br />SQL> select title,sum(salary) soma<br />  2  from s_emp<br />  3  where title not like'VP%'<br />  4  group by title<br />  5  having sum(salary) > 5000<br />  6  order by sum(salary);<br />TITLE                          SOMA<br />------------------------- ---------<br />Warehouse Manager              6157<br />Sales Representative           7380<br />Stock Clerk                    9490<br />FIM DE CAPÍTULO41<br />Finalidade do capítulo é demostrar como criar GRANTS.<br />Para criar um novo usuário (isto é executado pelo DBA)<br />devemos proceder da seguinte forma,  \"
NOVO\"
 é o nome do<br />usuário e IDENTIFIED BY \"
tiger\"
 é sua senha.<br />SQL>  CREATE USER NOVO<br />  2  IDENTIFIED BY TIGER;<br />User created.<br />Agora após termos criado um novo usuário vamos dar-lhe<br />os seus GRANTS ou seja as permissões devidas<br />como,delete,update e etc, veja como se processa isto e veja<br />também a sintaxe:<br />SQL>  GRANT create table, create sequence, create view<br />  2  to NOVO;<br />Grant succeeded.<br />Criando uma  ROLE de privilégios para ser usada para<br />vários  usuários, uma  role é o conjunto de privilégios que<br />guardamos armazenados com a finalidade de proporcionar uma<br />facilitação de manuseio na hora de se conceder privilégios,<br />evitando a digitação de todos os privilégios, passando a ter<br />que digitar somente o nome da  role.  No exemplo, o nome da<br />ROLE é \"
manager\"
 e por enquanto não existe nenhum privilégio<br />dentro dela.<br />SQL> CREATE ROLE manager;<br />Role created.<br />Agora estamos definindo os privilégios para a ROLE \"
manager\"
,<br />que são: criar tabela e view. Observe como se processa isto:<br />SQL> GRANT create table, create view TO manager;<br />Grant succeeded.<br />Agora que nossa ROLE já tem os privilégios definidos, no<br />exemplo abaixo vou passá-la para algum usuário. No caso o<br />usuário \"
NOVO\"
 está recebendo os GRANTS da ROLE MANAGER, que<br />são somente criar tabela e view:42<br />SQL> GRANT MANAGER TO NOVO;<br />Grant succeeded<br />Como mudar a senha de um usuário: no caso estamos<br />mudando do user  novo que tinha como \"
senha\"
 ou seja<br />IDENTIFIED igual a TIGER passando a ser LION.<br />SQL> ALTER USER NOVO IDENTIFIED BY LION;<br />User altered.<br />Agora estamos dando um novo GRANT para o USER \"
NOVO\"
<br />referente a tabela s_emp, neste caso o GRANT é só de<br />consulta.<br />SQL> GRANT select<br />  2  ON s_emp<br />  3  TO novo;<br />Grant succeeded.<br />O exemplo abaixo mostra como adicionar um novo  GRANT  a<br />uma  ROLE, relacionado com colunas específicas de uma tabela<br />no caso s_dept e  atribuindo a permissão de  update para o<br />usuário \"
NOVO\"
 e para a ROLE \"
manager\"
.<br />SQL> GRANT update(name,region_id)<br />  2  ON    s_dept<br />  3  TO    novo,manager;<br />Grant succeeded.<br />Este exemplo mostra como dar GRANT para um USER em uma<br />tabela e este usuário ter permissão de passar este mesmo<br />GRANT para outros usuários.<br />SQL> GRANT select<br />  2  ON    s_emp<br />  3  TO    scott<br />  4  WITH  GRANT OPTION;<br />Grant succeeded.43<br />Agora estou tornando publico de todos o SELECT a tabela<br />S_DEPT referente ao usuário GUIMA, ou seja todos podem dar<br />select a tabela s_dept do usuário GUIMA.<br />SQL>  GRANT SELECT<br />  2  ON    GUIMA.S_DEPT<br />  3  TO    PUBLIC;<br />Grant succeeded.<br />Para sabermos quais privilégios nós possuímos podemos<br />acessar no DICIONÁRIO DE DADOS nas seguintes tabelas:<br /> ROLE_SYS_PRIVS<br /> ROLE_TAB_PRIVS<br /> USER_ROLE_PRIVS<br /> USER_TAB_PRIVS_MADE<br /> USER_TAB_PRIVS_RECD<br /> USER_COL_PRIVS_MADE<br /> USER_COL_PRIVS_RECD<br />Como ver as ROLES que eu tenho acesso:<br />SQL>  SELECT GRANTED_ROLE,OS_GRANTED<br />  2   FROM USER_ROLE_PRIVS<br />  3   WHERE USERNAME = 'GUIMA';<br />GRANTED_ROLE                   OS_<br />------------------------------ ---<br />CONNECT                        NO<br />DBA                            NO<br />MANAGER                        NO<br />Para tirar os privilégios de um USER procede-se da seguinte<br />forma:<br />SQL> REVOKE select<br />  2  ON s_emp<br />  3  FROM NOVO;<br />Revoke succeeded.44<br />No exemplo acima estamos tirando os privilégios de<br />select do USER “NOVO”.<br />Como criar sinônimo:<br />Criando um sinônimo para uma tabela: no caso está sendo<br />criado um sinônimo com o nome  \"
HXXH\"
 para a tabela s_dept<br />pertencente a  alice:<br />SQL> CREATE SYNONYM HXXH<br />     FOR       alice.s_dept;<br />Synonym created.<br />Agora estamos criando um sinônimo para uma VIEW, nossa<br />VIEW se chama dept_sum_vu e o nome do sinônimo criado é<br />d_sum:<br />SQL> create SYNONYM d_sum<br />  2  for   dept_sum_vu;<br />Synonym created.<br />Agora estamos criando um sinônimo publico, o nome dele é<br />\"
DDD\"
 e é referente a tabela s_dept de alice:<br />SQL> create public SYNONYM DDD<br />  2  FOR     alice.s_dept;<br />Synonym created.<br />Para dropar  um sinônimo é simples:<br />SQL> DROP SYNONYM d_sum;<br />Synonym dropped.<br />FIM DE CAPÍTULO45<br />Finalidade do Capítulo é Tratar Sobre INDEX  e JOIN e OUTER<br />JOIN:<br />INDEX:<br />Uma INDEX pode ser criada automaticamente(quando é criada<br />uma PK ou UK constraint em uma tabela) ou manualmente. Para<br />delatarmos uma INDEX temos que usar o cmdo DROP INDEX:<br />Vamos ao Exemplo:<br />SQL> DROP INDEX s_emp_last_name_idx;<br />Index dropped.<br />Para criar uma INDEX usa-se o cmdo CREATE INDEX:<br />Vamos ao Exemplo:<br />SQL> CREATE INDEX S_EMP_last_name_idx<br />  2  on           S_EMP(last_name);<br />Index created.<br />Para selecionar as INDEX de uma tabela faz-se um SELECT<br />na tabela USER_INDEXES e USER_IND_COLUMNS:<br />O uso do  JOIN:<br />Join é a ligação que fazemos entre duas tabelas na<br />pesquisa de dados, necessariamente deve existir em um join a<br />chave primaria fazendo relação com uma chave estrangeira,<br />esta é a condição e ligação.<br />No exemplo abaixo estamos selecionando o  last_name  e<br />dept_id  da tabela  s_emp e também selecionando a coluna  name<br />da tabela s_dept isto onde a coluna id de s_dept for igual a<br />coluna  dept_id de  s_emp, completando assim a condição do<br />JOIN.<br />Vamos ao exemplo:<br />SQL> SELECT S_EMP.LAST_NAME,S_EMP.DEPT_ID,S_DEPT.NAME<br />  2  FROM S_EMP,S_DEPT<br />  3  WHERE S_EMP.DEPT_ID = S_DEPT.ID;46<br />LAST_NAME                   DEPT_ID NAME<br />------------------------- --------- ---------------------<br />Velasquez                        50 Administration<br />Ngao                             41 Operations<br />Nagayama                         31 Sales<br />Quick-To-See                     10 Finance<br />Ropeburn                         50 Administration<br />Urguhart                         41 Operations<br />Menchu                           42 Operations<br />Biri                             43 Operations<br />Catchpole                        44 Operations<br />Havel                            45 Operations<br />Magee                            31 Sales<br />Giljum                           32 Sales<br />Sedeghi                          33 Sales<br />Nguyen                           34 Sales<br />Dumas                            35 Sales<br />Maduro                           41 Operations<br />Smith                            41 Operations<br />Nozaki                           42 Operations<br />Patel                            42 Operations<br />Newman                           43 Operations<br />Markarian                        43 Operations<br />No exemplo abaixo como no anterior temos a realização de um<br />JOIN.<br />Vamos ao exemplo.<br />SQL> SELECT S_DEPT.ID \"
 COD DO DEPT\"
,<br />  2  S_REGION.ID \"
COD DA REG\"
,<br />  3  S_REGION.NAME\"
NOME DA REGIÃO\"
<br />  4  FROM S_DEPT,S_REGION<br />  5  WHERE S_DEPT.REGION_ID = S_REGION.ID;<br /> COD DO DEPT COD DA REG NOME DA REGIÃO<br />------------ ---------- -------------------------<br />          10          1 North America<br />          31          1 North America<br />          32          2 South America<br />          33          3 Africa / Middle East<br />          34          4 Ásia<br />          35          5 Europe<br />          41          1 North America<br />          42          2 South America47<br />          43          3 Africa / Middle East<br />          44          4 Ásia<br />          45          5 Europe<br />          50          1 North America<br />12 rows selected.<br />No exemplo abaixo temos mais um exemplo de  join onde<br />temos o uso de apelidos para as tabelas manipuladas, é<br />importante observar como é usado o apelido  e como este tem<br />que ser referenciado no  FROM, no exemplo abaixo vemos o<br />apelido  de  \"
E\"
 para a tabela  S_EMP, de  \"
D\"
 para a tabela<br />S_DEPT. Outra característica importante no exemplo é o uso do<br />JOIN onde relacionamos as duas tabelas através da chave<br />estrangeira. O uso do  INITCAP serve para procurarmos o<br />registro que comece com a letra maiúscula<br />SQL> select E.last_name,E.dept_id,<br />  2  D.name<br />  3  from s_emp E,s_dept D<br />  4  where e.dept_id = D.id<br />  5  and initcap(E.last_name)='Menchu';<br />LAST_NAME                   DEPT_ID NAME<br />------------------------- --------- -------------------------<br />Menchu                           42 Operations<br />No exemplo abaixo temos a realização de dois JOINS, uso<br />do AND no exemplo abaixo proporciona a adição de mais de uma<br />condição ou seja além do  join entre  s_emp e  s_dept também<br />ocorre um Join entre s_region e s_dept proporcionado pelo uso<br />do  AND. Também está sendo usado um novo  AND colocando a<br />commission_pct da tabela s_emp > 0.<br />Vamos ao exemplo:<br />SQL>  select E.last_name,R.name,E.commission_pct<br />  2   from s_emp E, s_dept D, s_region R<br />  3  where E.dept_id = D.id<br />  4  and D.region_id = R.id<br />5 and E.commission_pct > 0;48<br />LAST_NAME        NAME                  COMMISSION_PCT<br />--------------------------------------- --------------<br />Magee           North America               10<br />Giljum          South America               12.5<br />Sedeghi         Africa / Middle East        10<br />Nguyen          Ásia                        15<br />Dumas           Europe                      17.5<br />No exemplo abaixo estamos mostrando um join que traz<br />todos os registros que satisfaçam a condição da clausula<br />where ou seja traz somente aquele que satisfação o  JOIN não<br />traz  os registros que contem espaços em branco, em função da<br />relação entre as duas tabelas no caso entre s_emp e<br />s_customer. Mas e se quisermos que pesquisar inclusive os<br />registros que não tem relacionamento, ou seja que estejam com<br />o espaço em branco? Para isso temos que acrescentarmos o<br />sinal de (+).<br />Vamos ao Exemplo:<br />SQL>  select e.last_name,e.id,c.name<br />  2   from s_emp e, s_customer c<br />  3   where e.id = c.sales_rep_id<br />  4   order by e.id;<br />LAST_NAME                 ID      NAME<br />---------------------- --------- ---------------------------<br />Magee                     11     Womansport<br />Magee                     11     Beisbol Si!<br />Magee                     11     Ojibway Retail<br />Magee                     11     Big John's Sports Emporium<br />Giljum                    12     Unisports<br />Giljum                    12     Futbol Sonora<br />Sedeghi                   13     Hamada Sport<br />Nguyen                    14     Simms Athletics<br />Nguyen                    14     Delhi Sports<br />Dumas                     15     Kam's Sporting Goods<br />Dumas                     15     Sportique<br />Dumas                     15     Sporta Russia<br />Dumas                     15     Kuhn's Sports<br />Dumas                     15     Muench Sports49<br />O  exemplo a seguir  é idêntico ao anterior  com a<br />diferença que está acrescido do sinal de  (+) para, mesmo<br />satisfazendo a clausula  where, traga os registros que não<br />tenham satisfeito a condição de relacionamento da clausula<br />where, no caso, estamos então fazendo um OUTER JOIN pegando o<br />LAST_NAME e o  ID da tabela  s_emp e o  NAME da tabela<br />s_customer onde o  id da tabela  s_emp corresponda ao<br />sales_rep_id dentro da tabela s_customer e com o sinal de (+)<br />traga  também os  NAME de  s_customer que não tenham relação<br />com s_emp.<br />SQL> select e.last_name,e.id,c.name<br />  2  from s_emp e, s_customer c<br />  3  where e.id (+) = c.sales_rep_id<br />  4  order by e.id;<br />LAST_NAME                        ID NAME<br />------------------------- --------- ------------------------<br />Magee                            11 Womansport<br />Magee                            11 Beisbol Si!<br />Magee                            11 Ojibway Retail<br />Magee                            11 Big John's Sports Empori<br />Giljum                           12 Unisports<br />Giljum                           12 Futbol Sonora<br />Sedeghi                          13 Hamada Sport<br />Nguyen                           14 Simms Athletics<br />Nguyen                           14 Delhi Sports<br />Dumas                            15 Kam's Sporting Goods<br />Dumas                            15 Sportique<br />Dumas                            15 Muench Sports<br />Dumas                            15 Sporta Russia<br />Dumas                            15 Kuhn's Sports<br />                                    Sweet Rock Sports<br />15 rows selected.<br />FINAL DE CAPÍTULO50<br />Finalidade do capítulo é mostrar o uso do BETWEEN.<br /> No exemplo a seguir estamos selecionando as colunas<br />ename,job,sal da tabela EMP e a coluna GRADE da tabela<br />SALGRADE, onde através do comando BETWEEN AND ocorre uma<br />pesquisa na tabela SALGRADE nas colunas LOSAL e HISAL onde<br />comparamos seus valores com os  valores dos campos da coluna<br />SAL de EMP trazendo somente aqueles valores que estejam entre<br />os de LOSAL e HISAL. No exemplo não ocorre um JOIN mas uma<br />simples pesquisa em uma outra tabela para que seja efetuada<br />uma comparação.<br />SQL> select e.ename,e.job,e.sal,s.grade<br />  2   from emp e, salgrade s<br />  3   where e.sal between s.losal and s.hisal<br />ENAME      JOB             SAL     GRADE<br />---------- --------- --------- ---------<br />SMITH      CLERK           800         1<br />ADAMS      CLERK          1100         1<br />JAMES      CLERK           950         1<br />WARD       SALESMAN       1250         2<br />MARTIN     SALESMAN       1250         2<br />MILLER     CLERK          1300         2<br />ALLEN      SALESMAN       1600         3<br />TURNER     SALESMAN       1500         3<br />JONES      MANAGER        2975         4<br />BLAKE      MANAGER        2850         4<br />CLARK      MANAGER        2450         4<br />SCOTT      ANALYST        3000         4<br />FORD       ANALYST        3000         4<br />KING       PRESIDENT      5000         5<br />14 rows selected.<br />FINAL DE CAPÍTULO51<br />Finalidade do capítulo é mostrar o uso do ORDER BY.<br />O exemplo abaixo mostra como usar o comando order by,<br />onde no caso estamos ordenando a tabela s_emp pelo o<br />last_name, é bom lembrar que sempre o comando order by vem<br />por último na função sql.<br />Vamos ao exemplo:<br />SELECT LAST_NAME, DEPT_ID,START_DATE<br />FROM S_EMP<br />ORDER BY LAST_NAME<br />LAST_NAME                   DEPT_ID START_DAT<br />------------------------- --------- ---------<br />Biri                             43 07-APR-90<br />Catchpole                        44 09-FEB-92<br />Chang                            44 30-NOV-90<br />Dancs                            45 17-MAR-91<br />Dumas                            35 09-OCT-91<br />Giljum                           32 18-JAN-92<br />Havel                            45 27-FEB-91<br />Maduro                           41 07-FEB-92<br />Magee                            31 14-MAY-90<br />Markarian                        43 26-MAY-91<br />Menchu                           42 14-MAY-90<br />Nagayama                         31 17-JUN-91<br />Newman                           43 21-JUL-91<br />Ngao                             41 08-MAR-90<br />Nguyen                           34 22-JAN-92<br />Nozaki                           42 09-FEB-91<br />Patel                            42 06-AUG-91<br />Patel                            34 17-OCT-90<br />Quick-To-See                     10 07-APR-90<br />Ropeburn                         50 04-MAR-90<br />Schwartz                         45 09-MAY-91<br />LAST_NAME                   DEPT_ID START_DAT<br />------------------------- --------- ---------<br />Sedeghi                          33 18-FEB-91<br />Smith                            41 08-MAR-90<br />Urguhart                         41 18-JAN-91<br />Velasquez                        50 03-MAR-90<br />25 rows selected.52<br />No comando sql order by temos a função desc que vem com<br />a finalidade de colocar os dados dentro da coluna em ordem<br />decrescente. No exemplo a seguir estamos colocando por ordem<br />decrescente a coluna start_date da tabela s_emp.<br />SQL> SELECT LAST_NAME, DEPT_ID,START_DATE<br />  2  FROM S_EMP<br />  3  ORDER BY START_DATE DESC;<br />LAST_NAME                   DEPT_ID START_DAT<br />------------------------- --------- ---------<br />Catchpole                        44 09-FEB-92<br />Maduro                           41 07-FEB-92<br />Nguyen                           34 22-JAN-92<br />Giljum                           32 18-JAN-92<br />Dumas                            35 09-OCT-91<br />Patel                            42 06-AUG-91<br />Newman                           43 21-JUL-91<br />Nagayama                         31 17-JUN-91<br />Markarian                        43 26-MAY-91<br />Schwartz                         45 09-MAY-91<br />Dancs                            45 17-MAR-91<br />Havel                            45 27-FEB-91<br />Sedeghi                          33 18-FEB-91<br />Nozaki                           42 09-FEB-91<br />Urguhart                         41 18-JAN-91<br />Chang                            44 30-NOV-90<br />Patel                            34 17-OCT-90<br />Menchu                           42 14-MAY-90<br />Magee                            31 14-MAY-90<br />Quick-To-See                     10 07-APR-90<br />Biri                             43 07-APR-90<br />LAST_NAME                   DEPT_ID START_DAT<br />------------------------- --------- ---------<br />Ngao                             41 08-MAR-90<br />Smith                            41 08-MAR-90<br />Ropeburn                         50 04-MAR-90<br />Velasquez                        50 03-MAR-90<br />25 rows selected.53<br />Agora  vamos mostrar os dados  do resultado do mesmo<br />select anterior sem o uso da função  desc para o  order by,<br />observe a diferença da ordenação em relação as datas.<br />SQL> SELECT LAST_NAME, DEPT_ID,START_DATE<br />  2  FROM S_EMP<br />  3  ORDER BY START_DATE;<br />LAST_NAME                   DEPT_ID START_DAT<br />------------------------- --------- ---------<br />Velasquez                        50 03-MAR-90<br />Ropeburn                         50 04-MAR-90<br />Ngao                             41 08-MAR-90<br />Smith                            41 08-MAR-90<br />Quick-To-See                     10 07-APR-90<br />Biri                             43 07-APR-90<br />Menchu                           42 14-MAY-90<br />Magee                            31 14-MAY-90<br />Patel                            34 17-OCT-90<br />Chang                            44 30-NOV-90<br />Urguhart                         41 18-JAN-91<br />Nozaki                           42 09-FEB-91<br />Sedeghi                          33 18-FEB-91<br />Havel                            45 27-FEB-91<br />Dancs                            45 17-MAR-91<br />Schwartz                         45 09-MAY-91<br />Markarian                        43 26-MAY-91<br />Nagayama                         31 17-JUN-91<br />Newman                           43 21-JUL-91<br />Patel                            42 06-AUG-91<br />Dumas                            35 09-OCT-91<br />LAST_NAME                   DEPT_ID START_DAT<br />------------------------- --------- ---------<br />Giljum                           32 18-JAN-92<br />Nguyen                           34 22-JAN-92<br />Maduro                           41 07-FEB-92<br />Catchpole                        44 09-FEB-92<br />25 rows selected.54<br />O exemplo seguinte mostra como usar a posição da coluna<br />dentro do comando sql para  definir a ordenação dos registros<br />por aquela coluna, no caso abaixo estamos ordenando nossos<br />dados pela coluna numero 4 que corresponde a START_DATE de<br />S_EMP.<br />Vamos ao exemplo:<br />SQL> SELECT ID,LAST_NAME,FIRST_NAME,START_DATE<br />  2  MANAGER_ID, SALARY<br />  3  FROM S_EMP<br />  4  ORDER BY 4;<br />ID LAST_NAME  FIRST_NAME     MANAGER_I    SALARY<br />-------------- ------------------------- --------- ---------<br />1 Velasquez    Carmen         03-MAR-90      2500<br />5 Ropeburn     Audry          04-MAR-90      1550<br />2 Ngao        LaDoris         08-MAR-90      1450<br />17 Smith      George          08-MAR-90       940<br />4 Quick-To-See Mark           07-APR-90      1450<br />8 Biri         Ben            07-APR-90      1100<br />7 Menchu       Roberta        14-MAY-90      1250<br />11 Magee       Colin          14-MAY-90      1400<br />23 Patel       Radha          17-OCT-90       795<br />22 Chang       Eddie          30-NOV-90       800<br />6 Urguhart     Molly          18-JAN-91      1200<br />18 Nozaki      Akira          09-FEB-91      1200<br />9 Catchpole    Antoinette     09-FEB-92      1300<br />25 rows selected.<br />Agora além de ordenar pela coluna numero 4 estamos<br />também colocando em ordem decrescente usando para isto o cmdo<br />desc.<br />SQL>  SELECT ID,LAST_NAME,FIRST_NAME,START_DATE<br />  2   MANAGER_ID, SALARY<br />  3   FROM S_EMP<br />  4   ORDER BY 4 DESC;<br />ID LAST_NAME    FIRST_NAME     MANAGER_I    SALARY<br />-------- ------------------------- --------- ---------<br />9 Catchpole      Antoinette     09-FEB-92      1300<br />16 Maduro        Elena          07-FEB-92      1400<br />14 Nguyen        Mai            22-JAN-92      1525<br />12 Giljum        Henry          18-JAN-92      149055<br />No próximo  exemplo o comando order by esta agrupando<br />por departamento com o  dept_id e depois  por salário (dentro<br />do grupo departamento) podemos constatar a melhor verificação<br />do exemplo no departamento 41 onde o salário vem por ordem<br />decrescente.<br />SQL> SELECT LAST_NAME,DEPT_ID,SALARY<br />  2  FROM S_EMP<br />  3  ORDER BY DEPT_ID,SALARY DESC;<br />LAST_NAME                   DEPT_ID    SALARY<br />------------------------- --------- ---------<br />Quick-To-See                     10      1450<br />Nagayama                         31      1400<br />Magee                            31      1400<br />Giljum                           32      1490<br />Sedeghi                          33      1515<br />Nguyen                           34      1525<br />Patel                            34       795<br />Dumas                            35      1450<br />Ngao                             41      1450<br />Maduro                           41      1400<br />Urguhart                         41      1200<br />Smith                            41       940<br />Menchu                           42      1250<br />Nozaki                           42      1200<br />Patel                            42       795<br />Biri                             43      1100<br />Markarian                        43       850<br />Newman                           43       750<br />Catchpole                        44      1300<br />Chang                            44       800<br />Havel                            45      1307<br />LAST_NAME                   DEPT_ID    SALARY<br />------------------------- --------- ---------<br />Schwartz                         45      1100<br />Dancs                            45       860<br />Velasquez                        50      2500<br />Ropeburn                         50      1550<br />25 rows selected.<br />Observação: se colocarmos duas ordenações incompatíveis<br />de execução, o sql irá reconhecer a primeira da seqüência,<br />observe que o exemplo abaixo mostra claramente isto. Observe<br />também o departamento 41, onde o sql ordena primeiro por56<br />departamento e depois por nome (last_name) e despreza a<br />coluna salary porque dentro da prioridade ela é a última.<br />SQL> SELECT LAST_NAME,DEPT_ID,SALARY<br />  2  FROM S_EMP<br />  3  ORDER BY DEPT_ID, LAST_NAME, SALARY DESC;<br />LAST_NAME                   DEPT_ID    SALARY<br />------------------------- --------- ---------<br />Quick-To-See                     10      1450<br />Magee                            31      1400<br />Nagayama                         31      1400<br />Giljum                           32      1490<br />Sedeghi                          33      1515<br />Nguyen                           34      1525<br />Patel                            34       795<br />Dumas                            35      1450<br />Maduro                           41      1400<br />Ngao                             41      1450<br />Smith                            41       940<br />Urguhart                         41      1200<br />Menchu                           42      1250<br />Nozaki                           42      1200<br />Patel                            42       795<br />Biri                             43      1100<br />Markarian                        43       850<br />Newman                           43       750<br />Catchpole                        44      1300<br />Chang                            44       800<br />Dancs                            45       860<br />LAST_NAME                   DEPT_ID    SALARY<br />------------------------- --------- ---------<br />Havel                            45      1307<br />Schwartz                         45      1100<br />Ropeburn                         50      1550<br />Velasquez                        50      2500<br />25 rows selected.<br />FINAL DE CAPÍTULO57<br />Finalidade do capítulo é mostrar o uso do LENGTH e<br />também como concatenar.<br />O uso do  length: serve par contar a quantidade de<br />espaços, incluindo caracteres que um determinado registro<br />ocupa.<br />O uso do \"
substr\"
 : serve para localizar de forma física<br />determinadas posições de um determinado registro.<br />No exemplo abaixo vemos como que o cmdo \"
substr\"
 ajuda a<br />encontrarmos determinadas posições dentro de uma clausula<br />where.<br />SQL> SELECT name, LENGTH(name)<br />  2  FROM S_PRODUCT<br />  3  WHERE SUBSTR(NAME,1,5) = 'Black';<br />NAME                 LENGTH(NAME)<br />-------------------- ------------<br />Black Hawk Knee Pads      20<br />Black Hawk Elbow Pads     21<br />Concatenando colunas distantes usando o CONCAT, observe<br />que estamos concatenado duas colunas e jogando-as dentro de<br />uma mesma coluna:<br />SQL> SELECT CONCAT(NAME,COUNTRY) CLIENTE<br />  2  FROM S_CUSTOMER<br />  3  WHERE UPPER (CREDIT_RATING) = 'GOOD'<br />  4  ;<br />CLIENTE<br />---------------------------------------------------<br />Delhi SportsIndia<br />Sweet Rock SportsNigeria<br />Muench SportsGermany<br />FINAL DE CAPÍTULO58<br />Finalidade do capítulo é mostrar algumas manipulações<br />com datas:<br />No próximo exemplo vemos o uso do sysdate que<br />corresponde a data do sistema, que está sendo subtraído pela<br />coluna start_date e dividido por 7 para verificar quantas<br />semanas existem  entre a data do start_date e sysdate isto<br />referente ao departamento 43.<br />SQL> SELECT LAST_NAME, (SYSDATE-START_DATE)/7 SEMANAS<br />  2  FROM S_EMP<br />  3  WHERE DEPT_ID = 43;<br />LAST_NAME                   SEMANAS<br />------------------------- ---------<br />Biri                       397.5229<br />Newman                    330.38004<br />Markarian                 338.38004<br />O exemplo seguinte deveria mostrar em  tenure  a<br />quantidade de meses existentes entre  sysdate e  start_date  e<br />depois usando o comdo  \"
add_months\"
 mostrar em  review a data<br />correspondente a 6 meses a mais de start_date, mas não mostra<br />porque não satisfaz a clausula  where pois pede que traga os<br />dados entre o  sysdate e o  start_date em 48 meses, coisa que<br />não existe:<br /> Vamos ao Exemplo:<br />SQL> SELECT ID,START_DATE,<br />  2  MONTHS_BETWEEN( SYSDATE-START_DATE) TENURE,<br />  3  ADD_MONTHS(START_DATE,6) REVIEW<br />  4  FROM S_EMP<br />  5  WHERE MONTHS_BETWEEN (SYSDATE,START_DATE)<48;<br />no rows selected<br />Agora no exemplo abaixo, satisfazendo a clausula where da<br />quantidade de meses na função between podemos ver na coluna<br />tenure a quantidade de meses entre o sysdate e start_date e<br />em rewiew mostra o start_date acrescido de 6 meses.59<br />Vamos ao Exemplo:<br />SQL> SELECT ID,START_DATE,<br />  2  MONTHS_BETWEEN(SYSDATE,START_DATE) TENURE,<br />  3  ADD_MONTHS(START_DATE,6) REVIEW<br />  4  FROM S_EMP<br />  5  WHERE MONTHS_BETWEEN (SYSDATE,START_DATE)<72;<br />       ID START_DAT    TENURE REVIEW<br />--------- --------- --------- ---------<br />        9 09-FEB-92 69.311978 09-AUG-92<br />       12 18-JAN-92        70 18-JUL-92<br />       14 22-JAN-92 69.892624 22-JUL-92<br />       16 07-FEB-92 69.376495 07-AUG-92<br />Uma nova versão do exemplo anterior:<br />SQL> SELECT ID,START_DATE,<br />  2  MONTHS_BETWEEN(SYSDATE,START_DATE) TENURE,<br />  3  ADD_MONTHS(START_DATE,6) REVIEW<br />  4  FROM S_EMP<br />  5  WHERE MONTHS_BETWEEN (SYSDATE,START_DATE)<84;<br />       ID START_DAT    TENURE REVIEW<br />--------- --------- --------- ---------<br />        3 17-JUN-91 77.054026 17-DEC-91<br />        6 18-JAN-91        82 18-JUL-91<br />        9 09-FEB-92  69.31209 09-AUG-92<br />       10 27-FEB-91 80.731445 27-AUG-91<br />       12 18-JAN-92        70 18-JUL-92<br />       13 18-FEB-91        81 18-AUG-91<br />       14 22-JAN-92 69.892736 22-JUL-92<br />       15 09-OCT-91  73.31209 09-APR-92<br />       16 07-FEB-92 69.376607 07-AUG-92<br />       18 09-FEB-91  81.31209 09-AUG-91<br />       19 06-AUG-91 75.408865 06-FEB-92<br />       20 21-JUL-91 75.924994 21-JAN-92<br />       21 26-MAY-91 77.763703 26-NOV-91<br />       22 30-NOV-90 83.634671 31-MAY-91<br />       24 17-MAR-91 80.054026 17-SEP-91<br />       25 09-MAY-91  78.31209 09-NOV-91<br />16 rows selected.60<br />A função trunc e round:<br />O exemplo abaixo mostra como usar a função round com a<br />seguinte característica:<br />O round respeita o dia dos meses, se for maior que 15<br />arredonda para o inicio do próximo mês, se não for vai para o<br />inicio do mês que se encontra.<br />O comando trunc trunca sempre para o inicio do mês que<br />se encontra.<br />Vamos ao Exemplo:<br />SQL> SELECT ID,START_DATE,<br />  2  ROUND(START_DATE,'MONTH'),<br />  3  TRUNC(START_DATE,'MONTH')<br />  4  FROM S_EMP<br />  5  WHERE START_DATE LIKE '%91';<br />       ID START_DAT ROUND(STA TRUNC(STA<br />--------- --------- --------- ---------<br />        3 17-JUN-91 01-JUL-91 01-JUN-91<br />        6 18-JAN-91 01-FEB-91 01-JAN-91<br />       10 27-FEB-91 01-MAR-91 01-FEB-91<br />       13 18-FEB-91 01-MAR-91 01-FEB-91<br />       15 09-OCT-91 01-OCT-91 01-OCT-91<br />       18 09-FEB-91 01-FEB-91 01-FEB-91<br />       19 06-AUG-91 01-AUG-91 01-AUG-91<br />       20 21-JUL-91 01-AUG-91 01-JUL-91<br />       21 26-MAY-91 01-JUN-91 01-MAY-91<br />       24 17-MAR-91 01-APR-91 01-MAR-91<br />       25 09-MAY-91 01-MAY-91 01-MAY-91<br />11 rows selected.<br />FINAL DE CAPÍTULO. Finalidade do capítulo é o uso<br />da função MOD.<br />A função mod traz o resto de uma divisão. Neste exemplo<br />temos uma seleção de registros dentro da tabela s_emp onde o<br />salário é maior que 1400.<br />SQL> select LAST_NAME,MOD(SALARY,COMMISSION_PCT)<br />  2  FROM S_EMP<br />  3  WHERE SALARY>1400;<br />LAST_NAME                 MOD(SALARY,COMMISSION_PCT)<br />------------------------- --------------------------61<br />Velasquez<br />Ngao<br />Quick-To-See<br />Ropeburn<br />Giljum                                           2.5<br />Sedeghi                                            5<br />Nguyen                                            10<br />Dumas                                             15<br />8 rows selected.<br />Agora neste exemplo temos a seleção de todos os<br />registros onde o salário é maior que 1400 e também possui<br />comissão nula.<br />SQL> select LAST_NAME,MOD(SALARY,COMMISSION_PCT)<br />  2  FROM S_EMP<br />  3  WHERE SALARY>1400<br />  4  and commission_pct is null;<br />LAST_NAME                 MOD(SALARY,COMMISSION_PCT)<br />------------------------- --------------------------<br />Velasquez<br />Ngao<br />Quick-To-See<br />Ropeburn<br />Neste exemplo temos somente aqueles que ganham mais de<br />1400 e possui comissão.<br />SQL> select LAST_NAME,MOD(SALARY,COMMISSION_PCT)<br />  2  FROM S_EMP<br />  3  WHERE SALARY>1400<br />  4  and commission_pct is not null;<br />LAST_NAME                 MOD(SALARY,COMMISSION_PCT)<br />------------------------- --------------------------<br />Giljum                                           2.5<br />Sedeghi                                            5<br />Nguyen                                            10<br />Dumas                                             15<br />FINAL DE CAPÍTULO62<br />Finalidade do capítulo é fazer arredondamentos de<br />valores usando \"
ROUND\"
 e o \"
TRUNC\"
.<br />Vamos ao Exemplo:<br />SQL> select round(45.923,2), round(45.923,0),<br />  2  round(45.923,-1)<br />  3  from sys.dual;<br />ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923,-1)<br />--------------- --------------- ----------------<br />          45.92              46               50<br />SQL> select trunc(45.923,2),trunc(45.923,0),<br />trunc(45.923,-1)<br />from sys.dual<br />TRUNC(45.923,2) TRUNC(45.923,0) TRUNC(45.923,-1)<br />--------------- --------------- ----------------<br />          45.92              45               40<br />FINAL DE CAPÍTULO63<br />Finalidade do capítulo é tratar o uso do SELECT,NVL,DISTINCT.<br />O comando SELECT usado no exemplo abaixo é básico, pois<br />serve para selecionar todas as linhas da tabela s_dept, não<br />fazendo neste caso nenhuma distinção.<br /> SQL> select * from s_dept;<br />       ID NAME                      REGION_ID<br />--------- ------------------------- ---------<br />       10 Finance                           1<br />       31 Sales                             1<br />       32 Sales                             2<br />       33 Sales                             3<br />       34 Sales                             4<br />       35 Sales                             5<br />       41 Operations                        1<br />       42 Operations                        2<br />       43 Operations                        3<br />       44 Operations                        4<br />       45 Operations                        5<br />       50 Administration                    1<br />12 rows selected.<br />Agora o comando select é usado para trazer valores de colunas<br />especificas onde o nome das colunas vem entre vírgulas. A<br />tabela s_dept tem como colunas, id,name e region_id, mas<br />neste caso só está sendo trazido id e regiao_id.<br />Vamos ao Exemplo:<br />SQL>  select ID,REGION_ID FROM S_DEPT;<br />       ID REGION_ID<br />--------- ---------<br />       10         1<br />       31         1<br />       32         2<br />       33         3<br />       34         4<br />       35         5<br />       41         1<br />       42         2<br />       43         3<br />       44         464<br />       45         5<br />       50         1<br />12 rows selected.<br />No exemplo abaixo estamos mostrando como trazer campos<br />distintos de uma determinada tabela, ou seja campos que não<br />se repetem. Na coluna name tem vários campos repetidos, veja<br />no exemplo:<br />SQL> SELECT NAME FROM S_DEPT;<br />NAME<br />-------------------------<br />Finance<br />Sales<br />Sales<br />Sales<br />Sales<br />Sales<br />Operations<br />Operations<br />Operations<br />Operations<br />Operations<br />Administration<br />12 rows selected.<br />Agora usando o comando distinct na coluna name da tabela<br />s_dept poderemos obter nomes distintos, sem valor repetido<br />para a coluna name de s_dept.<br />Vamos ao Exemplo:<br />SQL> SELECT DISTINCT NAME FROM S_DEPT;<br />NAME<br />-------------------------<br />Administration<br />Finance<br />Operations<br />Sales65<br />Agora podemos ver como separar em grupos sem repetição<br />os nomes por região, os nomes aparecem conforme existam nas<br />regiões e as regiões que aparecem conforme tenham nomes.<br />SQL>  SELECT DISTINCT NAME,REGION_ID<br />  2  FROM S_DEPT;<br />NAME                      REGION_ID<br />------------------------- ---------<br />Administration                    1<br />Finance                           1<br />Operations                        1<br />Operations                        2<br />Operations                        3<br />Operations                        4<br />Operations                        5<br />Sales                             1<br />Sales                             2<br />Sales                             3<br />Sales                             4<br />Sales                             5<br />12 rows selected.<br />A função  select permite que seja feito expressões<br />aritméticas manipulando os valores de seus campos. No exemplo<br />abaixo os valores da coluna salary, estão sendo multiplicados<br />por 12 e assumem seus novos valores na própria coluna.<br />SQL> SELECT LAST_NAME,SALARY * 12 FROM<br />S_EMP;<br />Exemplo de expressão:<br />SQL>  select id,last_name,round(salary+(salary*15/10<br />  2  ),0) \"
 NOVO SALÁRIO\"
 FROM S_EMP;<br />       ID LAST_NAME                  NOVO SALÁRIO<br />--------- ------------------------- -------------<br />        1 Velasquez                          2875<br />        2 Ngao                               1668<br />        3 Nagayama                           1610<br />        4 Quick-To-See                       1668<br />        5 Ropeburn                           1783<br />        6 Urguhart                           138066<br />        7 Menchu                             1438<br />        8 Biri                               1265<br />        9 Catchpole                          1495<br />       10 Havel                              1503<br />       11 Magee                              1610<br />       12 Giljum                             1714<br />       13 Sedeghi                            1742<br />       14 Nguyen                             1754<br />       15 Dumas                              1668<br />       16 Maduro                             1610<br />       17 Smith                              1081<br />       18 Nozaki                             1380<br />       19 Patel                               914<br />       20 Newman                              863<br />       21 Markarian                           978<br />       ID LAST_NAME                  NOVO SALÁRIO<br />--------- ------------------------- -------------<br />       22 Chang                               920<br />       23 Patel                               914<br />       24 Dancs                               989<br />       25 Schwartz                           1265<br />25 rows selected.<br />No  exemplo abaixo temos o uso da função nvl, que tem a<br />finalidade de trazer campos que tem valores nulos atribuindo<br />- lhes o valor zero.<br />Vamos ao Exemplo:<br />SQL> SELECT LAST_NAME, TITLE,  2  SALARY*COMMISSION_PCT/100<br />COMISSAO<br />  3  FROM S_EMP;<br />LAST_NAME                 TITLE                      COMISSAO<br />------------------------- ------------------------- ---------<br />Velasquez                 President<br />Ngao                      VP, Operations<br />Nagayama                  VP, Sales<br />Quick-To-See              VP, Finance<br />Ropeburn                  VP, Administration<br />Urguhart                  Warehouse Manager<br />Menchu                    Warehouse Manager<br />Biri                      Warehouse Manager<br />Catchpole                 Warehouse Manager<br />Havel                     Warehouse Manager<br />Magee                     Sales Representative            14067<br />Giljum                    Sales Representative         186.25<br />Sedeghi                   Sales Representative          151.5<br />Nguyen                    Sales Representative         228.75<br />Dumas                     Sales Representative         253.75<br />Maduro                    Stock Clerk<br />Smith                     Stock Clerk<br />Nozaki                    Stock Clerk<br />Patel                     Stock Clerk<br />Newman                    Stock Clerk<br />Markarian                 Stock Clerk<br />LAST_NAME                 TITLE                      COMISSAO<br />------------------------- ------------------------- ---------<br />Chang                     Stock Clerk<br />Patel                     Stock Clerk<br />Dancs                     Stock Clerk<br />Schwartz                  Stock Clerk<br />25 rows selected.<br />Observe que no exemplo anterior os campos com valores<br />nulos vieram em branco veja agora que usando a função nvl<br />apareceu o valor zero nos campos nulos.<br />SQL> SELECT LAST_NAME, TITLE,<br />  2  SALARY*NVL(COMMISSION_PCT,0)/100 COMISSAO<br />  3  FROM S_EMP;<br />LAST_NAME                 TITLE                      COMISSAO<br />------------------------- ------------------------- ---------<br />Velasquez                 President                         0<br />Ngao                      VP, Operations                    0<br />Nagayama                  VP, Sales                         0<br />Quick-To-See              VP, Finance                       0<br />Ropeburn                  VP, Administration                0<br />Urguhart                  Warehouse Manager                 0<br />Menchu                    Warehouse Manager                 0<br />Biri                      Warehouse Manager                 0<br />Catchpole                 Warehouse Manager                 0<br />Havel                     Warehouse Manager                 0<br />Magee                     Sales Representative            140<br />Giljum                    Sales Representative         186.25<br />Sedeghi                   Sales Representative          151.5<br />Nguyen                    Sales Representative         228.75<br />Dumas                     Sales Representative         253.7568<br />Maduro                    Stock Clerk                       0<br />Smith                     Stock Clerk                       0<br />Nozaki                    Stock Clerk                       0<br />Patel                     Stock Clerk                       0<br />Newman                    Stock Clerk                       0<br />Markarian                 Stock Clerk                       0<br />LAST_NAME                 TITLE                      COMISSAO<br />------------------------- ------------------------- ---------<br />Chang                     Stock Clerk                       0<br />Patel                     Stock Clerk                       0<br />Dancs                     Stock Clerk                       0<br />Schwartz                  Stock Clerk                       0<br />25 rows selected.<br />/<br />Um exemplo de SELECT com várias funções:<br />O comando  lower serve para transformarmos os dados de<br />pesquisa em letra minúscula, o cmdo  initcap serve para<br />converter a primeira letra em maiúscula e o cmdo upper serve<br />para converter em maiúsculo, no exemplo abaixo estamos<br />fazendo primeiro uma concatenação e depois usando a clausula<br />where para trazermos os registros que tem como inicial as<br />letras vp, com o  cmdo like.<br />Vamos ao Exemplo:<br />SELECT LOWER(FIRST_NAME||' '||LAST_NAME) VP,<br />INITCAP(userid)USERID,<br />UPPER (TITLE) TITLE<br />FROM S_EMP<br />WHERE TITLE LIKE 'VP%'<br />VP                                                  USERID<br />TITLE<br />--------------------------------------------------- --------<br />--------------------<br />ladoris ngao                                        Lngao<br />VP, OPERATIONS<br />midori nagayama                                     Mnagayam<br />VP, SALES69<br />mark quick-to-see                                   Mquickto<br />VP, FINANCE<br />audry ropeburn                                      Aropebur<br />VP, ADMINISTRATION<br /> Observe no exemplo abaixo que não foi realizada a<br />pesquisa porque o dado da tabela não corresponde ao formato<br />pedido.<br />SQL> SELECT FIRST_NAME,LAST_NAME<br />  2  FROM S_EMP<br />  3  WHERE LAST_NAME = 'PATEL';<br />no rows selected<br />Agora usando o cmdo \"
 lower \"
 fazemos a conversão, para<br />a pesquisa , para letra minúscula possibilitando assim o<br />sucesso da execução do exemplo anterior:<br />SQL>  SELECT FIRST_NAME,LAST_NAME<br />  2   FROM S_EMP<br />  3   WHERE LOWER(LAST_NAME) = 'patel';<br />FIRST_NAME                LAST_NAME<br />------------------------- -------------------<br />Vikram                    Patel<br />Radha                     Patel<br />Agora usamos o cmdo \"
upper\"
 para fazermos a conversão<br />para maiúscula.<br />SQL> SELECT FIRST_NAME,LAST_NAME<br />  2  FROM S_EMP<br />  3  WHERE UPPER (LAST_NAME) = 'PATEL';<br />FIRST_NAME                LAST_NAME<br />------------------------- -------------------<br />Vikram                    Patel<br />Radha                     Patel<br />FINAL DE CAPÍTULO70<br />Finalidade do capítulo é tratar sobre SELF JOINS.<br />O SELF JOINS é definido por  um alto relacionamento<br />,podemos descrever o exemplo abaixo da seguinte forma: todos<br />os EMP da tabela S_EMP possuem uma coluna ID  e uma coluna<br />MANAGER_ID, portanto queremos saber quem é o gerente de cada<br />funcionário, para isso verificamos o MANAGER_ID que contem um<br />valor correspondente ao ID de EMP e então a partir do valor<br />de MANAGER_ID descobrimos quem é o gerente do EMP. No exemplo<br />abaixo é bom verificar a concatenação.<br />Vamos ao exemplo:<br />SQL> select worker.last_name|| ' trabalha para ' ||<br />  2  manager.last_name<br />  3  from   s_emp worker, s_emp manager<br />  4  where worker.manager_id = manager.id;<br />WORKER.LAST_NAME||'TRABALHAPARA'||MANAGER.LAST_NAME<br />-------------------------------------------------------<br />Ngao trabalha para Velasquez<br />Nagayama trabalha para Velasquez<br />Quick-To-See trabalha para Velasquez<br />Ropeburn trabalha para Velasquez<br />Urguhart trabalha para Ngao<br />Menchu trabalha para Ngao<br />Biri trabalha para Ngao<br />Catchpole trabalha para Ngao<br />Havel trabalha para Ngao<br />Magee trabalha para Nagayama<br />Giljum trabalha para Nagayama<br />Sedeghi trabalha para Nagayama<br />Nguyen trabalha para Nagayama<br />Dumas trabalha para Nagayama<br />Maduro trabalha para Urguhart<br />Smith trabalha para Urguhart<br />Nozaki trabalha para Menchu<br />Patel trabalha para Menchu<br />Newman trabalha para Biri<br />Markarian trabalha para Biri<br />Chang trabalha para Catchpole<br />Schwartz trabalha para Havel<br />24 rows selected.<br />FINAL DE CAPÍTULO71<br />Finalidade do capítulo é tratar sobre SEQUENCE.<br />Para ver se existe uma sequence selecionamos o objeto no<br />select object_name colocando a clausula where com o<br />objeto_type igual a sequence.<br /> SQL>  SELECT OBJECT_name from user_objects<br />  2   where object_type = 'SEQUENCE';<br />OBJECT_NAME<br />-------------------------------------------<br />S_CUSTOMER_ID<br />S_DEPART_ID<br />S_DEPT_ID<br />S_DEPT_ID_SEQ<br />S_EMP_ID<br />S_IMAGE_ID<br />S_LONGTEXT_ID<br />S_ORD_ID<br />S_PRODUCT_ID<br />S_REGION_ID<br />S_WAREHOUSE_ID<br />S_WORKER<br />WORKER_ID_SEQ<br />13 rows selected.<br />O que é uma SEQUENCE:<br />Sequence são números criados pelo ORACLE que fazem  a<br />contagem de registros assumindo valores únicos, servindo de<br />ID, uma SEQUENCE pode ser usada por mais de uma tabela, cada<br />qual com seus números, sem que ocorra repetição é claro.<br />O exemplo seguinte mostra como criar uma SEQUENCE, o<br />nome da SEQUENCE é S_TESTE_id, que está relacionada com o id<br />da tabela TESTE ( tabela que foi criada  anteriormente), o<br />INCREMENTE BY serve para  que a SEQUENCE evolua de  um valor,<br />o START WITH serve para que a SEQUENCE comece com o numero<br />51, o MAXVALUE é o valor máximo que uma SEQUENCE pode<br />assumir, NOCACHE especifica se será alocada a memória cash ou<br />não, NOCYCLE serve para especificar ou não um ciclo de<br />SEQUENCE ou seja os números vão contando em um ciclo de tempo<br />determinado.72<br />Vamos ao Exemplo:<br />SQL> CREATE SEQUENCE S_TESTE_id<br />  2  INCREMENT BY 1<br />  3  START WITH 51<br />  4  MAXVALUE 9999999<br />  5  NOCACHE<br />  6  NOCYCLE;<br />Sequence created.<br />Como mostrar todas as SEQUENCES que estão disponíveis para<br />seu user:<br />SQL> select sequence_name, min_value, max_value,<br />  2   increment_by,last_number<br />  3  from user_sequences;<br />SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER<br />-------------- --------- --------- ------------ -----------<br />S_CUSTOMER_ID      1   9999999            1         216<br />S_DEPT_ID          1   9999999            1          51<br />S_EMP_ID           1   9999999            1          26<br />S_IMAGE_ID         1   9999999            1        1981<br />S_LONGTEXT_ID      1   9999999            1        1369<br />S_ORD_ID           1   9999999            1         113<br />S_PRODUCT_ID       1   9999999            1       50537<br />S_REGION_ID        1   9999999            1           6<br />S_TESTE            1   9999999            1          51<br />S_TESTE_ID         1   9999999            1          51<br />S_WAREHOUSE_ID     1   9999999            1       10502<br />11 rows selected.<br />No exemplo abaixo estamos criando uma SEQUENCE para o ID<br />de s_dept, foi escolhido como nome para a SEQUENCE s_dept_id,<br />sempre para  SEQUENCE usa-se o \"
S\"
 no começo do nome da<br />sequence.<br /> SQL> CREATE SEQUENCE S_dept_id<br />  2      INCREMENT BY 1<br />  3      START WITH 51<br />  4      MAXVALUE 9999999<br />  5      NOCACHE<br />  6      NOCYCLE;<br />Sequence created.73<br />O uso do NEXTVAL:<br />Agora vamos inserir valores dentro de s_dept sendo que<br />um desses valores é o NEXTVAL que tem como função trazer para<br />nós o próximo número da SEQUENCE e no caso especifico estamos<br />inserindo em ID o valor da SEQUENCE.<br />Veja abaixo:<br />SQL> insert into s_dept(id,name,region_id)<br />  2  values     (s_dept_id.NEXTVAL,'FINANCE',2);<br />1 row created.<br />Verificando a inserção do NEXTVAL, como nossa SEQUENCE<br />inicia em 51 o primeiro valor a ser inserido é 51.<br />SQL> SELECT ID<br />  2  FROM S_DEPT<br />  3  WHERE NAME = 'FINANCE';<br />       ID<br />---------<br />       51<br />Alterando uma  SEQUENCE: Para se alterar uma SEQUENCE<br />temos que ter privilégios para tal, os valores passados não<br />são alterados pela SEQUENCE, o START WITH de uma SEQUENCE não<br />pode ser alterado, para alterá - lo temos que dropar a<br />sequence, dropando-a não quer dizer que os valores já foram<br />inseridos nas primary keys serão apagados eles já foram<br />criados.<br />SQL> EDIT<br />Wrote file afiedt.buf<br />  1  ALTER SEQUENCE S_DEPT_ID<br />  2  INCREMENT BY 4<br />  3  MAXVALUE 99999<br />  4  CYCLE<br />  5* NOCACHE<br />SQL> /<br />Sequence altered.74<br />Para dropar uma SEQUENCE temos que seguir os passos a<br />seguir:<br />SQL> DROP SEQUENCE s_dept_id;<br />Sequence dropped.<br />SQL> DROP SEQUENCE S_TESTE;<br />Sequence dropped.<br />SQL> DROP SEQUENCE S_TESTE_ID;<br />Sequence dropped.<br />FINAL DE CAPÍTULO75<br />Finalidade do capítulo é o uso de  SUBQUERYS:<br />Uma  subquery é um cmdo  select dentro de um outro cmdo<br />select onde retorna uma ou mais linhas a fim de satisfazer<br />uma clausula WHERE.<br />No exemplo abaixo temos um  select em  s_emp onde<br />procuramos trazer o  last_name e o  title, onde o  title<br />pesquisado seja o mesmo do  \"
 Smith\"
, para isso é realizado<br />uma  subquery que nada mais é que um  select, que neste caso<br />retorna um valor somente para a comparação na where.<br />SQL> select last_name, title<br />  2  from s_emp<br />  3  where title =<br />  4        (select  title<br />  5         from s_emp<br />  6         where last_name = 'Smith');<br />LAST_NAME                 TITLE<br />------------------------- -------------------------<br />Maduro                    Stock Clerk<br />Smith                     Stock Clerk<br />Nozaki                    Stock Clerk<br />Patel                     Stock Clerk<br />Newman                    Stock Clerk<br />Markarian                 Stock Clerk<br />Chang                     Stock Clerk<br />Patel                     Stock Clerk<br />Dancs                     Stock Clerk<br />Schwartz                  Stock Clerk<br />10 rows selected.<br />Outro exemplo de  subquery, que neste caso está<br />comparando os valores da coluna  SALARY com a média dos<br />salários da tabela s_emp. A função AVG está trazendo a média<br />dos salários.<br />SQL> select last_name, title, salary<br />  2  from s_emp<br />  3  where salary<<br />  4        (select avg(salary)76<br />  5        from s_emp);<br />LAST_NAME                 TITLE                        SALARY<br />------------------------- ------------------------- ---------<br />Urguhart                  Warehouse Manager              1200<br />Menchu                    Warehouse Manager              1250<br />Biri                      Warehouse Manager              1100<br />Smith                     Stock Clerk                     940<br />Nozaki                    Stock Clerk                    1200<br />Patel                     Stock Clerk                     795<br />Newman                    Stock Clerk                     750<br />Markarian                 Stock Clerk                     850<br />Chang                     Stock Clerk                     800<br />Patel                     Stock Clerk                     795<br />Dancs                     Stock Clerk                     860<br />Schwartz                  Stock Clerk                    1100<br />12 rows selected.<br />Nos exemplos anteriores vemos que retornavam só um único<br />valor para comparação na clausula where, neste caso agora há<br />o retorno de mais de um valor para a comparação na clausula<br />where, mas para que ocorra a comparação com mais de um valor<br />temos que usar o IN em vez do \"
=\"
 no exemplo abaixo ocorre um<br />erro:<br />SQL> select last_name, title<br />  2   from s_emp<br />  3   where dept_id =<br />  4         (select id from s_dept<br />  5           where name = 'finance or region_id = 2);<br />select last_name, title<br />*<br />ERROR at line 1:<br />ORA-01756: quoted string not properly terminated<br />Agora usando o IN na clausula where poderá o dept_id ser<br />comparado com as duas condições, o select trará os registros<br />que na tabela  s_dept  que tenham o  nome igual a  'Finace' ou<br />que a region_id seja igual a 2.<br />SQL> select last_name,first_name,title<br />  2  from s_emp<br />  3  where dept_id in<br />  4        (select id<br />  5         from s_dept77<br />  6         where name = 'Finance' or region_id =2);<br />LAST_NAME                 FIRST_NAME                TITLE<br />------------------------- ------------------------- ---------<br />----------------<br />Quick-To-See              Mark                      VP,<br />Finance<br />Menchu                    Roberta                   Warehouse<br />Manager<br />Giljum                    Henry                     Sales<br />Representative<br />Nozaki                    Akira                     Stock<br />Clerk<br />Patel                     Vikram                    Stock<br />Clerk<br />O uso do having em subquery:<br />Neste exemplo estamos querendo selecionar o dept_id e a<br />média dos salários de  s_emp, grupados pelo  dept_id, com a<br />condição de que a média dos salários de s_emp seja maior que<br />a média dos salários do dept 32 para isso usamos o HAVING.<br />Vamos ao Exemplo:<br />SQL> select dept_id,avg(salary)<br />  2  from   s_emp<br />  3  group by dept_id<br />  4  having  avg(salary)><br />  5          (select avg(salary)<br />  6          from s_emp<br />  7          where dept_id = 32);<br />  DEPT_ID AVG(SALARY)<br />--------- -----------<br />       33        1515<br />       50        202578<br />Agora dentro do  group by estamos usando o  having  e<br />dentro da  subquery selecionando o menor valor da média da<br />tabela s_emp grupado por title<br />SQL><br />  1  select title,avg(salary)<br />  2  from   s_emp<br />  3   group by title<br />  4  having  avg(salary) =<br />  5          (select min(avg(salary))<br />  6           from s_emp<br />  7*          group by title)<br />TITLE                     AVG(SALARY)<br />------------------------- -----------<br />Stock Clerk                       949<br />SQL> select min(avg(salary))<br />  2  from s_emp<br />  3  group by title;<br />MIN(AVG(SALARY))<br />----------------<br />             949<br />FINAL DE CAPÍTULO79<br />Finalidade do capítulo é tratar o RENAME, TRUNCATE.<br />O RENAME é usado para renomear uma tabela,view etc.<br />observe a sintaxe abaixo:<br />SQL> RENAME s_ord TO S_ORDER<br />  2  ;<br />Table renamed.<br />O CMDO TRUNCATE é responsável por deletar os registros de uma<br />tabela da mesma forma do DELETE com a diferença que o<br />TRUNCATE libera espaço na tabela, para usar o CMDO TRUNCATE<br />tem que ser dono da tabela ou ter permissão para isto. Se<br />houver constraints o cmdo truncate não funciona, tem que usar<br />o DISABLE constraints para desabilitar as constraints.<br />SQL> TRUNCATE TABLE S_ITEM;<br />Table truncated.<br />FINAL DE CAPÍTULO80<br />Finalidade do capítulo é tratar sobre o comando UPDATE.<br />O CMDO UPDATE serve para fazermos alterações em registros<br />dentro de  nossa tabela observe os exemplos abaixo:<br />Estamos vendo o nr do dept onde o id é igual a 2:<br />SQL> select dept_id<br />  2  from<br />  3  S_EMP<br />  4  where id = 2;<br />  DEPT_ID<br />---------<br />       41<br />Agora todos que tiverem nr do id igual a 2 passará a ter o id<br />do dept igual a 10.<br />SQL> UPDATE S_EMP<br />  2  SET dept_id = 10<br />  3  WHERE id = 2;<br />1 row updated.<br />Verificando se realmente se concretizou o UPDATE<br />SQL> select dept_id<br />  2  from<br />  3  S_EMP<br />  4  where id = 2;<br />  DEPT_ID<br />---------<br />       10<br />Estamos selecionado dept_id, salary de s_emp onde o id<br />for igual a 1.<br />SQL> select dept_id,salary<br />  2  from s_emp<br />  3  where id = 1;<br />  DEPT_ID    SALARY<br />--------- ---------81<br />       50      2500<br />Agora vamos alterar os valores de dept_id para 32 e de<br />salary para 2550 onde o id for igual a 1.<br />SQL> UPDATE s_emp<br />  2  SET dept_id = 32, salary = 2550<br />  3  where id = 1;<br />1 row updated.<br />Verificando a concretização da mudança.<br />SQL> select dept_id,salary<br />  2  from s_emp<br />  3  where id = 1;<br />  DEPT_ID    SALARY<br />--------- ---------<br />       32      2550<br />Quando não usamos a clausula  where no  UPDATE fazemos<br />alterações em todos os registros da tabela, no caso estamos<br />mudando todos os  campos de  commission_pct para 10 sem<br />distinção.<br />SQL> UPDATE S_EMP<br />  2  SET commission_pct = 10;<br />26 rows updated.<br />Neste exemplo estamos tentando fazer uma alteração em um<br />valor que  é uma FOREIKEY, e o valor que queremos adicionar<br />não existe na tabela de origem da FK portanto irá ferir uma<br />constraint.<br />SQL> UPDATE S_EMP<br />  2  SET DEPT_ID = 60<br />  3  WHERE DEPT_ID = 10;<br />UPDATE S_EMP<br />       *<br />ERROR at line 1:<br />ORA-02291: integrity constraint (GUIMA.S_EMP_DEPT_ID_FK)<br />violated - parent key not found82<br />Agora no próximo exemplo estamos verificando quais são<br />os dept_id que fazem relação com s_emp.<br />SQL> select dept_id<br />  2  from s_emp;<br />  DEPT_ID<br />---------<br />       32<br />       41<br />       31<br />       10<br />       50<br />       41<br />       42<br />       43<br />       44<br />       45<br />       31<br />       32<br />       33<br />       34<br />       35<br />       41<br />       41<br />       42<br />       42<br />       43<br />       43<br />26 rows selected.<br />Agora vamos fazer a alteração de dept_id passando todos<br />que são 10 para 40 e não irá violar a constraint porque o<br />valor 40 existe na tabela DEPT. como se pode observar no<br />select anterior.<br />SQL> UPDATE S_EMP<br />  2  SET DEPT_ID = 41<br />  3  WHERE DEPT_ID = 10;<br />1 row updated.83<br />Finalidade do capítulo é  tratar sobre VIEW.<br />Uma VIEW é como se fosse uma janela que dá acesso aos<br />dados da tabela, só que com restrições. No exemplo abaixo<br />estamos criando uma VIEW usando uma SUBQUERY, trazendo dados<br />específicos de uma tabela.Vamos ao exemplo:<br />SQL> CREATE VIEW empvu45  2  AS SELECT   id,last_name,title<br />  3  FROM        s_emp<br />  4  WHERE       dept_id = 45;<br />View created.<br />Estamos agora realizando um select em nossa VIEW:<br />SQL> select * from<br />  2  empvu45;<br />       ID LAST_NAME                 TITLE<br />--------- ------------------------- -------------------------<br />       10 Havel                     Warehouse Manager<br />       24 Dancs                     Stock Clerk<br />       25 Schwartz                  Stock Clerk<br />Estamos fazendo um select na tabela S_EMP, referente ao<br />dept_id 45 e vemos que nossa VIEW é idêntica.<br />SQL> select id,last_name,title<br />  2  FROM        s_emp<br />  3  WHERE       dept_id = 45;<br />       ID LAST_NAME                 TITLE<br />--------- ------------------------- -------------------------<br />       10 Havel                     Warehouse Manager<br />       24 Dancs                     Stock Clerk<br />       25 Schwartz                  Stock Clerk<br />Criando uma VIEW  usando ALIASES:<br />SQL> CREATE VIEW salvu4184<br />  2  AS SELECT id,first_name PRIMEIRO,<br />  3  last_name ULTIMO, salary SALARIO_MENSAL<br />  4  FROM<br />  5  s_emp<br />  6  WHERE dept_id = 41;<br />View created.<br />Vendo a VIEW criada:<br />SQL> desc  salvu41<br /> Name                            Null?    Type<br /> ------------------------------- -------- ----<br /> ID                              NOT NULL NUMBER(7)<br /> PRIMEIRO                                 VARCHAR2(25)<br /> ULTIMO                          NOT NULL VARCHAR2(25)<br /> SALARIO_MENSAL                           NUMBER(11,2)<br />Mais um exemplo de como criar uma VIEW:<br />Estamos criando uma VIEW chamada \"
dept_sum_vu\"
 com os<br />nomes de colunas criados por eu da forma que achar melhor,<br />observe que está sendo realizado uma  SUBQUERY e um  JOIN<br />dentro da  SUBQUERY entre as tabelas  s_emp e  s_dept, onde<br />pega-se o menor salário função  MIN, o maior salário(função<br />MAX) a média dos salários(função  AVG) com a condição<br />estabelecida da clausula  WHERE que não é mais que a ligação<br />do  JOIN, e por último nossa  VIEW virá agrupada pelo  NOME de<br />s_dept.<br />SQL> EDIT<br />Wrote file afiedt.buf<br />  1  create VIEW dept_sum_vu<br />  2  (name, minsal,maxsal, avgsal)<br />  3  AS SELECT d.name, MIN  (e.salary),<br />  4  MAX(e.salary),AVG(e.salary)<br />  5  FROM s_emp e,s_dept d<br />  6  WHERE e.dept_id = d.id<br />  7* GROUP BY d.name<br />SQL> /<br />View created.<br />Este é o formato de nossa VIEW, verifique o nome das<br />colunas correspondentes a SUBQUERY dentro do CREATE VIEW, e<br />agrupados85<br />por nome.<br />SQL> desc dept_sum_vu<br /> Name                            Null?    Type<br /> ------------------------------- -------- ----<br /> NAME                            NOT NULL VARCHAR2(25)<br /> MINSAL                                   NUMBER<br /> MAXSAL                                   NUMBER<br /> AVGSAL                                   NUMBER<br />Agora vamos fazer um select em s_dept e s_emp com um JOIN e<br />depois vamos comparar os dados obtidos com o resultado obtido<br />de nossa VIEW:<br />Wrote file afiedt.buf<br />  1  SELECT d.name, MIN  (e.salary),<br />  2  MAX(e.salary),AVG(e.salary)<br />  3  FROM s_emp e,s_dept d<br />  4  WHERE e.dept_id = d.id<br />  5* GROUP BY d.name<br />SQL> /<br />NAME            MIN(E.SALARY) MAX(E.SALARY) AVG(E.SALARY)<br />------------------ ------------- ------------- -------------<br />Administration     1550          2500          2025<br />Finance            1450          1450          1450<br />Operations         825          1540     1144.7667<br />Sales              874.5          1525     1379.2143<br />Agora estamos fazendo um select na  VIEW criada usando<br />todas as colunas especificadas em sua criação veja que os<br />dados trazidos são os mesmos da tabela  s_emp e  s_dept<br />submetida em um select com join:<br />SQL> EDIT<br />Wrote file afiedt.buf<br />  1  select NAME,MINSAL,MAXSAL,AVGSAL<br />  2  FROM<br />  3* DEPT_SUM_VU<br />SQL> /<br />NAME                         MINSAL    MAXSAL    AVGSAL<br />------------------------- --------- --------- ---------<br />Administration                 1550      2500      2025<br />Finance                        1450      1450      1450<br />Operations                      825      1540 1144.7667<br />Sales                         874.5      1525 1379.214386<br />Estamos agora criando uma VIEW com a condição WITH CHECK<br />OPTION CONSTRAINT que tem a finalidade de não permitir<br />alteração na VIEW em relação a clausula WHERE.<br />SQL> edit<br />Wrote file afiedt.buf<br />  1  create or replace VIEW empvu41<br />  2  AS SELECT     *<br />  3  FROM         s_emp<br />  4  WHERE        dept_id = 41<br />  5* WITH CHECK OPTION CONSTRAINT empvu41_ck<br />SQL> /<br />View created.<br />Tentamos fazer uma alteração na  VIEW empvu41, não será<br />permitida a alteração nos moldes sugeridos abaixo ou seja a<br />alteração no nr do departamento.<br />SQL>  UPDATE empvu41<br />  2  SET DEPT_ID = 42<br />  3  WHERE ID = 16;<br /> UPDATE empvu41<br />        *<br />ERROR at line 1:<br />ORA-01402: view WITH CHECK OPTION where-clause violation.<br />Criando uma VIEW e determinando que ela seja somente de<br />leitura.<br />SQL> CREATE OR REPLACE VIEW empvu45<br />  2    (id_number, employee, job)<br />  3  AS SELECT id,last_name,title<br />  4  FROM  S_EMP<br />  5  WHERE   dept_id = 45<br />  6  WITH READ ONLY;<br />View created.<br />Estamos tentando deletar registros da VIEW empvu45 só<br />que ela foi criada com a opção  WITH READ ONLY, ou seja<br />somente leitura.<br />SQL> DELETE FROM empvu45<br />  2  WHERE ID_NUMBER = 10;87<br />DELETE FROM empvu45<br />            *<br />ERROR at line 1:<br />ORA-01752: cannot delete from view without exactly one keypreserved table<br />Para saber as  VIEWS existentes vamos a  USER_VIEWS que<br />pertence ao dicionário de dados e então podemos pesquisar<br />veja só:<br />SQL> describe user_views;<br /> Name                            Null?    Type<br /> ------------------------------- -------- ----<br /> VIEW_NAME                       NOT NULL VARCHAR2(30)<br /> TEXT_LENGTH                              NUMBER<br /> TEXT                                     LONG<br />-- selecionando as VIEWS existentes:<br />SQL> SELECT * FROM<br />  2  user_views;<br />VIEW_NAME   TEXT_LENGTH TEXT<br />-------------- ---------------------------------------------<br />EMPVU41 194 SELECT\"
ID\"
,\"
LAST_NAME\"
,\"
FIRST_NAME\"
,\"
USE<br />RID\"
,\"
START_DATE\"
,\"
COMMENTS\"
,\"
MANAG<br />EMPVU45   74 SELECT id,last_name,title<br />             FROM  S_EMP<br />             WHERE   dept_id = 45<br />             WITH READ ONLY<br />Para deletar uma VIEW usamos o cmdo DROP:<br />Quando deletamos uma VIEW não alteramos em nada a tabela.<br />SQL> DROP VIEW EMPVU45 ;<br />View dropped.<br />FINAL DE CAPÍTULO88<br />Finalidade do capítulo é o uso da clausula WHERE.<br />A clausula where tem a função de dar condições para o<br />select onde especifica a pesquisa, neste primeiro exemplo<br />temos um select somente no departamento numero 42.SQL> SELECT<br />LAST_NAME, DEPT_ID,SALARY<br />  2  FROM S_EMP<br />  3  WHERE DEPT_ID = 42;<br />LAST_NAME                   DEPT_ID    SALARY<br />------------------------- --------- ---------<br />Menchu                           42      1250<br />Nozaki                           42      1200<br />Patel                            42       795<br />Neste próximo caso vemos o exemplo de que para fazermos<br />uma pesquisa, temos que colocar o nome ou numero a ser<br />pesquisado como mesmo formato do que se encontra no banco, no<br />caso abaixo ocorreu erro por que o nome colocado é diferente<br />do que está no banco.<br />SQL> SELECT FIRST_NAME, LAST_NAME, TITLE<br />  2  FROM S_EMP<br />  3  WHERE LAST_NAME = 'MAGEE';<br />no rows selected<br />Agora com a correção do nome temos a pesquisa com<br />sucesso.<br />SQL> SELECT FIRST_NAME, LAST_NAME, TITLE<br />  2  FROM S_EMP<br />  3  WHERE LAST_NAME = 'Magee';<br />FIRST_NAME      LAST_NAME                 TITLE<br />----------------------------------- -------------------------<br />Colin          Magee                     Sales Representative<br />Usando a clausula where com o comando between ... and<br />..., que tem a finalidade  de trazer valores delimitados<br />dentro de um determinado espaço, no exemplo abaixo o comando<br />traz uma seleção que está entre 09-may-91 and 17-jun-91.<br />SQL> SELECT FIRST_NAME,LAST_NAME, START_DATE89<br />  2  FROM S_EMP<br />  3  WHERE START_DATE BETWEEN '09-MAY-91'<br />  4  AND '17-JUN-91';<br />FIRST_NAME                LAST_NAME                 START_DAT<br />------------------------- ------------------------- ---------<br />Midori                    Nagayama                  17-JUN-91<br />Alexander                 Markarian                 26-MAY-91<br />Sylvie                    Schwartz                  09-MAY-91<br />Agora vamos fazer um desc na tabela s_dept:<br />SQL> DESC S_DEPT;<br /> Name                            Null?    Type<br /> ------------------------------- -------- ----<br /> ID                              NOT NULL NUMBER(7)<br /> NAME                            NOT NULL VARCHAR2(25)<br /> REGION_ID                                NUMBER(7)<br />Agora vamos fazer uma seleção onde region_id seja (1,3) e<br />somente estes.<br />SQL> SELECT ID,NAME,REGION_ID<br />  2  FROM S_DEPT<br />  3  WHERE REGION_ID IN (1,3);<br />       ID NAME                      REGION_ID<br />--------- ------------------------- ---------<br />       10 Finance                           1<br />       31 Sales                             1<br />       33 Sales                             3<br />       41 Operations                        1<br />       43 Operations                        3<br />       50 Administration                    1<br />6 rows selected.<br />No exemplo abaixo o uso  comando null na clausula where,<br />especifica e traz o s_customer onde sales_rep_id for nulo ou<br />seja onde o customer não tiver sales_rep_id. Mas neste<br />exemplo abaixo não cumpre a finalidade, apesar de estar<br />correto.90<br />SQL> select ID,NAME,CREDIT_RATING<br />  2  FROM S_CUSTOMER<br />  3  WHERE SALES_REP_ID = NULL;<br />no rows selected<br />Forma errada de se pesquisar por um valor nulo:<br />SQL> SELECT ID,NAME,CREDIT_RATING<br />  2  FROM S_CUSTOMER<br />  3  WHERE SALES_REP_ID =' ';<br />ERROR:<br />ORA-01722: invalid number<br />no rows selected<br />Veja a maneira correta de pesquisar usando a clausula<br />where com a condição de campos nulos.<br />SQL>  SELECT ID,NAME,CREDIT_RATING<br />  2   FROM S_CUSTOMER<br />  3  WHERE SALES_REP_ID IS NULL;<br />      ID  NAME                     CREDIT_RA<br />--------- ------------------ ---------<br />      207 Sweet Rock Sports          GOOD<br />/<br />O exemplo abaixo demostra o uso do comando and dentro da<br />clausula where, onde  dentro da tabela s_emp será pesquisado<br />os registros que sejam do departamento  41 e com o nome do<br />title \"
 stock clerk\"
.<br />SQL> SELECT LAST_NAME,SALARY,DEPT_ID,TITLE<br />  2  FROM S_EMP<br />  3  WHERE DEPT_ID = 41<br />  4  AND TITLE = 'Stock Clerk';<br />LAST_NAME                    SALARY   DEPT_ID TITLE<br />----------------------- --------- --------- ----------------<br />Maduro                         1400        41 Stock Clerk<br />Smith                           940        41 Stock Clerk91<br />Este exemplo mostra o uso do comando \"
OR\"
 dentro da<br />clausula WHERE onde no caso a pesquisa é feita na tabela<br />\"
S_EMP\"
 trazendo todos os registros que contenham o dept_id<br />igual a 41 como também todos aqueles que possuam o title<br />igual a \"
Stock Clerk\"
.<br />Vamos<br />SQL> SELECT LAST_NAME,SALARY,DEPT_ID,TITLE<br />  2  FROM S_EMP<br />  3  where DEPT_ID = 41<br />  4  OR  TITLE = 'Stock Clerk';<br />LAST_NAME                    SALARY   DEPT_ID TITLE<br />------------------------- --------- --------- ---------------<br />----------<br />Ngao                           1450        41 VP, Operations<br />Urguhart                       1200        41 Warehouse<br />Manager<br />Maduro                         1400        41 Stock Clerk<br />Smith                           940        41 Stock Clerk<br />Nozaki                         1200        42 Stock Clerk<br />Patel                           795        42 Stock Clerk<br />Newman                          750        43 Stock Clerk<br />Markarian                       850        43 Stock Clerk<br />Chang                           800        44 Stock Clerk<br />Patel                           795        34 Stock Clerk<br />Dancs                           860        45 Stock Clerk<br />Schwartz                       1100        45 Stock Clerk<br />12 rows selected.<br />Nos exemplos abaixo temos como usar o AND e o OR juntos<br />dentro de uma clausula  where, no primeiro exemplo o select<br />traz dentro da tabela s_emp todos registros onde o salário<br />seja maior ou igual a 1000 mas somente no departamento 44 e<br />traz todos os registros do departamento 42, independente da<br />condição de salário.<br />Vamos ao exemplo:<br />SQL> select last_name,salary,dept_id<br />  2  from s_emp<br />  3  where salary >= 1000<br />  4  and dept_id = 44<br />  5  or dept_id = 42;<br />LAST_NAME                    SALARY   DEPT_ID92<br />------------------------- --------- ---------<br />Menchu                         1250        42<br />Catchpole                      1300        44<br />Nozaki                         1200        42<br />Patel                           795        42<br />Com o uso do parênteses nós podemos no exemplo abaixo<br />selecionar todos os registros do departamento 44 e 42 que<br />recebam salário maior ou igual a 1000, diferente do exemplo<br />anterior, portanto o uso do parênteses determina que a<br />condição da clausula WHERE do salário sirva par os dois.<br />SQL> select last_name,salary,dept_id<br />  2  from s_emp<br />  3  where salary >= 1000<br />  4  and (dept_id = 44<br />  5  or dept_id = 42);<br />LAST_NAME                    SALARY   DEPT_ID<br />------------------------- --------- ---------<br />Menchu                         1250        42<br />Catchpole                      1300        44<br />Nozaki                         1200        42<br />Na clausula  where usamos o operador  like que serve no<br />geral para trazer valores aproximados ou parecidos na<br />pesquisa, podemos ver abaixo os exemplos:<br />No  primeiro caso abaixo o operador like esta pesquisando o<br />last_name da tabela s_emp que se inicia com a letra (m).<br />SQL> SELECT LAST_NAME<br />  2  FROM S_EMP<br />  3  WHERE LAST_NAME LIKE 'M%'<br />  4  ;<br />LAST_NAME<br />-------------------------<br />Menchu<br />Magee<br />Maduro<br />Markarian93<br />Agora no exemplo abaixo o comando like faz uma pesquisa<br />no start_date da tabela s_emp onde a data termina em 91.<br />SQL> SELECT LAST_NAME,START_DATE<br />  2  FROM S_EMP<br />  3  WHERE START_DATE LIKE '%91';<br />LAST_NAME                 START_DAT<br />------------------------- ---------<br />Nagayama                  17-JUN-91<br />Urguhart                  18-JAN-91<br />Havel                     27-FEB-91<br />Sedeghi                   18-FEB-91<br />Dumas                     09-OCT-91<br />Nozaki                    09-FEB-91<br />Patel                     06-AUG-91<br />Newman                    21-JUL-91<br />Markarian                 26-MAY-91<br />Dancs                     17-MAR-91<br />Schwartz                  09-MAY-91<br />11 rows selected.<br />No exemplo abaixo é feito uma seleção na tabela s_emp onde a<br />segunda letra do nome começa com a, não deu certo no caso<br />abaixo porque a letra digitada é maiúscula e na tabela a ser<br />pesquisada as segundas letras são  minúsculas.<br />SQL> SELECT LAST_NAME,START_DATE<br />  2  FROM S_EMP<br />  3  WHERE LAST_NAME LIKE '_A%';<br />no rows selected<br />Mas neste agora temos a pesquisa concluída satisfazendo<br />a condição da segunda letra da clausula where, observe o uso<br />do hífen.<br />SQL> SELECT LAST_NAME,START_DATE<br />  2  FROM S_EMP<br />  3  WHERE LAST_NAME LIKE '_a%';<br />LAST_NAME                 START_DAT<br />------------------------- ---------<br />Nagayama                  17-JUN-91<br />Catchpole                 09-FEB-92<br />Havel                     27-FEB-9194<br />Magee                     14-MAY-90<br />Maduro                    07-FEB-92<br />Patel                     06-AUG-91<br />Markarian                 26-MAY-91<br />Patel                     17-OCT-90<br />Dancs                     17-MAR-91<br />9 rows selected.<br />Quando optarmos por trazer somente os dados onde não<br />contenham uma letra qualquer, usamos no comando  notlike.  A<br />seguinte expressão :  NOT LIKE '%A%', no exemplo abaixo não<br />traria o resultado desejado, porque as letras na tabela são<br />minúsculas \"
a\"
 e a utilizada foi maiúscula \"
A\"
.<br />SQL> SELECT LAST_NAME<br />  2  FROM S_EMP<br />  3  WHERE LAST_NAME NOT LIKE '%A%';<br />LAST_NAME<br />-------------------------<br />Velasquez<br />Ngao<br />Nagayama<br />Quick-To-See<br />Ropeburn<br />Urguhart<br />Menchu<br />Biri<br />Catchpole<br />Havel<br />25 rows selected.<br />Agora nós estamos usando uma letra que está no mesmo<br />formato dos dados na tabela e então a execução do  select<br />trará todos os nomes da tabela  s_emp que não tenham a letra<br />\"
a\"
.95<br />Vamos ao exemplo:<br />SQL> SELECT LAST_NAME<br />  2  FROM S_EMP<br />  3  WHERE LAST_NAME NOT LIKE '%a%';<br />LAST_NAME<br />-------------------------<br />Quick-To-See<br />Ropeburn<br />Menchu<br />Biri<br />Giljum<br />Sedeghi<br />Nguyen<br />Smith<br />8 rows selected.<br />No exemplo abaixo  estamos selecionando somente<br />funcionários da tabela  s_emp, que receberam comissão,<br />portanto na clausula  where temos o comando condicional  \"
is<br />not null\"
.<br />SQL> SELECT LAST_NAME, TITLE, COMMISSION_PCT<br />  2  FROM S_EMP<br />  3  WHERE COMMISSION_PCT IS NOT NULL;<br />LAST_NAME            TITLE                     COMMISSION_PCT<br />------------------------------------------- --------------<br />Magee                Sales Representative                  10<br />Giljum               Sales Representative                12.5<br />Sedeghi              Sales Representative                  10<br />Nguyen               Sales Representative                  15<br />Dumas                Sales Representative                17.596<br />Agora queremos todos os funcionários que não recebem<br />comissão ou seja que possuam o campo COMMISSION_PCT nulo.<br />SQL> SELECT LAST_NAME, TITLE, COMMISSION_PCT<br />  2  FROM S_EMP<br />  3  WHERE COMMISSION_PCT IS NULL;<br />LAST_NAME           TITLE                     COMMISSION_PCT<br />--------------- ------------------------- --------------<br />Velasquez            President<br />Ngao                 VP, Operations<br />Nagayama             VP, Sales<br />Quick-To-See         VP, Finance<br />Ropeburn             VP, Administration<br />Urguhart             Warehouse Manager<br />Menchu               Warehouse Manager<br />Biri                 Warehouse Manager<br />Catchpole            Warehouse Manager<br />Havel                Warehouse Manager<br />Maduro               Stock Clerk<br />Smith                Stock Clerk<br />Nozaki               Stock Clerk<br />20 rows selected.<br />FINAL DE CAPÍTULO97<br />O Usuário inserindo valores em tempo de execução:<br />O uso do ‘&’ e do ‘SET OFF’, ‘ SET VRERIFY ON’ E ETC.<br />A finalidade dos exemplos abaixo é demostrar como fazer<br />quando queremos que o usuário entre com valores, em tempo de<br />execução. É sempre bom lembrar que estamos no SQL Plus e os<br />artifícios de entrada não são tão amigáveis, mas servem para<br />que em uma programação posterior, possamos usá–los para<br />execução.<br />Primeiramente  o usuário entra com dados em tempo de<br />execução, para em seguida ser executada uma pesquisa através<br />de um cmdo sql.<br />Vemos o uso do  \"
&\"
 para que o usuário entre com dados.<br />No exemplo abaixo temos um pedido de entrada de um numero por<br />isso é que  o numero_do_dept não está entre aspas.<br />Podemos notar que aparece o “old” valor e o “new” valor<br />isso é devido ao  cmdo set verify on, se quisermos que não<br />apareça, deve ser usado o  set verify off.<br />Vamos ao Exemplo: No exemplo queremos selecionar o<br />id,last_name,salary da tabela s_emp onde o dept_id seja igual<br />ao valor digitado pelo usuário através &numero_do_dept, que<br />no exemplo será o nr 31.<br />SQL> set verify onSQL> select id,last_name,salary  2  from<br />s_emp  3  where  dept_id=&numero_do_dept;<br />Enter value for numero_do_dept: 31old   3: where<br />dept_id=&numero_do_deptnew   3: where  dept_id=31       ID<br />LAST_NAME                    SALARY<br />--------- ------------------------- ---------<br />        3 Nagayama                       1400<br />       11 Magee                          1400<br />Agora não aparecerá o new e old valor por causa do SET<br />VERIFY OFF.<br />SQL> set verify off<br />SQL> select id,last_name,salary<br />  2  from   s_emp<br />  3  where  dept_id=&numero_do_dept;<br />Enter value for numero_do_dept: 31       ID LAST_NAME<br />SALARY--------- ------------------------- ---------        3<br />Nagayama                       1400<br />       11 Magee                          140098<br />Teremos um exemplo de como  usuário pode entrar com<br />dados quer seja do tipo caracter ou numérico, note que há o<br />uso das aspas, temos que ter em mente que o formato a ser<br />digitado especificamente no exemplo abaixo tem que ser<br />idêntico ao que está na tabela, com maiúsculas e minúsculas<br />pois não estamos usando nenhum comando para fazer a<br />conversão.<br />Vamos ao Exemplo: estamos selecionando id,last_name,salary da<br />tabela s_emp onde o campo da coluna title seja exatamente<br />igual ao nome digitado pelo usuário pela a opção ‘&job_title'<br />SQL> select id,last_name,salary<br />  2  from s_emp<br />  3  where title ='&job_title';<br />Enter value for job_title: Stock Clerk<br />       ID LAST_NAME                    SALARY<br />--------- ------------------------- ---------<br />       16 Maduro                         1400<br />       17 Smith                           940<br />       18 Nozaki                         1200<br />       19 Patel                           795<br />       20 Newman                          750<br />       21 Markarian                       850<br />       22 Chang                           800<br />       23 Patel                           795<br />       24 Dancs                           860<br />       25 Schwartz                       1100<br />10 rows selected.<br />Agora vamos ver como que o usuário poderá entrar com o<br />nome da coluna e com a condição de pesquisa que ele deseja<br />que seja estabelecida na cláusula WHERE. Neste caso temos um<br />exemplo onde é requerida a entrada de um dado numérico.<br />Vamos ao Exemplo: estamos selecionando o id, uma coluna<br />sugerida pelo usuário(logo que exista), referente a tabela<br />s_emp e como também definindo uma condição para tal<br />pesquisa.SQL> select id,&nome_coluna  2  from s_emp  3  where<br />&condição;<br />Enter value for nome_coluna: LAST_NAME<br />Enter value for condição:  SALARY > 100<br />       ID LAST_NAME<br />--------- -------------------------99<br />        1 Velasquez<br />        2 Ngao<br />        3 Nagayama<br />        4 Quick-To-See<br />        5 Ropeburn<br />        6 Urguhart<br />        7 Menchu<br />        8 Biri<br />Outro exemplo em que o usuário entra com o valor da<br />coluna e da condição WHERE.<br />SQL> select id,&nome_coluna  2  from  s_ord  3  where<br />&condição;<br />Enter value for nome_coluna: date_orderedEnter value for<br />condição: total>30000<br />       ID DATE_ORDE<br />--------- ---------<br />      100 31-AUG-92<br />      104 03-SEP-92<br />      107 07-SEP-92<br />      108 07-SEP-92<br />      109 08-SEP-92<br />       97 28-AUG-92<br />6 rows selected.<br />Construindo  um script usando as opções para que o usuário<br />possa entrar com dados e como também  mostrar em tela somente<br />o prompt.<br />O cmdo set echo off  serve para que em tempo de<br />execução não se exiba os comandos do sql. Já o  set echo on<br />serve  para retornar a forma anterior.<br /> O cmdo  accept serve para preparar um prompt para<br />receber um valor.<br /> Neste exemplo também temos a criação de uma variável<br />v_name que recebe valores.<br />Estamos preparando o ambiente para receber valores que<br />serão armazenados dentro de uma variável, para após isto,<br />serem feitas  comparações dentro  da cláusula where.100<br />Estamos usando duas tabelas s_dept e s_region, o and  é<br />uma função onde complementa a cláusula  where, e o  upper no<br />dpt.name está passando o conteúdo do nome do dept<br />para maiúsculo para que seja efetuada a comparação com o nome<br />digitado pelo o usuário que por sua vez recebe um upper que o<br />transforma em maiúsculo, essa alternativa é feita<br />porque não sabemos qual é o formato do dado na tabela.<br />Vamos ao Exemplo:<br />SET ECHO OFF<br />ACCEPT V_NAME PROMPT 'DÊ O NOME DO DEPARTAMENTO:'<br />SELECT DPT.NAME, REG.ID, REG.NAME \"
 NOME DA REGIÃO\"
<br />FROM S_DEPT DPT, S_REGION REG<br />WHERE DPT.REGION_ID = REG.ID -- está fazendo o join entre as<br />tabelas<br />AND UPPER(DPT.NAME) LIKE UPPER('%&V_NAME%')<br />/<br />SET ECHO ON<br />Como estamos gerando um SCRIPT os comandos devem ficar<br />guardados dentro de um arquivo que possua a extensão *.SQL e<br />preparado da forma acima. Uma vez no SQL se desejarmos<br />executar o nosso SCRIPT temos que seguir o procedimento<br />descrito abaixo, usando \"
@\"
 e o nome do arquivo, ou \"
 START\"
<br />e o nome do arquivo.<br />SET ECHO ON<br />SQL> @TEST.SQL<br />SQL> SET ECHO OFF<br />DÊ O NOME DO DEPARTAMENTO:sales<br />old   4: AND UPPER(DPT.NAME) LIKE UPPER('%&V_NAME%')<br />new   4: AND UPPER(DPT.NAME) LIKE UPPER('%sales%')<br />NAME               ID  NOME DA REGIÃO<br />---- --------- ---------------------------------------------<br />Sales               1 North America<br />Sales               2 South America<br />Sales               3 Africa / Middle East<br />Sales               4 Ásia<br />Sales               5 Europe101<br />Podemos notar que no exemplo anterior foi mostrado o OLD e o<br />NEW valores da variável, para que não mostre, temos que usar<br />o SET VERIFY OOF, veja abaixo:<br />SET VERIFY OFF<br />SET ECHO OFF<br />ACCEPT V_NAME PROMPT 'DÊ O NOME DO DEPARTAMENTO:'<br />SELECT DPT.NAME, REG.ID, REG.NAME \"
 NOME DA REGIÃO\"
<br />FROM S_DEPT DPT, S_REGION REG<br />WHERE DPT.REGION_ID = REG.ID<br />AND UPPER(DPT.NAME) LIKE UPPER('%&V_NAME%')<br />/<br />SET ECHO ON<br />SQL> START TEST.SQL<br />SQL> SET VERIFY OFF<br />SQL> SET ECHO OFF<br />DÊ O NOME DO DEPARTAMENTO:SALES<br />NAME                  ID  NOME DA REGIÃO<br />-------------------------------------------------------------<br />Sales                  1 North America<br />Sales                  2 South America<br />Sales                  3 Africa / Middle East<br />Sales                  4 Ásia<br />Sales                  5 Europe<br />Input truncated to 11 characters102<br />FINAL DE CAPÍTULO103<br />Finalidade do capítulo é tratar sobre exemplos diversos.<br />Vamos descrever o uso dos cmdos abaixo:Concat, usado<br />para concatenar  o conteúdo de last_name mais o conteúdo de<br />title jogando dentro de \"
 vice presidência\"
  apper está<br />transformando o conteúdo de last_name em maiúsculo, o cmdo<br />substr(title,3) reduz as três primeiras  posições do conteúdo<br />da coluna title que no caso é \"
vp\"
, o cmdo like pesquisa algo<br />parecido com \"
vp\"
 = 'vp%'.<br />SQL>  SELECT CONCAT(UPPER(last_name),<br />  2   substr(title,3)) \"
 vice presidência\"
<br />  3  from s_emp<br />  4   where title LIKE 'VP%';<br /> vice presidência<br />------------------------------------------------<br />NGAO, Operations<br />NAGAYAMA, Sales<br />QUICK-TO-SEE, Finance<br />ROPEBURN, Administration<br />Para colocarmos um valor caracter dentro de um campo que seja<br />number, devemos usar a conversão \"
 TO_CHAR\"
, funções e cmdos<br />usados no exemplo abaixo:<br />\"
NVL\"
 usado para manipulação de valores nulos.<br />\"
TO_CHAR\"
 usado no caso para a conversão de \"
maneger_id\"
 que<br />tem um formato numérico, a fim de prepará-lo para receber um<br />valor  que não é numérico.<br />\"
is null\"
 função que indica o valor nulo na coluna.<br />SQL> select last_name,<br />  2   nvl(to_char(manager_id),'não tem gerente')<br />  3   from s_emp<br />  4  where manager_id is null;<br />LAST_NAME    NVL(TO_CHAR(MANAGER_ID),'NÃOTEMGERENTE')<br />--------------- ----------------------------------------<br />Velasquez        não tem gerente104<br />Comandos ultilizados no exemplo abaixo:<br />\"
TO_CHAR\"
 neste caso com a função de fazer a conversão da<br />data default do sistema para a data desejada, onde os<br />formatos são colocados da seguinte forma e com as seguintes<br />funções:  Day = dia por extenso,  Month = nome do mês por<br />extenso, ddth nome do dia em forma de numeral, YYYY = ano no<br />padrão numeral, o cmdo  \"
NEXT DAY ' tem a função de ir para<br />uma próxima data que no caso faz referencia a próxima sexta<br />feira.( next_day,'friday').O cmdo \"
ADD_MONTHS\"
 faz a soma de<br />6 meses a  data_ordered (date_ordered,\"
6\"
) o seis faz<br />referencia a seis meses.<br />SQL> select to_char(next_day(add_months<br />  2                (date_ordered,6),'friday'),<br />  3                'day,month ddth,yyyy') \"
 próxima sexta<br />daqui a 6 meses\"
<br />  4  from s_ord<br />  5  order by date_ordered;<br /> próxima sexta daqui a 6 meses<br />-------------------------------------------------------------<br />friday   ,march     05th,1993<br />friday   ,march     05th,1993<br />friday   ,march     05th,1993<br />friday   ,march     05th,1993<br />friday   ,march     05th,1993<br />friday   ,march     05th,1993<br />friday   ,march     05th,1993<br />friday   ,march     05th,1993<br />friday   ,march     05th,1993<br />friday   ,march     05th,1993<br />friday   ,march     12th,1993<br />friday   ,march     12th,1993<br />friday   ,march     12th,1993<br />friday   ,march     12th,1993<br />friday   ,march     12th,1993<br />friday   ,march     12th,1993<br />16 rows selected.105<br />Faça do site http://www.geocities.com/hollywood/makeup/2765/bs.htm o melhor local para baixar<br />apostilas grátis<br />Envie uma pequena contribuição para<br />Leonardo R Motta<br />Rua Caxinava nº 56<br />Jardim Umarizal<br />São Paulo - SP<br />Informe também que apostila gostaria de poder baixar gratuitamente no site<br />Será pesquisado livros sobre temas escolhido pela grande maioria e suas  apostilas<br />disponibilizadas gratuitamente<br />
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql
Apostila de sql

Mais conteúdo relacionado

PDF
apostila de sql - oracle
PDF
Apostila de sql oracle
PDF
apostila-de-sql
DOC
Apostila de sql
PDF
Curso de sql
PDF
Aula7 sql basico_6por_pag
PDF
Exercícios PL/SQL
PPT
Fundamentos de SQL - Parte 1 de 8
apostila de sql - oracle
Apostila de sql oracle
apostila-de-sql
Apostila de sql
Curso de sql
Aula7 sql basico_6por_pag
Exercícios PL/SQL
Fundamentos de SQL - Parte 1 de 8

Mais procurados (19)

PDF
Fundamentos SQL - Microsoft SQL Server 2019 - Parte 1/8
PPT
Fundamentos de SQL - Parte 4 de 8
PPT
Fundamentos de SQL - Parte 6 de 8
PPT
Fundamentos de SQL - Parte 3 de 8
PDF
2832014 curso plsql
PDF
Aula 6 sql - introdução
PDF
Um pouco sobre sql
PDF
Apostila de sql
PPTX
12 SQL - Junções / Join
PPTX
Curso de PostgreSQL: Um pouco Além dos Comandos
PPT
Inner Join
PDF
PPTX
Alterando a estrutura de uma tabela
DOCX
Sql - Comandos dml do mysql - parte 1
PDF
Aula 7 sql - select
PPT
3º Fast Show - SQL Analytics
PDF
Principais instruções em sql
Fundamentos SQL - Microsoft SQL Server 2019 - Parte 1/8
Fundamentos de SQL - Parte 4 de 8
Fundamentos de SQL - Parte 6 de 8
Fundamentos de SQL - Parte 3 de 8
2832014 curso plsql
Aula 6 sql - introdução
Um pouco sobre sql
Apostila de sql
12 SQL - Junções / Join
Curso de PostgreSQL: Um pouco Além dos Comandos
Inner Join
Alterando a estrutura de uma tabela
Sql - Comandos dml do mysql - parte 1
Aula 7 sql - select
3º Fast Show - SQL Analytics
Principais instruções em sql
Anúncio

Semelhante a Apostila de sql (20)

PDF
Apostila de sql oracle (pt br)
PDF
Apostila de sql_-_oracle__pt_br_
PPTX
Aula 12 banco de dados
DOCX
Sql linguagem
PDF
Sql server
PDF
Dicas oracle sql
PPTX
Treinamento de SQL Básico
PPT
Aula 11 - Conceitos de SQL Básicos, uso constante
DOCX
Tutoriavapihwjejejjeekkekekekekekl_SQL.docx
PPTX
PDF
07 sql - parte 01
PPTX
07 Consultando os dados de uma tabela
PDF
At00 apostila sql
PPTX
BD I - Aula 10 A - Introducao a SQL
PDF
Aula 9 Modelagem de Dados
PPTX
BD I - Aula 15 A - Comandos DML
PPT
CONCEITOS BASICOS DE BANCO DE DADOS COM SQL
PDF
Apostila de postgre
PDF
Funções integradas no sql
Apostila de sql oracle (pt br)
Apostila de sql_-_oracle__pt_br_
Aula 12 banco de dados
Sql linguagem
Sql server
Dicas oracle sql
Treinamento de SQL Básico
Aula 11 - Conceitos de SQL Básicos, uso constante
Tutoriavapihwjejejjeekkekekekekekl_SQL.docx
07 sql - parte 01
07 Consultando os dados de uma tabela
At00 apostila sql
BD I - Aula 10 A - Introducao a SQL
Aula 9 Modelagem de Dados
BD I - Aula 15 A - Comandos DML
CONCEITOS BASICOS DE BANCO DE DADOS COM SQL
Apostila de postgre
Funções integradas no sql
Anúncio

Apostila de sql

  • 1. APOSTILA DE SQL<br />O objetivo da Apostila é trazer os principais comandos<br />SQL usados em aplicações ORACLE, com exemplos, comentários e<br />explicações.2<br />FINALIDADE DO CAPITULO:<br />No final deste capitulo você será capaz de criar scripts<br />permitindo que o usuário entre com valores diversos.<br />A finalidade dos exemplos abaixo é demostrar como<br />permitir que o usuário entre com os valores que possibilitem<br />a execução de um comando SQL, isso tudo em tempo de<br />execução.<br />Verifique o uso do \" &\" que permite que o usuário entre<br />com dados. No exemplo abaixo temos um pedido de entrada de um<br />numero, por isso é que o &numero_do_dept não está entre<br />aspas. Podemos notar também que aparece o old valor e o new<br />valor, isso é devido ao cmdo set verify on, se quisermos que<br />não apareça, devemos usar o set verify off.<br />Vamos ao Exemplo:<br />SQL> set verify on<br />SQL> select id,last_name,salary<br /> 2 from s_emp<br /> 3 where dept_id=&numero_do_dept;<br />Enter value for numero_do_dept: 31<br />old 3: where dept_id=&numero_do_dept<br />new 3: where dept_id=31<br /> ID LAST_NAME SALARY<br />--------- ------------------------- ---------<br /> 3 Nagayama 1400<br /> 11 Magee 1400<br />Agora não aparecerá o new e old valor porque estamos<br />usando o SET VERIFY OFF.<br />SQL> set verify off<br />SQL> select id,last_name,salary<br /> 2 from s_emp<br /> 3 where dept_id=&numero_do_dept;<br />Enter value for numero_do_dept: 31<br /> ID LAST_NAME SALARY<br />--------- ------------------------- ---------3<br /> 3 Nagayama 1400<br /> 11 Magee 1400<br />Vimos anteriormente como que temos que proceder para que<br />o usuário entre com valores numéricos, para que seja<br />realizada<br />uma pesquisa, agora vamos possibilitar que o usuário ente com<br />valores do tipo caracter, a principal diferença é o uso das<br />aspas, mas temos que ter atenção para o formato na hora de<br />digitarmos, porque tem que ser o mesmo do conteúdo que está<br />na tabela, com maiúsculas e minúsculas.<br />Vamos ao Exemplo:<br />SQL> select id,last_name,salary<br /> 2 from s_emp<br /> 3 where title ='&job_title'; {possibilitando que o<br />usuário entre com o nome<br />do title}<br />Enter value for job_title: Stock Clerk<br /> ID LAST_NAME SALARY<br />--------- ------------------------- ---------<br /> 16 Maduro 1400<br /> 17 Smith 940<br /> 18 Nozaki 1200<br /> 19 Patel 795<br /> 20 Newman 750<br /> 21 Markarian 850<br /> 22 Chang 800<br /> 23 Patel 795<br /> 24 Dancs 860<br /> 25 Schwartz 1100<br />10 rows selected.<br />Nos exemplos anteriores o usuário entrou com a condição<br />de pesquisa quer seja numérica ou caracter, cada qual com<br />suas características, agora vamos ver como que<br />possibilitamos ao usuário entrar com o nome da coluna e com a<br />própria condição de pesquisa que será estabelecida na<br />cláusula WHERE. Neste caso temos um exemplo onde é requerida<br />a entrada de um dado numérico.4<br />Vamos ao exemplo:<br />SQL> select id,&nome_coluna<br /> 2 from s_emp<br /> 3 where &condição;<br />Enter value for nome_coluna: LAST_NAME<br />Enter value for condição: SALARY > 100<br /> ID LAST_NAME<br />--------- -------------------------<br /> 1 Velasquez<br /> 2 Ngao<br /> 3 Nagayama<br /> 4 Quick-To-See<br /> 5 Ropeburn<br /> 6 Urguhart<br /> 7 Menchu<br /> 8 Biri<br />Temos um outro exemplo em que o usuário entra com o<br />valor da coluna e da condição da WHERE.<br />SQL> select id,&nome_coluna<br /> 2 from s_ord<br /> 3 where &condição;<br />Enter value for nome_coluna: date_ordered<br />Enter value for condição: total>30000<br /> ID DATE_ORDE<br />--------- ---------<br /> 100 31-AUG-92<br /> 104 03-SEP-92<br /> 107 07-SEP-92<br /> 108 07-SEP-92<br /> 109 08-SEP-92<br /> 97 28-AUG-92<br />6 rows selected.5<br />CONSTRUINDO SCRIPTS USANDO OPÇÕES PARA O USUÁRIO ENTRE COM<br />DADOS E TAMBÉM PARA SÓ MOSTRAR NA TELA O PROMPT.<br />No exemplo abaixo estamos usando os seguintes comandos<br />que na da mais é do que a soma de tudo aquilo que vimos neste<br />capitulo mas também algo mais:<br />O cmdo SET ECHO OFF serve para em tempo de execução não<br />se exiba os comandos do SQL e SET ECHO ON serve para<br />retornar a forma anterior.<br />O cmdo ACCEPT serve para que preparemos um PROMPT para<br />receber um valor.<br />Neste exemplo também temos a criação de uma variável chamada<br />V_NAME que recebe valores.<br />Estamos preparando o ambiente para receber valores que<br />serão armazenados dentro de uma variável, para após isto,<br />serem feitas comparações dentro da cláusula WHERE.<br />Estamos usando duas tabelas S_DEPT e S_REGION, o AND é<br />uma função onde complementa a cláusula WHERE, e o UPPER no<br />DPT.NAME está passando o conteúdo do nome do dept para<br />maiúsculo para que seja efetuada a comparação com um nome que<br />será digitado pelo usuário, que por sua vez recebe um UPPER<br />que o transforma em maiúsculo. Essa alternativa é feita<br />porque não sabemos qual é o formato do dado na tabela.<br />Vamos ao exemplo:<br />SET ECHO OFF<br />ACCEPT V_NAME PROMPT 'DÊ O NOME DO DEPARTAMENTO:'<br />SELECT DPT.NAME, REG.ID, REG.NAME \" NOME DA REGIÃO\" <br />FROM S_DEPT DPT, S_REGION REG {veja a criação de apelidos}<br />WHERE DPT.REGION_ID = REG.ID {veja o join}<br />AND UPPER(DPT.NAME) LIKE UPPER('%&V_NAME%') {valor digitado }<br />/<br />SET ECHO ON<br />Como estamos gerando um SCRIPT, os comandos devem ficar<br />armazenados dentro de um arquivo que possua a extensão SQL e<br />preparado da forma descrita acima quando estivermos no SQL e<br />desejarmos executar o nosso SCRIPT temos que seguir o<br />procedimento descrito abaixo, usando \" @\" e o nome do arquivo,<br />ou \" START\" e o nome do arquivo.6<br />Vamos ao exemplo:<br />SET ECHO ON<br />SQL> @TEST.SQL<br />SQL> SET ECHO OFF<br />DÊ O NOME DO DEPARTAMENTO:sales<br />old 4: AND UPPER(DPT.NAME) LIKE UPPER('%&V_NAME%')<br />new 4: AND UPPER(DPT.NAME) LIKE UPPER('%sales%')<br />NAME ID NOME DA REGIÃO<br />------------------------- --------- -------------------------<br />--------------------<br />Sales 1 North America<br />Sales 2 South America<br />Sales 3 África / Middle East<br />Sales 4 Ásia<br />Sales 5 Europe<br />Podemos notar que por ocasião da execução o exemplo<br />anterior mostrou o OLD e o NEW valores da variável, para não<br />mostrar temos que usar o SET VERIFY OFF veja abaixo:<br />Vamos ao exemplo:<br />SET VERIFY OFF<br />SET ECHO OFF<br />ACCEPT V_NAME PROMPT 'DÊ O NOME DO DEPARTAMENTO:'<br />SELECT DPT.NAME, REG.ID, REG.NAME \" NOME DA REGIÃO\" <br />FROM S_DEPT DPT, S_REGION REG<br />WHERE DPT.REGION_ID = REG.ID<br />AND UPPER(DPT.NAME) LIKE UPPER('%&V_NAME%')<br />/<br />SET ECHO ON<br />Executando o SCRIPT:<br />SQL> START TEST.SQL<br />SQL> SET VERIFY OFF<br />SQL> SET ECHO OFF<br />DÊ O NOME DO DEPARTAMENTO:SALES<br />NAME ID NOME DA REGIÃO<br />------------------------- --------- -------------------------<br />--------------------<br />Sales 1 North America<br />Sales 2 South America7<br />Sales 3 Africa / Middle East<br />Sales 4 Ásia<br />Sales 5 Europe<br />Input truncated to 11 characters<br />OUTRO EXEMPLO DE GERAÇÃO DE SCRIPT:<br />Mais uma vez vamos usar alguns comandos já vistos em<br />exemplos anteriores, mas também alguns comandos novos e<br />precisamos<br />Mostrar a descrição de tais comandos:<br />O comando SET ECHO OFF tem a finalidade de não deixar<br />aparecer os cmdos feitos para a execução.<br />O cmdo VERIFY OFF tem a finalidade de não mostrar os<br />valores recebidos pelas as variáveis que no exemplo em<br />questão são MENOR_DT e MAIOR_DT.<br />O ACCEPT é usado para criar variáveis e o PROMPT para<br />receber valores para as variáveis.<br />Criadas as variáveis, observe a sintaxe e o \" -\" entre a<br />definição do formato de data o uso de DATE, o FORMAT e a<br />especificação 'MM/DD/YY'.<br />Estamos usando também o COLUMN FORMAT A30 para formatar<br />o tamanho da coluna EMPREGADO e logo depois estamos<br />concatenando as colunas FIRST_NAME e LAST_NAME.<br />Estamos também usando o BETWEEN para pesquisarmos<br />valores que estão entre uma data e outra.<br />Observe o uso do TO_DATE antes da colocação da variável<br />com o \" &\" para receber valores que o usuário digita, e<br />observe também a forma que foi colocado o formato da data<br />'MM/DD/YY' e o uso do AND que faz parte da WHERE.<br />O UNDEFINE serve para que as variáveis percam os valores<br />após a execução.<br />Vamos ao Exemplo:<br />SET ECHO OFF<br />SET VERIFY OFF<br />ACCEPT MENOR_DT DATE FORMAT 'MM/DD/YY' -<br />PROMPT 'ENTRE MENOR DATA (MM/DD/AA) :'<br />ACCEPT MAIOR_DT DATE FORMAT 'MM/DD/YY' -<br />PROMPT 'ENTRE MAIOR DATA (MM/DD/AA) :'<br />COLUMN EMPREGADO FORMAT A30<br />SELECT USERID,FIRST_NAME||' '||LAST_NAME \" EMPREGADO\" ,8<br />START_DATE FROM S_EMP<br />WHERE START_DATE BETWEEN TO_DATE('&MENOR_DT','MM/DD/YY')<br />AND TO_DATE('&MAIOR_DT','MM/DD/YY')<br />/<br />UNDEFINE MENOR_DT<br />UNDEFINE MAIOR_DT<br />COLUMN EMPREGADO CLEAR<br />SET ECHO ON<br />SET VERIFY ON<br />OUTRO EXEMPLO DE SCRIPT:<br />Estamos montando um script com a finalidade de receber<br />um valor que pesquise registros, no caso estamos querendo<br />pesquisar o ID e o NOME de um CUSTOMER e para isso recebendo<br />um dos nomes do CUSTOMER, por isso estamos usando o LIKE e<br />\" %&NOME%\" estamos transformando a coluna NAME da tabela a ser<br />pesquisada em maiúsculo para que qualquer nome que seja<br />digitado em maiúsculo seja pesquisado.<br />Está sendo criado a variável NOME pelo ACCEPT e o PROMPT<br />possibilita a recepção de um valor, observe a sintaxe \" -\" <br />após a variável NOME.<br />Vamos ao exemplo:<br />SET ECHO OFF<br />SET VERIFY OFF<br />ACCEPT NOME -<br />PROMPT ' ENTRE COM O NOME DESEJADO :'<br />SELECT ID, NAME FROM S_CUSTOMER<br />WHERE UPPER(NAME) LIKE '%&NOME%'<br />/<br />SET ECHO ON<br />SET VERIFY ON<br />FINAL DE CAPITULO9<br /> FINALIDADE DO CAPITULO:<br /> O COMANDO ALTER TABLE E SUAS VARIAÇÕES:<br />Adicionado uma coluna em uma tabela:<br />No exemplo a seguir estamos usando o cmdo ALTER TABLE<br />para adicionar uma coluna em uma tabela, a coluna adicionada<br />a tabela sempre será a última, importante saber que não<br />podemos deletar uma coluna de uma tabela mas somente<br />adicionar, se precisarmos dropar uma coluna a solução é<br />dropar a tabela e recriá – la sem a coluna.<br />Vamos ao exemplo:<br />SQL> ALTER TABLE S_REGION<br />ADD (comments VARCHAR(255));<br />Table altered.<br />O COMD MODIFY:<br />No exemplo abaixo estamos modificando uma coluna usando<br />o comando modify, no caso estamos aumentando o tamanho da<br />coluna title para 50, é permitido aumentar o tamanho da<br />coluna mas diminuir não é permitido.<br />SQL> ALTER TABLE s_emp<br /> 2 MODIFY (title VARCHAR(50));<br />Table altered.<br />ADCIONANDO UMA CONSTRAINT:<br />Para adicionarmos uma constraint temos que usar O ALTER TABLE<br />criar um nome para nossa constraint no<br />caso's_emp_maneger_id_fk', escrevendo de onde ela é colocando<br />a referência com o id de s_emp.<br />Vamos ao exemplo:<br />SQL><br />ALTER TABLE s_emp<br />ADD CONSTRAINT s_emp_manager_id_fk<br />FOREIGN KEY (MANAGER_ID)<br />REFERENCES s_emp(id)10<br />DROPANDO UMA CONSTRAINT:<br />Este exemplo mostra como dropar uma CONSTRAINT, Neste caso o<br />nome da constraint é s_emp_maneger_id_fk, verifique a forma<br />como foi escrito o exemplo abaixo:<br />SQL> ALTER TABLE S_EMP<br /> 2 DROP CONSTRAINT s_emp_manager_id_fk;<br />Table altered.<br />DROPANDO REGISTROS EMCACATA:<br />Para dropar uma chave primaria em cascata ou seja,<br />deletá - la de forma que seja deletada em todas as tabelas<br />com quem tenha relação, temos prosseguir da seguinte forma:<br />Vamos ao exemplo:<br />SQL> ALTER TABLE s_dept<br /> 2 DROP primary key cascade; {observe o cmdo cascade}<br />Table altered.<br />Desabilitando CONSTRAINTS de uma tabela:<br />Verifique o cmdo CACADE sendo usado no ALTER TABLE, a<br />finalidade de seu uso é permitir que todos os objetos que<br />fazem referência ao campo ID de S_EMP aceitem a desabilitação<br />da constraint.<br />Vamos ao exemplo:<br />SQL> ALTER TABLE s_emp<br /> 2 DISABLE CONSTRAINT s_emp_id_pk CASCADE;<br />Table altered.<br />Habilitando uma constraint:<br />Para habilitarmos uma constraint não precisamos usar o<br />cmdo cascade, porque é criada de forma automática<br />a UK ou FK.11<br />Vamos ao exemplo<br />SQL> ALTER TABLE s_emp<br /> 2 ENABLE CONSTRAINT s_emp_id_pk;<br />Table altered.<br />FINAL DE CAPITULO12<br />FINALIDADE DO CAPITULO:<br />O COMANDO SELECT TO_CHAR:<br />O exemplo abaixo temos um select que está selecionando<br />id,date_ordered da tabela s_ord onde o sales_rep_id é igual a<br />11, podemos notar que a date_ordered(data) é igual ao formato<br />de data padrão do oracle, ou seja, mês por extenso abreviado<br />e o ano com os dois últimos números do ano.<br />Vamos ao exemplo:<br />SQL> SELECT ID,DATE_ORDERED<br /> 2 FROM S_ORD<br /> 3 WHERE<br /> 4 SALES_REP_ID = 11;<br /> ID DATE_ORDE<br />--------- ---------<br /> 100 31-AUG-92<br /> 105 04-SEP-92<br /> 109 08-SEP-92<br /> 110 09-SEP-92<br /> 111 09-SEP-92<br />No exemplo abaixo estamos com o comando \" to_char \" mudando<br />o formato da data para o modelo que nós estamos querendo<br />mostrar em tela, ou seja, estamos mudando o formato padrão do<br />oracle para um novo formato correspondente ao que queremos,<br />no caso 'mm/yy' que corresponde ao mês e o ano.<br />Vamos ao exemplo:<br />SQL> SELECT ID,TO_CHAR(DATE_ORDERED,'MM/YY') ORDERED<br /> 2 FROM S_ORD<br /> 3 WHERE SALES_REP_ID = 11;<br /> ID ORDERED<br />--------- ------------------------------------------<br /> 100 08/92<br /> 105 09/92<br /> 109 09/92<br /> 110 09/92<br /> 111 09/9213<br />Agora vamos converter a data colocando o dia por extenso<br />ou seja usando, \" day\" (extenso), para o dia e colocando o mês<br />por extenso usando, \" month\" para mês e colocando o ano por<br />extenso usando o \" yyyy\" para ano.<br />Vamos ao Exemplo:<br />SELECT ID,TO_CHAR(DATE_ORDERED,'DAY/MONTH/YYYY') ORDERED<br />FROM S_ORD<br />WHERE SALES_REP_ID = 11<br /> ID ORDERED<br />--- ---------------------------------------------------------<br />100 MONDAY /AUGUST /1992<br />105 FRIDAY /SEPTEMBER/1992<br />109 TUESDAY /SEPTEMBER/1992<br />110 WEDNESDAY/SEPTEMBER/1992<br />111 WEDNESDAY/SEPTEMBER/1992<br />Agora estamos colocando o nome da ano escrito por<br />extenso usando a FUNÇÃO \" YEAR\" .<br />SELECT ID,TO_CHAR(DATE_ORDERED,'DAY/MONTH/YEAR') ORDERED<br /> FROM S_ORD<br />WHERE SALES_REP_ID = 11;<br /> ID ORDERED<br />---- -----------------------------------------------------<br /> 100 MONDAY /AUGUST /NINETEEN NINETY-TWO<br /> 105 FRIDAY /SEPTEMBER/NINETEEN NINETY-TWO<br /> 109 TUESDAY /SEPTEMBER/NINETEEN NINETY-TWO<br /> 110 WEDNESDAY/SEPTEMBER/NINETEEN NINETY-TWO<br /> 111 WEDNESDAY/SEPTEMBER/NINETEEN NINETY-TWO<br />Agora estamos usando o cmdo \" dy \" para mudar o dia da<br />semana, passando da escrita por extenso para abreviado em<br />três dígitos, observe o exemplo.<br />Vamos ao exemplo:<br />SQL> SELECT ID,TO_CHAR(DATE_ORDERED,'DY/MONTH/YEAR') ORDERED<br /> 2 FROM S_ORD<br /> 3 WHERE SALES_REP_ID = 11;14<br /> ID ORDERED<br />--------- ---------------------------------------------------<br /> 100 MON/AUGUST /NINETEEN NINETY-TWO<br /> 105 FRI/SEPTEMBER/NINETEEN NINETY-TWO<br /> 109 TUE/SEPTEMBER/NINETEEN NINETY-TWO<br /> 110 WED/SEPTEMBER/NINETEEN NINETY-TWO<br /> 111 WED/SEPTEMBER/NINETEEN NINETY-TWO<br />O exemplo abaixo demostra como colocar o dia em formato<br />numérico \" FMDD\" e o mês e o ano por extenso.<br /> Select LAST_NAME, TO_CHAR(START_DATE,'FMDD \" OF\" MONTH<br />YYYY') HIREDATE<br /> FROM S_EMP<br /> WHERE START_DATE LIKE '%91'<br />LAST_NAME<br />-----------------------<br />HIREDATE<br />-----------------------<br />Nagayama<br />17 OF JUNE 1991<br />Urguhart<br />18 OF JANUARY 1991<br />Havel<br />27 OF FEBRUARY 1991<br />Sedeghi<br />18 OF FEBRUARY 1991<br />Dumas<br />09 OF OCTOBER 1991<br />Nozaki<br />09 OF FEBRUARY 1991<br />Patel<br />LAST_NAME<br />-----------------------<br />HIREDATE<br />-----------------------<br />06 OF AUGUST 199115<br />Newman<br />21 OF JULY 1991<br />Markarian<br />26 OF MAY 1991<br />Dancs<br />17 OF MARCH 1991<br />Schwartz<br />09 OF MAY 1991<br />No exemplo abaixo estamos usando a função to_char<br />novamente, agora para formatarmos um numero e concatenarmos<br />uma coluna numérica com um comentário caracter.<br />Vamos ao Exemplo:<br />SQL><br /> SELECT 'O PEDIDO ' ||TO_CHAR(ID)||'<br /> TEM UM TOTAL DE: '||TO_CHAR(TOTAL,'FM$9,999,999')<br /> FROM S_ORD<br /> WHERE DATE_SHIPPED ='21-SEP-92'<br />/<br />'OPEDIDO'||TO_CHAR(ID)||'TEMUMTOTALDE:'||TO_CHAR(TOTAL,'FM$9,<br />999,999')<br />-------------------------------------------------------------<br />-----------<br />O PEDIDO 107<br />TEM UM TOTAL DE: $142,171<br />O PEDIDO 110<br />TEM UM TOTAL DE: $1,539<br />O PEDIDO 111<br />TEM UM TOTAL DE: $2,770<br />FINAL DE CAPÍTULO.16<br />Finalidade do Capitulo:<br />Demostrar o uso do Comando TO_DATE.<br />Verifique que no exemplo abaixo estamos querendo fazer uma<br />pesquisa usando um campo data onde escrevemos a data, o mês e<br />o ano e o cmdo to_date transforma o que digitamos em data<br />para a pesquisa, só que deve ser obedecida uma seqüência<br />lógica nas posições por isso o exemplo abaixo está incorreto.<br />Vamos ao exemplo:<br />SQL> SELECT DATE_ORDERED<br /> 2 FROM S_ORD<br /> 3 WHERE DATE_ORDERED =<br /> 4 TO_DATE('31 1992, AUGUST','DD MONTH, YYYY');<br />ERROR:<br />ORA-01843: not a valid month<br />Vamos tentar corrigir o exemplo acima. A função do cmdo<br />to_date é converter valores digitados, numéricos e caracters<br />para data, a ordem da data procurada no exemplo abaixo tem<br />que ser a mesma do formato de data colocado da seguinte<br />forma:<br />SQL> SELECT DATE_ORDERED<br /> 2 FROM S_ORD<br /> 3 WHERE DATE_ORDERED =<br /> 4 TO_DATE('31 1992, AUGUST','DD, YYY MONTH');<br />DATE_ORDE<br />---------<br />31-AUG-92<br />31-AUG-92<br />31-AUG-92<br />31-AUG-92<br />31-AUG-92<br />FINAL DE CAPÍTULO17<br />Finalidade do Capítulo:<br />Demostrar o uso dos comandos COMMIT,ROLLBACK E SAVE<br />POINT.<br />Os cmdos COMMIT , ROLLBACK e SAVE POINT são usados para<br />controle de execução, de confirmação e de retorno.Veja abaixo<br />que estamos alterando o valor de SALARY na tabela S_EMP<br />usando o UPDATE e SET, após alterá-los nós criamos um<br />SAVEPOINT, que serve simplesmente para o controle de ponto,<br />para se quisermos dar um ROLLBACK nas alterações feitas até<br />então, termos condições de limitar o espaço atingindo pelo<br />ROLLBACK.<br />Vamos ao Exemplo de Update:<br />SQL> EDIT<br />Wrote file afiedt.buf<br /> 1 UPDATE S_EMP<br /> 2 SET SALARY = SALARY * 1.1<br /> 3* WHERE TITLE ='Stock Clerk'<br />SQL> /<br />10 rows updated.<br />Agora vamos criar um SAVEPOINT.<br />Vamos ao Exemplo:<br />SQL> savepoint update_ponto;<br />Savepoint created.<br />Agora usando o cmdo INSERT INTO estamos inserindo<br />registros<br /> na tabela s_region.<br />SQL> insert into s_region (id,name)<br /> 2 values (8,'central');<br />1 row created.<br />Estamos selecionando os registros de s_region para<br />confirmamos a inserção ou seja, se realmente foi incluído<br />registros nesta tabela.18<br />SQL> select * from<br /> 2 s_region<br /> 3 where id = 8;<br /> ID NAME<br />--------- ------------------------------------<br /> 8 central<br />Agora após confirmarmos a inclusão dos registros, nós<br />decidirmos que não queremos que seja incluído registros na<br />referida tabela s_region e para voltarmos a nossa ação temos<br />então que dar um ROLLBACK, para desfazer o INSERT, só que<br />somente até o ponto da inserção, ou seja até o SAVE POINT,<br />que foi criado anteriormente ou seja tudo que está antes do<br />SAVE POINT continua com suas alterações preservadas, é bom<br />observar que para o SAVE POINT foi criado um nome no caso<br />UPDATE_PONTO, isso serve para que possamos referenciar de<br />forma correta até que ponto queremos cancelar nossas ações ou<br />seja até que ponto não queremos que sejam salvas nossas<br />ações.<br />Vamos ao exemplo:<br />SQL> ROLLBACK TO UPDATE_PONTO;<br />Rollback complete.<br />Agora vamos dar novamente um select para confirmarmos se<br />o nosso ROLLBACK realmente fez efeito, observe que as<br />alterações feitas anteriormente não foram concretizadas.<br />SQL> select * from<br /> 2 s_region<br /> 3 where id = 8;<br />no rows selected<br />O CMDO ROLLBACK serve para que seja desfeitas as<br />alterações que foram efetuadas em uma tabela.<br />Vamos ao exemplo:<br />SQL> delete from test;<br />25,000 rows deleted<br />para cancelar o DELETE na tabela test.19<br />SQL> ROLLBACK;<br />Rollback complete.<br />O uso do COMMIT:<br />O CMDO COMMIT é o contrário do ROLLBACK ou seja serve<br />para confirmar as alterações que por ventura sejam feitas.<br />Uma vez dado um COMMIT não podemos retornar mais atrás.<br />SQL> delete from test;<br />25,000 rows deleted<br />Vamos confirmar o DELETE com o COMMIT.<br />SQL> COMMIT;<br />Commit complete.<br />FINAL DE CAPÍTULO20<br />Finalidade do Capítulo é demostrar como criar comentários<br />a respeito de tabelas.<br />O comentários criado a respeito de tabelas e colunas<br />são armazenados no dicionário de dados em:<br />ALL_COL_COMMENTS<br />USER_COL_COMMENTS<br />ALL_TAB_COMMENTS<br />USER_TAB_COMMENTS<br />Criando comentários para uma tabela:<br />SQL> COMMENT ON TABLE s_emp is ' informação sobre<br />funcionário';<br />Comment created.<br />Como criar comentários para uma coluna:<br />SQL> COMMENT ON COLUMN s_emp.last_name IS ' ultimo';<br />Comment created.COMMENT ON COLUMN s_emp.last_name IS '<br />último'<br />Como verificar os comentários existentes dentro de uma<br />tabela ou coluna:<br />Primeiramente vamos verificar os comentários relativos<br />as colunas pertencentes a uma tabela all_col_comments, para<br />depois realizarmos um select em seu conteúdo pesquisando pelo<br />nome da tabela ou coluna para sabermos qual é o comentário<br />específico a respeito.<br />SQL> desc all_col_comments<br /> Name Null? Type<br /> ------------------------------- -------- ----<br /> OWNER NOT NULL VARCHAR2(30)<br /> TABLE_NAME NOT NULL VARCHAR2(30)<br /> COLUMN_NAME NOT NULL VARCHAR2(30)<br /> COMMENTS VARCHAR2(2000)21<br />Vamos realizando um SELECT ALL_COL_COMMENTS para<br />vermos quais os comentários relativos a todas as colunas da<br />tabela s_emp que são armazenados em COMMENTS :<br />SQL> select COMMENTS<br /> 2 from all_col_comments<br /> 3 where TABLE_NAME = 'S_EMP';<br />COMMENTS<br />------------<br /> ultimo<br />COMMENTS<br />------------<br />Agora queremos saber o comentário a respeito da tabela s_emp<br />veja abaixo:<br />SQL> SELECT COMMENTS<br /> 2 FROM ALL_TAB_COMMENTS<br /> 3 WHERE TABLE_NAME ='S_EMP';<br />COMMENTS<br />----------------------------------<br /> informação sobre funcionário<br />FIM DE CAPÍTULO22<br />Finalidade do Capítulo Tratar de Assuntos Relativos a<br />Constraints.<br />Vamos ver como verificar as constraints de uma tabela<br />O seus tipos e nomes ou seja se é not null, se é foreing<br />key,unique key ou primary key.<br />SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE,<br />SEARCH_CONDITION,<br /> 2 R_CONSTRAINT_NAME<br /> 3 FROM USER_CONSTRAINTS<br /> 4 WHERE TABLE_NAME = 'S_DEPT';<br />CONSTRAINT_NAME C<br />------------------------------ -<br />SEARCH_CONDITION<br />-------------------------------------------------------------<br />-------------------<br />R_CONSTRAINT_NAME<br />------------------------------<br />S_DEPT_ID_NN C<br />ID IS NOT NULL<br />S_DEPT_NAME_NN C<br />NAME IS NOT NULL<br />S_DEPT_ID_PK P<br />S_DEPT_NAME_REGION_ID_UK U<br />S_DEPT_REGION_ID_FK R<br />----------------------------<br />S_REGION_ID_PK23<br />Para vermos o nome das colunas envolvidas com<br />constraints e seus respectivos nomes naturais temos que fazer<br />um select na tabela user_cons_columns conforme o exemplo a<br />seguir:<br />SQL> SELECT CONSTRAINT_NAME, COLUMN_NAME<br /> 2 FROM USER_CONS_COLUMNS<br /> 3 WHERE TABLE_NAME = 'S_DEPT';<br />CONSTRAINT_NAME COLUMN_NAME<br />------------------------------ ---------------------<br />S_DEPT_ID_NN ID<br />S_DEPT_ID_PK ID<br />S_DEPT_NAME_NN NAME<br />S_DEPT_NAME_REGION_ID_UK NAME<br />S_DEPT_NAME_REGION_ID_UK REGION_ID<br />S_DEPT_REGION_ID_FK REGION_ID<br />6 rows selected.<br />FINAL DE CAPÍTULO24<br />Finalidade do Capítulo é o Uso do Create, Drop Table.<br />O comando DROP é usado para deletar a tabela ou seja,<br />apagá-la fisicamente.<br />O comando CREATE é usado na criação de tabelas e o<br />INSERT na inserção de dados em tabelas.<br />Vamos ao exemplo de como DROPAR uma tabela, VIEW ou SEQUENCE:<br />DROP TABLE EMP;<br />DROP TABLE DEPT;<br />DROP TABLE BONUS;<br />DROP TABLE SALGRADE;<br />DROP TABLE DUMMY;<br />DROP TABLE ITEM;<br />DROP TABLE PRICE;<br />DROP TABLE PRODUCT;<br />DROP TABLE ORD;<br />DROP TABLE CUSTOMER;<br />DROP VIEW SALES;<br />DROP SEQUENCE ORDID;<br />DROP SEQUENCE CUSTID;<br />DROP SEQUENCE PRODID;<br />Vamos ao exemplo de como criar uma tabela, observe os<br />detalhes em relação aos parênteses, nome das colunas ,data<br />type e constraints.<br />CREATE TABLE DEPT (<br /> DEPTNO NUMBER(2) NOT NULL,<br /> DNAME CHAR(14),<br /> LOC CHAR(13),<br /> CONSTRAINT DEPT_PRIMARY_KEY PRIMARY KEY (DEPTNO));<br />Após criarmos a tabela vamos inserir dados a mesma, em<br />um comando INSERT<br />INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');<br />INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');<br />INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');<br />INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON');25<br />CREATE TABLE EMP<br />( EMPNO NUMBER(4) NOT NULL,<br /> ENAME CHAR(10),<br /> JOB CHAR(9),<br /> MGR NUMBER(4) CONSTRAINT EMP_SELF_KEY<br />REFERENCES EMP (EMPNO),<br /> HIREDATE DATE,<br /> SAL NUMBER(7,2),<br /> COMM NUMBER(7,2),<br /> DEPTNO NUMBER(2) NOT NULL,<br /> CONSTRAINT EMP_FOREIGN_KEY FOREIGN KEY (DEPTNO) REFERENCES<br />DEPT (DEPTNO),<br /> CONSTRAINT EMP_PRIMARY_KEY PRIMARY KEY (EMPNO));<br />Inserindo Registros na Tabela Criada Usando o cmdo INSERT.<br />INSERT INTO EMP VALUES (7839,'KING','PRESIDENT',NULL,'17-NOV-<br />81',5000,NULL,10);<br />INSERT INTO EMP VALUES (7698,'BLAKE','MANAGER',7839,'1-MAY-<br />81',2850,NULL,30);<br />INSERT INTO EMP VALUES (7782,'CLARK','MANAGER',7839,'9-JUN-<br />81',2450,NULL,10);<br />INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,'2-APR-<br />81',2975,NULL,20);<br />INSERT INTO EMP VALUES (7654,'MARTIN','SALESMAN',7698,'28-<br />SEP-81',1250,1400,30);<br />INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,'20-FEB-<br />81',1600,300,30);<br />INSERT INTO EMP VALUES (7844,'TURNER','SALESMAN',7698,'8-SEP-<br />81',1500,0,30);<br />INSERT INTO EMP VALUES (7900,'JAMES','CLERK',7698,'3-DEC-<br />81',950,NULL,30);<br />INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,'22-FEB-<br />81',1250,500,30);<br />INSERT INTO EMP VALUES (7902,'FORD','ANALYST',7566,'3-DEC-<br />81',3000,NULL,20);<br />INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,'17-DEC-<br />80',800,NULL,20);<br />INSERT INTO EMP VALUES (7788,'SCOTT','ANALYST',7566,'09-DEC-<br />82',3000,NULL,20);<br />INSERT INTO EMP VALUES (7876,'ADAMS','CLERK',7788,'12-JAN-<br />83',1100,NULL,20);<br />INSERT INTO EMP VALUES (7934,'MILLER','CLERK',7782,'23-JAN-<br />82',1300,NULL,10);26<br />Outro Exemplo de Como Criar uma Tabela:<br />CREATE TABLE BONUS (<br /> ENAME CHAR(10),<br /> JOB CHAR(9),<br /> SAL NUMBER,<br /> COMM NUMBER);<br />CREATE TABLE SALGRADE (<br /> GRADE NUMBER,<br /> LOSAL NUMBER,<br /> HISAL NUMBER);<br />Inserindo Valores na Nova Tabela.<br />INSERT INTO SALGRADE VALUES (1,700,1200);<br />INSERT INTO SALGRADE VALUES (2,1201,1400);<br />INSERT INTO SALGRADE VALUES (3,1401,2000);<br />INSERT INTO SALGRADE VALUES (4,2001,3000);<br />INSERT INTO SALGRADE VALUES (5,3001,9999);<br />Para criarmos uma tabela temos antes que mais nada ter<br />permissão para isto ou seja “GRANT”, que nos é concedido<br />através do DBA, depois não podemos nos esquecer de criar as<br />CONSTRAINTS que são as PK os campos NOT NULL as FK. O observe<br />a sintaxe da criação de tabela, a definição do tipo e tamanho<br />das colunas ( Data Type), a referencia a chave estrangeira e<br />a criação, as colunas de formato DATE usa-se o padrão<br />SYSDATE que corresponde a data do sistema.<br />Vamos ao Exemplo:<br />CREATE TABLE S_TEST<br />(ID NUMBER(7)<br />CONSTRAINT S_TEST_ID_PK PRIMARY KEY,<br />NAME VARCHAR2(25)<br />CONSTRAINT S_TEST_NAME_NN NOT NULL,<br /> REGION_ID NUMBER(7)<br />CONSTRAINT S_TEST_REGION_ID_FK REFERENCES<br />S_REGION(ID),<br />START_DATE DATE DEFAULT SYSDATE)<br />/27<br />No próximo exemplo vamos criar uma tabela em função de<br />uma outra onde se traz somente as constrains NOT NULL, o tipo<br />e tamanho das colunas são também automaticamente trazidos,<br />assim também como o conteúdo dos mesmos. Verifique o exemplo<br />abaixo como isto é feito e veja o formato de S_EMP e o novo<br />formato do que chamamos de EMP_41, veja também que ele<br />somente traz os registros referentes ao dept 41. Observe a<br />sintaxe \" AS\" e a sub query dentro do Create table.<br />SQL> Create table emp_41<br /> 2 AS<br /> 3 SELECT ID,LAST_NAME,USERID,START_DATE,<br /> 4 SALARY,TITLE<br /> 5 FROM S_EMP<br /> 6 WHERE DEPT_ID = 41;<br />Table created.<br />O formato da tabela criada, é o mesmo da s_emp veja:<br />SQL> DESC EMP_41<br /> Name Null? Type<br /> ------------------------------- -------- ----<br /> ID NOT NULL NUMBER(7)<br /> LAST_NAME NOT NULL VARCHAR2(25)<br /> USERID NOT NULL VARCHAR2(8)<br /> START_DATE DATE<br /> SALARY NUMBER(11,2)<br /> TITLE VARCHAR2(25)<br />SQL> desc s_emp<br /> Name Null? Type<br /> ------------------------------- -------- ----<br /> ID NOT NULL NUMBER(7)<br /> LAST_NAME NOT NULL VARCHAR2(25)<br /> FIRST_NAME VARCHAR2(25)<br /> USERID NOT NULL VARCHAR2(8)<br /> START_DATE DATE<br /> COMMENTS VARCHAR2(255)<br /> MANAGER_ID NUMBER(7)<br /> TITLE VARCHAR2(25)<br /> DEPT_ID NUMBER(7)<br /> SALARY NUMBER(11,2)<br /> COMMISSION_PCT NUMBER(4,2)28<br />Veja os dados da nova tabela.<br />SQL> select id,last_name<br /> 2 from EMP_41;<br /> ID LAST_NAME<br />--------- -------------------------<br /> 2 Ngao<br /> 6 Urguhart<br /> 16 Maduro<br /> 17 Smith<br />Observe que os dados abaixo são os mesmos da tabela<br />criada que foram justamente criada a partir do departamento<br />41.<br />SQL> select id,last_name<br /> 2 from s_emp<br /> 3 where dept_id = 41;<br /> ID LAST_NAME<br />--------- ------------------------<br /> 2 Ngao<br /> 6 Urguhart<br /> 16 Maduro<br /> 17 Smith<br />Como descobrir quais são as tabelas que estão a nossa<br />disposição:<br />select object_name from user_Objects<br /> where object_type = 'TABLE';<br />FIM DE CAPÍTULO29<br />Finalidade do Capítulo:<br />Demostrar o uso do comando DELETE:<br />O Cmdo DELETE serve para delatarmos registros em uma<br />tabela, usamos o DELETE from e o nome da tabela.Neste exemplo<br />abaixo estamos querendo deletar todos<br />os registros da tabela s_emp que tenham como start_date<br />o dia 01.01.1996, para isso temos que usar na clausula WHERE<br />o TO_DATE colocando o valor do que nós estamos querendo e seu<br />correspondente dia, mês e ano conforme o formato, no caso não<br />deletou nenhum registro porque não existia nenhum que<br />satisfazia as condições.<br />Vamos ao exemplo:<br />SQL> EDIT<br />Wrote file afiedt.buf<br /> 1 DELETE FROM s_emp<br /> 2 WHERE START_DATE ><br /> 3* TO_DATE ('01.01.1996','DD.MM.YYYY')<br />SQL> /<br />0 rows deleted<br />Agora estamos tentando deletar um registro que existe,<br />como o registro existente é uma FK que logicamente existe uma<br />outra tabela não se aceita a deleção, veja a mensagem de erro<br />de violação de constraint.<br />SQL> DELETE FROM s_emp<br />2 WHERE START_DATE > TO_DATE ('01.01.1991','dd.mm.yyyy');<br />DELETE FROM s_emp<br /> *<br />ERROR at line 1:<br />ORA-02292: integrity constraint<br />(GUIMA.S_WAREHOUSE_MANAGER_ID_FK)<br />violated - child record found<br />Para deletar todos os registros de uma tabela procede-se da<br />seguinte forma:<br />SQL> DELETE FROM test;<br />25,000 rows deleted.30<br />Para confirmarmos a deleção usamos o comando select na table<br />deletada.<br />SELECT * FROM<br />2 test;<br />no rows selected;<br />FIM DE CAPÍTULO31<br />Finalidade do Capítulo é Mostrar com Trabalhar com o<br />Dicionário de Dados.<br />O dicionário de dados serve dentre outras coisas para<br />possibilitar a visualização de quais objetos que estão<br />disponíveis para manipulação, por exemplo: se temos acesso a<br />tabelas, views ou etc.<br />No exemplo abaixo estamos fazendo um select na tabela<br />user_objects usando o comando 'distinct' com a finalidade de<br />vermos quais os objetos a serem manipulados.<br />Vamos ao exemplo:<br />SQL> SELECT DISTINCT OBJECT_TYPE<br /> 2 FROM USER_OBJECTS;<br />OBJECT_TYPE<br />-------------<br />INDEX<br />SEQUENCE<br />TABLE<br />/<br />Para vermos quais são as tabelas ou outros objetos que<br />estão a nossa disposição, ou seja aqueles que temos permissão<br />para manipulá – los temos que fazer um select no dicionário<br />de dados, incluindo neste o object_name na tabela<br />user_objects usando o tipo desejado 'table' ou 'view' e etc.<br />SELECT OBJECT_NAME<br />FROM USER_OBJECTS<br />WHERE OBJECT_TYPE = 'TABLE'<br />/<br />OBJECT_NAME<br />---------------------<br />FUNCIONÁRIO<br />SEÇÃO<br />S_CUSTOMER<br />S_DEPT<br />S_EMP<br />S_IMAGE<br />S_INVENTORY<br />S_ITEM<br />S_LONGTEXT<br />S_ORD<br />S_PRODUCT32<br />S_REGION<br />S_TITLE<br />S_WAREHOUSE<br />14 rows selected.<br />Ainda usando o dicionário de dados podemos verificar<br />quais são as constraints de uma tabela, é bom lembrar que<br />estamos fazendo uma consulta na tabela USER_CONSTRAITS que<br />assim como a USER_OBJECTS pertence ao dicionário de dados.<br />SQL> select constraint_name,constraint_type,search_condition,<br /> r_constraint_name<br /> 2 from user_constraints<br /> 3 where table_name = 'S_EMP';<br />CONSTRAINT C SEARCH_CONDITION R_CONSTRAINT_NAME<br />---------- - ------------------ ---------------------<br />S_EMP_ID_N C ID IS NOT NULL<br />N<br />S_EMP_LAST C LAST_NAME IS NOT N<br />_NAME_NN ULL<br />S_EMP_USER C USERID IS NOT NULL<br />ID_NN<br />S_EMP_ID_P P<br />K<br />S_EMP_USER U<br />ID_UK<br />S_EMP_COMM C commission_pct IN<br />ISSION_PCT (10, 12.5, 15, 17.<br />_CK 5, 20)<br />S_EMP_MANA R S_EMP_ID_PK<br />GER_ID_FK<br />CONSTRAINT C SEARCH_CONDITION R_CONSTRAINT_NAME<br />---------- - ------------------ ---------------------<br />S_EMP_DEPT R S_DEPT_ID_PK33<br />_ID_FK<br />S_EMP_TITL R S_TITLE_TITLE_PK<br />E_FK<br />9 rows selected.<br />Tentando refinar ainda mais o exemplo acima vamos<br />verificar quais são as constraints referentes as colunas de<br />uma determinada tabela que no caso é a s_emp.<br />Vamos ao Exemplo:<br />SQL><br /> SELECT CONSTRAINT_NAME,COLUMN_NAME<br /> FROM USER_CONS_COLUMNS<br /> WHERE TABLE_NAME ='S_EMP'<br />CONSTRAINT_NAME COLUMN_NAME<br />------------------------- -------------------<br />S_EMP_COMMISSION_PCT_CK COMMISSION_PCT<br />S_EMP_DEPT_ID_FK DEPT_ID<br />S_EMP_ID_NN ID<br />S_EMP_ID_PK ID<br />S_EMP_LAST_NAME_NN LAST_NAME<br />S_EMP_MANAGER_ID_FK MANAGER_ID<br />S_EMP_TITLE_FK TITLE<br />S_EMP_USERID_NN USERID<br />S_EMP_USERID_UK USERID<br />9 rows selected.<br />FIM DE CAPÍTULO<br />Finalidade deste capítulo é apresentar o uso de funções<br />de grupo do cmdo group by, funções de grupo MAX,MIN,SUM,AVG e<br />ainda o uso do HAVING:<br />Dica importante: geralmente o que está dentro do comando<br />select deve estar no group by.<br />Neste exemplo estamos vendo o uso da função AVG que tem a<br />finalidade de trazer a média de uma determinada soma. Estamos<br />também usando a função MAX e MIN que tem como função trazer o<br />máximo e o mínimo valor. Também temos a função SUM que faz a<br />soma de valores de colunas, todas essas funções são funções<br />de grupo. Ainda no exemplo abaixo temos o uso da função UPPER<br />que transforma o conteúdo a ser pesquisado e a função LIKE<br />que faz a pesquisa somente nos registros que começarem por<br />'sales'.<br />SQL> select avg(SALARY),MAX(SALARY),MIN(SALARY),<br /> 2 SUM(SALARY)<br /> 3 FROM S_EMP<br /> 4 WHERE UPPER(TITLE) LIKE 'SALES%';<br />AVG(SALARY) MAX(SALARY) MIN(SALARY) SUM(SALARY)<br />----------- ----------- ----------- -----------<br /> 1476 1525 1400 7380<br />Neste exemplo abaixo, temos o menor nome e o maior nome<br />dentro da ordem alfabética, demostrando que não somente os<br />valores numéricos que são manipuláveis com as funções MIN e<br />MAX, é bom salientar que as datas também são passíveis de<br />manipulação.<br />Vamos ao exemplo:<br />SQL> select MIN(LAST_NAME),MAX(LAST_NAME)<br /> 2 FROM S_EMP;<br />MIN(LAST_NAME) MAX(LAST_NAME)<br />------------------------- -------------------------<br />Biri Velasquez35<br />No exemplo abaixo estamos tentando selecionar o ID de<br />departamento igual a 41 trazendo seu numero de repetições,<br />mas não dá certo pois a função COUNT é de grupo e não estamos<br />usando o GROUP BY.<br />Vamos ao exemplo:<br />SQL> select dept_id, count(*) \" number\" <br /> 2 from s_emp<br /> 3 where dept_id = 41;<br />select dept_id, count(*) \" number\" <br /> *<br />ERROR at line 1:<br />ORA-00937: not a single-group group function<br />Fazendo o select abaixo temos quantas vezes o dept 41 se<br />repete.<br />SQL> select dept_id<br /> 2 from s_emp<br /> 3 where dept_id = 41;<br /> DEPT_ID<br />---------<br /> 41<br /> 41<br /> 41<br /> 41<br />Agora usando a função de grupo COUNT(*) que no caso esta<br />contando a quantidade de registros onde o dept_id é igual a<br />41 ou seja quantas vezes ele se repete, teremos o grupamento<br />feito. O que está no select deve estar no group by.<br />Vamos ao exemplo:<br />SQL> select dept_id, count(*) \" number\" <br /> 2 from s_emp<br /> 3 where dept_id = 41<br /> 4 group by dept_id;<br /> DEPT_ID number<br />--------- ---------<br /> 41 436<br />Agora estamos contando quantos registros temos para cada<br />CREDIT_RATING da tabela s_customer.<br />SQL> select credit_rating,count(*) \" # custo\" <br /> 2 from s_customer<br /> 3 group by credit_rating;<br />CREDIT_RA # custo<br />--------- ---------<br />EXCELLENT 9<br />GOOD 3<br />POOR 3<br />No próximo exemplo é bom destacar o uso do NOT LIKE onde<br />determina que não seja trazido registros parecidos com uma<br />uma certa condição. Veja também o uso da função de grupo SUM<br />que trás a soma dos salários.<br />SQL> select title, sum(salary) soma_total<br /> 2 from s_emp<br /> 3 where title not like 'VP%'<br /> 4 group by title<br /> 5 order by<br /> 6 sum(salary);<br />TITLE SOMA_TOTAL<br />------------------------- ----------<br />President 2500<br />Warehouse Manager 6157<br />Sales Representative 7380<br />Stock Clerk 9490<br />Um outro exemplo do uso de ORDER BY, onde estamos<br />grupando por Title.<br />SQL> select title,max(salary)<br /> 2 from s_emp<br /> 3 group by title;<br />TITLE MAX(SALARY)<br />------------------------- -----------<br />President 2500<br />Sales Representative 1525<br />Stock Clerk 1400<br />VP, Administration 1550<br />VP, Finance 145037<br />VP, Operations 1450<br />VP, Sales 1400<br />Warehouse Manager 1307<br />8 rows selected.<br />Nossa intenção no select abaixo é fazermos a média dos<br />salários dos campos da coluna SALARY da tabela s_emp, e<br />trazer a tela somente a média que der acima de 2000.<br />Não dá certo porque não usamos a clausula where dentro do<br />group by mas sim a função HAVING, isso quando queremos<br />trazer dados a tela obedecendo uma certa condição.<br />SQL> SELECT DEPT_ID,AVG(SALARY)<br /> 2 FROM S_EMP<br /> 3 WHERE AVG(SALARY) > 2000<br /> 4 GROUP BY DEPT_ID;<br />WHERE AVG(SALARY) > 2000<br /> *<br />ERROR at line 3:<br />ORA-00934: group function is not allowed here<br />Veja a maneira correta de se fazer o exercício anterior<br />onde usamos a função HAVING que se dá da seguinte forma ,<br />sempre após o group by.<br />SQL> SELECT DEPT_ID,AVG(SALARY)<br /> 2 FROM S_EMP<br /> 3 GROUP BY DEPT_ID<br /> 4 HAVING AVG(SALARY) > 2000;<br /> DEPT_ID AVG(SALARY)<br />--------- -----------<br /> 50 2025S<br />No exemplo abaixo estamos selecionando, contando e<br />separando em grupos os departamentos isso pelo dept_id e<br />depois o title, perceba a seqüência do grupo.<br />SQL> select dept_id,title, count(*)<br /> 2 from s_emp<br /> 3 group by dept_id,title;<br /> DEPT_ID TITLE COUNT(*)<br />--------- ------------------------- ---------38<br /> 10 VP, Finance 1<br /> 31 Sales Representative 1<br /> 31 VP, Sales 1<br /> 32 Sales Representative 1<br /> 33 Sales Representative 1<br /> 34 Sales Representative 1<br /> 34 Stock Clerk 1<br /> 35 Sales Representative 1<br /> 41 Stock Clerk 2<br /> 41 VP, Operations 1<br /> 41 Warehouse Manager 1<br /> 42 Stock Clerk 2<br /> 42 Warehouse Manager 1<br /> 43 Stock Clerk 2<br /> 43 Warehouse Manager 1<br /> 44 Stock Clerk 1<br /> 44 Warehouse Manager 1<br /> 45 Stock Clerk 2<br /> 45 Warehouse Manager 1<br /> 50 President 1<br /> 50 VP, Administration 1<br />21 rows selected.<br />Agora estamos grupando primeiro pelo title e depois pelo<br />dept_id, veja a diferença.<br />SQL> select title,dept_id, count(*)<br /> 2 from s_emp<br /> 3 group by title,dept_id;<br />TITLE DEPT_ID COUNT(*)<br />------------------------- --------- ---------<br />President 50 1<br />Sales Representative 31 1<br />Sales Representative 32 1<br />Sales Representative 33 1<br />Sales Representative 34 1<br />Sales Representative 35 1<br />Stock Clerk 34 1<br />Stock Clerk 41 2<br />Stock Clerk 42 2<br />Stock Clerk 43 2<br />Stock Clerk 44 1<br />Stock Clerk 45 2<br />VP, Administration 50 139<br />VP, Finance 10 1<br />VP, Operations 41 1<br />VP, Sales 31 1<br />Warehouse Manager 41 1<br />Warehouse Manager 42 1<br />Warehouse Manager 43 1<br />Warehouse Manager 44 1<br />Warehouse Manager 45 1<br />Observe o uso do HAVING em substituição a clausula<br />WHERE, além de outros SELECTS.<br />Quando quisermos trazer um registro que inicie por uma<br />letra qualquer temos podemos usamos o cmdo LIKE procedendo da<br />seguinte forma:<br />SQL> select last_name, title<br /> 1 from s_emp<br /> 2 where last_name like 'V%'<br />LAST_NAME TITLE<br />------------------------- -------------------------<br />Velasquez President<br />No exemplo abaixo estamos fazendo a seleção de todos os<br />cargos de funcionários existentes assim como contando seus<br />componentes COUNT e ainda trazendo as suas respectivas<br />medias salariais usando a função AVG, multiplicadas por 12.<br />SQL> SELECT TITLE, 12 * AVG(SALARY) \" Salário Anual\" ,<br /> 2 count(*) \" numero de funcionários\" <br /> 3 from s_emp<br /> 4 group by title;<br />TITLE Salário Anual numero de funcionários<br />President $30,000.00 1<br />Sales Representative $17,712.00 5<br />Stock Clerk $11,388.00 10<br />VP, Administration $18,600.00 1<br />VP, Finance $17,400.00 1<br />VP, Operations $17,400.00 1<br />VP, Sales $16,800.00 140<br />Warehouse Manager $14,776.80 5<br />8 rows selected.<br />Um pouco diferente do exemplo anterior o abaixo está<br />primeiramente formatando a coluna Salário Anual para receber<br />valores após ter sido feito um select em TITLE. Estamos<br />multiplicando por 12 a soma da média dos salários feita pela<br />função AVG, e então usamos a função COUNT para contar o<br />numero de funcionários de s_emp grupados por title e que<br />tenha no máximo 2 funcionários, olhando para o exemplo<br />anterior podemos entender melhor e também destacar que o<br />HAVING está fazendo a função de um WHERE dentro do GROUP BY.<br />Vamos ao Exemplo:<br />SQL> column \" Salário Anual\" FORMAT $99,999.99<br />SQL> SELECT TITLE, 12 * AVG(SALARY) \" Salário Anual\" ,<br /> 2 count(*) \" numero de funcionários\" <br /> 3 from s_emp<br /> 4 group by title<br /> 5 having count(*) > 2;<br />TITLE Salário Anual numero de funcionários<br />------------------------- -------------- --------------------<br />Sales Representative $17,712.00 5<br />Stock Clerk $11,388.00 10<br />Warehouse Manager $14,776.80 5<br />Mais um exemplo do uso do HAVING:<br />SQL> select title,sum(salary) soma<br /> 2 from s_emp<br /> 3 where title not like'VP%'<br /> 4 group by title<br /> 5 having sum(salary) > 5000<br /> 6 order by sum(salary);<br />TITLE SOMA<br />------------------------- ---------<br />Warehouse Manager 6157<br />Sales Representative 7380<br />Stock Clerk 9490<br />FIM DE CAPÍTULO41<br />Finalidade do capítulo é demostrar como criar GRANTS.<br />Para criar um novo usuário (isto é executado pelo DBA)<br />devemos proceder da seguinte forma, \" NOVO\" é o nome do<br />usuário e IDENTIFIED BY \" tiger\" é sua senha.<br />SQL> CREATE USER NOVO<br /> 2 IDENTIFIED BY TIGER;<br />User created.<br />Agora após termos criado um novo usuário vamos dar-lhe<br />os seus GRANTS ou seja as permissões devidas<br />como,delete,update e etc, veja como se processa isto e veja<br />também a sintaxe:<br />SQL> GRANT create table, create sequence, create view<br /> 2 to NOVO;<br />Grant succeeded.<br />Criando uma ROLE de privilégios para ser usada para<br />vários usuários, uma role é o conjunto de privilégios que<br />guardamos armazenados com a finalidade de proporcionar uma<br />facilitação de manuseio na hora de se conceder privilégios,<br />evitando a digitação de todos os privilégios, passando a ter<br />que digitar somente o nome da role. No exemplo, o nome da<br />ROLE é \" manager\" e por enquanto não existe nenhum privilégio<br />dentro dela.<br />SQL> CREATE ROLE manager;<br />Role created.<br />Agora estamos definindo os privilégios para a ROLE \" manager\" ,<br />que são: criar tabela e view. Observe como se processa isto:<br />SQL> GRANT create table, create view TO manager;<br />Grant succeeded.<br />Agora que nossa ROLE já tem os privilégios definidos, no<br />exemplo abaixo vou passá-la para algum usuário. No caso o<br />usuário \" NOVO\" está recebendo os GRANTS da ROLE MANAGER, que<br />são somente criar tabela e view:42<br />SQL> GRANT MANAGER TO NOVO;<br />Grant succeeded<br />Como mudar a senha de um usuário: no caso estamos<br />mudando do user novo que tinha como \" senha\" ou seja<br />IDENTIFIED igual a TIGER passando a ser LION.<br />SQL> ALTER USER NOVO IDENTIFIED BY LION;<br />User altered.<br />Agora estamos dando um novo GRANT para o USER \" NOVO\" <br />referente a tabela s_emp, neste caso o GRANT é só de<br />consulta.<br />SQL> GRANT select<br /> 2 ON s_emp<br /> 3 TO novo;<br />Grant succeeded.<br />O exemplo abaixo mostra como adicionar um novo GRANT a<br />uma ROLE, relacionado com colunas específicas de uma tabela<br />no caso s_dept e atribuindo a permissão de update para o<br />usuário \" NOVO\" e para a ROLE \" manager\" .<br />SQL> GRANT update(name,region_id)<br /> 2 ON s_dept<br /> 3 TO novo,manager;<br />Grant succeeded.<br />Este exemplo mostra como dar GRANT para um USER em uma<br />tabela e este usuário ter permissão de passar este mesmo<br />GRANT para outros usuários.<br />SQL> GRANT select<br /> 2 ON s_emp<br /> 3 TO scott<br /> 4 WITH GRANT OPTION;<br />Grant succeeded.43<br />Agora estou tornando publico de todos o SELECT a tabela<br />S_DEPT referente ao usuário GUIMA, ou seja todos podem dar<br />select a tabela s_dept do usuário GUIMA.<br />SQL> GRANT SELECT<br /> 2 ON GUIMA.S_DEPT<br /> 3 TO PUBLIC;<br />Grant succeeded.<br />Para sabermos quais privilégios nós possuímos podemos<br />acessar no DICIONÁRIO DE DADOS nas seguintes tabelas:<br /> ROLE_SYS_PRIVS<br /> ROLE_TAB_PRIVS<br /> USER_ROLE_PRIVS<br /> USER_TAB_PRIVS_MADE<br /> USER_TAB_PRIVS_RECD<br /> USER_COL_PRIVS_MADE<br /> USER_COL_PRIVS_RECD<br />Como ver as ROLES que eu tenho acesso:<br />SQL> SELECT GRANTED_ROLE,OS_GRANTED<br /> 2 FROM USER_ROLE_PRIVS<br /> 3 WHERE USERNAME = 'GUIMA';<br />GRANTED_ROLE OS_<br />------------------------------ ---<br />CONNECT NO<br />DBA NO<br />MANAGER NO<br />Para tirar os privilégios de um USER procede-se da seguinte<br />forma:<br />SQL> REVOKE select<br /> 2 ON s_emp<br /> 3 FROM NOVO;<br />Revoke succeeded.44<br />No exemplo acima estamos tirando os privilégios de<br />select do USER “NOVO”.<br />Como criar sinônimo:<br />Criando um sinônimo para uma tabela: no caso está sendo<br />criado um sinônimo com o nome \" HXXH\" para a tabela s_dept<br />pertencente a alice:<br />SQL> CREATE SYNONYM HXXH<br /> FOR alice.s_dept;<br />Synonym created.<br />Agora estamos criando um sinônimo para uma VIEW, nossa<br />VIEW se chama dept_sum_vu e o nome do sinônimo criado é<br />d_sum:<br />SQL> create SYNONYM d_sum<br /> 2 for dept_sum_vu;<br />Synonym created.<br />Agora estamos criando um sinônimo publico, o nome dele é<br />\" DDD\" e é referente a tabela s_dept de alice:<br />SQL> create public SYNONYM DDD<br /> 2 FOR alice.s_dept;<br />Synonym created.<br />Para dropar um sinônimo é simples:<br />SQL> DROP SYNONYM d_sum;<br />Synonym dropped.<br />FIM DE CAPÍTULO45<br />Finalidade do Capítulo é Tratar Sobre INDEX e JOIN e OUTER<br />JOIN:<br />INDEX:<br />Uma INDEX pode ser criada automaticamente(quando é criada<br />uma PK ou UK constraint em uma tabela) ou manualmente. Para<br />delatarmos uma INDEX temos que usar o cmdo DROP INDEX:<br />Vamos ao Exemplo:<br />SQL> DROP INDEX s_emp_last_name_idx;<br />Index dropped.<br />Para criar uma INDEX usa-se o cmdo CREATE INDEX:<br />Vamos ao Exemplo:<br />SQL> CREATE INDEX S_EMP_last_name_idx<br /> 2 on S_EMP(last_name);<br />Index created.<br />Para selecionar as INDEX de uma tabela faz-se um SELECT<br />na tabela USER_INDEXES e USER_IND_COLUMNS:<br />O uso do JOIN:<br />Join é a ligação que fazemos entre duas tabelas na<br />pesquisa de dados, necessariamente deve existir em um join a<br />chave primaria fazendo relação com uma chave estrangeira,<br />esta é a condição e ligação.<br />No exemplo abaixo estamos selecionando o last_name e<br />dept_id da tabela s_emp e também selecionando a coluna name<br />da tabela s_dept isto onde a coluna id de s_dept for igual a<br />coluna dept_id de s_emp, completando assim a condição do<br />JOIN.<br />Vamos ao exemplo:<br />SQL> SELECT S_EMP.LAST_NAME,S_EMP.DEPT_ID,S_DEPT.NAME<br /> 2 FROM S_EMP,S_DEPT<br /> 3 WHERE S_EMP.DEPT_ID = S_DEPT.ID;46<br />LAST_NAME DEPT_ID NAME<br />------------------------- --------- ---------------------<br />Velasquez 50 Administration<br />Ngao 41 Operations<br />Nagayama 31 Sales<br />Quick-To-See 10 Finance<br />Ropeburn 50 Administration<br />Urguhart 41 Operations<br />Menchu 42 Operations<br />Biri 43 Operations<br />Catchpole 44 Operations<br />Havel 45 Operations<br />Magee 31 Sales<br />Giljum 32 Sales<br />Sedeghi 33 Sales<br />Nguyen 34 Sales<br />Dumas 35 Sales<br />Maduro 41 Operations<br />Smith 41 Operations<br />Nozaki 42 Operations<br />Patel 42 Operations<br />Newman 43 Operations<br />Markarian 43 Operations<br />No exemplo abaixo como no anterior temos a realização de um<br />JOIN.<br />Vamos ao exemplo.<br />SQL> SELECT S_DEPT.ID \" COD DO DEPT\" ,<br /> 2 S_REGION.ID \" COD DA REG\" ,<br /> 3 S_REGION.NAME\" NOME DA REGIÃO\" <br /> 4 FROM S_DEPT,S_REGION<br /> 5 WHERE S_DEPT.REGION_ID = S_REGION.ID;<br /> COD DO DEPT COD DA REG NOME DA REGIÃO<br />------------ ---------- -------------------------<br /> 10 1 North America<br /> 31 1 North America<br /> 32 2 South America<br /> 33 3 Africa / Middle East<br /> 34 4 Ásia<br /> 35 5 Europe<br /> 41 1 North America<br /> 42 2 South America47<br /> 43 3 Africa / Middle East<br /> 44 4 Ásia<br /> 45 5 Europe<br /> 50 1 North America<br />12 rows selected.<br />No exemplo abaixo temos mais um exemplo de join onde<br />temos o uso de apelidos para as tabelas manipuladas, é<br />importante observar como é usado o apelido e como este tem<br />que ser referenciado no FROM, no exemplo abaixo vemos o<br />apelido de \" E\" para a tabela S_EMP, de \" D\" para a tabela<br />S_DEPT. Outra característica importante no exemplo é o uso do<br />JOIN onde relacionamos as duas tabelas através da chave<br />estrangeira. O uso do INITCAP serve para procurarmos o<br />registro que comece com a letra maiúscula<br />SQL> select E.last_name,E.dept_id,<br /> 2 D.name<br /> 3 from s_emp E,s_dept D<br /> 4 where e.dept_id = D.id<br /> 5 and initcap(E.last_name)='Menchu';<br />LAST_NAME DEPT_ID NAME<br />------------------------- --------- -------------------------<br />Menchu 42 Operations<br />No exemplo abaixo temos a realização de dois JOINS, uso<br />do AND no exemplo abaixo proporciona a adição de mais de uma<br />condição ou seja além do join entre s_emp e s_dept também<br />ocorre um Join entre s_region e s_dept proporcionado pelo uso<br />do AND. Também está sendo usado um novo AND colocando a<br />commission_pct da tabela s_emp > 0.<br />Vamos ao exemplo:<br />SQL> select E.last_name,R.name,E.commission_pct<br /> 2 from s_emp E, s_dept D, s_region R<br /> 3 where E.dept_id = D.id<br /> 4 and D.region_id = R.id<br />5 and E.commission_pct > 0;48<br />LAST_NAME NAME COMMISSION_PCT<br />--------------------------------------- --------------<br />Magee North America 10<br />Giljum South America 12.5<br />Sedeghi Africa / Middle East 10<br />Nguyen Ásia 15<br />Dumas Europe 17.5<br />No exemplo abaixo estamos mostrando um join que traz<br />todos os registros que satisfaçam a condição da clausula<br />where ou seja traz somente aquele que satisfação o JOIN não<br />traz os registros que contem espaços em branco, em função da<br />relação entre as duas tabelas no caso entre s_emp e<br />s_customer. Mas e se quisermos que pesquisar inclusive os<br />registros que não tem relacionamento, ou seja que estejam com<br />o espaço em branco? Para isso temos que acrescentarmos o<br />sinal de (+).<br />Vamos ao Exemplo:<br />SQL> select e.last_name,e.id,c.name<br /> 2 from s_emp e, s_customer c<br /> 3 where e.id = c.sales_rep_id<br /> 4 order by e.id;<br />LAST_NAME ID NAME<br />---------------------- --------- ---------------------------<br />Magee 11 Womansport<br />Magee 11 Beisbol Si!<br />Magee 11 Ojibway Retail<br />Magee 11 Big John's Sports Emporium<br />Giljum 12 Unisports<br />Giljum 12 Futbol Sonora<br />Sedeghi 13 Hamada Sport<br />Nguyen 14 Simms Athletics<br />Nguyen 14 Delhi Sports<br />Dumas 15 Kam's Sporting Goods<br />Dumas 15 Sportique<br />Dumas 15 Sporta Russia<br />Dumas 15 Kuhn's Sports<br />Dumas 15 Muench Sports49<br />O exemplo a seguir é idêntico ao anterior com a<br />diferença que está acrescido do sinal de (+) para, mesmo<br />satisfazendo a clausula where, traga os registros que não<br />tenham satisfeito a condição de relacionamento da clausula<br />where, no caso, estamos então fazendo um OUTER JOIN pegando o<br />LAST_NAME e o ID da tabela s_emp e o NAME da tabela<br />s_customer onde o id da tabela s_emp corresponda ao<br />sales_rep_id dentro da tabela s_customer e com o sinal de (+)<br />traga também os NAME de s_customer que não tenham relação<br />com s_emp.<br />SQL> select e.last_name,e.id,c.name<br /> 2 from s_emp e, s_customer c<br /> 3 where e.id (+) = c.sales_rep_id<br /> 4 order by e.id;<br />LAST_NAME ID NAME<br />------------------------- --------- ------------------------<br />Magee 11 Womansport<br />Magee 11 Beisbol Si!<br />Magee 11 Ojibway Retail<br />Magee 11 Big John's Sports Empori<br />Giljum 12 Unisports<br />Giljum 12 Futbol Sonora<br />Sedeghi 13 Hamada Sport<br />Nguyen 14 Simms Athletics<br />Nguyen 14 Delhi Sports<br />Dumas 15 Kam's Sporting Goods<br />Dumas 15 Sportique<br />Dumas 15 Muench Sports<br />Dumas 15 Sporta Russia<br />Dumas 15 Kuhn's Sports<br /> Sweet Rock Sports<br />15 rows selected.<br />FINAL DE CAPÍTULO50<br />Finalidade do capítulo é mostrar o uso do BETWEEN.<br /> No exemplo a seguir estamos selecionando as colunas<br />ename,job,sal da tabela EMP e a coluna GRADE da tabela<br />SALGRADE, onde através do comando BETWEEN AND ocorre uma<br />pesquisa na tabela SALGRADE nas colunas LOSAL e HISAL onde<br />comparamos seus valores com os valores dos campos da coluna<br />SAL de EMP trazendo somente aqueles valores que estejam entre<br />os de LOSAL e HISAL. No exemplo não ocorre um JOIN mas uma<br />simples pesquisa em uma outra tabela para que seja efetuada<br />uma comparação.<br />SQL> select e.ename,e.job,e.sal,s.grade<br /> 2 from emp e, salgrade s<br /> 3 where e.sal between s.losal and s.hisal<br />ENAME JOB SAL GRADE<br />---------- --------- --------- ---------<br />SMITH CLERK 800 1<br />ADAMS CLERK 1100 1<br />JAMES CLERK 950 1<br />WARD SALESMAN 1250 2<br />MARTIN SALESMAN 1250 2<br />MILLER CLERK 1300 2<br />ALLEN SALESMAN 1600 3<br />TURNER SALESMAN 1500 3<br />JONES MANAGER 2975 4<br />BLAKE MANAGER 2850 4<br />CLARK MANAGER 2450 4<br />SCOTT ANALYST 3000 4<br />FORD ANALYST 3000 4<br />KING PRESIDENT 5000 5<br />14 rows selected.<br />FINAL DE CAPÍTULO51<br />Finalidade do capítulo é mostrar o uso do ORDER BY.<br />O exemplo abaixo mostra como usar o comando order by,<br />onde no caso estamos ordenando a tabela s_emp pelo o<br />last_name, é bom lembrar que sempre o comando order by vem<br />por último na função sql.<br />Vamos ao exemplo:<br />SELECT LAST_NAME, DEPT_ID,START_DATE<br />FROM S_EMP<br />ORDER BY LAST_NAME<br />LAST_NAME DEPT_ID START_DAT<br />------------------------- --------- ---------<br />Biri 43 07-APR-90<br />Catchpole 44 09-FEB-92<br />Chang 44 30-NOV-90<br />Dancs 45 17-MAR-91<br />Dumas 35 09-OCT-91<br />Giljum 32 18-JAN-92<br />Havel 45 27-FEB-91<br />Maduro 41 07-FEB-92<br />Magee 31 14-MAY-90<br />Markarian 43 26-MAY-91<br />Menchu 42 14-MAY-90<br />Nagayama 31 17-JUN-91<br />Newman 43 21-JUL-91<br />Ngao 41 08-MAR-90<br />Nguyen 34 22-JAN-92<br />Nozaki 42 09-FEB-91<br />Patel 42 06-AUG-91<br />Patel 34 17-OCT-90<br />Quick-To-See 10 07-APR-90<br />Ropeburn 50 04-MAR-90<br />Schwartz 45 09-MAY-91<br />LAST_NAME DEPT_ID START_DAT<br />------------------------- --------- ---------<br />Sedeghi 33 18-FEB-91<br />Smith 41 08-MAR-90<br />Urguhart 41 18-JAN-91<br />Velasquez 50 03-MAR-90<br />25 rows selected.52<br />No comando sql order by temos a função desc que vem com<br />a finalidade de colocar os dados dentro da coluna em ordem<br />decrescente. No exemplo a seguir estamos colocando por ordem<br />decrescente a coluna start_date da tabela s_emp.<br />SQL> SELECT LAST_NAME, DEPT_ID,START_DATE<br /> 2 FROM S_EMP<br /> 3 ORDER BY START_DATE DESC;<br />LAST_NAME DEPT_ID START_DAT<br />------------------------- --------- ---------<br />Catchpole 44 09-FEB-92<br />Maduro 41 07-FEB-92<br />Nguyen 34 22-JAN-92<br />Giljum 32 18-JAN-92<br />Dumas 35 09-OCT-91<br />Patel 42 06-AUG-91<br />Newman 43 21-JUL-91<br />Nagayama 31 17-JUN-91<br />Markarian 43 26-MAY-91<br />Schwartz 45 09-MAY-91<br />Dancs 45 17-MAR-91<br />Havel 45 27-FEB-91<br />Sedeghi 33 18-FEB-91<br />Nozaki 42 09-FEB-91<br />Urguhart 41 18-JAN-91<br />Chang 44 30-NOV-90<br />Patel 34 17-OCT-90<br />Menchu 42 14-MAY-90<br />Magee 31 14-MAY-90<br />Quick-To-See 10 07-APR-90<br />Biri 43 07-APR-90<br />LAST_NAME DEPT_ID START_DAT<br />------------------------- --------- ---------<br />Ngao 41 08-MAR-90<br />Smith 41 08-MAR-90<br />Ropeburn 50 04-MAR-90<br />Velasquez 50 03-MAR-90<br />25 rows selected.53<br />Agora vamos mostrar os dados do resultado do mesmo<br />select anterior sem o uso da função desc para o order by,<br />observe a diferença da ordenação em relação as datas.<br />SQL> SELECT LAST_NAME, DEPT_ID,START_DATE<br /> 2 FROM S_EMP<br /> 3 ORDER BY START_DATE;<br />LAST_NAME DEPT_ID START_DAT<br />------------------------- --------- ---------<br />Velasquez 50 03-MAR-90<br />Ropeburn 50 04-MAR-90<br />Ngao 41 08-MAR-90<br />Smith 41 08-MAR-90<br />Quick-To-See 10 07-APR-90<br />Biri 43 07-APR-90<br />Menchu 42 14-MAY-90<br />Magee 31 14-MAY-90<br />Patel 34 17-OCT-90<br />Chang 44 30-NOV-90<br />Urguhart 41 18-JAN-91<br />Nozaki 42 09-FEB-91<br />Sedeghi 33 18-FEB-91<br />Havel 45 27-FEB-91<br />Dancs 45 17-MAR-91<br />Schwartz 45 09-MAY-91<br />Markarian 43 26-MAY-91<br />Nagayama 31 17-JUN-91<br />Newman 43 21-JUL-91<br />Patel 42 06-AUG-91<br />Dumas 35 09-OCT-91<br />LAST_NAME DEPT_ID START_DAT<br />------------------------- --------- ---------<br />Giljum 32 18-JAN-92<br />Nguyen 34 22-JAN-92<br />Maduro 41 07-FEB-92<br />Catchpole 44 09-FEB-92<br />25 rows selected.54<br />O exemplo seguinte mostra como usar a posição da coluna<br />dentro do comando sql para definir a ordenação dos registros<br />por aquela coluna, no caso abaixo estamos ordenando nossos<br />dados pela coluna numero 4 que corresponde a START_DATE de<br />S_EMP.<br />Vamos ao exemplo:<br />SQL> SELECT ID,LAST_NAME,FIRST_NAME,START_DATE<br /> 2 MANAGER_ID, SALARY<br /> 3 FROM S_EMP<br /> 4 ORDER BY 4;<br />ID LAST_NAME FIRST_NAME MANAGER_I SALARY<br />-------------- ------------------------- --------- ---------<br />1 Velasquez Carmen 03-MAR-90 2500<br />5 Ropeburn Audry 04-MAR-90 1550<br />2 Ngao LaDoris 08-MAR-90 1450<br />17 Smith George 08-MAR-90 940<br />4 Quick-To-See Mark 07-APR-90 1450<br />8 Biri Ben 07-APR-90 1100<br />7 Menchu Roberta 14-MAY-90 1250<br />11 Magee Colin 14-MAY-90 1400<br />23 Patel Radha 17-OCT-90 795<br />22 Chang Eddie 30-NOV-90 800<br />6 Urguhart Molly 18-JAN-91 1200<br />18 Nozaki Akira 09-FEB-91 1200<br />9 Catchpole Antoinette 09-FEB-92 1300<br />25 rows selected.<br />Agora além de ordenar pela coluna numero 4 estamos<br />também colocando em ordem decrescente usando para isto o cmdo<br />desc.<br />SQL> SELECT ID,LAST_NAME,FIRST_NAME,START_DATE<br /> 2 MANAGER_ID, SALARY<br /> 3 FROM S_EMP<br /> 4 ORDER BY 4 DESC;<br />ID LAST_NAME FIRST_NAME MANAGER_I SALARY<br />-------- ------------------------- --------- ---------<br />9 Catchpole Antoinette 09-FEB-92 1300<br />16 Maduro Elena 07-FEB-92 1400<br />14 Nguyen Mai 22-JAN-92 1525<br />12 Giljum Henry 18-JAN-92 149055<br />No próximo exemplo o comando order by esta agrupando<br />por departamento com o dept_id e depois por salário (dentro<br />do grupo departamento) podemos constatar a melhor verificação<br />do exemplo no departamento 41 onde o salário vem por ordem<br />decrescente.<br />SQL> SELECT LAST_NAME,DEPT_ID,SALARY<br /> 2 FROM S_EMP<br /> 3 ORDER BY DEPT_ID,SALARY DESC;<br />LAST_NAME DEPT_ID SALARY<br />------------------------- --------- ---------<br />Quick-To-See 10 1450<br />Nagayama 31 1400<br />Magee 31 1400<br />Giljum 32 1490<br />Sedeghi 33 1515<br />Nguyen 34 1525<br />Patel 34 795<br />Dumas 35 1450<br />Ngao 41 1450<br />Maduro 41 1400<br />Urguhart 41 1200<br />Smith 41 940<br />Menchu 42 1250<br />Nozaki 42 1200<br />Patel 42 795<br />Biri 43 1100<br />Markarian 43 850<br />Newman 43 750<br />Catchpole 44 1300<br />Chang 44 800<br />Havel 45 1307<br />LAST_NAME DEPT_ID SALARY<br />------------------------- --------- ---------<br />Schwartz 45 1100<br />Dancs 45 860<br />Velasquez 50 2500<br />Ropeburn 50 1550<br />25 rows selected.<br />Observação: se colocarmos duas ordenações incompatíveis<br />de execução, o sql irá reconhecer a primeira da seqüência,<br />observe que o exemplo abaixo mostra claramente isto. Observe<br />também o departamento 41, onde o sql ordena primeiro por56<br />departamento e depois por nome (last_name) e despreza a<br />coluna salary porque dentro da prioridade ela é a última.<br />SQL> SELECT LAST_NAME,DEPT_ID,SALARY<br /> 2 FROM S_EMP<br /> 3 ORDER BY DEPT_ID, LAST_NAME, SALARY DESC;<br />LAST_NAME DEPT_ID SALARY<br />------------------------- --------- ---------<br />Quick-To-See 10 1450<br />Magee 31 1400<br />Nagayama 31 1400<br />Giljum 32 1490<br />Sedeghi 33 1515<br />Nguyen 34 1525<br />Patel 34 795<br />Dumas 35 1450<br />Maduro 41 1400<br />Ngao 41 1450<br />Smith 41 940<br />Urguhart 41 1200<br />Menchu 42 1250<br />Nozaki 42 1200<br />Patel 42 795<br />Biri 43 1100<br />Markarian 43 850<br />Newman 43 750<br />Catchpole 44 1300<br />Chang 44 800<br />Dancs 45 860<br />LAST_NAME DEPT_ID SALARY<br />------------------------- --------- ---------<br />Havel 45 1307<br />Schwartz 45 1100<br />Ropeburn 50 1550<br />Velasquez 50 2500<br />25 rows selected.<br />FINAL DE CAPÍTULO57<br />Finalidade do capítulo é mostrar o uso do LENGTH e<br />também como concatenar.<br />O uso do length: serve par contar a quantidade de<br />espaços, incluindo caracteres que um determinado registro<br />ocupa.<br />O uso do \" substr\" : serve para localizar de forma física<br />determinadas posições de um determinado registro.<br />No exemplo abaixo vemos como que o cmdo \" substr\" ajuda a<br />encontrarmos determinadas posições dentro de uma clausula<br />where.<br />SQL> SELECT name, LENGTH(name)<br /> 2 FROM S_PRODUCT<br /> 3 WHERE SUBSTR(NAME,1,5) = 'Black';<br />NAME LENGTH(NAME)<br />-------------------- ------------<br />Black Hawk Knee Pads 20<br />Black Hawk Elbow Pads 21<br />Concatenando colunas distantes usando o CONCAT, observe<br />que estamos concatenado duas colunas e jogando-as dentro de<br />uma mesma coluna:<br />SQL> SELECT CONCAT(NAME,COUNTRY) CLIENTE<br /> 2 FROM S_CUSTOMER<br /> 3 WHERE UPPER (CREDIT_RATING) = 'GOOD'<br /> 4 ;<br />CLIENTE<br />---------------------------------------------------<br />Delhi SportsIndia<br />Sweet Rock SportsNigeria<br />Muench SportsGermany<br />FINAL DE CAPÍTULO58<br />Finalidade do capítulo é mostrar algumas manipulações<br />com datas:<br />No próximo exemplo vemos o uso do sysdate que<br />corresponde a data do sistema, que está sendo subtraído pela<br />coluna start_date e dividido por 7 para verificar quantas<br />semanas existem entre a data do start_date e sysdate isto<br />referente ao departamento 43.<br />SQL> SELECT LAST_NAME, (SYSDATE-START_DATE)/7 SEMANAS<br /> 2 FROM S_EMP<br /> 3 WHERE DEPT_ID = 43;<br />LAST_NAME SEMANAS<br />------------------------- ---------<br />Biri 397.5229<br />Newman 330.38004<br />Markarian 338.38004<br />O exemplo seguinte deveria mostrar em tenure a<br />quantidade de meses existentes entre sysdate e start_date e<br />depois usando o comdo \" add_months\" mostrar em review a data<br />correspondente a 6 meses a mais de start_date, mas não mostra<br />porque não satisfaz a clausula where pois pede que traga os<br />dados entre o sysdate e o start_date em 48 meses, coisa que<br />não existe:<br /> Vamos ao Exemplo:<br />SQL> SELECT ID,START_DATE,<br /> 2 MONTHS_BETWEEN( SYSDATE-START_DATE) TENURE,<br /> 3 ADD_MONTHS(START_DATE,6) REVIEW<br /> 4 FROM S_EMP<br /> 5 WHERE MONTHS_BETWEEN (SYSDATE,START_DATE)<48;<br />no rows selected<br />Agora no exemplo abaixo, satisfazendo a clausula where da<br />quantidade de meses na função between podemos ver na coluna<br />tenure a quantidade de meses entre o sysdate e start_date e<br />em rewiew mostra o start_date acrescido de 6 meses.59<br />Vamos ao Exemplo:<br />SQL> SELECT ID,START_DATE,<br /> 2 MONTHS_BETWEEN(SYSDATE,START_DATE) TENURE,<br /> 3 ADD_MONTHS(START_DATE,6) REVIEW<br /> 4 FROM S_EMP<br /> 5 WHERE MONTHS_BETWEEN (SYSDATE,START_DATE)<72;<br /> ID START_DAT TENURE REVIEW<br />--------- --------- --------- ---------<br /> 9 09-FEB-92 69.311978 09-AUG-92<br /> 12 18-JAN-92 70 18-JUL-92<br /> 14 22-JAN-92 69.892624 22-JUL-92<br /> 16 07-FEB-92 69.376495 07-AUG-92<br />Uma nova versão do exemplo anterior:<br />SQL> SELECT ID,START_DATE,<br /> 2 MONTHS_BETWEEN(SYSDATE,START_DATE) TENURE,<br /> 3 ADD_MONTHS(START_DATE,6) REVIEW<br /> 4 FROM S_EMP<br /> 5 WHERE MONTHS_BETWEEN (SYSDATE,START_DATE)<84;<br /> ID START_DAT TENURE REVIEW<br />--------- --------- --------- ---------<br /> 3 17-JUN-91 77.054026 17-DEC-91<br /> 6 18-JAN-91 82 18-JUL-91<br /> 9 09-FEB-92 69.31209 09-AUG-92<br /> 10 27-FEB-91 80.731445 27-AUG-91<br /> 12 18-JAN-92 70 18-JUL-92<br /> 13 18-FEB-91 81 18-AUG-91<br /> 14 22-JAN-92 69.892736 22-JUL-92<br /> 15 09-OCT-91 73.31209 09-APR-92<br /> 16 07-FEB-92 69.376607 07-AUG-92<br /> 18 09-FEB-91 81.31209 09-AUG-91<br /> 19 06-AUG-91 75.408865 06-FEB-92<br /> 20 21-JUL-91 75.924994 21-JAN-92<br /> 21 26-MAY-91 77.763703 26-NOV-91<br /> 22 30-NOV-90 83.634671 31-MAY-91<br /> 24 17-MAR-91 80.054026 17-SEP-91<br /> 25 09-MAY-91 78.31209 09-NOV-91<br />16 rows selected.60<br />A função trunc e round:<br />O exemplo abaixo mostra como usar a função round com a<br />seguinte característica:<br />O round respeita o dia dos meses, se for maior que 15<br />arredonda para o inicio do próximo mês, se não for vai para o<br />inicio do mês que se encontra.<br />O comando trunc trunca sempre para o inicio do mês que<br />se encontra.<br />Vamos ao Exemplo:<br />SQL> SELECT ID,START_DATE,<br /> 2 ROUND(START_DATE,'MONTH'),<br /> 3 TRUNC(START_DATE,'MONTH')<br /> 4 FROM S_EMP<br /> 5 WHERE START_DATE LIKE '%91';<br /> ID START_DAT ROUND(STA TRUNC(STA<br />--------- --------- --------- ---------<br /> 3 17-JUN-91 01-JUL-91 01-JUN-91<br /> 6 18-JAN-91 01-FEB-91 01-JAN-91<br /> 10 27-FEB-91 01-MAR-91 01-FEB-91<br /> 13 18-FEB-91 01-MAR-91 01-FEB-91<br /> 15 09-OCT-91 01-OCT-91 01-OCT-91<br /> 18 09-FEB-91 01-FEB-91 01-FEB-91<br /> 19 06-AUG-91 01-AUG-91 01-AUG-91<br /> 20 21-JUL-91 01-AUG-91 01-JUL-91<br /> 21 26-MAY-91 01-JUN-91 01-MAY-91<br /> 24 17-MAR-91 01-APR-91 01-MAR-91<br /> 25 09-MAY-91 01-MAY-91 01-MAY-91<br />11 rows selected.<br />FINAL DE CAPÍTULO. Finalidade do capítulo é o uso<br />da função MOD.<br />A função mod traz o resto de uma divisão. Neste exemplo<br />temos uma seleção de registros dentro da tabela s_emp onde o<br />salário é maior que 1400.<br />SQL> select LAST_NAME,MOD(SALARY,COMMISSION_PCT)<br /> 2 FROM S_EMP<br /> 3 WHERE SALARY>1400;<br />LAST_NAME MOD(SALARY,COMMISSION_PCT)<br />------------------------- --------------------------61<br />Velasquez<br />Ngao<br />Quick-To-See<br />Ropeburn<br />Giljum 2.5<br />Sedeghi 5<br />Nguyen 10<br />Dumas 15<br />8 rows selected.<br />Agora neste exemplo temos a seleção de todos os<br />registros onde o salário é maior que 1400 e também possui<br />comissão nula.<br />SQL> select LAST_NAME,MOD(SALARY,COMMISSION_PCT)<br /> 2 FROM S_EMP<br /> 3 WHERE SALARY>1400<br /> 4 and commission_pct is null;<br />LAST_NAME MOD(SALARY,COMMISSION_PCT)<br />------------------------- --------------------------<br />Velasquez<br />Ngao<br />Quick-To-See<br />Ropeburn<br />Neste exemplo temos somente aqueles que ganham mais de<br />1400 e possui comissão.<br />SQL> select LAST_NAME,MOD(SALARY,COMMISSION_PCT)<br /> 2 FROM S_EMP<br /> 3 WHERE SALARY>1400<br /> 4 and commission_pct is not null;<br />LAST_NAME MOD(SALARY,COMMISSION_PCT)<br />------------------------- --------------------------<br />Giljum 2.5<br />Sedeghi 5<br />Nguyen 10<br />Dumas 15<br />FINAL DE CAPÍTULO62<br />Finalidade do capítulo é fazer arredondamentos de<br />valores usando \" ROUND\" e o \" TRUNC\" .<br />Vamos ao Exemplo:<br />SQL> select round(45.923,2), round(45.923,0),<br /> 2 round(45.923,-1)<br /> 3 from sys.dual;<br />ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923,-1)<br />--------------- --------------- ----------------<br /> 45.92 46 50<br />SQL> select trunc(45.923,2),trunc(45.923,0),<br />trunc(45.923,-1)<br />from sys.dual<br />TRUNC(45.923,2) TRUNC(45.923,0) TRUNC(45.923,-1)<br />--------------- --------------- ----------------<br /> 45.92 45 40<br />FINAL DE CAPÍTULO63<br />Finalidade do capítulo é tratar o uso do SELECT,NVL,DISTINCT.<br />O comando SELECT usado no exemplo abaixo é básico, pois<br />serve para selecionar todas as linhas da tabela s_dept, não<br />fazendo neste caso nenhuma distinção.<br /> SQL> select * from s_dept;<br /> ID NAME REGION_ID<br />--------- ------------------------- ---------<br /> 10 Finance 1<br /> 31 Sales 1<br /> 32 Sales 2<br /> 33 Sales 3<br /> 34 Sales 4<br /> 35 Sales 5<br /> 41 Operations 1<br /> 42 Operations 2<br /> 43 Operations 3<br /> 44 Operations 4<br /> 45 Operations 5<br /> 50 Administration 1<br />12 rows selected.<br />Agora o comando select é usado para trazer valores de colunas<br />especificas onde o nome das colunas vem entre vírgulas. A<br />tabela s_dept tem como colunas, id,name e region_id, mas<br />neste caso só está sendo trazido id e regiao_id.<br />Vamos ao Exemplo:<br />SQL> select ID,REGION_ID FROM S_DEPT;<br /> ID REGION_ID<br />--------- ---------<br /> 10 1<br /> 31 1<br /> 32 2<br /> 33 3<br /> 34 4<br /> 35 5<br /> 41 1<br /> 42 2<br /> 43 3<br /> 44 464<br /> 45 5<br /> 50 1<br />12 rows selected.<br />No exemplo abaixo estamos mostrando como trazer campos<br />distintos de uma determinada tabela, ou seja campos que não<br />se repetem. Na coluna name tem vários campos repetidos, veja<br />no exemplo:<br />SQL> SELECT NAME FROM S_DEPT;<br />NAME<br />-------------------------<br />Finance<br />Sales<br />Sales<br />Sales<br />Sales<br />Sales<br />Operations<br />Operations<br />Operations<br />Operations<br />Operations<br />Administration<br />12 rows selected.<br />Agora usando o comando distinct na coluna name da tabela<br />s_dept poderemos obter nomes distintos, sem valor repetido<br />para a coluna name de s_dept.<br />Vamos ao Exemplo:<br />SQL> SELECT DISTINCT NAME FROM S_DEPT;<br />NAME<br />-------------------------<br />Administration<br />Finance<br />Operations<br />Sales65<br />Agora podemos ver como separar em grupos sem repetição<br />os nomes por região, os nomes aparecem conforme existam nas<br />regiões e as regiões que aparecem conforme tenham nomes.<br />SQL> SELECT DISTINCT NAME,REGION_ID<br /> 2 FROM S_DEPT;<br />NAME REGION_ID<br />------------------------- ---------<br />Administration 1<br />Finance 1<br />Operations 1<br />Operations 2<br />Operations 3<br />Operations 4<br />Operations 5<br />Sales 1<br />Sales 2<br />Sales 3<br />Sales 4<br />Sales 5<br />12 rows selected.<br />A função select permite que seja feito expressões<br />aritméticas manipulando os valores de seus campos. No exemplo<br />abaixo os valores da coluna salary, estão sendo multiplicados<br />por 12 e assumem seus novos valores na própria coluna.<br />SQL> SELECT LAST_NAME,SALARY * 12 FROM<br />S_EMP;<br />Exemplo de expressão:<br />SQL> select id,last_name,round(salary+(salary*15/10<br /> 2 ),0) \" NOVO SALÁRIO\" FROM S_EMP;<br /> ID LAST_NAME NOVO SALÁRIO<br />--------- ------------------------- -------------<br /> 1 Velasquez 2875<br /> 2 Ngao 1668<br /> 3 Nagayama 1610<br /> 4 Quick-To-See 1668<br /> 5 Ropeburn 1783<br /> 6 Urguhart 138066<br /> 7 Menchu 1438<br /> 8 Biri 1265<br /> 9 Catchpole 1495<br /> 10 Havel 1503<br /> 11 Magee 1610<br /> 12 Giljum 1714<br /> 13 Sedeghi 1742<br /> 14 Nguyen 1754<br /> 15 Dumas 1668<br /> 16 Maduro 1610<br /> 17 Smith 1081<br /> 18 Nozaki 1380<br /> 19 Patel 914<br /> 20 Newman 863<br /> 21 Markarian 978<br /> ID LAST_NAME NOVO SALÁRIO<br />--------- ------------------------- -------------<br /> 22 Chang 920<br /> 23 Patel 914<br /> 24 Dancs 989<br /> 25 Schwartz 1265<br />25 rows selected.<br />No exemplo abaixo temos o uso da função nvl, que tem a<br />finalidade de trazer campos que tem valores nulos atribuindo<br />- lhes o valor zero.<br />Vamos ao Exemplo:<br />SQL> SELECT LAST_NAME, TITLE, 2 SALARY*COMMISSION_PCT/100<br />COMISSAO<br /> 3 FROM S_EMP;<br />LAST_NAME TITLE COMISSAO<br />------------------------- ------------------------- ---------<br />Velasquez President<br />Ngao VP, Operations<br />Nagayama VP, Sales<br />Quick-To-See VP, Finance<br />Ropeburn VP, Administration<br />Urguhart Warehouse Manager<br />Menchu Warehouse Manager<br />Biri Warehouse Manager<br />Catchpole Warehouse Manager<br />Havel Warehouse Manager<br />Magee Sales Representative 14067<br />Giljum Sales Representative 186.25<br />Sedeghi Sales Representative 151.5<br />Nguyen Sales Representative 228.75<br />Dumas Sales Representative 253.75<br />Maduro Stock Clerk<br />Smith Stock Clerk<br />Nozaki Stock Clerk<br />Patel Stock Clerk<br />Newman Stock Clerk<br />Markarian Stock Clerk<br />LAST_NAME TITLE COMISSAO<br />------------------------- ------------------------- ---------<br />Chang Stock Clerk<br />Patel Stock Clerk<br />Dancs Stock Clerk<br />Schwartz Stock Clerk<br />25 rows selected.<br />Observe que no exemplo anterior os campos com valores<br />nulos vieram em branco veja agora que usando a função nvl<br />apareceu o valor zero nos campos nulos.<br />SQL> SELECT LAST_NAME, TITLE,<br /> 2 SALARY*NVL(COMMISSION_PCT,0)/100 COMISSAO<br /> 3 FROM S_EMP;<br />LAST_NAME TITLE COMISSAO<br />------------------------- ------------------------- ---------<br />Velasquez President 0<br />Ngao VP, Operations 0<br />Nagayama VP, Sales 0<br />Quick-To-See VP, Finance 0<br />Ropeburn VP, Administration 0<br />Urguhart Warehouse Manager 0<br />Menchu Warehouse Manager 0<br />Biri Warehouse Manager 0<br />Catchpole Warehouse Manager 0<br />Havel Warehouse Manager 0<br />Magee Sales Representative 140<br />Giljum Sales Representative 186.25<br />Sedeghi Sales Representative 151.5<br />Nguyen Sales Representative 228.75<br />Dumas Sales Representative 253.7568<br />Maduro Stock Clerk 0<br />Smith Stock Clerk 0<br />Nozaki Stock Clerk 0<br />Patel Stock Clerk 0<br />Newman Stock Clerk 0<br />Markarian Stock Clerk 0<br />LAST_NAME TITLE COMISSAO<br />------------------------- ------------------------- ---------<br />Chang Stock Clerk 0<br />Patel Stock Clerk 0<br />Dancs Stock Clerk 0<br />Schwartz Stock Clerk 0<br />25 rows selected.<br />/<br />Um exemplo de SELECT com várias funções:<br />O comando lower serve para transformarmos os dados de<br />pesquisa em letra minúscula, o cmdo initcap serve para<br />converter a primeira letra em maiúscula e o cmdo upper serve<br />para converter em maiúsculo, no exemplo abaixo estamos<br />fazendo primeiro uma concatenação e depois usando a clausula<br />where para trazermos os registros que tem como inicial as<br />letras vp, com o cmdo like.<br />Vamos ao Exemplo:<br />SELECT LOWER(FIRST_NAME||' '||LAST_NAME) VP,<br />INITCAP(userid)USERID,<br />UPPER (TITLE) TITLE<br />FROM S_EMP<br />WHERE TITLE LIKE 'VP%'<br />VP USERID<br />TITLE<br />--------------------------------------------------- --------<br />--------------------<br />ladoris ngao Lngao<br />VP, OPERATIONS<br />midori nagayama Mnagayam<br />VP, SALES69<br />mark quick-to-see Mquickto<br />VP, FINANCE<br />audry ropeburn Aropebur<br />VP, ADMINISTRATION<br /> Observe no exemplo abaixo que não foi realizada a<br />pesquisa porque o dado da tabela não corresponde ao formato<br />pedido.<br />SQL> SELECT FIRST_NAME,LAST_NAME<br /> 2 FROM S_EMP<br /> 3 WHERE LAST_NAME = 'PATEL';<br />no rows selected<br />Agora usando o cmdo \" lower \" fazemos a conversão, para<br />a pesquisa , para letra minúscula possibilitando assim o<br />sucesso da execução do exemplo anterior:<br />SQL> SELECT FIRST_NAME,LAST_NAME<br /> 2 FROM S_EMP<br /> 3 WHERE LOWER(LAST_NAME) = 'patel';<br />FIRST_NAME LAST_NAME<br />------------------------- -------------------<br />Vikram Patel<br />Radha Patel<br />Agora usamos o cmdo \" upper\" para fazermos a conversão<br />para maiúscula.<br />SQL> SELECT FIRST_NAME,LAST_NAME<br /> 2 FROM S_EMP<br /> 3 WHERE UPPER (LAST_NAME) = 'PATEL';<br />FIRST_NAME LAST_NAME<br />------------------------- -------------------<br />Vikram Patel<br />Radha Patel<br />FINAL DE CAPÍTULO70<br />Finalidade do capítulo é tratar sobre SELF JOINS.<br />O SELF JOINS é definido por um alto relacionamento<br />,podemos descrever o exemplo abaixo da seguinte forma: todos<br />os EMP da tabela S_EMP possuem uma coluna ID e uma coluna<br />MANAGER_ID, portanto queremos saber quem é o gerente de cada<br />funcionário, para isso verificamos o MANAGER_ID que contem um<br />valor correspondente ao ID de EMP e então a partir do valor<br />de MANAGER_ID descobrimos quem é o gerente do EMP. No exemplo<br />abaixo é bom verificar a concatenação.<br />Vamos ao exemplo:<br />SQL> select worker.last_name|| ' trabalha para ' ||<br /> 2 manager.last_name<br /> 3 from s_emp worker, s_emp manager<br /> 4 where worker.manager_id = manager.id;<br />WORKER.LAST_NAME||'TRABALHAPARA'||MANAGER.LAST_NAME<br />-------------------------------------------------------<br />Ngao trabalha para Velasquez<br />Nagayama trabalha para Velasquez<br />Quick-To-See trabalha para Velasquez<br />Ropeburn trabalha para Velasquez<br />Urguhart trabalha para Ngao<br />Menchu trabalha para Ngao<br />Biri trabalha para Ngao<br />Catchpole trabalha para Ngao<br />Havel trabalha para Ngao<br />Magee trabalha para Nagayama<br />Giljum trabalha para Nagayama<br />Sedeghi trabalha para Nagayama<br />Nguyen trabalha para Nagayama<br />Dumas trabalha para Nagayama<br />Maduro trabalha para Urguhart<br />Smith trabalha para Urguhart<br />Nozaki trabalha para Menchu<br />Patel trabalha para Menchu<br />Newman trabalha para Biri<br />Markarian trabalha para Biri<br />Chang trabalha para Catchpole<br />Schwartz trabalha para Havel<br />24 rows selected.<br />FINAL DE CAPÍTULO71<br />Finalidade do capítulo é tratar sobre SEQUENCE.<br />Para ver se existe uma sequence selecionamos o objeto no<br />select object_name colocando a clausula where com o<br />objeto_type igual a sequence.<br /> SQL> SELECT OBJECT_name from user_objects<br /> 2 where object_type = 'SEQUENCE';<br />OBJECT_NAME<br />-------------------------------------------<br />S_CUSTOMER_ID<br />S_DEPART_ID<br />S_DEPT_ID<br />S_DEPT_ID_SEQ<br />S_EMP_ID<br />S_IMAGE_ID<br />S_LONGTEXT_ID<br />S_ORD_ID<br />S_PRODUCT_ID<br />S_REGION_ID<br />S_WAREHOUSE_ID<br />S_WORKER<br />WORKER_ID_SEQ<br />13 rows selected.<br />O que é uma SEQUENCE:<br />Sequence são números criados pelo ORACLE que fazem a<br />contagem de registros assumindo valores únicos, servindo de<br />ID, uma SEQUENCE pode ser usada por mais de uma tabela, cada<br />qual com seus números, sem que ocorra repetição é claro.<br />O exemplo seguinte mostra como criar uma SEQUENCE, o<br />nome da SEQUENCE é S_TESTE_id, que está relacionada com o id<br />da tabela TESTE ( tabela que foi criada anteriormente), o<br />INCREMENTE BY serve para que a SEQUENCE evolua de um valor,<br />o START WITH serve para que a SEQUENCE comece com o numero<br />51, o MAXVALUE é o valor máximo que uma SEQUENCE pode<br />assumir, NOCACHE especifica se será alocada a memória cash ou<br />não, NOCYCLE serve para especificar ou não um ciclo de<br />SEQUENCE ou seja os números vão contando em um ciclo de tempo<br />determinado.72<br />Vamos ao Exemplo:<br />SQL> CREATE SEQUENCE S_TESTE_id<br /> 2 INCREMENT BY 1<br /> 3 START WITH 51<br /> 4 MAXVALUE 9999999<br /> 5 NOCACHE<br /> 6 NOCYCLE;<br />Sequence created.<br />Como mostrar todas as SEQUENCES que estão disponíveis para<br />seu user:<br />SQL> select sequence_name, min_value, max_value,<br /> 2 increment_by,last_number<br /> 3 from user_sequences;<br />SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER<br />-------------- --------- --------- ------------ -----------<br />S_CUSTOMER_ID 1 9999999 1 216<br />S_DEPT_ID 1 9999999 1 51<br />S_EMP_ID 1 9999999 1 26<br />S_IMAGE_ID 1 9999999 1 1981<br />S_LONGTEXT_ID 1 9999999 1 1369<br />S_ORD_ID 1 9999999 1 113<br />S_PRODUCT_ID 1 9999999 1 50537<br />S_REGION_ID 1 9999999 1 6<br />S_TESTE 1 9999999 1 51<br />S_TESTE_ID 1 9999999 1 51<br />S_WAREHOUSE_ID 1 9999999 1 10502<br />11 rows selected.<br />No exemplo abaixo estamos criando uma SEQUENCE para o ID<br />de s_dept, foi escolhido como nome para a SEQUENCE s_dept_id,<br />sempre para SEQUENCE usa-se o \" S\" no começo do nome da<br />sequence.<br /> SQL> CREATE SEQUENCE S_dept_id<br /> 2 INCREMENT BY 1<br /> 3 START WITH 51<br /> 4 MAXVALUE 9999999<br /> 5 NOCACHE<br /> 6 NOCYCLE;<br />Sequence created.73<br />O uso do NEXTVAL:<br />Agora vamos inserir valores dentro de s_dept sendo que<br />um desses valores é o NEXTVAL que tem como função trazer para<br />nós o próximo número da SEQUENCE e no caso especifico estamos<br />inserindo em ID o valor da SEQUENCE.<br />Veja abaixo:<br />SQL> insert into s_dept(id,name,region_id)<br /> 2 values (s_dept_id.NEXTVAL,'FINANCE',2);<br />1 row created.<br />Verificando a inserção do NEXTVAL, como nossa SEQUENCE<br />inicia em 51 o primeiro valor a ser inserido é 51.<br />SQL> SELECT ID<br /> 2 FROM S_DEPT<br /> 3 WHERE NAME = 'FINANCE';<br /> ID<br />---------<br /> 51<br />Alterando uma SEQUENCE: Para se alterar uma SEQUENCE<br />temos que ter privilégios para tal, os valores passados não<br />são alterados pela SEQUENCE, o START WITH de uma SEQUENCE não<br />pode ser alterado, para alterá - lo temos que dropar a<br />sequence, dropando-a não quer dizer que os valores já foram<br />inseridos nas primary keys serão apagados eles já foram<br />criados.<br />SQL> EDIT<br />Wrote file afiedt.buf<br /> 1 ALTER SEQUENCE S_DEPT_ID<br /> 2 INCREMENT BY 4<br /> 3 MAXVALUE 99999<br /> 4 CYCLE<br /> 5* NOCACHE<br />SQL> /<br />Sequence altered.74<br />Para dropar uma SEQUENCE temos que seguir os passos a<br />seguir:<br />SQL> DROP SEQUENCE s_dept_id;<br />Sequence dropped.<br />SQL> DROP SEQUENCE S_TESTE;<br />Sequence dropped.<br />SQL> DROP SEQUENCE S_TESTE_ID;<br />Sequence dropped.<br />FINAL DE CAPÍTULO75<br />Finalidade do capítulo é o uso de SUBQUERYS:<br />Uma subquery é um cmdo select dentro de um outro cmdo<br />select onde retorna uma ou mais linhas a fim de satisfazer<br />uma clausula WHERE.<br />No exemplo abaixo temos um select em s_emp onde<br />procuramos trazer o last_name e o title, onde o title<br />pesquisado seja o mesmo do \" Smith\" , para isso é realizado<br />uma subquery que nada mais é que um select, que neste caso<br />retorna um valor somente para a comparação na where.<br />SQL> select last_name, title<br /> 2 from s_emp<br /> 3 where title =<br /> 4 (select title<br /> 5 from s_emp<br /> 6 where last_name = 'Smith');<br />LAST_NAME TITLE<br />------------------------- -------------------------<br />Maduro Stock Clerk<br />Smith Stock Clerk<br />Nozaki Stock Clerk<br />Patel Stock Clerk<br />Newman Stock Clerk<br />Markarian Stock Clerk<br />Chang Stock Clerk<br />Patel Stock Clerk<br />Dancs Stock Clerk<br />Schwartz Stock Clerk<br />10 rows selected.<br />Outro exemplo de subquery, que neste caso está<br />comparando os valores da coluna SALARY com a média dos<br />salários da tabela s_emp. A função AVG está trazendo a média<br />dos salários.<br />SQL> select last_name, title, salary<br /> 2 from s_emp<br /> 3 where salary<<br /> 4 (select avg(salary)76<br /> 5 from s_emp);<br />LAST_NAME TITLE SALARY<br />------------------------- ------------------------- ---------<br />Urguhart Warehouse Manager 1200<br />Menchu Warehouse Manager 1250<br />Biri Warehouse Manager 1100<br />Smith Stock Clerk 940<br />Nozaki Stock Clerk 1200<br />Patel Stock Clerk 795<br />Newman Stock Clerk 750<br />Markarian Stock Clerk 850<br />Chang Stock Clerk 800<br />Patel Stock Clerk 795<br />Dancs Stock Clerk 860<br />Schwartz Stock Clerk 1100<br />12 rows selected.<br />Nos exemplos anteriores vemos que retornavam só um único<br />valor para comparação na clausula where, neste caso agora há<br />o retorno de mais de um valor para a comparação na clausula<br />where, mas para que ocorra a comparação com mais de um valor<br />temos que usar o IN em vez do \" =\" no exemplo abaixo ocorre um<br />erro:<br />SQL> select last_name, title<br /> 2 from s_emp<br /> 3 where dept_id =<br /> 4 (select id from s_dept<br /> 5 where name = 'finance or region_id = 2);<br />select last_name, title<br />*<br />ERROR at line 1:<br />ORA-01756: quoted string not properly terminated<br />Agora usando o IN na clausula where poderá o dept_id ser<br />comparado com as duas condições, o select trará os registros<br />que na tabela s_dept que tenham o nome igual a 'Finace' ou<br />que a region_id seja igual a 2.<br />SQL> select last_name,first_name,title<br /> 2 from s_emp<br /> 3 where dept_id in<br /> 4 (select id<br /> 5 from s_dept77<br /> 6 where name = 'Finance' or region_id =2);<br />LAST_NAME FIRST_NAME TITLE<br />------------------------- ------------------------- ---------<br />----------------<br />Quick-To-See Mark VP,<br />Finance<br />Menchu Roberta Warehouse<br />Manager<br />Giljum Henry Sales<br />Representative<br />Nozaki Akira Stock<br />Clerk<br />Patel Vikram Stock<br />Clerk<br />O uso do having em subquery:<br />Neste exemplo estamos querendo selecionar o dept_id e a<br />média dos salários de s_emp, grupados pelo dept_id, com a<br />condição de que a média dos salários de s_emp seja maior que<br />a média dos salários do dept 32 para isso usamos o HAVING.<br />Vamos ao Exemplo:<br />SQL> select dept_id,avg(salary)<br /> 2 from s_emp<br /> 3 group by dept_id<br /> 4 having avg(salary)><br /> 5 (select avg(salary)<br /> 6 from s_emp<br /> 7 where dept_id = 32);<br /> DEPT_ID AVG(SALARY)<br />--------- -----------<br /> 33 1515<br /> 50 202578<br />Agora dentro do group by estamos usando o having e<br />dentro da subquery selecionando o menor valor da média da<br />tabela s_emp grupado por title<br />SQL><br /> 1 select title,avg(salary)<br /> 2 from s_emp<br /> 3 group by title<br /> 4 having avg(salary) =<br /> 5 (select min(avg(salary))<br /> 6 from s_emp<br /> 7* group by title)<br />TITLE AVG(SALARY)<br />------------------------- -----------<br />Stock Clerk 949<br />SQL> select min(avg(salary))<br /> 2 from s_emp<br /> 3 group by title;<br />MIN(AVG(SALARY))<br />----------------<br /> 949<br />FINAL DE CAPÍTULO79<br />Finalidade do capítulo é tratar o RENAME, TRUNCATE.<br />O RENAME é usado para renomear uma tabela,view etc.<br />observe a sintaxe abaixo:<br />SQL> RENAME s_ord TO S_ORDER<br /> 2 ;<br />Table renamed.<br />O CMDO TRUNCATE é responsável por deletar os registros de uma<br />tabela da mesma forma do DELETE com a diferença que o<br />TRUNCATE libera espaço na tabela, para usar o CMDO TRUNCATE<br />tem que ser dono da tabela ou ter permissão para isto. Se<br />houver constraints o cmdo truncate não funciona, tem que usar<br />o DISABLE constraints para desabilitar as constraints.<br />SQL> TRUNCATE TABLE S_ITEM;<br />Table truncated.<br />FINAL DE CAPÍTULO80<br />Finalidade do capítulo é tratar sobre o comando UPDATE.<br />O CMDO UPDATE serve para fazermos alterações em registros<br />dentro de nossa tabela observe os exemplos abaixo:<br />Estamos vendo o nr do dept onde o id é igual a 2:<br />SQL> select dept_id<br /> 2 from<br /> 3 S_EMP<br /> 4 where id = 2;<br /> DEPT_ID<br />---------<br /> 41<br />Agora todos que tiverem nr do id igual a 2 passará a ter o id<br />do dept igual a 10.<br />SQL> UPDATE S_EMP<br /> 2 SET dept_id = 10<br /> 3 WHERE id = 2;<br />1 row updated.<br />Verificando se realmente se concretizou o UPDATE<br />SQL> select dept_id<br /> 2 from<br /> 3 S_EMP<br /> 4 where id = 2;<br /> DEPT_ID<br />---------<br /> 10<br />Estamos selecionado dept_id, salary de s_emp onde o id<br />for igual a 1.<br />SQL> select dept_id,salary<br /> 2 from s_emp<br /> 3 where id = 1;<br /> DEPT_ID SALARY<br />--------- ---------81<br /> 50 2500<br />Agora vamos alterar os valores de dept_id para 32 e de<br />salary para 2550 onde o id for igual a 1.<br />SQL> UPDATE s_emp<br /> 2 SET dept_id = 32, salary = 2550<br /> 3 where id = 1;<br />1 row updated.<br />Verificando a concretização da mudança.<br />SQL> select dept_id,salary<br /> 2 from s_emp<br /> 3 where id = 1;<br /> DEPT_ID SALARY<br />--------- ---------<br /> 32 2550<br />Quando não usamos a clausula where no UPDATE fazemos<br />alterações em todos os registros da tabela, no caso estamos<br />mudando todos os campos de commission_pct para 10 sem<br />distinção.<br />SQL> UPDATE S_EMP<br /> 2 SET commission_pct = 10;<br />26 rows updated.<br />Neste exemplo estamos tentando fazer uma alteração em um<br />valor que é uma FOREIKEY, e o valor que queremos adicionar<br />não existe na tabela de origem da FK portanto irá ferir uma<br />constraint.<br />SQL> UPDATE S_EMP<br /> 2 SET DEPT_ID = 60<br /> 3 WHERE DEPT_ID = 10;<br />UPDATE S_EMP<br /> *<br />ERROR at line 1:<br />ORA-02291: integrity constraint (GUIMA.S_EMP_DEPT_ID_FK)<br />violated - parent key not found82<br />Agora no próximo exemplo estamos verificando quais são<br />os dept_id que fazem relação com s_emp.<br />SQL> select dept_id<br /> 2 from s_emp;<br /> DEPT_ID<br />---------<br /> 32<br /> 41<br /> 31<br /> 10<br /> 50<br /> 41<br /> 42<br /> 43<br /> 44<br /> 45<br /> 31<br /> 32<br /> 33<br /> 34<br /> 35<br /> 41<br /> 41<br /> 42<br /> 42<br /> 43<br /> 43<br />26 rows selected.<br />Agora vamos fazer a alteração de dept_id passando todos<br />que são 10 para 40 e não irá violar a constraint porque o<br />valor 40 existe na tabela DEPT. como se pode observar no<br />select anterior.<br />SQL> UPDATE S_EMP<br /> 2 SET DEPT_ID = 41<br /> 3 WHERE DEPT_ID = 10;<br />1 row updated.83<br />Finalidade do capítulo é tratar sobre VIEW.<br />Uma VIEW é como se fosse uma janela que dá acesso aos<br />dados da tabela, só que com restrições. No exemplo abaixo<br />estamos criando uma VIEW usando uma SUBQUERY, trazendo dados<br />específicos de uma tabela.Vamos ao exemplo:<br />SQL> CREATE VIEW empvu45 2 AS SELECT id,last_name,title<br /> 3 FROM s_emp<br /> 4 WHERE dept_id = 45;<br />View created.<br />Estamos agora realizando um select em nossa VIEW:<br />SQL> select * from<br /> 2 empvu45;<br /> ID LAST_NAME TITLE<br />--------- ------------------------- -------------------------<br /> 10 Havel Warehouse Manager<br /> 24 Dancs Stock Clerk<br /> 25 Schwartz Stock Clerk<br />Estamos fazendo um select na tabela S_EMP, referente ao<br />dept_id 45 e vemos que nossa VIEW é idêntica.<br />SQL> select id,last_name,title<br /> 2 FROM s_emp<br /> 3 WHERE dept_id = 45;<br /> ID LAST_NAME TITLE<br />--------- ------------------------- -------------------------<br /> 10 Havel Warehouse Manager<br /> 24 Dancs Stock Clerk<br /> 25 Schwartz Stock Clerk<br />Criando uma VIEW usando ALIASES:<br />SQL> CREATE VIEW salvu4184<br /> 2 AS SELECT id,first_name PRIMEIRO,<br /> 3 last_name ULTIMO, salary SALARIO_MENSAL<br /> 4 FROM<br /> 5 s_emp<br /> 6 WHERE dept_id = 41;<br />View created.<br />Vendo a VIEW criada:<br />SQL> desc salvu41<br /> Name Null? Type<br /> ------------------------------- -------- ----<br /> ID NOT NULL NUMBER(7)<br /> PRIMEIRO VARCHAR2(25)<br /> ULTIMO NOT NULL VARCHAR2(25)<br /> SALARIO_MENSAL NUMBER(11,2)<br />Mais um exemplo de como criar uma VIEW:<br />Estamos criando uma VIEW chamada \" dept_sum_vu\" com os<br />nomes de colunas criados por eu da forma que achar melhor,<br />observe que está sendo realizado uma SUBQUERY e um JOIN<br />dentro da SUBQUERY entre as tabelas s_emp e s_dept, onde<br />pega-se o menor salário função MIN, o maior salário(função<br />MAX) a média dos salários(função AVG) com a condição<br />estabelecida da clausula WHERE que não é mais que a ligação<br />do JOIN, e por último nossa VIEW virá agrupada pelo NOME de<br />s_dept.<br />SQL> EDIT<br />Wrote file afiedt.buf<br /> 1 create VIEW dept_sum_vu<br /> 2 (name, minsal,maxsal, avgsal)<br /> 3 AS SELECT d.name, MIN (e.salary),<br /> 4 MAX(e.salary),AVG(e.salary)<br /> 5 FROM s_emp e,s_dept d<br /> 6 WHERE e.dept_id = d.id<br /> 7* GROUP BY d.name<br />SQL> /<br />View created.<br />Este é o formato de nossa VIEW, verifique o nome das<br />colunas correspondentes a SUBQUERY dentro do CREATE VIEW, e<br />agrupados85<br />por nome.<br />SQL> desc dept_sum_vu<br /> Name Null? Type<br /> ------------------------------- -------- ----<br /> NAME NOT NULL VARCHAR2(25)<br /> MINSAL NUMBER<br /> MAXSAL NUMBER<br /> AVGSAL NUMBER<br />Agora vamos fazer um select em s_dept e s_emp com um JOIN e<br />depois vamos comparar os dados obtidos com o resultado obtido<br />de nossa VIEW:<br />Wrote file afiedt.buf<br /> 1 SELECT d.name, MIN (e.salary),<br /> 2 MAX(e.salary),AVG(e.salary)<br /> 3 FROM s_emp e,s_dept d<br /> 4 WHERE e.dept_id = d.id<br /> 5* GROUP BY d.name<br />SQL> /<br />NAME MIN(E.SALARY) MAX(E.SALARY) AVG(E.SALARY)<br />------------------ ------------- ------------- -------------<br />Administration 1550 2500 2025<br />Finance 1450 1450 1450<br />Operations 825 1540 1144.7667<br />Sales 874.5 1525 1379.2143<br />Agora estamos fazendo um select na VIEW criada usando<br />todas as colunas especificadas em sua criação veja que os<br />dados trazidos são os mesmos da tabela s_emp e s_dept<br />submetida em um select com join:<br />SQL> EDIT<br />Wrote file afiedt.buf<br /> 1 select NAME,MINSAL,MAXSAL,AVGSAL<br /> 2 FROM<br /> 3* DEPT_SUM_VU<br />SQL> /<br />NAME MINSAL MAXSAL AVGSAL<br />------------------------- --------- --------- ---------<br />Administration 1550 2500 2025<br />Finance 1450 1450 1450<br />Operations 825 1540 1144.7667<br />Sales 874.5 1525 1379.214386<br />Estamos agora criando uma VIEW com a condição WITH CHECK<br />OPTION CONSTRAINT que tem a finalidade de não permitir<br />alteração na VIEW em relação a clausula WHERE.<br />SQL> edit<br />Wrote file afiedt.buf<br /> 1 create or replace VIEW empvu41<br /> 2 AS SELECT *<br /> 3 FROM s_emp<br /> 4 WHERE dept_id = 41<br /> 5* WITH CHECK OPTION CONSTRAINT empvu41_ck<br />SQL> /<br />View created.<br />Tentamos fazer uma alteração na VIEW empvu41, não será<br />permitida a alteração nos moldes sugeridos abaixo ou seja a<br />alteração no nr do departamento.<br />SQL> UPDATE empvu41<br /> 2 SET DEPT_ID = 42<br /> 3 WHERE ID = 16;<br /> UPDATE empvu41<br /> *<br />ERROR at line 1:<br />ORA-01402: view WITH CHECK OPTION where-clause violation.<br />Criando uma VIEW e determinando que ela seja somente de<br />leitura.<br />SQL> CREATE OR REPLACE VIEW empvu45<br /> 2 (id_number, employee, job)<br /> 3 AS SELECT id,last_name,title<br /> 4 FROM S_EMP<br /> 5 WHERE dept_id = 45<br /> 6 WITH READ ONLY;<br />View created.<br />Estamos tentando deletar registros da VIEW empvu45 só<br />que ela foi criada com a opção WITH READ ONLY, ou seja<br />somente leitura.<br />SQL> DELETE FROM empvu45<br /> 2 WHERE ID_NUMBER = 10;87<br />DELETE FROM empvu45<br /> *<br />ERROR at line 1:<br />ORA-01752: cannot delete from view without exactly one keypreserved table<br />Para saber as VIEWS existentes vamos a USER_VIEWS que<br />pertence ao dicionário de dados e então podemos pesquisar<br />veja só:<br />SQL> describe user_views;<br /> Name Null? Type<br /> ------------------------------- -------- ----<br /> VIEW_NAME NOT NULL VARCHAR2(30)<br /> TEXT_LENGTH NUMBER<br /> TEXT LONG<br />-- selecionando as VIEWS existentes:<br />SQL> SELECT * FROM<br /> 2 user_views;<br />VIEW_NAME TEXT_LENGTH TEXT<br />-------------- ---------------------------------------------<br />EMPVU41 194 SELECT\" ID\" ,\" LAST_NAME\" ,\" FIRST_NAME\" ,\" USE<br />RID\" ,\" START_DATE\" ,\" COMMENTS\" ,\" MANAG<br />EMPVU45 74 SELECT id,last_name,title<br /> FROM S_EMP<br /> WHERE dept_id = 45<br /> WITH READ ONLY<br />Para deletar uma VIEW usamos o cmdo DROP:<br />Quando deletamos uma VIEW não alteramos em nada a tabela.<br />SQL> DROP VIEW EMPVU45 ;<br />View dropped.<br />FINAL DE CAPÍTULO88<br />Finalidade do capítulo é o uso da clausula WHERE.<br />A clausula where tem a função de dar condições para o<br />select onde especifica a pesquisa, neste primeiro exemplo<br />temos um select somente no departamento numero 42.SQL> SELECT<br />LAST_NAME, DEPT_ID,SALARY<br /> 2 FROM S_EMP<br /> 3 WHERE DEPT_ID = 42;<br />LAST_NAME DEPT_ID SALARY<br />------------------------- --------- ---------<br />Menchu 42 1250<br />Nozaki 42 1200<br />Patel 42 795<br />Neste próximo caso vemos o exemplo de que para fazermos<br />uma pesquisa, temos que colocar o nome ou numero a ser<br />pesquisado como mesmo formato do que se encontra no banco, no<br />caso abaixo ocorreu erro por que o nome colocado é diferente<br />do que está no banco.<br />SQL> SELECT FIRST_NAME, LAST_NAME, TITLE<br /> 2 FROM S_EMP<br /> 3 WHERE LAST_NAME = 'MAGEE';<br />no rows selected<br />Agora com a correção do nome temos a pesquisa com<br />sucesso.<br />SQL> SELECT FIRST_NAME, LAST_NAME, TITLE<br /> 2 FROM S_EMP<br /> 3 WHERE LAST_NAME = 'Magee';<br />FIRST_NAME LAST_NAME TITLE<br />----------------------------------- -------------------------<br />Colin Magee Sales Representative<br />Usando a clausula where com o comando between ... and<br />..., que tem a finalidade de trazer valores delimitados<br />dentro de um determinado espaço, no exemplo abaixo o comando<br />traz uma seleção que está entre 09-may-91 and 17-jun-91.<br />SQL> SELECT FIRST_NAME,LAST_NAME, START_DATE89<br /> 2 FROM S_EMP<br /> 3 WHERE START_DATE BETWEEN '09-MAY-91'<br /> 4 AND '17-JUN-91';<br />FIRST_NAME LAST_NAME START_DAT<br />------------------------- ------------------------- ---------<br />Midori Nagayama 17-JUN-91<br />Alexander Markarian 26-MAY-91<br />Sylvie Schwartz 09-MAY-91<br />Agora vamos fazer um desc na tabela s_dept:<br />SQL> DESC S_DEPT;<br /> Name Null? Type<br /> ------------------------------- -------- ----<br /> ID NOT NULL NUMBER(7)<br /> NAME NOT NULL VARCHAR2(25)<br /> REGION_ID NUMBER(7)<br />Agora vamos fazer uma seleção onde region_id seja (1,3) e<br />somente estes.<br />SQL> SELECT ID,NAME,REGION_ID<br /> 2 FROM S_DEPT<br /> 3 WHERE REGION_ID IN (1,3);<br /> ID NAME REGION_ID<br />--------- ------------------------- ---------<br /> 10 Finance 1<br /> 31 Sales 1<br /> 33 Sales 3<br /> 41 Operations 1<br /> 43 Operations 3<br /> 50 Administration 1<br />6 rows selected.<br />No exemplo abaixo o uso comando null na clausula where,<br />especifica e traz o s_customer onde sales_rep_id for nulo ou<br />seja onde o customer não tiver sales_rep_id. Mas neste<br />exemplo abaixo não cumpre a finalidade, apesar de estar<br />correto.90<br />SQL> select ID,NAME,CREDIT_RATING<br /> 2 FROM S_CUSTOMER<br /> 3 WHERE SALES_REP_ID = NULL;<br />no rows selected<br />Forma errada de se pesquisar por um valor nulo:<br />SQL> SELECT ID,NAME,CREDIT_RATING<br /> 2 FROM S_CUSTOMER<br /> 3 WHERE SALES_REP_ID =' ';<br />ERROR:<br />ORA-01722: invalid number<br />no rows selected<br />Veja a maneira correta de pesquisar usando a clausula<br />where com a condição de campos nulos.<br />SQL> SELECT ID,NAME,CREDIT_RATING<br /> 2 FROM S_CUSTOMER<br /> 3 WHERE SALES_REP_ID IS NULL;<br /> ID NAME CREDIT_RA<br />--------- ------------------ ---------<br /> 207 Sweet Rock Sports GOOD<br />/<br />O exemplo abaixo demostra o uso do comando and dentro da<br />clausula where, onde dentro da tabela s_emp será pesquisado<br />os registros que sejam do departamento 41 e com o nome do<br />title \" stock clerk\" .<br />SQL> SELECT LAST_NAME,SALARY,DEPT_ID,TITLE<br /> 2 FROM S_EMP<br /> 3 WHERE DEPT_ID = 41<br /> 4 AND TITLE = 'Stock Clerk';<br />LAST_NAME SALARY DEPT_ID TITLE<br />----------------------- --------- --------- ----------------<br />Maduro 1400 41 Stock Clerk<br />Smith 940 41 Stock Clerk91<br />Este exemplo mostra o uso do comando \" OR\" dentro da<br />clausula WHERE onde no caso a pesquisa é feita na tabela<br />\" S_EMP\" trazendo todos os registros que contenham o dept_id<br />igual a 41 como também todos aqueles que possuam o title<br />igual a \" Stock Clerk\" .<br />Vamos<br />SQL> SELECT LAST_NAME,SALARY,DEPT_ID,TITLE<br /> 2 FROM S_EMP<br /> 3 where DEPT_ID = 41<br /> 4 OR TITLE = 'Stock Clerk';<br />LAST_NAME SALARY DEPT_ID TITLE<br />------------------------- --------- --------- ---------------<br />----------<br />Ngao 1450 41 VP, Operations<br />Urguhart 1200 41 Warehouse<br />Manager<br />Maduro 1400 41 Stock Clerk<br />Smith 940 41 Stock Clerk<br />Nozaki 1200 42 Stock Clerk<br />Patel 795 42 Stock Clerk<br />Newman 750 43 Stock Clerk<br />Markarian 850 43 Stock Clerk<br />Chang 800 44 Stock Clerk<br />Patel 795 34 Stock Clerk<br />Dancs 860 45 Stock Clerk<br />Schwartz 1100 45 Stock Clerk<br />12 rows selected.<br />Nos exemplos abaixo temos como usar o AND e o OR juntos<br />dentro de uma clausula where, no primeiro exemplo o select<br />traz dentro da tabela s_emp todos registros onde o salário<br />seja maior ou igual a 1000 mas somente no departamento 44 e<br />traz todos os registros do departamento 42, independente da<br />condição de salário.<br />Vamos ao exemplo:<br />SQL> select last_name,salary,dept_id<br /> 2 from s_emp<br /> 3 where salary >= 1000<br /> 4 and dept_id = 44<br /> 5 or dept_id = 42;<br />LAST_NAME SALARY DEPT_ID92<br />------------------------- --------- ---------<br />Menchu 1250 42<br />Catchpole 1300 44<br />Nozaki 1200 42<br />Patel 795 42<br />Com o uso do parênteses nós podemos no exemplo abaixo<br />selecionar todos os registros do departamento 44 e 42 que<br />recebam salário maior ou igual a 1000, diferente do exemplo<br />anterior, portanto o uso do parênteses determina que a<br />condição da clausula WHERE do salário sirva par os dois.<br />SQL> select last_name,salary,dept_id<br /> 2 from s_emp<br /> 3 where salary >= 1000<br /> 4 and (dept_id = 44<br /> 5 or dept_id = 42);<br />LAST_NAME SALARY DEPT_ID<br />------------------------- --------- ---------<br />Menchu 1250 42<br />Catchpole 1300 44<br />Nozaki 1200 42<br />Na clausula where usamos o operador like que serve no<br />geral para trazer valores aproximados ou parecidos na<br />pesquisa, podemos ver abaixo os exemplos:<br />No primeiro caso abaixo o operador like esta pesquisando o<br />last_name da tabela s_emp que se inicia com a letra (m).<br />SQL> SELECT LAST_NAME<br /> 2 FROM S_EMP<br /> 3 WHERE LAST_NAME LIKE 'M%'<br /> 4 ;<br />LAST_NAME<br />-------------------------<br />Menchu<br />Magee<br />Maduro<br />Markarian93<br />Agora no exemplo abaixo o comando like faz uma pesquisa<br />no start_date da tabela s_emp onde a data termina em 91.<br />SQL> SELECT LAST_NAME,START_DATE<br /> 2 FROM S_EMP<br /> 3 WHERE START_DATE LIKE '%91';<br />LAST_NAME START_DAT<br />------------------------- ---------<br />Nagayama 17-JUN-91<br />Urguhart 18-JAN-91<br />Havel 27-FEB-91<br />Sedeghi 18-FEB-91<br />Dumas 09-OCT-91<br />Nozaki 09-FEB-91<br />Patel 06-AUG-91<br />Newman 21-JUL-91<br />Markarian 26-MAY-91<br />Dancs 17-MAR-91<br />Schwartz 09-MAY-91<br />11 rows selected.<br />No exemplo abaixo é feito uma seleção na tabela s_emp onde a<br />segunda letra do nome começa com a, não deu certo no caso<br />abaixo porque a letra digitada é maiúscula e na tabela a ser<br />pesquisada as segundas letras são minúsculas.<br />SQL> SELECT LAST_NAME,START_DATE<br /> 2 FROM S_EMP<br /> 3 WHERE LAST_NAME LIKE '_A%';<br />no rows selected<br />Mas neste agora temos a pesquisa concluída satisfazendo<br />a condição da segunda letra da clausula where, observe o uso<br />do hífen.<br />SQL> SELECT LAST_NAME,START_DATE<br /> 2 FROM S_EMP<br /> 3 WHERE LAST_NAME LIKE '_a%';<br />LAST_NAME START_DAT<br />------------------------- ---------<br />Nagayama 17-JUN-91<br />Catchpole 09-FEB-92<br />Havel 27-FEB-9194<br />Magee 14-MAY-90<br />Maduro 07-FEB-92<br />Patel 06-AUG-91<br />Markarian 26-MAY-91<br />Patel 17-OCT-90<br />Dancs 17-MAR-91<br />9 rows selected.<br />Quando optarmos por trazer somente os dados onde não<br />contenham uma letra qualquer, usamos no comando notlike. A<br />seguinte expressão : NOT LIKE '%A%', no exemplo abaixo não<br />traria o resultado desejado, porque as letras na tabela são<br />minúsculas \" a\" e a utilizada foi maiúscula \" A\" .<br />SQL> SELECT LAST_NAME<br /> 2 FROM S_EMP<br /> 3 WHERE LAST_NAME NOT LIKE '%A%';<br />LAST_NAME<br />-------------------------<br />Velasquez<br />Ngao<br />Nagayama<br />Quick-To-See<br />Ropeburn<br />Urguhart<br />Menchu<br />Biri<br />Catchpole<br />Havel<br />25 rows selected.<br />Agora nós estamos usando uma letra que está no mesmo<br />formato dos dados na tabela e então a execução do select<br />trará todos os nomes da tabela s_emp que não tenham a letra<br />\" a\" .95<br />Vamos ao exemplo:<br />SQL> SELECT LAST_NAME<br /> 2 FROM S_EMP<br /> 3 WHERE LAST_NAME NOT LIKE '%a%';<br />LAST_NAME<br />-------------------------<br />Quick-To-See<br />Ropeburn<br />Menchu<br />Biri<br />Giljum<br />Sedeghi<br />Nguyen<br />Smith<br />8 rows selected.<br />No exemplo abaixo estamos selecionando somente<br />funcionários da tabela s_emp, que receberam comissão,<br />portanto na clausula where temos o comando condicional \" is<br />not null\" .<br />SQL> SELECT LAST_NAME, TITLE, COMMISSION_PCT<br /> 2 FROM S_EMP<br /> 3 WHERE COMMISSION_PCT IS NOT NULL;<br />LAST_NAME TITLE COMMISSION_PCT<br />------------------------------------------- --------------<br />Magee Sales Representative 10<br />Giljum Sales Representative 12.5<br />Sedeghi Sales Representative 10<br />Nguyen Sales Representative 15<br />Dumas Sales Representative 17.596<br />Agora queremos todos os funcionários que não recebem<br />comissão ou seja que possuam o campo COMMISSION_PCT nulo.<br />SQL> SELECT LAST_NAME, TITLE, COMMISSION_PCT<br /> 2 FROM S_EMP<br /> 3 WHERE COMMISSION_PCT IS NULL;<br />LAST_NAME TITLE COMMISSION_PCT<br />--------------- ------------------------- --------------<br />Velasquez President<br />Ngao VP, Operations<br />Nagayama VP, Sales<br />Quick-To-See VP, Finance<br />Ropeburn VP, Administration<br />Urguhart Warehouse Manager<br />Menchu Warehouse Manager<br />Biri Warehouse Manager<br />Catchpole Warehouse Manager<br />Havel Warehouse Manager<br />Maduro Stock Clerk<br />Smith Stock Clerk<br />Nozaki Stock Clerk<br />20 rows selected.<br />FINAL DE CAPÍTULO97<br />O Usuário inserindo valores em tempo de execução:<br />O uso do ‘&’ e do ‘SET OFF’, ‘ SET VRERIFY ON’ E ETC.<br />A finalidade dos exemplos abaixo é demostrar como fazer<br />quando queremos que o usuário entre com valores, em tempo de<br />execução. É sempre bom lembrar que estamos no SQL Plus e os<br />artifícios de entrada não são tão amigáveis, mas servem para<br />que em uma programação posterior, possamos usá–los para<br />execução.<br />Primeiramente o usuário entra com dados em tempo de<br />execução, para em seguida ser executada uma pesquisa através<br />de um cmdo sql.<br />Vemos o uso do \" &\" para que o usuário entre com dados.<br />No exemplo abaixo temos um pedido de entrada de um numero por<br />isso é que o numero_do_dept não está entre aspas.<br />Podemos notar que aparece o “old” valor e o “new” valor<br />isso é devido ao cmdo set verify on, se quisermos que não<br />apareça, deve ser usado o set verify off.<br />Vamos ao Exemplo: No exemplo queremos selecionar o<br />id,last_name,salary da tabela s_emp onde o dept_id seja igual<br />ao valor digitado pelo usuário através &numero_do_dept, que<br />no exemplo será o nr 31.<br />SQL> set verify onSQL> select id,last_name,salary 2 from<br />s_emp 3 where dept_id=&numero_do_dept;<br />Enter value for numero_do_dept: 31old 3: where<br />dept_id=&numero_do_deptnew 3: where dept_id=31 ID<br />LAST_NAME SALARY<br />--------- ------------------------- ---------<br /> 3 Nagayama 1400<br /> 11 Magee 1400<br />Agora não aparecerá o new e old valor por causa do SET<br />VERIFY OFF.<br />SQL> set verify off<br />SQL> select id,last_name,salary<br /> 2 from s_emp<br /> 3 where dept_id=&numero_do_dept;<br />Enter value for numero_do_dept: 31 ID LAST_NAME<br />SALARY--------- ------------------------- --------- 3<br />Nagayama 1400<br /> 11 Magee 140098<br />Teremos um exemplo de como usuário pode entrar com<br />dados quer seja do tipo caracter ou numérico, note que há o<br />uso das aspas, temos que ter em mente que o formato a ser<br />digitado especificamente no exemplo abaixo tem que ser<br />idêntico ao que está na tabela, com maiúsculas e minúsculas<br />pois não estamos usando nenhum comando para fazer a<br />conversão.<br />Vamos ao Exemplo: estamos selecionando id,last_name,salary da<br />tabela s_emp onde o campo da coluna title seja exatamente<br />igual ao nome digitado pelo usuário pela a opção ‘&job_title'<br />SQL> select id,last_name,salary<br /> 2 from s_emp<br /> 3 where title ='&job_title';<br />Enter value for job_title: Stock Clerk<br /> ID LAST_NAME SALARY<br />--------- ------------------------- ---------<br /> 16 Maduro 1400<br /> 17 Smith 940<br /> 18 Nozaki 1200<br /> 19 Patel 795<br /> 20 Newman 750<br /> 21 Markarian 850<br /> 22 Chang 800<br /> 23 Patel 795<br /> 24 Dancs 860<br /> 25 Schwartz 1100<br />10 rows selected.<br />Agora vamos ver como que o usuário poderá entrar com o<br />nome da coluna e com a condição de pesquisa que ele deseja<br />que seja estabelecida na cláusula WHERE. Neste caso temos um<br />exemplo onde é requerida a entrada de um dado numérico.<br />Vamos ao Exemplo: estamos selecionando o id, uma coluna<br />sugerida pelo usuário(logo que exista), referente a tabela<br />s_emp e como também definindo uma condição para tal<br />pesquisa.SQL> select id,&nome_coluna 2 from s_emp 3 where<br />&condição;<br />Enter value for nome_coluna: LAST_NAME<br />Enter value for condição: SALARY > 100<br /> ID LAST_NAME<br />--------- -------------------------99<br /> 1 Velasquez<br /> 2 Ngao<br /> 3 Nagayama<br /> 4 Quick-To-See<br /> 5 Ropeburn<br /> 6 Urguhart<br /> 7 Menchu<br /> 8 Biri<br />Outro exemplo em que o usuário entra com o valor da<br />coluna e da condição WHERE.<br />SQL> select id,&nome_coluna 2 from s_ord 3 where<br />&condição;<br />Enter value for nome_coluna: date_orderedEnter value for<br />condição: total>30000<br /> ID DATE_ORDE<br />--------- ---------<br /> 100 31-AUG-92<br /> 104 03-SEP-92<br /> 107 07-SEP-92<br /> 108 07-SEP-92<br /> 109 08-SEP-92<br /> 97 28-AUG-92<br />6 rows selected.<br />Construindo um script usando as opções para que o usuário<br />possa entrar com dados e como também mostrar em tela somente<br />o prompt.<br />O cmdo set echo off serve para que em tempo de<br />execução não se exiba os comandos do sql. Já o set echo on<br />serve para retornar a forma anterior.<br /> O cmdo accept serve para preparar um prompt para<br />receber um valor.<br /> Neste exemplo também temos a criação de uma variável<br />v_name que recebe valores.<br />Estamos preparando o ambiente para receber valores que<br />serão armazenados dentro de uma variável, para após isto,<br />serem feitas comparações dentro da cláusula where.100<br />Estamos usando duas tabelas s_dept e s_region, o and é<br />uma função onde complementa a cláusula where, e o upper no<br />dpt.name está passando o conteúdo do nome do dept<br />para maiúsculo para que seja efetuada a comparação com o nome<br />digitado pelo o usuário que por sua vez recebe um upper que o<br />transforma em maiúsculo, essa alternativa é feita<br />porque não sabemos qual é o formato do dado na tabela.<br />Vamos ao Exemplo:<br />SET ECHO OFF<br />ACCEPT V_NAME PROMPT 'DÊ O NOME DO DEPARTAMENTO:'<br />SELECT DPT.NAME, REG.ID, REG.NAME \" NOME DA REGIÃO\" <br />FROM S_DEPT DPT, S_REGION REG<br />WHERE DPT.REGION_ID = REG.ID -- está fazendo o join entre as<br />tabelas<br />AND UPPER(DPT.NAME) LIKE UPPER('%&V_NAME%')<br />/<br />SET ECHO ON<br />Como estamos gerando um SCRIPT os comandos devem ficar<br />guardados dentro de um arquivo que possua a extensão *.SQL e<br />preparado da forma acima. Uma vez no SQL se desejarmos<br />executar o nosso SCRIPT temos que seguir o procedimento<br />descrito abaixo, usando \" @\" e o nome do arquivo, ou \" START\" <br />e o nome do arquivo.<br />SET ECHO ON<br />SQL> @TEST.SQL<br />SQL> SET ECHO OFF<br />DÊ O NOME DO DEPARTAMENTO:sales<br />old 4: AND UPPER(DPT.NAME) LIKE UPPER('%&V_NAME%')<br />new 4: AND UPPER(DPT.NAME) LIKE UPPER('%sales%')<br />NAME ID NOME DA REGIÃO<br />---- --------- ---------------------------------------------<br />Sales 1 North America<br />Sales 2 South America<br />Sales 3 Africa / Middle East<br />Sales 4 Ásia<br />Sales 5 Europe101<br />Podemos notar que no exemplo anterior foi mostrado o OLD e o<br />NEW valores da variável, para que não mostre, temos que usar<br />o SET VERIFY OOF, veja abaixo:<br />SET VERIFY OFF<br />SET ECHO OFF<br />ACCEPT V_NAME PROMPT 'DÊ O NOME DO DEPARTAMENTO:'<br />SELECT DPT.NAME, REG.ID, REG.NAME \" NOME DA REGIÃO\" <br />FROM S_DEPT DPT, S_REGION REG<br />WHERE DPT.REGION_ID = REG.ID<br />AND UPPER(DPT.NAME) LIKE UPPER('%&V_NAME%')<br />/<br />SET ECHO ON<br />SQL> START TEST.SQL<br />SQL> SET VERIFY OFF<br />SQL> SET ECHO OFF<br />DÊ O NOME DO DEPARTAMENTO:SALES<br />NAME ID NOME DA REGIÃO<br />-------------------------------------------------------------<br />Sales 1 North America<br />Sales 2 South America<br />Sales 3 Africa / Middle East<br />Sales 4 Ásia<br />Sales 5 Europe<br />Input truncated to 11 characters102<br />FINAL DE CAPÍTULO103<br />Finalidade do capítulo é tratar sobre exemplos diversos.<br />Vamos descrever o uso dos cmdos abaixo:Concat, usado<br />para concatenar o conteúdo de last_name mais o conteúdo de<br />title jogando dentro de \" vice presidência\" apper está<br />transformando o conteúdo de last_name em maiúsculo, o cmdo<br />substr(title,3) reduz as três primeiras posições do conteúdo<br />da coluna title que no caso é \" vp\" , o cmdo like pesquisa algo<br />parecido com \" vp\" = 'vp%'.<br />SQL> SELECT CONCAT(UPPER(last_name),<br /> 2 substr(title,3)) \" vice presidência\" <br /> 3 from s_emp<br /> 4 where title LIKE 'VP%';<br /> vice presidência<br />------------------------------------------------<br />NGAO, Operations<br />NAGAYAMA, Sales<br />QUICK-TO-SEE, Finance<br />ROPEBURN, Administration<br />Para colocarmos um valor caracter dentro de um campo que seja<br />number, devemos usar a conversão \" TO_CHAR\" , funções e cmdos<br />usados no exemplo abaixo:<br />\" NVL\" usado para manipulação de valores nulos.<br />\" TO_CHAR\" usado no caso para a conversão de \" maneger_id\" que<br />tem um formato numérico, a fim de prepará-lo para receber um<br />valor que não é numérico.<br />\" is null\" função que indica o valor nulo na coluna.<br />SQL> select last_name,<br /> 2 nvl(to_char(manager_id),'não tem gerente')<br /> 3 from s_emp<br /> 4 where manager_id is null;<br />LAST_NAME NVL(TO_CHAR(MANAGER_ID),'NÃOTEMGERENTE')<br />--------------- ----------------------------------------<br />Velasquez não tem gerente104<br />Comandos ultilizados no exemplo abaixo:<br />\" TO_CHAR\" neste caso com a função de fazer a conversão da<br />data default do sistema para a data desejada, onde os<br />formatos são colocados da seguinte forma e com as seguintes<br />funções: Day = dia por extenso, Month = nome do mês por<br />extenso, ddth nome do dia em forma de numeral, YYYY = ano no<br />padrão numeral, o cmdo \" NEXT DAY ' tem a função de ir para<br />uma próxima data que no caso faz referencia a próxima sexta<br />feira.( next_day,'friday').O cmdo \" ADD_MONTHS\" faz a soma de<br />6 meses a data_ordered (date_ordered,\" 6\" ) o seis faz<br />referencia a seis meses.<br />SQL> select to_char(next_day(add_months<br /> 2 (date_ordered,6),'friday'),<br /> 3 'day,month ddth,yyyy') \" próxima sexta<br />daqui a 6 meses\" <br /> 4 from s_ord<br /> 5 order by date_ordered;<br /> próxima sexta daqui a 6 meses<br />-------------------------------------------------------------<br />friday ,march 05th,1993<br />friday ,march 05th,1993<br />friday ,march 05th,1993<br />friday ,march 05th,1993<br />friday ,march 05th,1993<br />friday ,march 05th,1993<br />friday ,march 05th,1993<br />friday ,march 05th,1993<br />friday ,march 05th,1993<br />friday ,march 05th,1993<br />friday ,march 12th,1993<br />friday ,march 12th,1993<br />friday ,march 12th,1993<br />friday ,march 12th,1993<br />friday ,march 12th,1993<br />friday ,march 12th,1993<br />16 rows selected.105<br />Faça do site http://www.geocities.com/hollywood/makeup/2765/bs.htm o melhor local para baixar<br />apostilas grátis<br />Envie uma pequena contribuição para<br />Leonardo R Motta<br />Rua Caxinava nº 56<br />Jardim Umarizal<br />São Paulo - SP<br />Informe também que apostila gostaria de poder baixar gratuitamente no site<br />Será pesquisado livros sobre temas escolhido pela grande maioria e suas apostilas<br />disponibilizadas gratuitamente<br />