T301B S Q L. Structure Query Language. Luis Fernando Calábria Erick Franklin Leonardo Bandeira



Documentos relacionados
1. Domínio dos Atributos

Structured Query Language (SQL)

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

Comandos de Manipulação

NOME SEXO CPF NASCIMENTO SALARIO

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

Tarefa Orientada 13 Agrupamento e sumário de dados

SQL UMA ABORDAGEM INTERESSANTE

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

Orientação a Objetos

Prof.: Clayton Maciel Costa

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

SQL. Autor: Renata Viegas

O que são Bancos de Dados?

BDII SQL Junção Revisão 8

Introdução ao SQL. O que é SQL?

Linguagem de Consulta Estruturada SQL- DML

Tarefa Orientada 16 Vistas

Introdução ao SQL Avançado

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

SQL Structured Query Language

SQL DML. Frederico D. Bortoloti

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

A linguagem SQL

Disciplina: Unidade III: Prof.: Período:

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

Banco de Dados. Prof. Antonio

Lição 1 - Criação de campos calculados em consultas

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

APOSTILA BANCO DE DADOS INTRODUÇÃO A LINGUAGEM SQL

Treinamento sobre SQL

PHP INTEGRAÇÃO COM MYSQL PARTE 1

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

EXERCÍCIOS PRÁTICOS. Banco de Dados

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

UNIVERSIDADE VEIGA DE ALMEIDA CURSO DE BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO CURSO SUPERIOR DE TECNOLOGIA EM PROCESSAMENTO DE DADOS BANCO DE DADOS

Programação SQL. Introdução

Á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:

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

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

4.6. SQL - Structured Query Language

Faculdade Pitágoras 16/08/2011. Curso Superior de Tecnologia: Banco de Dados Sistemas para Internet

Tarefa Orientada 14 Subconsultas

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

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

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

Faculdade Pitágoras. Curso Superior de Tecnologia: Banco de Dados. Disciplina: Banco de Dados Prof.: Fernando Hadad Zaidan SQL

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

Comandos DDL. id_modulo = id_m odulo

Prof. Carlos Majer Aplicações Corporativas UNICID

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

Principais Comandos SQL Usados no MySql

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

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

Aula 4 Pseudocódigo Tipos de Dados, Expressões e Variáveis

Banco de Dados. Um momento crucial na organização dos dados é a forma com que cadastramos estes dados, a estrutura de armazenamento que criamos.

Introdução à Engenharia da Computação. Banco de Dados Professor Machado

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE ESCOLA AGRÍCOLA DE JUNDIAÍ EAJ - PRONATEC / REDE etec MÓDULO III DESENVOLVIMENTO PROFESSOR ADDSON COSTA

Microsoft Access XP Módulo Um

SQL. Jacir de Oliveira, José Alencar Philereno. Faculdade de Informática de Taquara. Igrejinha - RS Brazil

02 - Usando o SiteMaster - Informações importantes

Principais Instruções em SQL

AULA 2 INTERAÇÃO COM O BANCO DE DADOS

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

Modelo de Dados Relacional Restrições de um Banco de Dados Relacional

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

2. OPERADORES ALGORITMOS, FLUXOGRAMAS E PROGRAMAS FUNÇÕES... 10

Banco de Dados BrOffice Base

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

Excel Planilhas Eletrônicas

SQL. Prof. Márcio Bueno.

MODELO DE DADOS VS ESQUEMA

DML - SELECT Agrupando Dados

Aula 01 - Formatações prontas e condicionais. Aula 01 - Formatações prontas e condicionais. Sumário. Formatar como Tabela

Linguagem de Consulta Estruturada (SQL)

Noções Básicas de Excel página 1 de 19

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

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

Tarefa Orientada 15 Manipulação de dados

Descrição Tinyint[(M)] Inteiro pequeno. Varia de 128 até +127

Operação de União JOIN

Banco de Dados I. Aula 12 - Prof. Bruno Moreno 04/10/2011

Roteiro 9 - SQL Básico: chave estrangeira, operadores de comparação e operadores booleanos

Questão Essência do Excel

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

Upload e Download de Arquivos. Ao programador Morfik, cabe implementar em sua aplicação os mecanismos gerenciem todo o processo acima.

ADMINISTRAÇÃO DE BANCO DE DADOS

Arquitetura de Rede de Computadores

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.

Consultas SQL Parte II

2. ENTRADA DE DADOS 2.1. TEXTOS

Lidar com números e estatísticas não é fácil. Reunir esses números numa apresentação pode ser ainda mais complicado.

TUTORIAL DO ACCESS PASSO A PASSO. I. Criar um Novo Banco de Dados. Passos: 1. Abrir o Access 2. Clicar em Criar um novo arquivo

Bem-vindo ao tópico sobre consultas no SAP Business One.

Como funciona? SUMÁRIO

2. Representação Numérica

Programação WEB II. PHP e Banco de Dados. progweb2@thiagomiranda.net. Thiago Miranda dos Santos Souza

AULA 6 INTEGRIDADOS DOS DADOS - CRIANDO RESTRIÇÕES

Introdução aos critérios de consulta. Um critério é semelhante a uma fórmula é uma cadeia de caracteres que pode consistir em

Transcrição:

T301B S Q L Structure Query Language Luis Fernando Calábria Erick Franklin Leonardo Bandeira

Sumário 1. INTRODUÇÃO 3 1.1. SOBRE SQL 3 1.2. VISÃO GERAL DE UM BANCO DE DADOS RELACIONAL 3 1.3. COLUNAS E LINHAS 4 1.4. ENTIDADES E CHAVE PRIMÁRIA 4 1.5. CHAVE PRIMÁRIA COMPOSTA 5 2. A LINGUAGEM SQL 6 2.1. CRIANDO UMA TABELA 6 2.2. IDENTIFICADORES E ATRIBUTOS 7 2.3. TIPOS DE DADOS 7 2.3.1. DADOS CARACTERES STRINGS 7 2.3.2. DADOS NUMÉRICOS 7 2.3.3. DADOS DATA E HORA 8 2.4. INCLUINDO DADOS 8 3. QUERIES: OBTENDO OS DADOS DESEJADOS 9 3.1. CLÁUSULAS SELECT E FROM 9 3.2. CLÁUSULA WHERE 10 3.2.1. PREDICADOS RELACIONAIS 11 3.2.2. OUTROS PREDICADOS RELACIONAIS 11 3.2.3. VINCULANDO VÁRIOS PREDICADOS: AND E OR 13 4. QUERIES: MANIPULANDO DADOS 14 4.1. OPERADORES ARITMÉTICOS 14 4.2. FUNÇÕES 15 4.2.1. FUNÇÕES AGREGADAS 15 4.2.2. FUNÇÕES NÃO AGREGADAS 15 4.2.3. FUNÇÕES DE SEQÜÊNCIAS DE CARACTERES 16 4.2.4. FUNÇÕES DE DATA E HORA 16 5. ORGANIZANDO O RESULTADO 17 5.1. CLÁUSULA GROUP BY 17 5.2. CLÁUSULA HAVING 17 5.3. CLÁUSULA ORDER BY 18 6. JUNÇÕES: QUERIES QUE ENVOLVEM MAIS DE UMA TABELA 19 6.1. EQUIJUNÇÕES 20 6.2. JUNÇÕES EXTERNAS 21 6.3. AUTO-JUNÇÕES 21 6.4. OUTROS TIPOS DE JUNÇÕES 23 7. QUERIES EM OUTRAS DECLARAÇÕES 23 7.1. DECLARAÇÃO UNION 23 7.2. UTILIZANDO QUERIES PARA INCLUIR DADOS 23 Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 1

