c # banco de dados

51
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:

Upload: cleto-lima-de-andrade

Post on 04-Jul-2015

195 views

Category:

Education


7 download

DESCRIPTION

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

TRANSCRIPT

Page 1: C # banco de dados

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:

Page 2: C # banco de dados

• 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:

Page 3: C # banco de dados

• 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

Page 4: C # banco de dados

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.

Page 5: C # banco de dados

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.

Page 6: C # banco de dados

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

Page 7: C # banco de dados

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

Page 8: C # banco de dados

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

Page 9: C # banco de dados

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.

Page 10: C # banco de dados

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

Page 11: C # banco de dados

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

Page 12: C # banco de dados

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 Programas\Microsoft 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?

Page 13: C # banco de dados

• 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.

Page 14: C # banco de dados

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 Files\Microsoft SQL

Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\Sql2012Data.mdf',

SIZE = 5MB,

MAXSIZE = 15MB,

FILEGROWTH = 20%

)

LOG ON

(

NAME = Sql2012Log,

FILENAME ='C:\Program Files\Microsoft SQL

Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\Sql2012Log.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.

Page 15: C # banco de dados

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.

Page 16: C # banco de dados

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.

Page 17: C # banco de dados

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.

Page 18: C # banco de dados

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) )

Page 19: C # banco de dados

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.

Page 20: C # banco de dados

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

Page 21: C # banco de dados

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.

Page 22: C # banco de dados

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

Page 23: C # banco de dados

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

Page 24: C # banco de dados

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

Page 25: C # banco de dados

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.

Page 26: C # banco de dados

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.

Page 27: C # banco de dados

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

Page 28: C # banco de dados

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.)

Page 29: C # banco de dados

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).

Page 30: C # banco de dados

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

Page 31: C # banco de dados

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

Page 32: C # banco de dados

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

Page 33: C # banco de dados

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%'

Page 34: C # banco de dados

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

Page 35: C # banco de dados

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

Page 36: C # banco de dados

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

Page 37: C # banco de dados

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

Page 38: C # banco de dados

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

Page 39: C # banco de dados

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'

Page 40: C # banco de dados

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

Page 41: C # banco de dados

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')

Page 42: C # banco de dados

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

Page 43: C # banco de dados

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

Page 44: C # banco de dados

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.

Page 45: C # banco de dados

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

Page 46: C # banco de dados

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

Page 47: C # banco de dados

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

Page 48: C # banco de dados

(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

Page 49: C # banco de dados

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.

Page 50: C # banco de dados

Uma junção externa completa é como uma combinação de ambos a esquerda ea direita EXTERIOR junta.

Todas as linhas de ambas as tabelas serão recuperados, mesmo se eles não têm linhas relacionadas na outra tabela.

A UNIÃO JOIN é diferente de junções externas na medida em que não corresponde linhas. Em vez disso, ele

cria uma tabela que tem todas as linhas de ambas as tabelas. Por duas tabelas, é equivalente à seguinte consulta:

select

*

from

table1

union all

select

*

from

table2

As tabelas devem ter o mesmo número de colunas, e os tipos de dados de colunas correspondentes devem ser

compatíveis (capaz de segurar os mesmos tipos de dados).

Um CROSS JOIN combina todas as linhas de ambas as tabelas. Ele não fornece uma especificação de junção,

pois isto seria irrelevante. Ela produz uma tabela com todas as colunas de ambas as tabelas e como muitos linhas

como o produto do número de linhas em cada tabela. O resultado também é conhecido como um produto cartesiano,

já que é o termo matemático para associar cada elemento (linha) de um conjunto (mesa) com todos os elementos de

outro conjunto. Por exemplo, se existem cinco linhas e cinco colunas na tabela A e 10 linhas e três colunas na tabela B,

associar a Cruz de A e B produziria uma tabela com linhas de cinquenta e oito colunas. Não só é esta operação join

praticamente inaplicável a qualquer consulta do mundo real, mas é também um processo potencialmente muito caro

para até pequenos bancos de dados do mundo real. (Imagine a usá-lo para tabelas de produção com milhares ou

mesmo milhões...

Resumo:

No presente capítulo, abordamos como construir consultas de banco de dados usando SQL recursos como gama, lista,

os operadores IS NULL, funções agregadas, funções DATETIME, cláusulas GROUP BY, junções e correspondência de

padrões. No próximo capítulo, você aprenderá sobre a criação de procedimentos armazenados.

Page 51: C # banco de dados

Capitulo 06

Usando procedimentos armazenados (Stored Procedures)

Um procedimento armazenado é um conjunto de instruções SQL que permite que você execute uma tarefa

repetidamente. Você pode criar o procedimento uma vez e reutilizá-lo várias vezes em seu programa. Isso pode

melhorar a capacidade de manutenção de sua aplicação e permitir que os aplicativos para acessar o banco de dados de

maneira uniforme e otimizado. Os objetivos deste capítulo devem fazer com que você conheça procedimentos

armazenados, criando e modificando-os em SQL Server 2012 e para explicar como programas C # pode interagir com

eles. Este capítulo aborda os seguintes tópicos: