Os comandos SQL essenciais
Definição
SQL é a sigla para “Standard Query Language”, que significa, traduzindo para o português,“Linguagem de Consulta Estruturada”. Trata-se de uma linguagem de consulta a banco de dados relacionais.
Com o SQL, você pode executar vários comandos para gerenciar, criar, alterar, consultar informações no banco de dados.
Costumamos dizer que bancos SQL seguem uma modelagem relacional, pois estes se baseiam no fato de que todos seus dados sejam armazenados em tabelas que podem se relacionar entre si.
A linguagem SQL é utilizada de maneira relativamente parecida entre os principais bancos de dados relacionais do mercado: MySQL, MariaDB, PostgreSQL, Microsoft SQL Server, Oracle, SQLite, entre muitos outros.
Atributos e tipos de dados
-
CHAR
Caracteres string de tamanho fixo -
VARCHAR
Caracteres string de tamanha variável -
TEXT
Armazena texto (não deve ser do tipo NOT NULL). -
INT
Números inteiros. -
FLOAT
,DOUBLE
Números fracionários (ponto flutuante). -
DATE
Data, por padrão é ano-mês-dia. -
AUTO_INCREMENT
Indica que valor do campo será incrementado automaticamente a cada nova linha ou a partir de um númeroCREATE TABLE contatos AUTO_INCREMENT=100;
. -
ENUM
Deve escolher um dos valores, se escolher um valor que não existe no ENUM gera um erro, usa muito em select.
Constraint (restrições)
PRIMARY KEY
(PK)
A primary key identifica de forma única cada registro em uma tabela do banco de dados.
- Deve conter valor único, ou seja, não pode repetir.
- Na coluna de chave primaria não pode haver valor nulo.
- Só 1 primary key é permitido, não pode ter outra primary key.
Existem 2 tipos de primary key:
- Surrogate Key ⇒ Valor sintético criado apenas para identificar uma linha → não tem relação com o valor em si, é só um identificador mesmo.
- Natural key ⇒ Identificador único, como por exemplo um CPF, porém é complexo para mudar depois.
-
FOREIGN KEY
(FK) Chave que referência outra coluna em outra tabela (geralmente a primary key da outra tabela) -
UNIQUE KEY
Chave única, não pode repetir os valores. -
NOT NULL
Indica que o atributo não pode ser nulo.
DDL - Linguagem de Definição de Dados
Data Definition Language
Permite a criação e alteração de dados. Exemplos de comandos:
Objetos são tabelas, index, funções, views, store procedure e triggers.
CREATE
É utilizado para criar banco de dados ou objetos.ALTER
É utilizado para deletar objetos de um banco de dados.DROP
É utilizado para alterar a estrutura de uma banco de dados.TRUNCATE
É utilizado para remover todos os registros de uma tabela, incluindo todos os espaços alocados para os registros serem removidos, nenhuma TRIGGER é disparada.
CREATE
O comando CREATE
é utilizado para criar tabelas e bases de dados.
Banco de dados:
CREATE DATABASE nome_database
Tabela:
CREATE TABLE nome_tabela
Podemos complementar o nosso código com a sintaxe opcional IF NOT EXISTS
, que permite ao MySQL verificar se o nome escolhido esteja sendo utilizando no servidor.
Banco de dados:
CREATE DATABASE IF NOT EXISTS nome_tabela;
Tabela:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
Criaremos então uma tabela chamada users
com algumas colunas.
--@block
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
email VARCHAR(255) NOT NULL UNIQUE,
country CHAR(2),
PRIMARY KEY (id)
);
Podemos utilizar o CREATE TABLE IF NOT EXISTS
, no primeiro bloco não irá criar pois já existe uma tabela com esse nome, já no segundo bloco irá criar uma nova tabela.
--@block
CREATE TABLE IF NOT EXISTS users (
email VARCHAR(255) NOT NULL UNIQUE
);
--@block
CREATE TABLE IF NOT EXISTS users_test (
email VARCHAR(255) NOT NULL UNIQUE
);
DROP
Use DROP
para excluir tabelas e bases de dados.
Excluir banco de dados:
DROP DATABASE nome_database;
Excluir tabela:
DROP TABLE nome_tabela;
--@block
DROP TABLE users_test;
ALTER
Comando ALTER
é utilizado para modificar a estrutura da tabela.
ADD
Neste exemplo iremos adicionar duas colunas, uma que cria a data e hora atual automaticamente quando adiciona novos dados e outra que faz a mesma coisa, porém atualiza-se quando se altera um dado.
--@block
ALTER TABLE users ADD created_at DATETIME DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE users ADD updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
Observação: Caso não gere a data atual, na consulta troque o CURRENT_TIMESTAMP
por NOW()
DML - Linguagem de Manipulação de Dados
Data Manipulation Language
São comandos que permitem a manipulação de registros numa tabela do banco de dados, como exclusão, inclusão e alterações.
INSERT
Permite adicionar dados em uma tabela.UPDATE
Permite atualizar dados existentes em uma tabela.DELETE
Permite apagar dados de uma tabela.
INSERT
Na linguagem SQL, podemos utilizar o comando INSERT para inserir dados em uma tabela.
INSERT INTO nome_tabela (campos) VALUES (valores)
Observação: Números não precisam de aspas.
Única linha
--@block
INSERT INTO users (email, country)
VALUES ('hello1@email.com', 'US');
Múltiplas linhas
--@block
INSERT INTO users (email, country)
VALUES
('hello2@email.com', 'BR'),
('hello3@email.com', 'AR'),
('hello4@email.com', 'FR'),
('hello5@email.com', 'BR'),
('hello6@email.com', 'US');
UPDATE
O comando UPDATE atualiza dados de uma tabela.
UPDATE nome_tabela SET nome_coluna = "valor" WHERE nome_coluna = "valor"
--@block
UPDATE users SET country = 'BR' WHERE id = 3;
DELETE
Comando para deletar dados em tabelas.
DELETE FROM nome_tabela WHERE nome_coluna = "valor"
--@block
DELETE FROM users WHERE id = 4;
DQL - Linguagem de Consulta de Dados
Data Query Language
O Objetivo do DQL é retornar dados da tabela do banco de dados com base nas consultas.
O comando SELECT
é utilizado para ler dados de tabelas.
As buscas podem ser melhoradas com cláusulas:
SELECT * FROM nome_tabela
Neste caso realiza uma busca por todos os dados *
da FROM
tabela chamada users
.
Você poderia especificar colunas que deseja fazer a seleção, alterando o *
pelo nome da coluna.
SELECT nome_coluna FROM nome_tabela
Ainda há outras cláusulas:
WHERE
Indica as condiçõesGROUP BY
Realiza agrupamentosORDER BY
Ordena os dados de maneira decrescenteDESC
ou crescenteASC
Ainda podemos combinar buscas com operadores lógicos.
AND
Avalia se duas condições são verdadeirasOR
Avalia se uma condição é verdadeiraNOT
Negação
Operadores relacionais permitem fazer comparações nas consultas:
<
Menor>
Maior<=
Menor ou igual>=
Maior ou igual=
Igual<>
Diferente
No final da consulta podemos limitar a quantidade de resultados.
LIMIT
Limitar resultados
SELECT
Na linguagem SQL, podemos utilizar o comando SELECT para ler dados de tabelas.
SELECT * FROM users;
Obtemos o seguinte resultado:
Nota-se que os registros foram criados com os seus devidos valores, o registro de id
1 foi alterado, o valor da coluna country
e também o valor da coluna updated_at
de maneira automática. O registro de id
igual a 4 foi deletado.
Podemos realizar buscas mais especificas combinando as várias cláusulas existentes:
--@block
SELECT id, email, country FROM users
WHERE country = 'BR'
OR id > 2
ORDER BY id ASC
LIMIT 2;
--@block
SELECT id, email, country FROM users
WHERE country = 'US'
AND email LIKE 'hello%'
ORDER BY id DESC
LIMIT 2;
Resultado do primeiro bloco:
Resultado do segundo bloco:
JOINs
O JOIN
é utilizado para selecionar registros de mais de uma tabela em um único SELECT
, tabelas essas que devem ser ligadas por pelo menos um campo em comum, através de uma FOREIGN KEY
.
Portanto, para utilizarmos o JOIN
devemos primeiramente criar uma nova tabela com uma FOREIGN KEY
que faça referência a PRIMARY KEY
da outra tabela.
--@block
CREATE TABLE cars(
id INT AUTO_INCREMENT,
model VARCHAR(255),
price DOUBLE NOT NULL,
owner_id INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (owner_id) REFERENCES users(id)
);
E então iremos adicionar dados nesta tabela.
--@block
INSERT INTO cars (owner_id, model, price)
VALUES
(1, 'fiat uno', 12000.78),
(1, 'ford escort', 15000),
(2, 'honda civic', 17092.54),
(3, 'audi a3', 25000);
Vale ressaltar que neste exemplo nem todos os usuários estão ligados a um carro mas um carro está sempre ligada a um usuário, ou seja, é uma relação de 1 para muitos.
INNER JOIN
Basicamente irá mostrar os registros que tem valores em comuns, no caso do exemplo é a PRIMARY KEY
do users
com a FOREIGN KEY
do cars
.
--@block
SELECT * FROM users
INNER JOIN cars
ON cars.owner_id = users.id;
Obtendo assim o seguinte resultado:
Vale a pena ressaltar que caso não queremos obter valores repetidos por algum motivo, por exemplo o email
, deveríamos então no final da consulta adicionar GROUP BY email;
.
Também é possível utilizar junto com as outras clausulas da DQL, aliado a isso eu utilizei o AS
, que cria uma espécie de apelido temporário para uma tabela, neste exemplo renomeei users
para u
e cars
para c
.
--@block
SELECT
u.id,
c.owner_id,
u.email,
c.model
FROM users AS u
INNER JOIN cars as c ON c.owner_id = u.id
WHERE u.created_at > '2021-05-21';
Obtendo assim o seguinte resultado:
LEFT JOIN
O LEFT JOIN
seleciona todos os registros da tabela a esquerda users
e os registros em comuns das duas tabelas.
--@block
SELECT * FROM users
LEFT JOIN cars
ON cars.owner_id = users.id;
Portanto irá retornar todos os registros da esquerda e os que tem relação com a tabela da direita.
RIGHT JOIN
O RIGHT JOIN
seleciona todos os registros da tabela a direita cars
e os registros em comuns das duas tabelas.
--@block
SELECT * FROM users
RIGHT JOIN cars
ON cars.owner_id = users.id;
Neste caso irá retornar apenas as linhas que tem valores comuns, já que a tabela cars
não tem dados que não seja vinculado a tabela users
, porque um dos valores inseridos nessa tabela é o owner_id
, que referência o id de users
e tem o atributo UNIQUE KEY
. A final toda casa tem um dono.
Portanto o resultado é semelhante ao LEFT JOIN
, a única diferença é que nesta consulta não irá retornar o registro de id
igual a 5 e 6.
FULL OUTER JOIN
--@block
SELECT * FROM users
FULL OUTER JOIN cars
ON cars.owner_id = users.id;
Vale ressaltar que alguns bancos de dados como o MySQL não existe o comando FULL OUTER JOIN
, nesse caso devemos utilizar a união UNION
do LEFT JOIN
e RIGHT JOIN
.
--@block
SELECT * FROM users
LEFT JOIN cars
ON cars.owner_id = users.id
UNION
SELECT * FROM users
RIGHT JOIN cars
ON cars.owner_id = users.id;
O resultado desta consulta será o mesmo da seção LEFT JOIN
.
Extra - Comandos no terminal
Mostrar os bancos de dados:
show databases;
Entrar no banco de dados:
use name_database;
Mostrar tabelas do banco de dado:
show tables;
Visualizar estrutura da tabela:
describe name_table;
Criar uma cópia do banco de dados (dump):
mysqldump -u root -p database_name > database_name.sql;
Criar uma cópia somente da estrutura da base de dados:
mysqldump -u root -p database_name --no-data > database_name.sql;
Criar uma cópia de todos os bancos de de dados:
mysqldump -u user -p --all-databases > full_path_to\file.sql
Importar banco de dados:
mysql -u root -p database_name < database_name.sql;