structured query language (sql) · sql junções múltiplas select e.id, e.nome, d.id, d.nome from...
TRANSCRIPT
21/06/16
1
STRUCTURED QUERY LANGUAGE (SQL) Sistemas de Informações Geográficas
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA SUL DE MINAS GERAIS Câmpus Inconfidentes
O QUE É SQL
• É uma linguagem normalizada para DEFINIÇÃO, ACESSO, MANIPULAÇÃO e CONTROLE de Base de Dados Relacionais.
• Na maioria dos SGBD, esta linguagem pode ser utilizada: • Interativamente; • Embutida em linguagens de programação.
21/06/16
2
EXEMPLO Interatividade
EXEMPLO Embutida em Linguagens de Programação
21/06/16
3
• 1970: Edgar Frank Codd define o Modelo Relacional
• 1974: IBM desenvolve o projecto SYSTEM/R com a linguagem SEQUEL
• 1979: É lançado o primeiro SGBD comercial (ORACLE)
• 1981: É lançado o SGBD INGRES
• 1983: IBM anuncia o DB2
• 1986, 1987: É ratificada a norma SQL que fica conhecida como SQL-86 (ANSI X3.135-1986 e ISO 9075:1987)
HISTÓRIA
• 1989: É ratificada a norma SQL-89 quer pela ANSI quer pela ISO
• 1992: É ratificada a norma: SQL2
• 1999: É ratificada a norma SQL1999, anteriormente conhecida como SQL3
• 2006: SQL:2006, define a forma como o SQL pode ser usado em conjunção com o XML (ANSI/ISO/IEC 9075-14:2006 )
HISTÓRIA
21/06/16
4
OPERAÇÕES DA ÁLGEBRA RELACIONAL
• Operações derivadas da teoria de conjuntos • União • Interseção • Diferença • Produto Cartesiano
• Operações Relacionais Especiais • Seleção • Projeção • Junção (Natural)
21/06/16
5
21/06/16
6
21/06/16
7
21/06/16
8
ESTRUTURA BÁSICA DO SQL
SQL é baseada em operações de conjuntos e de álgebra relacional com algumas modificações e extensões
• Uma consulta SQL básica tem a forma:
• An representam os Atributos das Tabelas Tn e Pn os Predicados de seleção.
SELECT A1, A2, A3, ..., An FROM T1, T2, ..., Tn WHERE P1 AND P2 OR P3;
ESQUEMA RELACIONAL
EMPREGADO ( id, nome, data_admissao, id_cat, id_dept, id_chefe )
DEPARTAMENTO ( id, nome, localizacao)
CATEGORIA ( id, cargo, salario )
21/06/16
9
BASE DE DADOS RELACIONAL
EMPREGADO
CATEGORIA DEPARTAMENTO id nome localidade
1 Contabilidade Lisboa
2 Vendas Porto
3 Recursos Humanos Coimbra
... ... ...
id cargo salario
1 Senior 5000
2 Pleno 3000
3 Junior 2000
... ... ...
id nome data_admissao id_cat id_dept id_chefe
1 José da Silva 13/01/2005 3 3 2
2 Rui Barbosa 01/12/1991 1 3 2
3 Pedro Vaz de Caminha 04/06/1984 1 2 20
... ... ... ... ... ...
20 Maria de Lourdes de Souza 23/11/2000 2 2 2
... ... ... ... ... ...
O COMANDO SQL SELECT te.nome, tc.salario, td.nome
FROM empregado AS te, departamento AS td, categoria AS tc
WHERE te.nome = ‘Rui Barbosa’
AND te.id_cat = tc.id
AND td.id = te. id_dept
• Qual o salário do empregado Rui Barbosa e o nome do departamento onde ele trabalha
A PERGUNTA
21/06/16
10
CARACTERÍSTICAS
• Linguagem não procedimental em que se especifica O QUÊ e não COMO
Existe uma clara abstração perante a estrutura física dos dados, isto é, não é necessário especificar caminhos de acesso nem algoritmos de pesquisa física
• Operações sobre estruturas lógicas
As operações são efetuadas sobre conjuntos de dados (tabelas), não sendo necessário (nem possível) manipular linha-a-linha
COMPONENTES DDL (Data Definition Language) - é uma linguagem de programação de computador utilizada para a definição de estrutura de dados, especialmente esquemas de Bancos de Dados.
DML (Data Manipulation Language) - é uma linguagem de programação de computador utilizada para a recuperação, remoção, inclusão e modificação de Bancos de Dados. O SQL é um exemplo não procedural (ex: SELECT, INSERT, DELETE e UPDATE).
TML/TCL (Transaction Manipulation Language) – é uma linguagem de programação que é um subconjunto da SQL. Ela controla processamento transacionais no Banco de Dados.
DCL (Data Control Language) – é uma linguagem de programação que é um subconjunto da SQL. Ela controla o acesso aos dados de um Banco de Dados.
21/06/16
11
SQL manipulação dos dados (DML)
SELECT è Acesso aos dados INSERT UPDATE è Manipulação dos dados DELETE
SELECT [ DISTINCT ] coluna, ... | * FROM tabela
• O símbolo * é utilizado quando se pretende selecionar todos os atributos da tabela especificada na clausula FROM.
• DISTINCT é aplicado a todas as colunas especificadas na clausula SELECT e elimina as repetições existentes.
SQL clausula SELECT e FROM
21/06/16
12
id nome data_admissao id_cat id_dept id_chefe
1 José da Silva 13/01/2005 3 3 1
2 Rui Barbosa 01/12/1991 1 3 1
3 Pedro Vaz de Caminha 04/06/1984 1 3 1
... ... ... ... ... ...
20 Maria de Lourdes de Souza 23/11/2000 2 2 2
... ... ... ... ... ...
SELECT nome FROM empregado
SQL projeção
EMPREGADO
SELECT * FROM categoria WHERE salario > 2000
SQL restrição
CATEGORIA
id cargo salario
1 Senior 5000
2 Pleno 3000
3 Junior 2000
... ... ...
21/06/16
13
id nome data_admissao id_cat id_dept id_chefe
1 José da Silva 13/01/2005 3 3 1
2 Rui Barbosa 01/12/1991 1 3 1
3 Pedro Vaz de Caminha 04/06/1984 1 3 1
... ... ... ... ... ...
20 Maria de Lourdes de Souza 23/11/2000 2 2 2
... ... ... ... ... ...
SELECT * FROM empregado, categoria WHERE empregado.id_cat = categoria.id
SQL juncão (produto cartesiano)
CATEGORIA id cargo salario
1 Senior 5000
2 Pleno 3000
3 Junior 2000
... ... ...
EMPREGADO
id nome data_admissao id_cat id_dept id_chefe
1 José da Silva 13/01/2005 3 3 1
2 Rui Barbosa 01/12/1991 1 3 1
3 Pedro Vaz de Caminha 04/06/1984 1 3 1
... ... ... ... ... ...
20 Maria de Lourdes de Souza 23/11/2000 2 2 2
... ... ... ... ... ...
SELECT * FROM empregado, categoria WHERE empregado.id_cat = categoria.id AND categoria.cargo = “Pleno”
SQL projeção, junção e restrição
CATEGORIA id cargo salario
1 Senior 5000
2 Pleno 3000
3 Junior 2000
... ... ...
EMPREGADO
21/06/16
14
SELECT * FROM empregado, categoria WHERE empregado.id_cat = categoria.id AND categoria.cargo = “Pleno”
SQL aliases de tabelas (apelido)
SELECT * FROM empregado e, categoria c WHERE e.id_cat = c.id AND c.cargo = “Pleno”
• Particularmente útil quando se pretende usar a mesma tabela com significados diferentes.
ANTES DEPOIS
EMPREGADO
CATEGORIA DEPARTAMENTO id nome localidade
1 Contabilidade Lisboa
2 Vendas Porto
3 Recursos Humanos Coimbra
... ... ...
id cargo salario
1 Senior 5000
2 Pleno 3000
3 Junior 2000
... ... ...
id nome data_admissao id_cat id_dept id_chefe
1 José da Silva 13/01/2005 3 3 1
2 Rui Barbosa 01/12/1991 1 3 1
3 Pedro Vaz de Caminha 04/06/1984 1 3 1
... ... ... ... ... ...
20 Maria de Lourdes de Souza 23/11/2000 2 2 2
... ... ... ... ... ...
SQL junções múltiplas
21/06/16
15
SELECT c.cargo, e.nome, c.salario, d.nome FROM empregado e, departamento d, categoria c WHERE e.id_dept = d.id AND e.id_cat = c.id
• Pergunta:
• Para cada categoria listar o nome dos empregados, salário e repectivo departamento
• Comando:
SQL junções múltiplas
SELECT e.id, e.nome, d.id, d.nome FROM empregado e RIGHT OUTER JOIN departamento d ON e.id_dept = d.id
• Pergunta:
• Quais os departamentos e respectivos empregados
• Comando:
SQL junções “outer” (Outer Join)
21/06/16
16
SQL união
• Suponha que com as seguintes tabelas:
• CLIENTE ( nome, municipio)
• FORNECEDOR ( nome, municipio)
• Deseja-se listar os nomes e municípios seja dos clientes, seja dos fornecedores
SELECT nome, municipio FROM cliente
UNION SELECT nome, municipio FROM fornecedor
SQL intersecção
• Suponha que com as seguintes tabelas:
• CLIENTE ( nome, municipio)
• FORNECEDOR ( nome, municipio)
• Deseja-se listar os nomes e municípios dos clientes que também são fornecedores
SELECT nome, municipio FROM cliente
INTERSECT SELECT nome, municipio FROM fornecedor
21/06/16
17
SQL diferença
• Suponha que com as seguintes tabelas:
• CLIENTE ( nome, municipio)
• FORNECEDOR ( nome, municipio)
• Deseja-se listar os nomes e municípios dos clientes que não são fornecedores
SELECT nome, municipio FROM cliente
EXCEPT SELECT nome, municipio FROM fornecedor
SQL a clausula WHERE
SELECT [ DISTINCT ] coluna, ...| * FROM tabela, [tabela,....] WHERE condição-de-pesquisa
• Uma condição-de-pesquisa é basicamente uma colecção de predicados, combinados através dos operadores booleanos AND, OR, NOT e parêntesis.
21/06/16
18
SQL predicados
• Um predicado de comparação (WHERE nome = ´Manuel Silva´)
• Um predicado de BETWEEN (WHERE id_cat BETWEEN 1 AND 5)
• Um predicado de LIKE (WHERE nome LIKE ' M%’)
• Um teste de valor nulo (WHERE cargo IS NULL)
• Um predicado de IN (WHERE id_cat IN (1,2))
Os predicados podem ser:
SQL predicados
• Os predicados podem ser utilizados num contexto estático, sendo avaliados com base em valores constantes.
Ex: WHERE id_cat IN (1,2)
• Podem também ser avaliados com base em valores dinâmicos, a retirar da base de dados
Ex: WHERE id_cat IN (SELECT id_cat FROM CATEGORIA)
SUBQUERY
21/06/16
19
SQL predicados utilizados em SUBQUERIES
Predicados de comparação
Predicado IN
Predicados ALL ou ANY
Predicado EXISTS
SELECT cod_emp, nome_emp FROM empregado WHERE id_dept = ( SELECT id_dept FROM empregado WHERE nome = 'Carlos Castro’)
SQL predicados utilizados em SUBQUERIES (exemplos)
SELECT id, nome FROM empregado WHERE id_dept = ( SELECT id_dept FROM empregado WHERE nome = 'Carlos Castro’)
Qual o código e nome dos empregados que trabalham no mesmo departamento que o empregado 'Carlos Castro'
21/06/16
20
SQL predicados utilizados em SUBQUERIES (exemplos)
Quais os nomes dos empregados que trabalham nos departamentos de Lisboa
SELECT id, nome FROM empregado
WHERE id_dept IN ( SELECT id FROM departamento WHERE localidade = 'Lisboa’ )
Quais os empregados cujo salário é superior a todos os salários dos empregados do
departamento 1
SELECT nome FROM empregado, categoria WHERE empregado.id_cat = categoria.id AND salario > ALL ( SELECT salario FROM empregado, categoria WHERE empregado.id_cat = categoria.id AND id_dept = 1 )
SQL predicados utilizados em SUBQUERIES (exemplos)
21/06/16
21
Quais os empregados cujo salário é superior a algum
dos salários dos empregados do departamento 1
SELECT nome FROM empregado, categoria WHERE empregado.id_cat = categoria.id AND salario > ANY ( SELECT salario FROM empregado, categoria WHERE empregado.id_cat = categoria.id AND id_dept = 1 )
SQL predicados utilizados em SUBQUERIES (exemplos)
A condição é VERDADEIRA se o resultado da subquery não for vazio
Nome dos departamentos que têm empregados (pelo menos um)
SELECT nome FROM departamento WHERE EXISTS (SELECT * FROM empregado WHERE departamento.id = empregado.id_dept )
SQL predicados utilizados em SUBQUERIES (exemplos)
21/06/16
22
A condição é VERDADEIRA se o resultado da subquery for vazio
Nome dos departamentos que não têm empregados
SELECT nome FROM departamento WHERE NOT EXISTS ( SELECT * FROM empregado WHERE departamento.id = empregado.id_dept )
SQL predicados utilizados em SUBQUERIES (exemplos)
SQL a clausula ORDER BY
A clausula ORDER BY é usada para ordenar os dados referentes a uma ou mais colunas.
É a última clausula a ser especificada
SELECT [ DISTINCT ] coluna, ... | * FROM tabela WHERE condição ORDER BY coluna [ASC | DESC ], …
21/06/16
23
SQL a clausula ORDER BY (exemplo)
SELECT * FROM empregado ORDER BY nome
Por padrão, os dados são ordenados ascendentemente.
Caracter (Char) Numérico (Number) Data (Date)
Z
A
9
0
Recentes
Menos Recentes
SQL funções agregadoras
SUM = �
COUNT(*) = 10
AVG = SUM / COUNT
MAX = ---------->
100 200 12,5 450 700 100 120 350 890 400
Salário
MIN = ---------->
1 2 3 4 5 6 7 8 9 10
21/06/16
24
SQL funções agregadoras (exemplos)
SELECT MAX(salario) FROM categoria
SELECT MIN(salario) FROM categoria
SELECT COUNT(*)
FROM categoria
SELECT SUM(salario)
FROM categoria, empregado
WHERE empregado.id_cat = categoria.id
SELECT AVG(salario)
FROM categoria, empregado WHERE empregado.id_cat = categoria.id
1 120 1 250 1 150 1 300 1 250 2 100 2 150 2 230 3 300 3 400 3 200 3 160
SQL funções agregadoras (exemplos)
id_dept e salario
Para cada departamento qual o
salário minímo
160
100
120
SELECT id_dept, MIN(salario) FROM empregado, categoria WHERE empregado.id_cat = categoria.id GROUP BY id_dept
21/06/16
25
1 A 120 1 A 250 1 B 150 1 B 300 1 B 250 2 A 100 2 B 150 2 B 230 3 B 300 3 B 400 3 C 200 3 C 160
SQL funções agregadoras (exemplos)
id_dept id salario
Para cada categoria de cada departamento qual
o salário minímo
160
100
120
SELECT e.id_dept, c.id, MIN(c.salario) FROM empregado e, categoria c WHERE e.id_cat = c.id GROUP BY e.id_dept, c.id
150
150
300
Qual o nome do empregado que tem o maior salário
SELECT empregado.id, nome FROM empregado, categoria WHERE empregado.id_cat = categoria.id AND salario = ( SELECT MAX(salario) FROM categoria, empregado WHERE empregado.id_cat = categoria.id )
SQL funções agregadoras (exemplos)
21/06/16
26
Para cada departamento qual o empregado que tem o maior salário
SELECT e.id_dept, e.id, e.nome FROM empregado e, categoria c WHERE e.id_cat = c.id
AND (id_dept, salario) IN ( SELECT id_dept, MAX(salario) FROM categoria c, empregado e WHERE e.id_cat = c.id GROUP BY e.id_dept)
SQL funções agregadoras (exemplos)
SQL a clausula HAVING
WHERE OU HAVING A cláusula WHERE nunca contém funções agregadoras
A cláusula HAVING deve sempre conter funções agregadoras
SELECT [ DISTINCT ] coluna, ... | * FROM tabela, ... WHERE condição GROUP BY coluna, ... HAVING condição
21/06/16
27
SQL a clausula HAVING (exemplos)
ID_DEPT SALARIO Para cada departamento. Qual o salário mínimo
Seleccionar apenas os departamentos cujo salário médio seja superior a 200
160
100
120
SELECT e.id_dept, MIN(c.salario) FROM empregado e, categoria c WHERE e.id_cat = c.id GROUP BY e.id_dept
HAVING AVG (c.salario) > 200
AVG = 214
AVG = 160
AVG = 265
1 120 1 250 1 150 1 300 1 250 2 100 2 150 2 230 3 300 3 400 3 200 3 160
SQL manipulação dos dados
INSERÇÕES, ATUALIZAÇÕES e REMOÇÕES
INSERT INTO tabela_nome [ (coluna, coluna, ....)] VALUES (valor, valor, ...) | comando SELECT
UPDATE tabela_nome SET lista_de_atribuições [WHERE condição]
DELETE FROM tabela_nome [WHERE condição]
21/06/16
28
SQL manipulação dos dados: Exemplo (INSERT)
INSERT INTO EMP_HIST (id, nome, data_admissao) SELECT id, nome, data_admissao
FROM empregado WHERE data_admissao > ‘01-01-1991'
Cópia de Valores de outras Tabelas
INSERT INTO departamento VALUES (4,’Logística',’Lisboa')
DEPARTAMENTO id nome localidade
1 Contabilidade Lisboa
2 Vendas Porto
3 Recursos Humanos Coimbra
... ... ...
DEPARTAMENTO id nome localidade
1 Contabilidade Lisboa
2 Vendas Porto
3 Recursos Humanos Coimbra
4 Logística Lisboa
... ... ...
SQL manipulação dos dados: Exemplo (UPDATE)
UPDATE empregado SET id_chefe = 2 WHERE nome = 'Bernardo Bento'
Atualizar o código do chefe do empregado Bernardo Bento
21/06/16
29
SQL manipulação dos dados: Exemplo (DELETE)
Apagar todos os empregados que trabalham no departamento 2
DELETE FROM empregado WHERE id_dept = 2
21/06/16
30
POSTGIS
O PostGIS é um projeto opensource para adicionar suporte a objetos geográficos ao banco de dados relacional PostgreSQL. De fato, o PostGIS “espacializa” os dados do servidor PostgreSQL, permitindo que ele seja usado como um banco de dados espacial para os sistemas de informação geográfica (SIG).
POSTGIS alguns operadores topológicos
ST_Distance(geometry, geometry) – retorna a distância cartesiana entre duas geometrias;
ST_DWithin(geometry, geometry, float) – retorna “verdadeiro” se as geometrias estão dentro da distância especifica em relação a outra geometria;
ST_Equals(geometry, geometry) – retorna “verdadeiro” se as geometrias forem espacialmente iguais;
ST_Disjoint(geometry, geometry) – retorna “verdadeiro” se as geometrias forem espacialmente separadas;
21/06/16
31
POSTGIS alguns operadores topológicos
ST_Intersects(geometry, geometry) – retorna “verdadeiro” se as geometrias espacialmente se intersectarem;
ST_Touches(geometry, geometry) – retorna “verdadeiro” se as geometrias espacialmente se tocam;
ST_Crosses(geometry, geometry) – retorna “verdadeiro” se as geometrias forem espacialmente se cruzam;
ST_Within(geometry A, geometry B) – retorna “verdadeiro” se a geometria A está espacialmente dentro da geometria B;
POSTGIS alguns operadores topológicos
ST_Overlaps(geometry, geometry) – retorna “verdadeiro” se as geometrias espacialmente se sobrepõem;
ST_Contains(geometry A, geometry B) – retorna “verdadeiro” se as geometria A espacialmente contem a geometria B;
ST_Covers(geometry A, geometry B) – retorna “verdadeiro” se nenhum ponto da geometria B está fora da geometria A;
ST_CoveredBy(geometry A, geometry B) – retorna “verdadeiro” se nenhum ponto da geometria A está fora da geometria B;
21/06/16
32
POSTGIS algumas funções de processamento
ST_Centroid(geometry) – retorna o centroide da geometria como um ponto;
ST_Area(geometry) – retorna a área de uma geometria do tipo poligono;
ST_Length(geometry) – retorna o comprimento de uma geometria do tipo linha considerando o sistema de referencia associado a geometria;
ST_Difference(geometry A, geometry B) – retorna a parte da geometria A que não interage com a geometria B;
ST_Union(geometry, geometry) – retorna uma geometria que representa o conjunto de pontos de das duas geometrias;
OPERAÇÕES
21/06/16
33
POSTGIS exemplo
POSTGIS exemplo
SELECT d2.nome_munic FROM municipios d1, municipios d2 WHERE ST_Touches(d1.the_geom, d2.the_geom)
AND (d2.nome_munic <> 'Congonhal') AND (d1.nome_munic = 'Congonhal');
21/06/16
34
POSTGIS exemplo SELECT m.nome_munic FROM municipios m, vias v WHERE ST_Intersects( ST_Buffer (v.the_geom, 1000), m.the_geom)
AND v.gid = 884;
POSTGIS exemplo
SELECT m1.nome_munic FROM municipios m1, municipios m2 WHERE (ST_Distance(ST_Centroid(m1.the_geom),
ST_Centroid(m2.the_geom) ) < 26000)
AND m1.nome_munic <> 'Estiva’ AND m2.nome_munic = 'Estiva' ORDER BY m1.nome_munic;