MySQL - Iniciante

Aula 10 a 11 - Rodando primeiro comando / Usuários
Podemos consultar os bancos de dados disponíveis na instancia do MySQL com o comando show databases.
Podemos criar usuários no ambiente gráfico do MySQL através da opção Administration -> Management -> Users and Privileges - Add Account.
Nessa opção podemos criar o usuário e definir em Administrative Roles as opções de acesso do usuário.
Podemos manipular as permissões de usuários através da linha de comando (o exemplo abaixo não funcionou para minha configuração).
grant all privileges on *.* to exemplo@ identified by 'exemplo' with grant option;
ou;
revoke all privileges on *.* from example@localhost;
Aula 12 a 14 - Criando schema / Criando tabela / Unique
Podemos criar um schema que é um novo Banco de Dados através da opção no Workbench ou com o comando:
CREATE SCHEMA nome_do_schema;
ou:
CREATE DATABASE nome_do_schema;
Para apagar um Banco de Dados utilizamos o comando:
DROP SCHEMA(DATABASE) nome_do_schema.
Criado o Database podemos criar as tabelas que é a estrutura para as coleções de dados. Para isso no Workbench basta selecionar a opção Tables dentro do Schema criado. Ao criar uma tabela definimos os campos de acordo com os tipos de dados que iremos utilizar. Um campo de identificação deve ser criado para a Primary Key (chave primária) do banco de dados. Esse campo deve conter valores únicos. Em seguida definimos os demais campos e seu Datatype. Entre as opções que podemos utilizar nos campos temos a Not null (NN) que indica que o camppo é de preenchimento obrigatório. Abaixo uma pequena estrutura para a criação de uma tabela:
CREATE TABLE `curso_mysql`.`clientes` (
`id` INT NOT NULL,
`nome` VARCHAR(45) NOT NULL,
`email` VARCHAR(100) NOT NULL,
PRIMARY KEY (`id`));

