top of page
  • Foto do escritorFábio Henrique

Do zero a iniciante - Banco de dados instruções SQL

Chegou a hora da prática! Neste post irei utilizar o SQL Server Management Studio (SSMS) para mostrar como criar um banco de dados, tabelas, relacionamentos etc.


Os comandos usados para manipular o banco de dados são chamados de Query SQL ou Script SQL


A linguagem SQL é case insensitive, ou seja, não diferencia maiúsculo de minúsculo


Hands On


Abra o SSMS e preencha os campos conforme a imagem abaixo. Ao colocar " . " no campo Server name estamos dizendo que o servidor é o nosso computador.



Após conectar no SQL Server, clique em New Query.




Agora vamos criar um banco de dados que irá simular uma escola. Abaixo irei descrever algumas regras de negócio dessa escola fictícia.


  • A escola têm professores dando aula nos turnos da manhã, tarde e noite.

  • Os professores podem dar aula em mais de um turno.

  • Um mesmo professor leciona apenas uma matéria

  • Um aluno pode assistir aulas em apenas um turno

  • Um aluno é aprovado em determinada matéria quando este possui 60pts ou mais


Criando o banco


Execute o comando abaixo para criar o banco

CREATE DATABASE ninjaDevSchool

Veja que o banco foi criado com sucesso



Criando as tabelas


Vamos agora criar as tabelas com seus respectivos relacionamentos.


Execute a query SQL abaixo para selecionar o banco que acabamos de criar

use ninjaDevSchool

A query abaixo irá criar a tabela que armazenará as matérias. Observe que o comando SQL é bem simples e auto descritivo. Temos dois campos nesta tabela, MateriaId que é a PK e o campo Nome que irá armazenar o nome de uma matéria qualquer.


  • A palavra reservada INT indica que somente números inteiros podem ser salvos nesta coluna

  • INDENTITY(1,1) indica que o campo é auto incremental, ou seja, ele será gerenciado pelo próprio banco de dados. Os números entre parênteses indicam que o banco irá contar a partir do número 1 e que será incrementado +1 a cada novo registro salvo na tabela.

  • Campos marcados com NOT NULL sempre devem possuir algum valor

  • PRIMARY KEY informa que o campo é chave primária (PK)

  • A palavra reservada VARCHAR indica que será salvo texto nesta coluna e o número 50 é a quantidade máxima de caracteres permitidos, altere-os de acordo com sua necessidade.


CREATE TABLE Materia (
    MateriaId INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    Nome VARCHAR(50)
)

Cria a tabela que irá armazenar os turnos das aulas


CREATE TABLE Turno(
    TurnoId INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    Nome VARCHAR(50)
)

Cria a tabela que irá armazenar dados sobre os professores.


  • A palavra reservada FOREIGN KEY informa que o campo é chave estrangeira (FK)

  • REFERENCES <nome_da_tabela>(<nome_do_campo_chave_primária>) é como informamos a chave primária relacionada a chave estrangeira.

