INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA SUL DE MINAS GERAIS Câmpus Inconfidentes STRUCTURED QUERY LANGUAGE () Sistemas de Informações Geográficas O QUE É É 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. 1
EXEMPLO Interatividade EXEMPLO Embutida em Linguagens de Programação 2
HISTÓRIA 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 que fica conhecida como -86 (ANSI X3.135-1986 e ISO 9075:1987) HISTÓRIA 1989: É ratificada a norma -89 quer pela ANSI quer pela ISO 1992: É ratificada a norma: 2 1999: É ratificada a norma 1999, anteriormente conhecida como 3 2006: :2006, define a forma como o pode ser usado em conjunção com o XML (ANSI/ISO/IEC 9075-14:2006 ) 3
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) 4
5
6
7
ESTRUTURA BÁSICA DO é baseada em operações de conjuntos e de álgebra relacional com algumas modificações e extensões Uma consulta básica tem a forma: SELECT A 1, A 2, A 3,..., A n FROM T 1, T 2,..., T n WHERE P 1 AND P 2 OR P 3 ; A n representam os Atributos das Tabelas T n e P n os Predicados de seleção. ESQUEMA RELACIONAL EMPREGADO ( id, nome, data_admissao, id_cat, id_dept, id_chefe ) DEPARTAMENTO ( id, nome, localizacao) CATEGORIA ( id, cargo, salario ) 8
BASE DE DADOS RELACIONAL CATEGORIA id cargo salario 1 Senior 5000 2 Pleno 3000 3 Junior 2000......... DEPARTAMENTO id nome localidade 1 Contabilidade Lisboa 2 Vendas Porto 3 Recursos Humanos Coimbra......... EMPREGADO 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.................. A PERGUNTA Qual o salário do empregado Rui Barbosa e o nome do departamento onde ele trabalha O COMANDO 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 9
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 é 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. Ela controla processamento transacionais no Banco de Dados. DCL (Data Control Language) é uma linguagem de programação que é um subconjunto da. Ela controla o acesso aos dados de um Banco de Dados. 10
manipulação dos dados (DML) SELECT è Acesso aos dados INSERT UPDATE è Manipulação dos dados DELETE clausula SELECT e FROM 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. 11
projeção 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 nome empregado restrição CATEGORIA id cargo salario 1 Senior 5000 2 Pleno 3000 3 Junior 2000......... SELECT * FROM categoria WHERE salario > 2000 12
juncão (produto cartesiano) 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.................. CATEGORIA id cargo salario 1 Senior 5000 2 Pleno 3000 3 Junior 2000......... SELECT * FROM empregado, categoria WHERE empregado.id_cat = categoria.id projeção, junção e restrição 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.................. CATEGORIA id cargo salario 1 Senior 5000 2 Pleno 3000 3 Junior 2000......... SELECT * FROM empregado, categoria WHERE empregado.id_cat = categoria.id AND categoria.cargo = Pleno 13
aliases de tabelas (apelido) SELECT * FROM empregado, categoria WHERE empregado.id_cat = categoria.id AND categoria.cargo = Pleno ANTES SELECT * FROM empregado e, categoria c WHERE e.id_cat = c.id AND c.cargo = Pleno DEPOIS Particularmente útil quando se pretende usar a mesma tabela com significados diferentes. junções múltiplas CATEGORIA id cargo salario 1 Senior 5000 2 Pleno 3000 3 Junior 2000......... DEPARTAMENTO id nome localidade 1 Contabilidade Lisboa 2 Vendas Porto 3 Recursos Humanos Coimbra......... 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.................. 14
junções múltiplas Pergunta: Para cada categoria listar o nome dos empregados, salário e repectivo departamento Comando: 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 junções outer (Outer Join) Pergunta: Quais os departamentos e respectivos empregados Comando: SELECT e.id, e.nome, d.id, d.nome FROM empregado e RIGHT OUTER JOIN departamento d ON e.id_dept = d.id 15
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 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 16
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 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. 17
predicados Os predicados podem ser: 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)) 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 18
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 ) predicados utilizados em SUBQUERIES (exemplos) Qual o código e nome dos empregados que trabalham no mesmo departamento que o empregado 'Carlos Castro' SELECT id, nome FROM empregado WHERE id_dept = ( SELECT id_dept FROM empregado WHERE nome = 'Carlos Castro ) 19
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 ) predicados utilizados em SUBQUERIES (exemplos) 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 ) 20
predicados utilizados em SUBQUERIES (exemplos) 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 ) predicados utilizados em SUBQUERIES (exemplos) 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 ) A condição é VERDADEIRA se o resultado da subquery não for vazio 21
predicados utilizados em SUBQUERIES (exemplos) 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 ) A condição é VERDADEIRA se o resultado da subquery for vazio 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 ], 22
a clausula ORDER BY (exemplo) SELECT * FROM empregado ORDER BY nome Por padrão, os dados são ordenados ascendentemente. Z 9 Recentes A 0 Menos Recentes Caracter (Char) Numérico (Number) Data (Date) funções agregadoras 1 2 MIN = ----------> 3 4 5 6 7 8 MAX = ----------> 9 10 Salário 100 200 12,5 450 700 100 120 350 890 400 SUM = COUNT(*) = 10 AVG = SUM / COUNT 23
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 funções agregadoras (exemplos) id_dept e salario 1 120 1 250 1 150 1 300 1 250 2 100 2 150 2 230 3 300 3 400 3 200 3 160 120 100 160 Para cada departamento qual o salário minímo SELECT id_dept, MIN(salario) FROM empregado, categoria WHERE empregado.id_cat = categoria.id GROUP BY id_dept 24
funções agregadoras (exemplos) id_dept id salario 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 120 150 100 150 300 160 Para cada categoria de cada departamento qual o salário minímo 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 funções agregadoras (exemplos) 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 ) 25
funções agregadoras (exemplos) 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) a clausula HAVING SELECT [ DISTINCT ] coluna,... * FROM tabela,... WHERE condição GROUP BY coluna,... HAVING condição WHERE OU HAVING A cláusula WHERE nunca contém funções agregadoras A cláusula HAVING deve sempre conter funções agregadoras 26
a clausula HAVING (exemplos) ID_DEPT SALARIO 1 120 1 250 1 150 1 300 1 250 2 100 2 150 2 230 3 300 3 400 3 200 3 160 AVG = 214 120 AVG = 160 100 AVG = 265 160 Para cada departamento. Qual o salário mínimo Seleccionar apenas os departamentos cujo salário médio seja superior a 200 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 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] 27
manipulação dos dados: Exemplo (INSERT) DEPARTAMENTO id nome localidade 1 Contabilidade Lisboa 2 Vendas Porto 3 Recursos Humanos Coimbra......... INSERT INTO departamento VALUES (4, Logística', Lisboa') Cópia de Valores de outras Tabelas INSERT INTO EMP_HIST (id, nome, data_admissao) SELECT id, nome, data_admissao FROM empregado DEPARTAMENTO WHERE data_admissao > 01-01-1991' id nome localidade 1 Contabilidade Lisboa 2 Vendas Porto 3 Recursos Humanos Coimbra 4 Logística Lisboa......... manipulação dos dados: Exemplo (UPDATE) Atualizar o código do chefe do empregado Bernardo Bento UPDATE empregado SET id_chefe = 2 WHERE nome = 'Bernardo Bento' 28
manipulação dos dados: Exemplo (DELETE) Apagar todos os empregados que trabalham no departamento 2 DELETE FROM empregado WHERE id_dept = 2 29
POSTGIS O PostGIS é um projeto opensource para adicionar suporte a objetos geográficos ao banco de dados relacional Postgre. De fato, o PostGIS espacializa os dados do servidor Postgre, 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; 30
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; 31
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 32
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'); 33
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; 34
DÚVIDAS e-mail: luciano.barbosa@ifsuldeminas.edu.br Fonte: BOLSTAD (2012). 35