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 986, 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 DTL Data Transaction Language A DDL disponibiliza comandos que permitem criar e eliminar base de dados, tabelas e indices alem de disponibilizar comandos que eliminar todos os dados da tabela e alteram a estrutura da tabela A DML disponibiliza comandos que permitem manipular os dados das tabelas no banco de dados Principais comandos A DCL disponibiliza comandos que definem usuários e controla o acesso destes aos dados na base de dados. A DTL disponibiliza comandos que controlam transações a serem realizadas no banco de dados Principais comandos das sub-linguagens da SQL DML DDL DCL DTC Insert update delete select Create table Drop table Create database Drop database alter table truncate create index drop index Create user create role drop user drop role create view drop view grant revoke Start transaction commit rollback
COMANDOS DA DML 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_CHEFE =========================================================== desenvolvimento 00000.00 2 2 rede 200000.00 7 3 manutencao 80000.00 <null> Banco de dados Funcionarios FUNCIONARIO MATR NOME SALARIO COMISSAO ADMISSAO SEXO DEP_COD =============================================================================== ze 000.00 00.00 09-DEC-2000 M 2 ana 500.00 200.00 0-NOV-200 F 3 pedro 000.00 <null> 2-JAN-999 M 2 4 eva 2000.00 400.00 03-DEC-998 F 5 ivo 800.00 400.00 0-OCT-2000 M 3 6 sid 900.00 200.00 22-FEB-200 M 2 7 ines 500.00 400.00 0-NOV-2002 F 3 obs: o campo matr_chefe em DEPARTAMENTO tem a função de guardar a matricula do funcionario que é o chefe do departamento e o campo DEP_COD em funcionario tem a função de guardar o departamento de alocação do funcionario. - INSERT Permite inserir valores nas tuplas, linhas, de uma tabela de uma base de dados Sintaxe: INSERT INTO nome_da_tabela( coluna i,..., coluna j ) VALUES (valor_ coluna i,... valor_ coluna j ) Obs: Caso se deseje inserir um campo com valor nulo emprega-se 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 ) INSERT INTO FUNCIONARIO(matr, nome, comissao, admissao, admissao, sexo) VALUES (8,'zelupe',000.68,550,'3-2-200','M') INSERT INTO DEPARTAMENTO(cod, nome,orcamento) VALUES (4,'VENDAS',6000) 2
2 - UPDATE Permite modificar linhas existentes em uma tabela Sintaxe: UPDATE tabela SET COLUNAj = valor,..., COLUNAn = valor WHERE condição Mudar a o valor da comissão do funcionario de matr 02 para 00 UPDATE funcionario SET comissao = 00 WHERE matr = 02 Alterar para 00 reais, o valor da comissão, e para 000, o valor do salario, do funcionario de matr 04 3 - DELETE UPDATE funcionario SET comissao = 00, salario = 000 WHERE matr = 04 Permite eliminar linhas em uma tabela Sintaxe: DELETE FROM tabela WHERE condição Exemplo: Excluir todos os funcionarios com salario superior a 000 reais DELETE WHERE salário >000 4 SELECT Sintaxe Permite obter dados das tabelas contidas no base de dados. SELECT [atributo] { * tabela.* [tabela.]campo [AS alias ] [, [tabela.]campo 2 [AS alias 2 ] [,...]]} FROM expressãodetabelas [WHERE..condição. ] [GROUP BY... ] [HAVING... ] [ORDER BY... ] 3
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. campo, 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. alias, alias2 Os nomes a serem utilizados como cabeçalhos de coluna em lugar dos nomes originais de coluna em tabela. 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 cláusula where AND OR NOT Operadores aritméticos para formação da condição na cláusula 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 Descrição Entre a faixa de valores passada Use '%' para 0 ou mais caracteres Use '_' para ú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 4
campo i STARTING WITH value 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 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 Obter todos os dados de funcionario SELECT * OBS: o caracter * é empregado quando se deseja obter todos os campos, colunas, de uma tabela. SELECT funcionario.nome, funcionario.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 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 SELECT MATR é o mesmo que : SELECT ALL MATR Exemplo: 5
Diferenças: SELECT DISTINCT DET_COD obs: Esta consulta nos permite visualizar o codigo dos departamentos, sem repetição, nos quais existem funcionarios alocados. Caso não empregarmos o distinct teremos uma repetição desnecessário dos codigos que aparecem mais de uma vez na tabela. DEP_COD ========== 2 3 2 3 SELECT DET_COD DEP_COD ========== 2 3 SELECT DISTINCT DET_COD Obter o nome e salario dos funcionários com salario maior ou igual a 00 reais WHERE salario >= 000 Obter o nome e salário dos funcionários com salario entre 000 e 500 reais WHERE salario BETWEEN 000 AND 500 Obter o nome e salario dos funcionários com salario de 00 ou 500 ou 200 reias WHERE salário IN(000,500,2000) Obter o nome e salario dos funcionários com salario nulo WHERE salário IS NULL Obter o nome e salario dos funcionários cujo nome comece com a letra S WHERE nome LIKE S% Obter o nome, salario e a comissão dos funcionários com salario superior a 500 reais e comissão inferior a 200 reais, comissao 6
WHERE salário < 500 AND comissao <200 Obter o nome, salario e a comissão dos funcionarios com salario igual a 00 reais ou comissão igual a 00 reais, comissao WHERE salário = 00 OR comissao = 00 Obter o nome, salario dos funcionarios que não possuem comissão com valor de 00 reais WHERE NOT comissao = 00 Obter o nome, salario e a comissão dos funcionarios com comissão nula, comissao WHERE comissao is null Obter o nome, salario e a comissão dos funcionarios sua comissão adicionada com 00 reais seja menor do que seu salário, comissao WHERE salário > comissao + 00 Obter o nome e seus ganhos (salario + comissão) de todos os funcionarios que possuam comissão não nula + comissao WHERE comissao is not null Obter o nome e seus ganhos (salario + comissão), renomeando a coluna como total de ganhos, de todos os funcionarios que possuam comissão não nula + comissão AS total de ganhos WHERE comissao is not null 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. 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 7
Qual a media dos valores dos salarios pagos? SELECT AVG( salario) Qual o maior valor de salário pago? SELECT MAX( salario) Qual o menor valor de salário pago? SELECT MIN( salario) Qual o valor total gasto com salários? SELECT SUM( salario) Quantos funcionários de nomes distintos existem? SELECT COUNT( nome) Em quantos departamentos existem funcionarios alocados? 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. Obter o nome e salarios dos funcionários cujo salario seja superior a 000 ordene por nome do funcionario SELECT nome_fun, salário 8
WHERE salário > 000 ORDER BY nome Obter o nome e salarios dos funcionários cujo salario seja superior a 000 ordene de forma decrescente por salario SELECT nome_fun, salário WHERE salário > 000 ORDER BY salario DESC Obter o os codigos dos departametos e as quantidades de funcionarios alocadas neles ou SELECT dep_cod, count(dep_cod) GROUP BY dep_cod SELECT dep_cod, count(*) GROUP BY dep_cod Obter o os códigos dos departametos e as quantidades de funcionarios alocadas neles dos departamentos que possuam 3 ou mais funcionarios SELECT dep_cod, count(*) GROUP BY dep_cod HAVING count(*) < 3 (neste caso ocorre a seleção onde cada grupo de cód tenha mais de 0 funcionarios) Obter o os códigos dos departametos e as quantidades de funcionarios alocadas neles dos departamentos que cuja media salarial seja menor do que 000 reais SELECT dep_cod, count(*) GROUP BY dep_cod HAVING AVG(salario) < 000 (neste caso ocorre a seleção onde cada grupo de cód tenha como media salaria 000) 9