Apresenta-Se Um Resumo Da Teoria Da Linguagem SQL, Com Exemplos, Extraído, Com Algumas Modificações, Da Apostila Do Prof. Dr. Luiz Camolesi Júnior
Apresenta-Se Um Resumo Da Teoria Da Linguagem SQL, Com Exemplos, Extraído, Com Algumas Modificações, Da Apostila Do Prof. Dr. Luiz Camolesi Júnior
64/
/,1*8$*(064/
,1752'8d2
Desenvolvida e implementada pelo Laboratório de Pesquisas da IBM em San Jose (hoje o Centro de
Pesquisa Almaden) entre os anos de 1964 e 1969, a Linguagem SQL (“Structured Query
Language”), inicialmente chamada “SEQUEL”, foi criada como uma forma de interface entre os
usuários e o primeiro Sistema de Gerenciamento de Bancos de Dados Relacional denominado
System R. É uma das mais conhecidas linguagens de manipulação de bancos de dados relacionais
devido à sua simplicidade e ao grande poder de consulta, sendo adotada por diversos SGBDs
Relacionais existentes comercialmente.
3$'521,=$d2
Diversas tentativas de padronização da SQL foram realizadas de modo a criar um conjunto de
comandos e operandos de uso comum entre os diversos ambientes, possibilitando maior interação
entre usuários e os dados.
O “American National Standard Institute” (ANSI) publicou em 1986 um padrão, a IBM publicou
seu próprio padrão e outros padrões surgiram desde então, como é o caso do 64/ (no qual se
baseia o assunto aqui tratado) e posteriormente SQL3. Independente da versão, os comandos da
SQL podem ser divididos em três conjuntos:
•Linguagem de Definição de Dados (DDL): inclui comandos para definir, alterar e
remover tabelas e índices;
•Linguagem de Manipulação de Dados (DML): inclui comandos para inserir, remover,
atualizar e consultar os dados armazenados nas tabelas;
•Linguagem de Controle de Dados (DCL): incluir comandos para se trabalhar em
ambiente multi-usuário, permitindo estabelecer níveis de segurança e manipular transações.
(;(03/2
Para ilustrar o assunto abordado em seções posteriores, será adotado o seguinte exemplo:
Suponha que a empresa construtora de veículos especiais “Star Trek” necessita armazenar, em seu
Banco de Dados, informações sobre as peças que utiliza em cada projeto de veículo e os
fornecedores dessas peças. O Banco de Dados deve ser capaz de oferecer respostas rápidas e
precisas sobre as peças, fornecedores e projetos realizados, bem como associações entre esses
elementos, ou seja, a quantidade de peças fornecida por uma determinada empresa e utilizadas em
um projeto.
1
ISO/IEC - International Organization for Standardization / International Electrotechnical Commission
3
As PEÇAS são identificadas por um número, sendo utilizada a cor das gavetas onde estão colocadas
as peças para uma localização visual mais rápida por parte dos funcionários. Para a especificação
das compras são necessários o nome e o preço atual de cada peça.
Para a emissão correta das notas de compra e dos pagamentos é necessário o nome dos
FORNECEDORES bem como a cidade e um número de identificação. A categoria de cada
fornecedor é utilizada para indicar a qualidade de seus produtos e serviços.
OS PROJETOS de veículos construídos pela “Star Trek” possuem um nome, número de
identificação, a duração para a montagem do veículo e o custo de cada veículo (incluindo peças e
serviços).
Considere que o seguinte esquema relacional foi desenvolvido para suprir as necessidades dos
usuários:
Peça
3H1UR 3H1RPH 3H3UHoR GyODU 3H&RU
PE1 Cinto 22 Azul
PE2 Volante 18 Vermelho
PE3 Lanterna 14 Preto
PE4 Limpador 09 Amarelo
PE5 Painel 43 Vermelho
Fornecedor
)1UR )QRPH )&LGDGH )&DWHJ
F1 Plastec Campinas B
F2 C&M São Paulo D
F3 Kirurgic Campinas A
F4 Piloto’s Piracicaba A
F5 Equipament São Carlos C
Projeto
31UR 3QRPH 3'XUDomR PrV 3&XVWR GyODU
P1 Detroit 5 43.000
P2 Pegasus 3 37.000
P3 Alfa 2 26.700
P4 Sea 3 21.200
P5 Paraíso 1 17.000
4
Fornece_para
3H1UR )QUR 31UR 4XDQW
PE1 F5 P4 5
PE2 F2 P2 1
PE3 F3 P4 2
PE4 F4 P5 3
PE5 F1 P1 1
PE2 F2 P3 1
PE4 F3 P5 2
7,326'('$'26
Os tipos de dados mais usuais são: INTEGER ou INT (-32768 a 32767), SMALLINT (0 a 65535),
FLOAT (-2147483648 a 2147483647), REAL (1.17E-38 a 3.4E+38), DOUBLE PRECISION
(2.2E-308 a 1.7E+308), DECIMAL (i,j) onde i é o total de casas decimais e j é o total de casas
decimais depois do ponto (até 18), CHAR (n) onde n é a quantidade fixa de caracteres (até 60000),
VARCHAR (n) onde n é a quantidade máxima de caracteres (até 60000), BIT(n) onde n é a
quantidade fixa de bits, BIT VARYING(n) onde n é a quantidade máxima de bits, DATE que são
dez posições no formato aaaa-mm-dd, TIME que são 8 posições no formato hh:mm:ss, TIME(i)
onde i é uma fração de segundo (ex.: 67 centésimos de segundo) e TIMESTAMP. Pode-se
encontrar outros tipos reconhecidos pelos compiladores.
7,326'((5526
Cada implementação possui sua forma de tratar e informar sobre os erros ocorridos durante a
execução de qualquer comando. Pode-se encontrar diversos tipos de erros gerados pelos
compiladores, normalmente utilizando uma variável global de retorno (ex. SQLCODE)
23(5$'25(6
/yJLFRV $ULWPpWLFRV 5HODFLRQDLV
AND + < <=
OR - > >=
NOT * <> =
/ LIKE, BETWEEN
&RQMXQWXUDLV
=ANY <ANY <ALL EXISTS IN
>ANY >=ANY >ALL NOT EXISTS NOT IN
<=ANY <>ANY <>ALL
)81d®(6
AVG - obtém o valor médio de uma coluna
COUNT - obtém a soma da quantidade de linhas analisadas
MAX - obtém o maior valor de uma coluna
MIN - obtém o menor valor de uma coluna
5
3$/$95$65(6(59$'$6
As palavras reservadas estão apresentadas nesta apostila em letras maiúsculas.
/,1*8$*(0'('(),1,d2'('$'26 ''/
Sintaxe:
&5($7(7$%/(QRPHBWDEHOD
QRPHBFROXQDWLSR>12718//@>6(7'()$8/7YDORU@
35,0$5<.(< QRPHBFROXQD
>&21675$,17 QRPHBUHVWULomR @
>81,48( QRPHBFROXQD @
>)25(,*1.(< QRPHBFROXQD
5()(5(1&(6QRPHBWDEHOD QRPHBFROXQD
21'(/(7(&$6&$'(6(718//6(7'()$8/7
2183'$7(&$6&$'(6(718//6(7'()$8/7@
Exemplos:
&5($7(7$%/(3HoD
3H1UR
&+$5 12718//
3H1RPH
&+$5 12718//
3H3UHoR
5($/ 12718//
3H&RU
&+$5
35,0$5<.(< 3H1UR
&5($7(7$%/()RUQHFHGRU
)1UR&+$5 12718//
)1RPH
&+$5 12718//
)&LGDGH
&+$5 12718//
)&DWHJ
&+$5 12718//
35,0$5<.(< )1UR
Sintaxe:
$/7(57$%/(QRPHBWDEHOD
>$''&2/801QRPHBFROXQDWLSR>12718//@@
>'523&2/801QRPHBFROXQD>&$6&$'(5(675,&7@@
6
Sintaxe:
'5237$%/(QRPHBWDEHOD&$6&$'(5(675,&7
Exemplo:
'5237$%/(3HoD&$6&$'(
Criação de uma tabela indexadora para uma tabela. Uma tabela indexadora criada previamente para
uma consulta diminui o tempo necessário para a apresentação da resposta.
Sintaxe:
&5($7(,1'(;QRPHBWDEHODBtQGLFH
21QRPHBWDEHOD QRPHBFROXQD>$6&_'(6&@
Exemplo:
&5($7(,1'(;FyGLJRBSHoD
213HoD 3H1UR $6&
Sintaxe:
'523,1'(;QRPHBWDEHODBtQGLFH
Exemplo:
'523,1'(;FyGLJRBSHoD
7
/,1*8$*(0'(0$1,38/$d2'('$'26 '0/
&RQVXOWDVDR%DQFRGH'DGRV
O comando SELECT ... FROM ... WHERE ... possibilita consultar uma ou mais tabelas de acordo
com critérios estabelecidos.
Sintaxe:
6(/(&7 >',67,1&7@QRPHBFROXQD
)520 QRPHBWDEHOD
>:+(5( FRQGLo}HV @
>*5283%< QRPHBFROXQD@
>+$9,1* FRQGLo}HV @
>^,17(56(&7_0,186_81,21`FRPDQGRBVHOHFW@
>25'(5%< QRPHBFROXQD^$6&_'(6&`@
Cláusulas:
Observações:
Esse comando se tornou o mais importante da linguagem SQL devido ao seu poder de consulta. A
possibilidade de utilização das operações relacionais (união, diferença, interseção e obviamente
seleção) com extrema simplicidade na manipulação das tabelas despertou o interesse dos
pesquisadores e projetistas de gerenciadores de Bancos de Dados, de tal modo que diversos
ambientes e linguagens de programação estão embutindo esse comando (Select-From-Where) em
suas bibliotecas de operações e funções.
Exemplo 5 (Operador Relacional): Obtenha o nome dos projetos de custo menor que $28000
Exemplo 6 (Operador Lógico): Obtenha os nomes das peças de cor vermelha e com preço maior
que $ 25
Exemplo 7 (Order by): Obtenha, em ordem decrescente de preço, os nomes das peças de cor
vermelha e com preço maior que $ 15
6(/(&7 3H1RPH
3H1RPH
)520 3HoD
:+(5( 3H&RU µ9HUPHOKR¶ Painel
$1' 3H3UHoR! Volante
25'(5%< 3H3UHoR'(6&
Exemplo 8 (In): Obtenha, em ordem crescente de preço, o nome das peças de cor vermelha ou
amarela e com preço de $09, $ 18, $ 22 , $40 ou $ 90
Exemplo 9 (Not): Obtenha o nome das peças cujo preço não é $ 09, $14, $60
3H1RPH
6(/(&7 3H1RPH Cinto
)520 3HoD Volante
:+(5( 3H3UHoR127,1 Painel
Exemplo 10 (Like): Obtenha o nome dos fornecedores residentes em cidades iniciadas com a letra S
Exemplo 11 (Between): Obtenha o nome dos projetos com preço entre $20000 e $30000
31RPH
6(/(&7 31RPH
)520 3URMHWR Alfa
Sea
:+(5( 3&XVWR%(7:((1$1'
Exemplo 12 (Uso explícito da relações): Obtenha o código dos fornecedores para o projeto P5
Exemplo 16 (SubSelect): Obtenha o nome das peças utilizadas nos projetos com duração maior que
3 meses
Exemplo 17 (Any): Obtenha o nome das peças fornecidas por algum fornecedor de Piracicaba
6(/(&7 3HoD3H1RPH
3H1RPH
)520 3HoD Limpador
:+(5( 3HoD3H1UR,1
6(/(&7 3H1UR 3H1UR
)520 )RUQHFHBSDUD PE4
:+(5( )1UR $1<
6(/(&7 )1UR )1UR
)520 )RUQHFHGRU
F4
:+(5( )&LGDGH µ3LUDFLFDED¶
Exemplo 18 (All): Obtenha o nome das peças não fornecidas por fornecedores de categoria A
3H1RPH
6(/(&7 3H1RPH Cinto
)520 3HoD Volante
Painel
:+(5( 3H1UR,1 3H1UR
6(/(&7 ',67,1&73H1UR PE1
)520 )RUQHFHBSDUD PE2
:+(5( )1UR!$// PE5
6(/(&7 )1UR )1UR
)520 )RUQHFHGRU F3
:+(5( )&DWHJ µ$¶ F4
12
Exemplo 19 (Exists): Obtenha os nomes dos fornecedores que fornecem a peça PE2
6(/(&7 )RUQHFHGRU)1RPH
)520 )RUQHFHGRU )1RPH
:+(5( (;,676 C&M
6(/(&7
)520 )RUQHFHBSDUD
:+(5( )RUQHFHBSDUD)1UR )RUQHFHGRU)1UR
$1' )RUQHFHBSDUD3H1UR µ3(¶
Exemplo 20 (Group By): Obtenha a quantidade de cada peça utilizada em todos o projetos
3H1UR
6(/(&7 3H1UR680 4XDQW PE1
)520 )RUQHFHBSDUD PE2
*5283%< 3H1UR PE3
PE4
PE5
Exemplo 21 (Having): Obtenha os códigos das peças que são utilizadas em uma quantidade inferior
a 5 unidades na somatória de todos os projetos
3H1UR
6(/(&7 3H1UR680 4XDQW
PE2
)520 )RUQHFHBSDUD PE3
*5283%< 3H1UR PE5
+$9,1* 680 4XDQW
Exemplo 22 (Union): Obtenha os códigos das peças com preço menor que $ 20 ou que possuem a
cor vermelha
Exemplo 23 (Intersect): Obtenha os códigos das peças com preço menor que $ 20 e que possuem a
cor vermelha
3H1UR
6(/(&7 3H1UR PE2
)520 3HoD PE3
:+(5( 3H3UHoR PE4
,17(56(&7 3H1UR
6(/(&7 3H1UR PE2
3H1UR
)520 3HoD
PE2
:+(5( 3H&RU µ9HUPHOKR¶
PE5
Exemplo 24 (Minus): Obtenha os códigos das peças com preço menor que $ 20 e que não possuem
a cor vermelha
3H1UR
6(/(&7 3H1UR PE2
)520 3HoD PE3
:+(5( 3H3UHoR PE4
3H1UR
0,186 PE3
6(/(&7 3H1UR PE4
)520 3HoD 3H1UR
:+(5( 3H&RU µ9HUPHOKR¶ PE2
PE5
6(/(&7 ;)1UR<)1UR
)520 )RUQHFHBSDUD$6;)RUQHFHBSDUD$6<
:+(5( ;3H1UR <3H1UR
$1' ;)1UR!<)1UR ;)1UR <)1UR
F4 F3
F3 F4
6(/(&7 ;3H1UR<3H1UR
)520 3HoD$6;3HoD$6<
:+(5( ;3H&RU <3H&RU
$1' ;3H1UR!<3H1UR ;3H1UR <3H1UR
PE2 PE5
PE5 PE2
14
Exemplo 27 (Natural Join): Obtenha o nome das peças fornecidas que tenham o preço maior que
$20
6(/(&7 ',67,1&73H1RPH
)520 3HoD1$785$/-2,1)RUQHFHBSDUD
:+(5( 3H3UHoR!
Exemplo 28 (Equi Join): Obtenha o nome das peças fornecidas que não são vermelhas e as suas
cores
6(/(&7 ',67,1&73H1RPH3H&RU
)520 3HoD-2,1)RUQHFHBSDUD213H1UR 3H1UR
:+(5( 3H&RU!µ9HUPHOKR¶
6(/(&7
)520 3HoD/()7287(5-2,1)RUQHFHBSDUD213H1UR 3H1UR
$WXDOL]DomRGR%DQFRGH'DGRV
Inclusão de dados em uma tabela.
Sintaxe:
,16(57
,172 QRPHBWDEHOD QRPHBFROXQD
9$/8(6 YDORU
,16(57
,172 3HoD 3H1UR3H1RPH3H3UHoR3H&RU
9$/8(6 µ3(¶µ(VSHOKR¶µ$]XO¶
Sintaxe:
83'$7( QRPHBWDEHOD
6(7 QRPHBFROXQD YDORU
:+(5( FRQGLomRGHORFDOL]DomR
83'$7( 3HoD
6(7 3H3UHoR
:+(5( 3H1UR µ3(¶
Sintaxe:
'(/(7()520QRPHBWDEHOD
:+(5( FRQGLomRGHORFDOL]DomR
'(/(7()5203HoD
:+(5( 3H1UR µ3(¶
16
(;(5&Ë&,26
1) Crie uma tabela de indexação para a tabela de clientes criada anteriormente.
3) Obtenha o nome dos projetos com duração entre 3 e 5 inclusive, e que possuem um preço
menor que $ 40.000.
4) Quais os nomes das peças com preço maior que $ 20 e que são fornecidas por empresas de São
Paulo e utilizadas por projeto com duração maior que 2 meses.
6) Obtenha o nome das peças que não são utilizadas em nenhum projeto.
%,%/,2*5$),$&203/(0(17$5
[ 1 ] Guide to SQL - Quick Reference
John Viescas
Microsoft Press - 1989
[ 2 ] Draft - ISO/SQL3
ISO/ANSI 1993 - Subcomissão de Estudos da Linguagem SQL