8. ALTERANDO TABELAS E DADOS 24 8.1. ALTERANDO OS DADOS 24 8.1.1. ATUALIZANDO DADOS EM UMA LINHA 24 8.1.2. ELIMINANDO LINHAS 25 8.1.3. GRAVANDO E DESFAZENDO ALTERAÇÕES 25 8.2. ALTERANDO UMA TABELA 25 8.2.1. ELIMINANDO UMA COLUNA 26 8.2.2. INCLUINDO UMA COLUNA 26 8.2.3. MODIFICANDO UMA COLUNA 27 8.2.4. TROCANDO O DE UMA TABELA OU COLUNA 27 8.2.5. ELIMINANDO UMA TABELA 27 9. UTILIZANDO ÍNDICE PARA MELHORAR A PERFORMANCE 28 9.1. UTILIZANDO UM ÍNDICE 28 9.2. UTILIZANDO UM ÍNDICE ÚNICO 28 9.3. UTILIZANDO UM ÍNDICE CONCATENADO 29 9.4. APAGANDO UM ÍNDICE 29 10. PROGRAMANDO EM SQL 30 10.1. PORQUE SQL EMBUTIDA 30 10.2. UTILIZANDO A FERRAMENTA ACCESS 30 Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 2

1.Introdução 1.1. Sobre SQL Um banco de dados é como um arquivo eletrônico, ou seja, tem a mesma função que qualquer outro arquivo armazenar registros. A única diferença é que no banco de dados os registros são armazenados eletronicamente. Para termos acesso aos registros armazenados ou mesmo cadastrar novos registros, precisamos de um sistema que gerencie o banco de dados. Este sistema gerenciador de banco de dados é que torna possíveis as operações com o conteúdo do arquivo, como Traga-me este arquivo, Atualize este registro. Existem vários tipos de sistemas de gerenciamento de banco de dados (SGBD ou DBMS), representando diversas abordagens relativas às tarefas de acesso às informações contidas no banco de dados, preservação da integridade dos dados, acompanhamento dos usuários e manutenção da segurança. Para o nosso estudo, porém, podemos classificar todos os sistemas em dois tipos: relacionais e não relacionais, embora seja visível o predomínio da abordagem relacional nos novos sistemas do mercado. Em um sistema relacional, os dados são armazenados e representados exclusivamente em tabelas. Em nenhum momento faz-se necessário recorrer a outras estruturas, como árvores hierárquicas, para ter acesso aos dados. A linguagem SQL o nome é a sigla de Structured Query Language (Linguagem de Query Estruturada) é uma linguagem para gerenciar um sistema de banco de dados relacional. Não só é uma linguagem, como também tem sido tão utilizada que pode ser considerada um padrão. Consiste de uma série de declarações, adotadas de comum acordo, que nos permitem realizar diversas operações. Temos que usar a expressão comum acordo porque, embora uma SQL padrão tenha sido criada pelo Instituto de Padrões Nacionais Americanos (ANSI), todas as implementações particulares da SQL personalizam a linguagem de várias formas. Tais implementações complementam a linguagem padrão com novos tipos de declarações ou expressões e muitas vezes adaptam as declarações padronizadas às necessidades específicas. 1.2. Visão Geral de um Banco de Dados Relacional Sistemas relacionais caracterizam um grande avanço no armazenamento e no gerenciamento de grandes quantidades de dados. A principal razão para isso é que, em um sistema relacional, pode-se reduzir bastante o armazenamento de dados redundantes. Na verdade, idealmente falando, em um sistema projetado segundo os princípios teóricos da abordagem relacional, a redundância não deve existir. Nenhum relacionamento entre dois itens de dados (uma pessoa possui um endereço, por exemplo) deve aparecer mais de uma vez em cada um banco de dados. Na prática, os sistemas apenas se aproximam deste ideal, por várias razões, e podemos dizer que normalmente contêm alguns dados repetidos em vários lugares. Mas mesmo em um sistema relacional que apenas se aproxime da situação ideal, minimizar a redundância dos dados acarreta dois benefícios básicos: em primeiro lugar, os dados podem ser reorganizados e combinados de forma mais facilmente em novos relacionamentos; não ficam presos aos relacionamentos em que foram armazenados. Em segundo lugar, a atualização torna-se muito mais fácil, pois poucos itens de dados têm que ser atualizados, o que reduz a incidência de erros. Todos os dados de um sistema relacional são armazenados e exibidos em tabelas. Programas de planilhas e sistemas de banco de dados não relacionais também usam tabelas, portanto não é uma característica exclusiva dos sistemas relacionais. Mas há algo que distingue a forma como os sistemas relacionais usam tabelas. Esta distinção deriva-se da definição e da utilização do banco de dados segundo certos princípios teóricos da abordagem relacional. Mais adiante iremos abordar tais princípios. Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 3

