Programação SQL. INTRODUÇÃO II parte

Documentos relacionados
Programação SQL. Manipulação de Dados. DML Data Manipulation Language

SQL Linguagem de Manipulação de Dados. Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

SQL (Structured Querie Language) Escola Secundária de Emídio Navarro 2001/2002 Estruturas, Tratamento e Organização de Dados

1. Assinale as afirmações que são verdadeiras e as que são falsas, corrigindo-as:

Comandos de Manipulação

Tarefa Orientada 13 Agrupamento e sumário de dados

SQL UMA ABORDAGEM INTERESSANTE

Definida pelo American National Standard Institute (ANSI) em 1986

Tarefa Orientada 15 Manipulação de dados

Tarefa Orientada 14 Subconsultas

António Rocha Nuno Melo e Castro

Ex.: INSERT INTO tmpautor (CDAUTOR, NMAUTOR) VALUES (1, Renato Araújo )

Structured Query Language (SQL)

Tarefa Orientada 16 Vistas

IF685 Gerenciamento de Dados e Informação - Prof. Robson Fidalgo 1

Prof.: Clayton Maciel Costa

Sumário Introdução Breve História da Linguagem SQL l 0.3 Características da Linguagem SQL A Composição deste Livro 3

Bases de Dados 2005/2006. Aula 5

SQL TGD/JMB 1. Projecto de Bases de Dados. Linguagem SQL

SQL DML. Frederico D. Bortoloti

Programação SQL. Introdução

SQL (Structured Query Language)

Bases de Dados. DML Data Manipulation Language Parte 1

Tarefa Orientada 10 Obter informação a partir de uma tabela

Tarefa Orientada 12 Junção Externa, Auto-Junção e União

UNIVERSIDADE FEDERAL DE SANTA MARIA - UFSM COLÉGIO AGRÍCOLA DE FREDERICO WESTPHALEN BANCO DE DADOS II

Structured Query Language (SQL) SQL é uma linguagem normalizada (ANSI) para consultas e actualizações de bases de dados relacionais.

Linguagem de Consulta Estruturada SQL- DML

PROGRAMA. Aquisição dos conceitos teóricos mais importantes sobre bases de dados contextualizados à luz de exemplos da sua aplicação no mundo real.

PROGRAMA. Objectivos Gerais :

Álgebra Relacional. Conjunto de operações que usa uma ou duas relações como entrada e gera uma relação de saída. Operações básicas:

DESENVOLVIMENTO DE SOFTWARE

SQL Structured Query Language

DML - SELECT Agrupando Dados

Linguagem de Banco de Dados DML Exercícios

Princípio dos anos 70 IBM desenvolve a linguagem Sequel para o System R. Standards ISO e ANSI SQL-86, SQL-89, SQL-92, SQL:1999, SQL:2003

Os dados no MySQL são armazenado em tabelas. Uma tabela é uma colecção de informação relacionada e consiste em colunas e linhas.

Introdução às Bases de Dados

Banco de Dados. Prof. Antonio

Introdução à Banco de Dados. Nathalia Sautchuk Patrício

Banco de Dados. Marcio de Carvalho Victorino Exercícios SQL

Consultas SQL Parte II

Ex.: INSERT INTO tmpautor (CDAUTOR, NMAUTOR) VALUES (1, Renato Araújo )

Uma expressão básica em SQL consiste em três cláusulas: select, from e where.

Banco de Dados I Linguagem SQL Parte 2. Autor: Prof. Cláudio Baptista Adaptado por: Prof. Ricardo Antonello

NOME SEXO CPF NASCIMENTO SALARIO

Básico da Linguagem SQL. Definição de Esquemas em SQL. SQL(Structured Query Language)

BDII SQL Junção Revisão 8

Treinamento sobre SQL

SQL BANCO DE DADOS. Linguagem de consulta SQL. Linguagem de consulta SQL. Linguagem de Consulta Estruturada

Projeto de Banco de Dados

