Tabelas no SQL Server
- Amanda Nascimento
- 3 de ago. de 2023
- 10 min de leitura
Atualizado: 2 de jun.
Uma tabela é uma estrutura que armazena dados em formato de linhas e colunas. Cada coluna representa um campo com um tipo de dado específico, e cada linha representa um registro único. As tabelas são os principais componentes de um banco de dados relacional, permitindo o armazenamento e a organização eficiente das informações.
Ao criar uma tabela, é necessário definir:
Nome da tabela: Identificador único dentro do banco de dados.
Colunas: Cada coluna possui um nome, tipo de dado e, opcionalmente, restrições (como NOT NULL, UNIQUE, etc.).
Chave primária: Coluna(s) que identificam de forma única cada registro na tabela.
Para saber mais sobre chaves clique aqui
Para consultar sobre chave primária em tabelas existentes, clique aqui
Criando uma tabela simples, passo a passo
CREATE TABLE dbo.TESTE (

ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
NOME VARCHAR(100),
IDADE INT,
NASCIMENTO DATE
);

-- Inserindo uma condicional com o IF para que se a tabela já existir, é para excluir primeiro para depois criá-la novamente:
IF(OBJECT_ID('dbo.TESTE') IS NOT NULL)DROP TABLE dbo.TESTE

--Inserindo uma tabela com dados como nome, idade e data de nascimento:
--Para todos os campos que não podem ser vazio, podemos colocar o NOT NULL
--Exemplo: NOME VARCHAR(100) NOT NULL,