1.3. Colunas e Linhas Qualquer informação refere-se a qualquer coisa, e talvez o primeiro princípio da abordagem relacional seja o de todas as informações contidas em uma tabela devem estar sempre relacionadas a exemplos de um tipo de coisa. Este princípio destingue o uso relacional de tabelas. Por exemplo, a tabela HOSPEDES abaixo contém informações sobre os sócios de um clube de tratamento da forma física, selecionado, conceituado e imaginário chamado Visual Spa (fig. 1.1). Fig. 1.1 - HOSPEDES SEXO BIOTIPO ALTURA JOSÉ AUGUSTO M M 1,67 MAURÍCIO DE SOUZA M M 1,72 BIANCA OLIVEIRA F G 1,65 JANE FYUNDAI F G 1,80 STELLA SHIELDS F M 1,65 ROGÉRIO NUNES M M 1,78 A tabela possui quatro colunas, SEXO, BIOTIPO e ALTURA e 6 linhas. Contém informações sobre os hóspedes do Spa; cada coluna vertical possui dados referentes a uma característica ou atributo dos hóspedes. Os atributos em que estamos interessados são nome, sexo, biotipo e altura de cada hóspede; por isso destinamos uma coluna a cada um deles. Esta é a função das colunas verticais de uma tabela: conter informações sobre os atributos das entidades a que se refere a tabela. Cada linha horizontal da tabela HOSPEDE contém as informações sobre todos os atributos referentes a um determinado hóspede. Portanto, enquanto a coluna exibe os nomes de todos os hóspedes da tabela e a coluna SEXO o sexo de todos os hóspedes e assim por diante em relação às outras colunas, a linha em que aparece o nome José Augusto contém informações apenas referentes aos atributos do hóspede chamado José Augusto. Mais adiante introduziremos um novo conceito relacional: o de chave primária. 1.4. Entidades e Chave Primária No mundo real, você teria inúmeras razões para querer tratar cada hóspede do Visual Spa individualmente: se você não considerá-los separadamente, não poderá designar os quartos adequadamente, elaborar os programas de emagrecimento segundo as necessidades de cada um, preparar as faturas corretamente, e assim por diante. Pelas mesmas razões, você terá que ter os hóspedes também individualizados no banco de dados. Em termos práticos, isto significa que as linhas da tabela devem ser diferenciadas. Se você não puder diferenciar a linha de José Augusto da de Maurício de Souza, o banco de dados não lhe dará condições para designar os quartos adequadamente, elaborar os programas de emagrecimento segundo as necessidades de cada um, preparar as faturas corretamente, e assim por diante. Para que uma linha possa se distinguir das outras, tem que ser de alguma forma diferente, ou seja, tem que ter uma característica que a identifique. Em um sistema relacional, esta característica identificadora não pode ser identificador externo, como a posição que a linha ocupa em relação às outras; tem que ser um dos próprios componentes da linha. Como a linha só consiste de itens de dados, temos que tentar localizar dentre os dados da linha aquele que poderá identificá-la univocamente. Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 4

Em outras palavras, temos que procurar por uma coluna (ou grupo de colunas) que apresente um conteúdo diferente em cada linha dados que são duplicados em duas linhas. Esta característica então servirá para identificar a linha da mesma forma que usamos um nome para identificar uma pessoa. Volte à tabela HÓSPEDE (fig. 1.1). Observe que nem todos os atributos, ou colunas, são igualmente suficientes para identificar as linhas. Por exemplo, não basta saber apenas o sexo de um hóspede que você queira identificar se este atributo é compartilhado por metade dos seus hóspedes. Da mesma forma, se soubermos o biotipo de um hóspede teremos um grupo mais reduzido mas não conseguiremos localizar um hóspede em particular. O problema é que as colunas SEXO e BIOTIPO contêm valores duplicados. Quando duas linhas contêm o mesmo atributo, este atributo não pode ser usado para distinguir as linhas entre si. Concluindo, a única coluna que pode servir de atributo identificador é a coluna. Como não contém valores duplicados, as informações nela contidas são por si só suficientes para distinguir a linha de um hóspede na tabela. Descrevemos, na realidade, uma diferença entre os dois tipos de colunas. O primeiro tipo está baseado em um atributo que identifique univocamente ou defina uma linha. O segundo tipo baseia-se em atributos descritivos que fornecem informações, mas não são suficientes para identificar uma linha ou entidade. A coluna (ou grupo de colunas) baseada em um atributo identificador de uma linha é chamada de Chave ou Chave Primária. A chave de uma tabela lhe permite identificar as linhas individualmente, definindo também as entidades às quais a tabela se refere. Um banco de dados relacional todas as tabelas tem que ter uma chave primária que identifique cada linha. 1.5. Chave Primária Composta A chave primária pode consistir de mais de uma coluna, as vezes não podemos distinguir as linhas uma das outras usando apenas uma coluna, mais sim mais de uma. O exemplo a seguir lista o nome de todos os hóspedes que chegaram ou saíram no período entre 01 e 27/08/97; a data de chegada de cada hóspede, a data de saída se houver, o quarto e o técnico de cada hóspede e por último o desconto se houver. Fig. 1.2 LISTA DE HÓSPEDES QUARTO TÉCNICO CHEGADA SAÍDA DESCTO JANE FYUNDAI 4 JÚLIO 15-08-1997 17-08-1997 0.20 MARCELO FREITAS 2 BRUNA 26-08-1997 0.10 ALEXANDRE GOMES 1 RICARDO 14-08-1997 16-08-1997 JOSÉ AUGUSTO 3 JÚLIO 15-08-1997 19-08-1997 MAURÍCIO DE SOUZA 5 RICARDO 25-08-1997 0.15 BIANCA OLIVEIRA 6 BRUNA 15-08-1997 20-08-1997 0.05 JANE FYUNDAI 7 SERENA 24-08-1997 STELLA SHIELDS 8 SERENA 25-08-1997 0.15 ALEXANDRE GOMES 9 BRUNA 17-08-1997 23-08-1997 0.20 Nenhuma das colunas por si só poderá funcionar como chave primária, pois todas elas possuem valores duplicados, inclusive : Alexandre Gomes e Jane Fyundai estiveram hospedados duas vezes e por isso aparecem duas vezes na lista. Para estabelecermos uma chave para esta tabela, teremos que usar duas ou mais colunas conjuntamente. Este tipo de chave, envolvendo duas ou mais colunas, denomina-se chave composta ou chave primária composta. No exemplo (Fig. 1.2) as colunas que melhor se candidatam a formar chave composta são e CHEGADA. O e a CHEGADA combinados lhe permite distinguir uma linha da outra, ou seja, não há linhas com os valores de e CHEGADA iguais. Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 5

