Desvendando o SQL - Parte II - Criando um Banco de Dados e Tabelas
Autor: Rubens Lima | Publicado: 2013-07-18T22:14:00-03:00






Olá
a todos,



Dando
continuidade à série de artigos sobre o SQL vamos hoje começar a colocar a mão
na massa no aprendizado da linguagem SQL. Para aqueles que não leram o primeiro
artigo acesse Desvendando
o SQL - Parte I.







No artigo anterior começamos a conhecer o SQL, fizemos uma introdução da
linguagem, mostramos alguns comandos e operadores e também onde encontrar as
ferramentas que utilizaremos durante nossos artigos. Então caso ainda não tenha
instalado faça isso antes de começar a utilizar os comandos. Os links de
instalação das ferramentas de banco e IDE são &nbsp;Microsoft®
SQL Server® 2008 Express e Microsoft®
SQL Server® 2008 Management Studio Express respectivamente. &nbsp;Caso usem o Windows 8, o SQL Server
2008 pode causar problemas de compatibilidade, então aconselho usarem o&nbsp;Microsoft® SQL Server® 2012 Express. No caso da versão 2012 existe uma opção a Express with Tools já consta o Mecanismo de Banco de Dados e o SQL Server Management Studio Express. Ressaltando
que as ferramentas acima são gratuitas.



Como
disse anteriormente, tudo que faremos via script, salvo algumas exceções pode
ser feito de forma amigável por meio da ferramenta de gerenciamento, o que é
intuitiva, mas como o objetivo é colocar a mente pra funcionar, pois podemos
precisar no futuro vamos voltar no tempo e fazer tudo na base da mão.



Hoje
vamos conhecer melhor alguns comandos de criação de algumas estruturas do SQL e
carga em tabelas. Sem perder mais tempo vamos começar. Tudo começa com a
criação de um Banco de Dados é dentro dele que tudo é feito. Alojado no banco
de dados estarão às tabelas (tables), visões (views), stored procedures
(procedimentos armazenados), function (funções), usuários (user), regras e tudo
mais necessário para a organização de seus dados. 


CRIANDO UM NOVO BANCO


A
sintaxe ou forma de descrever o comando de forma geral é bem extensa e
complexa, pois dentro dele pode-se determinar n configurações do BD, mas por
enquanto vamos nos atentar ao mais simples possível sem deixar de lado a
funcionalidade. O primeiro desses comandos é o CREATE DATABASE Database_name,
onde Database_name: é o nome do novo banco de dados.&nbsp;Pode escolher o nome
que achar melhor de acordo com a sua utilização. Nomes de bancos de dados devem
ser exclusivos dentro de uma instância do SQL Server e estar de acordo com as
regras de&nbsp;identificadores
que se segue, não se preocupe no momento com os dados técnicos.



O
database_name&nbsp;pode conter um máximo de 128 caracteres, sem acentos,
espaços nem caracteres preferencialmente. Para efeito de organização vou
utilizar uma nomenclatura padrão que costumo usar. 



Como
é uma coisa que muitos conhecem e para facilitar vamos criar uma estrutura
simples de estoque. Claro que para grandes sistemas o ideal é fazer um
levantamento antes de todas as tabelas necessárias e somente depois criaram já
com suas respectivas ligação, mas a nível de aprendizado iremos no momento
pular essa parte.



Abra
sua IDE do SQL Server 2008 Express ou 2012 Express coloque usuário e senha que
cadastrou na instalação, agora abra uma nova consulta (CTRL+N) e nela digite o
comando abaixo:



CREATE DATABASE DBEstoque



Em seguida aperte F5 ou vá ao menu Consulta/Executar
para executar o comando, esse vai ser nosso banco de teste. Se a mensagem ‘Comando(s) concluído(s) com êxito’ aparecer o seu banco foi criado com
sucesso, se não aparecer na lista é só atualizar o servidor que ele vai está lá
normalmente. Pronto nosso banco já está criado, algo como a estrutura abaixo
vai aparecer. Se não criou certo e seja necessário apagar o banco criado
utilize DROP DATABASE database_name, onde database_name é o nome do banco que
será apagado, mas pelo amor de Deus tome cuidado ao executar esse comando
porque ele não tem volta. 













