Linguagem SQL ENG1518 Sistemas de Informação Gerenciais Prof. Marcos Villas villas@puc-rio.br
SQL Linguagem padrão de acesso tabelas em um banco de dados relacional Permite definir e manipular dados DML Linguagem de Manipulação de Dados SELECT, INSERT, UPDATE, DELETE DDL Linguagem de Definição de Dados CREATE TABLE, ALTER TABLE, CREATE INDEX,...
SQL Básico
Select Forma Básica: SELECT nome das colunas desejadas FROM lista de tabelas WHERE condições
Select Exemplo: SELECT placa, modelo, ano FROM carro WHERE marca = 'Saipa' AND ano > 2015 Carro (placa, marca, modelo, ano, valor)
Select Exemplo: SELECT * FROM carro WHERE marca = 'Saipa' AND ano > 2015 Carro (placa, marca, modelo, ano, valor)
Select SELECT [ distinct ] [ * / expr 1, expr 2,... ] onde as expressões expr i (i = 1, 2, ) podem ser: coluna tabela.coluna expressão (, +, -, *, / ) função literal
Select Exemplo: SELECT COUNT(*) FROM carro WHERE marca = 'Saipa' AND ano > 2015 Carro (placa, marca, modelo, ano, valor)
Select Exemplos: SELECT marca FROM carro SELECT DISTINCT (marca) FROM carro Carro (placa, marca, modelo, ano, valor)
From A cláusula FROM tem a seguinte forma: FROM tabela1 ( alias 1 ) [, tabela2 ( alias 2 ),... ] alias designa o sinônimo da tabela correspondente. se mais de uma tabela é especificada, será feito o produto cartesiano das mesmas. um alias só pode ser usado uma vez.
Select Exemplo: SELECT c.placa, c.modelo, c.marca FROM carro c WHERE c.valor > 10000 Carro (placa, marca, modelo, ano, valor)
Where Define uma condição de pesquisa através dos operadores lógicos AND, OR e NOT. WHERE [ NOT] predicado 1 { AND OR } [ NOT] predicado 2... Cada predicado especifica uma condição que pode ser verdadeira ou valsa Ordem de avaliação dos predicados: condições entre parênteses not and or
Predicado Predicado básico: xpressão 1 oper { expressão 2 / subselect } oper pode ser: =, >, <, >=, <=, <> BETWEEN V 1 AND V 2 IN (V 1, V 2, V 3 )
Select Exemplo: SELECT MAX(valor) FROM carro WHERE marca = 'Saipa' AND ano IN (2013, 2015, 2017) AND valor BETWEEN 5000 AND 7000 Carro (placa, marca, modelo, ano, valor)
Exercícios Funcionário (matrícula, nome, UFnascimento, CV) Projeto (código, título, CNPJcliente) Trabalha (@matrícula, @código, datainício) Gerencia (@matrícula, @código, datainício) a) Matrícula dos funcionários nascidos no Acre b) CNPJs dos clientes que têm projeto (sem repetições) c) Todas as colunas de Trabalha onde o código de projeto é 123
Junção Retorna colunas procedentes de várias tabelas em um único SELECT. Especificado na cláusula FROM do SELECT.
Ilustrando Junção SELECT * FROM tab1, tab2 WHERE tab1.col x = tab2.col y (a) (b) (c) (d) tab1 150 200 250 350 col x (e) (f) (g) (h) (i) (j) tab2 110 120 140 150 350 450 (a+h) (d+i) resultado 150 150 350 350 col y
Exercícios Funcionário (matrícula, nome, UFnascimento, CV) Projeto (código, título, CNPJcliente) Trabalha (@matrícula, @código, datainício) Gerencia (@matrícula, @código, datainício) a) Matrícula e nome dos funcionários que trabalham no projeto de código 123 b) Código e título dos projetos onde trabalham funcionários nascidos no Acre
Like Procura por um certo padrão (pattern) de caracteres. O padrão é caracterizado por: ocorrência de caracteres alfanuméricos. caracteres especiais % ou _. O caractere porcento substitui de 0 a muitos caracteres alfanuméricos O caractere underscore substitui um número exato de caracteres alfanuméricos
Order by Ordena logicamente as linhas da tabela resultado. A ordenação pode ser obtida por um sort interno ou pelo uso de um índice adequado. A performance do sort interno depende do número de linhas, da quantidade e do tamanho das colunas referenciadas no ORDER BY.
Exercícios Funcionário (matrícula, nome, UFnascimento, CV) Projeto (código, título, CNPJcliente) Trabalha (@matrícula, @código, datainício) Gerencia (@matrícula, @código, datainício) a) Nomes de funcionário que tenham o texto mestrado em seu CV; os nomes devem ser apresentados em ordem crescente.
União Gera uma tabela resultado combinando duas outras tabelas resultado. Cada comando select é processado separadamente, produzindo uma tabela resultado; No final elas serão combinadas em uma única tabela resultado.
Ilustrando União tab1 resultado tab2 select * from tab1 UNION [ ALL ] select * from tab2
Interseção select * from tab1 INTERSECT select * from tab2 tab1 tab2
Diferença Relacional select * from tab1 EXCEPT select * from tab2 tab1 tab2
Exercícios Funcionário (matrícula, nome, UFnascimento, CV) Projeto (código, título, CNPJcliente) Trabalha (@matrícula, @código, datainício) Gerencia (@matrícula, @código, datainício) a) Matrícula dos funcionários que trabalham e gerenciam projetos.
Funções de cálculo COUNT (*) - conta total de tuplas MAX(x) - valor máximo de uma coluna MIN (x) - valor mínimo de uma coluna AVG (x) - valor médio de uma coluna SUM (x) - somatório dos valores de uma coluna
Group By & Having GROUP BY aglutina logicamente várias linhas em grupos baseado no valor de uma ou mais colunas especificadas HAVING impõe condições às linhas agrupadas só há Having se houver Group By é análogo às condições impostas às tuplas das tabelas na cláusula From especificadas na cláusula Where
Group by / Having tabela1 110 10 100 abc 110 120 120 130 20 null xyz 120 2000 1500 100 200 200 ijk ijk spdf col1 col2 col3 col4 select col1, min(col2), avg(col3), max(col4) from tabela1 group by col1 110 10 100 xyz 120 120 150 ijk 130 1500 200 spdf
Exercícios Funcionário (matrícula, nome, UFnascimento, CV) Projeto (código, título, CNPJcliente) Trabalha (@matrícula, @código, datainício) Gerencia (@matrícula, @código, datainício) a) Quantidade de projetos por cliente b) Quantidade de funcionários que trabalham por projeto, apenas para os projetos com mais de 10 funcionários
Insert Adiciona uma ou várias linhas a uma tabela do banco de dados. Cada comando atualiza uma única tabela.
Update Atualiza uma ou várias linhas de uma tabela do banco de dados. Cada comando atualiza uma única tabela.
Delete Exclui uma ou várias linhas/tuplas de uma tabela do banco de dados. Cada comando atualiza uma única tabela.
SQL Avançado
Padrão ANSI atual: SQL:2016 Padrões anteriores: SQL-86 SQL-89 SQL-92... SQL A cada novo padrão foram adicionadas novas funcionalidades a linguagem, tais como: triggers stored procedures queries recursivas
JOINS Formalizados no SQL-92 Inner Join Outer Join LEFT OUTER JOIN RIGHT OUTER JOIN FULL OUTER JOIN Cross Join Natural Join Column name Join
Inner Join O inner join de duas ou mais tabelas pode ser explicitado da seguinte forma: from tabela1 INNER JOIN tabela2 Utilizando o INNER JOIN, devemos colocar os predicados de join em uma cláusula ON select nome_empregado, nome_departamento from empregado a inner join departamento b on a. cod_dept = b. cod_dept where...
Inner Join O INNER JOIN de duas tabelas traz somente as linhas que possuem correspondentes nas duas tabelas: select nome_empregado, nome_dependente from empregado a, dependente b where a. matricula = b. matricula select nome_empregado, nome_dependente from empregado a inner join dependente b on a. matricula = b. matricula
Inner Join Utilizando a esta sintaxe, separamos os predicados locais dos predicados de join: predicados locais: predicados de join: cláusula Where cláusula ON A sintaxe fica mais complexa em joins com mais de duas tabelas: select a. nome, a. matricula, b. cargo, c. nome_dept from empregado a inner join cargo b inner join departamento c on a. cod_cargo = b. cod_cargo on a. cod_dept = c. cod_dept
Outer Join A cláusula FROM tem a seguinte forma: FROM tabela1 [ LEFT / RIGHT / FULL ] OUTER JOIN tabela2 Utilizando o OUTER JOIN, devemos colocar os predicados de join em uma cláusula ON.
Ilustrando OUTER JOIN SELECT * FROM tab1 LEFT OUTER JOIN tab2 ON tab1.col x = tab2.col y ORDER BY tab1.col x (a) (b) (c) (d) tab1 150 200 250 350 tab2 (e) (f) (g) (h) (i) (j) 110 120 140 150 350 450 col x col y (a+h) (b) (c) (d+i) 150 150 200 350 350 250 150 350
Left Outer Join O Left Outer Join traz linhas da tabela especificada à esquerda, mesmo que não existam linhas correspondentes na tabela da direita. Quando não há correspondência, as colunas procedentes da tabela da direita são preenchidas com nulos. select matricula, nome, nome_dependente from empregado a left outer join dependente b on a. matricula = b. matricula where...
Right Outer Join O Right Outer Join traz linhas da tabela especificada à direita, mesmo que não existam linhas correspondentes na tabela da esquerda. Quando não há correspondência, as colunas procedentes da tabela da esquerda são preenchidas com nulos. b select matricula, nome, nome_departamento from empregado a right outer join departamento on a. cod_dept = b. cod_dept where...
Full Outer Join O Full Outer Join traz linhas de qualquer uma das duas tabelas, mesmo quando elas não possuem correspondentes na outra tabela. As colunas sem correspondência são preenchidas com nulos. select matricula, nome, nome_departamento from empregado a full outer join departamento b on a. cod_dept = b. cod_dept where...
Subqueries Comandos select na cláusula select ou having de outro comando sql. Podem ser: correlacionados: o query interno faz referência à coluna(s) do query externo ( outer ). não correlacionados: não há referências entre os queries interno e externo
Subqueries correlacionados select matricula, nome from empregado t1 where exists ( select * from dependentes t2 where t2. matricula = t1. matricula ) select matricula, nome from empregado t1 where not exists ( select * from dependentes t2 where t2. matricula = t1. matricula )
Subqueries não correlacionados select matricula, nome, salario from empregado where salario > ( select avg ( salario ) from empregado ) order by 3 desc select cod_dept, nome_dept from departamento where cod_dept in ( select cod_dept from empregado group by cod_dept having count (*) < 5 )