Sei sulla pagina 1di 10

Este o terceiro artigo relacionado com programao de Banco de Dados, sairemos um pouco de teoria e vamos abordar mais a prtica

a explicando a linguagem SQL. No segundo artigo o enfoque foi explicar a arquitetura cliente servidor com os modelos de 2 e 3 camadas.

SQL (Structured Query Language) Quando os Bancos de Dados Relacionais estavam sendo desenvolvidos, foram criadas linguagens destinadas sua manipulao. O departamento de Pesquisa da IBM desenvolveu a SQL como forma de interface para o sistema de BD relacional denominado SYSREM R, incio dos anos 70. Em 1986 o American National Standard Institute ( ANSI) , publicou um padro SQL.A SQL estabeleceu-se como linguagem padro de Banco de Dados Relacional. SQL apresenta uma srie de comandos que permitem a definio dos dados, chamada de DDL ( Data Definition Language) , composta entre outros pelos comandos Create, que destinado a criao do Banco de Dados, das tabelas que o compe, alm das relaes existentes entre as tabelas. Como exemplo de comandos da classe DDL temos os comandos Create, Alter e Drop. Os comandos da srie DML ( Data Manipulation Language), destinados a consultas, inseres, excluses e alteraes em um ou mais registros de uma ou mais tabelas de maneira simultnea. Com exemplo de comandos da classe DML temos os comandos Select, Insert, Update e Delete. Um subclasse de comandos DML, a DCL ( Data Control Language), dispe de comandos de controle como Grant e Revoke. A linguagem SQL tem como grandes virtudes sua capacidade de gerenciar ndices, sem necessidade de controle individualizado de ndice corrente, algo muito comum nas linguagens de manipulao de dados do tipo registro a registro.Outra caracterstica muito importante disponvel em SQL sua capacidade de construo de vises, que so formas de visualizarmos os dados na forma de listagens independente das tabelas e organizao lgica dos dados. Outra caracterstica interessante da linguagem SQL a sua capacidade que dispomos de cancelar uma srie de atualizaes ou de as gravarmos, depois de iniciarmos uma seqncia de atualizaes. Os comandos Commit e Rollback so responsveis por estas facilidades. Devemos notar que a linguagem SQL consegue implementar estas solues, somente pelo fato de estar baseada em Banco de Dados, que garante por si mesmo a integridade das relaes existentes entre as tabelas e seus ndices. COMANDOS SQL
Comando SELECT INSERT UPDATE DELETE CREATE ALTER DROP RENAME TRUNCATE COMMIT ROLLBACK SAVEPOINT Descrio Recupera dados do Banco de Dados Insere novas linhas, altera linhas existentes e remove linhas de tabelas do banco de dados, respectivamente. Estes comandos so conhecidos como comandos DML (Data Manipulation Language). Cria, altera e remove objetos do banco de dados. So conhecidos como comandos DDL (Data Definition Language).

Gerenciam as modificaes realizadas pelos comandos DML. As modificaes efetuadas pelos comandos DML podem ser agrupadas em transaes lgicas.

GRANT REVOKE

Atribuem e removem direitos de acesso ao banco de dados e aos objetos a ele pertencentes. So conhecidos como comandos DCL (Data Control Language).