Agora
com o banco criado digite o comando: 



USE DBEstoque



Isso
vai garantir que todos os comandos a seguir serão feito dentro de nosso BD que
foi criado.


AS PRIMEIRAS TABELAS


As
tabelas são os repositórios de suas informações, lembra-se do Excel? É bem
parecido, composta por colunas e linhas, onde as colunas são os campos que serão
necessários para armazenar as informações, onde cada coluna terá seu tipo de
dados específico, e as linhas, também chamadas de tuplas, contem as informações
referentes a cada campo criado.





 

  


  
colunas

 

  
NOME

  
TELEFONE

  
CPF

 

  
linhas

  
João Lima

  
9999-9999

  
11111111111

 

  
Paulo Cesar

  
8888-8888

  
22222222222

 

  
Maria Pereira

  
7777-7777

  
33333333333

 










Seguindo
o padrão vou utilizar uma nomenclatura para as tabelas e os campos, mas você
poderá usar a quer mais se adaptar a sua situação, só lembrando que evite usar caracteres
especiais ou espaços nos nomes, isso facilitará as consultas futuras.




Alguns pontos são
importantes na criação de uma tabela:








Quais
os campos que serão utilizados;
De
que tipos são;
Se
são ou não obrigatórios;
Quais
desses campos serão considerados como chaves primárias e chaves estrangeiras.




Tipo
de Dados








SQL tem uma gama bem
extensa de tipos de dados, inclusive podemos criar os nossos próprios, esses
tipos podem ser usados em colunas, variáveis, parâmetros. Esses tipos são
divididos em categorias, futuramente explicaremos com mais detalhes cada tipo:




Numéricos exatos




o&nbsp;&nbsp;
<!--[endif]-->bigint 



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->numeric



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->bit&nbsp;&nbsp;&nbsp;&nbsp; 



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->smallint



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->decimal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->smallmoney



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->int&nbsp;&nbsp;&nbsp;&nbsp; 



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->tinyint



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->money





Numéricos aproximados



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->float



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->real



Data e hora





<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->data&nbsp; 



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->datetimeoffset



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->datetime2&nbsp;&nbsp; 



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->smalldatetime



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->datetime&nbsp;&nbsp;&nbsp;&nbsp; 



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->time









Cadeias de caracteres


<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->char
– tamanho fixo



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->varchar
– tamanho variável



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->text&nbsp;&nbsp; &nbsp;




Cadeias de caracteres
Unicode


<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->nchar 



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->nvarchar



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->ntext &nbsp;




Cadeia de caracteres
binária


<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->binary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->varbinary



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->image&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp; &nbsp;


Outros tipos de dados


o&nbsp;&nbsp;
cursor&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->timestamp



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->hierarchyid 



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->uniqueidentifier



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->sql_variant 



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->xml



<!--[if !supportLists]-->o&nbsp;&nbsp;
<!--[endif]-->table&nbsp; 













Chave Primária







Ou como o banco conhece Primary Key. Segundo o MSDN “é uma
restrição que impõe a integridade de entidade para uma coluna ou colunas
especificadas por meio de um índice exclusivo.&nbsp;Somente uma restrição PRIMARY KEY pode ser criada por
tabela.” Em geral é um campo onde não pode haver repetições. 







Chave Estrangeira







Ou como é conhecida Foreign Key. Segundo o MSDN “é uma restrição
que fornece integridade referencial para os dados na coluna ou colunas.&nbsp;As restrições FOREIGN KEY requerem que cada valor na
coluna exista na coluna ou colunas referenciadas correspondentes na tabela
referenciada.&nbsp;As restrições FOREIGN KEY
podem fazer referência somente a colunas que sejam restrições PRIMARY KEY ou
UNIQUE na tabela ou colunas referenciadas em um UNIQUE INDEX na tabela
referenciada.&nbsp;As chaves estrangeiras em
colunas computadas também devem ser marcadas como PERSISTED.” São os campos que
fazem as ligações entre as tabelas.









