Linguagem de Consulta Estruturada SQL- DML INTRODUÇÃO A SQL - Structured Query Language, foi desenvolvido pela IBM em meados dos anos 70 como uma linguagem de manipulação de dados (DML - Data Manipulation Language) para suas primeiras tentativas de desenvolvimento de bancos de dados relacionais. Sua vantagem sobre modelos de dados anteriores é que as operações realizadas sobre os dados são especificadas numa linguagem não procedural e conjuntos de dados são manipulados com um único comando. Isto faz com que os programadores não tenham de navegar por uma estrutura complexa de banco de dados, reduzindo a quantidade de código necessário para acessar os dados. SQL tornou-se padrão depois de 1986, quando o American National Standards Institute (ANSI), definiu a SQL como linguagem padrão para os bancos de dados relacionais. Desde então, o SQL já sofreu diversas atualizações oficiais. O novo padrão SQL chama-se SQL3, nesta versão a mais importante é a adição de características de orientação a objetos na linguagem.. Atualmente este padrão é utilizado para o acesso a diversos bancos de dados relacionais, tais como Oracle, DB2, SQL Server, Sybase, Mysql, Postgresql, Interbase, Firebird etc. Os comandos da SQL podem ser agrupados em três categorias: DML Data Manipulation Language DDL Data Definition Language DCL Data Control Language COMANDOS DA DML 1 - INSERT Permite inserir valores nos campos que compõem as tabelas de uma base de dados INSERT INTO nome_da_tabela( coluna i,..., coluna j ) VALUES (valor_ coluna i,... valor_ coluna j ) Caso se deseje inserir um campo com valor nulo empregasse o termo NULL para o valor da coluna Caso se deseje inserir todos os campos pode-se omitir o nome das colunas, desde que a inserção seja feita na mesma ordem na qual os campos foram criados pelo comando Create Table INSERT INTO nome_da_tabela VALUES (valor_ coluna i,... valor_ coluna j ) Ex: INSERT INTO FUNCIONARIO(matri, ome, comissao, comissao_variavel, admissao, admissao, sexo) VALUES (1,'ze',1000,500,0.02,'3-2-2001','M') INSERT INTO DEPARTAMENTO(cod, nome,orcamento) VALUES (3,'MANUTENCAO',80000) 2 - COMMIT Grava as alterações de uma transação permanente no Banco de Dados. COMMIT 3 - ROLLBACK Desfaz as alterações de uma transação confirmadas por meio de commit ROLLBACK 1
Considere a instância de banco de dados abaixo, do banco de dados funcionários, composto das tabelas funcionário e departamento: DEPARTAMENTO COD NOME ORCAMENTO MATR ======== ================ =================== ================ 1 desenvolvimento 100000.00 2 2 rede 200000.00 7 3 manutencao 80000.00 <null> FUNCIONARIO MATR NOME SALARIO COMISSAO ADMISSAO SEXO DEP_COD =================================================================================== 1 ze 1000.00 100.00 09-DEC-2000 M 1 2 ana 1500.00 200.00 10-NOV-2001 F 1 3 pedro 1000.00 <null> 21-JAN-1999 M 2 4 eva 2000.00 400.00 03-DEC-1998 F 1 5 ivo 1800.00 400.00 10-OCT-2000 M 3 6 sid 900.00 200.00 22-FEB-2001 M 2 7 ines 1500.00 400.00 01-NOV-2002 F 3 obs: o campo matr em DEPARTAMENTO tem a função de guardar a matricula do chefe do departamento e o campo DEP_COD em funcionario tem a função de guardar o departamento de alocação do funcionario. 4 SELECT Sintaxe Permite obter informações de uma ou mais tabelas do banco de dados. SELECT [atributo] { * tabela.* [tabela.]campo 1 [AS alias 1 ] [, [tabela.]campo 2 [AS alias 2 ] [,...]]} FROM expressãodetabelas [WHERE..condição. ] [GROUP BY... ] [HAVING... ] [ORDER BY... ] Parte Descrição Atributo Um dos atributos a seguir: ALL, DISTINCT. Você utiliza o atributo para restringir o número de campos retornados. Se nenhum for especificado, o padrão será ALL * Especifica que todos os campos da tabela ou tabelas especificadas estão selecionados. Tabela O nome da tabela contendo os campos a partir dos quais os campos são selecionados. campo1, campo2 Os nomes dos campos contendo os dados que você deseja recuperar. Se você incluir mais de um campo, eles serão recuperados na ordem listada. alias1, alias2 Os nomes a serem utilizados como cabeçalhos de coluna em lugar dos nomes originais de coluna em tabela. 2
Expressão de tabelas O nome da tabela ou tabelas contendo os dados que você deseja recuperar. Operadores relacionais para formação da condição na cláusula Where Expressão para formação da condição campo i = value campo i < value campo i > value campo i <= value campo i >= value campo i!< value campo i!> value campo i <> value campo i!= value Igual a Menor que Maior que Menor ou igual a Maior ou igual a Não menor que Não maior que Diferente de Não igual a Descrição Operadores lógicos para formação da condição na clausula where AND NOT OR Operadores aritméticos para formação da condição na clausula where + - / * Outros Operadores para formação da condição na cláusula Where Expressão para formação da condição campo i Between value AND value campo i Like value campo i IN (value, value,...value) campo i IS NULL campo i IS NOT NULL campo i CONTAINING value campo i STARTING WITH value Descrição Entre a faixa de valores passada Use '%' para 0 ou mais caracteres Use '_' para 1 único caractere Um dos elementos da lista Testa se o valor é nulo (ausência do valor) Testa se o valor é não nulo Procura em string case insentitive Procura em string case sentitive Obs: Os operadores aritméticos podem ser usados na cláusula Select Comparações com string são caso sensitivo no padrão SQL-ANSI String em comparações devem ser colocadas entre (aspas) Precedência na formação da cláusula Where 3
Os operadores relacionais possuem maior precedência do que os operadores lógicos Todos os operadores relacionais possuem a mesma precedência. O operador lógico and possui maior precedência do que o operador or Operadores de igual precedência são calculados da esquerda para a direita Exemplos: SELECT * OBS: o caracter * é empregado quando se deseja obter todos os campos, colunas, de uma tabela. SELECT funcionário.nome, funcionário.salario OBS: neste caso a referência ao campo é feita descrevendo-se o nome da tabela e o nome do campo, separado por ponto. Isto é empregado quando se deseja obter informações de mais de uma tabela, com uma tabela não é necessário empregar este recurso. SELECT f.nome, f.salario FROM funcionário f OBS: Neste caso foi empregado um alias para a tabela funcionario Atributos permitidos na cláusula Select SELECT [ALL DISTINCT] ALL é o default seu emprego faz com que colunas iguais apareçam no resultado de uma consulta DISTINCT seu emprego faz com que caso haja colunas iguais em um resultado de uma consulta elas sejam eliminadas Exemplos: SELECT COD é o mesmo que : SELECT ALL COD SELECT DISTINCT COD WHERE salario >= 1000 WHERE salario BETWEEN 1000 AND 1500 4
WHERE salário IN(1000,1500,2000) WHERE salário IS NULL WHERE nome LIKE S%, comissao WHERE salário < 500 AND comissao <100, comissao WHERE salário = 100 OR comissao = 100 WHERE NOT comissao = 100, comissao WHERE comissao is null, comissao WHERE salário > comissao + 100 + comissao + comissão AS total de ganhos Funções Permitem efetuar transformação sobre colunas especificadas. De modo que os valores NULL são ignorados nos cálculos efetuados pelas funções. Exemplos: Funções disponíveis: AVG(coluna) retorna a media dos valores da coluna especificada MAX(coluna) retorna o valor máximo da coluna especificada MIN(coluna) retorna o valor mínimo da coluna especificada SUM(coluna) retorna o soma dos valores da coluna especificada COUNT(coluna) retorna o total de tuplas, da coluna especificada, que satisfazem a cláusula WHERE SELECT AVG( salário) 5
SELECT MAX( salário) SELECT MIN( salário) SELECT SUM( salário) SELECT COUNT( nome) SELECT COUNT( dep_cod) SELECT COUNT( matri), SUM( salário), MIN( salário), MAX( salário), AVG(salário) SELECT COUNT(*) (retorna o total de tuplas da relação) Ordenação e agrupamento de resultados Estão disponíveis as seguintes cláusulas: Order by coluna i, coluna j,...,coluna n tem a função de ordenar os resultados segundo os campos especificados nesta cláusulas. O default e uma ordenação ascendente ASC, é possível ordenar de forma descendente usando DESC Group By coluna i, coluna j,...,coluna n tem a função de agrupar os resultados quando se emprega funções agregadas a cláusulas Select e um uma outra coluna sem função agregada. Having condição tem a função de especificar a condição em caso de agrupamentos usando Group By, substitui o where quando se emprega o group by. Os campos que compõem o having não precisam fazer parte do select. Exemplos: SELECT nome_fun, salário WHERE salário > 100 ORDER BY nome_fun SELECT nome_fun, salário WHERE salário > 100 ORDER BY salario DESC SELECT count(cod_fun), cod GROUP BY cod SELECT cod, count(*) 6
GROUP BY cod SELECT cod, count(*) GROUP BY cod HAVING count(*) <10 (neste caso ocorre a seleção onde cada grupo de cód tenha mais de 10 funcionarios) SELECT cod, count(*) GROUP BY cod HAVING AVG(salario) < 1000 (neste caso ocorre a seleção onde cada grupo de cód tenha como media salaria 1000) CONSULTAS ENVOLVENDO MAIS DE UMA TABELA As consultas envolvendo informações de mais de uma tabela podem ser realizadas por encadeamento ou join. Consultas Encadeadas - Sub-Consultas Permite que uma consulta seja feita sobre o resultado de uma outra consulta. Usada quando se deseja informações de uma tabela porém, a condição deve ser expressa com campos de outra tabela. Sintaxes possíveis: SELECT colunai,, colunan FROM tabelas WHERE colunaj = (SELECT colunaj FROM tabelas WHERE condições) SELECT colunai,, colunan FROM tabelas WHERE colunaj IN (SELECT colunaj FROM tabelas WHERE condições) SELECT colunai,, colunan FROM tabela1 WHERE colunaj OPERADOR DE COMPARAÇÃO ALL (SELECT colunaj FROM tabela2 WHERE condições) SELECT colunai,, colunan FROM tabela1 WHERE EXISTS (SELECT * FROM tabela2 7
Exemplos: WHERE coluna <relação> tabela1.colunai) EXISTS Verifica se um valor existe e ou está presente em pelo menos uma linha no retorno do SubQuery(*). Está clausula pode conter também NOT EXISTS. SELECT cod_fun, nome_fun WHERE cod = (SELECT cod WHERE cod_fun = 03 ) SELECT nome_fun, salario WHERE salario IN (SELECT salario WHERE cod = D1 ) SELECT nome_fun, salario WHERE salario > ALL (SELECT salario WHERE cod = D1 ) Apelidando tabelas É possivel determinar alias para as tabelas em uma consulta. Para isto basta colocar o apelido a ser usado após o nome da tabela na cláusula From SELECT apelido1.campo1_tab1, apelido1.campo n _tab1,... apelido2. campo k _tab2 FROM tab1 apelido1, tab2 apelido2 WHERE apelido1. campo j _tab1 = apelido2. campo l _tab2 AND apelido2. campo t _tab2 = xxxxx xx AND apelido1.campo m _tab1 = y Exemplo: SELECT f.nome, f.salario, d.nome f, departamento d WHERE f.cod = d.cod AND d.nome = rede AND f.sexo = F Consultas com Join Usada quando se deseja informações de mais de uma tabela. SELECT tabela1.coluna i,, tabela2.coluna n FROM tabelas1 JOIN tabela2 ON tabela1.coluna j, = tabela2.coluna k [WHERE condição(ões)] OBS: nem todos os SGBD aceitam o termo JOIN neste caso deves-se empregar a sintaxe abaixo 8
Que é o mesmo do que: Exemplos: SELECT tabela1.coluna i,, tabela2.coluna n FROM tabelas1, tabela2 WHERE tabela1.coluna j, = tabela2.coluna k [AND condição(ões)] SELECT funcionario.nome_fun, funcionario.salario_fun, departmento.nome_dep JOIN departamento ON funcionario.cod_dep = departamento.cod SELECT * JOIN departamento ON funcionario.cod = departamento.cod WHERE departamento.nome = rede Que é o mesmo que: SELECT *, departamento WHERE funcionario.cod = departamento.cod AND departamento.nome = rede SELECT funcionario.nome, funcionario.salario, departamento.nome, departamento WHERE funcionario.cod = departamento.cod AND departamento.nome = rede AND funcionario.sexo = F Que é o mesmo que: SELECT f.nome, f.salario, d.nome f, departamento d WHERE f.cod = d.cod AND d.nome = rede AND f.sexo = F 5 - UPDATE Permite modificar linhas existentes em uma tabela UPDATE tabela SET COLUNAj = valor,..., COLUNAn = valor WHERE condição Exemplo UPDATE funcionario SET comissao = 100 WHERE cód_fun = 02 UPDATE funcionario SET comissao = 100, salario = 1000 WHERE cód_fun = 02 9
6 - DELETE Permite eliminar linhas em uma tabela DELETE FROM tabela WHERE condição Exemplo: DELETE WHERE salário >1000 1