IF(OBJECT_ID('dbo.TESTE2') IS NOT NULL)
DROP TABLE dbo.TESTE2;
CREATE TABLE dbo.TESTE2 (
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
NOME VARCHAR(100),
IDADE INT,
NASCIMENTO DATE
);
INSERT INTO dbo.TESTE2 (NOME, IDADE, NASCIMENTO)
VALUES ('Amanda', 32, '2023-01-01'), ('Matheus', 10, '2023-01-01'),
('Joao', 19, '2023-01-01'), ('Guilherme', 33, '2023-01-01'), ('Dara', 26, '2023-01-01');
Criando uma tabela com chave primária (Primary Key)
A chave primária é o principal identificador exclusivo de uma tabela. Cada valor deve ser único e não nulo.
CREATE TABLE Clientes (
ClienteID INT PRIMARY KEY,
Nome NVARCHAR(100) NOT NULL,
Email NVARCHAR(100) UNIQUE,
DataCadastro DATETIME DEFAULT GETDATE()
);
ClienteID: Identificador único do cliente, definido como chave primária.
Nome: Nome do cliente, não permite valores nulos.
Email: Endereço de e-mail do cliente, deve ser único.
DataCadastro: Data e hora do cadastro, com valor padrão igual à data atual
Criando uma tabela com chave composta
É uma chave formada por mais de uma coluna, geralmente quando nenhuma coluna isoladamente pode garantir unicidade.
CREATE TABLE Matriculas (
AlunoID INT,
CursoID INT,
DataMatricula DATE,
PRIMARY KEY (AlunoID, CursoID)
);
Criando uma tabela com chave Estrangeira (Foreign Key)
Relaciona tabelas, criando uma dependência entre dados.
CREATE TABLE Alunos (
AlunoID INT PRIMARY KEY,
Nome NVARCHAR(100)
);
CREATE TABLE Notas (
NotaID INT PRIMARY KEY,
AlunoID INT,
Nota DECIMAL(4,2),
FOREIGN KEY (AlunoID) REFERENCES Alunos(AlunoID)
);
Criando uma tabela com Super Chave (Super Key)
Qualquer conjunto de colunas que identifica de forma única um registro. Pode conter atributos a mais que a chave primária.
CREATE TABLE Clientes (
ClienteID INT PRIMARY KEY,
CPF CHAR(11),
Nome NVARCHAR(100),
UNIQUE (Nome, CPF) -- Super Chave possível
);
Criando uma tabela com Chave candidata (Candidate Key)
São colunas ou conjuntos de colunas que podem servir como chave primária.
CREATE TABLE Usuarios (
UsuarioID INT PRIMARY KEY, -- Chave primária escolhida
Email NVARCHAR(100) UNIQUE, -- Chave candidata
CPF CHAR(11) UNIQUE -- Outra chave candidata
);
Criando uma tabela com Chave Única (Unique Key)
Garante que os valores sejam únicos, mas permite valores nulos (diferente da chave primária).
CREATE TABLE Funcionarios (
FuncionarioID INT PRIMARY KEY,
Email NVARCHAR(100) UNIQUE, -- Pode ser nulo, mas se houver valor, deve ser único
Telefone VARCHAR(15) UNIQUE
);
Criando uma tabela com Chave Alternativa (Alternate Key)
É qualquer chave candidata que não foi escolhida como a chave primária.
CREATE TABLE Cidadãos (
ID INT PRIMARY KEY, -- Chave primária escolhida
CPF CHAR(11) UNIQUE -- Chave alternativa
);
Criando uma tabela com Chave Natural (Natural Key)
Chave que já existe nos dados do mundo real. Ex: CPF, CNPJ, matrícula, etc.
CREATE TABLE ClientesNaturais (
CPF CHAR(11) PRIMARY KEY, -- Chave natural
Nome NVARCHAR(100)
);
Criando uma tabela com Chave de Substituição (Surrogate Key)
É uma chave artificial criada quando a natural não é confiável ou não existe. Normalmente é um número incremental (ID).
CREATE TABLE ClientesSubstituidos (
ClienteID INT IDENTITY(1,1) PRIMARY KEY, -- Surrogate Key
CPF CHAR(11),
Nome NVARCHAR(100)
);
Criando uma tabela com Chave Secundária
Não identifica registros de forma única, mas é usada para recuperação de dados, via índices. É comum em índices não clusterizados.
CREATE TABLE ProdutosIndexados (
ProdutoID INT PRIMARY KEY,
Categoria NVARCHAR(50),
Nome NVARCHAR(100)
);
-- Índice secundário na coluna Categoria
CREATE NONCLUSTERED INDEX idx_Categoria
ON ProdutosIndexados (Categoria);
Criando uma tabela com restrição
Para garantir que os valores inseridos em uma coluna atendam a uma condição específica:
CREATE TABLE Funcionarios (
FuncionarioID INT PRIMARY KEY,
Nome NVARCHAR(100),
Salario DECIMAL(10,2) CHECK (Salario >= 0)
);
Tipos de dados para criar uma tabela
Categoria | Tipo de Dado | Descrição | Exemplo de Uso |
Numéricos Exatos | bigint | Inteiro grande (-2^63 a 2^63-1) | QtdAcessos BIGINT |
Numéricos Exatos | bit | Valor booleano (0, 1 ou NULL) | Ativo BIT |
Numéricos Exatos | decimal(p,s) | Número com precisão e escala definidas | Salario DECIMAL(10,2) |
Numéricos Exatos | int | Inteiro comum (-2.147.483.648 a 2.147.483.647) | Idade INT |
Numéricos Exatos | money | Valores monetários com 4 casas decimais | Saldo MONEY |
Numéricos Exatos | numeric(p,s) | Igual ao decimal, sinônimo | Imposto NUMERIC(8,3) |
Numéricos Exatos | smallint | Inteiro pequeno (-32.768 a 32.767) | AnoNascimento SMALLINT |
Numéricos Exatos | smallmoney | Valores monetários menores | Mensalidade SMALLMONEY |
Numéricos Exatos | tinyint | Inteiros de 0 a 255 | Nota TINYINT |
Numéricos Aproximados | float(n) | Ponto flutuante de precisão variável | Temperatura FLOAT |
Numéricos Aproximados | real | Menor precisão que float | Velocidade REAL |
Data e Hora | date | Apenas data (sem hora) | DataNascimento DATE |
Data e Hora | datetime | Data e hora com precisão de ~3ms | DataCadastro DATETIME |
Data e Hora | datetime2(p) | Data/hora com precisão ajustável (frações de segundo) | DataAtualizacao DATETIME2(7) |
Data e Hora | datetimeoffset | Data/hora com fuso horário | DataEnvio DATETIMEOFFSET |
Data e Hora | smalldatetime | Intervalo reduzido de datas (1900-2079) | DataEvento SMALLDATETIME |
Data e Hora | time(p) | Apenas hora, com precisão opcional | HoraAcesso TIME(0) |
Texto (Caractere) | char(n) | Tamanho fixo de texto (até 8000 caracteres) | UF CHAR(2) |
Texto (Caractere) | varchar(n) | Texto de tamanho variável (até 8000 ou MAX) | NomeProduto VARCHAR(100) |
Texto Unicode | nchar(n) | Tamanho fixo de texto Unicode | Sigla NCHAR(3) |
Texto Unicode | nvarchar(n) | Texto Unicode de tamanho variável | NomeCompleto NVARCHAR(200) |
Binário | binary(n) | Dados binários fixos | SenhaHash BINARY(64) |
Binário | varbinary(n) | Binário de tamanho variável | Arquivo VARBINARY(MAX) |
Alterar tipo de dados em uma tabela
alter table funcionarios
alter column telefone varchar(10)
Resumo tipo de chaves para criar uma tabela
Tipo de Chave | Função Principal |
Primária | Identificação única obrigatória |
Composta | Combinação de colunas como identificador |
Estrangeira | Relacionamento entre tabelas |
Super | Conjunto que pode identificar unicamente um registro |
Candidata | Potenciais chaves primárias |
Única | Garante unicidade, mas permite NULL |
Alternativa | Candidata não escolhida como chave primária |
Natural | Chave vinda do mundo real |
Substituição | Chave artificial gerada (ex: IDENTITY) |
Secundária | Usada em busca, via índice, não para identificação |
Adicionando coluna em uma tabela
💠 Exemplo 1
ALTER TABLE Clientes ADD Telefone NVARCHAR(20);
💠 Exemplo 2
ALTER TABLE TCARGOS
ADD datacriacao DATE NULL;
💠 Exemplo 3
alter table funcionarios
add telefone varchar(20)
Criar uma coluna com valor default
ALTER TABLE NomeDaTabela
ADD NovaColuna VARCHAR(50) DEFAULT 'Valor Padrão';
Adicionando ou alterando dados em uma coluna
Atualizar um valor específico em uma linha.
Atualiza a cidade do cliente com id_cliente = 101
UPDATE clientes
SET cidade = 'Belo Horizonte'
WHERE id_cliente = 101;
Atualizar múltiplas colunas
Atualiza o preço e o estoque do produto de ID 5
UPDATE produtos
SET preco = 29.90,
estoque = 100
WHERE id_produto = 5;
Atualizar todos os registros da tabela
Define o valor da coluna ativo como 0 para todos os funcionários.
UPDATE funcionarios
SET ativo = 0;
Atualizar com base em outra tabela (usando JOIN)
Aplica um aumento de 10% no salário de funcionários do TI.
UPDATE f
SET f.salario = f.salario * 1.10
FROM funcionarios f
WHERE d.nome = 'TI';
Atualizar com base em uma subquery
Aumenta o preço dos produtos da categoria "Eletrônicos" em 15%.
UPDATE produtos
SET preco = preco * 1.15
WHERE id_categoria = (
SELECT id_categoria FROM categorias WHERE nome = 'Eletrônicos'
);
Usar CASE dentro de um UPDATE
Atualiza o status dos pedidos com base na data de entrega.
UPDATE pedidos
SET status = CASE
WHEN data_entrega < GETDATE() THEN 'Entregue'
WHEN data_entrega IS NULL THEN 'Pendente'
ELSE 'Em trânsito'
END;
🔹Exemplo 1
UPDATE FUNCO
SET NOME_CARGO = UPPER(REPLACE(REPLACE(REPLACE(RTRIM(NOME_CARGO), 'ç', 'c'), 'á', 'a'), 'é', 'e'));
🔹Exemplo 2
UPDATE TCARGOS
SET datacriacao = '2023-07-13'
WHERE cargos = 5;
🔹Exemplo 3
UPDATE psecao
SET rua = 'AV REI PELE'
WHERE codigo LIKE '0.039%'
AND SECAODESATIVADA = '0'
🔹Exemplo 4
update funcionarios set telefone= '11999999999' where funcionarioid=1
update funcionarios set telefone= '11988888888' where funcionarioid=2
Alterar nome de uma coluna
EXEC sp_rename 'TCARGOS.codigo_cargo', 'CARGOS', 'COLUMN';
Excluindo uma tabela
💠 Exemplo 1
DROP TABLE Clientes