CREATE TABLE `curso_mysql`.`produtos` (
`id` INT NOT NULL,
`nome` VARCHAR(100) NOT NULL,
`preco` DOUBLE NOT NULL,
PRIMARY KEY (`id`));
Outra opção para as colunas nas tabelas é a Unique(UQ) que indica que aquele campo não pode ter valores repetidos. Essa opção é semelhante a Primary Key entretanto a segunda além de não poder ser repetida serve também para indexar os dados na coleção ao passo que a primeira apenas não permite a repetição de dados.
O comando para alterar uma tabela e incluir por exemplo a propriedade Unique é o seguinte:
ALTER TABLE `curso_mysql`.`clientes`
ADD UNIQUE INDEX `email_UNIQUE` (`email` ASC) VISIBLE;
Aula 15 - chave estrangeira
Existem no SQL dois tipos de chaves. A Primary Key e a Foreign Key. A Foreign Key é um campo em uma tabela que recebe a referencia de uma Primary Key de outra tabela fazendo uma conexão entre os dados das duas.
Podemos criar uma tabela com um relacionamento por Foreign Key conforme o exemplo abaixo:
CREATE TABLE `curso_mysql`.`pedidos` (
`id` INT NOT NULL,
`produto_id` INT,
`quantidade` INT,
PRIMARY KEY(`id`),
FOREIGN KEY (produto_id) REFERENCES produtos(id));
Aula 16 a 19 - Adicionando colunas / Removendo colunas / Adicionando constraints / Setando e removendo valor padrão
Podemos fazer alterações na tabela como inclusão de colunas. Para isso podemos utilizar o comando ALTER TABLE como a seguir: ALTER TABLE `curso_mysql`.`pedidos` ADD COLUMN total DOUBLE;
Para remover uma coluna da mesma forma utilizamos a seguinte sintaxe: ALTER TABLE `curso_mysql`.`pedidos` DROP COLUMN total; Para modificar as restrições de uma coluna podemos utilizar o comando CONSTRAINT:
ALTER TABLE `curso_mysql`.`clientes` ADD COLUMN cpf VARCHAR(20); Adicionamos uma coluna para CPF e em seguida transformamos ela para UNIQUE:
ALTER TABLE `curso_mysql`.`clientes` ADD CONSTRAINT cpf_unico UNIQUE(cpf);
Podemos alterar os parametros de uma coluna com o comando MODIFY:
ALTER TABLE `curso_mysql`.`clientes` MODIFY cpf VARCHAR(14) NOT NULL;
Para remover uma restrição do tipo UNIQUE de uma coluna utilizamos o DROP no indice criado para a propriedade:
ALTER TABLE `curso_mysql`.`clientes` DROP INDEX cpf_unico;
Note que tanto na criação quanto na remoção da restrição UNIQUE criamos um novo nome para a coluna (cpf_unico, email_UNIQUE). Esse valor na verdade é a chave que será verificada para garantir que o valor seja único e pode ser vista no Workbench na aba indexes
Podemos definir valores padrão para colunas do formulário, para caso o campo não seja preenchido. Para isso utilizamos o comando SET DEFAULT:
ALTER TABLE `curso_mysql`.`pedidos` ALTER COLUMN total SET DEFAULT 0; Onde o valor '0' é o valor que queremos como default. Para remover essa configuração utilizamos:
ALTER TABLE `curso_mysql`.`pedidos` ALTER COLUMN total DROP DEFAULT;
Aula 20 a 22 - Inserindo registros / Alterando registros / Removendo registros
Um dos modos de inserir registros em um Banco de Dados é com o comando INSERT INTO seguindo a estrutura das colunas que se deseja incluir:
INSERT INTO `curso_mysql`.`clientes` (id, nome, email, cpf)
VALUES (1,'Joao da Silva','[email protected]','333.333.333-00');
Para visualizar os dados incluidos utilizamos o comando:
SELECT * FROM `curso_mysql`.`clientes`; Podemos passar os valores sem declarar as colunas caso saibamos a ordem das mesmas:
INSERT INTO `curso_mysql`.`clientes` VALUE (2, 'Mario', '[email protected]','222.222.222-22');
Para alterar registros utilizamos o comando UPDATE. Entretanto devemos tomar alguns cuidados pois se utilizarmos o update sem definir qual registro deve ser atualizado alteramos todos os registros do banco de dados. Para isso devemos definir com o comando WHERE qual a chave ou a condição em que devemos fazer a alteração:
UPDATE `curso_mysql`.`clientes` SET nome='Mario da Silva' WHERE id=2; É possível alterar vários campos por vez:
UPDATE `curso_mysql`.`clientes` SET nome='Mario da Silva Jr',email='[email protected]' WHERE id=2;
Devemos ficar atentos com algumas configurações pois ao tentar selecionar o campo cpf por meio do WHERE tive o seguinte erro:
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
Ou seja, caso o campo cpf não seja do tipo UNIQUE nem PRIMARY KEY há uma proteção para seleções acidentais. No caso o meu campo não estava configurado para UNIQUE.

Para remover registros utilizamos o comando DELETE:
DELETE FROM `curso_mysql`.`clientes` WHERE id=2;
Se não fizermos a seleção com WHERE o comando DELETE apaga todos os registros.
Aula 23 a 25 - Iniciando com select / Alias / Distinct
O comando SELECT é um dos mais utilizados no SQL. Com ele podemos fazer diversas consultas no BD e recuperar dados das mais diversas formas.
Para recuperar todos os dados de uma tabela:
SELECT * FROM nome_da_tabela;
Podemos selecionar apenas algumas colunas:
SELECT nome,email FROM `curso_mysql`.`clientes`;
Podemos criar apelidos para as colunas chamados de alias para facilitar a apresentação e compreensão dos dados. Para isso basta utilizarmos o operador AS:
SELECT id AS código, nome FROM clientes;
Em seguida vamos adicionar mais uma coluna a nossa tabela de clientes:
ALTER TABLE clientes ADD COLUMN uf CHAR(2); E setamos o campo para SP nos ids 1 e 2 e RJ no id 3:
UPDATE clientes SET uf='RJ' WHERE id=3;
O comando DISTINCT complementa o SELECT e retorna apenas os resultados únicos (não faz a soma de ocorrencias):
SELECT DISTINCT uf FROM clientes;
Aula 26 a 28 - Order by / Where / Like
O comando ORDER BY pode ser utilizado para ordenar o resultado da pesquisa com SELECT pela coluna definida. Podemos selecionar a ordem ASC(ascendente) ou DESC(descendente):
SELECT * FROM clientes ORDER BY nome DESC;
Podemos definir mais campos de ordenação separando por uma vírgula.
O WHERE é necessário nos comandos de alteração e remoção, mas também pode ser utilizado em comandos de seleção para determinar quais campos queremos filtrar. É interessante quando estamos trabalhando com SQL seprarmos os comandos de acordo com seu tipo para facilitar a visualização quando estamos criando as querrys:
SELECT * FROM clientes
WHERE uf='SP'
ORDER BY nome DESC;

