Sei sulla pagina 1di 57

Saiba que este documento no poder ser reproduzido, seja por meio eletrnico ou

mecnico, sem a permisso expressa por escrito da Domnio Sistemas Ltda. Nesse caso,
somente a Domnio Sistemas poder ter patentes ou pedidos de patentes, marcas comerciais,
direitos autorais ou outros de propriedade intelectual, relacionados aos assuntos tratados nesse
documento. Alm disso, o fornecimento desse documento no lhe concede licena sobre tais
patentes, marcas comerciais, direitos autorais ou outros de propriedade intelectual; exceto nos
termos expressamente estipulados em contrato de licena da Domnio Sistemas.
importante lembrar que as empresas, os nomes de pessoas e os dados aqui
mencionados so fictcios; salvo indicao contrria.

1998 - 2009 Domnio Sistemas Ltda. Todos os direitos reservados.


Sugestes

A Domnio Sistemas busca aumentar a qualidade dos seus produtos continuamente.


Um exemplo disso esse material, que tem como objetivo aumentar a produtividade e o
desempenho dos usurios de nossos sistemas.

O processo de elaborao desse material passou por freqentes correes e testes de


qualidade, mas isso no exime o material de erros e possveis melhorias. Para que haja
melhoras, ns contamos com o seu apoio. Caso voc tenha alguma sugesto, reclamao ou
at mesmo encontre algum tipo de erro nesse material, solicitamos que voc entre em contato
conosco. Dessa forma, poderemos analisar suas sugestes e reclamaes para corrigir
eventuais erros.

Para entrar em contato com o nosso Centro de Treinamento, escreva para


treinamento@dominiosistemas.com.br. Relate, pois, a sua sugesto, reclamao ou o erro
encontrado e sua localizao para que possamos fazer as devidas correes.

Voc tambm dispe do seguinte formulrio para enviar-nos suas notaes. Basta
destacar essa folha, relatar sua sugesto e/ou reclamao e remeter ao seguinte endereo:

Centro de Treinamento Domnio


Avenida Centenrio, 7405
Nossa Senhora da Salete
Cricima SC CEP: 88815-001

___________________________________________________________________________

___________________________________________________________________________

___________________________________________________________________________

___________________________________________________________________________

___________________________________________________________________________

___________________________________________________________________________

___________________________________________________________________________

___________________________________________________________________________

___________________________________________________________________________

___________________________________________________________________________

___________________________________________________________________________

___________________________________________________________________________
ndice

Conveno de cursores, cones e tipografia................................................................................9


Lista de Abreviaturas e Siglas...................................................................................................10
Viso Geral do Curso................................................................................................................11
Descrio..............................................................................................................................11
Pblico Alvo.........................................................................................................................11
Pr-requisitos........................................................................................................................11
Objetivos..............................................................................................................................11
1. Conceitos Bsicos.................................................................................................................12
1.1. Introduo......................................................................................................................12
1.2. Objetivo.........................................................................................................................12
1.3. Introduo ao Banco de Dados......................................................................................12
1.4. Compreendendo uma Tabela.........................................................................................13
1.5. Colunas de uma Tabela.................................................................................................13
1.6. Linhas de uma Tabela....................................................................................................14
2. Introduo a SQL .................................................................................................................15
2.1. O Ambiente SQL...........................................................................................................15
2.2. O Modelo Proposto.......................................................................................................15
2.3. Modelo Tabelas.............................................................................................................16
2.4. Alguns Tipos de Dados Aceitos....................................................................................16
2.5. Definindo Chave Primria (Primary Key).....................................................................17
2.6. Chave Estrangeira (Foreign Key)..................................................................................17
2.7. Operadores Aritmticos.................................................................................................17
2.8. Operadores Relacionais ou de Comparao..................................................................18
2.9. Operadores Lgicos.......................................................................................................18
2.10. Extraindo Informaes em um Banco de Dados.........................................................19
3. Exerccios de Reviso...........................................................................................................21
3.1. Exerccios de Banco de Dados......................................................................................21
3.2. Exerccios do Modelo Proposto....................................................................................22
4. Consultas Simples.................................................................................................................23
4.1. Introduo......................................................................................................................23
4.2. Objetivo.........................................................................................................................23
4.3. Sintaxe do Comando SELECT......................................................................................23
4.4. Extraindo Dados............................................................................................................24
4.5. Utilizando Condies para Extrao de Dados.............................................................26
4.6. Aplicando Operadores Lgicos na Clusula WHERE..................................................28
4.7. Distinct..........................................................................................................................30
4.8. Agrupamento por Group By..........................................................................................30
4.9. Null................................................................................................................................31
4.10. Negando uma Condio (NOT)...................................................................................32
4.11. Sub-Consultas (Subqueries)........................................................................................33
4.12. Sub-Consultas na Clusula Where do Select Principal...............................................34
4.13. A Condio EXISTS...................................................................................................35
4.14. Unies (Union)............................................................................................................36
5. Funes.................................................................................................................................38
5.1. Funes de Agregao...................................................................................................39
5.2. Funes de Data e Hora.................................................................................................40
5.3. Funes String...............................................................................................................44
6. Joins / Outer Joins.................................................................................................................47
6.1. Produto Cartesiano (Relao entre Tabelas).................................................................47
6.2. Relacionamento (Outer Joins).......................................................................................49
7. Exerccios de Reviso 2........................................................................................................52
8. Caderno de Respostas...........................................................................................................54
8.1. Exerccios de Reviso Banco de Dados.....................................................................54
8.2. Exerccios de Reviso Modelo Proposto....................................................................54
8.3. Exerccios de Reviso 2................................................................................................54
9. Tabelas Modelo.....................................................................................................................57
Centro de Treinamento Domnio Construindo uma marca forte.

Conveno de cursores, cones e tipografia

A fonte Courier New utilizada para se referir a comandos (instrues), a serem


utilizados na SQL, por exemplo:

SELECT *
FROM funcionarios

A fonte Arial em Itlico utilizada para definir os nomes dos sistemas da Domnio,
bem como marcas registradas citadas nesse material, por exemplo:

Este treinamento direcionado aos usurios dos sistemas da Domnio Sistemas que
no tm conhecimento em SQL, sendo que as informaes de SQL obtidas durante o curso
so voltadas s necessidades do Gerador de Relatrio.

O cone abaixo, voc encontrar nos resultados de comandos aplicados no ISQL, para
a conferncia dos mesmos, por exemplo:

9
Centro de Treinamento Domnio Construindo uma marca forte.

Lista de Abreviaturas e Siglas

ANSI American National Standard Institute;

DBA Database Administrator;

DBP Database Projector;

DDL Data Definition Language;

DML Data Manipulation Language;

ISO International Organization for Standardization;

ISQL Interactive Structured Query Language;

SGBDR Sistema Gerenciador de Banco de Dados Relacionais;

SQL Structured Query Language.

10
Centro de Treinamento Domnio Construindo uma marca forte.

Viso Geral do Curso

Descrio

A finalidade do treinamento Introduo a SQL para o Gerador de Relatrios


apresentar aos nossos usurios e tcnicos os seguintes tpicos:

Noo de Banco de Dados Relacionais (SGBDR);


Tipos de caracteres encontrados em um banco de dados;
Sintaxe do comando select;
Como buscar informaes em uma banco de dados (select);
Como aplicar funes que auxiliam a manipulao dos dados;
Como fazer o agrupamento de dados (Group by);
Como eliminar duplicidade em um banco de dados (distinct);
Comandos que designam a no existncia de valor no banco de dados (Null);
Negao de condies;
Como relacionar (vincular) vrias tabelas (Outer Joins);
Como fazer sub-consultas;
Como unir consultas distintas (unio), etc.

Pblico Alvo

Este treinamento direcionado aos usurios dos sistemas da Domnio Sistemas, que
no tm conhecimento em SQL, sendo que as informaes de SQL obtidas durante o curso
so voltadas s necessidades do Gerador de Relatrios.

Pr-requisitos

Para que o estudante tenha um bom desempenho durante o treinamento necessrio


que apresente os seguintes requisitos:

Conhecimento bsico de Windows 95/98/2000;


Montar tabelas com mais de 2 campos no Word ou Excel.

Objetivos

Ao trmino desse treinamento, o usurio estar apto a realizar as seguintes funes:

Identificar o que um Banco de Dados, uma tabela e seus atributos;


Extrair informaes via SQL de variadas formas;
Utilizar funes auxiliares em seus comandos SQL.

11
Centro de Treinamento Domnio Construindo uma marca forte.

1. Conceitos Bsicos

1.1. Introduo

Neste mdulo daremos uma viso geral (terica) de banco de dados, tabelas, chaves
primria e estrangeira, tipos de dados e operadores aritmticos, lgicos e de comparao.

1.2. Objetivo

Ao final desse mdulo, voc estar apto a:

Definir o que um Banco de Dados;


Identificar uma tabela;
Identificar Linguagem de Definio e de Manipulao;
Identificar tipos de dados em uma tabela;
Identificar chaves primria e estrangeira;
Trabalhar com operadores lgicos, aritmticos e relacionais.

1.3. Introduo ao Banco de Dados

Todos ns temos conhecimento de que existem gigantescas bases de dados


