Escolar Documentos
Profissional Documentos
Cultura Documentos
1. CONSIDERAES INICIAIS
2. INSTRUO SELECT 2.1 SINTAXE 2.2 COMENTRIOS 2.3 CLUSULA GROUP BY 2.3.1 EXEMPLOS DE GROUP BY 2.4 CLUSULA HAVING 2.4.1 EXEMPLOS DE HAVING 2.5 CLUSULA ORDER BY 2.5.1 EXEMPLOS DE ORDER BY 2.6 OPERADORES POSITIVOS 2.7 OPERADORES NEGATIVOS 2.8 OUTROS EXEMPLOS DA INSTRUO SELECT, CLUSULA FROM 3. INSTRUO INSERT INTO 3.1 SINTAXE 3.2 COMENTRIOS 3.3 EXEMPLOS DE INSERT INTO 4. DECLARAO UPDATE 4.1 SINTAXE 4.2 COMENTRIOS 4.3 EXEMPLOS DE UPDATE 5. INSTRUO DELETE 5.1 SINTAXE 5.2 COMENTRIOS 5.3 OBSERVAO IMPORTANTE SOBRE A INSTRUO DELETE 5.4 EXEMPLO DE INSTRUO DELETE 6. SUBCONSULTAS SQL 6.1 SINTAXE 6.2 COMENTRIOS 6.3 EXEMPLOS DE SUBCONSULTAS SQL 7. FUNES AGREGADAS 7.1 EXEMPLOS DE FUNES AGREGADAS
4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 10 10 10 10 11 11 11 12 12 12 12 12 14 14 14
1. Consideraes iniciais
Quando os Bancos de Dados Relacionais estavam sendo desenvolvidos, foram criadas linguagens destinadas sua manipulao. O Departamento de Pesquisas da IBM, desenvolveu a SQL como forma de interface para o sistema de BD relacional denominado SYSTEM R, incio dos anos 70. Em 1986 o American National Standard Institute ( ANSI ), publicou um padro SQL. E assim, a SQL estabeleceu-se como linguagem padro de Banco de Dados Relacional. A 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. Como exemplo de comandos da classe DML temos os comandos Select, Insert, Update e Delete. A Linguagem SQL tem como grandes virtudes sua capacidade de gerenciar ndices, sem a 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 na linguagem SQL a 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 garantem por si mesmo a integridade das relaes existentes entre as tabelas e seus ndices. Esto contidas nesta apostila as principais instrues em SQL para a manuteno em Bancos de Dados. Esta apostila foi desenvolvida com o auxlio on-Line do banco de dados MS-ACCESS. O SQL para este banco no totalmente compatvel com o SQL Padro ANSI, que o oficial na maioria dos bancos de dados, ento algumas clusulas podem no funcionar em outros bancos. A formatao dos comandos (em vrias linhas) existente nesta apostila visa ressaltar alguns comandos principais, no indicando assim a formatao exigida pelo MS-ACCESS. Para visualizar os exemplos, execute os comandos no banco de dados Northwind.mdb.
2. Instruo SELECT
Instrui o programa principal do banco de dados para retornar a informao como um conjunto de registros.
2.1 Sintaxe
SELECT [predicado { * | tabela.* | [tabela.]campo1 [AS alias1] [, [tabela.]campo2 [AS alias2] [, ...]]} FROM expressotabela [, ...] [IN bancodedadosexterno] [WHERE... ] [GROUP BY... ] [HAVING... ] [ORDER BY... ] A instruo SELECT tem as partes abaixo: Parte predicado * tabela campo1, campo2 alias1, alias2 expressotabela bancodedadosexterno Descrio Um dos seguintes predicados: ALL, DISTINCT, DISTINCTROW ou TOP. Voc usa o predicado para restringir o nmero de registros que retornam. Se nenhum for especificado, o padro ser ALL. Especifica que todos os campos da tabela ou tabelas especificadas so selecionados. O nome da tabela que contm os campos dos quais os registros so selecionados. Os nomes dos campos dos quais os dados sero recuperados. Se voc incluir mais de um campo, eles sero recuperados na ordem listada. Os nomes que sero usados como ttulos de colunas em vez dos nomes originais das colunas na tabela. O nome da tabela ou tabelas contendo os dados que voc quer recuperar. O Nome do banco de dados que contm as tabelas em expressotabela se no estiver no banco de dados atual.
2.2 Comentrios
Para executar esta operao, o programa principal de banco de dados procura a tabela ou tabelas especificadas, extrai as colunas escolhidas, seleciona as linhas que satisfazem o critrio e classifica ou agrupa as linhas resultantes na ordem especificada. A instruo SELECT no muda os dados no banco de dados. SELECT normalmente a primeira palavra em uma instruo SQL. A maior parte das instrues SQL so instrues SELECT. A sintaxe mnima da instruo SELECT : SELECT campos FROM tabela Voc pode usar um asterisco (*) para selecionar todos os campos na tabela. O exemplo abaixo seleciona todos os campos na tabela Funcionrios: SELECT * FROM Funcionrios; Se o nome de um campo estiver includo em mais de uma tabela na clusula FROM, preceda-o com o nome da tabela e o operador ponto. No exemplo abaixo, o campo Cdigo do Funcionrio est nas tabelas Funcionrios e Pedidos. A instruo SQL seleciona Nome da tabela Funcionrios e NomeDoDestinatrio da tabela Supervisores: SELECT Funcionrios.Nome, Pedidos.NomeDoDestinatrio FROM Funcionrios INNER JOIN Pedidos ON Funcionrios.CdigoDoFuncionrio = Pedidos.CdigoDoFuncionrio Ao criar uma relao, o ACCESS usa o nome do campo da tabela como atributo na relao. Se voc quiser um nome de campo diferente ou um nome que no esteja implcito na expresso usada para gerar o campo, use a palavra reservada AS. Se houver um valor no campo legenda da estrutura da tabela, o ACCESS ir negligenciar o comando. O exemplo abaixo usa o ttulo Nasc para nomear o atributo
5 retornado no relao resultante: SELECT DataDeNascimento AS Nascimento FROM Funcionrios; Sempre que voc usar funes agregadas ou consultas que retornem atributos ambguos ou duplicados, voc precisar usar a clusula AS para fornecer um nome alternativo para o atributo. O exemplo abaixo usa o ttulo Contagem para nomear o atributo retornado na relao resultante: SELECT COUNT(Funcionrios.CdigoDoFuncionrio) AS Contagem FROM Funcionrios; Voc pode usar outras clusulas na instruo SELECT para restringir e organizar posteriormente os seus dados retornados.
4.
SELECT DISTINCTROW Clientes.NomeDaEmpresa, Count(Pedidos.nMERODoPedido) AS [Total de Pedidos] FROM Clientes INNER JOIN Pedidos ON Clientes.CdigoDoCliente = Pedidos.CdigoDoCliente GROUP BY Clientes.NomeDaEmpresa HAVING Count(Pedidos.nMERODoPedido) > 5
Exemplos: SELECT * FROM Pedidos WHERE Frete BETWEEN 30 AND 50 SELECT * FROM Pedidos WHERE PasDeDestino IN ('Alemanha','Blgica') SELECT * FROM Clientes WHERE NomeDoContato LIKE "P*" SELECT * FROM Clientes WHERE FAX IS NULL
10. Para cada registro, mostra Sobrenome e Nome no primeiro e ltimo campos. A seqncia de caracteres "cujo sobrenome " retornada como o campo do meio de cada registro. SELECT nome, 'cujo sobrenome ', sobrenome FROM Funcionrios;
3.1 Sintaxe
Consulta anexao de vrios registros: INSERT INTO destino [IN bancodedadosexterno] [(campo1[, campo2[, ...]])] SELECT [origem.]campo1[, campo2[, ...] FROM expressodetabela Consulta anexao de um nico registro: INSERT INTO destino [(campo1[, campo2[, ...]])] VALUES (valor1[, valor2[, ...]) A instruo INSERT INTO tem as partes abaixo: Parte destino bancodedadosexterno origem campo1, campo2 expressodetabela Descrio O nome da tabela ou consulta em que os registros devem ser anexados. O caminho para um banco de dados externo. Para uma descrio do caminho, consulte a clusula IN. O nome da tabela ou consulta de onde os dados devem ser copiados. Os nomes dos campos aos quais os dados devem ser anexados, se estiverem aps um argumento destino ou os nomes dos campos dos quais se deve obter os dados, se estiverem aps um argumento origem. O nome da tabela ou tabelas das quais registros so inseridos. Este argumento pode ser um nico nome de tabela ou uma combinao resultante de uma operao INNER JOIN, LEFT JOIN ou RIGHT JOIN ou de uma consulta gravada. Os valores para inserir em campos especficos do novo registro. Cada valor inserido no campo que corresponde posio do valor na lista: Valor1 inserido no campo1 do novo registro, valor2 no campo2 e assim por diante. Voc deve separar os valores com uma vrgula e colocar os campos de textos entre aspas (" ").
valor1, valor2
3.2 Comentrios
Voc pode usar a instruo INSERT INTO para adicionar um nico registro a uma tabela usando a sintaxe de consulta anexao de um nico registro como mostrado acima. Neste caso, seu cdigo especifica o nome e o valor de cada campo do registro. Voc precisa especificar cada um dos campos do registro para os quais um valor deve ser designado e um valor para este campo. Quando voc no
9 especifica cada campo, o valor padro ou Nulos inserido nas colunas omitidas. Os registros so adicionados no final da tabela. Voc tambm pode usar INSERT INTO para anexar um conjunto de registros de outra tabela ou consulta usando a clusula SELECT ... FROM como mostrado acima na sintaxe consulta anexao de vrios registros. Neste caso, a clusula SELECT especifica os campos para acrescentar tabela destino especificada. A tabela de origem ou de destino pode especificar uma tabela ou uma consulta. Se uma consulta for especificada, o programa principal de banco de dados do Microsoft anexa a qualquer e a todas as tabelas especificadas pela consulta. INSERT INTO opcional, mas quando includa, precede a instruo SELECT. Se sua tabela de destino contm uma chave primria, voc deve acrescentar valores nicos, no Nulos ao campo ou campos da chave primria. Caso contrrio, o programa principal de banco de dados do Jet no anexar os registros. Se voc anexar registros a uma tabela com um campo Counter e quiser numerar novamente os registros anexados, no inclua o campo Counter em sua consulta. Inclua o campo Counter na consulta se quiser manter os valores originais do campo. Use a clusula IN para anexar registros a uma tabela de outro banco de dados. Para achar quais registros sero anexados, antes de voc executar a consulta anexao, primeiro execute e veja os resultados de uma consulta seleo que use o mesmo critrio de seleo. Uma operao de consulta anexao copia os registros de uma ou mais tabelas em outra. As tabelas que contm os registros que voc anexa no so afetadas pela operao de consulta anexao. Em lugar de acrescentar registros existentes de outra tabela, voc pode especificar o valor de cada campo em um nico registro novo usando a clusula VALUES. Se voc omitir a lista de campo, a clusula VALUES deve incluir um valor para cada campo na tabela; caso contrrio, um erro ocorrer em INSERT. Use uma instruo adicional INSERT INTO com uma clusula VALUES para cada registro adicional que voc quiser criar.
10
13. Esse exemplo seleciona todos os estagirios de uma tabela hipottica "Estagirios" que foram contratados h mais de 30 dias e adiciona seus registros tabela "Funcionrios". INSERT INTO Funcionrios SELECT Estagirios.* FROM Estagirios WHERE DataContrato < Now() - 30;
4. Declarao UPDATE
Cria uma consulta atualizao que altera os valores dos campos em uma tabela especificada com base em critrios especficos.
4.1 Sintaxe
UPDATE tabela SET valornovo WHERE critrio; A instruo UPDATE tem as partes abaixo: Parte tabela valornovo critrio Descrio O nome da tabela cujos os dados voc quer modificar. Uma expresso que determina o valor a ser inserido em um campo especfico nos registros atualizados. Uma expresso que determina quais registros devem ser atualizados. S os registros que satisfazem a expresso so atualizados.
4.2 Comentrios
UPDATE especialmente til quando voc quer alterar muitos registros ou quando os registros que voc quer alterar esto em vrias tabelas. Voc pode alterar vrios campos ao mesmo tempo. O exemplo abaixo aumenta o valor do Frete em 3 por cento para remessas Alemanha: UPDATE Pedidos SET Frete = Frete * 1.03 WHERE PasDeDestino = 'Alemanha'; UPDATE no gera um conjunto de resultados. Se voc quiser saber quais resultados sero alterados, examine primeiro os resultados da consulta seleo que use os mesmos critrios e ento execute a consulta atualizao.
11
15. Esse exemplo reduz o PreoUnit de todos os produtos no suspensos fornecidos pela Tokyo Traders em 5 porcento. As tabelas "Produtos" e "Fornecedores" tm uma relao um para vrios. UPDATE Fornecedores INNER JOIN Produtos ON Fornecedores.CdigoDoFornecedor = Produtos.CdigoDoFornecedor SET PreoUnitrio = PreoUnitrio * .95 WHERE NomeDaEmpresa = 'Tokyo Traders' AND Descontinuado = No;
5. Instruo DELETE
Cria uma consulta excluso que remove registros de uma ou mais tabelas listadas na clusula FROM que satisfaz a clusula WHERE.
5.1 Sintaxe
DELETE [tabela.*] FROM tabela WHERE critrio A instruo DELETE tem as partes abaixo: Parte tabela.* tabela critrio Descrio O nome opcional da tabela da qual os registros so excludos. O nome da tabela da qual os registros so excludos. Uma expresso que determina qual registro deve ser excludo.
5.2 Comentrios
DELETE especialmente til quando voc quer excluir muitos registros. Para eliminar uma tabela inteira do banco de dados, voc pode usar o mtodo Execute com uma instruo DROP. Entretanto, se voc eliminar a tabela, a estrutura perdida. Por outro lado, quando voc usa DELETE, apenas os dados so excludos. A estrutura da tabela e todas as propriedades da tabela, como atributos de campo e ndices, permanecem intactos. Voc pode usar DELETE para remover registros de tabelas que esto em uma relao um por vrios com outras tabelas. Operaes de excluso em cascata fazem com que os registros das tabelas que esto no lado "vrios" da relao sejam excludos quando os registros correspondentes do lado "um" da relao so excludos na consulta. Por exemplo, nas relaes entre as tabelas Clientes e Pedidos, a tabela Clientes est do lado "um" e a tabela Pedidos est no lado "vrios" da relao. Excluir um registro em Clientes faz com que os registros correspondentes em Pedidos sejam excludos se a opo de excluso em cascata for especificada. Uma consulta de excluso exclui registros inteiros e no apenas dados em campos especficos. Se voc quiser excluir valores de um campo especfico, crie uma consulta atualizao que mude os valores para Nulos.
12
6. Subconsultas SQL
Uma subconsulta uma instruo SELECT aninhada dentro de uma instruo SELECT, INSERT, DELETE ou UPDATE ou dentro de uma outra subconsulta.
6.1 Sintaxe
Voc pode usar trs formas de sintaxe para criar uma subconsulta: comparao [ANY | ALL | SOME] (instruosql) expresso [NOT] IN (instruosql) [NOT] EXISTS (instruosql) Uma subconsulta tem as partes abaixo: Parte comparao expresso instruosqlt Descrio Uma expresso e um operador de comparao que compara a expresso com o resultado da subconsulta. Uma expresso para a qual o resultado definido da subconsulta procurado. Uma instruo SELECT de acordo com as mesmas regras e formato de qualquer outra instruo SELECT. Ela deve estar entre parnteses.
6.2 Comentrios
Voc pode usar uma subconsulta em vez de uma expresso na lista de campo de uma instruo SELECT ou em uma clusula WHERE ou HAVING. Em uma subconsulta, voc usa uma instruo SELECT para fornecer um conjunto de um ou mais valores especficos para avaliar as expresses das clusulas WHERE ou HAVING.
13
Use o predicado ANY ou SOME, que so sinnimos, para recuperar registros na consulta principal que satisfaam a comparao com quaisquer registros recuperados na subconsulta. O exemplo abaixo retorna todos os produtos cujo preo unitrio maior que o preo de qualquer produto vendido com um desconto de 25 por cento ou mais: SELECT * FROM Produtos WHERE PreoUnitrio > ANY (SELECT PreoUnitrio FROM [Detalhes do Pedido] WHERE Desconto >= .25);
Use o predicado ALL para recuperar apenas os registros na consulta principal que satisfaam a comparao com todos os registros recuperados na subconsulta. Se voc mudou ANY para ALL no exemplo acima, a consulta retornaria apenas os produtos cujo preo unitrio fosse maior que o de todos os produtos vendidos com um desconto de 25 por cento ou mais. Isto muito mais restritivo. Use o predicado IN para recuperar apenas os registros na consulta principal para os quais alguns registros na subconsulta contm um valor igual. O exemplo abaixo retorna todos os produtos vendidos com um desconto de 25 por cento ou mais: SELECT * FROM Produtos WHERE CdigoDoProduto IN (SELECT CdigoDoProduto FROM [Detalhes do Pedido] WHERE Desconto >= .25);
De maneira contrria, voc pode usar NOT IN para recuperar apenas os registros na consulta principal para os quais no existam registros com valores iguais na subconsulta. Utilize o predicado EXISTS (com a palavra reservada NOT opcionalmente) em comparaes true/false para determinar se a subconsulta retorna algum registro. Esse exemplo seleciona o nome de todos os funcionrios que tenham registrado pelo menos um pedido. Isto tambm poderia ser feito com INNER JOIN. SELECT Nome, Sobrenome FROM Funcionrios AS E WHERE EXISTS (SELECT * FROM Pedidos AS O WHERE O.FuncionrioID = E.FuncionrioID);
Voc tambm pode usar aliases de nomes de tabelas em uma subconsulta para fazer referncia a tabelas listadas em uma clusula FROM fora da subconsulta. O exemplo abaixo retorna os pedidos cujo frete seja superior mdia do frete pago ao mesmo pas. Para a tabela Pedidos dada o alias "T1": SELECT T1.NomeDoDestinatrio, T1.NmeroDoPedido, T1.RegioDeDestino, T1.PasDeDestino, T1.Frete FROM Pedidos AS T1 WHERE T1.Frete > (SELECT Avg(Frete) FROM Pedidos WHERE T1.PasDeDestino=Pedidos.PasDeDestino) ORDER BY T1.NomeDoDestinatrio;
14
7. Funes Agregadas
So funes que tomam uma coleo de valores e retornam um valor simples como resultado. So elas: funo AVG(n) COUNT(expr) MAX(expr) MIN(expr) SUM(n) retorno mdia do valor n, ignorando nulos vezes que o nmero da expr avalia para algo nao nulo maior valor da expr menor valor da expr soma dos valores de n, ignorando nulos
15 22. Apresente o menor frete pago. SELECT MIN(Frete) FROM Pedidos; 23. Apresente o maior frete pago. SELECT MAX(Frete) FROM Pedidos; 24. Apresente a somatria dos fretes pagos. SELECT SUM(Frete) FROM Pedidos; 25. Apresenta somatria, mdia e produto mais caro. SELECT Count(*) AS [Total de Produtos], Avg(PreoUnitrio) AS [Preo Mdio], Max(PreoUnitrio) AS [Produto + caro] FROM Produtos;