Programação SQL INTRODUÇÃO II parte
Programação SQL SELECT; INSERT; UPDATE; DELETE. Este conjunto de comandos faz parte da sublinguagem denominada por DML Data Manipulation Language (Linguagem de manipulação de dados).
Programação SQL Comando SELECT (selecções simples)
Programação SQL A interrogação de qualquer BD relacional faz-se sempre utilizando o comando SELECT. A sintaxe do comando SELECT é a seguinte:
Programação SQL SELECT Campo 1, Campo 2,, Campo n, * FROM Tabela 1,, Tabela k [WHERE Condição] [GROUP BY ] [HAVING ] [ORDER BY ]
Programação SQL O esqueleto de uma questão SQL, em relação à interrogação da base de dados, consiste no seguinte : SELECT <colunas> FROM <tabelas> [WHERE <condição>]
Programação SQL Em que : <colunas> especifica a lista de atributos cujos valores interessa conhecer; <tabelas> especifica quais as tabelas envolvidas no processamento da questão; <condição> traduz a expressão lógica que define a condição a verificar.
Programação SQL SELECT é a instrução de projecção de dados. Serve para seleccionar registos de uma ou mais tabelas. WHERE permite determinar os registos que irão surgir na consulta.
Programação SQL Seleccionando todos os registos de uma tabela: SELECT Codigo, Local FROM Postal Access Sql Server Oracle SyBase Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem 2300 Tomar 3000 Coimbra
Programação SQL Seleccionando todos as colunas de uma tabela: SELECT * FROM Postal Access Sql Server Oracle SyBase Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem 2300 Tomar 3000 Coimbra
Programação SQL Seleccionando todos as colunas de uma tabela Se pretendermos, seleccionar todas as colunas de uma tabela, então, para não termos que indicar cada uma das colunas, o nome de todas elas pode ser substituído pelo carácter asterisco *. SELECT * FROM Postal
Programação SQL Seleccionando todos as colunas de uma tabela Se por qualquer razão pretendermos as colunas por uma ordem diferente, então seremos obrigados a indicar qual a ordem pela qual as queremos mostrar. SELECT Local, Codigo FROM Postal
Programação SQL Seleccionando todos as colunas de uma tabela: SELECT Local, Codigo FROM Postal Access Sql Server Oracle SyBase Local Tabela Postal Codigo Lisboa 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Santarem 2000 Tomar 2300 Coimbra 3000
Programação SQL Comando SELECT (selecções simples) PROJECÇÃO
Projecção Nos exemplos anteriores, o nosso objectivo consistia em seleccionar toda a informação de uma determinada tabela (todas as linhas e todas as colunas). No entanto, podemos estar interessados em obter algumas das colunas da tabela: PROJECÇÃO:
Projecção:
Projecção - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000
Projecção - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Escrever o comando SQL que permita apresentar apenas as colunas ID, Nome, Telefone.
Projecção exemplo [solução] Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 SELECT Id, Nome, Telefone FROM Funcionários Access Sql Server Oracle SyBase
Projecção exemplo [resultado] Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Tabela Funcionários Id Nome Telefone 1 Ana 222222222 2 Maria 213847576 3 Pedro 262876943 Access Sql Server Oracle SyBase
Programação SQL Comando SELECT (selecções simples) RESTRIÇÃO
Restrição A operação Restrição permite restringir o número de linhas a apresentar: Apenas é apresentado algumas das linhas que contêm a informação pretendida.
Restrição Para podermos restringir o conjunto dos registos a apresentar, iremos utilizar uma outra cláusula do comando SELECT a cláusula WHERE. SELECT FROM WHERE condição
Para relembrar: OPERADORES RELACIONAIS Permitem estabelecer relações entre elementos. O resultado da aplicação de um destes operadores é sempre o valor lógico TRUE ou FALSE. Operador Descrição Exemplo Resultado = Igual a 7=5 FALSE > Maior que 7>5 TRUE < Menor que 7<5 FALSE >= Maior ou Igual que 7>=5 TRUE <= Menor ou igual que 7<=5 FALSE <> Ou!= Diferente 7<>5 TRUE
Operadores Relacionais - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Seleccionar todos os funcionários da tabela: SELECT * FROM Funcionarios Access Sql Server Oracle SyBase
Operadores Relacionais - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Seleccionar todos os funcionários com 35 anos de idade: SELECT * FROM Pessoa WHERE Idade = 35 Access Sql Server Oracle SyBase
Operadores Relacionais exemplo [RESULTADO] Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 2 Maria 35 2040-234 213847576 25000 (FALSE)
Operadores Relacionais - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Seleccionar todos os funcionários com salário superior ou igual a 35000. SELECT * FROM Pessoa WHERE Salário >= 35000 Access Sql Server Oracle SyBase
Operadores Relacionais exemplo [RESULTADO] Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Tabela Funcionários Id Nome Idade Cod_Postal Telefone 1 Ana 40 2040-406 222222222 3 Pedro 37 2500-401 262876943? (TRUE)
Para relembrar: OPERADORES LÓGICOS Funcionam sempre com valores lógicos ou com expressões que devolvam valores lógicos. Operador Exemplo AND Condição1 AND Condição2 OR Condição1 OR Condição2 NOT NOT Condição (o operador NOT é um operador unário) O resultado da utilização de um operador relacional é sempre um valor lógico.
Operadores Lógicos - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Seleccionar o Id, Nome, Idade e Salário de todos os funcionários com Idade entre os 37 e os 40 anos. SELECT Id, Nome, Idade, Salário FROM Funcionários WHERE Idade >=37 AND <=40 Access Sql Server Oracle SyBase
Operadores Lógicos exemplo [Resultado] Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Tabela Funcionários Id Nome Idade Salário 1 Ana 40 74000 3 Pedro 37 35000
Operadores Lógicos - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Seleccionar o Id, Nome, Idade e Salário de todos os funcionários cuja Idade não está entre os 37 e os 40 anos. SELECT Id, Nome, Idade, Salário FROM Funcionários WHERE Idade <37 OR >40 Access Sql Server Oracle SyBase
Operadores Lógicos exemplo [Resultado] Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Tabela Funcionários Id Nome Idade Salário 2 Maria 35 25000
Operadores Lógicos - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 SELECT Id, Nome, Idade, Salário FROM Funcionários Access Sql Server Oracle SyBase WHERE NOT(Idade >=37AND<=40)
Operadores Lógicos exemplo [Resultado] Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Tabela Funcionários Id Nome Idade Salário 2 Maria 35 25000
Outros Operadores A linguagem SQL coloca à disposição dos utilizadores um conjunto adicional de operadores que visam aproximar, ainda mais, o SQL da linguagem falada: BETWEEN IN IS LIKE
Programação SQL Comando SELECT (selecções simples) Operador BETWEEN
Operador BETWEEN Permite especificar intervalos de valores: SELECT FROM WHERE valor [NOT] BETWEEN valor1 AND valor2
Operador BETWEEN - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Seleccionar o Id, Nome, Idade e Salário de todos os funcionários com Idade entre os 37 e os 40 anos. SELECT Id, Nome, Idade, Salário FROM Funcionários WHERE Idade >=37 AND <=40 Access Sql Server Oracle SyBase
Operador BETWEEN - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Seleccionar o Id, Nome, Idade e Salário de todos os funcionários com Idade entre os 37 e os 40 anos. SELECT Id, Nome, Idade, Salário FROM Funcionários WHERE Idade BETWEEN 37 AND 40 Access Sql Server Oracle SyBase
Operador BETWEEN exemplo [Resultado] Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Tabela Funcionários Id Nome Idade Salário 1 Ana 40 74000 3 Pedro 37 35000
Operadores Lógicos - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Seleccionar o Id, Nome, Idade e Salário de todos os funcionários cuja Idade não está entre os 37 e os 40 anos. SELECT Id, Nome, Idade, Salário FROM Funcionários WHERE Idade <37 OR >40 Access Sql Server Oracle SyBase
Operador BETWEEN - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Seleccionar o Id, Nome, Idade e Salário de todos os funcionários cuja Idade não está entre os 37 e os 40 anos. SELECT Id, Nome, Idade, Salário FROM Funcionários Access Sql Server Oracle SyBase WHERE Idade NOT BETWEEN 37 AND 40
Operador BETWEEN exemplo [Resultado] Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Tabela Funcionários Id Nome Idade Salário 2 Maria 35 25000
Operador BETWEEN exemplo [Resultado] Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 262876943 35000 Tabela Funcionários Id Nome Idade Salário 2 Maria 35 25000
Programação SQL Comando SELECT (selecções simples) Operador IN
Operador IN Permite especificar conjuntos de valores: SELECT FROM WHERE valor [NOT] IN (valor1, valor2, valorn, )
Operador IN - exemplo Seleccionar o Código Postal completo de Lisboa e Tomar SELECT * FROM Postal WHERE Local IN ( Lisboa, Tomar ) Access Sql Server Oracle SyBase Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem 2300 Tomar 3000 Coimbra
Operador IN exemplo [Resultado] Seleccionar o Código Postal completo de Lisboa e Tomar SELECT * FROM Postal WHERE Local IN ( Lisboa, Tomar ) Access Sql Server Oracle SyBase Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2300 Tomar
Operador IN exemplo [Resultado] Seleccionar os Códigos Postais que não pertencem a Lisboa nem a Tomar. SELECT * FROM Postal WHERE Local NOT IN ( Lisboa, Tomar ) Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem Access Sql Server Oracle SyBase Tabela Postal 2300 Tomar 3000 Coimbra
Operador IN - exemplo Seleccionar os Códigos Postais completos que não pertencem a Lisboa nem a Tomar. SELECT * FROM Postal WHERE Local NOT IN Codigo Local 2000 Santarem 3000 Coimbra Tabela Postal ( Lisboa, Tomar ) Access Sql Server Oracle SyBase
Programação SQL Comando SELECT (selecções simples) Operador IS
Para relembrar: Tratamento de Nulos Como já foi referido, as BD relacionais contêm um valor especial NULL que pode ser atribuído a qualquer tipo de dados. O valor NULL, quando presente num campo, indica Ausência de Valor. Porque razão é que necessitamos de um NULL num campo??
Para relembrar: Tratamento de Nulos Suponhamos uma BD de um professor, onde este atribui as notas aos alunos ao longo do ano. Como a nota do aluno é um inteiro, porque razão não colocamos 0 (zero) quando não sabemos a nota do aluno?
Para relembrar: Tratamento de Nulos Quando o aluno começa as aulas, ele não tem qualquer nota associada. Se colocarmos 0 (zero) na sua classificação, isto indica que ele obteve 0 (zero) como classificação daquela disciplina. Não se conseguiria diferenciar um aluno que não fez exame de outro que o fez e que obteve classificação 0 (zero).
Para relembrar: Tratamento de Nulos Assim, o valor NULL permite-nos indicar se existe ou não um valor já disponível para um determinado campo. As comparações de valores com NULL terão de ser realizadas utilizando o operador IS. A utilização de qualquer outro operador devolve sempre FALSE.
Operador IS A sua sintaxe é a seguinte: SELECT FROM WHERE valor IS [NOT] NULL
Operador IS - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 35000 4 Rui 38 2500-303 234364754 12000 5 Susana 42 2000-101 231456788 15000 6 Vasco 34 2000-105 25000 Seleccionar os Nomes e Telefones de todos os Funcionários.
Operador IS - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 35000 4 Rui 38 2500-303 234364754 12000 5 Susana 42 2000-101 231456788 15000 6 Vasco 34 2000-105 25000 SELECT Nome, Telefone FROM Funcionários Access Sql Server Oracle SyBase
Operador IS exemplo [Resultado] Tabela Funcionários Tabela Funcionários Nome Telefone Nome Telefone Ana 222222222 Maria 213847576 Pedro Rui 234364754 Susana 231456788 Vasco Ana 222222222 Maria 213847576 Pedro (NULL) Rui 234364754 Susana 231456788 Vasco (NULL) SELECT Nome, Telefone FROM Funcionários Access Sql Server Oracle SyBase
Operador IS - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 35000 4 Rui 38 2500-303 234364754 12000 5 Susana 42 2000-101 231456788 15000 6 Vasco 34 2000-105 25000 Seleccionar os Nomes dos Funcionários sem Telefone.
Operador IS - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 35000 4 Rui 38 2500-303 234364754 12000 5 Susana 42 2000-101 231456788 15000 6 Vasco 34 2000-105 25000 SELECT Nome FROM Funcionários WHERE Telefone IS NULL Access Sql Server Oracle SyBase
Operador IS exemplo [Resultado] Tabela Funcionários Nome Pedro Vasco SELECT Nome FROM Funcionários WHERE Telefone IS NULL Access Sql Server Oracle SyBase
Operador IS - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 35000 4 Rui 38 2500-303 234364754 12000 5 Susana 42 2000-101 231456788 15000 6 Vasco 34 2000-105 25000 Seleccionar os Nomes e Telefones dos Funcionários com Telefone.
Operador IS - exemplo Tabela Funcionários Id Nome Idade Cod_Postal Telefone Salário 1 Ana 40 2040-406 222222222 74000 2 Maria 35 2040-234 213847576 25000 3 Pedro 37 2500-401 35000 4 Rui 38 2500-303 234364754 12000 5 Susana 42 2000-101 231456788 15000 6 Vasco 34 2000-105 25000 SELECT Nome FROM Funcionários WHERE Telefone IS NOT NULL Access Sql Server Oracle SyBase
Operador IS exemplo [Resultado] Tabela Funcionários Nome Telefone Ana 222222222 Maria 213847576 Rui 234364754 Susana 231456788 SELECT Nome FROM Funcionários WHERE Telefone IS NOT NULL Access Sql Server Oracle SyBase
Programação SQL Comando SELECT (selecções simples) Operador LIKE
Operador LIKE Permite resolver alguns problemas naturais que existem quando se pretende comparar strings. A comparação de strings com os operadores relacionais utiliza sempre, na comparação, a totalidade da string.
Operador LIKE exemplo Seleccionar os Códigos Postais associados a Lisboa SELECT * FROM Postal WHERE Local = Lisboa Access Sql Server Oracle SyBase Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem 2300 Tomar 3000 Coimbra
Operador LIKE exemplo [Resultado] Seleccionar os Códigos Postais associados a Lisboa SELECT * FROM Postal WHERE Local = Lisboa Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa Access Sql Server Oracle SyBase 1500 Lisboa
Operador LIKE A utilização do operador LIKE permite fazer comparações de partes da string. Para tal, utilizam-se dois WildCards (caso seja Sql Server, Oracle, SyBase): WildCard Significado % Qualquer string de zero ou mais caracteres _ (underscore) Um carácter qualquer.
Operador LIKE A utilização do operador LIKE permite fazer comparações de partes da string. Para tal, utilizam-se dois WildCards (caso seja Access): WildCard Significado * Qualquer string de zero ou mais caracteres? Um carácter qualquer.
Operador LIKE exemplo Seleccionar todos os locais começados por S SELECT * FROM Postal Sql Server Oracle SyBase WHERE Local LIKE S% SELECT * FROM Postal Access WHERE Local LIKE S* Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem 2300 Tomar 3000 Coimbra
Operador LIKE exemplo [Resultado] Seleccionar todos os locais começados por S SELECT * FROM Postal SELECT * FROM Postal Sql Server Oracle SyBase WHERE Local LIKE S% Access WHERE Local LIKE S* Tabela Postal Codigo Local 2000 Santarem
Operador LIKE exemplo Seleccionar todos os locais que não contenham a string oa SELECT * FROM Postal Sql Server Oracle SyBase WHERE Local NOT LIKE %oa% SELECT * FROM Postal Access WHERE Local NOT LIKE *oa* Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem 2300 Tomar 3000 Coimbra
Operador LIKE exemplo Seleccionar todos os locais que não contenham a string oa SELECT * FROM Postal Sql Server Oracle SyBase WHERE Local NOT LIKE %oa% SELECT * FROM Postal Access WHERE Local NOT LIKE *oa* Tabela Postal Codigo Local 2000 Santarem 2300 Tomar 3000 Coimbra
Programação SQL Comando SELECT (selecções simples) Precedência dos Operadores
Precedência dos Operadores Tal como nas linguagens de programação tradicionais, também em SQL os operadores têm diferentes precedências, isto é, se aparecerem numa expressão vários operadores, alguns deles são executados antes dos outros.
Precedência dos Operadores Parêntesis ( ) Multiplicação / Divisão * / Adição / Subtracção + - NOT AND OR A precedência diminui no sentido da seta, quer isto dizer que os operadores que estão mais acima são executados primeiro.
Programação SQL Ordenação Cláusula ORDER BY
Ordenação A ordenação realizada por uma aplicação está baseada no valor do código ASCII de cada caracter. Assim, os dígitos aparecem antes dos caracteres alfabéticos e as maiúsculas aparecem antes das minúsculas.
Ordenação Alguns sistemas são case sensitive, outros não. Este facto irá influenciar a ordem pela qual são ordenados os valores. A ordenação pode ser realizada através da cláusula ORDER BY no comando SELECT.
Ordenação SELECT Campo 1, Campo 2,, Campo n, * FROM Tabela 1,, Tabela k [WHERE Condição] [GROUP BY ] [HAVING ] [ORDER BY Campo [ASC DESC], ]
Programação SQL Claúsula ORDER BY (Ordenação) Ordenação por uma coluna
Ordenação por uma coluna A ordenação por coluna faz-se especificando, na cláusula ORDER BY, qual a coluna pela qual se pretende ordenar. Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 5 Célia 27 700 961234567 1500 3 Jorge 35 750 2040 1 Ana 36 740 912345664 2500 2 Laura 25 650 2040 4 José 38 670 912345432 2000 Exemplo: Seleccionar todas as pessoas, ordenando o resultado pela Idade.
Ordenação por uma coluna Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 2 Laura 25 650 2040 5 Célia 27 700 961234567 1500 3 Jorge 35 750 2040 1 Ana 36 740 912345664 2500 4 José 38 670 912345432 2000 SELECT * FROM Funcionários ORDER BY Idade Access Sql Server Oracle SyBase
Ordenação por uma coluna Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 2 Laura 25 650 2040 5 Célia 27 700 961234567 1500 3 Jorge 35 750 2040 1 Ana 36 740 912345664 2500 4 José 38 670 912345432 2000 SELECT * FROM Funcionários ORDER BY Idade ASC Access Sql Server Oracle SyBase
Ordenação por uma coluna Seleccionar o Nome e Salário de todos os funcionários, ordenando o resultado pelo Salário, de tal forma que os maiores ordenados fiquem no topo da lista. Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 5 Célia 27 700 961234567 1500 3 Jorge 35 750 2040 1 Ana 36 740 912345664 2500 2 Laura 25 650 2040 4 José 38 670 912345432 2000
Ordenação por uma coluna Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 5 Célia 27 700 961234567 1500 3 Jorge 35 750 2040 1 Ana 36 740 912345664 2500 2 Laura 25 650 2040 4 José 38 670 912345432 2000 SELECT Nome, Salario FROM Funcionários ORDER BY Salario DESC Access Sql Server Oracle SyBase
Ordenação por uma coluna Tabela Funcionários Nome Salario Jorge 750 Ana 740 Célia 700 José 670 Laura 650 SELECT Nome, Salario FROM Funcionários ORDER BY Salario DESC Access Sql Server Oracle SyBase
Ordenação por uma coluna Seleccionar o Nome e Salário de todos os funcionários, ordenando o resultado pelo Salário, de tal forma que os maiores ordenados fiquem no topo da lista, mas só para as pessoas que têm telefone. Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 5 Célia 27 700 961234567 1500 3 Jorge 35 750 2040 1 Ana 36 740 912345664 2500 2 Laura 25 650 2040 4 José 38 670 912345432 2000
Ordenação por uma coluna Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 5 Célia 27 700 961234567 1500 3 Jorge 35 750 2040 1 Ana 36 740 912345664 2500 2 Laura 25 650 2040 4 José 38 670 912345432 2000 SELECT Nome, Salario FROM Funcionários WHERE Telefone IS NOT NULL ORDER BY Salario DESC Access Sql Server Oracle SyBase
Ordenação por uma coluna Tabela Funcionários Nome Salario Telefone Ana 740 912345664 Célia 700 961234567 José 670 912345432 SELECT Nome, Salario FROM Funcionários WHERE Telefone IS NOT NULL ORDER BY Salario DESC Access Sql Server Oracle SyBase
Programação SQL Claúsula ORDER BY (Ordenação) Ordenação por várias colunas
Ordenação por várias colunas Seleccione todo o conteúdo da tabela Comissão ordenado por Id. Tabela Comissão SELECT * FROM Comissão ORDER BY ID Access Sql Server Oracle SyBase ID ID_Mesg Valor 5 60 2200 3 10 3500 1 50 3600 2 45 2500 4 37 3800 1 30 1200 1 34 1800 2 34 1300
Ordenação por várias colunas SELECT * FROM Comissão ORDER BY ID A coluna ID está correctamente ordenada. No entanto, os valores nas outras colunas aparecem por qualquer ordem, uma vez que não foi solicitada a sua ordenação Access Sql Server Oracle SyBase Tabela Comissão ID ID_Mesg Valor 1 50 3600 1 30 1200 1 34 1800 2 45 2500 2 34 1300 3 10 3500 4 37 3800 5 60 2200
Ordenação por várias colunas Para se ordenar o resultado de um SELECT por mais do que uma coluna, basta indicar, na cláusula ORDER BY, o conjunto das colunas pela ordem em que se pretende ordenar o resultado. A ordenação é feita pela primeira coluna, e entre valores iguais é ordenada pela segunda coluna,..
Ordenação por várias colunas Seleccione todo o conteúdo da tabela Comissão ordenado por ID e ID_Msg. Tabela Comissão SELECT * FROM Comissão ORDER BY ID, ID_Msg Access Sql Server Oracle SyBase ID ID_Msg Valor 1 30 1200 1 34 1800 1 50 3600 2 34 1300 2 45 2500 3 10 3500 4 37 3800 5 60 2200
Ordenação por várias colunas Seleccione, da tabela Comissão, as linhas cujo ID é menor que 45, ordenadas, dentro de cada ID, pela coluna Valor de forma descendente. ID ID_Mesg Valor SELECT * FROM Comissão WHERE ID < 45 ORDER BY ID, Valor DESC Access Sql Server Oracle SyBase Tabela Comissão 5 60 2200 3 10 3500 1 50 3600 2 45 2500 4 37 3800 1 30 1200 1 34 1800 2 34 1300
Ordenação por várias colunas Seleccione, da tabela Comissão, as linhas cujo ID é menor que 45, ordenadas, dentro de cada ID, pela coluna Valor de forma descendente. SELECT * FROM Comissão WHERE ID < 45 ORDER BY ID, Valor DESC Access Sql Server Oracle SyBase = Tabela Comissão ID ID_Mesg Valor 1 34 1800 1 30 1200 2 34 1300 3 10 3500 4 37 3800
Ordenação por várias colunas Seleccione, da tabela Comissão, as linhas cujo ID é menor que 45, ordenadas, dentro de cada ID, pela coluna Valor de forma descendente. SELECT * FROM Comissão WHERE ID < 45 ORDER BY ID ASC, Valor DESC Access Sql Server Oracle SyBase Tabela Comissão ID ID_Mesg Valor 1 34 1800 1 30 1200 2 34 1300 3 10 3500 4 37 3800
Programação SQL Claúsula ORDER BY (Ordenação) Selecção de Expressões
Selecção de Expressões O comando SELECT permite, para além da selecção de colunas, a selecção de expressões ou mesmo selecção de constantes. Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 5 Célia 27 700 961234567 1500 3 Jorge 35 750 2040 1 Ana 36 740 912345664 2500 2 Laura 25 650 2040 4 José 38 670 912345432 2000
Selecção de Expressões Seleccionar o Nome e Idade de todos os Funcionários. Seleccionar também a Idade que irão ter daqui a um ano. O resultado deverá vir ordenado por Nome.
Selecção de Expressões Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 5 Célia 27 700 961234567 1500 3 Jorge 35 750 2040 1 Ana 36 740 912345664 2500 2 Laura 25 650 2040 4 José 38 670 912345432 2000 SELECT Nome, Idade, Idade+1 FROM Funcionários ORDER BY Nome Access Sql Server Oracle SyBase
Selecção de Expressões Tabela Funcionários O nome da coluna que resulta da expressão é Expr1002. Este nome pode variar de sistema para sistema. Nome Idade Expr1002 Ana 36 37 Célia 27 28 Jorge 35 36 José 38 39 Laura 25 26 SELECT Nome, Idade, Idade+1 FROM Funcionários ORDER BY Nome Access Sql Server Oracle SyBase
Selecção de Expressões O nome com que uma coluna ou expressão é representada no resultado de um SELECT pode ser alterado através da cláusula AS. Tabela Funcionários Nome Idade IdadeNova Ana 36 37 Célia 27 28 Jorge 35 36 José 38 39 Laura 25 26 SELECT Nome, Idade, Idade+1 AS IdadeNova FROM Funcionários ORDER BY Nome Access Sql Server Oracle SyBase
Programação SQL Claúsula ORDER BY (Ordenação) Ordenação e Null
Ordenação e Null A forma como o NULL é colocado no resultado ordenado de um SELECT depende de sistema para sistema. Alguns sistemas consideram o valor NULL menor que qualquer outro valor. Outros colocam o valor NULL sempre no topo dos valores, seja a ordenação ascendente ou descendente.
Ordenação e NULL Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 3 Jorge 35 750 2040 2 Laura 25 650 2040 5 Célia 27 700 961234567 1500 1 Ana 36 740 912345664 2500 4 José 38 670 912345432 2000 Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 5 Célia 27 700 961234567 1500 1 Ana 36 740 912345664 2500 4 José 38 670 912345432 2000 3 Jorge 35 750 2040 2 Laura 25 650 2040
Programação SQL Claúsula ORDER BY (Ordenação) Eliminação de Repetições (DISTINCT e ALL)
Eliminação de Repetições (DISTINCT e ALL) Seleccionar o conjunto das Localidades existentes na tabela Postal. SELECT Local FROM Postal Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem Access Sql Server Oracle SyBase 2300 Tomar 3000 Coimbra
Eliminação de Repetições (DISTINCT e ALL) Seleccionar o conjunto das Localidades existentes na tabela Postal. SELECT Local FROM Postal Access Sql Server Oracle SyBase Tabela Postal Local Lisboa Lisboa Lisboa Lisboa Santarem Tomar Coimbra
Eliminação de Repetições (DISTINCT e ALL) Seleccionar o conjunto das Localidades existentes na tabela Postal. SELECT Local FROM Postal ou SELECT ALL Local FROM Postal Access Sql Server Oracle SyBase Tabela Postal Local Lisboa Lisboa Lisboa Lisboa Santarem Tomar Coimbra
Eliminação de Repetições (DISTINCT e ALL) Se pretendermos eliminar as repetições existentes nas linhas resultantes de um SELECT, poderemos utilizar a cláusula DISTINCT imediatamente a seguir ao SELECT.
Eliminação de Repetições (DISTINCT e ALL) SELECT DISTINCT Local FROM Postal Access Sql Server Oracle SyBase Tabela Postal Local Tabela Postal Local Lisboa Coimbra Lisboa Lisboa Santarem Lisboa Tomar Santarem Tomar Coimbra
Eliminação de Repetições (DISTINCT e ALL) SELECT ID, DISTINCT ID_Msg FROM Comissão SELECT DISTINCT ID, ALL ID_Msg FROM Comissão
Programação SQL Juntando várias tabelas JOIN
Juntando várias tabelas (JOIN) Vamos abordar a ligação entre tabelas, operação normalmente designada por JOIN. O JOIN (ligação) entre Tabelas permite extrair, num único SELECT, informação contida em diferentes Tabelas.
Álgebra Relacional Produto Cartesiano Tabela Produto cartesiano de A e B x y z u v w a b c m n o a b c p q r a b c s t u d e f m n o d e f p q r d e f s t u g h i m n o g h i p q r g h i s t u
Juntando várias tabelas (JOIN) A junção entre tabelas faz-se colocando na cláusula FROM o conjunto das tabelas que se pretende juntar. SELECT campo1, campo2, FROM Tabela1, Tabela2,
Juntando várias tabelas (JOIN) Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 5 Célia 27 700 961234567 1500 3 Jorge 35 750 1100 1 Ana 36 740 912345664 2300 2 Laura 25 650 1000 4 José 38 670 912345432 2000 Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem 2300 Tomar SELECT * 3000 Coimbra FROM Funcionários, Postal
Álgebra Relacional Produto Cartesiano Tabela Produto cartesiano de A e B x y z u v w a b c m n o a b c p q r a b c s t u d e f m n o d e f p q r d e f s t u g h i m n o g h i p q r g h i s t u
Juntando várias tabelas (JOIN) Tabela Funcionários e Tabela Postal ID Nome Idade Salario Telefone Cod_Postal Codigo Local 1 Ana 36 740 912345664 2500 1000 Lisboa 1 Ana 36 740 912345664 2500 1100 Lisboa 1 Ana 36 740 912345664 2500 1200 Lisboa 1 Ana 36 740 912345664 2500 1500 Lisboa 1 Ana 36 740 912345664 2500 2000 Santarem 1 Ana 36 740 912345664 2500 2300 Tomar 1 Ana 36 740 912345664 2500 3000 Coimbra 2 Laura 25 650 2000 1000 Lisboa O resultado é o produto cartesiano entre as Tabelas Funcionários e Postal, que associa a cada linha da Tabela Pessoa o conjunto das linhas da Tabela Postal.
Juntando várias tabelas CROSS JOIN O Produto Cartesiano entre tabelas também é conhecido por CROSS JOIN.
Juntando várias tabelas (JOIN) Tabela Funcionários e Tabela Postal ID Nome Idade Salario Telefone Cod_Postal Codigo Local 1 Ana 36 740 912345664 2300 1000 Lisboa 1 Ana 36 740 912345664 2300 1100 Lisboa 1 Ana 36 740 912345664 2300 1200 Lisboa 1 Ana 36 740 912345664 2300 1500 Lisboa 1 Ana 36 740 912345664 2300 2000 Santarem 1 Ana 36 740 912345664 2300 2300 Tomar 1 Ana 36 740 912345664 2300 3000 Coimbra 2 Laura 25 650 2000 1000 Lisboa
Juntando várias tabelas (JOIN) Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 5 Célia 27 700 961234567 1500 3 Jorge 35 750 1100 1 Ana 36 740 912345664 2300 2 Laura 25 650 1000 4 José 38 670 912345432 2000 Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem SELECT * FROM Funcionários, Postal WHERE Cod_Postal = Codigo 2300 Tomar 3000 Coimbra
Álgebra Relacional - Join
Juntando várias tabelas (JOIN) Tabela Funcionários e Tabela Postal ID Nome Idade Salario Telefone Cod_Postal Codigo Local 1 Ana 36 740 912345664 2300 2300 Tomar 2 Laura 25 650 1000 1000 Lisboa 3 Jorge 35 750 1100 1100 Lisboa 4 José 38 670 912345432 2000 2000 Santarem 5 Célia 27 700 961234567 1500 1500 Lisboa A junção entre duas ou mais tabelas faz-se através das chaves estrangeiras, na cláusula WHERE. Caso não se faça a junção, o resultado é o Produto Cartesiano das duas tabelas.
Juntando várias tabelas EQUI-JOIN Estamos perante um EQUI-JOIN quando todas as colunas das tabelas são apresentadas e a ligação entre as tabelas é feita através de uma igualdade, dando assim origem a duas colunas de conteúdos exactamente iguais.
Juntando várias tabelas (JOIN) Tabela Funcionários e Tabela Postal ID Nome Idade Salario Telefone Cod_Postal Codigo Local 1 Ana 36 740 912345664 2300 2300 Tomar 2 Laura 25 650 1000 1000 Lisboa 3 Jorge 35 750 1100 1100 Lisboa 4 José 38 670 912345432 2000 2000 Santarem 5 Célia 27 700 961234567 1500 1500 Lisboa
Juntando várias tabelas (JOIN) Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 5 Célia 27 700 961234567 1500 3 Jorge 35 750 1100 1 Ana 36 740 912345664 2300 2 Laura 25 650 1000 4 José 38 670 912345432 2000 Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem 2300 Tomar 3000 Coimbra SELECT Funcionários.*, Postal.Local FROM Funcionários, Postal WHERE Codigo = Cod_Postal
Juntando várias tabelas (JOIN) Tabela Funcionários e Tabela Postal ID Nome Idade Salario Telefone Cod_Postal Local 1 Ana 36 740 912345664 2300 Tomar 2 Laura 25 650 1000 Lisboa 3 Jorge 35 750 1100 Lisboa 4 José 38 670 912345432 2000 Santarem 5 Célia 27 700 961234567 1500 Lisboa Como não faz muito sentido que na junção das tabelas se obtenham duas colunas com a mesma informação, é natural haver uma junção das tabelas sem que exista repetição dados.
Juntando várias tabelas NATURAL JOIN Estamos perante um NATURAL JOIN quando todas as colunas envolvidas na ligação entre as tabelas são apresentadas sem repetições de colunas.
Juntando várias tabelas JOIN CROSS JOIN EQUI-JOIN NATURAL JOIN
Programação SQL Juntando várias tabelas INNER JOIN
Juntando várias tabelas INNER JOIN O INNER JOIN corresponde a uma outra designação para o tipo de Join habitual em que se juntam duas ou mais tabelas, ligando-as através da Chave Primária de uma e da Chave Estrangeira da outra.
Juntando várias tabelas INNER JOIN Num INNER JOIN, apenas são apresentados os registos em que exista ligação entre as tabelas.
Juntando várias tabelas INNER JOIN Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 5 Célia 27 700 961234567 1500 3 Jorge 35 750 1100 1 Ana 36 740 912345664 2300 2 Laura 25 650 1000 4 José 38 670 912345432 2000 Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem 2300 Tomar 3000 Coimbra Seleccionar o Nome e a Morada Completa de todos os funcionários.
Juntando várias tabelas INNER JOIN Seleccionar o Nome e a Morada Completa de todos os funcionários. SELECT Nome, Cod_Postal, Local FROM Funcionários, Postal WHERE Cod_Postal = Codigo Nome Cod_Postal Local Célia 1500 Lisboa Jorge 1100 Lisboa Ana 2300 Tomar Laura 1000 Lisboa José 2000 Santarem Tabela Funcionários e Tabela Postal
Juntando várias tabelas INNER JOIN Tabela Funcionários ID Nome Idade Salario Telefone Cod_Postal 5 Célia 27 700 961234567 1500 3 Jorge 35 750 1100 1 Ana 36 740 912345664 2300 2 Laura 25 650 1000 4 José 38 670 912345432 2000 Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem 2300 Tomar 3000 Coimbra Seleccionar, unicamente, as localidades das pessoas que não têm telefone.
Juntando várias tabelas INNER JOIN Seleccionar, unicamente, as localidades das pessoas que não têm telefone. SELECT Local FROM Funcionários, Postal WHERE Cod_Postal = Postal AND Telefone IS NULL Local Lisboa Localidades apresentadas com repetições. Lisboa
Juntando várias tabelas INNER JOIN Seleccionar, unicamente, as localidades das pessoas que não têm telefone. SELECT DISTINCT Local FROM Funcionários, Postal WHERE Cod_Postal = Postal AND Telefone IS NULL Local Lisboa Localidades apresentadas sem repetições.
Juntando várias tabelas INNER JOIN Se os campos de selecção ou junção de duas tabelas tiverem o mesmo nome, então para eliminar quaisquer ambiguidades, cada um dos campos deve ser precedido do Nome da tabela, seguindo de um Ponto:
Juntando várias tabelas INNER JOIN Tabela Funcionários ID Nome Idade Salario Telefone Codigo 5 Célia 27 700 961234567 1500 3 Jorge 35 750 1100 1 Ana 36 740 912345664 2300 2 Laura 25 650 1000 4 José 38 670 912345432 2000 Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem 2300 Tomar 3000 Coimbra SELECT Funcionários.Codigo, Nome, Postal.Local FROM Funcionários, Postal WHERE Funcionários.Codigo = Postal.Codigo
Juntando várias tabelas INNER JOIN O Nome de uma tabela pode ser reduzido ou alterado num SELECT, através da utilização de uma alias que deve ser colocado à frente da tabela e que passará a ser uma outra forma de identificar a Tabela:
Juntando várias tabelas INNER JOIN Tabela Funcionários ID Nome Idade Salario Telefone Codigo 5 Célia 27 700 961234567 1500 3 Jorge 35 750 1100 1 Ana 36 740 912345664 2300 2 Laura 25 650 1000 4 José 38 670 912345432 2000 Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem 2300 Tomar 3000 Coimbra SELECT F.Codigo, Nome, P.Local FROM Funcionários F, Postal P WHERE F.Codigo = P.Codigo
Programação SQL Juntando várias tabelas OUTER JOIN
Juntando várias tabelas OUTER JOIN No JOIN tradicional, a junção entre as tabelas T1 e T2 é sempre realizada apenas para valores de T1 que tenham um valor correspondente em T2.
Juntando várias tabelas OUTER JOIN O papel do OUTER JOIN é estender este conceito, permitindo que a totalidade das linhas de uma tabela seja obtida, ainda que não exista o correspondente valor na outra tabela a que está ligada pela junção.
Juntando várias tabelas OUTER JOIN Tabela Funcionários ID Nome Idade Salario Telefone Codigo 5 Célia 27 700 961234567 1500 3 Jorge 35 750 1100 1 Ana 36 740 912345664 2300 2 Laura 25 650 1000 4 José 38 670 912345432 2000 Tabela Postal Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem 2300 Tomar 3000 Coimbra
Juntando várias tabelas OUTER JOIN Em Access e SqlServer, o OUTER JOIN é implementado através das palavras LEFT JOIN e RIGHT JOIN.
Juntando várias tabelas OUTER JOIN Quando o OUTER JOIN é realizado à esquerda, são considerados todos os registos da tabela da esquerda e apenas os registos correspondentes na tabela da direita.
Juntando várias tabelas OUTER JOIN Exemplo [Left Join]: SELECT Nome, Cod_Postal, Codigo, Local FROM Postal LEFT JOIN Funcionários ON Postal.Codigo = Funcionários.Cod_Postal Access Sql Server
Juntando várias tabelas OUTER JOIN Quando o OUTER JOIN é realizado à direita, são considerados todos os registos da tabela da direita e apenas os registos correspondentes na tabela da esquerda.
Juntando várias tabelas OUTER JOIN Exemplo [Right Join]: SELECT Nome, Valor FROM Comissão RIGHT JOIN Funcionários ON Comissao.Id=Pessoa.Id Access Sql Server
Juntando várias tabelas OUTER JOIN O Access obriga à colocação do Nome da tabela junto a cada Campo (formato Tabela.Campo) que seja colocado na condição do OUTER JOIN. Em Sql Server a indicação do nome da tabela só é necessária se existir ambiguidade entre os campos.
Juntando várias tabelas OUTER JOIN A implementação do OUTER JOIN em Oracle é realizada através do operador (+). Este operador é indicado a seguir à coluna que se pretende preencher com NULL, caso não existam os valores associados à coluna da outra tabela.
Juntando várias tabelas OUTER JOIN Formato Significado (+) = Insere todos os valores da coluna da direita. = (+) Insere todos os valores da coluna da esquerda. SELECT Nome, Cod_Postal, Codigo, Local FROM Postal, Funcionários WHERE Codigo = Cod_postal (+) ;
Juntando várias tabelas OUTER JOIN Regras operador (+): só pode aparecer na cláusula WHERE; tem de ser utilizado em todas as condições; só pode ser aplicado a uma coluna; não pode ser aplicado a expressões;
Programação SQL Juntando várias tabelas Union
Juntando várias tabelas UNION Uma união não é propriamente uma ligação entre tabelas. A UNION permite juntar o conteúdo de múltiplos comandos SELECT.
Juntando várias tabelas UNION Exemplo: SELECT ID_Msg, Mensagem FROM Mensagem UNION SELECT Codigo, Local FROM Postal
Juntando várias tabelas UNION Numa UNION, o número de campos a seleccionar em cada um dos comandos SELECT tem de ser igual. Numa UNION, o nome das colunas apresentado no resultado é o nome das colunas seleccionadas na primeira instrução SELECT.
Juntando várias tabelas UNION Cada SELECT pode conter a sua própria cláusula WHERE, no entanto poderá existir uma única cláusula ORDER BY no último SELECT, sendo a ordenação aplicada a todo o resultado.
Juntando várias tabelas UNION Exemplo: SELECT ID_Msg, Mensagem FROM Mensagem WHERE ID_Msg <=50 UNION SELECT Codigo, Local FROM Postal WHERE Local LIKE *AR* ORDER BY Mensagem
Juntando várias tabelas UNION Por defeito uma UNION remove sempre linhas duplicadas. Se em vez de UNION, utilizarmos o operador UNION ALL, os duplicados não são retirados da selecção.
Programação SQL Juntando várias tabelas INTERSECT
Juntando várias tabelas INTERSECT O operador INTERSECT permite juntar o resultado de dois comandos SELECT, apresentando apenas as linhas que resultam de ambos os comandos.
Juntando várias tabelas INTERSECT Tabela Postal SELECT * Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa FROM Postal WHERE Codigo <= 1500 Tabela Postal Codigo Local 1000 Lisboa 2000 Santarem 2300 Tomar 3000 Coimbra 1100 Lisboa 1200 Lisboa 1500 Lisboa
Juntando várias tabelas INTERSECT Tabela Postal SELECT * Codigo Local 1000 Lisboa 1100 Lisboa 1200 Lisboa 1500 Lisboa 2000 Santarem 2300 Tomar 3000 Coimbra FROM Postal WHERE Codigo >= 1200 Tabela Postal Codigo Local 1200 Lisboa 1500 Lisboa 2000 Santarem 2300 Tomar 3000 Coimbra
Juntando várias tabelas INTERSECT Tabela Postal Codigo Local Tabela Postal 1200 Lisboa Codigo Local 1000 Lisboa 1500 Lisboa 1100 Lisboa 2000 Santarem 1200 Lisboa 2300 Tomar Tabela Postal Codigo Local 1200 Lisboa 1500 Lisboa 1500 Lisboa 3000 Coimbra SELECT * FROM Postal WHERE Codigo <= 1500 INTERSECT SELECT * FROM Postal WHERE Codigo >= 1200
Programação SQL Juntando várias tabelas MINUS
Juntando várias tabelas MINUS O operador MINUS devolve os registos que resultam do primeiro SELECT e que não aparecem no segundo. Exemplo: seleccionar todas as linhas da tabela Postal cujo Codigo é menor ou igual a 1500, ignorando todos os elementos cujo Codigo está entre os 1000 e 1200.
Juntando várias tabelas MINUS SELECT * FROM Postal WHERE Codigo <= 1500 Codigo NOT BETWEEN 1000 AND 1200 ORACLE SELECT * FROM Postal WHERE Codigo <= 1500 MINUS SELECT * FROM Postal WHERE Codigo BETWEEN 1000 AND 1200
Juntando várias tabelas RESUMO DAS JUNÇÕES Join Produto Cartesiano INNER JOIN OUTER JOIN UNION UNION ALL Descrição Juntar cada linha da tabela T1 com todas as linhas da tabela de T2. Junção tradicional, em que apenas são apresentadas as linhas comuns às duas tabelas. Extensão do Inner Join ao proporcionar todos os registos de uma das tabelas, mesmo que sobre estes não exista qualquer ligação. Todos os registos de qualquer das pesquisas (sem duplicados). Todos os registos de qualquer das pesquisas (com duplicados).
Juntando várias tabelas RESUMO DAS JUNÇÕES Join Descrição INTERSECT Todos os registos comuns a ambas as pesquisas. MINUS Todos os registos da primeira pesquisa que não aparecem na segunda.
Programação SQL Funções de Agregação
Funções de Agregação Também designadas por Funções Estatísticas, têm por objectivo obter informação sobre conjuntos de linhas especificados na cláusula WHERE ou sobre grupos de linhas na cláusula GROUP BY.
Funções de Agregação Função Count Max Min Sum AVG Descrição Devolve o número de linhas. Devolve o Maior valor da coluna. Devolve o Menor valor da coluna. Devolve a Soma de todos os valores da coluna. Devolve a Média (Average) de todos os valores da coluna.
Programação SQL Funções de Agregação COUNT
Funções de Agregação - COUNT Devolve o nº de linhas que resultam num SELECT. Pode ser utilizada de três formas distintas: Forma COUNT (*) COUNT (Coluna) COUNT (DISTINCT Coluna) Descrição Devolve o número de linhas que resulta de um SELECT. Devolve o número de ocorrências na coluna diferentes de NULL. Devolve o número de ocorrências (sem repetições) na coluna.
Funções de Agregação - COUNT Quantos funcionários existem na BD? SELECT COUNT (*) AS Total FROM Funcionários Total 7
Funções de Agregação - COUNT Qual o número de Funcionários e quantos têm telefone? SELECT COUNT (*) AS Total1, COUNT (Telefone) AS Total2 FROM Funcionários Total1 Total2 7 3
Funções de Agregação - COUNT Quantos funcionários têm telefone? SELECT COUNT (Telefone) AS Total FROM Funcionários Total 3
Funções de Agregação - COUNT Quantos funcionários NÃO têm telefone? SELECT COUNT (*) AS Total FROM Funcionários WHERE Telefone IS NULL Total 4
Funções de Agregação - COUNT Quantas comissões têm valor superior ou igual a 1000? SELECT COUNT (*) AS ValorCom FROM Comissão WHERE Valor >= 1000 ValorCom 7
Funções de Agregação - COUNT Quais os ID envolvidos na tabela Comissões? SELECT ID FROM Comissão ID 14 25 14 37 14 37 18 42
Funções de Agregação - COUNT Quais os ID envolvidos na tabela de Comissões? SELECT COUNT (ID) AS Total FROM Comissão Total 8 Com esta solução iremos obter o número de todos os ID, incluindo as repetições.
Funções de Agregação - COUNT Quais os ID envolvidos na tabela de Comissões? SELECT COUNT (DISTINCT ID) AS Total FROM Comissão Total Com esta solução iremos obter o número de todos os ID, sem repetições. 5
Programação SQL Funções de Agregação MIN e MAX
Funções de Agregação MIN e MAX Permitem obter o menor e o maior valor de uma determinada coluna. Qual o valor do maior salário pago na empresa? SELECT MAX (Salario) AS MaiorSalario FROM Funcionários ; MaiorSalario 1500
Funções de Agregação MIN e MAX Qual a idade do funcionário mais novo? SELECT MIN (Idade) AS MinIdade FROM Funcionários ; MinIdade 19
Funções de Agregação MIN e MAX Qual o menor e o maior valor de comissão superior a 1000 e inferior a 5000? SELECT MIN (Valor) AS Menor, FROM Comissão, MAX (Valor) AS Maior, WHERE Valor > 1000 AND Valor < 5000 ; Menor Maior 2300 3750
Funções de Agregação MIN e MAX As funções MIN e MAX podem ser aplicadas a colunas que não contenham valores numéricos. No caso de serem aplicadas a campos do tipo string, são devolvidos os Menor e Maior valores alfabeticamente.
Funções de Agregação MIN e MAX Qual o nome do primeiro funcionário, se a lista fosse ordenada alfabeticamente? SELECT MIN (Nome) AS Primeiro, FROM Funcionários ; Primeiro Ana Dias
Funções de Agregação MIN e MAX Qual o nome do último funcionário, se a lista fosse ordenada alfabeticamente? SELECT MAX (Nome) AS Ultimo, FROM Funcionários ; Ultimo Zulmira Silva
Programação SQL Funções de Agregação SUM
Funções de Agregação SUM Devolve a soma de uma determinada coluna. Qual o valor total das comissões a pagar? SELECT SUM (Valor) AS Comissoes, FROM Comissao ; Comissoes 42480
Funções de Agregação SUM Devolve a soma de uma determinada coluna. Qual o valor total das comissões e IVA (21%) a pagar? SELECT SUM (Valor) AS Comissoes, SUM (Valor*0.21) AS IVA, FROM Comissao ; Comissoes IVA 42480 7221.6
Programação SQL Funções de Agregação AVG
Funções de Agregação AVG Devolve a média dos valores de uma determinada coluna. Qual a média das idades dos funcionários? SELECT AVG (Idade) AS MediaIdade, FROM Funcionarios ; MediaIdade 30,8571428571429
Funções de Agregação AVG Qual a média das idades dos funcionários? SELECT FORMAT(AVG(Idade), 0.00 ) AS MediaIdade, FROM Funcionarios ; Access MediaIdade 30,86
Funções de Agregação AVG Seleccionar o Salário Médio dos Funcionários com mais de 30 anos. SELECT AVG(Salario)AS MediaSal, FROM Funcionarios, WHERE Idade > 30 ; MediaSal 134000
Funções de Agregação AVG Seleccionar o Salário Médio dos Funcionários com mais de 30 anos. SELECT AVG(Salario), FROM Funcionarios, WHERE Idade > 30 ; Expr1000 134000
Funções de Agregação As funções MIN, MAX, COUNT( ) e COUNT(*) podem ser utilizadas com qualquer tipo de dados. As funções SUM e AVG apenas podem ser aplicadas a campos numéricos.
Programação SQL Agrupando a Informação
Agrupando a Informação As funções de agregação permitem obter informação resumida sobre o resultado de um comando SELECT. Estas funções podem ser úteis no tratamento de forma agrupada, não como um todo, mas em grupos mais pequenos.
Agrupando a informação Exemplo: Mostrar o Valor das Comissões existentes na Base de Dados SELECT ID, Valor FROM Comissão ORDER BY ID Access Sql Server Oracle SyBase ID Valor 1 2200 2 3500 2 3600 3 2500 4 3800 5 1200 5 1800 5 1300 Tabela Comissão
Agrupando a informação Exemplo: Mostrar o Valor TOTAL das Comissões existentes na Base de Dados SELECT SUM (Valor) AS Total FROM Comissão Total 19900 Access Sql Server Oracle SyBase
Agrupando a Informação Mas o nosso objectivo consiste em obter o valor da soma das comissões de cada ID e não a soma de todas elas. É aí que entra a cláusula GROUP BY.
Agrupando Informação SELECT Campo 1, Campo 2,, Campo n, * FROM Tabela 1,, Tabela k [WHERE Condição] [GROUP BY ] [HAVING ] [ORDER BY Campo [ASC DESC], ]
Programação SQL Agrupando a Informação Cláusula GROUP BY
Agrupando a Informação Cláusula Group BY A cláusula GROUP BY divide o resultado de um SELECT em grupos de resultados que irão ser tratados com as funções de agregação.
Agrupando a Informação Cláusula Group BY Obter o valor da soma das comissões agrupadas por ID. SELECT ID, SUM (Valor) AS Total FROM Comissão GROUP BY ID ID Valor 1 2200 2 7100 3 2500 4 3800 5 4300 ID Valor 1 2200 2 3500 2 3600 3 2500 4 3800 5 1200 5 1800 5 1300 Tabela Comissão Tabela Comissão
Agrupando a Informação Cláusula Group BY Mostrar o valor total (Salário + Comissões) a receber por cada funcionário. SELECT Nome, SUM (Valor) +Salario AS FROM Funcionarios F, Comissao C WHERE F.ID = C.ID GROUP BY Nome, Salario Total Para resolver este exercício, teremos que somar cada um dos salários com o resultado da soma das respectivas comissões.
Agrupando a Informação Cláusula Group BY Tabela Funcionários Tabela Comissão ID Nome Idade Salario Telefone Codigo ID ID_Mesg Valor 5 Célia 27 700 961234567 1500 5 60 2200 3 Jorge 35 750 1100 3 10 3500 1 Ana 36 740 912345664 2300 1 50 3600 2 Laura 25 650 1000 2 45 2500 4 José 38 670 912345432 2000 SELECT Nome, SUM (Valor) +Salario AS Total FROM Funcionarios F, Comissao C WHERE F.ID = C.ID GROUP BY Nome, Salario 4 37 3800 1 30 1200 1 34 1800 2 34 1300
Agrupando a Informação Cláusula Group BY Nome Total Ana 7340 Célia 2900 Jorge 4250 = (3600+1200+1800)+740 Soma dos valores da tabela comissão Salário da tabela Funcionários José 4470 Laura 4450 SELECT Nome, SUM (Valor) +Salario AS Total FROM Funcionarios F, Comissao C WHERE F.ID = C.ID GROUP BY Nome, Salario
Agrupando a Informação Cláusula Group BY Seleccionar a maior comissão de cada ID: SELECT ID, MAX (Valor) AS Maior FROM Comissão GROUP BY ID
Agrupando a Informação Cláusula Group BY Seleccionar o número de comissões de cada ID. SELECT ID, COUNT (*) AS NumCom FROM Comissão GROUP BY ID ID NumCom 1 1 2 2 3 1 4 1 5 3 Tabela Comissão
Programação SQL Agrupando a Informação Cláusula HAVING
Agrupando a Informação Cláusula HAVING A cláusula HAVING serve para fazer restrições ao nível dos grupos que são processados. Se pretendermos mostrar os grupos com uma característica em particular, não utilizamos a cláusula WHERE, pois esta destina-se à restrição das linhas.
Agrupando a Informação Cláusula HAVING Utiliza-se a cláusula HAVING, que actua unicamente sobre o resultado dos grupos.
Agrupando a Informação Cláusula HAVING Mostrar o valor total de cada comissão agrupada por ID. ID Total SELECT ID, SUM (Valor) AS Total FROM Comissão GROUP BY ID 1 2200 2 7100 3 2500 4 3800 5 4300 Tabela Comissão
Agrupando a Informação Cláusula HAVING Resolver o problema anterior, seleccionando apenas os ID com comissões totais superiores ou iguais a 3800. SELECT ID, SUM (Valor) AS Total FROM Comissão GROUP BY ID HAVING SUM (Valor) >= 3800 ID Total 2 7100 4 3800 5 4300 Tabela Comissão
Programação SQL Agrupando a Informação WHERE vs. HAVING
Agrupando a Informação WHERE vs. HAVING Por vezes surge a dúvida sobre quando utilizar a cláusula WHERE ou a cláusula HAVING para restringir o conjunto de registos a apresentar.
Agrupando a Informação WHERE vs. HAVING Utiliza-se a cláusula WHERE sempre que se pretende restringir os registos a considerar na selecção. A cláusula HAVING serve para restringir os grupos que foram formados depois de aplicada a restrição da cláusula WHERE.
Agrupando a Informação Cláusula HAVING Saber qual o total das comissões (por ID), considerando apenas aquelas cujo valor total seja superior a 2000. SELECT ID, SUM (Valor) AS Total FROM Comissão GROUP BY ID HAVING SUM (Valor) > 2000
Agrupando a Informação Cláusula HAVING Saber qual o total das comissões (por ID), considerando apenas aquelas cujo valor seja superior a 2000. SELECT ID, SUM (Valor) AS Total FROM Comissão WHERE Valor > 2000 GROUP BY ID
Agrupando a Informação WHERE vs. HAVING A cláusula WHERE só pode ser aplicada a registos individuais, A cláusula HAVING só pode ser aplicada a funções de grupo.
Programação SQL Agrupando a Informação Agrupamentos e o Valor NULL
Agrupando a Informação Agrupamentos e o valor NULL Uma questão interessante consiste em saber o que acontece quando numa tabela mandamos ordenar os dados de uma coluna e nessa coluna existe o valor NULL. Num SELECT com a cláusula GROUP BY, se existirem NULLS na coluna ou colunas de agrupamento, estes são também agrupados.
Agrupando a Informação Agrupamentos e o valor NULL No exemplo abaixo, o valor NULL aparece 4 vezes na coluna denominada Telefone: SELECT Telefone, COUNT (*) AS Tlf FROM Funcionarios GROUP BY Telefone Telefone Tlf 4 123456 1 789101 2
Programação SQL Agrupando a Informação Ordenação
Agrupando a Informação Ordenação Relativamente à ordenação de grupos, devem-se seguir as regras apresentadas anteriormente, isto é, pode-se fazer a ordenação por colunas, expressões ou pela ordem da coluna ou expressão seleccionada.
Agrupando a Informação Ordenação Ordenação por uma coluna SELECT ID, COUNT (ID) FROM Comissão GROUP BY ID ORDER BY ID [DESC]
Agrupando a Informação Ordenação Ordenação por uma expressão ou função de agregação. SELECT ID, COUNT (ID) FROM Comissão GROUP BY ID ORDER BY COUNT (ID) [DESC]
Programação SQL SubQueries
SubQueries Uma das características do comando SELECT, que por vezes passa despercebida, reside no facto de qualquer comando SELECT não devolver dados, linhas ou colunas, mas devolver sempre uma Tabela como resultado da sua execução. O resultado do comando SELECT é sempre uma Tabela, ainda que da sua execução não resulte qualquer linha.
SubQueries Sendo o resultado de qualquer comando SELECT uma tabela, podemos então utilizar os resultados devolvidos nessa tabela e incorporá-los noutro comando SELECT que deles necessite. Uma SubQuery consiste num SELECT dentro de outro.
SubQueries Um comando SELECT pode ser colocado: Dentro de um outro SELECT nas cláusulas WHERE, HAVING, SELECT e FROM; Dentro de uma outra SubQuery nas mesmas componentes do ponto anterior; Nos comandos INSERT, UPDATE, DELETE.
SubQueries É esta capacidade que o SQL tem de integrar comandos SELECT de forma encadeada que fez com que fosse baptizado com o nome de Structured Query Language (Linguagem Estruturada de Pesquisas). Vamos ver como se implementam e usam as SubQueries:
SubQueries Qual o nome do funcionário com menor salário? Dois problemas para resolver: Qual o valor do menor salário; Qual o nome do funcionário a que esse salário corresponde.
SubQueries Qual o nome do funcionário com menor salário? 1º problema: Qual o valor do menor salário?
SubQueries Tabela Funcionários ID Nome Idade Salario Telefone Codigo 5 Célia 27 700 961234567 1500 3 Jorge 35 750 1100 1 Ana 36 740 912345664 2300 2 Laura 25 650 1000 4 José 38 670 912345432 2000 SELECT MIN (Salario) AS Menor FROM Funcionários Salario 650
SubQueries Qual o nome do funcionário com menor salário? 2º problema: Qual o funcionário que ganha esse salário?
SubQueries Tabela Funcionários ID Nome Idade Salario Telefone Codigo 5 Célia 27 700 961234567 1500 3 Jorge 35 750 1100 1 Ana 36 740 912345664 2300 2 Laura 25 650 1000 4 José 38 670 912345432 2000 SELECT Nome FROM Funcionários WHERE Salario = 650 Nome Laura
SubQueries Qual o nome do funcionário com menor salário? SELECT MIN (Salario) AS Menor FROM Funcionários Salario 650 SELECT Nome FROM Funcionários WHERE Salario = 650 Nome Laura
SubQueries Qual o nome do funcionário com menor salário? SELECT Nome FROM Funcionários Nome Laura WHERE Salario = ( SELECT MIN (Salario) FROM Funcionários ) O resultado deste SELECT encadeado é apenas a coluna Nome seleccionada no SELECT exterior.
SubQueries Quando um SELECT contém outro SELECT encadeado, pode acontecer que o SELECT anterior necessite de valores do SELECT exterior.
SubQueries Qual o nome dos funcionários cujo salário é menor que 15 vezes o conjunto das suas Comissões. SELECT Nome, Salarios FROM Funcionários F WHERE Salario < ( SELECT SUM (Valor) FROM Comissão C WHERE C.ID=F.ID ) * 15
SubQueries A forma como os sistemas executam as Queries depende do tipo de Query em que se está em presença. Estas podem classificar-se como Correlacionadas ou Não- Correlacionadas.
Programação SQL SubQueries SubQuery Não-Correlacionada
SubQueries Não-Correlacionadas Numa Query Não-Correlacionada o SELECT interior não depende do SELECT exterior: SELECT Nome FROM Funcionários WHERE Salario = ( SELECT MIN (Salario) FROM Funcionários )
Programação SQL SubQueries SubQuery Correlacionada
SubQueries Não-Correlacionadas Numa Query Correlacionada o SELECT interior depende efectivamente dos dados que lhe são fornecidos pelo SELECT exterior: SELECT Nome, Salarios FROM Funcionários F WHERE Salario < ( SELECT SUM (Valor) FROM Comissão C WHERE C.ID=F.ID ) * 15
Programação SQL SubQueries Operador Exists
SubQueries SELECT Nome, Cod_Postal FROM Funcionários WHERE Cod_Postal IN (SELECT Codigo FROM Postal WHERE Local= Lisboa ) Quais os códigos postais (numéricos) que estão associados à cidade de Lisboa?
SubQueries Operador EXISTS Só pode ser utilizado para avaliar o resultado de SubQueries. O seu objectivo é verificar se, da execução da SubQuery, resultou ou não alguma linha de resultado.
SubQueries Operador EXISTS O formato do operador EXISTS é: SELECT FROM WHERE [NOT] EXISTS (SubQuery)
SubQueries Operador EXISTS Seleccionar o Nome e Morada completa de todos os funcionários que têm comissões a receber: SELECT Nome, Cod_Postal, Local FROM Funcionários F, Postal WHERE EXISTS (SELECT ID FROM Comissão WHERE ID = F.ID )
SubQueries Operador EXISTS Seleccionar o Nome e Morada completa de todas os funcionários que NÃO têm comissões a receber: SELECT Nome, Cod_Postal, Local FROM Funcionários F, Postal WHERE NOT EXISTS (SELECT ID FROM Comissão WHERE ID = F.ID )
SubQueries Operador EXISTS Seleccionar todos os códigos e localidades que não estão associados a qualquer funcionário: SELECT * FROM Postal WHERE NOT EXISTS (SELECT * FROM Funcionários WHERE Cod_Postal=Codigo )
Programação SQL SubQueries Operador All e Any
Para relembrar: OPERADORES RELACIONAIS Permitem estabelecer relações entre elementos. O resultado da aplicação de um destes operadores é sempre o valor lógico TRUE ou FALSE. Operador Descrição Exemplo Resultado = Igual a 7=5 FALSE > Maior que 7>5 TRUE < Menor que 7<5 FALSE >= Maior ou Igual que 7>=5 TRUE <= Menor ou igual que 7<=5 FALSE <> Ou!= Diferente 7<>5 TRUE
SubQueries ALL e ANY As palavras reservadas ALL e ANY podem ser adicionadas a comparações que utilizem os operadores relacionais, alterando um pouco o seu uso habitual. A utilização destas palavras permite realizar comparações.
SubQueries ALL e ANY Seleccionar o Nome e Idade de todas os funcionários que não vivem em Lisboa: SELECT Nome e Idade FROM Funcionários WHERE Cod_Postal <> ALL (1000, 1100, 1200, 1500) ORACLE
SubQueries ALL e ANY Seleccionar o Nome e Idade de todas os funcionários que não vivem em Lisboa: SELECT Nome, Idade FROM Funcionarios WHERE Cod_Postal <> ALL (SELECT Codigo FROM Postal WHERE Local= Lisboa )
SubQueries ALL e ANY Seleccionar o Nome e Idade de todas os funcionários que não vivem em Lisboa: SELECT Nome, Idade FROM Funcionarios WHERE Cod_Postal = ANY (SELECT Codigo FROM Postal WHERE Local<> Lisboa )
Programação SQL SubQueries Resumo
SubQueries Utilização de uma SubQuery como expressão de selecção: SELECT (SELECT MAX (Codigo) FROM Postal FROM Postal), Local ORACLE
SubQueries Utilização de uma SubQuery como tabela na cláusula FROM SELECT ID FROM (SELECT * FROM Funcionários WHERE Telefone IS NULL) ORACLE
SubQueries Utilização de uma SubQuery com funções de agregação em condições ALL / ANY SELECT Codigo FROM Postal WHERE Codigo > ALL (SELECT 2* MIN (Codigo) FROM Postal)
Programação SQL Manipulação de Dados DML Data Manipulation Language
Manipulação de Dados (DML) Os comandos INSERT, UPDATE, DELETE, são normalmente classificados como pertencendo a uma sublinguagem da linguagem SQL denominada DML.
Programação SQL Comando INSERT (inserção de registos simples)
Comando INSERT Permite realizar a introdução de novos registos numa tabela: INSERT INTO Nome_Tabela (Campo1, Campo2, ) VALUES (valor1, valor2, ) INSERT INTO Nome_Tabela VALUES (valor1, valor2, )
Comando INSERT Introduzir na tabela Postal uma linha com os valores 1250 e Mouraria: INSERT INTO Postal (Codigo, Local) VALUES (1250, Mouraria ) INSERT INTO Postal VALUES (1250, Mouraria )
Comando INSERT Pretende-se inserir na Tabela Postal, o ID e o Nome de todos os funcionários: INSERT INTO Postal (Codigo, Local) SELECT ID, Nome FROM Funcionarios
Programação SQL Comando UPDATE
Comando UPDATE Permite alterar os valores já existentes nos campos de uma única tabela: UPDATE Nome_Tabela [Alias] SET Nome_Coluna1 = {expressão1, query1}, Nome_Coluna2 = {expressão2, query2}, [WHERE Condiçao]
Comando UPDATE Aumentar o salário 10% a todos os funcionários: UPDATE Funcionarios SET Salario = Salario * 1.1
Comando UPDATE Aumentar o salário 10% apenas ao Paulo Silva, adicionando-lhe um ano à idade: UPDATE Funcionarios SET Salario = Salario * 1.1, WHERE Nome = Paulo Silva
Comando UPDATE Pretende-se que o Salário de Ana Lopes passe a ser igual ao menor salário da empresa e que o seu campo Telefone passe a ter o valor NULL. UPDATE Funcionarios SET Salario = (SELECT MIN (Salario) FROM Funcionarios), Telefone = NULL WHERE Nome = Ana Lopes
Comando UPDATE Adiciona o prefixo 21 ao telefone de todos os funcionários que têm telefone e vivem em Lisboa: UPDATE Funcionarios SET Telefone = 21 + Telefone WHERE Telefone IS NOT NULL AND EXISTS (SELECT * FROM Postal WHERE Codigo = Cod_Postal AND Local = Lisboa )
Programação SQL Comando DELETE
Comando DELETE Permite apagar conjunto de linhas existentes numa única tabela: DELETE FROM Nome_Tabela [Alias] [WHERE Condiçao]
Comando DELETE Escrever o comando SQL que permita apagar todas as linhas da tabela Comissão. DELETE FROM Comissão O comando DELETE apaga linhas completas de uma determinada tabela.
Comando DELETE Eliminar o registo do funcionário Jorge da tabela Funcionários: DELETE FROM Funcionarios WHERE ID = 3 DELETE FROM Funcionarios WHERE Nome LIKE Jorge% DELETE FROM Funcionarios SqlServer Oracle SyBase Access WHERE Nome LIKE Jorge*
Comando DELETE Apagar as localidades da tabela Postal que não estão associadas a ninguém. DELETE FROM Postal WHERE codigo NOT IN ( SELECT Cod_Postal FROM Funcionarios )
Comando DELETE Se na BD estiver definida integridade referencial* entre as tabelas A e B, então só poderá apagar uma linha A quando em B não existirem referências à linha que se pretende apagar. Por exemplo, não faz sentido remover as linhas na tabela Postal que têm códigos associados na tabela Funcionários.
Comando DELETE Se estiver definida uma relação do tipo CASCADE* DELETE entre as tabelas A e B, e se o campo x for chave primária em A e chave estrangeira em B, então bastará eliminar uma linha em A que todas as linhas de B que contenham essa chave estrangeira serão eliminadas automaticamente.
Comando DELETE Exemplo: Quando pretendemos apagar uma factura: Quando se apaga o cabeçalho da factura, não faz sentido deixar o conjunto das linhas que a compõem.
Programação SQL Manipulação de Datas
Manipulação de Datas Um dos principais problemas da informática é o tratamento de Datas. Representar um número: 10 ; 52.23 ; Representar um conjunto de caracteres: escola secundária Representar uma data:?
Manipulação de Datas - ACCESS O Access usa o formato #mm/dd/yyyy# (entre cardinais) para representar uma data no formato habitual. A introdução tem que ser obrigatoriamente feita no formato mm/dd/yyyy INSERT INTO tabela (numero, texto, data_nasc) VALUES (1, Maria, #07/02/1969#)
Manipulação de Datas Sql Server No Sql Server envia-se a data como se fosse uma string: INSERT INTO tabela (numero, texto, data_nasc) VALUES (1, Maria, 02 Jul 1969 )
Manipulação de Datas Oracle Em Oracle utiliza-se a função TO_DATE que recebe uma data (em formato string) e o formato (outra string) em que esta está especificada, devolvendo uma data formatada de acordo com o formato especificado: INSERT INTO tabela (numero, texto, data_nasc) VALUES (1, Maria, TO_DATE ( 02/07/1969, dd/mm/yyyy ))
Programação SQL Views e Índices
Views e Índices Suponhamos, por exemplo, que na nossa tabela Funcionários existia informação geral (nome, morada, telefone, etc.), informação contabilística (salário, subsídios, ) e informação médica (hepatites, sida, drogas, )
Views e Índices Embora a informação esteja toda localizada fisicamente na mesma tabela, não faz sentido que o departamento de contabilidade tenha acesso aos dados médicos de cada pessoa, da mesma forma que o pessoal médico não deverá ter acesso ao salário que cada funcionário aufere.
Views e Índices Mas apesar desta separação ser absolutamente necessária, ambos os serviços deverão ter acesso aos dados de informação geral para que o cheque com o salário possa ser enviado para a mesma morada para onde devem seguir as análises clínicas realizadas nos serviços médicos.
Views e Índices As Views servem para resolver esta necessidade de diferentes utilizadores verem a mesma tabela ou tabelas de forma distinta.
Programação SQL Views e Índices Comando CREATE VIEW
Views e Índices Comando CREATE VIEW Para criar um View, utiliza-se o comando CREATE VIEW, cuja sintaxe é a seguinte: CREATE VIEW nome_view [(Lista de colunas)] AS comando_ SELECT [WITH CHECK OPTION]
Views e Índices Comando CREATE VIEW Criar uma View Funcionarios01 com o conjunto dos funcionários cujo salário é menor que 3800. CREATE VIEW Funcionarios01 AS SELECT * FROM Funcionarios ACCESS WHERE Salario < 3800 Uma vez criada a View podemos interrogar a View como se de uma tabela vulgar se tratasse.
Views e Índices Comando CREATE VIEW Mostrar todo o conteúdo da View Funcionarios01. SELECT * FROM Funcionarios01 ACCESS Sql Server Oracle SyBase
Views e Índices As Views servem para resolver esta necessidade de diferentes utilizadores verem a mesma tabela ou tabelas de forma distinta.
Views e Índices Comando CREATE VIEW Mostrar o conteúdo da View Funcionarios01 para as pessoas com mais de 30 anos. SELECT * FROM Funcionarios01 WHERE Idade > 30 Access Sql Server Oracle SyBase
Views e Índices Comando CREATE VIEW Criar uma View Funcionarios02 com o conjunto dos funcionários cujo salário é menor que 3800. Esta View deverá conter apenas os Campos ID, Nome e Salário. CREATE VIEW Funcionarios02 AS SELECT ID, Nome, Salario FROM Funcionarios ACCESS WHERE Salario < 3800 Uma vez criada a View podemos interrogar a View como se de uma tabela vulgar se tratasse.
Views e Índices Comando CREATE VIEW Mostrar todo o conteúdo da View Funcionarios02. SELECT * FROM Funcionarios02 ACCESS Sql Server Oracle SyBase
Views e Índices O nomes das colunas da View são. Por defeito, iguais aos nomes das tabelas a que pertencem. No entanto, se o utilizador o desejar, pode atribuir um novo nome a cada uma das colunas da View. Exemplo:
Views e Índices Comando CREATE VIEW Criar uma View Funcionarios03 com cas características da View anterior, alterando os nomes das colunas para Num, Nome e Ordenado: CREATE VIEW Funcionarios03 (Num, Nome, Ordenado) AS SELECT ID, Nome, Salario FROM Funcionarios WHERE Salario < 3800 ACCESS
Views e Índices Qualquer alteração nos dados da tabela Funcionários será imediatamente reflectida em todas as Views que lhe estejam associadas: UPDATE Funcionarios SET Salario=600 WHERE ID=37 UPDATE Funcionarios03 SET Salario=600 WHERE ID=37
Views e Índices As Views não possuem dados próprios, os seus dados pertencem às tabelas das quais derivam. Na definição de uma View podem existir tabelas ou outras Views.
Programação SQL Views e Índices Juntando várias tabelas numa View
Views e Índices Juntando várias tabelas numa View É possível juntar várias tabelas numa única view: CREATE VIEW Moradas AS SELECT Nome, Cod_Postal, Local FROM Funcionarios, Postal WHERE Cod_Postal=Codigo ACCESS
Views e Índices Juntando várias tabelas numa View As Views podem, inclusive, simplificar muito o processo de cálculo e de agrupamento da informação: CREATE VIEW vcomissão (ID, Nome, Salario, Comissao) AS SELECT C.ID, Nome, Salario, SUM(Valor) FROM Funcionarios F, Comissao C WHERE F.ID=C.ID GROUP BY C.ID, Nome, Salario ACCESS
Programação SQL Views e Índices Cláusula WITH CHECK OPTION
Views e Índices Cláusula WITH CHECK POINT CREATE VIEW Funcionarios01 AS SELECT * FROM Funcionarios WHERE Salario < 100000 ACCESS Esta é constituída pelo seguinte conjunto de dados:
Views e Índices Cláusula WITH CHECK POINT ID Nome Idade Salario Telefone Cod_Postal 25 Paulo 32 95000 1500 37 Isabel 28 86000 1100 42 António 43 74000 243990435 1500 Para inserir um valor nesta View, bastará escrever o comando INSERT adaptado à View:
Views e Índices Cláusula WITH CHECK POINT INSERT INTO Funcionarios01 VALUES (999, Mário, 38, 85000, NULL, 1500) O comando INSERT é executado com sucesso. No entanto, nada nos impede de inserir nesta View alguém cujo salário seja superior a 100000, embora a condição de criação da View não incluísse valores superiores a 100000:
Views e Índices Cláusula WITH CHECK POINT INSERT INTO Funcionarios01 VALUES (100, Fernanda, 69, 200000, NULL, 2300) O comando INSERT é executado com sucesso, sem qualquer tipo de erro. No entanto, se seleccionarmos os dados da View, podemos constatar que esta linha não aparece:
Views e Índices Cláusula WITH CHECK POINT ID Nome Idade Salario Telefone Cod_Postal 25 Paulo 32 95000 1500 37 Isabel 28 86000 1100 42 António 43 74000 243990435 1500 999 Mário 38 85000 1500 CREATE VIEW Funcionarios01 AS SELECT * FROM Funcionarios WHERE Salario < 100000
Views e Índices Cláusula WITH CHECK POINT No entanto, se seleccionarmos o conteúdo da tabela Funcionarios, podemos observar que, embora estejamos a usar a View, estamos na realidade a introduzir valores da Tabela Funcionarios fora dos limites do salário a que a View deveria estar sujeita. A cláusula WITH CHECK POINT existe para evitar que uma View possa manipular registos fora dos seus limites de definição:
Views e Índices Cláusula WITH CHECK POINT CREATE VIEW TesteView AS SELECT * FROM Funcionarios WHERE Salario < 100000 WITH CHECK OPTION ACCESS
Programação SQL Views e Índices Comando DROP VIEW
Views e Índices Comando DROP VIEW Para se apagar uma View, utiliza-se o comando: ACCESS DROP VIEW nome_da_view
Programação SQL Views e Índices Índices
Views e Índices Índices Uma das maiores confusões que existe entre os utilizadores de Bases de Dados reside na confusão entre os termos Ordenação e Indexação. A Indexação é a estrutura que permite simular a ordenação dos dados. Na realidade consiste normalmente numa árvore de termos que revertem para uma determinada posição no ficheiro ou tabela.
Views e Índices Índices Suponhamos que pretendíamos, a partir de um ficheiro de dados vazio, criar um índice numa árvore binária. Uma árvore binária é um estrutura em que, para cada um dos nós da árvore, todos os nós à esquerda são menores ou iguais à chave de indexação e todos os nós à direita são superiores à chave de indexação.
Views e Índices Índices ID Nome Apelido 2456 Célia Morais 4561 José Lopes 6452 Florinda Simões 1289 António Dias 4978 Beatriz Costa 3254 Ana Rita 5698 Paulo Viegas Assim, o conjunto de dados daria origem à árvore apresentada a seguir:
Views e Índices Índices Célia 1 António 4 José 2 Ana 6 Beatriz 5 Florinda 3 Paulo 7 Index sobre o Nome
Programação SQL Views e Índices Comando CREATE INDEX
Views e Índices Comando CREATE INDEX Este comando permite fazer a criação de índices a partir de código SQL, apesar da maioria dos sistemas gestores de BD incluir utilitários que o façam de forma, mais ou menos, visual: A sintaxe do comando CREATE INDEX é a seguinte:
Views e Índices Comando CREATE INDEX CREATE[UNIQUE]INDEX Nome_do_Index ON Nome_Tabela (col1 {ASC DESC}, col2 )
Views e Índices Comando CREATE INDEX Criar um índice sobre o campo Local CREATE INDEX ilocal ON Postal (Local) Criar um índice único sobre o nome dos Funcionários. CREATE UNIQUE INDEX indnome ON Funcionários (Nome)
Views e Índices Comando CREATE INDEX Criar um índice descendente sobre o Salário. CREATE INDEX indsal ON Funcionários (Salário DESC) Criar um índice único sobre os campos ID e ID_Msg da tabela das Comissões CREATE UNIQUE INDEX indcomissao ON Comissao (ID, ID_Msg)
Views e Índices Comando CREATE INDEX Os índices são automaticamente actualizados pelos sistema gestor de BD, cada vez que um registo indexado é inserido, alterado ou apagado.
Programação SQL Views e Índices Comando DROP INDEX
Views e Índices Comando DROP INDEX Para apagar um índice, utiliza-se o comando DROP INDEX que, mais uma vez, segue a forma de uso dos comandos DROP anteriormente apresentados. A sua sintaxe é:
Views e Índices Comando DROP INDEX DROP INDEX Nome_do_Index
Views e Índices Comando DROP INDEX Escrever os comandos necessários para apagar todos os índices criados anteriormente: DROP INDEX ilocal DROP INDEX indnome DROP INDEX indsal DROP INDEX indcomissao
Views e Índices Ao contrários das VIEWS (também chamadas tabelas virtuais por não existirem fisicamente), os índices existem fisicamente em disco.