Agora explicado vamos criar nossas tabelas, vou criar a primeira
de forma bem detalhada explicando o que significa, as outras estarão no script
disponibilizado no final do artigo. Acredito que o SQL ainda esteja aberto e
com uma nova consulta, se não faça isso e então escreva o código abaixo.








CREATE TABLE TBCategoria

(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CD_CATEGORIA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOT
NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IDENTITY,&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DESC_CATEGORIA&nbsp;&nbsp;&nbsp; VARCHAR(30) NOT NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

)



EXECUTE SP_ADDEXTENDEDPROPERTY 'MS_DESCRIPTION', 

&nbsp;&nbsp; 'Tabela de
Categoria de Produto',

&nbsp;&nbsp; 'USER', 'DBO', 'TABLE', 'TBCategoria'

GO



ALTER TABLE TBCategoria

&nbsp;&nbsp; ADD CONSTRAINT
PK_CATG PRIMARY KEY (CD_CATEGORIA)


GO






A
primeira parte cria a tabela, utilizaremos sempre um TB antes da funcionalidade
da tabela, nesse caso será a tabela de categoria de produtos que terá somente
dois campos, um será o código do tipo inteiro, ou seja, um número, e outro será
a descrição do tipo cadeia de caracteres com até 30 posições. O NOT NULL
determina que os campos sejam obrigatórios. O IDENTITY determina que o campo
seja preenchido automaticamente de forma sequencial.


A
segunda parte não é obrigatória, é mais uma questão de organização, o comando
cria uma descrição pra tabela, explicando do que se trata, fica mais bonitinho.


A
última parte cria a chave primária da tabela, veja que ela altera a tabela
TbCategoria e cria uma restrição com o nome de PK_CATG dizendo que o campo
CD_CATEGORIA é a chave primária da tabela, isso vai determinar que esse campo
será único, ou seja, sem repetições.


Tabela
criada agora crie as outras. Deu errado? Não tem problema o script está
apagando e criando as tabelas e suas chaves na ordem correta. Mas e tem uma
ordem? Na verdade tem, quando temos algumas tabelas que se interligam, criá-las
na ordem errada vai gerar erro no momento da execução, pois o script pode está
fazendo referencia a campos que nem existem. Lembra-se do DROP que mencionei no
banco? Funciona da mesma maneira para tabela, é só colocar DROP TABLE
table_name onde tabme_name é o nome da tabela criada.






Agora
vamos inserir algumas categorias nessa tabela que criamos. É um script bem
simples já que nesse caso você só precisa preenche um campo pois o outro é
automático. Em uma nova consulta escreva o código abaixo:


INSERT INTO TBCategoria (DESC_CATEGORIA) VALUES ('Bebidas')

INSERT INTO TBCategoria (DESC_CATEGORIA) VALUES ('Cereais')

INSERT INTO TBCategoria (DESC_CATEGORIA) VALUES ('Lacticínios')

INSERT INTO TBCategoria (DESC_CATEGORIA) VALUES ('Massas')

INSERT INTO TBCategoria
(DESC_CATEGORIA)
VALUES ('Enlatados')


Quando
só preenchemos alguns campos da tabela é preciso que digamos qual campo vai
receber o que, caso contrário podemos inserir os dados em um campo errado.


Feita
a inserção podemos conferir se está tudo ok, em uma nova consulta digite:


SELECT * FROM
TBCATEGORIA


O
resultado abaixo vai aparecer mostrando que os dados foram inseridos normalmente
e você acabou de fazer sua primeira consulta.






Agora
é com você, crie as outras tabelas, e depois insira as informações em cada uma
delas, se der errado é só rodar os scripts novamente que vai da certo, se
desejar crie outras tabelas, insira mais alguns dados nas tabelas criadas sempre
respeitando as chaves primárias e estrangeiras.


Se
tiver alguma dúvida não se acanhe é só comentar suas dúvidas que com prazer
irei respondê-la. No próximo artigo vamos mexer mais um pouco na estrutura das
tabelas, conheceremos o UPDATE e o DELETE, não perca.


Abraço
a todos e até a próxima.


Scripts:

Criação Tabelas
Carga das Tabelas




Artigos anteriores:
Desvendando o SQL - Parte I - Introdução