SQL Apostila Boa para Curso
SQL Apostila Boa para Curso
SQL Apostila Boa para Curso
linguagem SQL
Autor:
Jair Daum Franceschini
Objetivos............................................................................................................................3
A linguagem SQL..............................................................................................................3
Database – Banco de Dados (BD) .....................................................................................3
Database Management System (Sistema Gerenciador de Dados).....................................3
Terminologia .....................................................................................................................4
Tabelas...............................................................................................................................4
Linhas e Colunas ...............................................................................................................4
Acessando os dados / Chaves primárias ............................................................................5
Pessoal do Banco de Dados e funções de trabalho............................................................5
Formando uma tabela ........................................................................................................6
Recuperando os dados de uma tabela................................................................................6
O banco de dados Pubs2....................................................................................................7
Escolhendo um banco de dados.........................................................................................7
Simples recuperação – Select / From ................................................................................8
Eliminando duplicações.....................................................................................................9
Recuperação qualificada – Select / From / Where ............................................................9
Renomeando Colunas......................................................................................................14
Strings de caracteres nos resultados da query .................................................................15
Expressões numéricas......................................................................................................15
Valores nulos ...................................................................................................................18
Select / order by...............................................................................................................19
Funções agregadas...........................................................................................................20
Lidando com valores nulos..............................................................................................21
Selecto/Group by .............................................................................................................22
Operação de união “JOIN”..............................................................................................25
“JOINS” baseados em igualdade.....................................................................................26
Aliases .............................................................................................................................27
“JOINS” não baseados em igualdade ..............................................................................27
Self-Joins .........................................................................................................................28
Unindo mais de duas tabelas ...........................................................................................29
Outer joins (joins externos) .............................................................................................29
Escrevendo subqueries ....................................................................................................30
Razões para usar subqueries............................................................................................31
Subqueries - restrições.....................................................................................................31
Múltiplos níveis de aninhamento.....................................................................................31
Subqueries retornando múltiplas linhas...........................................................................32
Subqueries com operadores de comparação....................................................................33
Exists ...............................................................................................................................34
Unions..............................................................................................................................36
Criando uma tabela a partir de outra existente ................................................................37
Modificando dados – incluindo dados.............................................................................38
Modificando dados – atualizando dados .........................................................................40
Modificando dados – deletando dados ............................................................................41
Removendo definições de dados .....................................................................................42
Objetivos
Ao término da apresentação, o leitor deve estar apto a usar a linguagem SQL para:
• Fazer um acesso básico (query) de um BD existente;
• Usar funções de construção para realizar manipulação de dados;
• Obter informação derivada do BD;
• Agregar dados que foram recuperados de um BD;
• Agrupar e limitar dados recuperados do BD;
• Unir uma ou mais tabelas para recuperar dados do BD;
• Realizar queries de dados usando subqueries;
• Criar uma tabela simples e incluir, atualizar e deletar dados.
A linguagem SQL
Terminologia
• Tabela (relação)
o um conjunto de linhas, ou um conjunto de listas de valores, uma “relação”.
• Coluna (atributo)
o Semelhante à campo de um registro;
o Cada coluna em cada linha tem apenas um conteúdo;
o Cada coluna é só de um tipo de dados.
• Linha (dupla)
o Análogo a um registro de um arquivo;
o Todas linhas de uma tabela tem o mesmo conjunto de colunas.
• Chave Primária (Primary Key)
o Uma ou mais colunas com valores que são únicos dentro da tabela e por isso
podem ser usados para identificar as linhas dessa tabela.
• Domínio
o Conjunto de valores válidos para uma determinada coluna.
Tabelas
• Modelo Relacional
o Num BD relacional todos os dados estão em tabelas;
o A tabela mantém dados relacionados a urna determinada classe de objetos.
• Tabelas são feitas de linhas e colunas
o Existe somente um valor de dado para cada coluna de cada linha.
Linhas e Colunas
• Colunas
o Cada coluna tem um nome.
Cada coluna contém dados sobre um aspecto da tabela;
Cada coluna contém dados de um só tipo, por exemplo:
• número inteiro;
• string de caracteres;
• etc.
• Linhas
o Cada linha contém dados relacionados a uma citação da tabela;
o As linhas não estão em qualquer ordem determinada.
• Cria a Tabela
create table stores
(stor_id char(4) not null,
stor_name varchar(40) not null,
stor_address varchar(40) null,
city varchar(40) null,
state char(2) null,
country varchar(12) null,
postalcode char(5) null,
dayterms varchar(12) null)
go
• Inclui os dados
Exemplo:
insert into stores (stor_id stor name stor_address, city, state,
country, postalcode, dayterrns)
values (“7066”, “Barnum’s” , “567 Pasadena Ave”, “Tustin”
“CA”,”USA”,”92745”,”Net 30”)
• Recuperando o dado
select *
from stores
• Convenção de nomes
database.owner.table_name.column_name
Exemplo:
pubs2.bob.stores.stor_id;
pubs2.fred.stores.stor_name.
Titles
Authors Salesdetail
Titleauthor Royched
Publishers Discounts
Stores Blurbs
Sales Au_pix
Exemplo:
o (sem distinct)
select state
from stores
(Lista os estados da tabela stores)
o (com distinct)
select distinct state
from stores
(Lista uma ocorrência para cada estado existente na tabela stores)
• where: cláusula que determina exatamente que linhas devem ser recuperadas.
Sintaxe simplificada:
o select lista_do_select
from lista_de_tabelas
where condições_de_pesquisa
• Condições na cláusula where
o Operadores de comparação (=,>,<);
o Intervalos (between and not between);
o Caracteres semelhantes (like and not like);
o Valores desconhecidos (is null and is not null);
o Listas(in and not in);
o Combinações (and,or).
• not pode negar qualquer expressão booleana e palavras chave, tais como “like”,
“null”, “between”, e “in”.
• operadores de comparação
= Igual a
> Maior que
< Menor que
>= , !< Maior ou igual a
<= , !> Menor ou igual a
!= , <> Diferente
Exemplo:
o (igual)
select stor_name, state
from stores
where state = ‘CA’
(Lista as lojas que se localizam na Califórnia)
o (não igual)
select stor_name, city, state
from stores
where state != ‘CA’
(Lista as lojas que não se localizam na Califórnia)
o (maior que)
select stor_id, stor_name
from stores
where stor_id > ‘7066’
(Lista os códigos e nomes das lojas que possuem código maior que ‘7066’)
o (menor que)
select city, stor_name
from stores
where city < ‘Remulade’
(Lista os nomes das lojas e as cidades das lojas que se localizam em cidades
cujo nome é alfabeticamente inferior a ‘Remulade’)
• between: palavra chave usada para especificar uma série que compreende, de um
valor mais baixo até um valor mais alto, para a pesquisa.
Exemplo:
select stor_id stor_name, city, state
from stores
where stor_id between ‘7067’ and ‘8000’
(Lista as lojas que possuem os códigos entre 7067 e 8000 inclusive)
• not between: palavra chave usada para excluir os dados fora da série entre o mais
baixo e o mais alto valor especificado (Fora do intervalo).
Exemplo:
select stor_id, stor_name, city, state
from stores
where stor_id between ‘7067’ and ‘8000’
(Lista as lojas que possem os códigos fora do intervalo 7067 e 8000.)
• like: palavra chave usada para selecionar linhas que contém campos que se
assemelham em uma determinada porção do string.
o É usado somente com char , varchar e datetime;
o Pode usar coringas
o Significado dos coringas
% (porcentagem), qualquer string de zero ou mais
caracteres;
_ (anderscore), qualquer caractere simples;
[] (colchetes), qualquer caractere simples dentro da série
especificada;
[^] (colchetes e acento circunflexo), qualquer caractere
simples fora da série especificada.
o Coloque os coringas e o string de caracteres entre aspas simples.
Exemplo:
o Like
Select stor_name
From stores
Where stor_name like ‘B%’
(lista os nomes das lojas cujos nomes comecem com a letra B)
o Not Like
Select sor_name
From stores
Where stor_name not like ‘B%’
(lista os nomes das lojas cujos nomes não comecem com a letra B)
o Especificando o número de caracteres
Select stor_id, stor_name
From stores
Where stor_id like ‘70__’
(lista as lojas cuja identificação possua nas duas primeiras posições 70)
o Intervalo de caracteres
Select stor_name
From stores
Where stor_name like ‘[D-F]%’
(lista os nomes das lojas cujos nomes comecem com a letra D, E ou F)
o Fora do intervalo de caracteres
Select stor_name
From stores
Where stor_name like ‘[^D-F]%’
(lista os nomes das lojas cujos nomes não comecem com a letra D, E ou F)
o Dois intervalos
Select stor_name
From stores
Where stor_name ‘[A-C, G-Z]%’
(lista os nomes das lojas cujos nomes comecem com a letra A, B, C ou de G
à Z)
• in, not in: palavra chave que permite que você selecione valores que se assemelham
ou não com qualquer valor de uma lista de valores.
Exemplo:
o in
select stor_name, city, state
from stores
where state in (‘CA’, ‘WA’)
(lista as lojas que se realizam em Washington ou na Califórnia)
o not in
select stor_name, city, state
from stores
where state not in (‘CA’, ’WA’)
(lista as lojas que se não localizam em Washington e nem na Califórnia)
• and: une duas os mais condições. Retorna resultados somente quando todas
condições são verdadeiras.
Exemplo:
o select stor_name, city, state
from stores
where state = ‘CA’
and city = ‘Fremont’
(lista as lojas localizadas na cidade de Fremont no estado da Califómia)
• or: conecta duas ou mais condições. Retoma resultados quando qualquer uma das
condições é verdadeira. É compreensivo.
Exemplo:
o select stor_name, city, state
from stores
where state = ‘CA’
or city = ‘Portland’
(lista as lojas localizadas na cidade de Portland ou no estado da Califórnia)
Quando mais de um operador lógico é usado, a ordem na qual eles são executados
é:
not
and
or
Parênteses podem alterar o significado de uma pergunta para forçar a ordem de
execução
Exemplos:
o sem parênteses
select title_id, type, advance
from titles
where type = ‘business’ or
type = ‘psychology’ or
advance> 5500
(lista os livros da categoria business, ou categoria psychology, ou com
adiantamento maior que U$ 5500)
o com parênteses
select title_id, type, advance
from titles
where (type = ‘business’ or
type = ‘psychology’) and
advance> 5500
(lista os livros da categoria business, ou categoria psychology, e desses
somente os que possuem adiantamento maior que U$ 5500)
Renomeando Colunas
Permite que o usuário forneça outro nome a ser usado na saída do comando select ao
invés do nome da coluna.
Sintaxe simplificada:
o select titulo_de_coluna = nome_de_coluna (,...)
Atenção: A falta de uma vírgula na lista de seleção pode causar que a seguinte coluna
seja tratada como um título de coluna ao invés de um nome de coluna.
Exemplo:
o select CPF = au_id, SOBRENOME = au_lname
from authors
where state = ‘CA’
Exemplo:
o select ‘O NOME DA LOJA É’, stor_name
from stores
where stor_id = ‘7067’
o select ‘TOTAL DE VENDAS’, total_sales, ‘DO LIVRO’, title_id
from titles
where type ‘psychology’
o select ‘O NOME DO EDITOR’, pub_id ‘É ‘, pub_name
from publishers
Expressões numéricas
• Operadores aritméticos
Símbolo Operação
+ Adição
- Subtração
* Multiplicação
/ Divisão
% Módulo
• podem ser usados em qualquer coluna numérica;
• usados em qualquer cláusula que permita uma expressão;
• módulo não pode ser usado em colunas de valores monetário.
o Adição
select advance, price, advance + price, title_id
from titles
where type ‘business’
o Subtração
select advance, price, advance - price, title_id
from titles
where type = ‘business’
o Multiplicação
select title, RECEITA = price * total_sales
from titles
where type = ‘business’
o Multiplicação (expressão usada na cláusula where)
select title, RECEITA = price * total_sales
from titles
where price * total_sales > 8000
o Multiplicação (múltiplas condições)
select title, RECEITA = price * total_sales
from titles
where price * total_sales > 8000 and
type = ‘business’
o Divisão
select title, VENDAS MENSAIS = total_salles/12
from titles
where type = ‘business’
o Módulo
select total_sales, total_sales % 2, title_id
from titles
where total_sales % 2 = 1
• Função Convert
o Converte expressões de um tipo de dados para outro;
o Usado na lista_do_select e na cláusula where;
o Uma expressão “char” que contenha alfabéticos, não pode ser convertida
para um “int”.
Sintaxe simplificada:
o convert (tipo_de_dados, expressão)
Com dados monetários e “qualquer outro tipo”, tais como ponto flutuante, um
símbolo de dólar ($) pode opcionalmente ser usado na frente do “outro tipo” de
modo a executar uma operação. (*3)
Exemplo:
o select price * $1.10, title
from titles
where type = ‘business’
Valores nulos
Exemplo:
o select title, price
from titles
where type = ‘popular_comp’ and
price is null
o select title_id, advance
from titles
where type = ‘popular_comp’ and
price = null
select title_id, advance
from titles
where advance is not null
o select title_id, advance
from titles
where advance < 5000
o select title_id, advance
from titles
where advance < 5000 or
advance is null
o operação envolvendo nulos resultando nulos
select title_id, advance, price, advance / price
from titles
where type not in (‘business’, ‘psychology’, ‘trad_cook’)
Select / order by
A clausula order by sorteia os resultados da pergunta (em ordem ascendente por default)
• itens nomeados nessa cláusula não precisam aparecer no select_list;
• Usando order by, nulos são listados primeiro.
Sintaxe simplificada:
o select [distinct] lista_do_select
from lista_de_tabelas
[where condições_de_pesquisa]
[order by {coluna/expressão} [asc/dsc] [,...]]
Exemplo:
o select stor_name state
from stores
order by state, stor_name
o select stor_name, state
from stores
order by state, stor_name desc
o ordenando por coluna derivada
select ((total_sales / 12) * 1.10), title_id
from titles
where type = ‘psychology’
order by ((total_sales / l2) * 1.10)
o ordenando por coluna não constante no select
select title, price
from titles
where pub_id = ‘0736’
order by pubdate
o nulos aparecendo primeiro
select title_id, type, price
from titles
where type = ‘popular_comp’
order by price
Funções agregadas
Sintaxe simplificada:
o select função_agregada ([distinct] expressão)
from lista_de_tabelas
[where ... condições]
• COUNT: contém a soma do número de colunas que satisfazem a condição
o select count(*)
from titles
o select count(advance)
from titles
• MAX: determina o maior valor
o select max (price)
from titles
• MIN: determina o menor valor
o select min (price)
from titles
• SUM: determina a quantidade total de valores em determinada coluna
o select sum (total_sales)
from titles
where type = ‘psychology’
• AVG: determina a média dos valores em determinada coluna
o select avg (advance)
from titles
• mais de uma função agregada pode ser usada na cláusula select
Exemplo:
o select min (advance), max (advance)
from titles
Selecto/Group by
A cláusula group by divide dados em grupos
• Normalmente usado com uma função agregada na lista_de_select.
• Todos os valores nulos na coluna “group by” são tratados como um grupo.
Sintaxe simplificada:
select [distinct] lista_de_select
from lista_de_tabelas
[where condições_de_pesquisa]
[group by [all] expressão_agregada [,…]]
[order by coluna/expressão [asc|desc] [,...]]
Exemplos:
(uso correto)
select type, avg(price)
from titles
group by type
(uso com order by)
select avg(price), type
from titles
group by type
order by (price)
select stor_id, sum(qty)
from salesdetail
groupo by stor_id
Sintaxe simplificada:
select [distinct] lista_do_select
from lista_de_tabelas
[where condições_de_pesquisa]
[group by [all] expressão_agregada [,…]
Exemplos:
select title_id, sum(qty)
from salesdetail
where discount > 50
group by title_id
(Quais os livros que foram vendidos com desconto maior que 50%?)
Sintaxe simplificada:
select [distinct] lista_do_select
from lista_de_tabelas
[where condições_de_pesquisa]
[group by [all] expressão_agregada [,...]]
[having condições_de_pesquisa]
[order by {coluna|expressão} [asc|desc] [,...]]
ou
select title_id, pubdate, total_sales, price
from titles
where total_sales > 4000
and pubdate > 06/12/85
Sintaxe simplificada:
select [tabela], nome_de_coluna, [,...]
from lista_de_tabelas
[where condições_de_pesquisa]
Exemplo:
select pub_name, publishers.pub_id, titles.title_id
from publishers, titles
where publishers.pub_id = titles.pub_id
Exemplo:
select stores.stor_id, qty, title_id, stor_name
from salesdetail, stores
where publishers.stor_id = store.stor_id
(Quais as vendas de cada loja?)
Aliases
Função que fornece um modo abreviado para referenciar tabelas num simples comando
SQL.
Sintaxe simplificada:
select lista_de_select
from nome_de_tabela alias_1, nome_de_tabela alias_2
where alias_1.nome_de_coluna = alias_2.nome_de_coluna
Exemplo:
select t.title_id
from titles t.titleauthor ta
where t.title_id = ta.title_id
and au_id = ‘409-56-7008’
(Quais os livros escritos pelo autor com codigo 409-56-7008?)
Self-Joins
Unindo uma tabela á ela mesma
• une linhas de uma tabela a outras (ou à mesma) linhas nessa tabela
• Mais de um par de colunas pode ser usado para especificar a condição “join”.
• Existem autores que tenham o mesmo sobrenome?
• “join” não igual normalmente é feito com um “self_join”
• Duas colunas são usadas na condição (incompleto)
(incompleto)
select au1.au_lname, au1.au_fname, au1.city
from authors au1, authors au2
where au2.au_lname = ‘Karsen’ and au2.au_fname = ‘Livia’
and au1.city = au2.city
(Que autores moram na mesma cidade que Livia Karsen?)
(incompleto)
select a1.au_lname, a1.au_fname
from authors a1, authors a2
where a1.au_lname = a2.au_lname
Exemplo:
select au_lnane, au_fnarne, titles.title_id, title
from authors, titleauthor, titles
where authors.au_id = titleauthor.au_id
and titleauthor.title_id = titles.title_id
(Liste os autores de cada livro.)
Exemplo:
select stor_name, sum(qty)
from salesdetail, stores
where stores.stor_id *= salesdetail.stor_id
group by stor_name
(assuma que esta sendo aberta uma nova loja, que ainda não vendeu, liste a venda total
de cada loja incluindo esta nova loja)
Escrevendo subqueries
• Um subquery é um comando de seleção, usado como uma expressão, como parte
de outro select, update, insert ou comando delete.
• O subquery é resolvido e os resultados são substituidos para dentro do query
mais externo.
• Se a cláusula where do query mais externo inclui o nome da coluna, a coluna
deve ser compativel com a coluna nomeada no select do subquery
• Subquery não pode ter “order by” ou “cláusula” compute ou palavra chave
“into”
Sintaxe simplificada:
select lista_do_select
from lista_de_tabelas
[where condição_de_pesquísa] =
(select lista_do_select
from lista_de_tabelas
[where condição_de_pesquisa]
[group by expressão_agregada]
[having condição_de_pesquisa]
[group by expressão_agregada]
[having condição_de_pesquisa]
[order by {{tabela.}coluna | expressão}[asc | desc][,…]
[by coluna [,…]]
Subqueries - restrições
• A lista_do_select do subquery pode incluir somente um nome de coluna (exceto
para o subquery existente), isto é, mais de um valor de coluna não pode ser
retornado.
• A palavra chave “distinct” não pode ser usada com subqueries que tenham a
cláusula “group by”.
• As cláusulas “where”, “having” de um comando “select”, “insert”, “update” ou
“delete” podem conter um subquery.
• Somente colunas da lista do select do comando mais atual (último comando)
podem ser mostradas.
Sintaxe simplificada:
select lista_do_select
from lista_de_tabelas
[where condições_de_pesquisa] [not] in (subquery)
Exemplo:
select distinct stor_id, title_id
from salesdetail
where stor_id in (select stor_id
from stores
where state = “CA”)
(Que livros foram vendidos na Califórnia CA?)
Sintaxe simplificada:
select lista_do_select
from lista_de_tabelas
[where expressão {= | != | < | > | <= | >= }]
(subquery)
Exemplo:
(maior que)
select title_id, price
from titles
where price > (select avg(price)from titles)
(Que livros custam mais que a média de todos os livros?)
(Que livros tem adiantamento superior ao adiantamento mínimo dado pela editora
“Algodata lnfosystems”?)
Exists
• Exists and not exists , usado para dois conjuntos de operações de teoria
• exists - intersecção, todos elementos que pertencem a ambos os conjuntos de
origem.
• not exists - diferença, os elementos que pertencem somente ao primeiro dos
dois conjuntos.
• Palavra chave exists não é precedida por um nome de coluna.
• Normalmente, a lista_do_select do subquery será “*“, desde que a função
exists retome verdadeiro ou falso e não dados reais.
* exists (subquery) True se linhas são retomadas
False se linhas não são retornadas
* not exists (subqueries) True se linhas não são retornadas
False se linhas são retornadas
Sintaxe simplificada:
select lista_do_select
from lista_de_tabelas
[where {exists | not exists}]
(subquery)
(intersecção entre autores e editores)
Exemplo:
select city, state from publishers
union
select city, state from stores
union
select city, state from stores
order by state, city
• Descarta as linhas duplicadas (a não ser que você use a opção “all “)
Sintaxe geral:
Query 1
[union [all] Query n]…
[order by cláusula]
[compute cláusula]
onde Query 1 é: select lista_do_select
[into cláusula]
from lista_de_tabelas
[where clausula]
[group by cláusula]
[having cláusula]
onde Query n é: select lista_do_select
from lista_de_tabelas
[wbere cláusula]
[group by cláusula]
[having cláusula]
Sintaxe simplificada:
select lista_do_select
[into tabela]
from lista_de_tabelas
[where condição_de_pesquisa]
Exemplo:
(criação de tabela carregando os dados)
select *
into new_titles
from titles
Sintaxe simplificada:
insert [into] tabela
[(lista_de_colunas)]
{values (constantes) | comando_select}
(Adiciona uma linha simples.)
Exemplo:
(linha completa)
insert into new_pubs
value (‘9945’,’Mysteries Galore’,’Kansas City’, ‘KS’)
Sintaxe simplificada:
update tabela
set nome_de_coluna = {expressão | null}
[,nome_de_coluna = {expressão | null}]...
[from tabela1, tabela2, ...]
[where condições_de_pesquísa]
(alteração dos dados de uma tabela baseados nos dados de outra tabela)
update new_titlies
set contract = 0
from new_titles, publishers
where new_titles.pub_id = publishers.pub_id and
pub_name = ‘New Age Books’
Exemplo:
(remove dados de uma tabela baseados em uma constante)
delete from new_pubs
where pub_name = ‘Mysteri’
Sintaxe simplificada:
drop table tabela