2.A Linguagem SQL SQL é uma linguagem própria para a realização de operações relacionais. Em linhas gerais, é uma linguagem para gerenciar um sistema relacional. Através das declarações SQL, dados são recuperados, atualizados ou eliminados, colunas são alteradas, tabelas são criadas e eliminadas, e qualquer outras modificações são efetuadas na estrutura de um banco de dados. As declarações em SQL podem ser subdivididas em quatro categorias: queries, definição de dados, manipulação de dados e controle de dados. 2.1. Criando uma Tabela Usamos a declaração CREATE TABLE para criar uma tabela. As declarações abaixo criam as duas tabelas que já vimos anteriormente HÓSPEDES e LISTA DE HÓSPEDES. A tabela HÓSPEDES contém os dados de todos os hóspedes do Visual Spa, passados e atuais. A tabela LISTA DE HÓSPEDES registra as datas de entrada e saída, quartos ocupados, etc., de todas as pessoas que se hospedaram no spa no período de 01 e 27/08/1997. Observe que as declarações a seguir apenas criam as tabelas. Preenchê-las com dados constitui uma outra operação, que veremos posteriormente. CREATE TABLE HOSPEDES ( VARCHAR(25) NOT NULL, SEXO VARCHAR(1), BIOTIPO VARCHAR(1), ALTURA DECIMAL(3,2)); CREATE TABLE LISTA_DE_HOSPEDES ( VARCHAR(25) NOT NULL, QUARTO VARCHAR(3), TECNICO VARCHAR(8), CHEGADA DATE NOT NULL, SAIDA DATE, DESCONTO DECIMAL(2,2); As tabelas HOSPEDES e LISTA_DE_HOSPEDES já existem, embora vazias. A tabela HOSPEDES consiste das quatro colunas, SEXO, BIOTIPO e ALTURA; a LISTA_DE_HOSPEDES consiste das seis colunas, QUARTO, TECNICO, CHEGADA, SAIDA e DESCONTO. Observe que ambas das declarações CREATE TABLE terminam com um ponto e vírgula (;). Este é o sinal de que a declaração terminou. Embora esta não seja propriamente uma característica da SQL, todas as implementações interativas da SQL exigem um sinal indicativo de final de declaração. Algumas interfaces interativas, oferecem duas formas de marcar o término de uma declaração. A primeira e colocar um ponto e vírgula seguido de um retorno <ENTER> no final da última linha da declaração; a segunda e colocar na linha seguinte à última linha da declaração uma barra (/) e um retorno <ENTER> como mostramos nos exemplos abaixo: SELECT, ALTURA FROM HOSPEDES; ou SELECT, ALTURA FROM HOSPEDES / Ambos os métodos são muito usados, nesta apostila terminamos as declarações normalmente com o ponto e vírgula. Não existe regra quanto ao número de linhas de uma declaração SQL. Poderíamos ter escrito a declaração toda em uma linha só, o que ocuparia menos espaço. O ponto e vírgula ou a barra é obrigatório somente no final da última linha da declaração. Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 6

2.2. Identificadores e Atributos Observe os dois traços sublinhados ( ) ligando as três palavras que compões o nome da tabela LISTA_DE_HOSPEDES. O traço sublinhado é um meio convencional para representar o espaço nos nomes de tabelas ou colunas que contêm mais de uma palavra. Ele têm por finalidade ligar uma palavra à outra, fazendo com que formem apenas um conjunto de caracteres, podendo se reconhecidas portanto como partes integrantes de um único nome. 2.3. Tipos de Dados A SQL padrão da ANSI reconhece dois tipos genéricos de dados seqüências ( strings ) de caracteres de dados numéricos, e oferece vários tipos particulares com diferentes características para atender às necessidades de cada coluna. Estes incluem CHAR (ou CHARACTER), para seqüências de caracteres, e os tipos NUMERIC, DECIMAL, INTEGER, SMALLINT, FLOAT, REAL, DOUBLE PRECISION, para dados numéricos. Existem diversos tipos de dados implementados para duas outras categorias de dados. Uma delas abrange os dados tipo data e hora, representados em SQL Base pelos tipos DATE, TIME, TIMESTAMP; a outra é o tipo de dado LONG VARCHAR ou LONG, tipo genérico que pode armazenar qualquer categoria de dados, inclusive dados binários. Em SQL Base, os dados do tipo LONG podem ter um tamanho virtual qualquer (bilhões de bytes); em outras implementações, o limite normalmente é de 64 Kbytes. 2.3.1. Dados Caracteres Strings O tipo CHAR armazena seqüências de caracteres de tamanho fixo que consistem de letras, caracteres especiais ou dígitos, e cujo tamanho não pode ultrapassar 254 bytes. O tamanho máximo (até 255 caracteres) a ser aceito em uma coluna deve ser definido quando, ao criá-la, especificamos o atributo de tamanho. Todos os dados desta coluna são armazenados com o tamanho indicado quando da sua definição. Em SQL padrão, quando um dado possui um tamanho menor ao especificado para a coluna, espaços em branco são acrescentados à direita. Em SQL Base, estes dados podem definidos como CHAR ou VARCHAR. 2.3.2. Dados Numéricos O tipo NUMBER armazena números de 1.0E-100 a 1.0E+100, com, no máximo, 22 dígitos decimais de precisão. As colunas deste tipo não possuem indicações de precisão e escala em suas definições. O tipo DECIMAL armazena números de 1.0E-100 a 1.0E+100, com no máximo 22 dígitos decimais de precisão, mas, ao contrário do tipo NUMBER, as colunas DECIMAL têm que ter indicações de precisão e escala em suas definições. O tipo INTEGER armazena um número com até dez dígitos de precisão. Não são aceitos dígitos fracionários; os algarismos à direita do ponto decimal são truncados. O tipo SMALLINT armazena um número com até cinco dígitos de precisão. Da mesma forma que o tipo INTEGER, não são aceitos dígitos fracionários, os quais são truncados. O tipo FLOAT armazena um número decimal de ponto flutuante de dupla precisão ou precisão simples, dependendo da especificação de tamanho. Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 7

2.3.3. Dados Data e Hora O tipo DATE armazena datas, que podem ser codificadas e exibidas em diversos formatos. O tipo TIME armazena horas, registrando até os microssegundos, sendo que podem também ser codificados e exibidas em diversos formatos. O tipo TIMESTAMP é usado em colunas criadas para armazenar data e hora ao mesmo tempo. Este tipo é uma combinação dos formatos DATE e TIME, sendo que os dados contêm ambos os componentes data e hora. Veja na tabela seguinte os formatos de datas convencionais mais importantes: Tabela Formatos de Datas Nome Formato Exemplo Organizações de Padrões Intern. aaaa-mm-dd 1998-10-30 Padrão IBM EUA (USA) mm/dd/aaaa 10/30/1998 Padrão IBM Europa (EUR) dd.mm.aaaa 30.10.1998 Padrão Industrial Japonês (JIS) aaaa-mm-dd 1998-10-30 Veja na tabela seguinte os formatos de datas convencionais mais importantes: Tabela Formatos de Horas Nome Formato Exemplo Organizações de Padrões Intern. hh.mm.ss 14.30.02 Padrão IBM EUA (USA) hh:mm AM ou PM 2:30 PM Padrão IBM Europa (EUR) hh.mm.ss 14.30.02 Padrão Industrial Japonês (JIS) hh:mm:ss 14:30:02 2.4. Incluindo Dados A declaração CREATE TABLE mostrada no início apenas criou as tabelas HOSPEDES e LISTA_DE_HOSPEDES, sem preenchê-las com dados. Para incluir dados nas tabelas, usamos uma outra declaração ou comando. Na linguagem SQL a única forma de incluir dados é através da declaração INSERT, que normalmente inclui uma única linha de cada vez. Só pode ser utilizada para incluir várias linhas se nela for inserida uma query que recupere de outra tabela os dados a serem incluídos. A declaração SQL abaixo ilustra a inclusão de uma única linha de dados na tabela LISTA_DE_HOSPEDES. A linha consiste de seis itens de dados, separados por vírgulas um item para cada uma das seis colunas da tabela LISTA_DE_HOSPEDES. O primeiro item de dados é incluído na primeira coluna da tabela, o segundo item na segunda coluna, e assim por diante, como se segue: INSERT INTO LISTA_DE_HOSPEDES (, QUARTO, TECNICO, CHEGADA, SAIDA, DESCONTO) VALUES ( CLOVIS ALMEIDA, 3, JULIO, 13-08-1997, 17-08-1997,.2; Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 8

Como estamos incluindo dados em todas as colunas da tabela LISTA_DE_HOSPEDES, poderíamos omitir a lista dos nomes das colunas após o nome da tabela. Esta lista só é indispensável caso estejamos incluindo dados em apenas algumas colunas e não em todas; temos então que indicar os nomes das colunas que receberão dados. Nomeamos todas as colunas neste exemplo simplesmente para facilitar análise da declaração. Observe que os dados referentes às colunas, QUARTO e TECNICO estão entre apóstrofes ( ). Isto se deve ao fato de que os dados das três colunas são do tipo VARCHAR. Dados CHAR ou VARCHAR usados em declarações SQL devem aparecer entre apóstrofes. 3.Queries: Obtendo os Dados Desejados A query é o meio através do qual podemos pesquisar e obter dados das tabelas de um banco de dados. A seguir abordamos os seus elementos básicos, inclusive as duas cláusulas essenciais obrigatórias em todas as queries e uma terceira que contém a especificação das linhas em que estão os dados desejados. 3.1. Cláusulas SELECT e FROM Por mais básica que seja, uma query tem que ter pelo menos dois componentes uma cláusula SELECT e uma cláusula FROM. Em uma query simples, a cláusula SELECT enumera os nomes das colunas que contêm os dados desejados, e a FROM especifica as tabelas em que estão localizadas as colunas. A query mais simples possível seleciona todos os dados de todas as colunas da tabela. Entretanto, podemos restringir a cláusula SELECT de modo que se obtenha dados de apenas algumas colunas, ou, de outras formas, acrescentando qualificações. Podemos citar na cláusula SELECT colunas de mais de uma tabela, além de especificar várias operações a serem executadas sobre os dados e exibir os resultados das mesmas. O resultado da query é exibido em forma de tabela e é, às vezes, chamado de tabela resultado. As linhas do resultado representam os dados que atendem às condições estabelecidas ou são o produto das operações especificadas na query. Se não houver dados em nenhuma destas situações, não serão selecionadas linhas. Analisemos um exemplo de uma query e seu resultado. SELECT, QUARTO, TECNICO, CHEGADA, SAIDA, DESCONTO ; QUARTO TÉCNICO CHEGADA SAÍDA DESCTO JANE FYUNDAI 3 JÚLIO 15-08-1997 17-08-1997 0.20 MARCELO FREITAS 2 BRUNA 26-08-1997 0.10 JANE FYUNDAI 4 SERENA 24-08-1997 ALEXANDRE GOMES 1 RICARDO 14-08-1997 16-08-1997 JOSÉ AUGUSTO 7 JÚLIO 15-08-1997 19-08-1997 MAURÍCIO DE SOUZA 5 RICARDO 25-08-1997 0.15 BIANCA OLIVEIRA 6 BRUNA 15-08-1997 20-08-1997 0.05 STELLA SHIELDS 8 SERENA 25-08-1997 0.15 ALEXANDRE GOMES 9 BRUNA 17-08-1997 23-08-1997 0.20 A query acima solicita todas as linhas de dados para todas as colunas da tabela LISTA_DE_HOSPEDES. Não acrescentamos qualificações, e, portanto, o resultado contém todos os dados destas colunas. Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 9

Incidentemente, podemos usar um asterisco (*) em vez de nomes de colunas na cláusula SELECT. O asterisco representa os valores de todas as colunas. Usar o asterisco é o mesmo que nomear todas as colunas de uma tabela ou mais tabelas, na sua ordem original. Portanto, ao invés de digitar todos os nomes de colunas como fizemos no exemplo anterior, poderíamos ter obtido o mesmo resultado codificando a query assim: SELECT * ; Podemos selecionar de apenas algumas colunas e omitir outras. A query a seguir obtém os dados somente da coluna : SELECT ; Podemos evitar que dados sejam exibidos duplicados, usando a palavra-chave DISTINCT imediatamente após a palavra SELECT na cláusula SELECT para suprimir as linhas duplicadas do resultado. No exemplo abaixo a palavra-chave DISTINCT foi acrescentada na query anterior: SELECT DISTINCT ; A palavra-chave DISTINCT suprime apenas as linhas duplicadas do resultado, e não valores duplicados. 3.2. Cláusula WHERE A cláusula WHERE reduz o escopo da query focalizando apenas determinadas linhas. Ao invés de retornar os valores das expressões da cláusula SELECT de todas as linhas, uma query com uma cláusula WHERE retorna apenas os valores das linhas que atendam às condições especificadas na cláusula WHERE. Em outras palavras, uma query contendo a cláusula WHERE tem essencialmente o seguinte formato: SELECT o valor das expressões FROM estas tabelas somente nas linhas WHERE estas condições foram atendidas. As condições da cláusula WHERE são chamadas de condições de pesquisa. O exemplo abaixo seleciona dados das colunas e TECNICO da tabela LISTA_DE_HOSPEDES somente nas linhas em que o técnico for a Bruna. Em outras palavras, a query lista os nomes (e técnicos) de todas as pessoas cujo o técnico seja a Bruna: SELECT, TECNICO WHERE TECNICO = BRUNA ; MARCELO FREITAS BIANCA OLIVEIRA ALEXANDRE GOMES TÉCNICO BRUNA BRUNA BRUNA Não é obrigatório citar na cláusula WHERE somente colunas que apareçam na cláusula SELECT. A query anterior funcionaria da mesma forma se eliminássemos a coluna TECNICO da cláusula SELECT. SELECT WHERE TECNICO = BRUNA ; Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 10

MARCELO FREITAS BIANCA OLIVEIRA ALEXANDRE GOMES 3.2.1. Predicados Relacionais No exemplo anterior, TECNICO = BRUNA é um predicado relacional. O sinal de igualdade (=) é um operador relacional simples. Existem nove operadores relacionais simples, que podem formar nove tipos de predicados relacionais simples para expressar condições de pesquisa. Existem ainda cinco outros tipos de predicados relacionais. Discutiremos todos os tipos existentes nos próximos tópicos. Predicados Relacionais Simples A query utilizada no último exemplo foi: SELECT WHERE TECNICO = BRUNA ; Como já foi dito, a query contém um operador relacional simples, o sinal de igualdade. Seu significado seria traduzido assim: SELECT o valor de e TECNICO FROM tabela LISTA_DE_HOSPEDES somente nas linhas WHERE o valor de TECNICO seja igual a BRUNA ; Os operadores relacionais simples são os nove abaixo: = igual a > maior que!< não menor que!= não igual a!> não maior que >= maior ou igual a <> não igual a < menor que <= menor ou igual a 3.2.2. Outros Predicados Relacionais Além dos operadores já discutidos, há outros cinco que também podem ser usados para formar predicados relacionais. São eles: BETWEEN...AND IS NULL LIKE IN O operador BETWEEN especifica os dados compreendidos em uma determinada faixa. Pode ser usado tanto com números quanto com datas. Por exemplo, poderíamos obter os nomes e os percentuais de desconto de todos os hóspedes que tenham recebido de 10 a 20 por cento inclusive, como se segue: SELECT, DESCONTO WHERE DESCONTO BETWEEN.10 AND.20; DESCTO JANE FYUNDAI 0.20 MARCELO FREITAS 0.10 MAURÍCIO DE SOUZA 0.15 STELLA SHIELDS 0.15 ALEXANDRE GOMES 0.20 Podemos solicitar também os nomes e as datas de saída de todos os hóspedes que saíram do Spa entre 19 e 24 de agosto: Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 11

SELECT, SAIDA WHERE SAIDA BETWEEN 19-08-1997 AND 24-08-1997; SAIDA JOSE AUGUSTO 19-08-1997 BIANCA OLIVEIRA 20-08-1997 ALEXANDRE GOMES 23-08-1997 O operador IS NULL nos permite selecionar as linhas em que o valor de um determinado campo seja desconhecido. Por exemplo, as linhas de vários hóspedes ficaram com a SAIDA em branco. Podemos selecionar os nomes destes hóspedes utilizando o operador IS NULL. SELECT, SAIDA WHERE SAIDA IS NULL; MARCELO FREITAS JANE FYUNDAI STELLA SHIELDS SAIDA O operador LIKE nos permite utilizar caracteres máscara para comparar dados em uma condição de pesquisa. Em vez de os dados terem que ser idênticos, podemos especificar que sejam apenas semelhantes em algum aspecto. Podemos usar os dois caracteres máscara abaixo com o operador LIKE: _ (sublinhado) Vale por qualquer caractere único * (asterisco) Vale por qualquer seqüência de caracteres No contexto de um LIKE, o caractere de sublinhado ( _ ) funciona analogamente ao ponto de interrogação (?) do MS-DOS, que serve de caractere máscara em nomes de arquivos, e o símbolo de percentual (%) funciona analogamente ao asterisco (*). O exemplo de query abaixo usa o operador LIKE e um caractere máscara para selecionar todos os nomes que comecem com a seqüência de caracteres MA% ; SELECT WHERE LIKE MA% ; MARCELO FREITAS MAURICIO DE SOUZA A próxima query seleciona todos os nomes que tenham a letra J na primeira posição e N na quarta, não importando quais sejam os outros caracteres. SELECT WHERE LIKE J N ; JANE FYUNDAI Mais um exemplo: SELECT WHERE LIKE _AR_E% ; Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 12

MARCELO FREITAS O último operador a ser discutido neste tópico é o IN, que nos permite selecionar dados que se encaixem em um conjunto ou uma lista de valores. Os valores podem ser indicados explicitamente em uma declaração, como nos exemplos a seguir. A query abaixo seleciona o nome, o técnico e o quarto de cada hóspede cujo o técnico esteja presente na lista BRUNA, JULIO : SELECT, TECNICO, QUARTO WHERE TECNICO IN ( BRUNA, JULIO ); TÉCNICO QUARTO JANE FYUNDAI JÚLIO 3 MARCELO FREITAS BRUNA 2 JOSÉ AUGUSTO JÚLIO 4 BIANCA OLIVEIRA BRUNA 6 ALEXANDRE GOMES BRUNA 9 Todos os operadores relacionais também podem ser utilizados com o NOT. Na query abaixo, selecionamos o nome, o técnico e o quarto dos hóspedes cujo o técnico não esteja incluído na lista: SELECT, TECNICO, QUARTO WHERE TECNICO NOT IN ( BRUNA, JULIO ); QUARTO TÉCNICO ALEXANDRE GOMES 1 RICARDO MAURÍCIO DE SOUZA 5 RICARDO JANE FYUNDAI 7 SERENA STELLA SHIELDS 8 SERENA 3.2.3. Vinculando Vários Predicados: AND e OR Podemos restringir ainda mais a seleção de linhas usando uma cláusula WHERE com mais de uma condição de pesquisa. Isto se faz possível através dos operadores AND e OR. Na query abaixo, selecionamos o nome, o técnico e o desconto dos hóspedes que ainda estão no Spa e cujo o técnico seja Serena: SELECT, TECNICO, DESCONTO WHERE SAIDA IS NULL AND TECNICO = SERENA TÉCNICO DESCTO JANE FYUNDAI SERENA STELLA SHIELDS SERENA 0.15 Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 13

Podemos acrescentar inúmeras condições à cláusula WHERE usando os operadores AND e OR. A próxima query acrescenta vários componentes: SELECT, QUARTO, TECNICO, CHEGADA, SAIDA WHERE SAIDA IS NULL AND TECNICO = ROBERTO AND QUARTO > 16 AND CHEGADA < 20-08-97; 4.Queries: Manipulando Dados A linguagem SQL não nos limita a selecionar os dados exatamente na forma que aparecem nas tabelas. Como mencionamos anteriormente, podemos usar queries também para selecionar os resultados de operações realizadas sobre os dados. Neste tópico, descrevemos três elementos que viabilizam as operações realizadas sobre os dados em uma query. São eles: Operador aritmético; Funções agregadas; Funções não agregadas. Em cada caso, o operador ou função é usado com constantes, nomes de colunas e assim por diante para formar uma expressão nova. 4.1. Operadores Aritméticos São quatro os operadores aritméticos que podem formar expressões: + adição - subtração * multiplicação / divisão A query abaixo, usamos o operador de soma para adicionar 0.05 (uma constante) ao valor corrente de DESCONTO na linha de Marcelo Freitas. A cláusula SELECT contém duas expressões: e a expressão formada pelo operador aritmético, DESCONTO + 0.05. A tabela resultado deverá conter duas colunas, uma para cada expressão: SELECT, DESCONTO + 0.05 WHERE = MARCELO FREITAS DESCTO MARCELO FREITAS 0.15 Embora as regras variem de implementação para implementação, algumas permitem ainda o uso de operadores aritméticos com dados do tipo data e hora. Em SQL Base, por exemplo, a query abaixo pode ser usada para determinar por quantos dias ficaram no Spa os hóspedes que já foram embora. Este número é obtido subtraindo-se a data de chegada de saída. Outras implementações permitem queries semelhantes, mas não idênticas. SELECT, SAIDA - CHEGADA WHERE = MARCELO FREITAS Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 14

4.2. Funções As funções constituem mais uma forma de usar queries para manipular os dados das tabelas. Uma função retorna o valor resultante de uma determinada operação realizada sobre o seu argumento (ou argumentos). Uma função, como o seu argumento, representa um valor e é portanto uma expressão. 4.2.1. Funções Agregadas A característica marcante das funções agregadas é que produzem um único valor a partir de uma coluna inteira de dados. Portanto, enquanto qualquer outro tipo de expressão retorna um valor para cada linha, as funções agregadas retornam um valor que representa um agregado dos valores referentes às várias linhas. Por esta razão, são também chamadas de funções de colunas. Existem cinco funções agregadas. São elas: AVG(argumento) MAX(argumento) MIN(argumento) SUM(argumento) COUNT(argumento) Retorna a média dos valores do argumento Retorna o maior valor do argumento Retorna o menor valor do argumento Retorna o somatório dos valores do argumento Retorna a número de linhas do argumento As funções agregadas normalmente usam como argumento um nome de coluna ou uma expressão que tenha um nome de coluna como componente, mas podemos usá-las com qualquer expressão numérica ou de datas. A query a seguir lê todos os valores da coluna DESCONTO e fornece os percentuais médio, máximo e mínimo de desconto oferecidos aos hóspedes do Visual Spa. Como as função AVG, MÁX, MIN e SUM ignoram valores nulos, o valor AVG (média) é realmente o desconto médio apenas daqueles hóspedes que obtiveram algum desconto: SELECT AVG(DESCONTO), MAX(DESCONTO), MIN(DESCONTO) ; AVG(DESCONTO) MAX(DESCONTO) MIN(DESCONTO) 0.115635 0.20 0.05 Outros exemplos: SELECT MIN(DESCONTO) * AVG(SAIDA-CHEGADA) WHERE TECNICO = SENERA ; 4.2.2. Funções Não Agregadas As funções não agregadas diferem das agregadas pelo fato de que não fornecem um único valor a partir de uma coluna inteira de dados. Em vez disto, as funções não agregadas, como todas as expressões que já discutimos (exceto as funções agregadas), retornam um valor para cada linha. Em SQL Base, as funções agregadas começam sempre com o caractere @, mas esta convenção só pertence ao SQL Base. Nos outros aspectos, a sintaxe das funções não agregadas é igual a das agregadas: a função é seguida de seu argumento entre parênteses, por exemplo, @PROPER( JOSE AUGUSTO ). Da mesma forma que as funções agregadas, as não agregadas podem ser usadas uma dentro da outra, de modo que o resultado da função interna seja usado como argumento da externa. Por exemplo, na função: @PROPER(@LEFT( JOSE AUGUSTO, 4)) @LEFT retorna os cinco primeiros caracteres da seqüência JOSE AUGUSTO ( JOSE ), os quais compões o argumento da função @PROPER. Esta função coloca apenas a primeira letra de cada palavra de seu argumento em letra maiúscula e as restantes em letra minúscula, como na representação de nomes próprios. Neste caso, @PROPER converte JOSE em Jose. Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 15

4.2.3. Funções de Seqüências de Caracteres Como as funções não agregadas variam muito de implementação para implementação, esta apostila não se dispões a examiná-las detalhadamente. Apresentamos neste próximo tópico apenas alguns exemplos representativos oferecidos pelo SQL Base. O exemplo abaixo usa a função @LENGTH (seqüência de caracteres). Colocamos a expressão seqüência de caracteres entre parênteses para indicar que esta função utiliza seqüências de caracteres como argumentos. Ela retorna o número de caracteres existentes no argumento. Neste caso, usamos a função para informar o número de caracteres de cada da tabela LISTA_DE_HOSPEDES: SELECT, @LENGTH() ; @LENGTH () JANE FYUNDAI 12 MARCELO FREITAS 15 JOSÉ AUGUSTO 12 BIANCA OLIVEIRA 15 ALEXANDRE GOMES 15 SELECT, @PROPER(@LENGTH(,5)) ; JANE FYUNDAI MARCELO FREITAS JOSÉ AUGUSTO BIANCA OLIVEIRA ALEXANDRE GOMES @PROPER(@LENGTH (,5)) jane marce josé bianc alexan 4.2.4. Funções de Data e Hora São funções que retornam informações sobre uma coluna de dados do tipo data ou hora ou geram resultados do tipo data ou hora. A função de data @DAY(data), por exemplo, seleciona apenas o dia do mês da DATA: SELECT, CHEGADA, @DAY(CHEGADA) ; CHEGADA @DAY(CHEGADA) JANE FYUNDAI 15-08-1997 15 MARCELO FREITAS 26-08-1997 26 ALEXANDRE GOMES 14-08-1997 14 JOSÉ AUGUSTO 15-08-1997 15 Queries semelhantes podem ser criadas com as funções @MONTH, @YEAR, @HOUR, @MINUTE e @SECOND. Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 16

5.Organizando o Resultado 5.1. Cláusula GROUP BY A cláusula GROUP BY reúne diferentes linhas do resultado de uma query em conjuntos de acordo com as colunas nela mencionadas, chamadas colunas formadoras de grupos. As linhas são agrupadas de duas formas, ou em dois aspectos. A query abaixo exemplifica a primeira forma, na qual todas as linhas que contêm o mesmo valor na primeira coluna especificada são exibidas em grupos no resultado. Neste caso, a primeira coluna formadora de grupo é TECNICO. Todas as linhas que tenham o mesmo valor na coluna TECNICO aparecerão juntas no resultado: SELECT TECNICO, GROUP BY TECNICO, ; TÉCNICO BRUNA BRUNA BRUNA JÚLIO JÚLIO RICARDO RICARDO SERENA SERENA MARCELO FREITAS BIANCA OLIVEIRA ALEXANDRE GOMES JANE FYUNDAI JOSÉ AUGUSTO ALEXANDRE GOMES MAURÍCIO DE SOUZA JANE FYUNDAI STELLA SHIELDS Se houvesse linhas em que a coluna TECNICO estivesse em branco, ou seja, com um valor nulo para TECNICO, também seriam agrupadas. E as linhas são agrupadas da mesma maneira para cada coluna formadora de grupos subseqüente, embora isto não esteja aparente no exemplo dados pois só contém duas colunas. Obs.: As funções agregadas AVG, SUM, MAX, MIN e COUNT não podem ser usadas em cláusulas GROUP BY pois geram um único valor e por isso não podem agrupar linhas. A cláusula GROUP BY também pode ser usada em queries contendo uma cláusula WHERE. Neste caso, a GROUP BY é codificada depois da cláusula WHERE. Por exemplo, a query abaixo exibe os nomes dos hóspedes que chegaram depois do dia 15 de agosto por técnico: SELECT TECNICO, WHERE CHEGADA > 15-08-97 GROUP BY TECNICO, ; 5.2. Cláusula HAVING A cláusula HAVING nos permite estreitar a área de atuação da cláusula GROUP BY da mesma forma que a cláusula WHERE estreita a área de atuação da cláusula SELECT, ou seja, através de uma condição de pesquisa. Ao contrário da cláusula WHERE, no entanto, a cláusula HAVING pode conter funções agregadas. Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 17

Uma nova tabela, HOSPEDES_PS, será usada nos exemplos deste tópico. Criamos uma tabela com a declaração CREATE TABLE abaixo. Esta tabela se destina a registrar as pesagens periódicas dos hóspedes do Visual Spa. CREATE TABLE HOSPEDE_PS (HOSPEDE VARCHAR(25) NOT FULL, PESO DECIMAL(4,1), QUANDO DATE); Chamamos a coluna DATE de QUANDO porque DATE é uma palavra reservada. As palavras reservadas não podem ser usadas como nomes de colunas ou outros identificadores, a não ser que entre aspas. Após a inclusão dos dados, a tabela HOSPEDE_PS tem a seguinte aparência: SELECT * FROM HOSPEDE_PS PESO QUANDO JANE FYUNDAI 68 14-08-97 MARCELO FREITAS 59 14-08-97 ALEXANDRE GOMES 86 15-08-97 JOSÉ AUGUSTO 87 15-08-97 MAURÍCIO DE SOUZA 68.5 15-08-97 JANE FYUNDAI 67.5 16-08-97 MARCELO FREITAS 55 16-08-97 ALEXANDRE GOMES 84 17-08-97 JOSÉ AUGUSTO 84 17-08-97 MAURÍCIO DE SOUZA 67 17-08-97 A tabela contém dois registros de peso para cada estada: um na data de entrada e outro na data de saída. A query a seguir indica os hóspedes que tiveram uma diferença acima de um entre seu peso mínimo e seu peso máximo. Observe a presença de funções agregadas na cláusula HAVING. SELECT HOSPEDE, MIN(PESO), MAX(PESO) MIN(PESO) FROM HOSPEDE_PS GROUP BY HOSPEDE HAVING MAX(PESO) MIN(PESO) > 1; MIN(PESO) MAX(PESO MAX(PESO)-MIN(PESO) ) MARCELO FREITAS 55 59 4 ALEXANDRE GOMES 84 86 2 JOSÉ AUGUSTO 84 87 3 MAURÍCIO DE SOUZA 67 68.5 1.5 Passemos para um outro exemplo. Esta query solicita o número de hóspedes orientados por cada técnico que trabalhou com mais de dois hóspedes: SELECT HOSPEDE, COUNT() FROM HOSPEDE_PS GROUP BY HOSPEDE HAVING CONT() > 2; 5.3. Cláusula ORDER BY A cláusula ORDER BY nos permite classificar as linhas do resultado alfabética e numericamente, em ordem crescente ou decrescente. O default é a ordem crescente. A cláusula ORDER BY é sempre a última cláusula da query. No exemplo a seguir, obtemos os nomes dos hóspedes classificados em ordem decrescente colocando a palavra DESC na cláusula ORDER BY depois do nome da coluna a ser ordenada. Usamos a palavra-chave DISTINCT para suprimir as linhas duplicadas: Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 18

SELECT DISTINCT ORDER BY DESC; STELLA SHIELDS MAURÍCIO DE SOUZA MARCELO FREITAS JOSÉ AUGUSTO JANE FYUNDAI JANE FYUNDAI BIANCA OLIVEIRA ALEXANDRE GOMES ALEXANDRE GOMES As classificações são, por default, efetuadas em ordem crescente, a não ser que seja indicada a palavrachave DESC após o nome da coluna. Porém, podemos também explicitar a ordem crescente para uma determinada coluna, usando-se a palavra-chave ASC após o nome da coluna na cláusula ORDER BY. 6.Junções: Queries que Envolvem Mais de uma Tabela Por muitas vezes, os dados que desejamos não estão contidos em uma só tabela. Por exemplo, para obter a altura e o nome do técnico de Bianca Oliveira, temos que pesquisar em duas tabelas. O nome de seu técnico está registrado na tabela LISTA_DE_HOSPEDES, mas sua altura só está contida na tabela HOSPEDES. Esta última, a qual já foi vista em tópicos anteriores, tem a seguinte aparência: SELECT * FROM HOSPEDES; SEXO BIOTIPO ALTURA JOSÉ AUGUSTO M M 1,67 MAURÍCIO DE SOUZA M M 1,72 BIANCA OLIVEIRA F G 1,65 JANE FYUNDAI F G 1,80 STELLA SHIELDS F M 1,65 ROGÉRIO NUNES M M 1,78 A query a seguir obtém a altura de Rogério Nunes : SELECT, ALTURA FROM HOSPEDES WHERE = BIANCA OLIVEIRA ; ALTURA BIANCA OLIVEIRA 1,65 A próxima query obtém seu técnico da tabela LISTA_DE_HOSPEDES: SELECT, TECNICO WHERE = BIANCA OLIVEIRA ; BIANCA OLIVEIRA TECNICO BRUNA Podemos, no entanto, obter as mesmas informações de uma só vez através de uma query chamada junção. Uma junção é uma query que obtém dados de mais de uma tabela ao mesmo tempo, baseando-se na condição de junção indicada na cláusula WHERE. Temos abaixo uma junção que fornece a altura e o técnico de todos os hóspedes: SELECT HOSPEDES., ALTURA, TECNICO Luis Fernando Calábria/Erick Franklin/Leonardo Bandeira Página 19