DML ( Data Manipulation Languagem) Veremos agora os comandos SQL DML destinados a manipulao dos dados.Comandos: COMANDO SELECT Sintaxe: Select <campos da tabela> From <nome da tabela> Where <condio> Exemplo 1: Selecionar linhas de uma tabela SELECT NUMERO, NOME FROM EMPREGADOS; Exemplo 2: Utilizando a clusula DISTINCT para suprimir linhas duplicatas. SELECT DISTINCT CARGO FROM EMPREGADOS; Exemplo 3: Utilizando a clusula DISTINCT com vrias colunas. SELECT DISTINCT CARGO, NUMERO_DEPT FROM EMPREGADOS; Exemplo 4: Utilizando a clusula * para listar todas as colunas da tabela. SELECT * FROM EMPREGADOS Exemplo 5: Utilizando operadores aritmticos (+, -,*, / ) na clusula Select. SELECT NOME, SALARIO * 12, DT_ADMISSAO FROM EMPREGADOS; Exemplo 6: Utilizando Alias. SELECT NOME, SALARIO * 12 AS SAL_ANUAL,DT_ADMISSAO FROM EMPREGADOS; OU SELECT NOME, SALARIO * 12 "SAL ANUAL", DT_ADMISSAO FROM EMPREGADOS; Exemplo 7: Utilizando operador de concatenao. SELECT NOME||" "||SOBRENOME FROM EMPREGADOS; Como Ordenar e Limitar as Linhas Selecionadas Exemplo 1: Ordenando as linhas selecionadas com a clusula ORDER BY SELECT NOME, SALARIO FROM EMPREGADOS ORDER BY SALARIO; OU SELECT NOME, SALARIO FROM EMPREGADOS ORDER BY SALARIO DESC; Obs: Na ordenao ascendente, valores NULOS aparecem no final. Exemplo 2: Ordenando pela posio da coluna selecionada SELECT NOME, SALARIO * 12 FROM EMPREGADOS ORDER BY SALARIO * 12; OU SELECT NOME, SALARIO * 12 FROM EMPREGADOS ORDER BY 2; Exemplo 3: Selecionando apenas os empregados lotados no departamento 20.

SELECT NOME, NUMERO_DEPT, SALARIO FROM EMPREGADOS WHERE NUMERO_DEPT = 20 ORDER BY SALARIO; Exemplo 4: Selecionando apenas o empregado denominado SMITH. SELECT NOME, NUMERO_DEPT, SALARIO FROM EMPREGADOS WHERE NOME = "CELIO"; Exemplo 5: Selecionando com operadores lgicos. SELECT NOME, NUMERO_DEPT, SALARIO FROM EMPREGADOS WHERE SALARIO> 1000; Observaes: 1. Operadores para comparaes lgicas: = > >= <= <> 2. Outros comparadores:
BETWEEN ... AND ... ou NOT BETWEEN IN (Lista) LIKE IS NULL ou NOT IN ou NOT LIKE ou IS NOT NULL

3. Operadores lgicos: AND OR NOT Exemplo 6: Selecionando linhas com BETWEEN ... AND ... SELECT NOME, DT_ADMISSAO FROM EMPREGADOS WHERE DT_ADMISSAO BETWEEN "28-SEP-90" AND "30-JAN-91"; Exemplo 7: Selecionando linhas com a clusula IN. SELECT NOME, NUMERO_DEPT, SALARIO FROM EMPREGADOS WHERE NUMERO_DEPT IN (10, 20) ORDER BY NUMERO_DEPT, SALARIO; Exemplo 8: Selecionando linhas com a clusula LIKE. SELECT NOME, SALARIO FROM EMPREGADOS WHERE NOME LIKE "S%" ORDER BY NOME; OU SELECT NOME, SALARIO FROM EMPREGADOS WHERE NOME NOT LIKE "%I%" ORDER BY NOME; OU SELECT NOME, SALARIO FROM EMPREGADOS WHERE NOME LIKE "_A%"; Observaes: - "%" representa nenhum ou muitos caracteres. - "_" representa um nico caracter. Exemplo 9: Selecionando linhas com a clusula IS NULL.

