Bancos de dados podem ser complicados de entender. No entanto, eles são essenciais para a programação de pilha completa e para a criação de serviços de back-end que armazenam dados.
Neste post, estarei desmistificando SQL, bancos de dados e sistemas de gerenciamento de banco de dados relacional. Também usarei algumas analogias com o Mundo Mágico, incluindo o próprio Harry Potter e algumas das aulas que ele faz em Hogwarts.
Antes de mergulharmos nos termos-chave, vamos definir o que é um banco de dados em si:
Um banco de dados é um conjunto estruturado de dados mantidos em um computador, especialmente um que é acessível de várias maneiras. É essencialmente um conjunto organizado de dados em um computador, que pode ser acessado eletronicamente a partir de um sistema de computador.
Termos-chave
Abaixo estão alguns termos-chave com os quais começaremos:
- RDMS: Sistemas de Gerenciamento de Banco de Dados Relacional. Essa estrutura para bancos de dados é a base do MySQL.
- SQL: Linguagem de consulta estruturada.
- Tabelas: Objetos de banco de dados que transportam dados. Um exemplo de nome de tabela é "Alunos" ou "Professores" ou "Cursos".
- Campos: Os valores de uma tabela são conhecidos como campos. Campos de exemplo para Alunos seriam "Nome", "Sobrenome" e "GPA".
- Registro/Linha: Uma entrada individual na tabela.
Após adicionar Professores e Cursos ao banco de dados, podemos ter tabelas para Alunos, Professores e Cursos.
À medida que avançamos no guia, usaremos apenas os Alunos exemplo aqui como referência. Se você teve a sorte de ser contratado como Engenheiro de Software em Hogwarts, seu banco de dados pode fazer bom uso de alguns desses comandos :D
Instruções SQL
Sintaxe
O ponto e vírgula é a maneira padrão de separar uma instrução SQL de outra. Ele permite que várias instruções SQL sejam executadas na mesma chamada. Neste guia, teremos um ponto e vírgula no final de cada declaração.
Os comandos SQL mais importantes
Criar :cria uma nova tabela SQL.
Se estivéssemos criando o banco de dados de alunos para a Escola de Hogwarts, por exemplo, usaríamos CREATE fazer uma tabela chamada "Alunos".
- Sintaxe
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
....
);
- Exemplo
CREATE TABLE Students
(first_name VARCHAR(255),
last_name VARCHAR(255),
login VARCHAR(255),
age INTEGER,
gpa REAL,
house VARCHAR(255));
Soltar :Exclui uma tabela. Tenha muito cuidado ao usar este comando, pois isso apagará todos os dados da tabela!
Se quisermos excluir todo o banco de dados do aluno, usaremos DROP para realizar essa ação.
- Sintaxe
DROP TABLE table_name;
- Exemplo
DROP TABLE Students;
Inserir :Adiciona novas linhas de dados a uma tabela.
Usaríamos INSERIR para adicionar novos alunos à medida que se matriculam em Hogwarts.
- Sintaxe
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
- Exemplo
INSERT
INTO Students(first_name, last_name, login, age, gpa, house)
VALUES
('Harry', 'Potter', 'theboywholived', 15, 4.0, 'Gryffindor'),
('Hermionie', 'Granger','granger2', 15, 4.5, 'Gryffindor'),
('Ron', 'Weasley','weasley7', 15, 3.7, 'Gryffindor'),
('Draco', 'Malfoy', 'malfoy999', 15, 4.0, 'Slytherin'),
('Cedric', 'Diggory','diggory123', 15, 4.0, 'Hufflepuff');
Selecionar :Usado para buscar dados em um banco de dados para serem retornados em formato de tabela.
Se quiséssemos recuperar todos os nomes dos alunos que estão na casa da Grifinória, usaríamos o SELECT comando. O exemplo abaixo consulta a tabela Estudantes pelo nome e sobrenome de cada aluno no banco de dados, que para nós são apenas as cinco linhas descritas acima.
- Sintaxe
SELECT column1, column2, ...
FROM table_name;
- Exemplo
SELECT first_name, last_name FROM Students;
first_name | last_name |
---|---|
Harry | Potter |
Hermione | Granger |
Rony | Weasley |
Draco | Malfoy |
Cedrico | Diggory |
Alternativamente, se quisermos selecionar todos os campos da tabela, nosso comando utilizará a sintaxe "*", que significa selecionar todos os campos:
SELECT * FROM Students;
first_name | last_name | entrar | idade | gpa | casa |
---|---|---|---|---|---|
Harry | Potter | o meninoqueviveu | 15 | 4 | Grifinória |
Hermione | Granger | granger2 | 15 | 4.5 | Grifinória |
Rony | Weasley | weasley7 | 15 | 3.7 | Grifinória |
Draco | Malfoy | malfoy999 | 15 | 4 | Slytherin |
Cedrico | Diggory | diggory123 | 15 | 4 | Lufa-Lufa |
Cláusulas
Uma cláusula é um pedaço lógico de uma instrução SQL e é (em teoria) um campo opcional.
Na declaração acima, simplesmente retornamos todos os campos do banco de dados do Aluno. Não especificamos uma condição para os valores retornados.
E se não quiséssemos consultar todos os alunos, mas apenas aqueles cuja casa é a Grifinória? Que tal perguntar aos alunos cujo primeiro nome começa com "H", ou alunos da Lufa-Lufa e da Sonserina? Esses casos mais complexos são resolvidos por cláusulas SQL.
Abaixo está uma visão geral das cláusulas mais comuns, mas há várias outras cláusulas na linguagem SQL. Aqui está uma boa visão geral, se você quiser mais informações.
Exemplos de cláusulas
Onde: Usado para declarar uma condição ao buscar dados de um banco de dados. Voltando ao exemplo com Select, teríamos que usar WHERE para especificar a casa como Grifinória.
- Sintaxe
SELECT column1, column2, ...
FROM table_name
WHERE condition;
- Exemplo
SELECT * FROM Students
WHERE house='Gryffindor';
first_name | last_name | entrar | idade | gpa | casa |
---|---|---|---|---|---|
Harry | Potter | o meninoqueviveu | 15 | 4 | Grifinória |
Hermione | Granger | granger2 | 15 | 4.5 | Grifinória |
Rony | Weasley | weasley7 | 15 | 3.7 | Grifinória |
E Usado para combinar várias cláusulas em uma instrução SQL, em que todas as condições separadas por AND são verdadeiras. Usaríamos AND para obter alunos da Grifinória que tenham um GPA acima de 3,8.
- Sintaxe
SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 AND condition3 ...;
- Exemplo
SELECT * FROM Students
WHERE house='Gryffindor' AND gpa>3.8;
first_name | last_name | entrar | idade | gpa | casa |
---|---|---|---|---|---|
Harry | Potter | o meninoqueviveu | 15 | 4 | Grifinória |
Hermione | Granger | granger2 | 15 | 4.5 | Grifinória |
Ou :Semelhante a AND, mas retorna apenas dados em que apenas UMA das condições separadas pelo OR são verdadeiras. Se quiséssemos recuperar alunos da Lufa-Lufa e da Sonserina, mas não de ambos, usaríamos o comando OR.
- Sintaxe
SELECT column1, column2, ...
FROM table_name
WHERE condition1 OR condition2 OR condition3 ...;
- Exemplo
SELECT * FROM Students
WHERE house='Slytherin' OR house='Hufflepuff';
first_name | last_name | entrar | idade | gpa | casa |
---|---|---|---|---|---|
Draco | Malfoy | malfoy999 | 15 | 4 | Slytherin |
Cedrico | Diggory | diggory123 | 15 | 4 | Lufa-Lufa |
Gosto: Usado com WHERE para procurar um padrão específico. Se quiséssemos apenas o nome e sobrenome de bruxos/bruxas com nomes começando com "H", poderíamos utilizar o comando Like.
- Sintaxe
SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;
- Exemplo
SELECT first_name, last_name FROM Students
WHERE first_name LIKE 'H%';
first_name | last_name |
---|---|
Harry | Potter |
Hermione | Granger |
Contagem: Usado para encontrar a contagem de uma coluna (ou colunas) em uma tabela.
- Sintaxe
SELECT COUNT(column_name)
FROM table_name
WHERE condition;
- Exemplo
SELECT COUNT(first_name) FROM Students;
COUNT(first_name) |
---|
5 |
Dois outros comandos que usam a mesma sintaxe são AVG e SUM. AVG calculará a média de todos os valores e sum calculará a soma de todos os valores.
Selecionar limite: Usado para cortar respostas a apenas uma quantidade especificada. A forma como as principais respostas são escolhidas é por ordem de inserção cronológica no banco de dados.
- Sintaxe
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;
- Exemplo
SELECT * FROM Students LIMIT 3;
first_name | last_name | entrar | idade | gpa | casa |
---|---|---|---|---|---|
Harry | Potter | o meninoqueviveu | 15 | 4 | Grifinória |
Hermione | Granger | granger2 | 15 | 4.5 | Grifinória |
Rony | Weasley | weasley7 | 15 | 3.7 | Grifinória |
Outros comandos úteis
Ordenar por: Classifica os resultados em ordem crescente ou decrescente.
- Sintaxe
SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
- Exemplo
SELECT * FROM Students ORDER BY first_name;
first_name | last_name | entrar | idade | gpa | casa |
---|---|---|---|---|---|
Cedrico | Diggory | diggory123 | 15 | 4 | Lufa-Lufa |
Draco | Malfoy | malfoy999 | 15 | 4 | Slytherin |
Harry | Potter | o meninoqueviveu | 15 | 4 | Grifinória |
Hermione | Granger | granger2 | 15 | 4.5 | Grifinória |
Rony | Weasley | weasley7 | 15 | 3.7 | Grifinória |
Agrupar por: Agrupa categorias que têm os mesmos valores em linhas. Se você quiser saber o número de alunos em cada casa (3 na Grifinória, por exemplo), você pode utilizar o comando Agrupar por.
- Sintaxe
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
- Exemplo
SELECT COUNT(first_name), house FROM Students GROUP BY house;
COUNT(first_name) | casa |
---|---|
3 | Grifinória |
1 | Lufa-Lufa |
1 | Slytherin |
Finalmente, aqui está um DB Fiddle que mostra todos os comandos acima em ação!
Bancos de dados normalizados vs desnormalizados
Ao projetar um banco de dados, existem dois padrões de projeto principais que você pode seguir, cada um com suas próprias compensações.
Normalizado: Otimiza para minimizar a redundância, não para o tempo de leitura.
Digamos que tenhamos uma tabela de cursos que tenha uma ID de professor para o professor que ministra esse curso. Também temos um banco de dados de professores que tem o nome do professor.
Quando queremos obter os nomes dos professores que ministram um determinado curso, teremos que consultar as tabelas Cursos e Professores, pois a tabela do curso não possui o nome do professor (eficiente, mas redundante).
Desnormalizado: Otimiza para tempo de leitura , não para minimizar a redundância.
Digamos que temos uma tabela de cursos que tem um ID de professor E um nome de professor. Temos um banco de dados de professores que também tem o nome do professor. Quando queremos obter os nomes dos professores do curso, basta usar a tabela do curso (redundante, mas eficiente).
Integridade dos dados
É vital para os usuários que os dados com os quais interagem sejam seguros, corretos e sensatos. Os exemplos são garantir que a idade não seja um número negativo ou que dois alunos não tenham a mesma informação. Nós nos referimos a isso como integridade de dados.
A integridade dos dados assume várias formas e pode ser dividida em quatro categorias:
- Integridade da entidade :Não existem linhas duplicadas em uma tabela. Por exemplo, não podemos inserir Ron Weasley duas vezes no banco de dados.
- Integridade do domínio :Restringir o tipo de valores que se pode inserir para impor valores corretos. Por exemplo, uma Casa só pode ser Grifinória, Corvinal, Sonserina ou Lufa-Lufa.
- Integridade referencial :os registros usados por outros registros não podem ser excluídos. Um professor não pode ser excluído se estiver ministrando um curso no momento.
- Integridade definida pelo usuário: Uma categoria "outras" que consiste em lógica e regras relacionadas aos negócios para o banco de dados.
Bancos de dados SQL comuns
- Oráculo :Muito estável e maduro, mas pode ser caro
- MySQL :Leve e rápido de configurar, mas não tão maduro quanto o Oracle
- PostgreSQL :Bom para certos casos de uso, mas não super rápido
Recursos
- SWEPrep - Perguntas da entrevista diretamente na sua caixa de entrada
- SQL e bancos de dados do freeCodeCamp
- Código limpo
- Java eficaz
- Documentação do Oracle
- Documentação do MySQL
- Documentação do PostgreSQL
Manter-se atualizado
- Tópicos do Reddit :Ótimos tópicos sobre bancos de dados, SQL e novas tecnologias
- Notícias sobre hackers: Excelente recurso para ficar por dentro dos últimos desenvolvimentos do setor de tecnologia
- CodePen: Um excelente recurso para descobrir boas práticas de SQL.