Vamos inserir alguns produtos para aumentar nossas buscas::
INSERT INTO produtos VALUES(1,'Produto 1', 100);
INSERT INTO produtos VALUES(2,'Produto 2', 150);
INSERT INTO produtos VALUES(3,'Produto 3', 90);
Podemos utilizar operadores de comparação nas pesquisas com WHERE. Importante saber que o comando WHERE deve ser utilizado antes do ORDER BY.
SELECT * FROM produtos
WHERE preco > 90 AND preco < 120
ORDER BY preco ASC;
Vamos inserir mais alguns produtos:
INSERT INTO produtos values(4, 'DELL XPTO', 1000);
INSERT INTO produtos values(5, 'DELL XPTZ', 1100);
INSERT INTO produtos values(6, 'HP XPTO', 2000);
INSERT INTO produtos values(7, 'HP XPTZ', 2100);
INSERT INTO produtos values(8, 'DELL XPTO PLUS', 2100);
O comando LIKE faz o filtro pelo valor do conteudo do campo, podendo utilizar coringas %:
SELECT * FROM produtos
WHERE nome LIKE '%XPT%';
Esse comando, pelos meus testes, não é case sensitive.
Aula 29 a 31 - Funções / Group / Join
O MySQL tem algumas funções que facilitam processos:
COUNT(): conta quantos elementos existem na seleção, podendo ser combinado com outros comandos:
SELECT COUNT(*) FROM produtos
WHERE nome LIKE '%XPT%';
Se utilizarmos a função MAX() podemos solicitar o maior valor da coluna:
SELECT MAX(preco) AS 'maior preco' FROM produtos;
Outras funções são MIN()(menor), AVG()(média) e SUM()(soma).
Os operadores de comparação utilizados no SQL são: >, <, +, -, /, =, <> ou !=, >=, <= /.
Podemos agrupar o retorno de valores de acordo com a coluna selecionada com o comando GROUP BY:
SELECT uf, COUNT(*) AS 'Quantidade de clientes' FROM clientes
GROUP by UF;

ou
SELECT preco, count(*) AS 'maior preco' FROM produtos
GROUP BY preco;

Vamos agora inserir um pedido:
INSERT INTO pedidos values(1, 1, 2, 100);
Quando relacionamos duas tabelas como no caso de pedidos e produtos precisamos recuperar os dados de modo a mostrar o retorno conjuntamente. Para isso podemos relacionar as tabelas com o WHERE:
SELECT *, nome FROM pedidos, produtos
WHERE pedidos.produto_id = produtos.id;

Podemos entretanto ordenar de que modo os dados são apresentados:
SELECT pedidos.id, nome, quantidade, preco as 'valor unitario', total
FROM pedidos, produtos
WHERE pedidos.produto_id = produtos.id;
Desse modo temos os dados retornados de modo mais organizado.
Fiz o ajuste do total com o UPDATE.
UPDATE pedidos SET total=200 WHERE pedidos.id=1;
Aula 32 a 33 - Criando primeira procedure / Criando procedure de pedidos
Aqui temos algumas diferenças entre versão que estou utilizando e a versão da aula.
Na versão da aula o BD tem tres itens: Tables, Views e Routines. Na versão que estou utilizando a opção Routines é substituida por Stored Procedures e Functions.
Na versão da aula executou-se o comando
SELECT * FROM INFORMATION_SCHEMA.ROUTINES;
para apresentar as rotinas criadas. Na minha versão o retorno desse comando apresenta, aparentemente, algumas funções nativas do MySQL.
Podemos substituir o delimitador de expressões (por padrão é o ';') utilizando o commando DELIMITER:
DELIMITER &&
SELECT * FROM INFORMATION_SCHEMA.ROUTINES&&