A coluna Num_supervisor contm o nmero do empregado que supervisiona o empregado corrente. SELECT NUMERO, NOME, CARGO, NUM_SUPERVISOR FROM EMPREGADOS; Com esta Query recuperamos o nico empregado da empresa que no gerenciado por ningum, isto , o Presidente da empresa. SELECT NOME, CARGO, NUM_SUPERVISOR FROM EMPREGADOS WHERE NUM_SUPERVISOR IS NULL; Observao: O resultado da clusula Where abaixo sempre falso pois um valor nulo no pode ser igual ou diferente de outro valor, mesmo que este outro valor seja nulo. Se valores nulos forem comparados por operadores que no o "IS NULL" o resultado ser sempre falso. SELECT NOME, CARGO, NUM_SUPERVISOR FROM EMPREGADOS WHERE NUM_SUPERVISOR = NULL; Exemplo 10: Selecionando linhas com operadores lgicos. SELECT NOME, SALARIO, NUMERO_DEPT FROM EMPREGADOS WHERE SALARIO >= 3000 AND (NUMERO_DEPT = 10 OR NUMERO_DEPT = 30); Funes Aplicadas a Linhas H dois tipos de funes: - Funes de linhas - Funes de grupos Um funo de linha retorna um resultado por linha da tabela acessada. J uma funo de grupo retorna um resultado por grupo de registros. Exemplos de Funes de Linha: - LOWER ("UFF") uff - UPPER ("uff") UFF - INITCAP ("UNIVERSIDADE FEDERAL") Universidade Federal - CONCAT ("String1", "String2") String1String2 - SUBSTR ("String", 1, 3) Str - LENGTH ("UFF") 3 - NVL (SAL, 0) Se SAL for NULO seu valor ser convertido para zero. - ROUND (78.731, 2) 78.73 (At 4 p/ baixo, Acima de 4 p/ cima) - ROUND (78.731, 0) 79 - TRUNC (78.731, 2) 78.73 - TRUNC (78.731) 78 - MOD (100, 30) 10 Exemplo 1: Utilizao da funo UPPER em uma sentena SQL. SELECT NOME, SALARIO, NUMERO_DEPT FROM EMPREGADOS WHERE UPPER (NOME) = "CELIO"; Exemplo 2: Utilizao das funes SUBSTR e LENGTH em uma sentena SQL.

SELECT NOME, LENGTH (NOME) FROM EMPREGADOS WHERE SUBSTR (NOME, 1, 3) = "CEL"; Como selecionar dados de mais de uma tabela Para se exibir dados de mais de uma tabela, atravs de um comando SQL, preciso definir condies de juno. (Joins) Os joins geralmente ocorrem entre valores de chave primria e de chave estrangeira. Tipos de Joins: Equijoin Non-equijoin Outer join Self Join Set operators Um produto cartesiano geralmente ocorre quando a condio de juno omitida ou invlida. Para evitar produtos cartesianos preciso incluir, na clusula Where, condies de juno vlidas. Exemplo 1:Uma juno simples entre a Tabela de Empregados (Emp) e a tabela de Departamentos (Dept). SELECT EMPREGADOS.NOME, NUMERO_DEPT, DEPARTAMENTOS.NOME FROM EMPREGADOS, DEPARTAMENTOS WHERE EMPREGADOS.NUMERO_DEPT = DEPARTAMENTOS.NUMERO; Obs: Haver um ganho de desempenho e de clareza se voc sempre qualificar as colunas com o nome das tabelas s quais elas pertencem. Exemplo 2: Uma juno simples entre a Tabela de Empregados e a tabela de Departamentos considerando apenas aqueles empregados que ganham mais de 2500,00. SELECT EMPREGADOS.NOME, EMPREGADOS.NUMERO_DEPT, DEPARTAMENTOS.NOME FROM EMPREGADOS, DEPARTAMENTOS WHERE EMPREGADOS.NUMERO_DEPT = DEPARTAMENTOS.NUMERO AND EMPREGADOS.SALARIO> 2500; OU SELECT E.NOME, E.NUMERO_DEPT, D.NOME FROM EMPREGADOS E, DEPARTAMENTOS D WHERE E.NUMERO_DEPT = D.NUMERO AND E.SALARIO> 2500; Exemplo 3: Uma juno entre a tabela de Empregados, a tabela de Departamentos e a tabela de Dependentes. SELECT E.NOME, E.NUMERO_DEPT, DPT.NOME, DEP.NOME FROM EMPREGADOS E, DEPARTAMENTOS DPT, DEPENDENTES DEP WHERE E.NUMERO_DEPT = DPT.NUMERO AND E.NUMERO = DEP.NUMERO_EMP; Funes de Grupo Funes de grupo operam com um conjunto de linhas para dar um resultado por grupo de linhas. Um conjunto de linhas pode ser uma tabela inteira ou linhas desta tabela divididas em grupos. Funes de grupo podem aparecer tanto na clusula Select quanto na clusula Having. A clusula Group By divide as linhas de uma ou mais tabelas em grupos de linhas. A clusula Having seleciona os grupos que sero aceitos.