EXEMPLOS DE COMANDOS NO SQL SERVER

SQL. Prof. Márcio Bueno.

Tarefa Orientada 11 Junção Interna

3) Palavra-chave distinct (select-from). Obter apenas os pibs distintos entre si.

DESENVOLVIMENTO DE SOFTWARE

Memória de aula Semanas 15 e 16

ORACLE 11 G INTRODUÇÃO AO ORACLE, SQL,PL/SQL. Carga horária: 32 Horas

COMPETÊNCIAS ESPECÍFICAS Compreender e utilizar a linguagem SQL, na construção e manutenção de uma base de dados.

BASES DE DADOS I LTSI/2. Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2010/2011

Linguagem de Consulta Estruturada (SQL)

Pedro F. Carvalho OCP Oracle g LINGUAGEM SQL. São José do Rio Preto

Consultas (Queries) ou Interrogações

SQL. SQL (Structured Query Language) Comando CREATE TABLE. SQL é uma linguagem de consulta que possibilita:

1. SQL Instrumental Select Delete Update Insert Group by Having Unnion All...

SQL92 DDL( RIS, ACTUALIZAÇÕES E VISTAS) DML (QUERIES, SUBQUERIES,JUNÇÕES, E OPERAÇÕES SOBRE CONJUNTOS)

1.264 Aula 7. Introdução ao SQL

FEAP - Faculdade de Estudos Avançados do Pará PROFª LENA VEIGA PROJETOS DE BANCO DE DADOS UNIDADE V- SQL

f. Vocês podem selecionar todos os campos indicando-os, ou seja, sem usar * (boa prática) g. Muito relevante na manutenção de BD e de aplicações.

SQL é uma linguagem de consulta que implementa as operações da álgebra relacional de forma bem amigável.

Introdução ao SQL Avançado

LINGUAGEM SQL PARA CONSULTAS EM MICROSOFT ACCESS

Banco de Dados Oracle 10g: Introdução à Linguagem SQL

Linguagem de Consulta - SQL

EXERCÍCIOS PRÁTICOS. Banco de Dados

Exercícios de Lógica Exercícios de Fixação 08

Principais Instruções em SQL. Contidas nesta apostila as principais instruções em SQL para a manutenção em Bancos de Dados.

O que são Bancos de Dados?

Banco de dados 1. Linguagem DML SQL Select Avançado. Professor: Victor Hugo L. Lopes

Junções e Índices em Tabelas

Sistemas de Bases de Dados Relacionais Introdução ao SQL. Interrogações diversas sobre a Base de Dados Northwind

BANCO DE DADOS -INTRODUÇÃO AO SQL. Prof. Angelo Augusto Frozza, M.Sc.

Query SQL (Structured Query Language)

LINGUAGEM SQL. DML - Linguagem de Manipulação de Dados

SQL BÁSICO. Introdução. Prof. Suelane Garcia. Linguagem SQL (Structured Query Language)

Principais Instruções em SQL

SQL comando SELECT. SELECT [DISTINCT] <campos> FROM <tabela> [condição] [ ; ] Paulo Damico - MDK Informática Ltda.

Tarefa Orientada 19 Triggers

ANÁLISE E PROJETO DE BANCO DE DADOS

Linguagem SQL Sub-linguagem DDL

Principais Comandos SQL Usados no MySql

MODELO DE DADOS VS ESQUEMA

S Q L 31/03/2010. SQL - Structured Query Language Linguagem de Consulta Estruturada

Projeto e Implementação

4.6. SQL - Structured Query Language

LINGUAGEM SQL. SQL Server 2008 Comandos iniciais

Memória de aula Aulas 11 e 12

Exemplo Clínica. Exemplo Clínica. Exemplo Clínica. Exemplo Clínica. (

Microsoft Access. No Access, existem vários tipos de objectos: Tabelas. Consultas. Formulários Relatórios Macros Módulos

Operação de União JOIN

Transcrição:

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.