CH02 – Entendendo Bancos de Dados Relacionais
Agora que você chegou a conhecer as ferramentas que você vai usar neste livr...
• Compacto: Os bancos de dados ajudam a manter grandes quantidades de dados e, assim, substituir completamente
os arquivos...
• Menos caro: a maioria das soluções de desktop estão disponíveis para apenas algumas centenas de dólares. Na
verdade, se ...
objeto irá se conectar ao outro e por que tipo de relacionamento (um-um ou um-muitos). Relacionamentos são
explicados mais...
Figura 2-1. (ao lado) Um relacionamento um-para-muitos
Muitos-para-muitos (M: M): Para cada linha na Tabela A, há zero ou ...
Relacionamentos são representados por dados em tabelas. Para estabelecer uma relação entre duas tabelas, você
precisa ter ...
inválido. Qualquer operação que cria uma duplicata chave primária ou aquele que contém valores nulos é rejeitada.
Ou seja,...
normalizado como deveria ser. Criando uma outra tabela para os gestores que utilizam um ID menor que o gerente de
nome, em...
Criação de Banco de Dados e Tabelas
Ao desenvolver aplicativos, muitas vezes você vai ser obrigado a criar um banco de dad...
model Este é um modelo de dados; portanto, ele tem configurações padrão que são aplicados a todos os
outros bancos de dado...
local de SQL Server, você verá o arquivo de banco de dados. No meu caso, meu caminho de pasta SQL me mostra os
arquivos na...
SQL Server Management Studio tem uma nova aparência na versão do SQL Server 2012; na verdade,
Microsoft tem utilizado a ID...
• Por padrão dados e arquivos de log têm a liberdade de continuar crescendo até que o disco esteja cheio; em
outras palavr...
Uma limitação do argumento Tamanho é que ele tem que ter um mínimo de 4MB
inicialmente para que ele possa acomodar as conf...
Figura 3-7. Criar instrução de banco de dados com argumentos
Agora você sabe como criar um banco de dados usando código, u...
Tipos de dados do SQL Server para colunas da tabela
Para oferecer suporte a requisitos de negócio, o SQL Server fornece vá...
Figura 3-8. A instrução CREATE TABLE e as propriedades da coluna
Adicionando uma coluna IDENTITY em uma tabela
Às vezes, o...
Em seguida, expanda o nó da tabela e o nó Colunas, e você vai ver a coluna Id adicionada à tabela, como mostrado na
Figura...
Selecione esta declaração cria tabela e pressione Executar; em seguida, selecione o banco de dados Mysqldb no
Pesquisador ...
Trabalhando com Banco de dados e XML
Capitulo 4
Manipulação de banco de dados
Agora que você sabe como criar bancos de dad...
Como funciona
A primeira coluna, ID, é uma coluna de identidade, e você não pode inserir valores para ele explicitamente o...
Insert into MySqlTable (Name,Age,SSN,Date,Gender)
Values('Vamika',6,'333-30-1234',GetDate(),'Female'),
('Arshika',1,'444-4...
Atualização de dados
Você pode modificar os dados com a declaração UPDATE. Ao codificar instruções UPDATE, você deve ter o...
Quando você atualizar mais de uma coluna, você ainda usa a palavra-chave SET apenas uma vez, e você
separar os nomes das c...
Isso deve produzir um painel de mensagens relatando "(1 linha(s) afetadas)." Execute o Select * from
MySqlTable declaração...
Capitulo 5
Consultar bancos de dados
Neste capítulo, você vai aprender sobre codificação de consultas no SQL Server 2012. ...
Figura 5-1. Selecionando um banco de dados para consulta
Experimente: Executando uma consulta simples
Para enviar uma cons...
Como funciona
Você pergunta o banco de dados para retornar os dados para todas as colunas, e você terá exatamente isso. Se...
Experimente: Aprimorando sua consulta
Neste exercício, você vai ver como refinar sua consulta.
1. Adicione a seguinte cláu...
Tabela 5-1. Operadores de comparação
Operador Descrição Exemplo
= Igual a AddresslD = 1
< Menor que AddresslD < 1
> Maior ...
Classificação de dados (ORDER BY)
Depois que você já filtrou os dados que você quer, você pode classificar os dados por um...
Como Funciona
Vamos olhar para as cláusulas individualmente. A lista SELECT especifica quais colunas você deseja usar.
Sel...
Se você irá rolar o resultado definido para baixo como o Redmond, então você vai ver que ele mostra 121 linhas, como
você ...
Figura 5-8. Usando o operador LIKE com %
Como Funciona
Você especificar três colunas da tabela de endereços.
Select Addres...
Figura 5-9. Usando o operador LIKE com _
Como funciona
Você especificar três colunas da tabela de endereços.
Select Addres...
Figura 5-10. Usando o operador LIKE com [ ]
Como funciona
Você especificar três colunas da tabela Address.
Select AddressI...
Figura 5-11. Usando o operador LIKE com [^]
Como Funciona
Você especificar três colunas da tabela de Address.
Select Addre...
Figura 5-12. Usando funções agregadas
Como Funciona
Você usa as funções MIN e MAX para encontrar o valor máximo da função ...
Figura 5-13. Usando a função agregada COUNT
Como Funciona
A função COUNT tem um comportamento diferente dependendo do parâ...
Figura 5-14. Usando funções de data e hora
Como Funciona
Você usa uma versão diferente do padrão de uma consulta, omitindo...
negação, bem como, NOT IN, assim você pode escolher os valores que você não quer ser incluído em seu conjunto de
resultado...
Figura 5-16. Usando o operador NOT IN
Como Funciona
Você especificar três colunas da tabela de endereços.
select AddressID...
Figura 5-17. Usando o operador Between
Como Funciona
Você especificar três colunas da tabela de endereços.
select AddressI...
Como funciona
Você especificar três colunas da tabela de endereço.
select AddressID, AddressLine1, City
from Person.Addres...
where MiddleName is null
Experimente: Usando o operador is NOT NULL
Abra uma janela de nova consulta no SQL Server Managem...
especificação de junção, o operador de igualdade (=) é quase sempre utilizada. Joins usando o operador de igualdade
são ch...
Como Funciona
Vamos começar com a lista SELECT.
select PP.ProductID, PP.Name, PPR.ReviewerName, PPR.Comments, PPR.Rating
J...
(Lembre-se de fazer AdventureWorks seu contexto de consulta). Digite a seguinte consulta e clique em executar. Você
verá o...
seu contexto de consulta). Digite a seguinte consulta e clique em executar. Você verá os resultados mostrados na
Figura 5-...
C # banco de dados
C # banco de dados
Próximos SlideShares
Carregando em…5
×

C # banco de dados

639 visualizações

Publicada em

Uma introdução de banco de Dados co C#

Publicada em: Educação
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
639
No SlideShare
0
A partir de incorporações
0
Número de incorporações
1
Ações
Compartilhamentos
0
Downloads
14
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

C # banco de dados

  1. 1. CH02 – Entendendo Bancos de Dados Relacionais Agora que você chegou a conhecer as ferramentas que você vai usar neste livro, eu vou voltar um pouco e uma breve introdução aos conceitos fundamentais importantes do mundo do banco de dados. Neste capítulo, falarei o seguinte: • O que é um banco de dados? • Escolher entre uma planilha e um banco de dados • Por que usar um banco de dados? • Benefícios da utilização de um sistema de gerenciamento de banco de dados relacional • Comparando os sistemas de desktop e servidor RDBMS • O ciclo de vida de dados • Mapeamento cardinalidades • Entendendo chaves • Entendendo integridade dos dados • conceitos de normalização • Desvantagem de normalização O que é um banco de dados? Em termos muito simples, um banco de dados é uma coleção de informações estruturadas. Os bancos de dados são projetados especificamente para gerenciar grandes massas de informações, e eles armazenam dados de forma organizada e estruturada, que torna mais fácil para os usuários a gerenciar e recuperar esses dados, quando necessário. Um sistema de gerenciamento de banco de dados (DBMS) é um programa de software que permite aos usuários criar e manter bases de dados. Um DBMS também permite aos usuários escrever consultas para um banco de dados individual para executar as ações necessárias, tais como a recuperação de dados, modificar dados, exclusão de dados, e assim por diante. Mesas de apoio DBMSs para armazenar dados em linhas e colunas, semelhante a como os dados aparece em um aplicativo de planilha. Um sistema de gerenciamento de banco de dados relacional (RDBMS) é um tipo de DBMS que armazena informações na forma de tabelas relacionadas. RDBMS baseia-se no modelo relacional. Escolher entre uma planilha e um banco de dados Se os bancos de dados são muito parecidos com folhas de cálculo, por que as pessoas ainda usam aplicativos de banco de dados? Um banco de dados é projetado para executar as seguintes ações de uma maneira mais fácil e mais produtivo do que um aplicativo de planilha exigiria: • Recuperar todos os registros que correspondam a critérios específicos • Atualizar ou modificar um conjunto completo de registros de uma só vez • Extrair valores a partir de registros distribuídos entre várias tabelas Por que usar um banco de dados? A seguir estão algumas das razões pelas quais você usaria bancos de dados:
  2. 2. • Compacto: Os bancos de dados ajudam a manter grandes quantidades de dados e, assim, substituir completamente os arquivos de papel volumosos. • Velocidade: Procura por uma determinada peça de dados ou informações em um banco de dados são muito mais rápido do que a triagem através de pilhas de papel. • Menos trabalho penoso: É um trabalho maçante para manter os arquivos à mão; utilizando um banco de dados elimina completamente tais manutenção. • Moeda: sistemas de banco de dados pode ser facilmente atualizado e assim fornecer informações precisas todo o tempo e sob demanda. Benefícios do Uso de um Sistema de Gestão de Banco de Dados Relacional RDBMSs oferecem vários benefícios, controlando o seguinte: • Redundância: RDBMSs impedir que você tenha cópias duplicadas dos mesmos dados, o que ocupa espaço em disco desnecessariamente. • Inconsistência: Cada conjunto redundante de dados pode não concordar com outros conjuntos de os mesmos dados. Quando um RDBMS remove redundância, inconsistência não pode ocorrer. • A integridade dos dados: Os valores dos dados armazenados no banco de dados deve satisfazer certos tipos de restrições de consistência. (Discutirei esse benefício em mais detalhes na seção "Compreender a integridade dos dados", mais adiante neste capítulo.) • atomicidade de dados: Em caso de falha, os dados são restaurados para o estado consistente que existia no anterior ao fracasso. Por exemplo, a atividade de transferência de fundos deve ser atômica. (Eu vou cobrir a atividade de transferência de fundos e atomicidade em mais detalhes no Capítulo 6.) • anomalias de acesso: RDBMSs prevenir mais de um usuário de atualizar o mesmo dados simultaneamente; essas atualizações concorrentes pode resultar em dados inconsistentes. • Segurança dos dados: Nem todo usuário do sistema de banco de dados deve ser capaz de acessar todos os dados. Segurança se refere à proteção dos dados contra qualquer acesso não autorizado. • O processamento de transações: uma transação é uma sequência de operações de banco de dados que representa uma unidade lógica de trabalho. Em RDBMSs, uma transação seja confirmada todas as mudanças ou reverte todas as ações realizadas até o ponto em que a falha ocorreu. • Recuperação: características de recuperação de garantir que os dados são reorganizados em um estado consistente após uma transação falhar. • Gestão de armazenamento: RDBMSs fornecer um mecanismo para o gerenciamento de armazenamento de dados. O esquema interno define como os dados devem ser armazenados. Comparando desktop e servidor RDBMS Sistemas Na indústria de hoje, você vai trabalhar principalmente com dois tipos de bancos de dados: bancos de dados de desktop e bancos de dados do servidor. Aqui, eu vou te dar uma breve olhada em cada um deles. Os bancos de dados de desktop Bancos de dados desktop são projetados para servir a um número limitado de usuários e executado em PCs desktop, e eles oferecem uma solução menos expansiva onde quer que um banco de dados é necessário. As chances são de que você trabalhou com um programa de banco de dados de área de trabalho; Microsoft SQL Server Express, Microsoft Access, Microsoft FoxPro, FileMaker Pro, Paradox e Lotus são todas as soluções de banco de dados desktop. Bancos de dados desktop diferem dos bancos de dados do servidor, das seguintes formas:
  3. 3. • Menos caro: a maioria das soluções de desktop estão disponíveis para apenas algumas centenas de dólares. Na verdade, se você possui uma versão licenciada do Microsoft Office Professional, você já é proprietário de uma licenciada do Microsoft Access, que é um dos programas de banco de dados de desktop mais usados comumente e amplamente ao redor. • Fácil utilização: Bancos de dados desktop são bastante amigáveis e fáceis de trabalhar, porque eles não requerem SQL complexa da base de dados para realizar operações (embora alguns bancos de dados de desktop também suportam a sintaxe SQL, se você quiser escrever código). Bancos de dados desktop em geral, oferecem uma interface gráfica fácil de usar. Os bancos de dados do servidor Bancos de dados do servidor são projetados especificamente para atender a vários usuários ao mesmo tempo e oferecer recursos que permitem gerenciar grandes quantidades de dados de forma muito eficiente, servindo várias solicitações de usuários simultaneamente. Exemplos bem conhecidos de bancos de dados de servidor incluem o Microsoft SQL Server, Oracle, Sybase e DB2. Com a finalidade de construção de aplicações de banco de dados neste livro, vamos usar o SQL Server 2012 como o aplicativo de banco de dados. Depois de ter aprendido como construir um aplicativo com um determinado banco de dados, não é difícil construir a sua aplicação contra outros bancos de dados também. A seguir estão algumas outras características que diferenciam Bancos de dados do servidor de suas contrapartes desktop: • Flexibilidade: Bancos de dados do servidor são projetados para ser muito flexível e suportar múltiplas plataformas, responder às solicitações provenientes de vários usuários de banco de dados, e executar qualquer tarefa de gerenciamento de banco de dados com velocidade ideal. • Disponibilidade: Bancos de dados do servidor são destinados para as empresas, para que eles precisam estar disponíveis 24/7. Para estar disponível o tempo todo, Bancos de dados de servidor vêm com algumas características HighAvailability, como espelhamento e envio de log. • Performance: Bancos de dados do servidor geralmente têm suporte de hardware enorme, por isso os servidores que executam esses bancos de dados têm grandes quantidades de RAM e CPUs múltiplas. É por isso que Bancos de dados do servidor de suporte de infraestrutura rica e dar um ótimo desempenho. • Escalabilidade: Esta propriedade permite que um banco de dados do servidor para expandir sua capacidade de processar e armazenar os registros mesmo que tem crescido muito. O Ciclo de Vida de banco de dados O ciclo de vida do banco de dados define o processo completo, desde a concepção até a implementação. Os processos deste ciclo de desenvolvimento e de implementação pode ser dividida em pequenas fases; somente após a conclusão de cada fase você pode passar para a próxima. Antes de entrar no desenvolvimento de qualquer sistema, você precisa ter forte um modelo de ciclo de vida a ser seguido. O modelo deve ter todas as fases definidas na sequência correta, o que ajudará a equipe de desenvolvimento construir o sistema com menos problemas e funcionalidades como o esperado. O ciclo de vida do banco de dados é composto pelas seguintes etapas, desde as etapas básicas envolvidas na concepção de um esquema global do banco de dados para a implementação e manutenção de banco de dados: • Análise de requisitos: Requisitos precisam ser determinada antes de começar concepção e implementação. Os requisitos podem ser obtidos por meio de entrevistas tanto o produtor e o usuário dos dados; este processo ajuda na criação de uma especificação formal requisito. • Projeto lógico: Após levantamento de requisitos, os dados e as relações precisam ser definidas através de uma técnica de modelagem de dados conceitual, como um entityrelationship (ER) diagrama. Este diagrama mostra como um
  4. 4. objeto irá se conectar ao outro e por que tipo de relacionamento (um-um ou um-muitos). Relacionamentos são explicados mais adiante neste capítulo. • Concepção física: Uma vez que o desenho lógico está no lugar, o próximo passo é produzir a estrutura física para a base de dados. A fase de projeto físico envolve a criação de tabelas e selecionando índices. Uma introdução aos índices está fora do escopo deste livro, mas um índice é basicamente como um índice de um livro, o que lhe permite saltar para uma página específica com base no tema de sua escolha e ajuda a evitar a embaralhar todas as páginas do livro para acessar a página de interesse. Índices de banco de dados faz algo semelhante; eles gerenciar e manter a ordem das linhas quando inserida na tabela, o que ajuda a consultas SQL extrair dados rápida com base em um valor fornecido para a coluna do índice. • Implementação de banco de dados: Uma vez que o projeto estiver concluído, o banco de dados pode ser criado através da implementação de esquema formal, utilizando a linguagem de definição de dados (DDL) do RDBMS. A DDL consiste nas declarações que desempenham papéis fundamentais em criar, modificar e apagar os objetos de banco de dados ou banco de dados. CREATE, ALTER e DROP são exemplos de uma DDL. • Modificação de dados: Uma linguagem de modificação de dados (DML) pode ser usado para consultar e atualizar o banco de dados, bem como criar índices e estabelecer restrições, como a integridade referencial. A DML consiste nas declarações que desempenham papéis fundamentais na inserção, atualização e exclusão de dados a partir de tabelas de banco de dados. INSERT, UPDATE e DELETE são exemplos de uma DDL. • Monitoramento de banco de dados: como o banco de dados começa a operação, monitoramento indica se os requisitos de desempenho estão sendo atendidas; se não forem, as modificações devem ser feitas para melhorar o desempenho do banco de dados. Assim, o ciclo de vida do banco de dados continua com o monitoramento, redesenho e modificações. Mapeamento Cardinal As tabelas são os componentes fundamentais de um banco de dados relacional. Na verdade, ambos os dados e as relações são armazenados simplesmente como dados em tabelas. As tabelas são compostas de linhas e colunas. Cada coluna representa uma peça de informação. Cardinalidade de mapeamento, ou razões de cardinalidade, expressa o número de entidades a que outra entidade pode ser associada através de um conjunto de relacionamento. Cardinalidade refere-se à singularidade de valores de dados contidos em uma determinada coluna de uma tabela de banco de dados. O termo banco de dados relacional refere-se ao fato de que diferentes tabelas, muitas vezes contêm dados relacionados. Por exemplo, um representante de vendas em uma empresa pode ter muitas encomendas, que foram colocados por muitos clientes. Os produtos encomendados podem ser provenientes de diferentes fornecedores, e as chances são de que cada fornecedor pode fornecer mais de um produto. Todas essas relações existem em quase todos os banco de dados e podem ser classificados da seguinte forma: Um-Para-um (1:1): para cada linha na tabela A, há no máximo apenas uma linha relacionada na tabela B e vice-versa. Esta relação é normalmente usada para separar os dados por frequência de utilização ideal organizar dados fisicamente. Por exemplo, um departamento pode ter apenas um chefe. Um-para-muitos (m): para cada linha na tabela A, pode haver zero ou mais relacionados linhas na tabela B; Mas para cada linha na tabela B, há no máximo uma linha no quadro a Esta é a relação mais comum. Figura 2-1 mostra um exemplo de um relacionamento Um-para-muitos de tabelas no Northwind. Observe a tabela de clientes tem um Campo CustomerID como chave primária (indicado pelo símbolo de chave à esquerda), que tem uma relação com o campo CódigoDoCliente da tabela Orders; CustomerID é considerado uma chave estrangeira na tabela Orders. O link mostrado entre os As tabelas Customers e Orders indica uma relação um-para-muitos, porque muitas ordens podem pertencer a um cliente. Aqui, os clientes são referidos como a tabela pai e Orders é a tabela filho na relação.
  5. 5. Figura 2-1. (ao lado) Um relacionamento um-para-muitos Muitos-para-muitos (M: M): Para cada linha na Tabela A, há zero ou mais relacionado linhas na tabela B, e vice-versa. Muitos-para-muitos relacionamentos não são tão fáceis de alcançar, e que exigem uma técnica especial para implementá-las. Esta relação é executada em um formato de um muito um, por isso, requer uma terceira tabela (muitas vezes referida como uma tabela de junção) para ser introduzido no meio, que serve como o caminho entre as tabelas relacionadas. Esta é uma relação muito comum. A Figura 2-2 mostra um exemplo do Northwind: um pedido pode ter muitos produtos e um produto pode pertencer a muitos pedidos. A tabela Order Details representa não só a M: M relação, mas também contém dados sobre cada combinação específica do produto da ordem. Figura 2-2. (abaixo) Um relacionamento muitos-para-muitos □ Nota: Embora as relações entre as tabelas são extremamente importantes, o banco de dados relacional termo não tem nada a ver com eles. Bancos de dados relacionais são (em graus diferentes) com base no modelo de dados relacional inventada pelo Dr. Edgar F. Codd da IBM na década de 1970. Codd baseou seu modelo no conceito matemático (set-teórico) de uma relação. Relações são conjuntos de tuplas que podem ser manipulados com um conjunto de operações matemáticas em-fato, dois conjuntos bem definidos e bem-comportado: álgebra relacional e cálculo relacional. Você não tem que saber ou entender a matemática para trabalhar com bancos de dados relacionais, mas se você ouvir dizer que um banco de dados é relacional porque "relaciona dados", você vai saber que quem disse que não entende bancos de dados relacionais. Compreender Chaves A chave, a chave de todo, e nada mais que a chave, então me ajude Codd.
  6. 6. Relacionamentos são representados por dados em tabelas. Para estabelecer uma relação entre duas tabelas, você precisa ter os dados em uma tabela que lhe permite encontrar registros relacionados em outra tabela. É aí que entram em chaves, e um RDBMS trabalha principalmente com dois tipos de chaves, como mencionado anteriormente: chaves primárias e chaves estrangeiras. Uma chave é uma ou mais colunas de uma relação que é usado para identificar uma linha. Chaves primárias Uma chave primária é um atributo (coluna) ou combinação de atributos (colunas) cujos valores exclusivamente identifica registros em uma entidade. Antes de escolher uma chave primária para uma entidade, um atributo deve ter as seguintes propriedades: • Cada registro da entidade deve ter um valor não-nulo. • O valor deve ser exclusivo para cada registro inserido na entidade. • Os valores não devem alterar ou tornar-se nula durante a vida de cada instância da entidade. • Pode haver somente uma chave primária definida para uma entidade. Além de ajudar em identificar com exclusividade um registro, a chave primária também ajuda na busca de registros Porque um índice automaticamente Obtém gerado como você atribuir uma chave primária para um atributo. Uma entidade terá mais de um atributo que pode servir como uma chave primária. Qualquer conjunto de chave ou mínimo de chaves que podem ser uma chave primária é chamada uma chave candidata. Uma vez identificadas, chaves candidato escolher um e somente um, chave primária para cada entidade. Às vezes requer mais de um atributo para identificar com exclusividade uma entidade. Uma primária chave que é composto de mais de um atributo é conhecido como uma chave composta. Pode haver somente uma chave primária em uma entidade, mas uma chave composta pode ter vários atributos (em outras palavras, uma chave primária será definida apenas uma vez, mas ele pode ter até 16 atributos). A chave primária representa a entidade-mãe. Chaves primárias são geralmente definidas com a propriedade de identidade, que permite a inserção de um auto incrementado valor inteiro para a tabela quando você insere uma linha na tabela. Quando um atributo extra é uma propriedade de identidade e ele é adicionado a uma coluna, é chamado como substituto chave. O valor de tais colunas é gerado em tempo de execução direita antes que o registro é inserido e depois armazenados em uma tabela. Chaves Estrangeiras Uma chave estrangeira é um atributo que termina um relacionamento, identificando a entidade pai. As chaves estrangeiras fornecem um método para manter a integridade dos dados (chamado integridade referencial) e para navegar entre as diferentes instâncias de uma entidade. Todo relacionamento no modelo deve ser apoiada por uma chave estrangeira. Por exemplo, na Figura 2-1 anteriormente, as tabelas Customers e Orders tem uma chave primária e relacionamento de chave estrangeira, onde o campo CustomerID da tabela Orders é a chave estrangeira ter uma referência para o campo CustomerID, que é a chave primária dos Clientes tabela. Noções básicas sobre integridade de dados Integridade dados significa que valores de dados em um banco de dados estão corretos e consistentes. Há dois aspectos a integridade dos dados: integridade de entidade e integridade referencial. Integridade de entidade Nós mencionado anteriormente em "Chaves primárias" que nenhuma parte de uma chave primária pode ser nulo. Esta é a garantia de que os valores de chave primária existem para todas as linhas. A exigência de que os valores de chave primária existem e que eles são únicos é conhecida como integridade de entidade (EI). O DBMS impõe integridade de entidade, não permitindo que operações (INSERT, UPDATE) para produzir uma chave primária
  7. 7. inválido. Qualquer operação que cria uma duplicata chave primária ou aquele que contém valores nulos é rejeitada. Ou seja, para estabelecer a integridade de entidade, você precisará definir chaves primárias, então o DBMS pode impor sua exclusividade. Integridade referencial Uma vez que uma relação é definida entre tabelas com chaves estrangeiras, os dados da chave devem ser gerenciados para manter as relações corretas, ou seja, para impor a integridade referencial (RI). RI exige que todos os valores de chave estrangeiros em uma criança apresentar qualquer combinação de valores de chave primária em uma tabela pai ou (se permitido) ser nulo. Isso também é conhecido como satisfazendo uma restrição de chave estrangeira. Conceitos de normalização Normalização é uma técnica para evitar potenciais anomalias de atualização, basicamente, minimizando dados redundantes em um design de banco de dados lógico. Normalizado desenhos são de certa forma "melhores" desenhos porque eles mantem (idealmente) cada item de dados em um só lugar. Projetos de banco de dados normalizado normalmente reduzem os custos de processamento de atualização, mas podem fazer o processamento de consulta mais complicado. Estas trocas devem ser cuidadosamente avaliadas em termos o perfil de desempenho exigido de um banco de dados. Muitas vezes, um design de banco de dados precisa ser desnormalizada para atender as necessidades operacionais. Normalizar um projeto lógico de banco de dados envolve um conjunto de processos formais para separar os dados em várias tabelas relacionadas. O resultado de cada processo é referido como uma forma normal. Foram identificadas cinco formas normais na teoria, mas na maioria das vezes terceira forma normal (3NF) é na medida em que você precisa ir na prática. Para ser em 3NF, uma relação (o termo formal para o SQL chama uma tabela e o conceito exato em que assenta a teoria matemática da normalização) já deve estar na segunda forma normal (2NF) e 2NF requer uma relação ser na primeira forma normal (1NF). Vamos analisar brevemente o que quer dizer estas formas normais: Primeira forma normal (1NF): na primeira forma normal, todos os valores de coluna são escalares; em outras palavras, eles têm um valor único que não pode mais ser decomposto em termos do modelo de dados. Por exemplo, apesar de caracteres individuais de uma string podem ser acessados através de um procedimento que decompõe-se a sequência de caracteres, somente a sequência inteira é acessível pelo nome em SQL, assim como respeita o modelo de dados, eles não são parte do modelo. Da mesma forma, para uma tabela de gerentes com uma coluna de gerente e uma coluna que contém uma lista de empregados na tabela empregados que trabalham para um determinado gerente, o gerente e a lista seria acessíveis pelo nome, mas os empregados individuais na lista não seria. Todas as relações — e tabelas SQL — são, por definição na 1NF, desde o menor nível de acessibilidade (conhecido como granularidade da tabela) é o nível de coluna, e os valores de coluna são escalares em SQL. Segunda forma normal (2NF): segunda forma normal requer que atributos (o termo formal para colunas do SQL) que não são partes de chaves ser funcionalmente dependente de uma chave que identifica-los. Dependência funcional, basicamente, significa que para um determinado valor de chave, existe apenas um valor em uma tabela de uma coluna ou conjunto de colunas. Por exemplo, se uma tabela contida empregados e seus títulos e mais de um empregado poderia ter o mesmo título (muito provável), uma chave que identificado exclusivamente empregados não identifica títulos, os títulos não seria funcionalmente dependentes de uma chave da tabela. Para colocar a tabela em 2NF, você poderia criar uma tabela separada para títulos — com sua própria chave exclusiva — e substituir o título da tabela original com uma chave estrangeira para a tabela nova. Observe como isto reduz a redundância de dados. O próprio título agora aparece apenas uma vez no banco de dados. Apenas as chaves aparecem em outras tabelas e dados da chave não são considerados redundantes (embora, claro, isso requer colunas em outro armazenamento de dados e tabelas). Terceira forma normal (3FN): forma normal Terceiro estende o conceito de funcional dependência a dependência funcional completo. Essencialmente, isso significa que todas as colunas não-chave em uma tabela são identificadas exclusivamente pelo todo, não apenas parte, a chave primária. Por exemplo, se você revisou a tabela hipotética 1NF Managers-funcionários a ter três colunas (ManagerName, EmployeeID, e EmployeeName) em vez de dois e você definiu a chave primária composta como ManagerName + EmployeeId, a tabela seria em 2NF (desde EmployeeName, a coluna não-chave, é dependente da chave primária), mas não seria em 3FN (desde EmployeeName é identificado exclusivamente por parte da chave primária definida como a coluna chamada EmployeeId). Criando uma tabela separada para os funcionários e removendo EmployeeName de gerentes de funcionários iria colocar a tabela na 3FN. Note-se que mesmo que esta tabela está agora normalizada para 3FN, o projeto de banco de dados ainda não é tão
  8. 8. normalizado como deveria ser. Criando uma outra tabela para os gestores que utilizam um ID menor que o gerente de nome, embora não seja necessário para a normalização aqui, é definitivamente uma abordagem melhor e provavelmente é aconselhável para um banco de dados do mundo real. Desvantagens de normalização Projeto de banco de dados é uma arte mais do que uma tecnologia, e aplicar a normalização com sabedoria é sempre importante. Por outro lado, a normalização inerentemente aumenta o número de tabelas e, por conseguinte, o número de operações (chamada junta) necessário para recuperar dados. Como os dados não se encontra numa tabela, as consultas que têm um complexo de junção pode retardar as coisas. Isso pode custar na forma de uso da CPU: quanto mais complexas as consultas, é necessário mais tempo de CPU. Desnormalizar uma ou mais tabelas, fornecendo intencionalmente dados redundantes para reduzir o número ou a complexidade da junta para obter tempos de resposta mais rápidos de consulta, pode ser necessário. Com a normalização ou desnormalização, o objetivo é controlar a redundância, para que o projeto de banco de dados de forma adequada (e, idealmente, de forma otimizada) apoia o uso real do banco de dados. Capitulo 03
  9. 9. Criação de Banco de Dados e Tabelas Ao desenvolver aplicativos, muitas vezes você vai ser obrigado a criar um banco de dados e adicionar tabelas a ele, em vez de apenas usar um banco de dados objetos e tabelas existentes. Este capítulo é sobre a criação de um banco de dados novo e, em seguida, criar as tabelas que ele contém. Neste capítulo, Falarei sobre o seguinte: • Lançamento do SQL Server Management Studio • Os tipos de bancos de dados SQL Server • A arquitetura de um banco de dados SQL Server • Criação de um banco de dados de uma forma simples • Criação de um banco de dados com as suas próprias definições • Criação de tabelas Iniciando o SQL Server Management Studio SQL Server Management Studio (SSMS) tem sido a principal ferramenta de desenvolvimento para o SQL Server desde 2005. Você pode usar o SSMS para implementar, desenvolver e administrar bancos de dados. Claro, porque este livro é para desenvolvedores de aplicativos, o nosso foco será em desenvolvimento. Como mencionado no Capítulo 1, é importante para que os seus serviços do SQL Server instalado e funcionando (em outras palavras, iniciado) antes que você possa se conectar com êxito com Database Engine no SSMS e começar a criar o seu próprio banco de dados e tabelas. Para iniciar SSMS, selecione Todos os Programas, Microsoft SQL Server 2012 SQL Server Management Studio. Certifique-se de que a caixa de diálogo Conectar ao Servidor tem os vales corretos e clique em Connect. Isso deve iniciar o SQL Server Management Studio. Tipos de bancos de dados SQL Server SQL Server tem dois tipos de bancos de dados: bancos de dados do sistema e bancos de dados do usuário. • Banco de dados do sistema são aqueles que vêm pré-instalados com todas as versões do SQL Server e apoiar o sistema de banco de dados SQL Server, quando você está realizando tarefas como criar, manter e administrar bancos de dados. Eles estão localizados na pasta Bancos de Dados do Sistema e são nomeados master,, model,, msdb e tempdb, como mostrado na Figura 3-1. Figura 3-1. Bancos de dados de sistema do SQL Server Tabela 3-1 descreve cada um dos bancos de dados de sistema do SQL Server, como mostrado na Figura 3-1. Banco de dados Descrição máster Este é um controle de banco de dados principal que armazena informações de nível de sistema sobre os usuários, várias configurações e até mesmo informações sobre os outros bancos de dados em SQL Servidor.
  10. 10. model Este é um modelo de dados; portanto, ele tem configurações padrão que são aplicados a todos os outros bancos de dados que você criar. msdb Administração do SQL Server na maioria das vezes requer que você executar trabalhos agendados. SQL Agente de servidor (que também está listado no Services.msc abaixo o serviço do SQL Server) é a principal consumidor deste banco de dados. tempdb É um armazenamento temporário dedicado para o SQL Server, e pode conter todos os temporários objetos como tabelas, procedimentos armazenados e assim por diante. Isso também pode servir as necessidades de quaisquer outros requisitos de armazenamento temporário que possa ter o SQL Server. • bancos de dados de usuários são aqueles que são ou disponível como bancos de dados de amostra, como AdventureWorks (que você baixou e anexado no Capítulo 1) ou qualquer banco de dados SQL Server que já foi criado, em qualquer lugar em qualquer sistema SQL Server, incluindo um que você ou sua organização está construindo uma aplicação em cima. Alguns bancos de dados de amostra fornecidos pela Microsoft são pubs, northwind,e AdventureWorks. Desde que você já tenha anexado AdventureWorks para o SQL Server 2012, serão coletados em Objetos, como mostrado na Figura 3-2. Figura 3-2. Bancos de dados de usuário do SQL Server Movendo-se para a frente, os bancos de dados que você criar será bancos de dados de usuários e listadas após a pasta System Databases. Vale ressaltar aqui que não há nenhuma maneira que você pode criar seu próprio banco de dados do sistema ou criar um banco de dados e colocá-lo na pasta System Databases. A arquitetura de um banco de dados do SQL Server Bancos de dados SQL Server 2012 consiste em dados e informações de log. Esta informação de dados e log são armazenados em arquivos individuais. • Arquivo de dados primário: Este é o principal arquivo que constrói um banco de dados SQL Server, porque aponta para outros arquivos no banco de dados. A extensão do arquivo necessário para este arquivo é .mdf, e um banco de dados SQL Server pode ter apenas um arquivo de dados primário. • Os arquivos de log de dados: Este é o arquivo de recuperação, que armazena todas as informações de log que é usado para recuperar um banco de dados em caso de falha. A extensão do arquivo necessário para este arquivo é .ldf. Qualquer banco de dados deve ser composto de pelo menos um arquivo de log, mas não pode haver mais do que um arquivo de log em um banco de dados. □ Nota: há um terceiro tipo de arquivo, também conhecido como arquivo de dados secundário, que também é usado para armazenar informações de dados, apontado pelo arquivo de dados primário. Um banco de dados pode ter vários arquivos de dados, e a extensão necessária para um arquivo de dados é .ndf. Porque a maioria dos bancos de dados industriais é feita de primária e arquivos de log, eu não estou incluindo mais detalhes sobre o secundário e em vez disso, incidirá na primária e arquivos de log. Você pode querer aprender mais sobre ele em http://msdn.microsoft.com. O fato de que cada banco de dados consiste em arquivos .mdf e .ldf aplica-se a bancos de dados do sistema, bem como bancos de dados do usuário. Para ver isso, vá para a pasta do servidor de SQL em arquivos de programa (ver capítulo 1 para obter informações sobre como encontrar o caminho da pasta do SQL Server); uma vez que você está no seu
  11. 11. local de SQL Server, você verá o arquivo de banco de dados. No meu caso, meu caminho de pasta SQL me mostra os arquivos na Figura 3-3. Figura 3-3. Arquivos de banco de dados do SQL Server A pasta lista todos os arquivos .mdf e .ldf arquivo nomes que compõem um banco de dados do SQL Server, incluindo bancos de dados de sistema e usuário. Por exemplo, referir-se a master.mdf e master.ldf e veja descrição destes arquivos sob o tipo de coluna para a direita. Além disso, você pode ver o banco de dados AdventureWorks que você anexou no capítulo 1 também é listado aqui com seu associado arquivos .mdf e .ldf ficheiros. Agora se você continuar a trabalhar com esta instância específica do SQL Server, todos os seus bancos de dados estarão sob o mesmo local. □ Nota: comparar a estrutura de pasta mostrada na Figura 3-3 com sua pasta. Mostrar-se-á provavelmente um conjunto diferente de arquivos de bancos de dados, especialmente para bancos de dados do usuário e alguns recursos do SQL Server como o Reporting Services. Portanto, a vista do seu sistema de SQL Server pode diferir a figura. Criando um banco de dados de forma simples Para começar a criar um banco de dados, você precisa abrir o SSMS, se ainda não estiver aberta. Em seguida, clique em Nova consulta, e você deverá ver uma janela como na Figura 3-4. Figura 3-4. SQL Server Management Studio: Novo painel de consulta
  12. 12. SQL Server Management Studio tem uma nova aparência na versão do SQL Server 2012; na verdade, Microsoft tem utilizado a IDE do Visual Studio para o SQL Server 2012, então se você tiver usado o Visual Studio 2010, antes, você irá encontrar semelhantes. Se você ainda não trabalhou com Visual Studio 2010, então você vai ver que as interfaces do usuário são semelhantes, quando começamos a codificação para C# usando o Visual Studio 2012 mais tarde no livro. 1. Verifique se o seu painel de New Query mostra o banco de dados mestre, logo abaixo do ícone Salvar na barra de ferramentas. 2. Vá para o painel de consulta, e para se certificar de que você está no banco de dados mestre, digite o seguinte: usar o mestre 3. Selecione a declaração e clique em Executar ou pressione F5; você deverá ver a mensagem "Comando (s) concluída com êxito." 4. Agora pressione Enter para adicionar uma nova linha, e digite o seguinte: create database MySQLDb 5. Neste exemplo, estamos criando um novo banco de dados chamado MySQLDb. Lembre-se, SQL Server não é case-sensitive, então não importa o quanto você digita suas instruções SQL, que vai funcionar muito bem. 6. Depois de digitar a declaração criar, selecione esta declaração criada recém-adicionado e pressione Execute ou F5. Quando você olha para a lista de bancos de dados sob a pasta Bancos de Dados no Pesquisador de Objetos, você deve ver o banco de dados MySQLDb recém-criado, como mostrado na Figura 3-5. Figura 3-5. Criando um banco de dados do SQL Server de forma simples Esta base de dados recém-criado não será diferente de todos os outros bancos de dados na medida em que consistem .mdf e .ldf. Ao utilizar esta instrução SQL de uma linha ... Criar banco de dados banco de dados de nome que você deu o controle ao SQL Server para criar os arquivos com suas próprias configurações predefinidas em seu nome. Mas esta abordagem tem limitações e restrições: • Ele armazena arquivos de dados e log no mesmo disco em Arquivos de ProgramasMicrosoft SQL Server; E se você quiser separar o arquivo de log a partir dos arquivos de dados e colocar em um outro disco ou em outra pasta?
  13. 13. • Por padrão dados e arquivos de log têm a liberdade de continuar crescendo até que o disco esteja cheio; em outras palavras, que eles têm acesso sem restrições para o espaço de disco. Nas organizações do mundo real, é essencial para gerenciar o armazenamento, por isso, uma limitação de tamanho é dada a um banco de dados. Explorando Propriedades de banco de dados Depois de um banco de dados é criado, às vezes você vai querer saber de suas propriedades, tais como seu nome de arquivo, caminho, tamanho e assim por diante. Siga estas etapas para explorar as propriedades de banco de dados: 1. Botão direito do mouse no banco de dados recém-criado do MySQLDb no Pesquisador de Objetos e selecione Propriedades. 2. Vá para a aba Arquivos no lado esquerdo. Você vai ver as configurações que o SQL Server escolhe em seu nome durante a execução da instrução de criação de banco de dados de uma linha mostrada anteriormente. A caixa de diálogo Propriedades do Banco de Dados vai ver na Figura 3-6. Figura 3-6. Explorando Propriedades de banco de dados Criando o banco de dados com suas próprias configurações Às vezes você quer ter o controle sobre a criação de um banco de dados para que você possa controlar as coisas, como o tamanho máximo de um banco de dados pode crescer para, a quantidade de crescimento após o período inicial é consumida, ou até mesmo a pasta / localização de seus dados e arquivos de log. Tabela 3-4 mostra os argumentos que você pode usar. Tabela 3-2. Criar Argumentos de banco de dados Nome do argumento Descrição Name Este é o nome lógico do arquivo de banco de dados, pelo qual pode ser referido em seu sistema SQL Server. Filename Este é o caminho físico onde os arquivos de banco de dados (.mdf e .ldf) vão ser armazenados. Size Este é o tamanho inicial que você deseja criar seu banco de dados com o tamanho pode ser em kilobytes, megabytes, gigabytes, ou terabytes. Se você não especificar qualquer unidade por padrão, é megabytes. Por exemplo, tamanho = 1 é o mesmo que especificar Size = 1 MB.
  14. 14. Uma limitação do argumento Tamanho é que ele tem que ter um mínimo de 4MB inicialmente para que ele possa acomodar as configurações do banco de dados modelo. Se você especificar um tamanho de menos de 4 MB, então você vai receber um erro ao executar a instrução criar banco de dados. MaxSize Esse é o limite de tamanho máximo que o banco de dados que você está criando pode atingir. Portanto, se você omitir esse argumento, então você está deixando o SQL Server continuar crescendo sua base de dados, desde que há um espaço em disco, em outras palavras, até que o disco esteja cheio. A configuração MaxSize pode estar em kilobytes, megabytes, gigabytes, ou terabytes; o padrão é megabytes. FileGrowth Este é o tamanho do seu banco de dados vai crescer para sempre novo espaço é necessário para acomodar os dados de entrada. Como você se lembra, tamanho especifica somente a alocação inicial de um espaço para começar. Mas depois disso, o banco de dados cresce de forma dinâmica como e quando a demanda. Isso pode ser especificado em porcentagem ou em kilobytes, megabytes, gigabytes, ou terabytes. O padrão é megabytes. Além disso, vale a pena saber que, se você não especificar esse argumento em tudo, então a configuração padrão é filegrowth 1MB. Agora vamos tentar fazer os argumentos discutidos na Tabela 3-2 em uma sintaxe de consulta SQL para criar um banco de dados com os valores dos argumentos. Siga estes passos: 1. Verifique se o seu painel de New Query mostra o banco de dados mestre, logo abaixo do ícone Salvar na barra de ferramentas. 2. Vá para o painel de consulta, e para se certificar de que você está no banco de dados mestre, digite o seguinte: use o master 3. Selecione a declaração e clique em Executar ou pressione F5; você deve ver a mensagem "Comando (s) concluído com êxito." 4. Agora pressione Enter para adicionar uma nova linha, e digite a instrução create database, como mostrado aqui. □Nota: Por favor, observe o texto em negrito no argumento FileName no código a seguir; isso representa o seu SQL Server 2012 nome da instância. Eu sugiro que você procure o local da pasta do SQL Server por meio do Windows Explorer, como mostrado na Figura 3-3, e, em seguida, copie e cole o caminho no argumento FileName. 5. CREATE DATABASE SQL2012Db ON PRIMARY ( NAME = Sql2012Data, FILENAME = 'C:Program FilesMicrosoft SQL ServerMSSQL11.SQLEXPRESSMSSQLDATASql2012Data.mdf', SIZE = 5MB, MAXSIZE = 15MB, FILEGROWTH = 20% ) LOG ON ( NAME = Sql2012Log, FILENAME ='C:Program FilesMicrosoft SQL ServerMSSQL11.SQLEXPRESSMSSQLDATASql2012Log.ldf', SIZE = 1MB, MAXSIZE = 5MB, FILEGROWTH = 1MB ) 6. Selecione toda a declaração, e clique em Executar ou pressione F5. 7. Após a execução bem sucedida da declaração, selecione o nó bancos de dados em Objeto Explorer, botão direito do mouse e selecione Atualizar para a recém criada lista bancos de dados. Você deve ver uma lista de algo semelhante à figura 3-7.
  15. 15. Figura 3-7. Criar instrução de banco de dados com argumentos Agora você sabe como criar um banco de dados usando código, usando técnicas simples e usando argumentos, então é hora de aprender a criar tabelas em bancos de dados. Entendendo Fundamentos de Tabela O banco de dados que você criou anteriormente será inútil se não existe uma tabela na mesma, porque as tabelas fornecem a infraestrutura para armazenamento de dados. Antes de começar a criar uma tabela, você deve entender o básico dela. Uma tabela consiste em colunas, em seguida, os dados são adicionados (inserido) na tabela como linhas. (Em teoria de banco de dados relacional, uma linha é também conhecida como uma ficha ou tupla, e uma coluna é conhecido como um campo.) O tipo de dados que podem ser introduzidos como uma linha é definida pelo tipo de dados de colunas individuais na tabela . Na maioria das vezes torna-se óbvio que tipo de dados que você precisa para entrar; por exemplo, um nome vai exigir uma string ou tipo de dados caractere, enquanto que a idade vai exigir um tipo de dados inteiro. Além disso, é importante saber em que precisa de uma coluna de entrada de dados. Palavras-chave nulo ou não nulo especifica os critérios de aceitação de dados, em outras palavras, se você deve entrar ou pode ignorar um valor de coluna. Por exemplo, considere que você está preenchendo um formulário para o seguro e é solicitado a digitar o seu primeiro nome, seguido do seu endereço e CPF. Em tal cenário, nem todos terão SSN, mas o primeiro nome é uma obrigação para qualquer indivíduo. Com base nessas duas colunas, você tem um cenário de negócios, e esse requisito de negócio em termos de uma base de dados pode ser feito especificando a primeira coluna nome não nulo e a coluna SSN como nulo na criação da tabela. NULL significa um valor indefinido ou desconhecido, o que significa que nada é especificado. Por exemplo, considere que no nome do primeiro campo alguém preencher espaços em branco; Tecnicamente, isto é considerado Informação porque um espaço em branco é um espaço, que é um personagem e, portanto, informação. Da mesma forma, se uma pessoa que não tinha um SSN entrasse 000-00-0000 como o SSN? Isto também não é um valor indefinido porque entraram zeros, que são personagens e, portanto, informação. Por padrão uma coluna criada permite Null, a menos que não nula é especificada no momento da criação da coluna explicitamente.
  16. 16. Tipos de dados do SQL Server para colunas da tabela Para oferecer suporte a requisitos de negócio, o SQL Server fornece vários tipos de dados (ver tabela 3-3). Tabela 3-3. Tipos de dados do SQL Server Tipo de dados Tipo de dados do SQL Server Dados de caractere Char, Varchar, Text Dados de número inteiro int, bigint, smallint, tinyint Data e hora Datetime, Smalldatetime, Date, Time Criando uma tabela no SQL Server Para criar uma tabela no SQL Server, você precisa estabelecer um contexto de um banco de dados. Em outras palavras, você precisa entrar em um banco de dados onde você deseja criar suas tabelas. Neste capítulo, você criou dois bancos de dados: Mysqldb e Sql2012Db. Você vai usar o banco de dados Sql2012Db para criar tabelas. No Pesquisador de Objetos, expanda o nó Bancos de dados, selecione o banco de dados do Sql2012Db e clique em Nova Consulta ou na barra de ferramentas ou no menu de contexto); você vai ver que o banco de dados Sql2012Db é selecionado para este painel New Query você abriu. Neste painel de consulta, digite o seguinte código: CREATE TABLE MySqlTable ( Name varchar(10) Not Null, --Name value is a must and can’t be Null Age int, SSN varchar(11), Date datetime, Gender char(6) ) Selecione o conjunto crie declaração, e clique em Executar ou pressione F5. No Pesquisador de Objetos, expanda o banco de dados do Sql2012Db onde você criou esta tabela e, em seguida, expanda o nó Tabelas; você vai ver a tabela recém-criada listados. Esta é a forma como cada banco de dados do armazena as mesas no seu interior. Além disso, para investigar a tabela que você criou, você pode expandi-lo. No caso exemplo, você é chamado MySqlTable, assim expandir isso, e você vai ver o nó Colunas. Expanda o nó Colunas bem, e você vai ver todas as colunas que você criou na instrução CREATE TABLE anterior. Para ajudar você a se lembrar, qualquer campo ou coluna que explicitamente não inclui não nulo com sua declaração durante a criação da tabela é nulo por padrão; portanto, exceto a coluna Nome, todos os outros campos ou colunas são feitas nulo pelo SQL Server, que você deve ser capaz de ver na Figura 3-8.
  17. 17. Figura 3-8. A instrução CREATE TABLE e as propriedades da coluna Adicionando uma coluna IDENTITY em uma tabela Às vezes, os desenvolvedores e programadores de banco de dados precisa criar uma nova coluna em uma tabela existente. SQL Server fornece uma instrução ALTER para modificar / alterar os objetos que já estão criados. Neste caso, a tabela que você criado for perder uma coluna que pode ajudar a identificar unicamente cada pessoa, porque um nome pode ser comum com duas pessoas; por exemplo, tanto pode ser a mesma idade e sexo, e sem um SSN. Em tal cenário, ter uma coluna que pode identificar exclusivamente cada linha é uma adição valiosa, e é também a forma como todos os bancos de dados do mundo real são projetados. A melhor maneira de ter cada pessoa identificada com um valor distinto ou ID é a utilização de propriedade IDENTITY do SQL Server. IDENTITY é um valor auto incrementado que é inserido pelo SQL Server automaticamente para cada linha inserida em uma tabela. Isto é, você não é responsável por especificar o valor da coluna de IDENTITY. Esta propriedade IDENTITY requer uma coluna de tipo Integer para ser associado a ele. A propriedade IDENTITY é usado para as colunas que precisa gerados automaticamente valores do sistema único. Esta propriedade pode ser utilizada para gerar os números sequenciais. A sintaxe para isso é IDENTITY (Seed, increment). A Seed é o ponto de partida ou o valor inicial para a coluna de IDENTITY. Increment é o valor do passo usado para gerar o próximo valor para a coluna. Por exemplo, int ColumnName IDENTITY (1,1), a primeira linha irá ter o valor 1, a segunda linha terá 2, e assim por diante. A mesma definição propriedade IDENTITY pode ser escrita como int ColumnName IDENTITY. Assim, a IDENTITY e a IDENTITY (1,1) são os mesmos. Existem duas maneiras de adicionar esta coluna ID em uma tabela: usando a instrução ALTER TABLE e deixando cair e re-criar a tabela. ALTER TABLE Adicionando uma chave de identidade a uma coluna pré-criado é baseado em uma instrução ALTER TABLE. Para experimentá-lo, digite o seguinte comando no painel de consulta, selecione-o e pressione Executar. ALTER TABLE MySqlTable ADD Id int IDENTITY(1,1) Esta declaração irá adicionar uma coluna de identificação para a tabela. Para ver esta coluna recém-adicionado, você precisa atualizar a tabela selecionando-a no Pesquisador de Objetos, clicar com botão direito e escolhendo Atualizar.
  18. 18. Em seguida, expanda o nó da tabela e o nó Colunas, e você vai ver a coluna Id adicionada à tabela, como mostrado na Figura 3-9. Figure 3-9. Looking at the newly added column to an existing table Então, agora que você aprendeu como adicionar uma coluna a uma coluna já criado. O único problema com essa abordagem é que qualquer coluna que você adicionar usando ALTER sempre é adicionado no final da lista de colunas, e não há nenhuma maneira que você pode mover-se ou mudar a sua posição de forma alguma. Considerando situações comuns de negócios, Id e colunas semelhantes são geralmente adicionado como a primeira coluna na maioria das tabelas, e se você tem um desejo semelhante, então você precisa seguir uma abordagem diferente, como explicado a seguir. Descarte e crie novamente a tabela Como já foi dito, se você quer ter a coluna Id como a primeira coluna da tabela, então você tem que definir a tabela do zero. Para isso, você tem que remover a tabela em primeiro lugar e, em seguida, recriá-la. No painel de consulta, digite a seguinte declaração, selecione-o e pressione Executar. DROP TABLE MySqlTable Isto irá excluir ou remover a tabela permanentemente; se você selecionar o nó Tabelas no Pesquisador de Objetos, clique com o botão direito e escolha a opção Atualizar, você vai ver que não há nenhuma tabela listada porque você simplesmente deixou cair. Agora, você vai recriar o MySqlTable com uma coluna de IDENTITY adicionada à definição da tabela no momento da criação em si, como mostra a seguinte declaração: CREATE TABLE MySqlTable ( Id int IDENTITY (1,1), --Identity makes the column Not Null internally Name varchar(10) Not Null, --Name value is a must and can’t be Null Age int, SSN varchar(11), Date datetime, Gender char(6) )
  19. 19. Selecione esta declaração cria tabela e pressione Executar; em seguida, selecione o banco de dados Mysqldb no Pesquisador de Objetos, clique com o botão direito e escolha Atualizar. Você verá um novo MySqlTable criado e nele é a primeira coluna, ao contrário de que foi adicionado quando você usou a instrução ALTER TABLE. Você também pode ver a lista de colunas, expandindo o nó Tables e depois o nó Colunas, e você será capaz de ver a lista de colunas, como mostrado na Figura 3-10. Figure 3-10. Looking at the re-created table and column list Resumo Este capítulo descreve como criar banco de dados e tabelas. Você também aprendeu sobre técnicas para adicionar uma coluna a uma tabela já criada com a instrução ALTER, que basicamente modifica uma tabela pre- created. Você também aprendeu a usar a instrução DROP, que remove um objeto de tabela do banco de dados. No próximo capítulo, você vai começar a trabalhar com os conceitos de manipulação de dados.
  20. 20. Trabalhando com Banco de dados e XML Capitulo 4 Manipulação de banco de dados Agora que você sabe como criar bancos de dados e tabelas, é hora de voltar sua atenção para modificar dados, como inserir, atualizar e apagar. Neste capítulo, vamos cobrir o seguinte: • Inserção de dados • Atualização de dados • Apagar dados Inserção de dados Depois de criar uma tabela, você precisa ser capaz de adicionar dados, como linhas a uma tabela. Você pode fazer isso usando a instrução INSERT. A declaração básica INSERIR tem as seguintes partes: INSERT INTO <table> (<column1>, <column2>, ..., <columnN>) VALUES (<value1>, <value2>, ..., <valueN>) Usando esta sintaxe, vamos adicionar uma nova linha à tabela de MySqlTable de SQL2012Db o recém-criado banco de dados. Experimente: Inserir uma nova linha Para inserir uma nova linha em uma tabela, abra uma janela nova consulta no SQL Server Management Studio. Digite a seguinte consulta e clique em Executar: Use SQL2012Db Go insert into MySqlTable ( Name, Age, SSN, Date, Gender ) Values('Vidya Vrat',36,'111-20-3456',GetDate(),'Male') Go A execução desta instrução no painel consulta deve produzir uma janela de mensagens relatando “(1 linha(s) afetadas)", como mostrado na Figura 4-1. Nota: GetDate() é o SQL Server é construído em função de data e hora que retorna a data e hora atual, por isso, se você usar essa função, ele insere a data e hora atuais na coluna. Figura 4-1. Inserir uma nova linha na tabela MySqlTable
  21. 21. Como funciona A primeira coluna, ID, é uma coluna de identidade, e você não pode inserir valores para ele explicitamente o motor de banco de dados SQL Server irá certificar-se de que um valor único e SQL gerado pelo servidor é inserido para o campo ID. Assim, a instrução insert deve ser escrito de tal forma que você especificar a lista de colunas que você deseja inserir valores para explicitamente; embora o MySqlTable contém seis campos, ID é uma coluna de identidade, e que não espera qualquer valor a ser inserido a partir do usuário. SQL Server pode detectar uma coluna de identidade ao executar a instrução insert. No entanto, é a melhor prática para especificar a lista de colunas e, em seguida, passar os respectivos valores a esses campos, como mostra a seguinte consulta: Insert into MySqlTable (Name,Age,SSN,Date,Gender) Values('Rupali',31,'222-10-6789',GetDate(),'Female') Depois de inserir a linha, digite a seguinte consulta no painel de consulta: Select * from MySqlTable Selecione a declaração e clique em Executar ou pressione F5; você vai ver que as novas linhas foram adicionadas, como mostrado na Figura 4-2. Figura 4-2. O MySqlTable após a adição de linhas Tenha o cuidado de inserir dados do tipo de dados correto. Neste exemplo, você viu colunas da caráter int, e os tipos de data e hora. Inserir várias linhas Através de uma Instrução INSERT simples Normalmente uma única instrução INSERT acrescentou uma linha para a tabela, mas desde que o SQL Server 2008, uma instrução INSERT é capaz de adicionar várias linhas através de uma única instrução INSERT. Você só precisa separar cada linha de dados com uma vírgula, como mostrado na seguinte declaração, em seguida, clique em Executar ou pressione F5.
  22. 22. Insert into MySqlTable (Name,Age,SSN,Date,Gender) Values('Vamika',6,'333-30-1234',GetDate(),'Female'), ('Arshika',1,'444-40-5678',GetDate(),'Female') Isto deve mostrar uma execução bem sucedida, como na Figura 4-3. Figura 4-3. Adição de várias linhas com uma única instrução INSERT Agora, se você quer executar a seguinte instrução SELECT, você deve ver as quatro linhas com um valor de identificação auto incrementado, passando de 1 a 4. Em outras palavras, o primeiro registro será 1, e cada registro inserido depois disso será incrementado por 1. Veja a Figura 4-4. Figura 4-4. SELECT mostrando todas as linhas inseridas com valor do ID gerado automaticamente
  23. 23. Atualização de dados Você pode modificar os dados com a declaração UPDATE. Ao codificar instruções UPDATE, você deve ter o cuidado de incluir uma cláusula WHERE, ou você vai atualizar todas as linhas em uma tabela. Assim, o código sempre uma cláusula WHERE apropriada; se você faltar uma cláusula WHERE, como mostra a seguinte declaração UPDATE, então você vai mudar todos os registros da tabela, e tenho certeza que nenhum caso de negócio exige que! UPDATE <table> SET <columnl> = <valuel>, <column2> = <value2>, ..., <columnN> = <valueN> Agora que você está ciente das implicações da declaração UPDATE, vamos dar uma boa olhada nele. Em essência, é uma declaração simples que permite que você atualize os valores em uma ou mais linhas e colunas. UPDATE <table> SET <columnl> = <valuel>, <column2> = <value2>, ..., <columnN> = <valueN> WHERE <predicate> Experimente: Atualizando uma linha Para alterar o valor de uma linha, abra uma janela de nova consulta no SQL Server Management Studio Express. Digite a seguinte consulta e clique em Executar: update MySqlTable set Name = 'Pearly' where Id = 4 Como funciona O ID é o identificador único gerado pelo SQL para linhas da tabela MySqlTable, assim você pode usá-lo para localizar a uma linha que deseja atualizar. Executando a consulta deve produzir um painel de mensagens relatando "(0 linha(s) afetadas)." Agora, se você executar o Select * from MySqlTable declaração, você verá os registros modificados, conforme mostrado na Figura 4-5. Figura 4-5. SELECT mostrando linha modificada após a instrução UPDATE
  24. 24. Quando você atualizar mais de uma coluna, você ainda usa a palavra-chave SET apenas uma vez, e você separar os nomes das colunas e seus respectivos valores que você deseja definir com uma vírgula. Por exemplo, a seguinte instrução iria mudar tanto o nome e o número do CPF de uma pessoa que tenha adicionado à tabela: update MySqlTable set Name = 'Sparkly', SSN = '444-50-9100' where Id = 5 Se você executar Select * from MySqlTable, você veria que o nome Vamika valores para pessoa mudaram, como mostrado na Figura 4-6. Figura 4-6. SELECT mostrando linha modificada após instrução UPDATE para várias colunas Exclusão de dados Para remover dados, você pode usar a instrução DELETE. A instrução DELETE tem as mesmas implicações que a instrução UPDATE. É muito fácil de apagar todas as linhas (e não apenas as linhas erradas) em uma tabela por esquecer a cláusula WHERE, então tome cuidado. A instrução DELETE remove linhas inteiras, por isso não é necessário (ou possível) para especificar colunas. Sua sintaxe básica é a seguinte (lembre-se, a cláusula WHERE é opcional, mas, sem ela, todas as linhas serão apagadas): DELETE FROM <table> WHERE <predicate> Se você precisar remover um registro ou conjunto de registros da tabela MySqlTable, então você precisa determinar os registros que você deseja excluir com algum valor único, como uma chave de identidade ou de chave primária, e então você especifica esse valor exclusivo da linha que você deseja remover com a condição WHERE da instrução DELETE. delete from MySqlTable where Id = 5
  25. 25. Isso deve produzir um painel de mensagens relatando "(1 linha(s) afetadas)." Execute o Select * from MySqlTable declaração, e você verá que a linha com um ID de 5 foi removido, como mostrado na Figura 4 -7. Figura 4-7. Instrução SELECT mostrando linhas após a instrução DELETE Novamente, é importante usar a cláusula WHERE com a instrução DELETE; se você especificar uma instrução DELETE sem ele, então você vai apagar todas as linhas da tabela especificada. Resumo Neste capítulo, você aprendeu como usar as seguintes palavras-chave T-SQL para executar tarefas de manipulação de dados em um banco de dados: INSERT, UPDATE e DELETE. No próximo capítulo, você aprenderá como consultar um banco de dados.
  26. 26. Capitulo 5 Consultar bancos de dados Neste capítulo, você vai aprender sobre codificação de consultas no SQL Server 2012. SQL Server usa T-SQL como sua linguagem, e tem uma grande variedade de funções e construtores para a consulta. Você vai ver como usar o SQL Server Management Studio e o banco de dados AdventureWorks para enviar consultas para vários cenários de consulta de dados. Este capítulo aborda os seguintes tópicos: • Recuperando dados • Usando a cláusula GROUP BY • Correspondência de padrões • Usando funções agregadas • Utilizar as funções de DATETIME • Usando o operador de lista • Usando o operador de intervalo • Encontrar os valores nulos • Usando junta Recuperando dados Uma consulta SQL recupera dados de um banco de dados. Os dados são armazenados como linhas em tabelas. As linhas são compostas de colunas. Na sua forma mais simples, uma consulta constituída por duas partes: • A lista SELECT, onde as colunas a serem recuperados são especificados • A cláusula FROM, onde a tabela ou tabelas para serem acessados são especificados Dica: Eu escrevi SELECT e FROM em letras maiúsculas apenas para indicar que são palavras-chave SQL. SQL não é casesensitive e palavras-chave são normalmente escritos em letras minúsculas no código. No T-SQL, consultas são chamadas instruções SELECT, mas o padrão ISO / ANSI distingue claramente "consultas" de "declarações". A distinção é conceitualmente importante. Uma consulta é uma operação em uma tabela que produz uma tabela como resultado; declarações podem (ou não) operar em tabelas e não produzem tabelas como resultados. Além disso, sub-consultas podem ser usadas em ambas as consultas e instruções. Então, vamos chamar tipicamente consultas em vez de instruções SELECT. Chame consultas o que você preferir, mas tenha em mente que as consultas são uma característica especial de SQL. Usando duas palavras-chave, SELECT e FROM, aqui é a mais simples consulta possível que receberá todos os dados da tabela especificada: Select * from <table name> O asterisco (*) significa que você deseja selecionar todas as colunas na tabela. Você estará usando uma instância do SQL Server 2012 neste capítulo. Abra o SQL Server Management Studio, e na Ligação ao tipo de caixa de diálogo Servidor localhost<SQL Server 2012 instância name> como o nome do servidor; em seguida, clique em Conectar. SQL Server Management Studio será aberta. Expanda o nó Bancos de Dados e selecione o banco de dados AdventureWorks. Sua tela deve se parecer com a Figura 5-1.
  27. 27. Figura 5-1. Selecionando um banco de dados para consulta Experimente: Executando uma consulta simples Para enviar uma consulta para recuperar todos os dados dos funcionários, abrir uma janela nova consulta no SQL Server Management Studio. Selecione as AdventureWorks no Object Explorer, e em seguida, clique no botão Nova Consulta na barra de ferramentas. Isto irá abrir uma janela nova consulta. Digite a consulta a seguir, e clique em Executar. Você deve ver os resultados mostrados na Figura 5-2. Select * from Person.Address Figura 5-2. Painel de resultados de consulta
  28. 28. Como funciona Você pergunta o banco de dados para retornar os dados para todas as colunas, e você terá exatamente isso. Se você rolar para a direita, você vai encontrar todas as colunas na tabela de endereços. Na maioria das vezes, você deve limitar consultas para apenas as colunas relevantes. Ao selecionar colunas que você não precisa, você desperdiça recursos. Para selecionar explicitamente colunas, digite os nomes das colunas após a palavra-chave SELECT, conforme mostrado na consulta a seguir, e clique em Executar. A Figura 5-3 mostra os resultados. Select AddressID, AddressLine1, City from Person.Address Esta consulta seleciona todas as linhas da tabela de endereços, mas somente as colunas AddressID, AddressLine1 e City. Figura 5-3. Selecionando colunas específicas Usando a cláusula WHERE As consultas podem existir cláusulas WHERE. A cláusula WHERE permite especificar critérios para a seleção de linhas. Esta cláusula pode ser complexo, mas vamos ficar com um exemplo simples para agora. A sintaxe é como se segue: WHERE <columnl> <operator> <column2 / Value> Aqui, <operador> é um operador de comparação (por exemplo, =, <>,> ou <). (Tabela 5-1, no final do capítulo, lista os operadores de comparação de T-SQL.)
  29. 29. Experimente: Aprimorando sua consulta Neste exercício, você vai ver como refinar sua consulta. 1. Adicione a seguinte cláusula WHERE para a consulta na Figura 5-3: Select AddressID, AddressLine1, City from Person.Address Where City = 'Redmond' 2. Execute a consulta pressionando F5, e você deve ver os resultados mostrados na Figura 5-4. Figura 5-4. Usando uma cláusula WHERE Cuidado palavras-chave do SQL Server não são case-sensitive. SQL Server a sensibilidade caso depende da configuração de agrupamento do banco de dados. No entanto, o agrupamento padrão da instalação do SQL Server, SQL_Latin1_General_CP1_CI_AS, não diferencia maiúsculas de minúsculas. Assim, na maioria das vezes, os desenvolvedores não precisam se preocupar cerca de maiúsculas e minúsculas. Mas o banco de dados AdventureWorks é definido como case- sensitive. Portanto, se você tentar executar a consulta mostrada na Figura 5-4 com Redmond, você não vai mostrar todas as linhas de resultado por causa da sensibilidade de caso, que não vai encontrar uma cidade com o nome fornecido. Usando operadores de comparação Você pode usar um número de operadores de comparação diferentes em uma cláusula WHERE (ver tabela 5 - 1).
  30. 30. Tabela 5-1. Operadores de comparação Operador Descrição Exemplo = Igual a AddresslD = 1 < Menor que AddresslD < 1 > Maior que AddresslD > 1 <= Menor ou igual a AddresslD <= 1 >= Maior ou igual a AddresslD >= 1 < > Não igual a AddresslD <> 1 ! = Não igual a AddresslD != 1 ! < Não inferior a AddresslD !< 1 ! > Não maior do que AddresslD !> 1 Dica Como mencionado anteriormente, cada fornecedor de banco de dados tem sua própria implementação do SQL. Essa discussão é específica para T-SQL; por exemplo, o SQL padrão não tem != operador e chamadas <> a não é igual a do operador. Na verdade, o padrão SQL chama as expressões em um Where cláusula predicados; vamos usar esse termo porque predicados são verdadeiras ou falsas, mas outras expressões não têm que ser. Se você trabalha com outra versão do SQL, consulte a respectiva documentação para detalhes. Você pode querer testar o operador de comparação, como no exemplo, como mostrado na Figura 5-5. Select AddressID, AddressLine1, City from Person.Address Where AddressID > = 15366 AND AddressID < 15375 Figura 5-5. Usando operadores de comparação
  31. 31. Classificação de dados (ORDER BY) Depois que você já filtrou os dados que você quer, você pode classificar os dados por uma ou mais colunas e em uma determinada direção. Desde que as tabelas são por definição não seleccionada, a ordem na quais linhas é obtida por uma consulta é imprevisível. Para impor uma ordem, você pode usar a cláusula ORDER BY. ORDER BY <column> [ASC | DESC] {, n} O <column> é a coluna que deve ser usado para classificar o resultado. A {, n} sintaxe significa que você pode especificar qualquer número de colunas separadas por vírgulas. Os resultados serão classificados na ordem em que você especificar as colunas. A seguir estão as duas direções de classificação: • ASC: ascendente (1, 2, 3, 4, e assim por diante) • DESC: Descendente (10, 9, 8, 7, e assim por diante) Se você omitir a palavra-chave ASC ou DESC, por padrão a ordem de classificação para ASC. O seguinte é a sintaxe básica para consultas: SELECT <column> FROM <table> WHERE <predicate> ORDER BY <column> ASC | DESC Agora que você já viu, você vai colocar essa sintaxe para usar em um exemplo. Experimente: Escrever um avançado de pesquisa Neste exemplo, você vai codificar uma consulta que usa a sintaxe básica apenas mostrado. Você deseja fazer o seguinte: • Selecione todos os endereços que estão em Redmond. • Exibir somente AddressID, AddressLine1, City. • Classifique os endereços pelo AddressID. Abra uma janela de nova consulta no SQL Server Management Studio. Digite a consulta a seguir, e clique em Executar. Você deve ver os resultados mostrados na Figura 5-6. Select AddressID, AddressLine1, City from Person.Address Where City= 'Redmond' Order By AddressID Asc Figura 5-6. Filtrando e classificando dados
  32. 32. Como Funciona Vamos olhar para as cláusulas individualmente. A lista SELECT especifica quais colunas você deseja usar. Select AddressID, AddressLine1, City A cláusula FROM especifica que você quer usar tabela Address. from Person.Address A cláusula WHERE especifica que você deseja todos os registros para Redmond. Where City= 'Redmond' A cláusula ORDER BY especifica a ordem em que as linhas são classificadas. As linhas serão ordenadas por AddressID em ordem crescente. Order By AddressID Asc Cláusula GROUP BY A cláusula GROUP BY é utilizada para organizar as linhas de saída em grupos. Lista SELECT pode incluir funções de agregação e produzir valores resumidos para cada grupo. Muitas vezes você vai querer gerar relatórios a partir do banco de dados com números de resumo para uma coluna ou conjunto de colunas particular. Por exemplo, você pode querer descobrir a quantidade total de endereços que pertencem a uma determinada cidade da tabela Person.Address. Experimente: Usando a Cláusula GROUP BY A tabela Person.Address contém os dados do endereço. Você quer saber o total de quantos endereços pertencem a uma determinada cidade. Por exemplo, se você olhar para a consulta e número de registros na Figura 5-6, você vai notar que há um total de 121 entradas de endereço para Redmond. Abra uma janela de nova consulta no SQL Server Management Studio Express. Digite a consulta a seguir, e clique em Executar. Você deve ver os resultados mostrados na Figura 5-7. Select City, Count(City) As 'Total Count' from Person.Address Group By City Order By City Asc Figura 5-7. Usando GROUP BY para valores agregados
  33. 33. Se você irá rolar o resultado definido para baixo como o Redmond, então você vai ver que ele mostra 121 linhas, como você vi na Figura 5-7. Como funciona Você especifica a coluna da City e use a função COUNT para contar o número total de cidades listadas para cada endereço na tabela de endereço. Select City, Count(City) As 'Total Count' from Person.Address A cláusula GROUP BY impõe o agrupamento nas colunas especificadas, e os resultados devem ser exibidos no formulário de grupos para a coluna da City. Group By City A cláusula ORDER BY garante que o resultado exibido será organizado em ordem seqüencial correta com base na cidade. Order By City Asc Correspondência de padrões A correspondência de padrões é uma técnica que determina se uma string de caracteres específico corresponde a um padrão especificado. Um padrão pode ser criado usando uma combinação de caracteres regulares e caracteres curinga. Durante a correspondência de padrões, os caracteres normais devem corresponder exatamente conforme especificado na seqüência de caracteres. LIKE e NOT LIKE (negação) são os operadores são utilizados para correspondência de padrão. Lembre-se que a correspondência de padrões é case-sensitive. SQL Server suporta os seguintes caracteres curinga para correspondência de padrão:  % (por cento sinal): Este curinga representa zero a muitos caracteres. Por exemplo, WHERE title LIKE '%C#5.0%' localiza todos os títulos de livros que contêm o texto C#5.0, independentemente do local onde no título desse texto ocorre no início, meio ou fim. Neste caso, títulos de livros, como ‘C # 5.0: Uma Introdução, Accelerated C # 5.0’, e ‘Começando C # 5.0 bancos de dados’ serão listados. • _ (sublinhado): Um único sublinhado representa qualquer caractere único. Ao utilizar este carácter universal, pode ser muito específico em sua pesquisa sobre o comprimento de caracteres dos dados que você procura. Por exemplo, 'WHERE au_fname LIKE '_ean'' localiza todos os nomes que consistem em quatro cartas e que terminam com ean (Dean, Sean, e assim por diante). 'WHERE au_fname LIKE 'a____n'' localiza todos os nomes que começam com a letra “a” e terminam com a letra “n” e que têm quaisquer outros três caracteres no meio, por exemplo, allan, Amman, aryan, e assim por diante. • [ ] (colchetes): Estes especificar qualquer caractere único dentro do intervalo especificado, como [a-f], ou de um conjunto, como [abcdef] ou mesmo [adf]. Por exemplo, ‘WHERE aulname LIKE '[C-K] arsen'’ encontra autores sobrenomes que terminam com arsen e começando com qualquer caractere único entre C e K, como Carsen, Darsen, Larsen, Karsen, e assim por diante. • [^] (colchetes e circunflexo): Estes especificar qualquer caractere único que não dentro do intervalo especificado, como [^ a-f], ou de um conjunto, como [^ abcdef]. Por exemplo, ‘WHERE al_nome LIKE ‘de [^]%’’ recupera todas autores sobrenomes começando com de, mas a seguinte letra não pode ser l. Experimente: Usando o percentual (%) de caracteres Para ver como o caractere curinga % funciona, abrir uma janela nova consulta no SQL Server Management Studio Express. Digite a consulta a seguir, e clique em Executar. Você deve ver os resultados mostrados na Figura 5-8. Select AddressID, AddressLine1, City from Person.Address where City like 'R%'
  34. 34. Figura 5-8. Usando o operador LIKE com % Como Funciona Você especificar três colunas da tabela de endereços. Select AddressID, AddressLine1, City from Person.Address Você pode especificar a cláusula WHERE com um padrão usando o operador LIKE para listar todas as cidades que começam com a letra R e que consistem em qualquer número de letras depois disso. where City like 'R%' Experimente: Usando o caractere de sublinhado (_) Para ver como funciona o caractere curinga de sublinhado (_), abra uma janela nova consulta no SQL Server Management Studio. Digite a seguinte consulta e clique em executar. Você verá os resultados mostrados na Figura 5-9. Select AddressID, AddressLine1, City from Person.Address where City like ‘S______’ -- S seguidos por 6 sublinhados
  35. 35. Figura 5-9. Usando o operador LIKE com _ Como funciona Você especificar três colunas da tabela de endereços. Select AddressID, AddressLine1, City from Person.Address Você pode especificar a cláusula WHERE com um padrão usando o operador LIKE para listar todas as cidades que começam com a letra S e consistem de um máximo de seis letras, depois disso, por exemplo, Seattle, Spokane, Shawnee, e assim por diante. where City like ‘S______’ Experimente isto: Usando os caracteres de colchete ([ ]) Para ver como os caracteres [ ] trabalham na correspondência de padrão, abra uma janela de nova consulta no SQL Server Management Studio. Digite a seguinte consulta e clique em executar. Você verá os resultados mostrados na Figura 5-10. Select AddressID, AddressLine1, City from Person.Address where City like ‘[B,R,S]%’ Order by City Asc
  36. 36. Figura 5-10. Usando o operador LIKE com [ ] Como funciona Você especificar três colunas da tabela Address. Select AddressID, AddressLine1, City from Person.Address Você especificar a cláusula WHERE com um padrão usando o operador LIKE para listar todas as cidades que começam com a letra B ou R ou S e consistem em qualquer número de letras depois disso, por exemplo, Bellevue, Redmond, Seattle e assim por diante. where City like ‘[B,R,S]%’ Order by City Asc Tente isso: Usar os Caracteres colchete e Circunflexo ([^]) Para ver como os caracteres [^ B, R, S] trabalha em casamento de padrões, abra uma janela nova consulta no SQL Server Management Studio Express. Digite a consulta a seguir, e clique em Executar. Você deve ver os resultados mostrados na Figura 5-11. Select AddressID, AddressLine1, City from Person.Address where City like '[^B,R,S]%' Order by City Asc
  37. 37. Figura 5-11. Usando o operador LIKE com [^] Como Funciona Você especificar três colunas da tabela de Address. Select AddressID, AddressLine1, City from Person.Address Você pode especificar a cláusula WHERE com um padrão usando o operador LIKE para listar todas as cidades que não começam com a letra B ou R ou S e consistem em qualquer número de letras depois disso; por exemplo, Bellevue, Redmond, Seattle, e assim por diante, não vão ser incluídas no conjunto de resultados. where City like '[^B,R,S]%' Order by City Asc Funções de agregação SQL tem várias funções internas que agregam os valores de uma coluna. As funções de agregação são aplicadas em conjuntos de linhas e retornar um único valor. Por exemplo, você pode usar funções de agregação para calcular o preço unitário médio de encomendas. Você pode encontrar o pedido com o preço mais baixo ou o mais caro. MIN, MAX, SUM, AVG, COUNT e são freqüentemente usados em funções de agregação. Tente isso: Usando o MIN, MAX, SUM, AVG e Funções Vamos encontrar o mínimo, máximo, soma e média do preço unitário (UnitPrice) de cada ordem de venda (SalesOrderID) da tabela SalesOrderDetail. Abra uma janela de nova consulta no SQL Server Management Studio. Digite a consulta a seguir, e clique em Executar. Você deve ver os resultados mostrados na Figura 5-12. select SalesOrderID,min(UnitPrice)as "Min", max(UnitPrice) as "Max",Sum(UnitPrice) as "Sum", Avg(UnitPrice)as "Avg" from Sales.SalesOrderDetail where SalesOrderID between 43659 and 43663 group by SalesOrderID
  38. 38. Figura 5-12. Usando funções agregadas Como Funciona Você usa as funções MIN e MAX para encontrar o valor máximo da função AVG para calcular o valor médio mínimo e, a função SOMA para calcular o valor total. min(UnitPrice)as "Min", max(UnitPrice) as "Max", Sum(UnitPrice) as "Sum", Avg(UnitPrice)as "Avg" Já que você deseja que os resultados listados por SalesOrderID, você usa a cláusula GROUP BY. A partir do conjunto de resultados, você vê que a ordem 1 tinha um preço mínimo unitário de 5,1865, um preço máximo unitário de 2.039,994, um preço total de 14.323,7118 unidade, e um preço médio unitário de 1193,6426. Tente isso: Usando a função COUNT Vamos encontrar a contagem de registros da tabela Person. Person. Abra uma janela de nova consulta no SQL Server Management Studio. Digite a consulta a seguir, e clique em Executar. Você deve ver os resultados mostrados na Figura 5-13. Select count(*) as "Total Records" from Person.Person Select count(Title)as "Not Null Titles" from Person.Person
  39. 39. Figura 5-13. Usando a função agregada COUNT Como Funciona A função COUNT tem um comportamento diferente dependendo do parâmetro passado para a função. Se você tentar COUNT (*), a consulta irá retornar o número total de registros disponíveis na tabela, como mostrado nos resultados de nível superior: a tabela Person.Person contém um total de 19.972 registros, e COUNT (*) conta nulo. Se você passar um nome de coluna para a função COUNT, ele irá retornar o número total de registros de novo, mas vai ignorar todas as linhas que contêm valores nulos para essa coluna. Na segunda consulta, você está consultando a mesma tabela, que listou 19.972 registros, mas porque a sua segunda consulta se aplica à coluna de título, ele retorna apenas 1.009 registros, porque desta vez ele ignorou todos os valores nulos. Em outras palavras, a contagem (ColumnName) ignora nula. Funções DATETIME Embora o padrão SQL define um tipo de dados DATETIME e seus componentes, ano, mês, dia, hora, minuto e segundo, não ditar como um DBMS disponibiliza esses dados. Cada DBMS oferece funções que extraem partes do datetimes. Vejamos alguns exemplos de funções de DATETIME T-SQL. Experimente: Usando T-SQL Data e Hora Funções Vamos praticar com funções de data e hora T-SQL. Abra uma janela de nova consulta no SQL Server Management Studio Express (contexto de banco de dados não afeta esta consulta). Digite a consulta a seguir, e clique em Executar. Você deve ver os resultados mostrados na Figura 5-14. select current_timestamp'standard datetime', getdate()'Transact-SQL datetime', datepart(year, getdate())'datepart year', year(getdate())'year function', datepart(hour, getdate())'hour'
  40. 40. Figura 5-14. Usando funções de data e hora Como Funciona Você usa uma versão diferente do padrão de uma consulta, omitindo a cláusula FROM, para exibir a data e hora atuais e partes individuais deles. As duas primeiras colunas da lista SELECT dar a data e hora completa. current_timestamp 'standard datetime', getdate() 'Transact-SOL datetime', A primeira linha usa a função valor current_timestamp de SQL padrão; o segundo usa a função getdate de T- SQL. Eles são equivalentes em efeito, ambos retornando a data atual completo e tempo. As próximas duas linhas cada fornecer o ano em curso. O primeiro usa a função T-SQL datepart; o segundo usa a função T-SQL year. Ambos levam um argumento datetime e retornar o ano inteiro. O primeiro argumento do datepart função especifica qual parte de um datetime para extrair. Note-se que T-SQL não fornecer um especificador de data para a extração de uma data completa, e ele não tem uma função de data separado. datepart(year, getdate()) 'datepart year', year(getdate()) 'year function', A linha final fica a hora atual. A função T-SQL datepart deve ser utilizado aqui desde nenhuma função hour é análoga à função year. Note-se que T-SQL não fornecer um especificador de tempo para extrair uma época completa, e ele não tem uma função separada TIME. datepart(hour, getdate()) 'hour' Você pode formatar datas e horários e funções alternativas para a extração e convertê-los de várias maneiras. As datas e horas também podem ser adicionados e subtraídos e incrementado e decrementado. Como isso é feito é específico do DBMS, apesar de todos os DBMSs cumprir numa medida razoável com o padrão SQL em como eles fazem isso. Seja qual for DBMS que você usa, você verá que as datas e os horários são os tipos de dados mais complexos para empregar. Mas, em todos os casos, você verá que as funções (por vezes um conjunto mais rico deles do que em T-SQL) são as ferramentas básicas para trabalhar com datas e horas. Dica: Ao fornecer a data ea entrada do tempo, valores de seqüência de caracteres são normalmente esperado; por exemplo, 1/26/2012 seria a forma adequada para especificar o valor de uma coluna segurando a data atual do exemplo. No entanto, as datas e os horários de lojas DBMSs em codificações específicas do sistema. Quando você usa dados de data e hora, leia o manual de SQL para o banco de dados com cuidado para ver a melhor forma de lidar com isso. Operador de lista IN é operador de lista do SQL Server; ele permite que você especificar a lista de opções que você deseja basear a sua condição mediante. Por exemplo, você quer extrair todas as cidades de sua lista desejada. O SQL Server oferece a sua
  41. 41. negação, bem como, NOT IN, assim você pode escolher os valores que você não quer ser incluído em seu conjunto de resultados. Experimente: Usando o Operador IN Abra uma janela de nova consulta no SQL Server Management Studio. Digite a consulta a seguir, e clique em Executar. Você deve ver os resultados mostrados na Figura 5-15. select AddressID, AddressLine1, City from Person.Address where City in ('Bellevue', 'Redmond', 'Seattle') Figura 5-15. Usando IN operador Como Funciona Você especificar três colunas da tabela de endereços. select AddressID, AddressLine1, City from Person.Address Você especifica a lista de Operadores 'IN' com o nome da cidade que você deseja extrair registros para. Assim, ele filtra 303 registros apenas para as cidades fornecidas. Se você rolar para baixo, você vai ver que todos os registros pertencerá somente as cidades mencionadas. where City in ('Bellevue', 'Redmond', 'Seattle') Experimente: Usando o Operador NOT IN Abra uma janela de nova consulta no SQL Server Management Studio. Digite a consulta a seguir, e clique em Executar. Você deve ver os resultados mostrados na Figura 5-16. select AddressID, AddressLine1, City from Person.Address where City not in ('Bellevue', 'Redmond', 'Seattle')
  42. 42. Figura 5-16. Usando o operador NOT IN Como Funciona Você especificar três colunas da tabela de endereços. select AddressID, AddressLine1, City from Person.Address Você especifica o operador NOT IN lista com o nome da cidade que você não deseja incluir os registros. Assim, ele filtra 19.311 registros para os outros do que o que listamos na lista não nas cidades. Se você rolar para baixo, você não vai ver qualquer registro pertencente a qualquer das cidades mencionadas. where City not in ('Bellevue', 'Redmond', 'Seattle') Operador de intervalo BETWEEN é operador de intervalo do SQL Server; ele permite que você especifique o intervalo de dados que você deseja basear a sua condição mediante. Por exemplo, você deseja fornecer o intervalo de dados que você gostaria de ver. O SQL Server oferece a sua negação, bem como, NOT BETWEEN, assim você pode escolher os valores que você não quer ser incluído em seu conjunto de resultados. Experimente: Usando o operador BETWEEN Abra uma janela de nova consulta no SQL Server Management Studio. Digite a consulta a seguir, e clique em Executar. Você deve ver os resultados mostrados na Figura 5-17. select AddressID, AddressLine1, City from Person.Address where AddressID between 201 and 300
  43. 43. Figura 5-17. Usando o operador Between Como Funciona Você especificar três colunas da tabela de endereços. select AddressID, AddressLine1, City from Person.Address Você especifica o operador de intervalo "BETWEEN" com a variedade de AddressID você quiser incluir os registros. Por isso, os filtros 100 registos de endereço, que varia entre 201 e 300, ou seja, um total de 100 gravações. where AddressID between 201 and 300 Experimente: Usando o Operador NOT BETWEEN Abra uma janela de nova consulta no SQL Server Management Studio. Digite a consulta a seguir, e clique em Executar. Você deve ver os resultados mostrados na Figura 5-18. select AddressID, AddressLine1, City from Person.Address where AddressID not between 201 and 32521 Figura 5-18. Usando o operador Not Between
  44. 44. Como funciona Você especificar três colunas da tabela de endereço. select AddressID, AddressLine1, City from Person.Address Você especificar o operador de intervalo BETWEEN com a gama de AddressID que você deseja incluir os registros. Daí, ele filtra 200 registros para o endereço, variando não entre 201 e 32521, em outras palavras, um total de 200 registros. where AddressID not between 201 and 32521 Encontrar valores NULL Os valores nulos são valores indefinidos e desconhecidos e representado pela palavra-chave NULL. Quando a execução de consultas, torna-se importante, por vezes, para extrair registros NULL e NOT NULL separadamente. Para dar suporte a esse propósito, o SQL Server fornece IS NULL e sua negação IS NOT NULL para ser incluído com a cláusula de condição WHERE. Experimente: Usando IS NULL Operador Abra uma janela de nova consulta no SQL Server Management Studio. Digite a consulta a seguir, e clique em Executar. Você deve ver os resultados mostrados na Figura 5-19. select Title, FirstName, MiddleName, LastName from Person.Person where MiddleName is null Figura 5-19. Usando o operador IS NULL Como Funciona Você especifica quatro colunas da tabela Contact. select Title, FirstName, MiddleName, LastName from Person.Person Você especifica a condição WHERE com base em se MiddleName é nulo. Assim, ele filtra 8.499 registros de detalhes de contato da pessoa; todos os registros listados têm seu MiddleName como NULL.
  45. 45. where MiddleName is null Experimente: Usando o operador is NOT NULL Abra uma janela de nova consulta no SQL Server Management Studio. Digite a consulta a seguir, e clique em Executar. Você deve ver os resultados mostrados na Figura 5-20. select Title, FirstName, MiddleName, LastName from Person.Person where MiddleName is not null Como Funciona Você especifica quatro colunas da tabela Contact. select Title, FirstName, MiddleName, LastName from Person.Person Você especifica a condição WHERE com base em se MiddleName não é nulo. Assim, ele filtra 11.473 registros de detalhes de contato da pessoa; todos os registros listados têm uma MiddleName definido. where MiddleName is not null Figura 5-20. Usando o operador IS NOT NULL Se junta a (Joins) A maioria das consultas requerem informações de mais de uma tabela. Uma união é uma operação relacional que produz uma tabela recuperando dados de duas tabelas (não necessariamente distintos) e combinando suas linhas de acordo com uma especificação participar. Diferentes tipos de junta existe, o que você vai olhar individualmente, mas tenha em mente que cada junção é uma operação binária; isto é, uma tabela está unido a outro, o que pode ser a mesma tabela desde tabelas pode ser unido a si. A operação de junção é um tema rico e um pouco complexo. As próximas seções cobrir o básico. Junções Internas (Inner Joins) Uma junção interna é a união mais frequentemente utilizado. Ele retorna apenas as linhas que satisfazem a especificação Joins. Embora, em teoria, que qualquer operador relacional (tais como > ou <) pode ser utilizado na
  46. 46. especificação de junção, o operador de igualdade (=) é quase sempre utilizada. Joins usando o operador de igualdade são chamadas junções naturais. A sintaxe básica para uma junção interna é como segue select <select list> from left-table INNER JOIN right-table ON <join specification> Observe que INNER JOIN é uma operação binária, então tem dois operandos, tabela-esquerda(left-table) e tabela-direita(right-table), que podem ser tabelas base ou qualquer coisa que pode ser consultado (por exemplo, uma tabela produzida por uma subconsulta ou por outra junção). A palavra-chave ON começa a especificação de junção, que pode conter qualquer coisa que poderia ser usado em uma cláusula WHERE. Table Aliasing Tabela Aliasing é uma técnica usada para atribuir um apelido curto para uma tabela ou cada mesa individual necessária em qualquer consulta SQL. Embora você pode usar o nome de mesa cheia, repetir o nome da tabela novamente em uma consulta é um processo complicado. Daí, tabela aliasing facilita muito quando você precisa especificar nomes de coluna também podem existir em várias tabelas ou você deseja usar diferentes colunas de uma tabela específica; Portanto, torna-se muito importante especificar o <Table Name>. <Column Name>. Referir-se a consulta a seguir, no qual somos aliasing Production.Product como PP e Production.ProductReview de PPR. Em seguida, quando se trata de usar colunas dessas tabelas, usamos os aliases definidos. Lembre-se também, esses aliases são temporários, e sua expectativa de vida é até que a consulta é executada. Após a execução da consulta, você não pode reutilizar o mesmo alias para qualquer outra consulta. Portanto, o escopo de um alias é dentro da consulta definida e esperança de vida é até que a consulta é executada. Experimente: Escrever um INNER JOIN Vamos recuperar uma lista de produtos, os IDs de produtos, e sua ReviewerName, Comments, e as entradas de Rating. Abra uma janela de nova consulta no SQL Server Management Studio (lembre-se de fazer AdventureWorks seu contexto de consulta). Digite a consulta a seguir, e clique em Executar. Você deve ver os resultados mostrados na Figura 5-21. select PP.ProductID, PP.Name, PPR.ReviewerName, PPR.Comments, PPR.Rating from Production.Product PP inner join Production.ProductReview PPR on PP.ProductID = PPR.ProductID Figura 5-21. Usando INNER JOIN
  47. 47. Como Funciona Vamos começar com a lista SELECT. select PP.ProductID, PP.Name, PPR.ReviewerName, PPR.Comments, PPR.Rating Já que você está selecionando colunas de duas tabelas, você precisa identificar qual tabela uma coluna vem, o que você faz prefixando o nome da tabela e um ponto (.) Para o nome da coluna. Isto é conhecido como desambiguação, ou remover a ambigüidade de modo que o gerenciador de banco sabe qual coluna de usar. Embora isso tem que ser feito apenas para colunas que aparecem em ambas as tabelas, a melhor prática é qualificar todas as colunas com os seus nomes de tabela. A seguinte cláusula FROM especifica as tabelas e seus aliases você está unindo e o tipo de junção que você está usando: from Production.Product PP inner join Production.ProductReview PPR Ele especifica uma junção interna das tabelas Production.Product e Production.ProductReview. Também especifica os critérios para a adesão ao ProductID chave primária da tabela Product com a chave estrangeira da tabela ProductID de ProductReview. on PP.ProductID = PPR.ProductID A junção interna em ProductID produz uma tabela composta por cinco colunas: ProductID, Name ReviewerName, Comments e Rating. Os dados são recuperados a partir de linhas em Production.Product e Production.ProductReview onde suas colunas ProductID têm o mesmo valor. Quaisquer linhas em ordens que não correspondem a linhas Employees são ignorados, e vice-versa. (Este não é o caso aqui, mas você vai ver um exemplo em breve.) Uma junção interna sempre retorna somente as linhas que atendem a especificação de junção. Dica: Colunas usadas para unir não tem que aparecer na lista SELECT. Se você quiser, pode omitir essa coluna. Outer Joins (Junções externas) Junções externas retornar todas as linhas de (pelo menos) uma das tabelas associadas, mesmo que as linhas em uma tabela não correspondem linhas na outra. Três tipos de junções externas existem: junção externa esquerda, junção externa direita e externa completa. Os termos esquerda e direita referem-se aos operandos à esquerda e à direita do operador JOIN. (Consulte o básico sintaxe para a junção interna, e você vai ver por isso que chamamos os operandos (tabela-esquerda) e (tabela- direita). Em uma associação externa à esquerda, todas as linhas da tabela à esquerda serão recuperadas se eles têm correspondência linhas da tabela direita. Por outro lado, em uma junção externa direita, todas as linhas da tabela direita serão recuperadas se eles têm correspondência linhas da tabela esquerda. Em uma junção externa completa, todas as linhas de ambas as tabelas são devolvidos. Dica: Esquerda e direita junção externa são logicamente equivalentes. É sempre possível converter uma esquerda se juntar em uma direita juntam-se, alterando o operador e lançando os operandos ou um direito se juntar em uma esquerda com uma mudança similar. Assim, somente um desses operadores é realmente necessário. Qual você escolhe é basicamente uma questão de preferência pessoal, mas uma regra útil é usar a esquerda ou direita, mas não ambos na mesma consulta. O otimizador de consulta não vai se importar, mas os seres humanos encontram-se muito mais fácil seguir uma consulta complexa, se a junta sempre ir na mesma direção. Quando isso é útil? Muito freqüentemente. Na verdade, sempre que existe uma relação pai-filho entre tabelas, apesar de que a integridade referencial é mantida, algumas linhas pai não pode ter linhas relacionadas na tabela filho, uma vez que as linhas filho pode ser autorizado a ter valores de chave estrangeira nulos e, portanto, não corresponde a nenhum linha na tabela pai. Experimente: Usando LEFT OUTER JOIN Para listar todos os entradas ProductID e ProductName, mesmo aqueles que ainda não foi comentado ainda e não têm associado ReviewerName, Comments, e Rating, abra uma janela nova consulta no SQL Server Management Studio
  48. 48. (Lembre-se de fazer AdventureWorks seu contexto de consulta). Digite a seguinte consulta e clique em executar. Você verá os resultados mostrados na Figura 5-22. select PP.ProductID, PP.Name, PPR.ReviewerName, PPR.Comments, PPR.Rating from Production.Product PP left outer join Production.ProductReview PPR on PP.ProductID = PPR.ProductID Figura 5-22. Usando LEFT OUTER JOIN Como Funciona Vamos começar com a lista SELECT. select PP.ProductID, PP.Name, PPR.ReviewerName, PPR.Comments, PPR.Rating Já que você está selecionando colunas de duas tabelas, você precisa identificar qual tabela uma coluna vem, o que você faz prefixando o nome da tabela e um ponto (.) Para o nome da coluna. Isto é conhecido como desambiguação, ou remover a ambigüidade de modo que o gerenciador de banco sabe qual coluna de usar. Embora isso tem que ser feito apenas para colunas que aparecem em ambas as tabelas, a melhor prática é qualificar todas as colunas com os seus nomes de tabela. A seguinte cláusula FROM especifica as tabelas que você está unindo e o tipo de junção que você está usando: from Production.Product PP left outer join Production.ProductReview PPR Ele especifica uma associação externa à esquerda das tabelas Production.Product e Production.ProductReview. Também especifica os critérios para a adesão ao ProductID chave primária da tabela Product com a chave estrangeira da tabela ProductId ProductReview. on PP.ProductID = PPR.ProductID A left outer join em ProductID produz uma tabela composta por cinco colunas ProductID, Name, ReviewerName, Comments, e Rating. Todos os dados são recuperados a partir de linhas em Production.Product, que é a tabela da esquerda, e de correspondência e de dados inigualável dos Production.ProductReview onde suas colunas ProductID tem a correspondência ou valores ainda não correspondentes. Experimentá-lo: Usando RIGHT OUTER JOIN Para listar todas as colunas ProductID e ProductName e detalhes com base naqueles que foram revistos, abra uma janela nova consulta no SQL Server Management Studio (Lembre-se de fazer AdventureWorks
  49. 49. seu contexto de consulta). Digite a seguinte consulta e clique em executar. Você verá os resultados mostrados na Figura 5-23. select PP.ProductID, PP.Name, PPR.ReviewerName, PPR.Comments, PPR.Rating from Production.Product PP right outer join Production.ProductReview PPR on PP.ProductID = PPR.ProductID Figura 5-23. Usando LEFT OUTER JOIN Como Funciona Vamos começar com a lista SELECT. select PP.ProductID, PP.Name, PPR.ReviewerName, PPR.Comments, PPR.Rating Desde que você está selecionando colunas de duas tabelas, você precisa identificar qual tabela vem uma coluna, o que você faz por prefixando o nome da tabela e um ponto (.) para o nome da coluna. Isso é conhecido como desambiguação, ou remover ambigüidade para que o Gerenciador de banco de dados sabe qual coluna usar. Mas isto tem que ser feito apenas para colunas que aparecem em ambas as tabelas, a melhor prática é qualificar todas as colunas com os nomes de tabela. A seguinte cláusula FROM especifica as tabelas que você está se juntando e o tipo de junção que você está usando: from Production.Product PP right outer join Production.ProductReview PPR Especifica uma junção externa direita da tabela Production. Product e ProductReview. Ela também especifica os critérios para juntar-se a chave primária ProductID da tabela de produto com a chave estrangeira ProductId da tabela ProductReview. on PP.ProductID = PPR.ProductID A junção externa direita em ProductID produz uma tabela composta de cinco colunas: ProductID, nome, ReviewerName, comentários e classificação. Todos os dados é Obtida de linhas em ProductReview, que é a direita da tabela e dados correspondentes e disforme de ProductReview onde suas colunas ProductID têm valores correspondentes ou até mesmo disforme. Outras associações O padrão SQL também fornece para FULL OUTER JOIN, UNION JOIN e CROSS JOIN (e mesmo NATURAL JOIN, basicamente, uma junção interna usando predicados de igualdade), mas estes são muito menos utilizados e além do escopo deste livro. Não vamos dar exemplos, mas esta seção contém um breve resumo deles.

×