Funes de Grupo Existentes: AVG COUNT MAX MIN STDDEV SUM VARIANCE Observaes: A clusula Distinct pode ser utilizada para que sejam considerados apenas valores no duplicatas. Todas as funes de grupo ignoram valores nulos. Para substituir um valor nulo por outro valor utilize a funo NVL. Exemplo 1: Utilizao de funes de grupo, considerando todas as linhas de uma tabela um nico grupo. SELECT AVG(SALARIO), MAX(SALARIO), MIN(SALARIO), SUM(SALARIO) FROM EMPREGADOS; OU SELECT MIN(NOME), MAX(NOME) FROM EMPREGADOS; Exemplo 2: Um nico grupo definido atravs da clusula Where. SELECT AVG(SALARIO), MAX(SALARIO), MIN(SALARIO), SUM(SALARIO) FROM EMPREGADOS WHERE CARGO LIKE "VEND%"; Exemplo 3: Utilizao da funo COUNT para contar o nmero de empregados lotados no departamento nmero 10. SELECT COUNT(*) FROM EMPREGADOS WHERE NUMERO_DEPT = 10; Exemplo 4: Utilizao da funo COUNT para contar o nmero de empregados que possuem percentual de comisso diferente de nulo. SELECT COUNT(PERC_COMISSAO) FROM EMPREGADOS; Exemplo 5: Utilizao da funo COUNT para contar o nmero de empregados na tabela. SELECT COUNT(NVL(PERC_COMISSAO, 0)) FROM EMPREGADOS; Observaes: COUNT(*) conta o nmero de linhas na tabela. COUNT(PERC_COMISSAO) conta o nmero de linhas com percentual de comisso diferente de nulo. COUNT(NUMERO) conta o nmero de linhas na tabela uma vez que a coluna NUMERO a chave primria da tabela e toda chave primria no pode conter valores nulos. A clusula Group By Exemplo 6: Utilizao da clusula GROUP BY e da funo COUNT para se contar quantos empregados esto lotados em cada departamento. SELECT NUMERO_DEPT, COUNT(*) FROM EMPREGADOS GROUP BY NUMERO_DEPT; Observaes: Qualquer coluna includa na clusula SELECT, se no estiver em uma funo de grupo, dever constar da clusula GROUP BY.

Com a clusula WHERE possvel excluir determinadas linhas dos grupos. Por default as linhas so ordenadas ascendentemente conforme a lista de colunas especificada na clusula GROUP BY. Para modificar este comportamento preciso utilizar a clusula ORDER BY. Exemplo 7: Utilizao da clusula Group By, da funo COUNT e de um JOIN para se contar quantos empregados esto lotados em cada departamento. SELECT D.NOME "DEPARTAMENTO", COUNT(*) "QTD" FROM EMPREGADOS E, DEPARTAMENTOS D WHERE E.NUMERO_DEPT = D.NUMERO GROUP BY D.NOME; Exemplo 8: A query abaixo est correta? A inteno listar o nmero dos departamentos seguido da mdia salarial. No entanto, deseja-se listar apenas aqueles departamentos cuja mdia salarial superior a 2000. SELECT NUMERO_DEPT, AVG(SALARIO) FROM EMPREGADOS WHERE AVG(SALARIO)> 2000 GROUP BY NUMERO_DEPT; A clusula Having Para se restringir a incluso de grupos no se pode utilizar a clusula WHERE. A clusula WHERE deve ser utilizada para se restringir a incluso de linhas em um grupo. Para se omitir a incluso de grupos inteiros do resultado de uma query deve-se utilizar a clusula HAVING. Exemplo 9: A utilizao da clusula HAVING para listar o nmero dos departamentos seguido da mdia salarial de seus empregados. No entanto, deseja-se listar apenas aqueles departamentos cuja mdia salarial superior a 2000. SELECT NUMERO_DEPT, AVG(SALARIO) FROM EMPREGADOS GROUP BY NUMERO_DEPT HAVING AVG(SALARIO) > 2000; Exemplo 10: A utilizao da clusula GROUP BY para listar a quantidade de empregados por departamento/cargo. Isto , grupos dentro de grupos. No deve ser exibido Nmero de Departamento NULO. SELECT NUMERO_DEPT, CARGO, COUNT(*) FROM EMPREGADOS GROUP BY NUMERO_DEPT, CARGO HAVING NUMERO_DEPT IS NOT NULL; As clusulas do comando Select so avaliadas na seguinte ordem: Se o comando SQL contem a clusula WHERE, o SGBD seleciona as linhas candidatas. O SGBD identifica os grupos especificados pela clusula GROUP BY. A clusula HAVING restringe os grupos resultantes que no esto de acordo com os critrios especificados nesta clusula. A recuperao de dados com subconsultas (Subqueries) Uma subconsulta um comando SELECT embutido em uma clusula de outro comando SQL. Quando e como utilizar: Escreva subconsultas para recuperar dados baseados em critrios desconhecidos. Pode ser muito til quando se necessita selecionar linhas de uma tabela com uma condio que depende dos dados que esto na prpria ou em outra tabela. Subconsultas no podem conter a clusula ORDER BY. Duas classes de operadores de comparaes so utilizadas em subconsultas:

Operadores de uma nica linha: >, =, >=, <, <=, <> Operadores de multiplas linhas: IN e NOT IN. Como uma subconsulta processada? Primeiramente executado o comando SELECT aninhado. Em seguida o resultado utilizado em uma condio da consulta principal. Exemplo 1: A utilizao de uma subconsulta aninhada para recuperar o nome e salrio de todos os empregados que trabalham no mesmo departamento que o JOSE trabalha. SELECT NOME, SALARIO FROM EMPREGADOS WHERE NUMERO_DEPT = (SELECT NUMERO_DEPT FROM EMPREGADOS WHERE NOME = "JOSE"); Exemplo 2: A utilizao de uma subconsulta aninhada para recuperar o nome e salrio de todos os empregados que ganham mais do que a mdia salarial da empresa. SELECT NOME, SALARIO FROM EMPREGADOS WHERE SALARIO > (SELECT AVG(SALARIO) FROM EMPREGADOS); Exemplo 3: A utilizao de uma subconsulta aninhada para recuperar o nome, nmero do departamento e salrio de todos os empregados que trabalham no departamento situado no RIO ou no departamento denominado VENDAS. SELECT NOME, NUMERO_DEPT, SALARIO FROM EMPREGADOS WHERE NUMERO_DEPT = (SELECT NUMERO FROM DEPARTAMENTOS WHERE LOCAL = "RIO" OR NOME = "VENDAS"); Exemplo 4: A utilizao de uma subconsulta aninhada para recuperar o nome, nmero do departamento e salrio de todos os empregados que trabalham no departamento situado no RIO ou no departamento denominado VENDAS. Correo da query anterior com a utilizao da clusula IN uma vez que esta subconsulta retorna mais de uma linha. SELECT NOME, NUMERO_DEPT, SALARIO FROM EMPREGADOS WHERE NUMERO_DEPT IN (SELECT NUMERO FROM DEPARTAMENTOS WHERE LOCAL = "RIO" OR NOME = "VENDAS"); Exemplo 5: A utilizao de uma subconsulta aninhada para recuperar o nmero do departamento e sua mdia salarial. Devem ser recuperados apenas os departamentos cuja mdia salarial maior do que a mdia salarial do departamento nmero 30. SELECT NUMERO_DEPT, AVG(SALARIO) FROM EMPREGADOS GROUP BY NUMERO_DEPT HAVING AVG(SALARIO) >= (SELECT AVG(SALARIO) FROM EMPREGADOS WHERE NUMERO_DEPT = 30);