gerenciando nossas vidas. De fato, sabemos que nossa conta bancria faz parte de uma
coleo imensa de contas de nosso banco. Nosso Ttulo Eleitoral ou Cadastro de Pessoa Fsica
certamente esto armazenados em Bancos de Dados colossais. Sabemos tambm que quando
sacamos dinheiro no caixa eletrnico, nosso saldo e as movimentaes existentes j esto
disposio.

Nessas situaes, compreendemos que existe uma necessidade em realizar o


armazenamento de uma srie de informaes, que no se encontram efetivamente isoladas
uma das outras, ou seja, existe uma gama de dados que se referem a relacionamentos
existentes entre as informaes a serem manipuladas.

Esses Bancos de Dados, alm de manterem todo esse volume de dados organizado,
tambm devem permitir atualizaes, incluses e excluses do volume de dados sem nunca
perder a consistncia. E no podemos esquecer que, na maioria das vezes, estaremos lidando
com acessos concorrentes a vrias tabelas de nosso banco de dados. Em algumas delas, com
mais de um acesso ao mesmo registro de uma mesma tabela.

Um Banco de Dados contm os dados dispostos numa ordem pr-determinada, para


um propsito bem definido, devido a um projeto de sistema.

Um Banco de Dados representa aspectos do mundo real. Assim sendo, uma Base de
Dados (ou Banco de Dados, ou ainda BD) uma fonte de onde podemos extrair uma gama de
informaes derivadas, que possui um nvel de interao com eventos, como o mundo real
que representa. A forma mais comum de interao Usurio e Banco de Dados se d atravs de
12
Centro de Treinamento Domnio Construindo uma marca forte.
sistemas especficos, que, por sua vez, acessam geralmente atravs da linguagem SQL o
volume de informaes.

Os Administradores de Banco de Dados (DBA) so responsveis pelo controle de


acesso aos dados e pela coordenao da utilizao do BD. J os projetistas de Banco de Dados
(DBP) so analistas que identificam os dados a serem armazenados em um Banco de Dados e
a forma como esses sero representados.

Os Analistas e Programadores de Desenvolvimento criam sistemas que acessam os


dados da forma necessria ao Usurio Final, sendo aquele que interage diretamente com o
Banco de Dados.

1.4. Compreendendo uma Tabela

Conceitualmente, tabela um quadro onde se indica alguma coisa. Dependendo do


tipo de informao que ser demonstrada, o layout de uma tabela pode variar
consideravelmente. Quem nunca viu uma tabela em estatstica, mostrando, por exemplo, ano a
ano a taxa de natalidade ou mortalidade infantil, ou ento nos jornais, demonstrando a
variao do dlar, etc.? At mesmo softwares foram construdos, de modo que sua aparncia
trabalhasse em forma de tabela, como por exemplo as planilhas eletrnicas.

Em computao, uma tabela nada mais do que uma unidade bsica de


armazenamento de dados em um banco de dados, ou ainda uma estrutura formada por campos
ou colunas, onde as informaes contidas nesses so de uma mesma espcie. Tambm
considerada como um conjunto de linhas ou de listas de valores.

1.5. Colunas de uma Tabela

Podemos ento dizer que as colunas so um conjunto de clulas dentro de uma tabela
que armazenam sempre um mesmo tipo de informao em particular. Por exemplo, supondo
que em uma tabela exista uma coluna onde ser mostrado o percentual de natalidade de um
determinado ano. Nessa coluna sero mostrados somente percentuais, pois o tipo de
informao que deve ser exibida, tendo em vista que no haveria sentido mostrar em algumas
clulas percentuais e em outras clulas um outro nome ou uma data por exemplo.

Quando utilizamos tabelas em um banco de dados, tambm trabalhamos dessa forma,


contudo existe ainda uma vantagem de que podemos definir quais tipos de valores uma coluna
pode aceitar. Por exemplo: se queremos uma tabela de funcionrios, onde uma coluna seria a
data de admisso, determinamos ento que essa coluna s poder aceitar datas vlidas, o que
evita possveis erros de digitao.

Mais adiante veremos alguns tipos de dados que uma coluna pode receber dentro de
um banco de dados.

13
Centro de Treinamento Domnio Construindo uma marca forte.

1.6. Linhas de uma Tabela

Tambm chamada de registro, um conjunto de colunas que ficam dispostas


horizontalmente. Todas as linhas possuem o mesmo nmero de colunas.

14
Centro de Treinamento Domnio Construindo uma marca forte.

2. Introduo a SQL
Structured Query Language (Linguagem de Consulta Estruturada)

Quando os Bancos de Dados estavam sendo desenvolvidos, foram criadas linguagens


destinada a definies e manipulaes desses bancos, e devido a essa necessidade, foi
desenvolvida pelo Departamento de Pesquisas da IBM a SQL como forma de interface para os
sistemas de Banco de dados relacionais. Mais tarde a American National Standard Institute
(ANSI) definiu um padro SQL mundial, atualmente a ANSI/ISO definem esses padres.

A SQL uma linguagem usada pela maioria dos bancos de dados relacionais, baseada
no ingls. Os comandos de SQL utilizados para a definio de dados, so conhecidos como
DDL (Data Definition Language) e compostos, entre outros, pelos comandos Create, que
destinado criao do Banco de Dados e Tabelas que o compem. Alm das relaes
existentes entre as tabelas, o comando Alter, permite inserir e eliminar atributos nas tabelas
existentes, e o comando Drop, utilizado para eliminar a definio da tabela, seus dados e
referncias.

Os comandos da srie DML (Data Manipulation Language) so destinados s


consultas, inseres, excluses e alteraes em um ou mais registros de uma ou mais tabelas
de maneira simultnea. Como exemplo, os comandos: Select, Insert, Update e Delete.

A linguagem SQL tem a capacidade de gerenciar ndices, sem a necessidade de


controle individualizado de ndice corrente, algo muito comum nas linguagens de
manipulao de dados do tipo registro a registro. Outra caracterstica muito importante
disponvel em SQL sua capacidade de construo de vises, que so formas de
visualizarmos os dados na forma de listagens, independente das tabelas e organizao lgica
dos dados. Outra caracterstica interessante na linguagem SQL a capacidade que dispomos
de cancelar uma srie de atualizaes, ou de grav-las depois de iniciar uma seqncia de
atualizaes. Os comandos Commit e Rollback so responsveis por essas facilidades.

Devemos notar que a linguagem SQL consegue implementar essas solues por estar
baseada em Banco de Dados, que garante a integridade das relaes existentes entre as tabelas
e seus ndices.

2.1. O Ambiente SQL

Dispomos na Domnio Sistemas para a ministrao do curso de SQL, voltado ao


Gerador de Relatrios, da ferramenta ISQL.

2.2. O Modelo Proposto

Para futuros testes com comandos SQL, montamos um modelo contendo trs tabelas:

Funcionrios: ser a tabela onde sero armazenadas algumas informaes referentes


aos funcionrios.

15
Centro de Treinamento Domnio Construindo uma marca forte.

Deptos: armazenaremos nessa tabela os departamentos onde um determinado


funcionrio estar ligado.

Bancos: armazenaremos os bancos, em caso do funcionrio trabalhar com bancos.

Quando vocs visualizarem as tabelas construdas abaixo, imaginem que dentro de um


banco de dados estaro exatamente dessa forma.

Observem a formao dessas tabelas no quesito colunas e linhas, e procurem


identificar que tipo de informao cada coluna aceita.

2.3. Modelo Tabelas

TABELA DE FUNCIONRIOS (funcionrios)


cod_func nome cod_depto salrio dt_admisso dt_nascto cod_banco
1 Joo Anastcio 1 500,00 1995-01-01 1975-01-02 15:12:13 1
2 Pedro Brasona 2 800,00 2001-02-05 1980-12-01 17:12:14 2
3 Manoel da R. Pizzolo 3 1500,00 1990-05-02 1930-10-08 12:00:00 3
4 Joo Malha 4 189,00 1999-04-10 1988-04-04 13:00:00 4
5 Antnio Nascimento 3 200,00 1985-01-10 1967-01-10 13:00:00 (NULL)
6 Maria de Jesus 4 180,00 1985-02-11 1967-02-11 13:00:00 (NULL)
7 Raimundo Pizzolo 4 180,00 1985-02-11 1967-02-11 14:00:00 (NULL)

TABELA DE DEPARTAMENTOS (deptos)


cod_depto Nome
1 Recursos Humanos
2 Desenvolvimento
3 Financeiro
4 Editorao

TABELA BANCOS (bancos)


cod_banco Nome agncia nmero_banco
1 Banco do Brasil 0407-3 6620-6
2 Bradesco 500-4 1246-88
3 Bradesco 345-1 1232-2
4 Ita 2323-24 34534

2.4. Alguns Tipos de Dados Aceitos

Char(n) : Onde n o nmero de dgitos (caracteres alfanumricos), o valor deve


sempre ser colocado entre aspas. Ex.: a.
Integer : Nmeros inteiros (positivos ou negativos). Ex.: 1, 10 , 5000.
Numeric (n,p): Onde n o nmero de dgitos e p a preciso. Ex.: 125,43.
Date : Data.
Time : Hora.

16
Centro de Treinamento Domnio Construindo uma marca forte.

2.5. Definindo Chave Primria (Primary Key)

Chave primria uma coluna ou conjunto de colunas (chave composta), que identifica,
de forma nica, os demais dados de uma linha. Por exemplo: na tabela funcionrios o
cod_func identifica cada linha. Assim, duas linhas no podem ter a mesma chave primria.

Na tabela de deptos, a coluna cod_depto identifica cada linha, da mesma forma,


funcionrios. Duas linhas no podem ter o mesmo valor na coluna cod_depto.

Na tabela bancos, a coluna cod_banco quem identifica cada linha, funcionando


como as tabelas anteriores.

2.6. Chave Estrangeira (Foreign Key)

As tabelas podem se relacionar entre si. Observe que na tabela funcionrios


precisamos saber a qual departamento ele pertence e tambm em qual banco (se ele trabalhar
com banco) ele possui conta. Para isso, temos a coluna onde se armazena o cdigo do
departamento (cod_depto) e a coluna onde se armazena o cdigo do banco (cod_banco).

Como vimos no item anterior, cod_depto e cod_banco so chaves primrias nas


tabelas deptos e bancos respectivamente. Como essas colunas tambm existem na tabela de
funcionrios, e seus valores dependem das tabelas deptos e bancos, dizemos ento que elas
so chaves estrangeiras na tabela de funcionrios.

Resumindo, as chaves estrangeiras correspondem ao valor da chave primria em outra


tabela. No banco de dados do nosso modelo, se existir algum valor nas colunas cod_depto e
cod_banco, da tabela funcionrios, deve estar obrigatoriamente nas tabelas depto e bancos
respectivamente.

2.7. Operadores Aritmticos

Operador Descrio
+ Adio
- Subtrao
* Multiplicao
/ Diviso

A precedncia de operadores segue a mesma regra matemtica, ou seja, primeiro sero


executadas multiplicao e diviso, para depois adio e subtrao.

17
Centro de Treinamento Domnio Construindo uma marca forte.

2.8. Operadores Relacionais ou de Comparao

= igual a != no igual (diferente)


> maior que <> no igual (diferente)
< menor que !> no maior do que
>= maior ou igual a !< No menor do que
<= menor ou igual a

2.9. Operadores Lgicos

Para explicar operadores lgicos, vamos empregar algo que utilizamos muito em nosso
cotidiano, a linguagem falada e escrita.

Observe que nas frases abaixo, os operadores lgicos esto em negrito e so chamados
de E e OU.

Se meu salrio pouco E estou cheio de dvidas, irei para o SPC.


1 condio 2 condio

Se est chovendo E eu estou sem guarda-chuva E no tenho nenhum abrigo, irei me


molhar.

Se sou brasileiro OU sou Argentino, ento sou sul-americano.

Se toro para o Flamengo OU toro para o Vasco OU toro para o Botafogo, ento
sou do Rio de Janeiro.

Se ganhei na sena OU ganhei na loto OU ganhei na mega-sena E faturei tudo isso


sozinho, vou para o Caribe!

No caso do operador E, para que uma determinada afirmao seja verdadeira, todos os
membros da frase devem ser verdadeiros, ou seja, o que est a direita e o que est esquerda
do operador E devem ser verdadeiros.

J no caso do operador OU, basta que um dos membros da frase seja verdadeiro, como
o exemplo da terceira frase.

Para compreenso podemos tambm utilizar expresses matemticas.

Ex.:(1) Idade_func = 18 // uma varivel que contm a idade do funcionrio.

Se (Idade_func > 18) E (Idade_func < 20)


Ento A idade do funcionrio de 19 anos.
Seno A idade do funcionrio no de 19 anos.

Perceba nesse exemplo, que as duas afirmaes precisam ser verdadeiras para que a
expresso seja verdadeira.

18
Centro de Treinamento Domnio Construindo uma marca forte.
Ex.: (2) Departamento = 10

Se (departamento = 1 ) OU (departamento = 2)
OU (departamento=10)
Ento Funcionrio pertence ao departamento 1 ou 2 ou 10.
Seno Funcionrio no pertence aos departamentos 1, 2 e 10.

Perceba nesse exemplo, que as duas primeiras condies so falsas, porm, a ltima
verdadeira. Assim, a expresso torna-se verdadeira com o operador OU.

Os exemplos acima so apenas para compreenso dos operadores, pois, assim que
funciona na SQL. Contudo, todos os comandos em SQL so escritos em ingls, inclusive
esses operadores. Quando voc utilizar operadores lgicos em SQL, escreva AND, que
significa E em ingls e OR que significa OU.

2.10. Extraindo Informaes em um Banco de Dados

Como vimos, as informaes de um banco de dados ficam armazenadas dentro de


tabelas, que por sua vez possuem campos. Sendo assim, quando quisermos extrair
informaes, ou seja, saber por exemplo, em que departamento um determinado funcionrio
est, precisamos primeiramente saber qual o banco de dados, qual a tabela que representa os
funcionrios e em qual campo (ou coluna) est especificamente o cdigo do departamento do
funcionrio.

Vamos ento visualizar as tabelas anteriormente listadas, para tentar extrair a seguinte
informao:

A data de admisso do funcionrio cujo cdigo igual a 5.

Primeiramente, deve-se extrair do banco de dados a informao chamada data de


admisso. Depois extra-la tambm da tabela de funcionrios. Porm, se tem uma condio
para isso, s dever ser extrado a data de admisso do funcionrio que possui seu cdigo
igual a 5. Visualmente, direcionamos os olhos para a tabela de funcionrios, para a coluna
cod_func e intuitivamente selecionamos a linha onde o cdigo igual a 5. Direcionamos ento
os olhos para a direita at encontrarmos a coluna que possui a data de admisso. Pronto!
Achamos o que queramos!

Tente novamente. Agora quero saber o nome do departamento do funcionrio que


possui o cdigo 3.

Da mesma forma, com os olhos, vamos tabela de funcionrios e na coluna cod_func


selecionamos a linha que possui o cdigo 3. Se direcionarmos os olhos para a direita, no
encontraremos o nome do departamento, que justamente o que estamos pedindo acima.
Contudo, apesar de no termos o nome, pelo menos temos o cdigo do mesmo, pois sabemos
que em nosso modelo existe uma outra tabela, com o objetivo de armazenar os departamentos.

Aps selecionar o funcionrio de cdigo 3, vamos at a coluna cod_depto e


selecionamos o cdigo que est contido. Com esse cdigo, direcionamos os olhos para a
19
Centro de Treinamento Domnio Construindo uma marca forte.

tabela depto, e na coluna cod_depto, selecionamos a linha que possui o valor igual ao que
estava na coluna cod_depto, da tabela de funcionrios. Uma vez selecionado, basta identificar
qual o nome do departamento.

Realizados esses procedimentos, conseguimos extrair informaes de nossas tabelas.

Devemos observar que sempre que quisermos extrair informaes, precisamos


previamente saber: qual a informao (qual(is) coluna(s)), de onde ela vir (qual(is) tabela(s))
e se existir alguma condio para extra-las.

Utilizando SQL para extrair informaes de um banco de dados, funciona exatamente


igual ao exerccio que fizemos acima, porm podemos at fazer isso mentalmente para
exemplos simples, mas, para que se concretize o que pensamos, devemos digitar alguns
comandos e depois mand-los executar.

20
Centro de Treinamento Domnio Construindo uma marca forte.

3. Exerccios de Reviso

3.1. Exerccios de Banco de Dados

1.) Descreva o que voc entende por Banco de Dados.


___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________

2.) Defina o que uma tabela.


___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________

3.) Defina o que a linha e a coluna de uma tabela.


___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________

4.) Defina a linguagem SQL.


___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________

5.) Quais os comandos de definio e manipulao de linguagem e para que servem?


___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________

21
Centro de Treinamento Domnio Construindo uma marca forte.
6.) Para que utilizamos a chave primria?
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________

7.) Relacione os operadores a seguir:

( 1 ) Aritmtico ( 2 ) Lgico ( 3 ) Relacional

( )= ( )-
( )+ ( )>
( ) !< ( ) OR
( )/ ( ) !>
( ) >= ( )*
( ) AND ( ) <=
( ) != ( )<
( ) <>

3.2. Exerccios do Modelo Proposto

1.)Que tabela usada para informar o salrio dos funcionrios?


___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________

2.)Que tipo de dado utilizado no campo Nome da tabela funcionrio?


___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________

3.)Que tipo de dado utilizado no campo dt_admisso da tabela funcionrio e qual o tipo de
dado utilizado no campo agncia da tabela bancos?
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________

22
Centro de Treinamento Domnio Construindo uma marca forte.

4. Consultas Simples

4.1. Introduo

Neste mdulo estudaremos comandos de Sintaxe e outros comandos de SQL que


aplicaremos no Gerador de Relatrios, dando maior nfase sintaxe do Select.

4.2. Objetivo

Ao final desse mdulo, voc estar apto a:

Selecionar informaes no banco de dados;


Utilizao de algumas funes da SQL;
Agrupar informaes via SQL;
Identificar e manipular valores nulos;
Relacionamento entre tabelas.

4.3. Sintaxe do Comando SELECT

SELECT [distinct {*| tabela.*| [tabela.]campo1 [AS alias1]


[, [tabela.]campo2 [AS alias2] [, ...]]}
FROM expresso_tabela [, ...]
[WHERE condicoes... ]
[GROUP BY nome_coluna ]
[ORDER BY nome_colunas [ ASC | DESC ], ...]

Parte Descrio

distinct Especifica que todos os campos da tabela ou tabelas especificadas, que


tenham valor duplicado, sero exibidas uma nica vez, ou seja, na sada
da consulta no constam valores duplicados.

* Especifica que todos os campos da tabela ou tabelas


especificadas sero selecionados.

tabela O nome da tabela que contm os campos dos quais os


registros sero selecionados.

campo1, campo2 Os nomes dos campos dos quais os dados sero recuperados. Se voc
incluir mais de um campo, eles sero recuperados na ordem listada.

alias1, alias2 Os nomes que sero usados como ttulos de colunas em vez dos
nomes originais das colunas na tabela.

Expresso_tabela O nome da tabela ou tabelas contendo os dados que voc quer


recuperar.
23
Centro de Treinamento Domnio Construindo uma marca forte.

4.4. Extraindo Dados

O comando abaixo seleciona todas as colunas de uma tabela.

SELECT funcionarios.cod_func,funcionarios.nome,funcionarios.
cod_depto,funcionarios.salario,funcionarios.dt_admissao,
funcionarios.dt_nascto,funcionarios.cod_banco
FROM funcionarios

SELECT fu.cod_func,fu.nome,fu.cod_depto,fu.salario,fu.dt_admissao,
fu.dt_nascto,fu.cod_banco
FROM funcionarios AS fu

SELECT *
FROM funcionarios

Aqui voc visualiza os dados referentes as consultas


realizadas por voc atravs dos comandos digitados na
ltima janela desta tela.

Aqui voc visualiza as estatsticas dos comandos


realizados e tambm verifica se seu comando funcionou.

Aqui voc v o comando feito em ISQL, aps


digitar o comando clica-se no boto Execute.

O comando abaixo seleciona as colunas (cod_func,nome,cod_depto, dt_admissao) da


tabela de funcionrios.

SELECT cod_func,nome,cod_depto,dt_admissao
FROM funcionarios

24
Centro de Treinamento Domnio Construindo uma marca forte.

O comando abaixo seleciona as colunas (cod_func, nome) da tabela de funcionrios,


porm, mostra como cabealho os apelidos atribudos a ela com a clusula AS.

SELECT cod_func AS codigo, nome AS descricao


FROM funcionarios

ou

SELECT codigo=cod_func,descricao=nome
FROM funcionarios

O comando abaixo seleciona todas as colunas da tabela funcionrios e mostra os


mesmos ordenados por ordem descendente de cdigo.

SELECT *
FROM funcionarios
ORDER BY cod_func DESC

O comando abaixo seleciona todas as colunas da tabela funcionrios e mostra os


mesmos ordenados por ordem ascendente de nome (ordem alfabtica).

SELECT *
FROM funcionarios
ORDER BY nome ASC

O comando a seguir seleciona todas as colunas da tabela funcionrios e mostra os


mesmos ordenados por ordem ascendente de nome e data de admisso.

SELECT *
FROM funcionarios
ORDER BY nome ASC, dt_admissao ASC

25
Centro de Treinamento Domnio Construindo uma marca forte.

4.5. Utilizando Condies para Extrao de Dados

O comando abaixo seleciona todas as colunas da tabela funcionrios que possui


cdigo igual a 5.

SELECT *
FROM funcionarios
WHERE cod_func = 5

O comando a abaixo seleciona algumas colunas do funcionrio que possui cdigo 5.

SELECT cod_func,nome,cod_depto,dt_admissao
FROM funcionarios
WHERE cod_func = 5

O comando abaixo seleciona todas as colunas da tabela funcionrios com data de


admisso maior que 02/05/1990. Quem foi admitido nessa data no ser selecionado.

SELECT *
FROM funcionarios
WHERE dt_admissao > '1990/05/02'

O comando abaixo seleciona todas as colunas da tabela funcionrios com data de


admisso menor que 02/05/1990. Quem foi admitido nessa data no ser selecionado.

SELECT *
FROM funcionarios
WHERE dt_admissao < '1990/05/02'

O comando a seguir seleciona todas as colunas da tabela funcionrios com data de


admisso maior ou igual a 02/05/1990. Quem foi admitido nessa data SER selecionado.
26
Centro de Treinamento Domnio Construindo uma marca forte.
SELECT *
FROM funcionarios
WHERE dt_admissao >= '1990/05/02'

O comando abaixo seleciona todas as colunas da tabela funcionrios com data de


admisso menor ou igual a 02/05/1990. Quem foi admitido nessa data SER selecionado.

SELECT *
FROM funcionarios
WHERE dt_admissao <= '1990/05/02'

O comando abaixo seleciona todas as colunas da tabela funcionrios com cdigo do


departamento diferente de 4, ou seja, todos os que no pertencem ao departamento de cdigo
4.

SELECT *
FROM funcionarios
WHERE cod_depto <> 4

O comando abaixo seleciona todas as colunas da tabela funcionrios que o nome


inicie com Joo.

SELECT *
FROM funcionarios
WHERE nome LIKE'Joao%'

O comando a seguir seleciona todas as colunas da tabela funcionrios que o nome


termina com Pizzolo.

SELECT *
FROM funcionarios
WHERE nome LIKE'%Pizzolo'

27
Centro de Treinamento Domnio Construindo uma marca forte.

O comando abaixo seleciona todas as colunas da tabela funcionrios que o nome


possui de em alguma posio do nome.

SELECT *
FROM funcionarios
WHERE nome LIKE'%de%'

O comando abaixo seleciona todas as colunas da tabela funcionrios que o nome


inicie com a letra M, tenha qualquer caracter na segunda posio e as prximas duas letras
do nome sejam ri. Ex.: Maria, Mrio.

SELECT *
FROM funcionarios
WHERE nome LIKE'M%ri%'

4.6. Aplicando Operadores Lgicos na Clusula WHERE

O comando abaixo seleciona todas as colunas da tabela funcionrios cujo o cod_depto


igual a 4 e a dt_admisso igual a 1985/02/11.

SELECT *
FROM funcionarios
WHERE cod_depto = 4 AND dt_admissao = '1985/02/11'

O comando abaixo seleciona todas as colunas da tabela funcionrios cujo o


cod_banco igual a 2 ou o cod_banco igual a 4.

SELECT *
FROM funcionarios
WHERE cod_banco = 2 OR cod_banco = 4

O comando a seguir seleciona todas as colunas da tabela funcionrios cujo o


cod_depto igual a 4. A data de admisso deve ser igual a 1985/02/11 ou 1985/01/10.

SELECT *
FROM funcionarios
WHERE cod_depto = 4 AND dt_admissao = '1985/02/11' OR
dt_admissao = '1985/01/10'

28
Centro de Treinamento Domnio Construindo uma marca forte.

Observe que o comando anterior no funcionou como deveria, pois fez retornar um
funcionrio que no pertence ao departamento de cdigo 4. Isso ocorreu porque o operador
OR dividiu a SQL em duas condies. Tudo o que est antes do OR uma condio e tudo o
que estiver depois outra condio. Sendo assim, se uma das duas forem verdadeiras, a linha
da tabela ser retornada.

O prximo comando mostra como deveria ser feito para que a SQL retornasse
corretamente o que foi descrito acima.

SELECT *
FROM funcionarios
WHERE cod_depto = 4 AND (dt_admissao = '1985/02/11' OR
dt_admissao = '1985/01/10')

O comando abaixo seleciona todas as colunas da tabela funcionrios cujo o cod_func


igual a 2 ou 3 ou 7.

SELECT *
FROM funcionarios
WHERE cod_func = 2 AND cod_func = 3 AND cod_func = 7

Observe que o comando anterior no retornou nada, pois quando se utiliza o operador
AND todas as condies tm de ser verdadeiras para a linha ser retornada.

O prximo comando retorna o que foi descrito anteriormente:

SELECT *
FROM funcionarios
WHERE cod_func = 2 OR cod_func = 3 OR cod_func = 7

O comando abaixo seleciona todas as colunas da tabela funcionrios cujo o cod_func


igual a 2 ou 3 ou 7. Sintaxe melhor que a anterior.

SELECT *
FROM funcionarios
WHERE cod_func IN (2,3,7)

29
Centro de Treinamento Domnio Construindo uma marca forte.

O comando abaixo seleciona todas as colunas da tabela funcionrios cujo o cod_func


maior e igual a 2 e o cod_func menor e igual a 6.

SELECT *
FROM funcionarios
WHERE cod_func >= 2 AND cod_func <= 6

O comando abaixo seleciona todas as colunas da tabela funcionrios cujo o cod_func


deve ser estar entre 2 e 6. Sintaxe melhor que a anterior.

SELECT *
FROM funcionarios
WHERE cod_func BETWEEN 2 AND 6

4.7. Distinct

A clusula Distinct elimina duplicidades, significando que somente relaes distintas


sero apresentadas como resultado de uma pesquisa.

O comando abaixo mostra na tela todos os salrios diferentes que so pagos aos
funcionrios cadastrados, pois a clusula DISTINCT s mostra valores distintos.

SELECT distinct salario


FROM funcionarios

4.8. Agrupamento por Group By

As funes de grupo operam sobre grupos de linhas. Retornam resultados baseados em


grupos de linhas em vez de resultados de funes por linha individual.

A clusula GROUP BY pode ser usada para dividir as linhas de uma tabela em
grupos menores. As funes de grupo devolvem uma informao sumarizada para cada grupo.

O comando abaixo mostra na tela o total de salrios pagos por departamento. Utiliza a
funo de agregao sum() em conjunto com group by.

30
Centro de Treinamento Domnio Construindo uma marca forte.
SELECT cod_depto,sum(salario)
FROM funcionarios group by cod_depto

O comando abaixo mostra na tela o total de funcionrios por departamento. Utiliza a


funo de agregao count() em conjunto com group by.

SELECT cod_depto,count()
FROM funcionarios group by cod_depto

4.9. Null

O valor nulo (NULL) um valor especial dentro de um banco de dados. Diferente de


qualquer outro tipo de dado, esse valor indica que o contedo de determinada coluna (ou
campo) em uma determinada linha (registro) no conhecido, ou seja, para um valor NULL
no existe valor designado.

Qualquer clculo envolvendo alguma operao matemtica, quando um dos membros


da expresso contenha o valor nulo, o resultado ser nulo (IS NULL).

Ex.: Vamos supor que tenhamos trs colunas: vlr_irrf = 10, vlr_horas_extras = NULL,
vlr_inss = 15.

Fazendo-se a soma (VLR_IRRF + VLR_HORAS_EXTRAS + VLR_INSS) o


resultado ser nulo (NULL), pois em um dos membros da expresso existe um valor NULL.

Para solucionar esse problema poderamos antes de somar o valor das horas extras,
perguntar se esse valor nulo ou no. Caso seja, considerar que o valor zero.

Ex.: (VLR_IRRF + [ nulo VLR_HORAS_EXTRAS? ento igual a zero, seno


soma o valor de VLR_HORAS_EXTRAS ] + VLR_INSS)

Intuitivamente resolveramos o problema assim, porm em ISQL uma das maneiras de


resolver isto seria utilizando-se uma funo. A funo chama-se ISNULL e est exemplificada
a seguir:

(VLR_IRRF + ISNULL(VLR_HORAS_EXTRAS,0) + VLR_INSS)

A funo ISNULL verifica se o valor de VLR_HORAS_EXTRAS nulo. Se for, pega


o valor zero que est no segundo parmetro, caso contrrio pega o prprio valor do campo
VLR_HORAS_EXTRAS.

O comando a seguir mostra na tela todos os funcionrios em que o valor da coluna


cdigo do banco seja NULL.

SELECT *
FROM funcionarios
WHERE cod_banco is null

31
Centro de Treinamento Domnio Construindo uma marca forte.

O comando abaixo mostra o cdigo, nome e cdigo do banco do funcionrio. Se o


cdigo do banco for NULL, ser mostrado zero.

SELECT cod_func,nome,isnull(cod_banco,0)
FROM funcionarios

4.10. Negando uma Condio (NOT)

At agora vimos vrios exemplos onde utilizamos condies para selecionar linhas
dentro de uma tabela. Para tanto, utilizamos operadores lgicos, operadores de condio, etc.
Porm h casos em que mais fcil eliminar linhas que no se deseja mostrar do que criar
uma seleo para mostrar somente as linhas que desejamos. Vejamos o exemplo:

Vamos supor que se deseje mostrar os funcionrios que possuem os cdigos 2 e 7. O


melhor comando a ser utilizado seria:
SELECT *
FROM funcionarios
WHERE cod_func in (2,7)

Mas vamos supor ento que se deseje mostrar todos os funcionrios, exceto os que
possuem cdigos 2 e 7.

SELECT *
FROM funcionarios
WHERE cod_func <> 2 AND cod_func <> 7

Contudo, para operaes onde mais fcil excluir as linhas do que criar condies
para selecion-las, podemos utilizar o operador NOT para negar a condio. Ex.:

SELECT *
FROM funcionarios
WHERE cod_func NOT in (2,7)
32
Centro de Treinamento Domnio Construindo uma marca forte.

Tanto a forma anterior quanto essa funcionam, mas verifique que a segunda menor e
mais clara. Ir selecionar todos os funcionrios onde o cdigo no seja 2 ou 7.

Outros exemplos:

O comando abaixo mostra na tela todos os funcionrios em que o valor da coluna


cdigo do banco no seja NULL.

SELECT *
FROM funcionarios
WHERE cod_banco is not null

O comando abaixo mostra todos os funcionrios que no pertencem ao departamento


de cdigo 4.

SELECT *
FROM funcionarios
WHERE not cod_depto = 4  nesse caso seria melhor o operador <> (diferente)

4.11. Sub-Consultas (Subqueries)

Sub-consulta um comando SELECT, que aninhado dentro de outro SELECT e


que devolve resultados intermedirios. Uma sub-consulta acontece quando temos uma SQL
principal que pode retornar n linhas, e para cada linha retornada nessa SQL principal
executado um ou mais SQL que retornaro sempre um nico valor, pois em sub-consulta no
permitido retornar mais de uma linha.

Exemplo(1): Vamos supor que eu deseje imprimir o cdigo do departamento, o nome


do departamento e o total de funcionrios de cada departamento, porm esse total quero obter
atravs de uma sub-consulta. Podemos fazer assim:

SELECT cod_depto,nome, total_funcs =


(SELECT count()
FROM funcionarios
WHERE funcionarios.cod_depto=deptos.cod_depto)
FROM deptos

33
Centro de Treinamento Domnio Construindo uma marca forte.

Observe que criamos uma coluna temporria para armazenar o total de funcionrios
por departamento.

Exemplo(2): Vamos supor que se deseje mostrar o cdigo e nome do funcionrio


juntamente com a agncia e conta bancria. Essas duas ltimas informaes obter atravs de
sub-consultas.

SELECT cod_func,nome,
agencia= (SELECT agencia
FROM bancos
WHERE bancos.cod_banco = funcionarios. cod_banco),
conta_bancaria = (SELECT numero_banco
FROM bancos
WHERE bancos.cod_banco = funcionarios.cod_banco)
FROM funcionarios

No existe segredo em utilizar sub-consultas. O nico cuidado que tem que se tomar
fazer corretamente os relacionamentos, pois se esses no forem executados corretamente a
sub-consulta poder retornar mais de uma linha ocasionando assim um erro.

Os dois exemplos acima mostram o uso de sub-consultas, mas voc pode observar que
poderia ser feito sem utiliz-las. Pelo modelo apresentado ser extremamente simples, no
existem muitos casos em que possa utilizar sub-consultas.

As sub-consultas so de grande utilidade e, em muitos casos, extremamente


vantajoso utiliz-las a relacionar vrias tabelas no select principal, pois geralmente elas so
executadas mais rapidamente.

4.12. Sub-Consultas na Clusula Where do Select Principal

A utilizao de sub-consulta na clusula WHERE do SELECT principal muito


comum e segue as mesmas regras de sub-consultas vistas at ento, diferenciando apenas o
local onde a mesma colocada.

At agora estamos acostumados a utilizar as sub-consultas antes da clusula FROM do


comando SELECT. Vamos ver ento a utilizao nesse mesmo comando, porm depois da
clusula WHERE. Um modo muito fcil dessa utilizao em conjunto com a condio
EXISTS, porm veremos outros modos que so equivalentes e inclusive foram vistos
anteriormente.
34
Centro de Treinamento Domnio Construindo uma marca forte.

4.13. A Condio EXISTS

A sintaxe da condio EXISTS a seguinte:

.... EXISTS (sub-consulta)

A condio EXISTS verdadeira se o resultado da sub-consulta retornar no mnimo


uma linha, caso contrrio a mesma ser falsa.

Quando utilizamos uma sub-consulta em conjunto com a condio EXISTS no


teremos aquele conhecido problema da mesma retornar mais de uma linha. Isso acontece
porque a condio EXISTS uma condio lgica e s pode retornar um valor, no caso,
verdadeiro ou falso.

Sendo assim, enquadra-se no conceito visto anteriormente, onde vimos que uma sub-
consulta s pode retornar um valor singular, ou seja, uma nica linha.

No exemplo abaixo, o select deve retornar somente os bancos que tenham algum
funcionrio vinculado a ele, ou seja, somente os bancos que o cdigo esteja em alguma linha
da tabela funcionrios.

SELECT *
FROM bancos
WHERE EXISTS
(SELECT funcionarios.cod_banco FROM funcionarios
WHERE funcionarios.cod_banco = bancos.cod_banco)

Da mesma forma podemos fazer para tabela de deptos, conforme exemplo a seguir:
SELECT *
FROM deptos
WHERE EXISTS (SELECT funcionarios.cod_depto
FROM funcionarios
WHERE funcionarios.cod_depto = deptos.cod_depto)

Comandos equivalentes:

SELECT *
FROM bancos
WHERE (SELECT count()
FROM funcionarios
WHERE funcionarios.cod_banco = bancos.cod_banco) > 0

35
Centro de Treinamento Domnio Construindo uma marca forte.

SELECT *
FROM deptos
WHERE (SELECT count()
FROM funcionarios
WHERE funcionarios.cod_depto = deptos.cod_depto) > 0

ou

SELECT *,
TOTFUNC = (SELECT count()
FROM funcionarios
WHERE funcionarios.cod_banco = bancos.cod_banco)
from bancos where totfunc > 0

SELECT *,
TOTFUNC = (SELECT count()
FROM funcionarios
WHERE funcionarios.cod_depto = deptos.cod_depto)
from deptos where totfunc > 0

Deve-se tomar cuidado para sempre que utilizar uma sub-consulta na clusula
WHERE do SELECT principal e essa sub-consulta no estiver em conjunto com a condio
EXISTS, utilizar funes de agregao, para impedir que a sub-consulta possa retornar mais
de uma linha e assim ocorrer erro na execuo. Caso no deseje utilizar uma funo de
agregao, deve-se ento ter certeza que o resultado da sub-consulta vai retornar sempre uma
linha apenas.

4.14. Unies (Union)

As unies tambm so de extrema importncia para relatrios mais complexos, em que


no podemos mostrar tudo que queremos em uma mesma SQL. As Unies podem ser
formadas por vrias SQLs que resulta na soma de todas as linhas executadas por cada SQL.

36
Centro de Treinamento Domnio Construindo uma marca forte.
Vamos supor que precisemos gerar uma SQL que mostre primeiro todos os
funcionrios seguidos de todos os departamentos e depois todos os bancos, ordenados por
cdigo.

Cada SQL dever ser identificado, por um nmero, iniciando do nmero 1.


SELECT identificador = 1,cod_func,nome
FROM funcionarios

UNION All

SELECT identificador = 2,cod_depto,nome


FROM deptos

UNION All

SELECT identificador = 3,cod_banco,nome


FROM bancos
ORDER BY 1

Perceba que o nmero de colunas de cada SQL tem que ser idntico para todos. Nesse
exemplo, todas as linhas geradas pela primeira SQL tero identificador = 1, pela segunda SQL
tero identificador = 2 e pela terceira SQL identificador = 3. Como a clusula ORDER BY
est utilizando a ordem pela primeira coluna (identificador), primeiro viro listados todos os
funcionrios seguidos de todos os departamentos e depois todos os bancos.

Basicamente, quem sabe trabalhar com SQL no ter dificuldade em utilizar unies.

37
Centro de Treinamento Domnio Construindo uma marca forte.

5. Funes
Pode-se dizer que em computao as funes so nossas melhores amigas. Quando se
tem algum problema, quase sempre tem uma funo para salvar a ptria. Alm de evitar que
se digite vrios comandos para chegar a um determinado resultado, as funes tornam a SQL
mais clara reduzindo o seu tamanho, e so geralmente mais rpidas na execuo.

Em SQL existem vrias funes para manipulao de datas, tempo, nmeros,


caracteres alfanumricos, etc.

As funes sempre retornam um valor singular (apenas um valor) e podem receber ou


no parmetros, dependendo qual o objetivo da funo.

Quem j trabalhou com planilhas eletrnicas (como Excel) deve ter visto e utilizado
funes. Apesar de no terem nenhuma relao com as funes em SQL, o conceito de
passagem de parmetros e retorno de valores o mesmo.

Se algum ainda no entendeu o que so parmetros, podemos exemplificar mais.


Vamos supor que voc queira saber o valor do SENO de um nmero. Voc pega a calculadora
e utiliza a funo Sin (SENO), porm precisa passar qual o valor que voc quer saber o
SENO. Esse valor o parmetro. J se voc quiser saber qual a data de hoje, basta ir ao
calendrio e olhar, sem que precise enviar nenhum parmetro. Assim funciona em SQL.

A sintaxe de uma funo geralmente segue a regra a seguir:

NOME_DA_FUNCAO([<parametro1,parametro2..parametro>])
--> os parmetros so opcionais, por isto esto entre colchetes.

onde:

NOME_DA_FUNCAO: o nome da funo que ser executada.


Parmetro(1,2,N): so possveis valores que devero ser enviados.

Ex.: TODAY( )  essa uma funo que retorna a data atual. Note que ela no possui
parmetros.

COS(<nmero>)  essa uma funo que retorna o coseno de um nmero. Note que
o nmero no est entre colchetes, portanto obrigatrio.

Nota: Se voc executar em SQL uma funo que deveria obrigatoriamente enviar
parmetros ser gerado o seguinte erro:

wrong number of parameter to funcion cos (nmero de parmetros incorreto na funo cos)

38
Centro de Treinamento Domnio Construindo uma marca forte.

5.1. Funes de Agregao

Propsito: Agrupar as informaes de forma resumida de um nmero de linhas


determinado pela SQL.

Os comandos abaixo retornam o nmero de linhas de suas respectivas tabelas.

SELECT count()
FROM funcionarios

SELECT count()
FROM deptos

SELECT count()
FROM bancos

O comando abaixo totaliza o salrio de todos os funcionrios.

SELECT sum(salario)
FROM funcionarios

O comando abaixo totaliza o salrio de todos os funcionrios que pertencem ao


departamento de cdigo 4.

SELECT sum(salario)
FROM funcionarios
WHERE cod_depto = 4

O comando abaixo calcula a mdia de salrios.

SELECT avg(salario)
FROM funcionarios

O comando abaixo retorna o menor salrio dentre os funcionrios cadastrados.

SELECT min(salario)
FROM funcionarios

O comando abaixo retorna o maior salrio dentre os funcionrios cadastrados.

SELECT max(salario)
FROM funcionarios

O comando abaixo retorna uma lista de cdigos de funcionrios (separados por


vrgula) que pertencem ao departamento 4.

SELECT list(cod_func)
FROM funcionarios
WHERE cod_depto = 4

39
Centro de Treinamento Domnio Construindo uma marca forte.

5.2. Funes de Data e Hora

Propsito: Permite a converso, extrao e manipulao de informaes do tipo data e


hora.

O comando abaixo mostra na tela a data da mquina:

SELECT today()

O comando abaixo mostra na tela a data e hora da mquina:

SELECT getdate()

O comando abaixo converte a data e hora para apenas data:

SELECT date(getdate())

O comando abaixo mostra na tela o nome do dia da semana referente data da


mquina, porm em ingls:

SELECT dayname(today())

O comando abaixo mostra na tela o nome do ms referente data da mquina, porm


em ingls:

SELECT monthname(today())

O comando abaixo mostra na tela o cdigo e nome do funcionrio e o ano da sua data
de admisso:

SELECT cod_func,nome,dt_admissao,year(dt_admissao)
FROM funcionarios

O comando abaixo mostra na tela o cdigo e nome do funcionrio e o ano da sua data
de admisso acrescido de 1:

SELECT cod_func,nome,dt_admissao,years(dt_admissao,1)
FROM funcionarios

40
Centro de Treinamento Domnio Construindo uma marca forte.
O comando abaixo mostra na tela o cdigo e nome do funcionrio e o ano da sua data
de admisso deduzindo 1.

SELECT cod_func,nome,dt_admissao,years(dt_admissao,-1)
FROM funcionarios

O comando abaixo mostra na tela o cdigo e nome do funcionrio e h quantos anos o


funcionrio est admitido:
SELECT cod_func,nome,dt_admissao,years(dt_admissao,current date)
FROM funcionarios

Quando passamos como parmetro para a funo YEARS duas datas, ela interpreta
que queremos saber a diferena entre as datas, sendo assim ela calcula a (segunda data -
primeira data) e retorna o resultado em anos. Se as duas datas estiverem compreendidas dentro
do mesmo ano, o retorno ser zero.

O comando abaixo mostra na tela o cdigo e nome do funcionrio e o ms da sua data


de admisso.

SELECT cod_func,nome,dt_admissao,month(dt_admissao)
FROM funcionarios

O comando abaixo mostra na tela o cdigo e nome do funcionrio e o ms da sua data


de admisso, acrescido de 1.

SELECT cod_func,nome,dt_admissao,months(dt_admissao,1)
FROM funcionarios

41
Centro de Treinamento Domnio Construindo uma marca forte.
O comando abaixo mostra na tela o cdigo e nome do funcionrio e o ms da sua data
de admisso, deduzindo 1.

SELECT cod_func,nome,dt_admissao,months(dt_admissao,-1)
FROM funcionarios

O comando abaixo mostra na tela o cdigo e nome do funcionrio e h quantos meses


o funcionrio est admitido.

SELECT cod_func,nome,dt_admissao,months(dt_admissao,today())
FROM funcionarios

Quando passamos como parmetro para a funo MONTHS duas datas, ela interpreta
que queremos saber a diferena entre as datas, sendo assim ela calcula a (segunda data -
primeira data) e retorna o resultado em meses.

O comando abaixo mostra na tela o cdigo e nome do funcionrio e o dia da sua data
de admisso.

SELECT cod_func,nome,dt_admissao,day(dt_admissao)
FROM funcionarios

O comando abaixo mostra na tela o cdigo e nome do funcionrio e o dia da sua data
de admisso, acrescido de 1.

SELECT cod_func,nome,dt_admissao,days(dt_admissao,1)
FROM funcionarios

42
Centro de Treinamento Domnio Construindo uma marca forte.
O comando abaixo mostra na tela o cdigo e nome do funcionrio e o dia da sua data
de admisso, reduzindo 1.

SELECT cod_func,nome,dt_admissao,days(dt_admissao,-1)
FROM funcionarios

O comando abaixo mostra na tela o cdigo e nome do funcionrio e h quantos dias o


funcionrio est admitido.

SELECT cod_func,nome,dt_admissao,days(dt_admissao,today())
FROM funcionarios

Quando passamos como parmetro para a funo DAYS duas datas, ela interpreta que
queremos saber a diferena entre as datas, sendo assim ela calcula a (segunda data - primeira
data) e retorna o resultado em dias.

O comando abaixo mostra na tela o cdigo e nome do funcionrio e a hora do seu


nascimento.

SELECT cod_func,nome,dt_nascto,hour(dt_nascto)
FROM funcionarios

O comando abaixo mostra na tela o cdigo e nome do funcionrio e o minuto do seu


nascimento:

SELECT cod_func,nome,dt_nascto,minute(dt_nascto)
FROM funcionarios

43
Centro de Treinamento Domnio Construindo uma marca forte.
O comando abaixo mostra na tela o cdigo e nome do funcionrio e o(s) segundo(s) do
seu nascimento:

SELECT cod_func,nome,dt_nascto,second(dt_nascto)
FROM funcionarios

O comando abaixo mostra na tela todos os funcionrios que foram admitidos no ano
de 2001:

SELECT *
FROM funcionarios
WHERE year(dt_admissao) = 2001

5.3. Funes String

Propsito: Efetuar converses, extraes ou manipulaes com strings ou ento


retornar informaes sobre uma string.

Antes de utilizarmos funes para tratamento de strings, devemos saber o que uma
string. String uma seqncia de caracteres alfanumricos, ou seja, nessa seqncia podem
haver letras, nmeros, dgitos, sinais, etc. Qualquer palavra e letra tambm considerada uma
string. Todas as strings, quando no esto em seu formato varivel (no so variveis do tipo
string), devem estar entre aspas. Ex.: 017.061.079-94, Joao, 123456.

Soma de strings: JDK + 1.2.2  ir gerar uma string nica, unindo as duas
anteriores (concatenao): JDK1.2.2.

O comando abaixo mostra na tela todos os departamentos, porm em letras


minsculas:

SELECT lcase(nome)
FROM deptos

O comando abaixo mostra na tela todos os departamentos, porm em letras


maisculas:

SELECT ucase(nome)
FROM deptos

44
Centro de Treinamento Domnio Construindo uma marca forte.
O comando abaixo mostra na tela o cdigo, nome e data de admisso de todos os
funcionrios:

SELECT cod_func,nome,dt_admissao,left(dt_admissao,4)
FROM funcionarios

O ltimo comando onde foi utilizada a funo LEFT serve para mostrar o ano em que
o funcionrio foi admitido.

A funo LEFT pega um determinado nmero de caracteres partindo da esquerda. Esse


nmero definido no segundo argumento.

O comando abaixo mostra na tela o cdigo, nome e data de admisso de todos os


funcionrios:

SELECT cod_func,nome,dt_admissao,right(dt_admissao,2)
FROM funcionarios

O ltimo comando que foi utilizada a funo RIGHT serve para mostrar o dia em que
o funcionrio foi admitido.

A funo RIGHT pega um determinado nmero de caracteres partindo da direita. Esse


nmero definido no segundo argumento.

O comando abaixo mostra na tela o nome do departamento e quantos caracteres ele


possui:

SELECT nome,length(nome)
FROM deptos

O comando abaixo mostra na tela os caracteres (string) que digitamos entre aspas.

SELECT 'Teste de Funo'

O comando abaixo mostra na tela os caracteres (string) que digitamos entre aspas,
retirando possveis espaos em branco esquerda.

SELECT ltrim(' Teste de Funo')


45
Centro de Treinamento Domnio Construindo uma marca forte.
O comando abaixo mostra na tela os caracteres (string) que digitamos entre aspas,
retirando possveis espaos em branco direita:

SELECT rtrim('Teste de Funo ')

O comando abaixo mostra na tela os caracteres (string) que digitamos entre aspas,
retirando possveis espaos em branco a direita e a esquerda.

SELECT trim(' Teste de Funo ')

O comando abaixo mostra na tela o cdigo, nome e data de admisso do funcionrio.

SELECT cod_func,nome,dt_admissao, substr(dt_admissao,6,2)


FROM funcionarios

O ltimo dado a ser mostrado ser o ms da data de admisso do funcionrio, sendo


que para isto no estamos utilizando a funo mais apropriada, que seria a MONTH( ).

O comando abaixo mostra na tela o cdigo e nome do funcionrio separado por um


hfen.

Note que esse comando utiliza um operador matemtico para a soma de nmeros.
Porm, nesse caso no queremos somar nmeros e sim somar letras de forma a unir em uma
string nica (concatenao). Contudo, pela coluna cod_func ser um nmero inteiro, a SQL ir
pensar que estou querendo fazer uma soma de nmeros e no uma soma (concatenao) de
caracteres (string) e ir retornar um erro, pois no possvel somar um nmero mais uma
letra. Para solucionar isso, devemos antes transformar (converter) o que nmero para
caracter (string) para que a SQL saiba que estamos efetuando uma concatenao, conforme
segundo exemplo:

SELECT cod_func + ' - ' + nome


FROM funcionarios  retornar um erro

SELECT string(cod_func) + ' - ' + nome


FROM funcionarios

46
Centro de Treinamento Domnio Construindo uma marca forte.

6. Joins / Outer Joins

6.1. Produto Cartesiano (Relao entre Tabelas)

O objetivo gerar um subconjunto de um produto cartesiano, baseado em um conjunto


de domnios.

Quando relacionamos duas tabelas, ocorre o que matematicamente chamamos de


produto cartesiano, ou seja, cada elemento do conjunto domnio formar um par ordenado
com um elemento do conjunto imagem. Matematicamente falando, teremos o seguinte
exemplo:

A = {1,2} e B = {7,8,0}. Fazendo-se A X B teremos:

1 7
(1,7) (1,8)
8
2 (1,0) (2,7)
0 (2,8) (2,0)

R = {(1,7) (1,8) (1,0) (2,7) (2,8) (2,0)}

Perceba que o comando abaixo est mostrando o cdigo do funcionrio, o seu nome e
o nome do seu departamento. Nesse caso obrigatrio que se coloque o nome da tabela antes
da coluna nome, pois existem colunas com esse nome na tabela de funcionrios e deptos.
Sendo assim, a SQL no saberia a que nome voc se refere. Outro detalhe e o mais
importante, que esse SQL abaixo retornou para cada funcionrio tantas linhas quando
existiam na tabela de deptos, ou seja, fez exatamente o que foi descrito no diagrama anterior.
Considerou a tabela funcionrios como o conjunto A e a tabela deptos como o conjunto B e
efetuou um produto cartesiano das duas.

SELECT cod_func,funcionarios.nome,deptos.nome
FROM funcionarios,deptos

47
Centro de Treinamento Domnio Construindo uma marca forte.

Contudo, no queremos que esse tipo de informao seja mostrada na tela, pois
imagine um relatrio impresso mostrado nesse formato. Para solucionarmos esse problema,
devemos efetuar o relacionamento entre as duas tabelas para que retorne apenas uma linha
para cada funcionrio e com o nome correto do seu departamento. O comando a seguir
implementa isto:

SELECT cod_func,funcionarios.nome,deptos.nome
FROM funcionarios,deptos
WHERE funcionarios.cod_depto = deptos.cod_depto

Verifique que o comando anterior funcionou perfeitamente, pois s listou o nome dos
departamentos cujo cdigo igual ao cdigo presente na coluna cod_depto da tabela de
deptos. O fato de ter feito o relacionamento tambm eliminou a multiplicidade de linhas
(produto cartesiano). O comando abaixo funciona da mesma maneira, porm tem uma
vantagem em sua sintaxe, observe:

SELECT cod_func,funcionarios.nome,deptos.nome
FROM funcionarios KEY JOIN deptos

48
Centro de Treinamento Domnio Construindo uma marca forte.
Perceba que o comando anterior no possui o relacionamento na clusula WHERE,
pois esse est sendo efetuado automaticamente pela clusula KEY JOIN. Cuidado, essa
clusula s funciona perfeitamente quando sabe-se que o relacionamento entre as duas tabelas
direto, ou seja, como o relacionamento funcionrios  departamentos. Nesse
relacionamento no pode haver valor na coluna cod_depto de funcionrios que no exista na
tabela deptos, inclusive no podem haver valores NULL.

O comando abaixo seleciona o cdigo e nome do departamento, e seleciona


automaticamente todos os campos da tabela funcionrios.

SELECT deptos.cod_depto,deptos.nome,funcionarios.*
FROM funcionarios KEY JOIN deptos

6.2. Relacionamento (Outer Joins)

Existem ocasies onde relacionamos mais de uma tabela e que o contedo da coluna
que foi relacionada no existe na outra tabela.

Em nosso exemplo, na relao funcionrio/departamentos, por ser obrigatrio todo


funcionrio ter um departamento, no existe valor que esteja na coluna cod_depto de
funcionrios que no esteja na tabela de deptos. Mas se observarmos a coluna cod_banco
verificamos que alguns funcionrios possuem nessa coluna o valor NULL. Isto se faz
necessrio porque em nosso modelo pode acontecer de algum funcionrio no trabalhar com
nenhum banco e nesse caso no h necessidade de inform-lo.

Vamos supor ento que eu queira listar o cdigo, nome do funcionrio e nome do
banco de todos os funcionrios. Para os funcionrios que no trabalharem com banco, o nome
do mesmo no ser mostrado, mas o cdigo e nome do funcionrio sim.

Conforme visto at agora, utilizaramos:

SELECT cod_func,funcionarios.nome,bancos.nome
FROM funcionarios,bancos
WHERE funcionarios.cod_banco = bancos.cod_banco

Esse comando possui um problema. Ele s trar os funcionrios que possurem algum
valor no campo cod_banco da tabela de funcionrios, em funo da relao funcionrio 
banco, que diz que o cdigo do banco existente na tabela de funcionrios deve ser igual a um
cdigo existente na tabela de bancos. Porm, como vimos, o valor NULL, comparado a

49
Centro de Treinamento Domnio Construindo uma marca forte.
qualquer coisa NULL, e no caso desses relacionamentos sero desprezados os funcionrios
que possuem banco igual a NULL.

Para solucionar esse problema, utilizaremos o mesmo comando acima com uma
pequena diferena:
SELECT cod_func,funcionarios.nome,bancos.nome
FROM funcionarios,bancos
WHERE funcionarios.cod_banco *= bancos.cod_banco

Perceba que no relacionamento existe um asterisco (*). Esse asterisco, internamente


comunica SQL que:

Traga-me todas as linhas da tabela esquerda (funcionrios) mesmo que no exista


um valor relacionado na tabela da direita.

Mas e se a SQL estivesse dessa forma, primeiro a tabela bancos e depois a tabela
funcionrios?

SELECT cod_func,funcionarios.nome,bancos.nome
FROM funcionarios,bancos
WHERE bancos.cod_banco = funcionarios.cod_banco

Ento faramos isto:

SELECT cod_func,funcionarios.nome,bancos.nome
FROM funcionarios,bancos
WHERE bancos.cod_banco =* funcionarios.cod_banco

Os comandos a seguir so similares aos com asterisco e fazem o relacionamento


automaticamente:

SELECT cod_func,funcionarios.nome,bancos.nome
FROM funcionarios LEFT OUTER JOIN bancos ( *= )

50
Centro de Treinamento Domnio Construindo uma marca forte.

SELECT cod_func,funcionarios.nome,bancos.nome
FROM bancos RIGHT OUTER JOIN funcionarios ( =* )

51
Centro de Treinamento Domnio Construindo uma marca forte.

7. Exerccios de Reviso 2

1 Selecionar todas as informaes da tabela de funcionrios em ordem descendente de


salrios somente para os funcionrios que foram admitidos em 1985.

2 Selecionar todas as informaes da tabela de funcionrios e mostrar tambm na tela a


idade de cada um, sendo que no cabealho da SQL deve constar Idade.

3 Selecionar o cdigo e nome do departamento, e quantos funcionrios existem em cada


departamento com admisso em 1985. Deve estar ordenado alfabeticamente por nome do
departamento.

4 Selecione todos os bancos que tenham em alguma posio a palavra Brasil. No


cabealho deve aparecer Codigo_do_Banco e Nome_do_Banco.

5 Selecione todos os funcionrios que tenham sido admitidos depois do dia primeiro de
1990, que tenham salrio maior que R$ 500 reais e nascido ao meio dia.

6 Selecione todos os funcionrios que no possuem banco. O funcionrio que no possui


banco tem valor NULL na coluna cod_banco.

7 Selecione todos os funcionrios do departamento Financeiro. No pode utilizar o cdigo


do departamento para a seleo dos funcionrios.

8 Selecione todos os funcionrios em que o salrio seja maior ou igual a R$ 200,00 e menor
ou igual a R$ 500,00.

9 Mostre na tela o nome do dia da semana que cair o seu aniversrio.

10 Selecione todos os funcionrios que trabalham com o seguintes bancos: (1,3,4)

11 Selecione o nome e salrio acrescido de 2% para os funcionrios que trabalham com


banco e no pertenam ao departamento de cdigo 4. O nome do funcionrio deve estar
escrito em minsculo.

12 Mostre o cdigo do funcionrio, nome do funcionrio, cdigo do banco, nome do banco,


cdigo do departamento e nome do departamento. O nome do departamento deve estar sempre
em maisculo e o nome do banco sempre em minsculo. A SQL deve estar ordenado por
cdigo do funcionrio. Se for preciso utilizar o nome da tabela antes do campo, deve-se
utilizar um apelido.

13 Mostrar qual o menor e maior cdigo de departamento cadastrado.

14 Mostrar o cdigo, nome e data de nascimento do funcionrio, sendo que essa data deve
desprezar a hora/minuto/segundo. Somente devem ser mostrados os funcionrios que tiverem
mais de 21 anos.

52
Centro de Treinamento Domnio Construindo uma marca forte.
15 Mostrar o cdigo e nome do funcionrio. Tambm deve ser mostrado o dia/ms/ano do
nascimento do funcionrio no seguinte formato: Dia: dd Ms: mm Ano: yyyy.

16 O comando a seguir selecionar o que em sua tabela?

SELECT nome, salrio _____________________________________________

FROM funcionrios _____________________________________________

WHERE cod_depto _____________________________________________

IN ('1','2') _____________________________________________

_____________________________________________

53
Centro de Treinamento Domnio Construindo uma marca forte.

8. Caderno de Respostas

8.1. Exerccios de Reviso Banco de Dados

R: (1) Conjunto de dados dispostos numa ordem pr-determinada em funo de um projeto.

R: (2) Tabela um quadro onde se indica alguma coisa.

R: (3) um conjunto de colunas que ficam dispostas horizontalmente. Todas as linhas que
possuem o mesmo nmero de colunas.

R: (4) SQL uma Linguagem destinada definio e manipulao desses bancos.

R: (5) DDL create, alter, drop


DML insert, delete, up_date, select

R: (6) Chave primria uma coluna ou conjunto de colunas (chave composta) que identifica
de forma nica os demais dados de uma linha dada. Por exemplo: na tabela funcionrios o
cod_func identifica cada linha. Assim, duas linhas no podem ter a mesma chave primria.

R: (7)
(1) Aritmtico (2) Lgico (3) Relacional

(3)= (1)-
(1)+ (3)>
( 3 ) !< ( 2 ) OR
(1)/ ( 3 ) !>
( 3 ) >= (1)*
( 2 ) AND ( 3 ) <=
( 3 ) != (3)<
( 3 ) <>

8.2. Exerccios de Reviso Modelo Proposto

R: (1) funcionrios

R: (2) Char

R: (3) Date, Char

8.3. Exerccios de Reviso 2

R: (1)
Select *
from funcionarios
where years(dt_admissao) = 1985
order by salario DESC
54
Centro de Treinamento Domnio Construindo uma marca forte.
R: (2)
Select *,
'Idade' = years(dt_nascto,today())
from funcionarios

R: (3)
select deptos.cod_depto,deptos.nome,
Tot_func= (select count()
from funcionarios
where funcionarios.cod_depto = deptos.cod_depto and
year(dt_admissao) = 1985)
from deptos
order by deptos.nome asc

R: (4)
select 'Codigo do banco' = bancos.cod_banco,
'Nome do banco' = bancos.nome
from bancos
where nome like '%Brasil%'

R: (5)
select *
from funcionarios
where dt_admissao > '1990/01/01' and
salario > 500 and
hour(dt_nascto) = 12

R: (6)
select *
from funcionarios
where cod_banco is null

R: (7)
select *
from funcionarios key join deptos
where deptos.nome = 'Financeiro'
ou
select *
from funcionarios, deptos
where funcionarios.cod_depto = deptos.cod_depto and
deptos.nome = 'Financeiro'

R: (8)
select *
from funcionarios
where salario >= 200 and salario <= 500
ou
select *
from funcionarios
where salario between 200 and 500

R: (9)
select dayname('2002/06/24')

R: (10)
select *
from funcionarios
where cod_banco in (1,3,4)

55
Centro de Treinamento Domnio Construindo uma marca forte.
R: (11)
select lcase(nome),(salario * 1.02)
from funcionarios
where cod_banco is not null and cod_depto <> 4

R: (12)
select cod_func,func.nome,func.cod_banco,ba.nome,func.cod_depto,
de.nome
from funcionarios func,bancos ba, deptos de
where func.cod_banco = ba.cod_banco and func.cod_depto = de.cod_depto
order by cod_func

R: (13)
select max(cod_depto),min(cod_depto)
from deptos

R: (14)
select cod_func,nome,date(dt_nascto)
from funcionarios
where years(dt_nascto,today()) > 21

R: (15)
select cod_func,nome,'Dia: ' + right(date(dt_nascto),2) ,
'Ms: ' + substr(dt_nascto,6,2),'Ano: ' + left(dt_nascto, 4)
from funcionarios

56
Centro de Treinamento Domnio Construindo uma marca forte.

9. Tabelas Modelo

TABELA DE FUNCIONRIOS (funcionrios)


cod_func nome cod_depto salrio dt_admisso Dt_nascto cod_banco
1 Joo Anastcio 1 500,00 1995-01-01 1975-01-02 15:12:13 1
2 Pedro Brasona 2 800,00 2001-02-05 1980-12-01 17:12:14 2
3 Manoel da R. Pizzolo 3 1500,00 1990-05-02 1930-10-08 12:00:00 3
4 Joo Malha 4 189,00 1999-04-10 1988-04-04 13:00:00 4
5 Antnio Nascimento 3 200,00 1985-01-10 1967-01-10 13:00:00 (NULL)
6 Maria de Jesus 4 180,00 1985-02-11 1967-02-11 13:00:00 (NULL)
7 Raimundo Pizzolo 4 180,00 1985-02-11 1967-02-11 14:00:00 (NULL)

TABELA DE DEPARTAMENTOS (deptos)


cod_depto Nome
1 Recursos Humanos
2 Desenvolvimento
3 Financeiro
4 Editorao

TABELA BANCOS (bancos)


cod_banco Nome agencia numero_banco
1 Banco do Brasil 0407-3 6620-6
2 Bradesco 500-4 1246-88
3 Bradesco 345-1 1232-2
4 Ita 2323-24 34534

57

Potrebbero piacerti anche