Conceitos Básicos e Termos
Nesta seção, o estudante será introduzido aos conceitos básicos de banco de dados. Termos utilizados para fazer referências a entidades serão definidos. Uma breve explicação sobre o que é um sistema gerenciador de banco de dados relacional e como os dados são inseridos e recuperados de um banco de dados também consta desta seção. As tabelas do banco de dados de demonstração serão examinadas. Objetivos: Ao final desta seção, o estudante deverá ter a capacidade de:
± Estabelecer o propósito da linguagem SQL; ± Definir um sistema de gerenciamento de banco
de dados relacional; ± Listar e definir termos de banco de dados; ± Relacionar as tabelas que estão no banco de dados de demonstração; ± Reconhecer e descrever como os dados são inseridos e recuperados de um banco de dados.
1
SQL Server
Introdução a SQL
A Linguagem SQL yStructured Query Language Estruturada de Consulta) (Linguagem
± Possui uma estrutura semelhante à linguagem ± ± ± ± ± ±
natural (na língua inglesa); Não inclui nenhuma referência para explicitar caminhos de acesso; É uma maneira de recuperação e manipulação de dados em um banco de dados; Pode ser utilizada em um terminal on-line; Pode ser utilizada na forma de SQL embutida por um programa de aplicação; Possui uma ampla gama de operações de atualização; Utilizada para administração.
2
SQL Server
Introdução a SQL
Bancos de Dados yDefinição: Uma coleção de dados na qual existem relacionamentos entre os elementos dos dados. Exemplo:
± Distribuidora de livros:
» Informações sobre os livros » Informações sobre os editores » Informações sobre os autores
pubs
sales stores
stor_id stor_name stor_address city state zip
titles
publishers
authors
3
SQL Server
Introdução a SQL
Sistema de Gerenciamento de Bancos de Dados yDefinição Software que facilita a definição de estruturas de bancos de dados e o armazenamento e recuperação de dados dessas estruturas.
Gerenc. de Armazenamento
Distribuidor
pubs
sales stores
stor_id stor_name stor_address city state zip
³user´
titles
publishers
authors
4
SQL Server
Introdução a SQL
Termos yTabela (relação)
± Um grupo de linhas, ou um grupo de listas de
valores: ³uma relação´.
yColuna (atributo)
± Análoga a um campo de um registro; ± Cada coluna de determinada linha possui um
valor de dado único; ± Cada coluna é de um tipo único de dado.
yLinha (tupla)
± Análoga a um registro de um arquivo; ± Todas as linhas de uma tabela possuem o
mesmo grupo de colunas.
yChave primária
± Uma ou mais colunas com valores que são
únicos na tabela e que dessa forma podem ser utilizados para identificar as suas linhas.
yDomínio
± Grupo de valores válidos para uma determinada
coluna.
5
SQL Server
Introdução a SQL
Tabelas yModelo Relacional Em um banco de dados relacional, todos os dados estão em tabelas. Uma tabela possui dados relacionados a uma classe particular de objetos. yTabelas são compostas de linhas e colunas. Existe exatamente um valor de dado em cada coluna de cada linha. Exemplo: A tabela de editores (publishers) possui informações sobre os editores.
Nomes das colunas pub_id 1389 Linhas 0736 0877 pub_name city state CA MA DC
Algodata Infosystems Berkeley New Moon Books Binnet & Hardley Boston Washington
Colunas
6
SQL Server
Introdução a SQL
Linhas e Colunas yColunas
± Cada coluna possui um nome; ± Cada coluna contém dados sobre um aspecto do
conteúdo da tabela; ± Cada coluna contém dados de um tipo único, como inteiros, caracteres, etc. Coluna pub_id 1389 0736 0877 pub_name city state CA MA DC
Algodata Infosystems Berkeley New Moon Books Binnet & Hardley Boston Washington
yLinhas
± Cada linha contém dados relacionados a uma
ocorrência do assunto da tabela; ± Linhas não estão em nenhuma ordem particular. pub_id 1389 Linha 0736 0877 pub_name city
state CA MA DC
7
Algodata Infosystems Berkeley New Moon Books Binnet & Hardley Boston Washington
SQL Server
Introdução a SQL
Acesso a Dados / Chaves Primárias yO nome da tabela, nome da coluna e a linha determinam um item de dados unicamente.
stores table
stor_id stor_name stor_address 7131 Doc-U-Mat 24-A Avrogado Quality Way Laundry and Books Eric the Read Books Fricative Bookshop News & Brews Barnum¶s Bookbeat city state zip 98014 Rem- WA ulade
6380
788 Catamau- Seatgus Ave. tle 89 Madison St. 577 First St.
WA
98056
7896 7067 7066 8042
Frem- CA ont Los Gatos CA CA OR
90019 96745 92789 89076
567 Pasadena Tustin Ave. 679 Carson St. Portland
8
SQL Server
Introdução a SQL
Acesso a Dados / Chaves Primárias (continuação) y Pode-se fazer acesso a toda linha por uma única chave primária. Em toda linha, alguma coluna ou grupo de colunas identifica exclusivamente a linha.
pub_id 1389 0736 0877 pub_name city state CA MA DC
Algodata Infosystems Berkeley New Moon Books Binnet & Hardley Boston Washington
9
SQL Server
Introdução a SQL
Pessoal de Banco de dados / Funções y Usuário de Banco de Dados
± Recuperação de dados ± Atualização de dados ± Inserção de dados ± Remoção de dados
y Projetista do Banco de Dados
± Projeto do banco de dados ± Criação de tabelas ± Regras de negócios / integridade referencial
y Programador de Aplicação de Banco de Dados
usuário
± Embutir SQL no código ± Projetar e escrever formulários para interface do
y Administrador do Sistema de Banco de Dados
± Instalação do sistema ± Cópias de segurança e restauração ± Performance e segurança
10
SQL Server
Introdução a SQL
Criando uma Tabela O administrador ou projetista do sistema de banco de dados criará tabelas com o comando seguinte:
Create table stores (stor_id stor_name stor_address city state zip go
Uma vez que a tabela esteja criada, os dados podem ser nela inseridos. yInsere os dados
insert into stores (stor_id, stor_name, stor_address, city, state, zip) values (µ7066¶, ¶Barnum¶s¶, ¶567 Pasadena Ave.¶, ¶Tustin¶, ¶CA¶, ¶92789¶) go
11
SQL Server
Introdução a SQL
Criando uma Tabela (continuação)
insert into stores (stor_id, stor_name, stor_address, city, state, zip) values ('7067', 'News & Brews', '577 First St.', 'Los Gatos', 'CA','96745') go insert into stores (stor_id, stor_name, stor_address, city, state, zip) values ('8042', 'Bookbeat', '679 Carson St.', 'Portland', 'OR','89076') go
12
SQL Server
Introdução a SQL
Recuperação de dados da tabela y Recuperando os dados
select * from stores go Resultado:
7066 7067 8042 Barnum's News & Brews Bookbeat 567 Pasadena Ave. Tustin 577 First St. Los Gatos 679 Carson St. Portland CA CA OR 92789 96745 89076
y Convenção de Nomenclatura
banco_de_dados.proprietário.nm_da_tabela.nm_da_coluna
O Banco de Dados pubs
authors titleauthor publishers stores titles roysched discounts sales
y pubs contém 8 tabelas de dados relacionados à operação de um negócio fictício de distribuição de livros.
titles authors titleauthor publishers stores sales roysched discounts Informações básicas de cada livro. Informações sobre os autores. Uma tabela utilizada para conectar os autores com os seus livros. Informações sobre os editores. Informações sobre as lojas que vendem os livros. Registros de resumo de vendas para as lojas. Uma lista apresentando o percentual de royalty referente a cada título. Uma tabela dos vários descontos disponíveis.
14
SQL Server
Introdução a SQL
Detalhes das tabelas de pubs
TITLEAUTHOR au_id title_id au_ord royaltyper
N au_id N title_id 1
TITLES title_id title type pub_id price advance royalty ytd_sales notes pubdate
pub_id N 1
title_id N
ROYSCHED title_id lorange hirange royalty
title_id 1 N 1
SALES stor_id ord_num date qty payterms title_id
N stor_id
1
au_id
AUTHORS au_id au_lname au_fname phone address city state zip contract
pub_id 1
1 stor_id
PUBLISHERS pub_id pub_name city state
N stor_id
STORES stor_id stor_name stor_address city state zip
Definição das Colunas publishers - Editores que publicaram os livros que este distribuidor possui.
pub_id pub_name city state Código de identificação único para um editor. Nome do editor Cidade do editor Estado do editor
authors - Autores que escreveram um ou mais livros.
au_id au_lname au_fname phone address city state zip contract Número da identidade do autor Último sobrenome Prenome Telefone Endereço Cidade Estado C.E.P. 0=Não existe contrato para este livro 1=Existe contrato para este livro
16
SQL Server
Introdução a SQL
Definição das Colunas (continuação) titles - Livros que estão para ser publicados ou que já foram publicados e são oferecidos por este distribuidor.
title_id title type pub_id price advance royalty ytd_sales notes pubdate Código identificador único para um título Nome do livro Tipo do livro (negócios, psicologia, etc.) Código para o editor deste livro Preço da unidade Adiantamento pago ao autor Royalty correspondente ao livro Número de livros vendidos para as lojas Comentários adicionais Data da publicação
17
SQL Server
Introdução a SQL
Definição das Colunas (continuação) titleauthor - Autores para cada livro e livros para cada autor.
au_id title_id au_ord royaltyper Código do autor que escreveu este livro Código do livro escrito por este autor Ordem dos direitos deste autor (autor n.1, autor n.2) Percentual dos direitos autorais que este autor recebe. (Lembre-se que mais de um autor pode escrever um livro.)
roysched - Faixa de vendas para cada livro e os respectivos direitos autorais dos autores.
title_id lorange hirange royalty Código do livro para o qual as faixas de direitos autorais se aplicam Limite inferior de número de livros vendidos Limite superior de número de livros vendidos Royalty para esta faixa de livros vendidos
18
SQL Server
Introdução a SQL
Definição das Colunas (continuação) stores - Lojas que vendem livros deste distribuidor.
Código identificador único para uma loja stor_name Nome da loja stor_address Endereço city Cidade state Estado zip C.E.P. stor_id
sales - Datas de vendas para pedidos de livros de várias lojas.
stor_id ord_num date qty payterms title_id Código da loja que pediu este livro Código identificador do pedido Data do pedido Número de exemplares pedidos deste título Termos de pagamento Código do livro pedido
19
SQL Server
Introdução a SQL
discounts - Tipos de descontos disponíveis.
discounttype stor_id lowqty highqty discount Três tipos de descontos Código da loja para a qual este desconto se aplica Número mínimo de livros para este desconto Número máximo de livros para este desconto Percentual de desconto
20
SQL Server
Introdução a SQL
Sumário Structured Query Language (SQL) - Linguagem bem semelhante à língua natural (na língua inglesa), que se constitui numa maneira de recuperar e manipular dados. Banco de Dados - Uma coleção de dados na qual existem relacionamentos entre os elementos dos dados. Sistema de Gerenciamento de Banco de Dados Software que facilita a definição de estruturas de banco de dados e o armazenamento e recuperação de dados dessas estruturas. Termos - Tabela, Coluna, Linha, Chave Principal, Domínio. Funções de Banco de Dados - Usuário de banco de dados, Projetista de banco de dados, Programador de aplicação de banco de dados, Administrador do sistema de banco de dados. Convenção de nomenclatura - banco_de_dados. proprietário.nome_da_tabela.nome_da_coluna
21
SQL Server
Introdução a SQL
Questões de Revisão: 1. O que significa SQL? 2. Qual a definição de domínio? 3. Indique duas características da linguagem SQL. 4. Qual o outro termo usado para nomear uma tabela? 5. Que tabela contém o endereço da loja? 6. Que tabela contém o número identificador dos editores? 7. Que cabeçalho de coluna é usado para registrar a data de publicação de um livro? 8. Que tabela e coluna possuem os dados sobre contratos existentes? 9. Que tabela é usada para armazenar informações sobre o custo de um livro? 10. Existem três colunas µcity¶ no banco de dados pubs. Liste o nome completo que faz referência a estas três colunas.
22
SQL Server
Introdução a SQL
Recuperação Básica de Dados I
Nesta seção o estudante aprenderá como utilizar as declarações básicas do SQL para recuperar dados de um banco de dados. Para que isto seja feito, é necessário que a interface da linguagem SQL seja utilizada. Objetivos: Ao final desta seção, o estudante deverá ter capacidade de:
± Entrar no banco de dados usando isql; ± Conectar-se com o banco de dados apropriado; ± Consultar o banco de dados recuperando dados ± ± ± ±
em uma coluna; Consultar o banco de dados recuperando dados em uma linha; Consultar o banco de dados usando condições para restringir os dados recuperados; Utilizar expressões booleanas na condição da consulta; Utilizar um editor para modificar o buffer do SQL.
23
SQL Server
Introdução a SQL
SQL Server: Uma Visão Geral
BCP - Bulk Copy tool
Entradas ou saídas de informações em grande volume, com base em linha de comando e interface gráfica Gerador de relatórios Report Workbench
db-library
ISQL
SQL ServerTM
Data Workbench Cliente baseado em interfaces gráficas para fazer acesso às facilidades do SQL Server
Utilitário SQL Interativo, Linha de comando
db-library
Ferramentas de desenvolvimento de aplicações ba seadas em formu lários e dirigidas a eventos APT Workbench
APT-Library
APT-SQL 24
SQL Server
Introdução a SQL
Entrando no SQL Interativo (ISQL) yConectando com o banco de dados:
± Digite isql e pressione <Enter>; ± Quando a senha (password)
pressione <Enter>; ± Isto significa que você está conectado com o mesmo nome da sua máquina hospedeira, e que você não possui uma senha.
for
pedida,
Sintaxe:
UNIX ou DOS: isql -Unome_do_usuário -Psenha VMS: isql/user=nome_do_usuário/password=senha
Exemplo:
isql -Ufred -Psecret 1>
25
SQL Server
Introdução a SQL
Usando ISQL y A interface SQL
pressionar <Enter>, são incrementados; ± Para começar o prompt em 1, digite reset (isto limpará o buffer do SQL); ± Para executar um comando SQL digite go sozinho numa linha.
± Linhas numeradas aparecem como um prompt; ± Você agora pode utilizar declarações SQL; ± Os prompts subseqüentes, gerados após
y Mais de uma declaração select pode ser executada com o comando go. Saindo do ISQL:
Sintaxe: {quit | exit} Exemplo: 1> quit ready 15:54:05
26
SQL Server
Introdução a SQL
Escolhendo um banco de dados y Para se conectar a um banco de dados:
Sintaxe: use nome_do_banco_de_dados Exemplo: use pubs go
master
model
pubs
³user´
27
SQL Server
Introdução a SQL
Recuperação Simples- Select/From y Utilizados para recuperar dados em um banco de dados.
± A sentença SELECT especifica as colunas que
você deseja recuperar. ± A sentença FROM especifica a tabela ou tabelas de onde você deseja recuperar os dados.
Sintaxe Simplificada:
select lista_de_seleção from lista_de_tabelas
Exemplo (todas as colunas):
select * /* Lista todos os dados que estão na */ */
from stores /* tabela stores
28
SQL Server
Introdução a SQL
Recuperação Simples- Select/From (continuação)
Resultado:
stor_id stor_name city state zip --------- -------------------------------------------------------------------------------------7131 Doc-U-Mat: Quality Laundry and Books Remulade WA 98014 6380 Eric the Read Books Seattle WA 98056 7896 Fricative Bookshop Fremont CA 90019 7067 New & Brews Los Gatos CA 96745 7066 Barnum¶s Tustin CA 92789 8042 Bookbeat Portland OR 89076 (6 rows affected) stor_address -------------------------------24-A Avrogado Way 788 Catamaugus Ave. 89 Madison St. 577 First St. 567 Pasadena Ave. 678 Carson St.
Exemplo (uma coluna):
select stor_name /* Lista os nomes das lojas apenas da */ from stores /* tabela stores */
29
SQL Server
Introdução a SQL
Select/From (continuação)
Resultado:
stor_name ------------------------------------------------------Doc-U-Mat: Quality Laundry and Books Eric the Read Books Fricative Bookshop News & Brews Barnum¶s Bookbeat (6 rows affected)
Exemplo (mais de uma coluna):
select stor_name, city, state /* Lista os nomes das lojas, */ from stores /* a cidade e o estado da tabela stores */
Resultado:
stor_name -------------------------------------------------------Doc-U-Mat: Quality Laundry and Books Eric the Read Books Fricative Bookshop News & Brews Barnum¶s Bookbeat (6 rows affected) city -------------------Remulade Seattle Fremont Los Gatos Tustin Portland state -----WA WA CA CA CA OR
30
SQL Server
Introdução a SQL
Reordenando Colunas y A ordem dos nomes das colunas nas declarações select, determina a ordem das colunas no resultado. Exemplo (saída com ordem de colunas diferente):
select city, stor_name, state /* Lista a cidade, o nome */ from stores /* da loja e o estado da tabela stores */ Resultado:
city stor_name ---------------- -----------------------------------------------------Remulade Doc-U-Mat:Quality Laundry and Books Seattle Eric the Read Books Fremont Fricative Bookshop Los Gatos News & Brews Tustin Barnum¶s Portland Bookbeat (6 rows affected) state ------WA WA CA CA CA OR
31
SQL Server
Introdução a SQL
Eliminando Duplicatas y A chave DISTINCT elimina linhas duplicatas na saída. Sintaxe simplificada:
select [distinct] lista_de_seleção from lista_de_tabelas
Exemplo (sem distinct):
select state from stores /* Lista os estados que estão */ /* na tabela stores */
Resultado:
state ------WA WA CA CA CA OR (6 rows affected)
Exemplo (com distinct):
select distinct state from stores /* Lista uma ocorrência do nome do */ /* estado na tabela stores */
Resultado:
state ------CA OR WA (3 rows affected)
32
SQL Server
Introdução a SQL
Recuperação Qualificada- Select/From/Where y O comando WHERE determina exatamente que linhas serão recuperadas. Sintaxe simplificada:
select lista_de_seleção from lista_de_tabelas where condições_de_busca
y Qualificações no comando Where:
± Operadores de comparação (=, >, <) ± Faixas (BETWEEN e NOT BETWEEN) ± Correspondência de caracteres (LIKE e NOT LIKE) ± Valores desconhecidos (IS NULL e IS NOT NULL) ± Listas (IN e NOT IN) ± Combinações dos acima (AND, OR)
y NOT pode negar qualquer expressão booleana e chaves como LIKE, NULL, BETWEEN e IN.
33
SQL Server
Introdução a SQL
Select/From/Where-Operadores de comparação y A seguir estão os operadores de comparação:
Operador = > < >= <= != <> !> !< Significado igual a maior que menor que maior que ou igual a menor que ou igual a diferente diferente não maior que não menor que
± <> é equivalente a != ± !< é equivalente a >= ± !>é equivalente a <= ± Ao comparar datas, usa-se < para significar
antes e > para depois. ± Use aspas duplas ou simples em torno dos dados do tipo char, varchar e datetime.
Ex. Where state=µCA¶
± Letras minúsculas são maiores que letras
maiúsculas, letras maiúsculas são maiores que números.
34
SQL Server
Introdução a SQL
Operadores de Comparação (continuação) Exemplo (igual):
select stor_name, city, state /* Encontra as lojas */ from stores /* que estão localizadas */ where state = 'CA' /* na Califórnia */
Resultado:
stor_name ------------------------------------------------Fricative Bookshop News & Brews Barnum's state ------------------Fremont CA Los Gatos CA Tustin CA city
Exemplo (diferente):
select stor_name, city, state /* Encontra as lojas que */ from stores /* não estão localizadas */ where state != 'CA' /* na Califórnia */
Exemplo (maior que):
select stor_id, stor_name /* Encontra o código de */ from stores /* identificação e o nome de */ where stor_id > '7066' /* qualquer loja cujo código */ /* é maior que 7066 */
Exemplo (menor que):
select city, stor_name /* Encontra o nome das lojas que */ from stores /* estão localizadas em cidades */ where city < 'Remulade' /* que, alfabeticamente, vêm */ /* antes de Remulade */
35
SQL Server
Introdução a SQL
Select/From/Where - Faixas y BETWEEN - Chave usada para especificar uma faixa inclusiva: os valores extremos da faixa também são incluídos na busca. Exemplo (between):
select stor_id, stor_name, city, state from stores where stor_id between '7076' and '8000'
y NOT BETWEEN - Chave que exclui os valores extremos especificados na faixa. Exemplo (not between):
select stor_id,stor_name,city,state from stores where stor_id not between '7067' and '8000'
36
SQL Server
Introdução a SQL
Select/From/Where-Caracteres Correspondentes y A Chave LIKE
± Usada para selecionar linhas que contenham
campos que correspondem a porções especificadas de uma série de caracteres (string de caracteres). Utilizada apenas com dados do tipo char, varchar e datetime. Pode usar curingas. Curinga Significado % qualquer string com nenhum ou mais caracteres _ um único caracter [] um único caracter na faixa especificada [^] um único caracter fora da faixa especificada Inclua o(s) curinga(s) e a string de caracteres entre aspas simples ou duplas.
± ± ±
±
Exemplo (like):
select stor_name /* Encontra as lojas cujos nomes */ from stores /* começam com a letra B maiúscula*/ where stor_name like 'B%'
Exemplo (not like):
select stor_name /* Encontra as lojas cujos nomes */ from stores /* não começam com B maiúsculo */ where stor_name not like 'B%' 37
SQL Server
Introdução a SQL
Caracteres Correspondentes (continuação) Exemplo(especifica número de caracteres):
select stor_id, stor_name /*Encontra lojas que possuem*/ from stores /*código com quatro dígitos, dos quais */ where stor_id like '70__' /*os primeiros dois são ³70´ */
Exemplo(faixa de caracteres):
select stor_name /*Encontra as lojas cujos nomes */ from stores /*começam com qualquer letra maiúscula*/ where stor_name like '[D-F]%' /*entre D e F, inclusive */
Exemplo (fora da faixa de caracteres especificados):
select stor_name /*Encontra as lojas cujo nome */ from stores /*não começa com nenhuma letra */ where stor_name like '[^D-F]%' /*maiúscula entre D e F */
Existe alguma outra maneira de conseguir os mesmos resultados? Exemplo (duas faixas):
select stor_name /* Encontra as lojas cujos nomes */ from stores /* começam com A,B,C ou de G a Z */ where stor_name like '[A-C,G-Z]%'
38
SQL Server
Introdução a SQL
Select/From/Where - Listas y A Chave IN
± Permite ao usuário selecionar valores que
correspondam a qualquer um de uma lista de valores.
Exemplo (in):
select stor_name, city, state from stores where state in ('CA', 'WA') /*Encontra as lojas de*/ /*Washington e da */ /*Califórnia*/
Exemplo (not in):
select stor_name, city, state /*Encontra as lojas que não*/ from stores /*estão nem na Califórnia,*/ where state not in ('CA', 'WA')/*nem em Washington*/
39
SQL Server
Introdução a SQL
Select/From/Where - Condições de Conexão Condições de conexão com operadores lógicos (AND/OR). yAND
± Agrupa duas ou mais condições. ± Retorna resultados apenas quando todas as
condições são verdadeiras.
Exemplo (and):
select stor_name, city, state /*Encontra as lojas que*/ from stores /*estão em Fremont, */ where state = 'CA¶ and city ='Fremont' /*na Califórnia*/
yOR
± Conecta duas ou mais condições. ± Retorna resultados quando qualquer
condições é verdadeira. ± É inclusivo.
das
Exemplo (or):
select stor_name, city, state /*Encontra as lojas que estão*/ from stores /*na Califórnia ou na cidade */ where state = 'CA' or city = 'Portland' /* de Portland */
40
SQL Server
Introdução a SQL
Condições de Conexão (continuação) y Quando mais de um operador lógico é utilizado, a ordem em que eles são avaliados é a seguinte: not, and, or. y Parênteses podem modificar o significado de uma instrução, para forçar uma outra ordem de avaliação. Exemplo (sem parênteses):
select title_id, type, advance from titles where type='business' or type='psycology' and advance > 5500
Resultado:
title_id type --------------------------BU1032 business BU1111 business BU2075 business BU7832 business PS1372 psychology PS2106 psychology (6 rows affected) advance --------------5,000.00 5,000.00 10,125.00 5,000.00 7,000.00 6,000.00
41
SQL Server
Introdução a SQL
Condições de Conexão (continuação) Exemplo (usando parênteses com AND e OR):
select title_id, type, advance /*Encontra os títulos de livros*/ from titles /*que estão na categoria de */ where (type='business' or type='psycology') and advance > 5500 /*negócios ou de psicologia */ /*e tiveram um adiantamento */ /*maior que $5500 */
± Corrigir erros de sintaxe SQL; ± Corrigir erros tipográficos.
Sintaxe simplificada:
± {vi | edit}
Exemplo:
select from stores vi (or edit) /* Você está agora em um arquivo temporário */ /* Modifique ou corrija a declaração SQL */ /* Escreva o conteúdo deste arquivo */ /* Saia do vi (ou edit) */ select * from stores go
43
SQL Server
Introdução a SQL
Editando o Buffer SQL (continuação) ySalva a declaração SQL atual:
± Declarações longas; ± Comandos executados mais de uma vez em
momentos diferentes; ± Declaração existente é modificada (anteriormente salva).
Exemplo:
select stor_name, city, state from stores where state in ('CA, 'WA') vi (or edit) /*Você está agora num arquivo temporário*/ /*Modifique ou corrija o código SQL se você precisar*/ /*Escreva o conteúdo deste arquivo com outro nome*/ /*Saia do vi (ou edit)*/ reset :r nome_do_arquivo /*O buffer de comandos agora contém todas as linhas do nome_do_arquivo*/ go
44
SQL Server
Introdução a SQL
Português para SQL yPortuguês para SQL - Palavras Chave
PORTUGUÊS entre e incluindo sem duplicatas igual a um dos seguintes similar listar, encontrar onde, que SQL between distinct in like select where
yPortuguês para SQL Liste todas as informações das lojas.
select * from stores ou select stor_id, stor_name, stor_address, city, state, zip from stores
Para cada lista de lojas, mostre o número identificador e o nome da loja.
select stor_name, stor_id from stores
45
SQL Server
Introdução a SQL
Português para SQL (continuação) Liste as cidades em que as lojas se encontram.
select city from stores
Como você traduziria o seguinte comando para o português?
select state from stores
Liste as lojas que pediram livros.
select distinct stor_id from sales
Encontre o código das lojas que pediram uma quantidade de livros superior a 20.
select distinct stor_id, qty from sales where qty > 20
Encontre as lojas que não estão localizadas na Califórnia.
select stor_name from stores where state != µCA¶
46
SQL Server
Introdução a SQL
Português para SQL (continuação) Encontre o endereço da loja chamada µNews & Brews¶.
select stor_name, stor_address from stores where stor_name = µNews & Brews¶
Encontre as lojas que têm um número de identificação entre 7067 e 8000.
select stor_id, stor_name from stores where stor_id between µ7067¶ and µ8000¶
Ache todas as lojas cujo nome começa com B.
select stor_name from stores where stor_name like µB%¶
Como você traduziria o seguinte comando para o português?
select * from stores where stor_name not like µB%¶
47
SQL Server
Introdução a SQL
Sumário isql - Entrando no banco de dados. go - Mais de uma declaração select pode ser executada com a declaração go. reset - Limpa o buffer SQL. use nome_do_banco_de_dados conectar a um banco de dados. Para se
Recuperando dados - select nomes_das_colunas
from nome_da_tabela where condições-de_busca
Chave distinct - Elimina linhas duplicatas na saída. Sentença where - Determina exatamente que linhas serão recuperadas. Operadores de Comparação - (=): igual a; (>): maior que; (<): menor que; (>=):maior que ou igual a; (<=): menor que ou igual a; (!=) ou (<>): diferente; (!>): não maior que; (!<): não menor que.
48
SQL Server
Introdução a SQL
between - Faixa inclusiva: valores superior e inferior da faixa são incluídos na busca. not between - Exclui os valores superior e inferior da faixa especificada. like - Usada para localizar dados char, varchar e datetime.
% _ [] [^] qualquer string com zero ou mais caracteres; qualquer caracter único; qualquer caracter único numa determinada faixa; qualquer caracter único fora de determinada faixa
and / or - Condições de conexão com operadores lógicos. in - Valores selecionados que correspondam a qualquer um de uma lista de valores.
49
SQL Server
Introdução a SQL
Lab: Recuperação Básica de Dados I y Escreva as declarações SQL que você deve usar para responder as questões abaixo. Estas questões podem ser respondidas usando o banco de dados pubs e consultando as tabelas stores e titles. 1. Conecte-se ao nível do sistema operacional. (Seu instrutor lhe fornecerá uma senha e um username.) 2. Conecte-se ao SQL Server. (Seu instrutor lhe fornecerá uma senha e um username.) 3. Você estará usando tabelas do banco de dados pubs nessa prática. Componha o seu ambiente de forma que você possa recuperar informações desse banco de dados. 4. Tenha certeza de que os dados na tabela µstores¶ são os mesmos que o instrutor vem usando nas demonstrações. 5. Quais são os nomes de todas as lojas? (Apenas os nomes deverão ser a saída.)
50
SQL Server
Introdução a SQL
Lab: Recuperação Básica de Dados I (continuação) 6. Que lojas estão localizadas no estado de Washington? 7. Exiba todas as informações da tabela titles. 8. Liste os tipos de livros disponíveis. 9. Liste todos os títulos existentes e a data em que foram publicados. 10. Liste os livros que custam mais de $10. 11. Liste todos os tipos de livros de négocios. 12. Encontre todos os livros que falam sobre culinária (por exemplo: mod_cook e trad_cook). 13. Encontre todos os livros que têm a palavra ³Computer´ em seus títulos. 14. Encontre um livro de psicologia que custe mais de $20.
51
SQL Server
Introdução a SQL
Lab: Recuperação Básica de Dados I (continuação) 15. Liste os livros que têm um preço na faixa entre $10 e $20. 16. Encontre as categorias de livros que o editor número ³0877´ publica. 17. Que livros estão classificados nas categorias mod_cook, trad_cook e business (negócios)? (Use apenas uma declaração.) 18. Encontre os livros cujos títulos começam com letras entre A e F. 19. O que faz a seguinte declaração SQL?
select title_id, type from titles where title_id like µ_C%¶
20. O que faz a seguinte declaração SQL?
select title_id, pubdate from titles where pubdate > µ12/31/86¶
52
SQL Server
Introdução a SQL
Lab: Recuperação Básica de Dados I (continuação) Se você tiver mais tempo... 1. Encontre o título do livro que está na categoria (type) psicologia, custa mais de $20 e tem a palavra µComputer¶ no título. 2. Encontre os livros que tiveram um adiantamento superior a $5000 e venderam menos de 4000 cópias. 3. Que categorias de livros venderam um total de 4000 a 5000 cópias? 4. Que livros venderam mais de 10000 cópias e custam menos de $10, na categoria de negócios (business) e de culinária moderna (modern cooking)?
53
SQL Server
Introdução a SQL
Recuperação Básica de Dados II
Nesta seção, o estudante aprenderá a reordenar os resultados de uma consulta de dados. Além de aprender a lidar com valores nulos, o estudante aprenderá a obter dados derivados através da utilização de operações aritméticas. Objetivos: Ao final desta seção, o estudante deverá ser capaz de:
± Renomear cabeçalhos de colunas nos dados
recuperados; ± Utilizar as funções numéricas na recuperação de dados; ± Definir o significado de um valor nulo; ± Classificar a saída de dados.
54
SQL Server
Introdução a SQL
Renomeando Colunas y O usuário pode estabelecer um outro nome para ser utilizado na saída da declaração select, ao invés do nome da coluna. Sintaxe simplificada:
select cabeçalho_da_coluna = nome_da_coluna [,...]
Exemplos:
select identidade = au_id, ³sobrenome´ = au_lname from authors where state = 'CA' select ³Nº da ident.´ = au_id, sobrenome = au_lname from authors where state = 'CA'
Cuidado: Suprimir a vírgula na lista de seleção fará com que a coluna seguinte seja tratada como o cabeçalho de uma coluna ao invés de seu nome. Qual será a saída do seguinte comando?
select identidade = au_id, au_lname au_fname from authors where state = 'CA' 55
SQL Server
Introdução a SQL
Strings de Caracteres em Resultados y Acrescentando strings comando select: de caracteres ao
Exemplo (string de caracteres):
select 'O nome da loja é ', stor_name from stores where stor_id = '7067'
Resultado: ------------------------O nome da loja é (1 row affected) stor_name -----------------------------------News & Brews
Exemplo:
select 'Vendas atuais', ytd_sales, 'para o livro', title_id from titles where type = 'psychology'
56
SQL Server
Introdução a SQL
Strings de Caracteres em Resultados (continuação)
Resultado:
ytd_sales -------------------- ----------------- ----------------Vendas atuais 375 para o livro Vendas atuais 2045 para o livro Vendas atuais 111 para o livro Vendas atuais 4072 para o livro Vendas atuais 3336 para o livro (5 rows affected) title_id ---------PS1372 PS2091 PS2106 PS3333 PS7777
Exemplo:
select "O nome do editor #", pub_id, "é", pub_name from publishers
numérica; ± Usados em qualquer comando que permita uma expressão; ± Módulo não pode ser utilizado em colunas dos tipos real, float ou money.
Exemplo (adição):
select advance, price, advance+price, title_id from titles where type = 'business'
Exemplo (subtração):
select advance, price, advance-price, title_id from titles where type = 'business' 58
SQL Server
Introdução a SQL
Expressões Numéricas (continuação) Exemplo (multiplicação):
select title, renda = price*ytd_sales from titles where type = 'business'
Exemplo (multiplicação - expressões usadas na sentença where):
select title, renda = price*ytd_sales from titles where price*ytd_sales > $80000
Exemplo (multiplicação - condições múltiplas):
select title, renda = price*ytd_sales from titles where price*ytd_sales > $80000 and type = 'business'
Exemplo (divisão):
select title, vendas_mensais = ytd_sales/12 from titles where type = 'business'
Exemplo (módulo - encontra os números ímpares):
select total_sales, ytd_sales%2, title_id from titles where ytd_sales%2 = 1
59
SQL Server
Introdução a SQL
Conversão Numéricas
de
Tipos
Para
Expressões
yA função CONVERT:
outro; ± Usada na lista_de_seleção e no comando where; ± Não se pode converter uma expressão char que contém caracteres não numéricos para uma inteira (int).
± Converte expressões de um tipo de dados para
Sintaxe:
convert (tipo_de_dado, expressão)
Exemplo (erro - tipos de dados incompatíveis):
select stor_id * 10 from stores
Resultado:
Msg 257, Level 16, State 1, line 1: Implicit conversion from datatype 'char' to 'int' is not allowed. Use the CONVERT function to run this query.
Exemplo:
select convert(int,stor_id)*10 from stores
Com tipo de dados money e um outro tipo dado, como float, um cifrão ($) pode ser usado opcionalmente na frente do 'outro tipo' de dado para executar a computação. Exemplo (omitindo o $):
select price * 1.10, title from titles where type = 'business'
61
SQL Server
Introdução a SQL
Conversão de Tipos Numéricas (continuação) Exemplo ($):
select price * $1.10, title from titles where type = 'business'
para
Expressões
Resultado:
title -------------- ------------------------------------------------------------21.99 The Busy Executive's Database Guide 13.15 Cooking with Computers: Surreptitious Balanced Sheets 3.29 You Can Combat Computer Stress! 21.99 Straight Talk About Computers (4 rows affected)
62
SQL Server
Introdução a SQL
Valores Nulos (Null Values) y Um valor nulo (null value) implica em um valor desconhecido.
± Um valor nulo NÃO significa zero ou branco; não
existe um valor explicitamente designado; ± IS NULL (ou = NULL) pode ser usado para selecionar colunas contendo valores nulos.
y Um valor nulo NUNCA é igual a outro valor nulo. y Algumas colunas são definidas para permitir valores nulos. Exemplo:
select title, price from titles where type = 'popular_comp' and price is null ou select title, price from titles where type = 'popular_comp' and price = null
Resultado:
title -------------------------------------------------------Net Etiquette (1 row affected) price -------------------Null 63
SQL Server
Introdução a SQL
Valores Nulos (continuação) Exemplo:
select title_id, advance from titles where advance is not null
Exemplo:
select title_id, advance from titles where advance < $5000
Select / Order by y O comando ORDER BY classifica os resultados da consulta (em ordem ascendente, caso nada seja especificado).
não precisam aparecer na lista_de_seleção. ± Ao usar order by, nulos são listados primeiro.
± Itens especificados em uma sentença order by
Sintaxe simplificada:
select [distinct] lista_de_seleção from tabela [,...] [where condições_de_busca] [order by {coluna / expressão} [asc | desc] [,...]]
Exemplo:
select stor_name, state from stores order by stor_name
Exemplo (usando número p/ identificar a coluna):
select stor_name, state /* A(s) coluna(s) deve(m) ser from stores /* especificada(s) no select order by 1 */ */
Exemplo (mais de uma coluna):
select stor_name, state from stores order by state, stor_name 66
SQL Server
Introdução a SQL
Select / Order by (continuação) Exemplo (uma descendente): coluna ascendente e outra
select stor_name, state from stores order by state, store_name desc
Exemplo (ordenação por coluna derivada):
select ((ytd_sales/12)*1.10), title_id from titles where type = 'psychology' order by ((ytd_sales/12*1.10) /*Projeta quantos*/ /*livros, em média,*/ /*precisam ser vendi-*/ /*dos em cada mês,*/ /*do próximo ano, */ /*com aumento de */ /* 10 % nas vendas */
Exemplo (pubdate fora da lista_de_seleção):
select title, price from titles where pub_id = '0736' order by pubdate
Exemplo (nulos apresentados primeiro):
select title_id, type, price from titles where type = 'popular_comp' order by price 67
SQL Server
Introdução a SQL
Português para SQL yPortuguês para SQL - Palavras-Chave
PORTUGUÊS arrumar/organizar SQL order by
Liste as lojas e classifique-as por nome.
select * from stores order by stor_name
Que tipo de livro é ³Fifty Years in Buckingham Palace Kitchen´, quanto custa e quando foi publicado?
select type, price, pubdate from titles where title = ³Fifty Years in Buckingham Palace Kitchens´
O livro acima é um top seller?
select ytd_sales, title from titles order by ytd_sales
68
SQL Server
Introdução a SQL
Sumário Renomear Colunas - select título_da_coluna = nome_da_coluna [,...] Operadores Aritméticos - (+) adição; (-) subtração; (*) multiplicação; (/) divisão; (%) módulo. Função convert - Convert expressões de um tipo de dados para outro. ($) - Com o tipo de dados money e µoutro tipo¶ de dados, como float, o cifrão ($) pode ser usado em frente ao µoutro tipo¶ de dados para executar a computação. Null Value (valor nulo) - Implica num valor desconhecido. Computações envolvendo nulos resultam em nulo. is null - Usado para selecionar colunas contendo valores nulos (null values). Sentença order by - Classifica os resultados da consulta (normalmente em ordem ascendente, se nada mais for especificado).
69
SQL Server
Introdução a SQL
Lab: Recuperação Básica de Dados II y Use o banco de dados pubs e as tabelas stores, titles e authors para responder às questões abaixo. 1. Mude o cabeçalho da coluna stor_id para CÓDIGO e o stor_name para NOME_LOJA quando for listar os dados das lojas. 2. Aproximadamente quantos livros têm que ser vendidos para pagar o adiantamento sobre cada livro? 3. Qual a renda gerada por cada título? Coloque o título RENDA para o resultado e CÓDIGO para title_id. 4. Um aumento de 15% no preço por livro está projetado para o ano que vem. Liste os preços antigos e novos usando PREÇO_ ANTIGO e PREÇO_NOVO como cabeçalhos. 5. Que títulos ainda não receberam um preço?
70
SQL Server
Introdução a SQL
6. Que editores ainda não decidiram sobre adiantamentos ou resolveram não dar um adiantamento? 7. Classifique a tabela titles por tipo (type) e cada tipo por preço (price). 8. Encontre os autores que moram na Califórnia (µCA µ). Liste-os em ordem alfabética por seus sobrenomes, juntamente com seus telefones. 9. Encontre os livros que têm renda total inferior a $10000. (Dica: vendas totais (ytd_sales) é em número de livros e não em valor monetário.)
71
SQL Server
Introdução a SQL
Organizando Dados e Resumindo Resultados
Nesta seção o estudante aprenderá como usar as funções agregadas de construção. O estudante verá que os dados de saída podem ser organizados e manipulados para responder questões relacionadas ao conteúdo do banco de dados. Funções serão usadas em dados agrupados e será apresentada uma outra forma para utilizar uma condição para saída de dados. Objetivos: Ao final desta seção, o estudante deverá ser capaz de:
± Usar as funções de agregação; ± Organizar dados em grupos (group by); ± Estabelecer condições em grupos (having).
72
SQL Server
Introdução a SQL
Funções de Agregação
Função SUM AVG MIN MAX COUNT(*) COUNT([DISTINCT] nome_da_coluna) Valor Calculado total média dos valores valor mínimo valor máximo número de linhas número de valores únicos
± Funções de agregação, com exceção do ± ± ± ±
count(*), ignoram valores nulos; Sum e Avg só funcionam com valores numéricos; Apenas uma linha é retornada (se uma sentença group by não tiver sido usada); Não podem ser utilizadas num comando where; Podem ser aplicados a todas as linhas em uma tabela ou num grupo de uma tabela.
Funções de Agregação (continuação) COUNT Count soma o número de linhas que pertencem à condição estabelecida. Exemplo (número de linhas selecionadas): select count(*) from titles Resultado:
--------------------18 (1 row affected)
Exemplo (número de valores não nulos na coluna):
select count(advance) from titles
MAX / MIN y Max encontra o maior valor. Exemplo:
select max(price) from titles Resultado: -------------------------22.95
(1 row affected) y Min encontra o menor valor. Exemplo:
select min(price) from titles Resultado: ---------------------------2.99 (1 row affected)
75
SQL Server
Introdução a SQL
Funções de Agregação (continuação) SUM / AVG y Sum calcula a soma total dos valores na coluna especificada. Exemplo
select sum(ytd_sales) from titles where type = 'psychology'
Resultado:
----------------------9939 (1 row affected)
y Avg calcula a média dos valores na coluna especificada. Exemplo:
select avg(advance) from titles
Funções de Agregação (continuação) y Mais de uma função de agregação pode ser utilizada numa sentença de seleção (select clause). Exemplo:
select min(advance), max(advance) from titles Resultado: -------------------------0.00
-----------------------15,000.00
(1 row affected)
77
SQL Server
Introdução a SQL
Funções de Agregação (continuação) A Chave DISTINCT
± Opcional com sum, avg e count; ± Não permitida com min, max e count(*); ± Permitida com count(nome_da_coluna); ± Usado apenas com nomes de colunas, não com
expressões aritméticas.
Compare:
select avg(distinct price) from titles where type = 'business' select avg(price) from titles where type = 'business'
Resultado: ----------------------11.64
Resultado: ----------------------13.73
Exemplo: Quantos tipos diferentes de livros nós temos?
select count(distinct type) from titles
78
SQL Server
Introdução a SQL
Lidando com Valores Nulos - Isnull y Seleciona um valor nulo para ser considerado numa função de agregação. y isnull(expressão, valor) Exemplo:
select avg(price) from titles
Resultado:
----------------------14.77 (1 row affected)
Exemplo:
select avg(isnull(price,$9.98)) /*Livros que ainda não têm*/ from titles /*preço estabelecido*/ /*receberão o valor de*/ /*$9.98*/
Resultado:
----------------------14.23 (1 row affected)
Exemplo:
select price*2 from titles
Exemplo:
select isnull(price,0)*2 from titles 79
SQL Server
Introdução a SQL
Português Para SQL Liste a última data que um livro foi pedido.
select max(date) from sales
Liste o preço do livro mais barato disponível.
select min(price) from titles
Qual é a média dos preços dos livros que o editor '0736' publica?
select avg(price) from titles where pub_id='0736'
Liste a quantidade total de livros que foram vendidos este ano.
select sum(ytd_sales) from titles
Liste o número total de títulos de livros.
select count(title_id) from titles
80
SQL Server
Introdução a SQL
Lab: Funções de Agregação y Este exercício usa as tabelas titles e sales do banco de dados pubs. Cada questão deve ser respondida com uma declaração SQL. 1. Quantos livros estão disponíveis neste banco de dados? 2. Quantos editores publicaram livros? 3. Se o preço de todos os livros sofrer um aumento de 15% próximo ano, qual será o preço médio do custo de um livro no próximo ano em comparação a este ano? 4. Quantos livros da categoria de negócios (business) foram vendidos? 5. Suponha que qualquer adiantamento que ainda não foi decidido é de $5000. Encontre o adiantamento médio.
81
SQL Server
Introdução a SQL
Select / Group by y A sentença GROUP BY divide os dados em grupos.
agregação na lista_de_seleção; ± Todos os valores nulos na coluna group by são tratados como um grupo. Sintaxe simplificada: select [distinct] [from [where [group by [all] [order by
lista_de_seleção tabela [,...]} condições_de_busca] expressão_s/_funções_agregadas [,...]] coluna /número_da_lista_de_seleção /expressão [asc | desc ] ],...]]
± Normalmente utilizada com uma função de
y Uso incorreto de uma função de agregação: Exemplo (uso incorreto - todos os tipos terão o mesmo preço):
select type, avg(price) from titles
82
SQL Server
Introdução a SQL
Select / Group by (continuação) Exemplo (uso correto):
select type, avg(price) from titles group by type
Resultado:
type -----------------------------UNDECIDED business mod_cook popular_comp psychology trad_cook (6 rows affected) ----------------------NULL 13.73 11.49 21.48 13.50 15.96
83
SQL Server
Introdução a SQL
Select / Group by (continuação) Exemplo (usado com order by):
select avg(price), type from titles group by type order by avg(price)
Resultado:
type -----------------------------UNDECIDED mod_cook psychology business trad_cook popular_comp (6 rows affected) ----------------------NULL 11.49 13.50 13.73 15.96 21.48
Exemplo:
select title_id, sum(qty) /*Quantos livros foram vendidos*/ from sales /*de cada título?*/ group by title_id
Exemplo:
select stor_id, sum(qty) /*Quantos livros foram vendidos*/ from sales /*para cada loja?*/ group by stor_id
84
SQL Server
Introdução a SQL
Select / Group by (continuação) y Agrupamentos podem ser feitos através do nome_de_coluna ou qualquer expressão que não contenha uma função de agregação. Agrupamentos não podem ser feitos através do título_de_coluna (ou alias). Exemplo:
select 'ID#: ' + title_id, sum(qty) from sales group by 'ID#: ' + title_id
y Nem todos os itens da lista_de_seleção precisam ser valores fixos ou um valor agregado para cada grupo. Exemplo:
select title_id, stor_id, sum(qty) from sales group by title_id
Exemplo (funções agregadas aninhadas):
select avg(sum(qty)) from sales group by title_id /*Mostra a média da quantidade*/ /*de todos os livros vendidos */
85
SQL Server
Introdução a SQL
Select / Group by / Where y Uma sentença WHERE elimina linhas antes do agrupamento.
± Aplica uma condição à tabela antes dos grupos
serem formados; ± Não aceitará uma função de agregação.
Sintaxe simplificada:
select [distinct] lista_de_seleção [ from tabela [,...]] [where condições_de_busca] [group by [all] expressão_s/_funções_agregadas [,...]]
Exemplo:
select title_id, sum(qty) from sales where discount > 50 group by title_id /*Quantos dos livros vendidos */ /*tinham descontos superiores*/ /*a 50%? */
86
SQL Server
Introdução a SQL
Select / Group by / All y O modificador all pode ser usado com um group by.
± Inclui, no resultado, os grupos especificados
mais aqueles grupos que não possuem linhas que correspondam à condição where; ± O valor agregado será nulo (null) para as linhas que não correspondam à condição where. Exemplo:
select type, avg(price) from titles where type in ('business', 'popular_comp') group by type
Resultado:
type ----------------------business popular_comp (2 rows affected) --------------------13.73 21.48
Exemplo:
select type, avg(price) from titles where type in ('business', 'popular_comp') group by all type 87
SQL Server
Introdução a SQL
Select / Group by / All (continuação)
Resultado:
type ---------------------------------UNDECIDED business mod_cook popular_comp psychology trad_cook (6 rows affected) ----------------------NULL 13.73 NULL 21.48 NULL NULL
88
SQL Server
Introdução a SQL
Select / Group by / Having y A sentença HAVING estabelece condições para a sentença group by.
Sintaxe simplificada:
select [distinct] [from [where [group by [all] [having [order by lista_de_seleção tabela [,...]] condições_de_busca] expressão_s/_funções_agregadas[,...]] condições_de_busca] {coluna |número_da_lista_de_seleção |expressão} [asc | desc] [,...]]
Exemplo:
select title_id, pubdate, ytd_sales, price /*Encontra todos*/ from titles /*os livros que venderam */ where ytd_sales > 4000 /*mais de 4000 cópias e lista */ having pubdate > '06/12/85' /*aqueles que têm data de */ /* publicação > 6/12/85 */
OU
select title_id, pubdate, ytd_sales, price from titles where ytd_sales > 4000 and pubdate > '06/12/85'
89
SQL Server
Introdução a SQL
Select/Group by/Having (continuação) Exemplo:
select title_id, sum(qty) /*Quantos exemplares foram */ from sales /*vendidos dos títulos mais */ group by title_id /*vendidos (>50)?*/ having sum(qty) > 50
Exemplo:
select title_id, sum(qty) /*Quais dos títulos mais */ from sales /*vendidos foram vendidos entre */ where date between /*os dias 13/09/85 e 22/05/87? */ ³09/13/85´ and ³05/22/87´ group by title_id having sum(qty) > 50
90
SQL Server
Introdução a SQL
Português para SQL
PORTUGUÊS organizar por cada/todo condição pós-agrupamento SQL group by group by having
Encontre o adiantamento máximo que foi dado em cada categoria (type) de livro.
select max(advance), type from titles group by type
Qual é a média dos preços dos livros em cada categoria?
select type, avg(price) from titles group by type
Para cada editor publicando mais de cinco livros, encontre o preço médio de todos os seus títulos.
select pub_id, avg(price) from titles group by pub_id having count(*) > 5
Por que uma sentença WHERE não serviria no exemplo acima?
91
SQL Server
Introdução a SQL
Sumário count - soma o número de linhas que pertencem à condição. max - Encontra o valor máximo. min - Encontra o valor mínimo. sum - Encontra o valor total dos valores na coluna especificada. avg - Encontra a média dos valores na coluna especificada. isnull - Seleciona um valor nulo para ser considerado. Sentença group by - Divide dados em grupos. Sentença where -Elimina linhas antes de agrupar. Modificador all - Pode ser usado com group by.
92
SQL Server
Introdução a SQL
Sumário (continuação) Sentença having - Estabelece condições para a sentença group by. Sintaxe select [distinct]lista_de_seleção [from tabela [,...] [where condições_de_busca] [group by [all] expressão_s/_funções_agregadas[, ...]] [having condições_de_busca]
93
SQL Server
Introdução a SQL
Lab: Group by 6. Qual é a média de preços de um livro: a) by type? b) by publisher? 7. Qual é o custo do livro mais barato e do mais caro para cada categoria de livros? 8. Quantos livros cada editor vendeu este ano? 9. Para os editores que possuem títulos com preços inferiores a $10, calcule a média dos preços de todos os seus livros. 10. Quantos livros existem em cada categoria?
94
SQL Server
Introdução a SQL
Junções (Joins)
A operação de junção (join) é a marca registrada do modelo relacional. Nesta seção, o estudante aprenderá os conceitos de colunas relacionadas de uma tabela para outra. O estudante aprenderá como efetuar uma junção em uma ou mais tabelas. Objetivos: Ao final desta seção, o estudante deverá ser capaz de executar:
(self-join); ± Uma junção que inclui linhas não correspondentes (outer join); ± Uma junção de mais de duas tabelas.
± Uma junção baseada numa igualdade; ± Uma junção com outras condições incluídas; ± Uma junção que une uma tabela a ela mesma
95
SQL Server
Introdução a SQL
Consultando Duas Tabelas A operação de junção recupera dados de duas ou mais tabelas.
± A junção é a marca registrada do modelo
relacional. ± Ela combina tabelas através da correspondência de valores de linhas em cada tabela.
Exemplo: Liste stor_id, stor_name, title_id e qty ordenadas pela venda de cada livro: sales
stores stor_id stor_name 7067 7066 8042 News & Brews Barnum¶s Bookbeat stor_id ... title_id qty 7896 8042 8042 7131 7066 7067 resultado stor_name 7067 TC3218 PS3333 TC3218 75 90 40 ...
Que Tabelas Utilizar Decida que colunas você precisa ver. Use o diagrama de esquema para encontrar as tabelas para usar. Siga as linhas de relacionamento para encontar a junção que você precisa usar para conectar as tabelas. Exemplo: Junção Liste stor_name, title_id e qty pedidos para cada livro vendido.
SALES stor_id ord_num date qty payterms title_id N stor_id 1 stor_id STORES stor_id stor_name stor_address city state zip 97
SQL Server
Introdução a SQL
Operação Join
TITLES title_id title type pub_id price advance royalty ytd_sales notes pubdate PUBLISHERS pub_id pub_id pub_name 1 city state
N pub_id
TITLES title_id title type pub_id price advance royalty ytd_sales notes pubdate
SALES
1 title_id
title_id N
stor_id ord_num date qty payterms title_id
98
SQL Server
Introdução a SQL
Joins (Junções) titles
title_id title type pub_id price advance royalty ytd_sales notes pubdate
publishers
pub_id 1389 0736 0877 pub_name city state CA MA DC
Algodata Infosystems Berkeley New Moon Books Binnet & Hardley Boston Washington
99
SQL Server
Introdução a SQL
Operação Join y Join é uma operação multi-tabela.
± SELECT: Se o nome da coluna for ambíguo, ou
seja, se mais de uma coluna nas tabelas especificadas na declaração de origem (from) possuírem o mesmo nome, o nome da coluna deve ser precedido por um nome de tabela. declaração de origem (from) indicam ao SQL Server que uma junção é desejada.
» Tabelas podem estar localizadas no mesmo banco de dados ou em bancos de dados diferentes.
± FROM: Duas ou mais tabelas listadas na
± WHERE: Colunas são comparadas; elas devem
ter valores similares (valores pertencentes ao mesmo domínio). Não é necessário que o tipo de dado seja o mesmo, mas deve ser um tipo que o SQL Server converta automaticamente.
» (int, smallint, tinyint, decimal, real, float ou money) » (char, varchar, datetime e smalldatetime)
± Valores nulos não participam da operação de
junção. ± As colunas na condição de junção não precisam estar na sentença de seleção (select clause). Sintaxe simplificada:
select [tabela].nome_da_coluna, [...] from {tabela}, {tabela}, [...] [where condições_de_busca]
100
SQL Server
Introdução a SQL
Juntando Tabelas
select pub_name, publishers.pub_id, titles.title_id from publishers, titles where publishers.pub_id= titles.pub_id
titles
title_id BU2075 PS2091 PS2106 PS3333 PS7777 MC2222 MC3021 MC3026 PS1372 TC3218 TC4203 TC7777 BU1032 BU1111 BU7832 PC1035 PC8888 PC9999 title You Can Combat... Is Anger the... Life Without... Prolonged Data... Emotinal Security... Silicon Valley... The Gourmet... The Psychology... Computer Phobic... Onions, Leaks... Fifty Years... Sushi, Anyone?... The Busy... Cooking with... Straight Talk... But It Is... Secrets of... Net Etiquette... pub_id 0736 0736 0736 0736 0736 0877 0877 0877 0877 0877 0877 0877 1389 1389 1389 1389 1389 1389
Junções Baseadas em Igualdade y Baseada numa igualdade entre os valores nas colunas especificadas. Exemplo:
select stores.stor_id, qty, title_id, stor_name /*Que lojas*/ from sales, stores /*pediram que quantidade de*/ where sales.stor_id=stores.stor_id /*cada livro*/
Resultado:
stor_id qty title_id ---------- ---------------7131 50 TC3218 7131 80 TC7777 7131 200 BU1032 7131 350 TC4203 7131 400 MC3021 7131 500 BU1111 7131 35 BU2075 7131 137 MC3021 7131 345 BU1032 6380 200 BU2075 6380 250 MC3021 6380 200 PS3333 6380 500 PS7777 6380 125 TC3218 6380 135 BU2075 6380 320 BU1032 6380 300 TC4203 6380 400 MC3021 7896 75 TC3218 7896 75 TC7777 7896 275 TC4203 7896 340 BU1111 7896 42 BU2075 ... 8042 30 BU2075 8042 94 BU1032 8042 300 TC4203 8042 270 MC3021 8042 133 PC1035 (116 rows affected) stor_name ----------------------------------------------------------Doc-U-Mat: Quality Laundry and Books Doc-U-Mat: Quality Laundry and Books Doc-U-Mat: Quality Laundry and Books Doc-U-Mat: Quality Laundry and Books Doc-U-Mat: Quality Laundry and Books Doc-U-Mat: Quality Laundry and Books Doc-U-Mat: Quality Laundry and Books Doc-U-Mat: Quality Laundry and Books Doc-U-Mat: Quality Laundry and Books Eric the Read Books Eric the Read Books Eric the Read Books Eric the Read Books Eric the Read Books Eric the Read Books Eric the Read Books Eric the Read Books Eric the Read Books Fricative Bookshop Fricative Bookshop Fricative Bookshop Fricative Bookshop Fricative Bookshop Bookbeat Bookbeat Bookbeat Bookbeat Bookbeat
102
SQL Server
Introduçào a SQL
Junções Baseadas em Igualdade (continuação) Exemplo (sentença adicional: usando função agregada e group by):
select stor_name, sales.stor_id, sum(qty) from sales, stores where sales.stor_id = stores.stor_id group by sales.stor_id, stor_name /*quantos livros cada loja pediu*/
Junções Baseadas em Igualdade (continuação) Exemplo (sentença colunas derivadas): adicional: ordenação de
select titles.title_id, qty, price, total_price=price*qty from titles, sales /*Qual o total de vendas*/ where titles.title_id = sales.title_id order by price*qty /*para cada um dos livros vendidos?*/
Sinônimos (Aliases) y Função que proporciona uma forma abreviada de referenciar tabelas com uma única declaração SQL. Sintaxe simplificada:
select lista_de_seleção from nome_da_tabela alias_1, nome_da_tabela alias_2 where alias_1.nome_da_coluna=alias_2.nome_da_coluna
Exemplo:
select t.title_id /*Qual o identificador do livro */ from titles t, titleauthor ta /*escrito pelo autor cujo código*/ where t.title_id = ta.title_id /*é 409-56-7008?*/ and au_id = '409-56-7008'
Outras Condições em Junções Exemplo (condição adicional):
select stores.stor_id, qty, title_id, stor_name from sales, stores /* Que lojas pediram menos */ where sales.stor_id=stores.stor_id /* que 70 exemplares */ and qty < 70 /* de um livro? */
Junções Não Baseadas em Igualdade y Operadores de comparação utilizados:
> < >= <= maior que menor que maior ou igual a menor ou igual a
Exemplo (Operador de comparação):
/*Que autores vivem em estados que vêm (alfabeticamente) depois do estado em que a loja 'New Moon Books' está localizada? */ select 'publisher state' = p.state, au_lname, au_fname, a.state from publishers p, authors a where a.state > p.state and pub_name = 'New Moon Books'
Resultado:
publisher state -----------------------MA MA MA MA MA MA (6 rows affected) au_lname -------------Greene Blotchet-Halls del Castillo Panteley Ringer Ringer au_fname ----------------Morningstar Reginald Innes Sylvia Anne Albert state ------TN OR MI MD UT UT 107
SQL Server
Introdução a SQL
Self-Joins y Efetuando uma junção em uma única tabela.
as mesmas) linhas naquela tabela.
± Junta linhas de uma tabela com outras (ou com
y Mais de um par de colunas pode ser utilizado para especificar a condição de junção. Exemplo:
select au1.au_lname,au1.au_fname, au1.city from authors au1, authors au2 /* Que autores */ where au2.au_lname = 'Karsen' /* moram na mesma */ and au2.au_fname = 'Livia' /* cidade que Livia */ and au1.city = au2.city /* Karsen? */
Self-Joins (continuação)
authors
au_lname Bennet Green Carson Ringer Stringer O'Leary Dull White MacFeather Smith DeFrance Karsen ... Straight au_fname Abraham Marjorie Cheryl Albert Dirk Michael Ann Johnson Stearns Meander Michel Livia ... Dick city Berkeley Oakland Berkeley Salt Lake Oakland San Jose Palo Alto Menio Park Oakland Lawrence Gary Oakland ... Oakland
au1
au_lname Bennet Green Carson Ringer Stringer O'Leary Dull White MacFeather Smith DeFrance Karsen ... Straight au_fname city Abraham Marjorie Cheryl Albert Dirk Michael Ann Johnson Stearns Meander Michel Livia ... Dick Berkeley Oakland Berkeley Salt Lake Oakland San Jose Palo Alto Menio Park Oakland Lawrence Gary Oakland ... Oakland au_lname Bennet Green Carson Ringer Stringer O'Leary Dull White MacFeather Smith DeFrance Karsen ... Straight au_fname city Abraham Marjorie Cheryl Albert Dirk Michael Ann Johnson Stearns Meander Michel Livia ... Dick
au2
Berkeley Oakland Berkeley Salt Lake Oakland San Jose Palo Alto Menio Park Oakland Lawrence Gary Oakland ... Oakland 109
SQL Server
Introdução a SQL
Self-Joins e Not-Equal Joins y Existem autores que possuem o mesmo sobrenome? Exemplo (self-join):
select a1.au_lname, a1.au_fname from authors a1, authors a2 where a1.au_lname = a2.au_lname
Exemplo (not-equal join):
select a1.au_lname, a1.au_fname from authors a1, authors a2 where a1.au_id != a2.au_id
y Normalmente, uma junção not-equal é feita em conjunção com uma self-join.
± Duas colunas são utilizadas na condição de
junção.
Exemplo (correto):
select a1.au_lname, a1.au_fname from authors a1, authors a2 where a1.au_lname = a2.au_lname and a1.au_id != a2.au_id
110
SQL Server
Introdução a SQL
Self-Joins e Not-Equal Joins (continuação)
au1 au_lname Karsen Green Dull Hunter Locksle Ringer Smith Bennet Ringer au_lname Karsen Green Dull Hunter Locksle Ringer Smith Bennet Ringer au_lname Karsen Green Dull Hunter Locksle Ringer Smith Bennet Ringer au2 au_lname Karsen Green Dull Hunter Locksle Ringer Smith Bennet Ringer au_lname Karsen Green Dull Hunter Locksle Ringer Smith Bennet Ringer au_lname Karsen Green Dull Hunter Locksle Ringer Smith Bennet Ringer 111
SQL Server
Introdução a SQL
Self-Joins e Not-Equal Joins (continuação) Exemplo (self-join e not-equal join):
select distinct t1.title, t1.price from titles t1, titles t2 where t1.price = t2.price and t1.title_id != t2.title_id order by t1.price /* Que livros têm */ /* o mesmo preço? */
Resultado:
title price ------------------------------------------------------------------------------- -------The Gourmet Miicrowave 2.99 You Cam Combat Computer Stress! 2.99 Fifty Years in Buckingham Palace Kitchens 11.95 Cooking with Computers:Surreptitious Balance Sheets 11.95 Straight Talk About Computers 19.99 Silicon Valley Gastronomic Treats 19.99 The Busy Executive's Database Guide 19.99 Prolonged Data Deprivation: Four Case Studies 19.99 (8 rows affected)
112
SQL Server
Introdução a SQL
Exemplo (self-join e not-equal join):
select distinct t1.title_id from sales s1, sales s2 where s1.title_id = s2.title_id /* Que livros são vendidos */ and s1.stor_id != s2.stor_id /* por mais de uma loja? */
Efetuando Junções em Mais de Duas Tabelas A declaração from (from clause) deve listar todas as tabelas envolvidas. A declaração where (where clause) deve listar condições suficientes de junção para relacionar todas as tabelas envolvidas. Não é necessário exibir uma coluna para cada tabela envolvida na junção. Liste os autores de cada livro:
select au_lname, au_fname, titles.title_id, title from authors, titleauthor, titles where authors.au_id = titleauthor.au_id and titleauthor.title_id = titles.title_id Authors au_id 409-66-7008 213-46-8915 238-95-7766 ...
title ... The Busy Executive's... But Is It User Friendly
... ...
114
SQL Server
Introdução a SQL
Efetuando Junções em Mais de Duas Tabelas
(continuação)
Quando n tabelas participam de uma operação de junção, ao menos n-1 condições de junção são necessárias para evitar o produto cartesiano. Exemplo:
select stor_name, title /* Os livros vendidos */ from stores, sales, titles /* para cada lista de lojas */ where stores.stor_id = sales.stor_id and sales.title_id = titles.title_id
title -----------------------------------------Sushi, Anyone? Life Without Fear The Gourmet Microwave The Gourmet Microwave Is Anger the Enemy? But Is It User Friendly? But Is It User Friendly? Sushi, Anyone? Secrets of Silicon Valley
STORES SALES stor_id ord_num date qty payterms title_id stor_id stor_name stor_address city state zip 115
SQL Server
Introdução a SQL
Outer Joins y Inclui, no resultado, além das linhas correspondentes, linhas não correspondentes. y Operadores outer join:
*= =* inclui nos resultados todas as linhas da primeira tabela, não apenas aquelas cujas colunas unidas correspondem. inclui nos resultados todas as linhas da segunda tabela, não apenas aquelas cujas colunas unidas correspondem.
Outer Joins (continuação) Exemplo:
(Suponha que uma nova loja foi adicionada, de forma que, sales não possui uma linha correspondente.)
select stor_name, sum(qty) /*Qual a quantidade total*/ from sales, stores /*de livros que cada loja*/ where sales.stor_id =* stores.stor_id /*pediu*/ group by stor_name
Resultado:
stor_name ---------------------------------------------------------Barnum¶s Bookbeat Doc-U-Mat: Quality Laundry and Books Eric the Read Books Fricative Bookshop News & Brews nome da loja nova (se incluído) (6 rows affected) --------2430 3733 2097 2430 1182 2900 NULL
117
SQL Server
Introdução a SQL
Português para SQL Qual é o título e o nome do editor para cada livro?
select title, pub_name from titles, publishers where publishers.pub_id = titles.pub_id
Quem escreveu cada livro?
select title, au_lname, au_fname from titles, titleauthor, authors where titles.title_id = titleauthor.title_id and titleauthor.au_id = authors.au_id
Que lojas pediram que livros?
select distinct stor_name, titles.title from stores, sales, titles where stores.stor_id = sales.stor_id and sales.title_id = titles.title_id
Encontre as categorias nas quais existem dois ou mais livros baratos (menos de $15) de diferentes preços. (self-join e not-equal join)
select distinct t1.type, t1.price from titles t1, titles t2 where t1.price < $15 and t2.price < $15 and t1.type = t2.type and t1.price != t2.price
118
SQL Server
Introdução a SQL
Sumário Sintaxe - select [tabela].nome_da_coluna, [...] from {tabela}, {tabela}, [..] [where condições_de_busca] Nomes de colunas ambíguos precedidos pelo nome da tabela. devem ser
Produto cartesiano - Todas as combinações possíveis das linhas de cada uma das tabelas. Join - Deve estar especificado em uma sentença where. equi-join - Baseado numa igualdade entre os valores das colunas especificadas. aliases - Oferecem uma maneira abreviada de referenciar tabelas com uma única declaração SQL.
select lista_de_seleção from nome_da_tabela alias1, nome_da_tabela alias2 where alias1.nome_da_coluna = alias2.nome_da_coluna
self-join - Une linhas de uma tabela para outras (ou para as mesmas) linhas naquela tabela.
119
SQL Server
Introdução a SQL
not-equal join - Normalmente utilizado em conjunto com uma self-join. junção múltipla de tabelas - Quando n tabelas são unidas, pelo menos n-1 condições de junção são necessárias para evitar o produto cartesiano. outer join - Inclui, além das linhas correspondentes, as linhas não correspondentes no resultado.
select lista_de_seleção from [[banco_de_dados.]proprietário.]{tabela1},[banco_de _dados.]proprietário.]{tabela2},[..]] [where tabela1.nome_da_coluna {*= | =*} tabela2.nome_da_coluna]
120
SQL Server
Introdução a SQL
Lab: Joins y As tabelas stores, sales, titles, publishers, titleauthor, discounts e authors são usadas nesse exercício. Estas tabelas podem ser encontradas no banco de dados pubs.
1. Que title_id's (códigos dos livros) foram pedidos por cada loja? 2. Qual o nome do autor que escreveu o livro com o código (title_id) MC2222? 3. Que descontos foram oferecidos à loja µEric the Read Books¶? 4. Que autores moram na mesma cidade que um editor? 5. Que autores moram na mesma cidade? (Em que cidades moram mais de um autor?) (self-join)
121
SQL Server
Introdução a SQL
Lab: Joins (continuação) Se você tiver mais tempo... 6. Que livros foram publicados no mesmo dia? 7. Quantos livros cada autor vendeu? 8. Liste os livros que possuem mais de um autor. 9. Um cliente telefonou para pedir um livro, eles apenas sabiam que era um livro de psicologia escrito por uma mulher chamada Ann ou Anne. Qual o nome completo da autora e o título do livro? 10. Liste todos os autores e, se existir um editor na cidade em que eles moram, liste o pub_name. (outer-join)
122
SQL Server
Introdução a SQL
Subconsultas e Uniões
Nesta seção, o estudante aprenderá como consultar o banco de dados usando seleções aninhadas (subconsultas). Objetivos Ao final desta seção, o estudante deverá ser capaz de:
± Executar uma consulta com níveis múltiplos; ± Usar uma subconsulta com operadores
comparativos; ± Usar uma subconsulta para um teste de existência; ± Usar uma união para combinar resultados de consultas.
123
SQL Server
Introdução a SQL
Subconsultas - Um Exemplo Introdutório Questão - Que títulos são publicados por New Moon Books? yUsando duas declarações select:
1. Encontrar o código (pub_id) para New Moon Books.
select pub_id from publishers where pub_name = 'New Moon Books' pub_id --------0736
2. Encontrar os títulos dos livros associados com o código do editor.
select title from titles where pub_id = '0736' title -------------------------------------------------------------------You Can Combat Computer Stress! Is Anger the Enemy? Life Without Fear Prolonged Data Deprivation: Four Case Studies Emotional Security: A New Algorithm 124
SQL Server
Introdução a SQL
Subconsultas(continuação)
Um
Exemplo
Introdutório
Usando uma declaração de junção:
select title from titles, publishers where titles.pub_id = publishers.pub_id and publishers.pub_name = 'New Moon Books'
Utilizando uma subconsulta:
select title from titles where pub_id = (select pub_id from publishers where pub_name = 'New Moon Books')
125
SQL Server
Introdução a SQL
Escrevendo Subconsultas y Uma subconsulta é uma declaração select, usada como uma expressão, como parte de outra declaração select, update, insert ou delete. y A subconsulta (select aninhado) é resolvida e os resultados substituídos na consulta mais externa. y Se a declaração where da consulta mais externa incluir o nome de uma coluna, esta deverá ser compatível, para a junção (join), com a coluna nomeada na lista_de_seleção da subconsulta (ou seja: mesmo domínio). y Uma subconsulta não pode incluir os comandos order by e compute ou a chave into.
Razões para usar subconsultas: y Muitas junções podem ser estabelecidas como uma subconsulta.
± Às vezes é mais fácil de entender do que uma
junção que executa a mesma função.
y Executa algumas tarefas que de outra forma seriam impossíveis.
127
SQL Server
Introdução a SQL
Subconsultas - Restrições y Uma lista_de_seleção da subconsulta só pode incluir um nome de coluna (com exceção daquelas que são utilizadas em conjunto com a cláusula exists), ou seja, mais de um valor de coluna não pode ser retornado. y A chave distinct não pode ser utilizada com subconsultas que incluem uma sentença group by. y As sentenças where ou having de uma declaração select, insert, update ou delete podem conter uma subconsulta. y Apenas as colunas da lista_de_seleção da declaração mais externa podem ser exibidas.
128
SQL Server
Introdução a SQL
Múltiplos Níveis de Aninhamento y Uma subconsulta pode conter uma ou mais subconsultas.
± Não existe nível máximo de aninhamento.
Exemplo (dois níveis):
select title /*Que livros Blochet_Halls*/ from titles /*escreveu*/ where title_id = (select title_id from titleauthor where au_id = (select au_id from authors where au_lname = 'Blochet_Halls' ))
Resultado:
title -------------------------------------------------------------------Fifty Years in Buckingham Palace Kitchens (1 row affected)
129
SQL Server
Introdução a SQL
Múltiplos Níveis de Aninhamento (continuação) Exemplo (dois níveis):
select pub_name, pub_id /*Que editores publicam*/ from publishers /*os livros mais caros*/ where pub_id = (select pub_id from titles where price = (select max(price) from titles))
Subconsultas Retornando Múltiplas Linhas y Subconsultas usadas com in ou not in, ao invés de uma igualdade, na sentença where, pode retornar 0 ou mais valores. Sintaxe simplificada:
select lista_de_seleção [from [[banco_de_dados.proprietário.]{tabela} [,...]] [where condições_de_busca] [not] in (subconsulta)
Exemplo:
select distinct stor_id, title_id /*Que livros estão sendo */ from sales /*vendidos na Califórnia */ where stor_id in (select stor_id from stores where states = 'CA')
Exemplo:
select distinct stor_name /*Que lojas vendem o livro */ from stores /*The Busy Exec's DB Guide' */ where stor_id in (select stor_id from sales where title_id in (select title_id from titles where title = "The Busy Executive's Database Guide"))
132
SQL Server
Introdução a SQL
Subconsultas
(continuação)
Retornando
Múltiplas
Linhas
Resultado:
-------------------------------------------------------------Bookbeat News & Brews Eric the Read Books Doc-U-Mat: Quality Laundry and books (4 rows affected)
stor_name
Exemplo:
select distinct pub_name /* Que editores ainda */ from publishers /* não publicaram ao menos 1 */ where pub_id not in /* livro de negócios (business)? */ (select pub_id from titles where type = 'business')
Se usássemos ³!=³, ao invés de ³not in´, no exemplo acima, o resultado seria o mesmo?
133
SQL Server
Introdução a SQL
Subconsultas com Operadores de Comparação
y Se não for utilizada uma das chaves ANY ou ALL, a subconsulta deverá retornar um único valor . Sintaxe simplificada: select lista_de_seleção [from {tabela} [,...]] [where expressão { = | != | > | >= | < | <= } [any| all]] (subconsulta)
Exemplo (maior do que):
select title_id, price /* Que livros possuem preço */ from titles /* superior à média dos preços*/ where price > /* de todos os livros */ (select avg(price) from titles)
Subconsultas com Operadores de Comparação
(continuação)
Exemplo (duas condições):
select distinct title, price from titles where type = 'business' and price > (select avg(price) from titles)
Resultado:
title -----------------------------------------------------Straight Talk About Computers The Busy Executive's Database Guide (2 rows affected) price -------19.99 19.99
135
SQL Server
Introdução a SQL
Subconsultas com Operadores de Comparação
(continuação)
Outro Exemplo:
select distinct title /*Que livros requerem um */ from titles /*adiantamento maior que o*/ where advance > /*maior adiantamento pago */ (select max(advance) /*pela Algodata Infosystems*/ from publishers, titles where titles.pub_id=publishers.pub_id and pub_name='Algodata Infosystems')
OU (usando all)
select distinct title from titles where advance > all (select advance from publishers, titles where titles.pub_id = publishers.pub_id and pub_name = ³Algodata InfoSystems´)
Resultado:
title -----------------------------------------------------------You Can Combat Computer Stress ! The Gourmet Microwave (2 rows affected) 136
SQL Server
Introdução a SQL
Subconsultas com Operadores de Comparação
(continuação)
Outro Exemplo:
select distinct title /*Que títulos obtiveram um */ from titles /*adiantamento maior que a*/ where advance > /*quantia mínima paga em */ (select min(advance) /*adiantamento pela */ from titles, publishers /*Algodata Infosystems? */ where titles.pub_id=publishers.pub_id and pub_name='Algodata Infosystems')
OU (usando any)
select distinct title from titles where advance > any (select advance from titles, publishers where titles.pub_id=publishers.pub_id and pub_name='Algodata Infosystems')
137
SQL Server
Introdução a SQL
Subconsultas com Operadores de Comparação
(continuação)
Resultado:
title -------------------------------------------------------------------------------------Sushi, Anyone? Life Without Fear The Gourmet Microwave But Is It User Friendly? Secrets of Silicon Valley You Can Combat Computer Stress ! Computer Phobic and Non-Phobic Individuals: Behavior ... Onions, Leeks, and Garlic: Cooking secrets of the Mediterranean (8 rows affected)
138
SQL Server
Introdução a SQL
Exists y EXISTS e NOT EXISTS são usados para implementar duas operações da teoria de grupos.
± EXISTS - Interseção: todos os elementos que ± ± ±
pertencem a ambos os grupos. NOT EXISTS - Diferença: os elementos que pertencem apenas ao primeiro dos dois grupos. A chave exists não é precedida por um nome de coluna. Normalmente, a lista_de_seleção da subconsulta será " * " já que a função exists retorna verdadeiro (true) ou falso (false), e não dados. exists (subconsulta): True se linhas são retornadas False se linhas não são retornadas not exists (subconsulta): True se linhas não são retornadas False se linhas são retornadas
Exists (continuação) Exemplo (interseção entre authors e publishers):
select distinct city /*Em que cidades estão */ from authors /*localizados tanto um autor*/ where exists /*quanto um editor*/ (select * from publishers where authors.city = publishers.city)
Resultado:
city -------------------------Berkeley (1 row affected) authors.city
publishers.city
140
SQL Server
Introdução a SQL
Exists (continuação) Exemplo (diferença entre authors e publishers):
select distinct city /*Em que cidades mora um autor*/ from authors /*mas não mora um editor */ where not exists (select * from publishers where authors.city = publishers.city)
Resultado:
city ----------------------Gary Covelo Oakland Lawrence SanJose Ann Arbor Corvallis Nashville ... (15 rows affected)
authors.city
publishers.city
141
SQL Server
Introdução a SQL
Português para SQL Quais são os códigos dos livros (title_id's) que a loja Eric the Read Books pediu?
select title_id from sales where stor_id = (select stor_id from stores where stor_name = 'Eric the Read Books')
Qual o título do livro mais caro?
select title_id from titles where price = (select max(price) from titles)
PORTUGUÊS encontre ao menos uma linha
SQL exists
Que lojas pediram livros de psicologia?
select distinct stor_id from sales where exists (select * from titles where sales.title_id = titles.title_id and type = 'psychology')
142
SQL Server
Introdução a SQL
Sumário Subconsulta - É uma declaração select, usada como uma expressão, como parte de outra declaração select, update, insert ou delete. Resultados - Substituídos na consulta mais externa. Subconsulta - Pode conter uma ou mais subconsultas. any e all - Modificadores de operadores de comparação; apenas um valor é retornado. exists - Interseção not exists - Diferença Sintaxe select lista_de_seleção [from {tabela} [,...]] [where condições_de_busca]= (select lista_de_seleção_subconsulta [from {tabela} [,...] [where condições_de_busca] [group by expressão_s/_funções_agregadas [,...]] [having condições_de-busca]) [group by expressão_s/_funções_agregadas [,...]] [having condições_de-busca]) [order by {{tabela}.]coluna |número_da_lista_de_seleção |expressão} [asc | desc] [,...]] [compute agregador_de_linha (coluna) [,...] [by coluna [,...]] [,...]]
143
SQL Server
Introdução a SQL
Lab: Subconsultas y Use selects aninhados para responder estas questões. As tabelas sales, authors, titles, titleauthor, stores e publishers serão usadas para respondê-las. Estas tabelas estão localizadas no banco de dados pubs.
1. Que autores moram na mesma cidade da 'Algodata Infosystems'? 2. Quantos livros a loja 'Bookbeat' pediu? 3. Que editores publicaram livros de négocios (business)? 4. Que livros não foram pedidos? 5. Que autores são publicados por 'New Moon Books' ? 6. Que livros custam mais que o preço mínimo corrente? 7. Que livros os editores de Massachusetts imprimiram?
144
SQL Server
Introdução a SQL
Lab: Subconsultas (continuação) 8. Que livros foram publicados mas não foram vendidos? (use marcas de existência) 9. Que autores escreveram culinária (cooking)? y livros sobre
Responda a questão abaixo com uma junção (join) e com uma consulta aninhada.
10. Que livros são publicados por µNew Moon Books¶? junção
Aninhamento
145
SQL Server
Introdução a SQL
Lab: Subconsultas (continuação) Se você tiver mais tempo...
y Tente responder as questões a seguir e verifique se elas podem ser resolvidas usando uma junção (join) e uma subconsulta. (Elas podem ser respondidas por mais de um método.) 1. Qual o nome do editor que vende o livro mais caro? 2. Que livros requerem um adiantamento superior ao maior adiantamento pago pelo editor µAlgodata Infosystems¶? 3. Que autores possuem o mesmo sobrenome? 4. Que lojas não pediram nenhum livro?
146
SQL Server
Introdução a SQL
Uniões y Permite ao usuário combinar o resultado de mais de uma seleção. y Exemplo:
select city, state from authors union select city, state from publishers union select city, state from stores order by state, city
y Descarta as linhas duplicatas (a não ser que a opção all seja utilizada) y Sintaxe Geral
authors.city Consulta 1 [union [all] Consulta n]... publishers.city [sentença order by] [sentença compute] stores.city onde Consulta 1 é: select lista_de_seleção [sentença into] [sentença from] [sentença where] [sentença group by] [sentença having] e Consulta n é: select lista_de_seleção [sentença from] [sentença where] [sentença group by] [sentença having]
147
SQL Server
Introdução a SQL
Regras de Uniões y Qualquer número de operadores de união pode aparecer em uma Declaração SQL Transacional. y Operadores de união esquerda para a direita. são avaliados da
Por exemplo, X union all (Y union Z) pode não ser equivalente a (X union all Y) union Z (use parênteses para controlar a ordem de avaliação)
y Todas as listas de seleção, na declaração união, devem ter o mesmo número de expressões. y As expressões nas listas de seleção são processadas em ordem. y Expressões correspondentes nas listas de seleção devem ser do mesmo tipo de dados ou uma conversão implícita dos dados deve ser possível, ou, por fim, sua conversão explícita deve ser especificada.
148
SQL Server
Introdução a SQL
Regras de Uniões (continuação) yOs nomes das colunas no resultado são tirados da primeira consulta na declaração de união - especifique cabeçalhos de colunas apenas na primeira consulta. yOrder by e compute são permitidos apenas após todas as consultas - não podem ser usados em cada consulta individualmente. yAs sentenças group by e having podem aparecer apenas nas consultas individuais, não podem ser usadas para o resultado final. yA sentença into pode ser utilizada apenas na primeira consulta - para criar uma nova tabela resultante. yO operador de união não pode ser usado com a declaração create view ou com a sentença for browse.
149
SQL Server
Introdução a SQL
Lab: Uniões y As tabelas authors, stores, publishers, titles, titleauthor, discounts e sales do banco de dados pubs são usadas para este exercício. 1. Que estados aparecem no banco de dados? 2. Que livros são ou escritos ou editados na Califórnia (CA)? Usando junção:
Usando união:
3. Que livros custam mais que o preço médio dos livros, ou têm um desconto superior ao desconto médio?
150
SQL Server
Introdução a SQL
Definição e Manipulação de Dados
Nesta seção o estudante aprenderá a criar uma tabela, inserir dados numa tabela, atualizar dados numa tabela e apagar dados de uma tabela. Objetivos: Ao final desta seção, o estudante deverá ser capaz de:
± Criar uma tabela a partir de uma tabela existente; ± Inserir dados em uma tabela; ± Atualizar dados em uma tabela; ± Apagar dados de uma tabela.
151
SQL Server
Introdução a SQL
Criando uma Tabela a Partir de Outra Existente y Chave INTO usada para criar uma tabela a partir de uma tabela existente:
Sintaxe:
select lista_de_seleção [into tabela [from {tabela} [,...]] [where condições_de_busca]
Exemplo (tabela criada, dados carregados):
select * into new_titles from titles
Exemplo (tabela criada, dados não carregados):
select * into new_pubs from publishers where 1 = 2
Exemplo (carrega dados):
select * into pub_1389_titles from titles where pub_id = '1389'
Exemplo (eliminando colunas):
select pub_name, pub_id into short_pubs from publishers
152
SQL Server
Introdução a SQL
Modificação de Dados - Inserindo Dados y A sentença INSERT adiciona valores de dados a uma tabela já existente.
do dado, se o valor inserido é do tipo correto de dado. » Se o valor for muito longo, o SQL Server trunca-o para o comprimento especificado; nenhuma mensagem de aviso é dada. ± Algumas colunas são definidas de forma a permitirem valores nulos. » Para inserir um valor nulo (null value), em uma coluna que permite valores nulos, especifique null ou não especifique nenhum valor. ± Todos os valores do tipo char e datetime devem ser incluídos entre aspas simples ou duplas. » Para inserir uma string de caracteres mais longa do que uma linha, use uma barra invertida (\) antes de escrever a próxima linha. » Para inserir aspas como um caracter, use o tipo oposto de aspas, ou seja, se o usuário deseja inserir aspas simples como um caractere, deverá incluir todos os dados a serem inseridos entre aspas duplas.
y Adicionar uma única linha: Exemplo (linha completa):
insert into new_pubs values ('9945', 'Mysteries Galore', 'Kansas City', 'KS') /*Acrescentando o nome de um novo editor*/
Exemplo (inserindo uma aspa simples):
insert into new_pubs values ('4444', "O'Bryan Publishing House", 'Washington', 'DC') /*Acrescentado o nome de um novo editor*/
y Qualquer coluna não incluída deve permitir nulls: Exemplo (linha parcial):
insert new_pubs (pub_id, pub_name) values ('3333', "Jardin's Inc.") /*Acrescentado o nome de um novo editor*/ 154
SQL Server
Introdução a SQL
Inserindo Dados (continuação)
y Se a lista de colunas for omitida, os valores devem estar na mesma ordem que os nomes das colunas na declaração CREATE TABLE.
Exemplo (criando):
create table new_titles (title_id char(6), title varchar(80), type char(12), pub_id char(4), price money null, advance money null, royalty int null, ytd_sales int null, notes varchar(200) null, pubdate datetime not null)
Exemplo (inserindo dados de uma outra tabela):
insert into new_pubs (pub_id, pub_name, city, state) select pub_id, pub_name, city, state from publishers
Exemplo (inserindo dados, usando uma subconsulta):
insert into new_pubs select * from mass_publishers where pub_id in (select pub_id from mass_publishers where city = 'Boston') /*Insere novos editores*/ /*da área de Boston*/
155
SQL Server
Introdução a SQL
Modificação de Dados - Atualizando Dados y A sentença UPDATE modifica o valor de uma ou mais colunas numa tabela (modifica os valores dos dados em linhas existentes, coluna a coluna).
± A sentença SET determina as colunas a serem
modificadas. ± A sentença FROM determina de que tabelas os dados estão sendo originados, se mais de uma tabela estiver sendo usada para determinar o valor da nova coluna. ± A sentença WHERE determina as linhas a serem modificadas. ± Não é possível atualizar múltiplas tabelas numa mesma declaração de atualização (update).
Exemplo (modifica os dados com base num valor constante):
update new_pubs /*O nome de */ set pub_name = "New Publisher's Name" /*um editor */ where pub_name = "New Moon Books" /*mudou */ 156
SQL Server
Introdução a SQL
Atualizando Dados (continuação) Exemplo (modifica dados em todas as linhas que atendem ao critério especificado):
update new_titles set contract = 0 where pub_id = '1389'
Exemplo (altera dados em todas as linhas - sem condições):
update new_titles set advance = 0
Exemplo (altera dados em uma tabela com base em dados de outra):
update new_titles set contract = 0 from new_titles, publishers where new_titles.pub_id = publishers.pub_id and pub_name = 'New Moon Books'
Exemplo (atualização usando uma subconsulta):
update new_titles /*Atualiza o total de vendas*/ set ytd_sales = /*por 'BU1032'*/ (select sum(qty) from sales where title_id = 'BU1032') where title_id = 'BU1032' 157
SQL Server
Introdução a SQL
Modificação de Dados - Removendo Dados y A sentença DELETE remove dados selecionados de uma tabela.
± A chave FROM (depois do delete) é opcional. ± A chave FROM (extensão da sintaxe) permite que
dados sejam apagados de uma tabela com base em dados armazenados em outras tabelas. ± A sentença WHERE especifica as linhas que serão apagadas. Caso esta sentença seja omitida, todas as linhas serão removidas.
Exemplo (remove dados de uma tabela, com base numa constante):
delete from new_pubs where pub_name = 'Mysteries Galore'
Exemplo:
delete from new_titles /*Apaga os dados de todos os*/ where price > $15 /*livros que custam mais de $15*/
158
SQL Server
Introdução a SQL
Removendo Dados (continuação) Exemplo (apaga linhas com base em dados de outras tabelas):
delete new_titles from new_titles, new_pubs where new_titles.pub_id = new_pubs.pub_id and pub_name = "Jardin's Inc."
Exemplo (remove linhas usando uma subconsulta):
delete from new_titles /*Apaga todos os títulos de livros*/ where title_id in /*de qualquer autor de Utah*/ (select title_id from titleauthor where au_id in (select au_id from authors where state = 'UT'))
159
SQL Server
Introdução a SQL
Removendo Definições de Dados y DROP TABLE remove a definição de uma tabela e todos os dados do banco de dados. Sintaxe: drop table nome_da_tabela
[, nome_da_tabela] ...
Exemplo:
drop table new_titles
160
SQL Server
Introdução a SQL
Sumário Chave into - Cria uma tabela a partir de outra já existente.
select lista_de_seleção [into tabela] [from {tabela} [,..]] [where condições_de_busca]
Sentença delete - Remove os dados selecionados de uma tabela.
delete [from] {nome_da_tabela} [where condições_de_busca]
drop table - remove a definição de uma tabela e todos os dados do banco de dados.
drop nome_da_tabela [,nome_da_tabela]...
Sentença insert - Acrescenta dados a uma tabela já existente.
insert [into] nome_da_tabela [(lista_de_colunas)] {values(lista_de_valores)|declaração_select}
161
SQL Server
Introdução a SQL
Sumário (continuação) Sentença update - Modifica o valor de uma ou mais colunas numa tabela (muda os valores de dados de linhas existentes).
update nome_da_tabela set nome_da_coluna = {expressão | null} [, set nome-da_coluna = {expressão |null} [from nome_da_tabela, nome_da_tabela, ...] [where condições_de_busca]
162
SQL Server
Introdução a SQL
Lab: Definições de Dados y Neste exercício você criará sua própria tabela. 1. Usando select into, crie uma tabela chamada addressN (onde N é o seu número de usuário) que possui as mesmas colunas que a tabela authors. (Dica: use uma sentença where falsa). 2. Insira duas linhas de dados na tabela addressN (crie entradas de dados fictícias). 3. Insira dados na tabela addressN através da recuperação de todos os autores que moram em Palo Alto e San Jose, a partir da tabela authors. (Dica: use insert com uma declaração select) 4. Modifique um valor existente: o código postal (zip) das pessoas que moram em Palo Alto mudou para µ94333¶. 5. Apague todas as entradas que têm o nome da cidade San Jose.
163