A recuperao de dados com subconsultas correlacionadas No exemplo abaixo a subconsulta executada uma vez para cada linha da tabela de empregados na consulta mais externa. Exemplo 1: A utilizao de uma subconsulta correlacionada para recuperar o nome dos empregados que trabalham no projeto numero 2. SELECT NOME FROM EMPREGADOS WHERE 2 IN ( SELECT NUMERO_PROJ FROM TRABALHAM WHERE NUMERO_EMP = E.NUMERO); Exemplo 2: A mesma query acima sem a utilizao de subconsulta correlacionada. SELECT NOME FROM EMPREGADOS E, TRABALHAM T WHERE E.NUMERO = T.NUMERO_EMP AND T.NUMERO_PROJ = 2; Quantificador Existencial Exists representa o quantificador existencial, uma noo emprestada da lgica formal. Em SQL, um predicado existencialmente quantificado representado pela expresso da forma EXISTS (SELECT * FROM ... ). Essa expresso ser verdadeira se o resultado do clculo da subconsulta representado por "SELECT * FROM ..." no estiver vazio, isto , se existir pelo menos um registro na tabela FROM da subconsulta que satisfaz a condio WHERE dessa mesma subconsulta. Qualquer consulta que utilize IN pode alternativamente ser formulada com EXISTS, porm o inverso no verdadeiro. Exemplo 1: Obter o nome dos empregados que trabalham no projeto n 2. SELECT NOME FROM EMPREGADOS E WHERE EXISTS (SELECT * FROM TRABALHAM WHERE NUMERO_EMP = E.NUMERO AND NUMERO_PROJ = 2); OU SELECT NOME FROM EMPREGADOS E, TRABALHAM T WHERE E.NUMERO = T.NUMERO_EMP AND T.NUMERO_PROJ = 2; Exemplo 2: Obter o nome dos empregados que no trabalham no projeto n 2. SELECT NOME FROM EMPREGADOS E WHERE NOT EXISTS (SELECT * FROM TRABALHAM WHERE NUMERO_EMP = E.NUMERO AND NUMERO_PROJ = 2); OU

SELECT NOME FROM EMPREGADOS MINUS SELECT NOME FROM EMPREGADOS E, TRABALHAM T WHERE T.NUMERO_EMP = E.NUMERO AND T.NUMERO_PROJ = 2; Unio (Union e Union All) Linhas duplicatas so eliminadas do resultado de uma unio a no ser que o operador UNION inclua explicitamente o quantificador ALL. Assim, no exemplo n 1, o projeto n 3 selecionado em ambos os SELECTS, mas s aparece uma vez no resultado final. J o exemplo n 2 retornar os nmeros de projeto 2, 3 e 3. Qualquer nmero de SELECTS pode ser unido pelo UNION. Quando sabemos que no haver elementos duplicados no resultado conveniente utilizarmos UNION ALL para que o sistema no seja forado a eliminar duplicidades, desnecessariamente. Exemplo 1: Obter o nmero dos projetos que, ou se iniciaram aps 31-JUL-97, ou possuem o empregado 7566 nele trabalhando. Unio sem repetio. SELECT NUMERO FROM PROJETOS WHERE DT_INICIO > "31-JUL-97" UNION SELECT NUMERO_PROJ FROM TRABALHAM WHERE NUMERO_EMP = 7566; Exemplo 2: Obter o nmero dos projetos que, ou se iniciaram aps 31-JUL-97, ou possuem o empregado 7566 nele trabalhando. Unio com repetio. SELECT NUMERO FROM PROJETOS WHERE DT_INICIO > "31-JUL-97" UNION ALL SELECT NUMERO_PROJ FROM TRABALHAM WHERE NUMERO_EMP = 7566; Exemplo 3: A possibilidade de incluirmos constantes numa clusula SELECT frequentemente til quando a clusula UNION utilizada. Por exemplo, para indicar qual das duas condies WHERE foi atendida para a incluso do elemento no resultado final. SELECT NUMERO, "DT_INICIO> 07-JAN-90" CONDIO FROM PROJETOS WHERE DT_INICIO > "07-JAN-90" UNION ALL SELECT NUMERO_PROJ, "NUMERO_EMP = 7566" FROM TRABALHAM WHERE NUMERO_EMP = 7566; Resultado:
NUMERO CONDIO ------------ --------------------2 DT_INICIO> 07-JAN-90 3 DT_INICIO> 07-JAN-90 4 DT_INICIO> 07-JAN-90 3 NUMERO_EMP = 7566

No prximo artigo vamos continuar a falar sobre os comandos SQL DML (Insert, Delete e Update).

Potrebbero piacerti anche