💠 Exemplo 2
DROP TABLE CORPORE_DESENV.dbo.TCARGOS;
Apagando uma coluna
ALTER TABLE NomeDaTabela
DROP COLUMN NomeDaColuna;
Apagando dados de uma coluna
UPDATE NomeDaTabela
SET NomeDaColuna = NULL;
Mascarar (codificar) os dados de uma coluna específica
Exemplo: mascarar parcialmente uma coluna de e-mails.
UPDATE NomeDaTabela
SET Email = CONCAT(LEFT(Email, 2), '*****@***.com');
Outro exemplo para criptografar dados (não reversível, usando HASHBYTES):
-- Primeiro, converta para VARBINARY, depois salve como VARCHAR
UPDATE NomeDaTabela
SET ColunaCodificada = CONVERT(VARCHAR(100), HASHBYTES('SHA2_256', ColunaOriginal), 2);
🔹 HASHBYTES gera um hash da informação. Ideal para senhas, não pode ser revertido.
🔹 Use SHA2_256 ou SHA1 para algoritmos seguros.
Entidade e Atributo
É importante mencionar aqui um conceito importante na modelagem de dados.
Quando estamos projetando um banco de dados relacional, é essencial entender os conceitos de entidade e atributo
Uma entidade representa qualquer objeto do mundo real que pode ser identificado e que queremos armazenar informações sobre ele no banco de dados. Cada entidade vira, geralmente, uma tabela no banco.
Exemplos de entidades:
Cliente
Produto
Pedido
Funcionário
👉 Em um sistema de vendas, por exemplo, as entidades principais poderiam ser: Clientes, Produtos e Pedidos.
Um atributo é uma característica ou propriedade da entidade. Em termos de banco de dados, os atributos são representados pelas colunas da tabela.
Exemplo:
Para a entidade Cliente, os atributos podem ser:
Nome
CPF
Data de Nascimento
E-mail
Ou seja, quando você cria uma tabela chamada Clientes, cada coluna representa um atributo dessa entidade.
exemplo prático:
--Entidade clientes
CREATE TABLE Clientes (
ClienteID INT PRIMARY KEY, -- atributo identificador
Nome NVARCHAR(100), -- atributo
CPF CHAR(11), -- atributo
Email NVARCHAR(100), -- atributo
DataNascimento DATE -- atributo
);
Entidades podem se relacionar entre si. Por exemplo, um cliente pode fazer vários pedidos. Isso nos leva ao conceito de relacionamento entre entidades, que é modelado usando chaves estrangeiras (foreign keys) que vimos acima.
CREATE TABLE Pedidos (
PedidoID INT PRIMARY KEY,
ClienteID INT FOREIGN KEY REFERENCES Clientes(ClienteID),
DataPedido DATETIME,
Total DECIMAL(10, 2)
);
Para saber mais sobre modelagem de dados, clique aqui!
Criando uma tabela com indexador numérico