Isso é util para a criação de procedures.
Em seguida criamos uma procedure:
DELIMITER &&

CREATE PROCEDURE curso_mysql.PRIMEIRA()
BEGIN
SELECT 'Minha primeira rotina';
END &&

DELIMITER ;

Para executar uma procedure utilizamos o comando CALL nome_da_procedure:
CALL PRIMEIRA();
Agora vamos criar uma procedure prática. Vamos criar uma rotina de pedido que recebe tres parametros e inser na tabela pedidos. Em seguida ela remove da tabela produtos a quantidade definida nos parametros. Primeiramente criamos a coluna quantidade na tabela produtos:
ALTER TABLE produtos ADD COLUMN estoque INT DEFAULT 10;
ALTER TABLE produtos ALTER COLUMN estoque DROP DEFAULT;
Utilizei o DEFAULT para preencher automaticamente todos os campos com o valor definido.
Em seguida criamos a procedure:
DELIMITER &&

CREATE PROCEDURE faz_pedido(p_id int, qtd int, valor double)
BEGIN
INSERT INTO pedidos VALUES(p_id, qtd, valor);
UPDATE produtos SET estoque=estoque-qtd WHERE id=P_id;
END

DELIMITER ;
Essa rotina resultou em um erro por dois motivos. Primeiro porque não estava definido quais os campos seriam preenchidos, uma vez que não estavam todos os valores da tabela. O segundo que o campo de id naõ esta definido como AUTO_INCREMENT. Fizemos isso através da interface do Workbench, mas o comando é o seguinte:
ALTER TABLE `curso_mysql`.`pedidos`
CHANGE COLUMN `id` `id` INT NOT NULL AUTO_INCREMENT ;
Em seguida alteramos o código da procedure. Primeiramente criamos uma rotina que verifica se a procedure já existe e se sim a apaga automaticamente.
DROP PROCEDURE IF EXISTS faz_pedido &&
O novo código ficou como a seguir:
DELIMITER &&

DROP PROCEDURE IF EXISTS faz_pedido &&

CREATE PROCEDURE faz_pedido(p_id int, qtd int, valor double)
BEGIN
INSERT INTO pedidos (produto_id, quantidade, total) VALUES(p_id, qtd, valor);
UPDATE produtos SET estoque=estoque-qtd WHERE id=p_id;
END &&

DELIMITER ;
Aula 34 - Criando views
Views são rotinas que são criadas para facilitar o retorno de requisições do tipo SELECT.
Criamos views com o comando CREATE VIEW nome_da_view AS rotina de SELECT.
CREATE VIEW v_clientes_sp AS
SELECT * FROM clientes WHERE uf='SP';

Para executar a view utilizamos o comando:
SELECT * FROM v_clientes_sp; Desse modo sintetizamos os filtros utilizados no SELECT em apenas um comando.
Aula 35 a 36- Modelando / Relacionamentos
Podemos criar modelos do BD que é a representação esquemática das tabelas e views necessárias para o banco. O MySQL Workbench possui uma ferramenta que cria esse modelo, seja do zero, seja a partir de um BD existente.
Podemos criar de modo visual relacionamentos entre as tabelas de modo a facilitar a criação de chaves.
Os relacionamentos entre tabelas podem ser:
1:1 Cada registro em uma tabela está relacionado a um registro em outra tabela.
1:n Cada registro em uma tabela está relacionado a vários registros em outra tabela.
m:n Vários registros em uma tabela podem estar relacionados a vários registros em outra tabela.
Feitas as alterações no modeling podemos transferir para o BD através do menu Database -> Synchronize Model...