CREATE TABLE Professor
(
    ProfessorId INT IDENTITY(1,1NOT NULL PRIMARY KEY,
    Nome VARCHAR(150),
    MateriaId INT NOT NULL FOREIGN KEY REFERENCES Materia(MateriaId)
)

Foi dito que um professor pode dar aula e mais de um turno. Isso justifica a criação da tabela abaixo, que representa um relacionamento N:N entre professor e turno.

CREATE TABLE Professor_Turno
(
    ProfessorTurnoId INT IDENTITY(1,1NOT NULL PRIMARY KEY,
    ProfessorId INT NOT NULL FOREIGN KEY          REFERENCES Professor(ProfessorId),
    TurnoId INT NOT NULL FOREIGN KEY REFERENCES Turno(TurnoId)
)

Esta tabela armazena dados sobre os alunos

CREATE TABLE Aluno
(
    AlunoId INT IDENTITY(1,1NOT NULL PRIMARY KEY,
    Nome VARCHAR(150),
    TurnoId INT NOT NULL FOREIGN KEY REFERENCES Turno(TurnoId)
)

Esta tabela armazena dados sobre as matérias que um aluno cursa

CREATE TABLE Aluno_Materia
(
    AlunoMateriaId INT IDENTITY(1,1NOT NULL PRIMARY KEY,
    AlunoId INT NOT NULL FOREIGN KEY REFERENCES Aluno(AlunoId),
    MateriaId INT NOT NULL FOREIGN KEY REFERENCES Materia(MateriaId),
    Pontuacao INT NOT NULL
)

Através do SSMS é possível ver que as tabelas bem como seus relacionamentos foram criados corretamente


Inserindo registros


É possível escrever o script SQL de INSERT de duas formas. A primeira forma especifica os nomes das colunas e os valores a serem inseridos:

INSERT INTO NOME_DA_TABELA (coluna1, coluna2, coluna3, ...)
VALUES (valor1, valor2, valor3, ...)

A segunda forma é usada quando queremos adicionar valores para todas as colunas da tabela. Neste caso não precisamos especificar os nomes das colunas mas temos que garantir que a ordem dos valores estão na mesma ordem das colunas da tabela.

INSERT INTO NOME_DA_TABELA
VALUES (valor1, valor2, valor3, ...)

Use a declaração abaixo para inserir múltiplos registros de uma vez só em uma tabela.

INSERT INTO NOME_DA_TABELA
VALUES 
(valor1, valor2, valor3, ...(outro_valor1, outro_valor2, outro_valor3, ...)

Execute as queries SQL abaixo para criar registros nas tabelas que criamos acima

INSERT INTO Materia (Nome)
VALUES 
('Português'),
('Matemática')

INSERT INTO Turno (Nome)
VALUES 
('Manhã'),
('Tarde'),
('Noite')

INSERT INTO Professor (Nome, MateriaId)
VALUES
('Fabio'2),
('Helen'1)

INSERT INTO Professor_Turno (ProfessorId, TurnoId)
VALUES 
(11),
(21)

INSERT INTO Aluno (Nome, TurnoId)
VALUES
('Edinei'1),
('Anton'1)

INSERT INTO Aluno_Materia (AlunoId, MateriaId, Pontuacao)
VALUES
(1115),
(2120),
(1230),
(2230)

Repare que nos scripts de INSERT não foi definido valor para as PK's isto se deve ao fato de que todas elas foram definidas com IDENTITY(1,1) e como foi dito acima isto faz com que o banco gerencie a criação das PK's


Buscando registros


O SQL abaixo retorna todos os dados de uma tabela

 SELECT * FROM Nome_Da_Tabela

O exemplo abaixo retorna todos os alunos do banco


O asterisco ( * ) diz ao SQL para retornar dados de todas as colunas das tabelas envolvidas na query


Para retornar dados de colunas específicas basta informá-las na sua query SQL na ordem que desejar

SELECT Coluna1, Coluna2, ... FROM Nome_Da_Tabela

No print acima é possível observar que ao retornar os alunos temos o Id do turno, porém uma pessoa que veja este resultado não saberá o que o mesmo significa. É ai que a palavra reservada JOIN entra em ação. Através dela podemos retornar dados de mais de uma tabela em uma mesma query.


A query abaixo retorna dados dos alunos e dos turno em que eles estudam

SELECT 
    
FROM 
    Aluno
JOIN 
    Turno ON Aluno.TurnoId = Turno.TurnoId


Vamos entender a query acima. A palavra reservada JOIN foi usada para fosse possível relacionar as informações de alunos e turnos. Esta relação é feita através da comparação entre a PK da tabela Turno (Turno.TurnoId) e a FK da tabela Aluno (Aluno.TurnoId). Esta comparação é feita após a palavra reservada ON


No resultado da query acima é possível ver que foram retornados dados tanto da tabela de aluno quanto da tabela de turno. Com certeza o resultado é válido, mas vamos supor que você precise exportar estes dados para mostrar a diretoria da escola quais alunos estão em quais turnos. Neste caso a query abaixo é muito mais adequada.

SELECT 
 a.Nome Aluno,
 t.Nome Turno
FROM 
    Aluno a
JOIN 
    Turno t ON a.TurnoId = t.TurnoId


Repare que agora o resultado da query acima está mais compreensível a qualquer pessoa. No SQL existe um recurso chamado Alias que funciona como se fossem apelidos para as tabelas e colunas em uma dada query.


Os elementos grifados no print acima são Alias. É muito comum utilizá-los em clausulas JOIN pois assim não precisamos escrever o nome das tabelas várias vezes nas clausulas ON. No caso acima Aluno.TurnoId foi substituído por a.TurnoId e Turno.TurnoId por t.TurnoId. Os Alias das colunas na clausula SELECT também fazem todo sentido afinal as duas colunas retornadas tem o mesmo nome porém representam dados de tabelas diferentes. Um Alias pode ter o nome que você quiser, contudo sempre escolha nomes que façam sentido na query que está fazendo.


Use a clausula ORDER BY para ordenar o resultado de suas consultas. A ordenação pode ser feita usando mais de uma coluna e também pode ser ascendente ou descendente

SELECT 
 a.Nome Aluno,
 t.Nome Turno
FROM 
    Aluno a
JOIN 
    Turno t ON a.TurnoId = t.TurnoId
ORDER BY a.Nome

Use a clausula WHERE para retornar registros de acordo com um critério específico

SELECT 
 a.Nome Aluno,
 t.Nome Turno
FROM 
    Aluno a
JOIN 
    Turno t ON a.TurnoId = t.TurnoId
WHERE 
 a.Nome = 'Edinei'
ORDER BY a.Nome

Para criar mais filtros na clausula WHERE use as palavras reservadas AND e OR

SELECT 
 a.Nome Aluno,
 t.Nome Turno,
 m.Nome Materia,
 am.Pontuacao
FROM 
    Aluno a
JOIN 
    Turno t ON t.TurnoId = a.TurnoId
JOIN
    Aluno_Materia am ON am.AlunoId = a.AlunoId
JOIN
    Materia m ON m.MateriaId = am.MateriaId
WHERE 
    (m.Nome = 'Matemática' OR m.Nome = 'Português')
 AND
 am.Pontuacao > 15
ORDER BY a.Nome


A query acima retorna todos os alunos, ordenados por nome, que cursam matemática ou (OR) português e (AND) que possuem pontuação acima de 15 nestas matérias.


Atualizando registros


A clausula UPDATE permite atualizar dados nas tabelas do banco

UPDATE 
    nome_da_tabela
SET 
    coluna1 = valor1, 
    coluna2 = valor2, ...
WHERE 
    condicao

A query abaixo atualiza o nome do aluno Anton

UPDATE 
    Aluno
SET 
    Nome = 'Anton Azarov'
WHERE 
    AlunoId = 2

A query abaixo atualiza o turno do aluno Edinei

UPDATE 
    Aluno
SET 
    TurnoId = 2
WHERE 
    AlunoId = 1


Veja que os dados foram atualizados corretamente


Tome extremo cuidado ao criar scripts de update, pois se você errar poderá comprometer seriamente a integridade dos dados.


Deletando registros


A clausula DELETE permite excluir registros do banco

DELETE FROM nome_da_tabela 
WHERE condicao

A query abaixo exclui a matéria português para o Aluno Edinei

DELETE FROM Aluno_Materia
WHERE AlunoId = 1 AND MateriaId = 1

 

Observações


O que foi apresentado aqui é o básico para você começar a caminhar sozinho. Caso queria conhecer mais comandos SQL acesse o site W3Schools, lá você encontrará um material bem sucinto sobre o assunto.


Assim se encerra a série Do zero a iniciante se você acompanhou todos os posts até aqui meus parabéns! Tudo que foi passado aqui lhe dará uma boa base para começar sua jornada como programador.


Não se contente somente com a teoria. Pratique! Teste! Cometa erros! Esta é a melhor forma de fixar o conhecimento.



 

Deixe seus elogios, críticas e dúvidas nos comentários!

280 visualizações1 comentário

Posts recentes

Ver tudo

1 Comment


dloveis
Aug 04, 2021

Olá, gostaria de falar com você. 31 983 704185 Damaris

Like
bottom of page