IF OBJECT_ID('dbo.Numbers') IS NOT NULL DROP TABLE dbo.Numbers;
CREATE TABLE dbo.Numbers (Number INT PRIMARY KEY);
WITH Tally (N) AS (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1
FROM sys.objects s1 CROSS JOIN sys.objects s2
)
INSERT INTO dbo.Numbers (Number)
SELECT N
FROM Tally
WHERE N <= 10000; -- Ajuste conforme necessário
select * from Numbers
Resultado:
Alterando nome de uma tabela
De FUNCO para TCARGOS
EXEC sp_rename 'FUNCO', 'TCARGOS';
SELECT * FROM TCARGOS
Consultar nomes das tabelas existentes
💠 Exemplo 1
SELECT
t.create_date AS 'Data de Criação'
FROM
sys.tables t
INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id;
💠 Exemplo 2
USE NOMEDOSEUBANCO
SELECT name,
FORMAT(create_date, 'dd/MM/yyyy') as create_date,
FORMAT(modify_date, 'dd/MM/yyyy') as modify_date,
modify_date
FROM sys.tables
ORDER BY name

Criar tabela temporária
São tabelas criadas temporariamente, visíveis somente durante a sessão atual (ou transação, dependendo do escopo), e são armazenadas fisicamente no banco tempdb.
CREATE TABLE #ClientesTemporarios (
Nome VARCHAR(100),
Cidade VARCHAR(50)
);
INSERT INTO #ClientesTemporarios
SELECT Nome, Cidade
FROM Clientes
WHERE Estado = 'SP';
SELECT * FROM #ClientesTemporarios;
Tipo | Prefixo | Escopo | Visível para outras sessões? | Exemplo |
Tabela temporária local | # | Sessão atual (conexão) | ❌ Não | CREATE TABLE #Temp |
Tabela temporária global | ## | Todas as sessões (até encerrar a última que usa) | ✅ Sim | CREATE TABLE ##TempGlobal |