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,1) NOT 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,1) NOT 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,1) NOT 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,1) NOT 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
(1, 1),
(2, 1)
INSERT INTO Aluno (Nome, TurnoId)
VALUES
('Edinei', 1),
('Anton', 1)
INSERT INTO Aluno_Materia (AlunoId, MateriaId, Pontuacao)
VALUES
(1, 1, 15),
(2, 1, 20),
(1, 2, 30),
(2, 2, 30)
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.
Olá, gostaria de falar com você. 31 983 704185 Damaris