├── 10_funcoes_number └── comandos.txt ├── 11_funcoes_date └── comandos.txt ├── 12_relacoes └── comandos.txt ├── 13_database_design ├── diagrama_er.mwb ├── pizzaria.mwb └── pizzaria.pdf ├── 14_pizzaria_do_joao ├── css │ └── styles.css ├── dashboard.php ├── img │ ├── pizza-banner.jpg │ └── pizza.svg ├── index.php ├── process │ ├── conn.php │ ├── orders.php │ └── pizza.php └── templates │ ├── footer.php │ └── header.php ├── 15_extra_php_blog ├── contato.php ├── css │ └── styles.css ├── data │ ├── categories.php │ └── posts.php ├── helpers │ └── url.php ├── img │ ├── logo.svg │ ├── prog-1.jpg │ ├── prog-2.jpg │ ├── prog-3.jpg │ └── prog-4.jpg ├── index.php ├── post.php └── templates │ ├── footer.php │ └── header.php ├── 1_intro ├── empresa.sql └── empresa2.sql ├── 3_tabelas └── comandos.txt ├── 4_crud └── comandos.txt ├── 5_select_avancado └── comandos.txt ├── 6_constraints └── comandos.txt ├── 7_joins └── comandos.txt ├── 8_de_volta_ao_select └── comandos.txt └── 9_funcoes_string ├── comandos.txt ├── sakila-data.sql └── sakila-schema.sql /10_funcoes_number/comandos.txt: -------------------------------------------------------------------------------- 1 | # 1 - CEIL 2 | 3 | SELECT amount, CEIL(amount) AS arredondado FROM payment; 4 | 5 | # 2 - COUNT 6 | 7 | SELECT COUNT(*) FROM payment; 8 | 9 | # 3 - FLOOR 10 | 11 | SELECT amount, CEIL(amount) AS para_cima, FLOOR(amount) AS para_baixo FROM payment; 12 | 13 | # 4 - MAX 14 | 15 | SELECT MAX(amount) AS maior_pagamento FROM payment; 16 | 17 | # 5 - MIN 18 | 19 | SELECT MIN(amount) AS menor_pagamento FROM payment; 20 | 21 | # 6 - SUM 22 | 23 | SELECT SUM(amount) AS soma_pagamentos FROM payment; -------------------------------------------------------------------------------- /11_funcoes_date/comandos.txt: -------------------------------------------------------------------------------- 1 | # 1 - ADDDATE 2 | 3 | SELECT last_update, ADDDATE(last_update, "5 DAYS") AS data_atualizada FROM actor; 4 | 5 | # 2 - ADDTIME 6 | 7 | SELECT last_update, ADDTIME(last_update, "3 02:10:05") AS data_atualizada FROM actor; 8 | 9 | # 3 - DATEDIFF 10 | 11 | SELECT DATEDIFF(last_update, ADDDATE(last_update, "1 DAY")) AS diferenca_de_datas FROM sakila.actor; 12 | 13 | # 4 - DATE_FORMAT 14 | 15 | SELECT DATE_FORMAT(last_update, "%d/%m/%Y") AS data_formatada FROM actor; 16 | 17 | # 5 - DAY 18 | 19 | SELECT last_update, DAY(last_update) AS dia FROM actor; 20 | 21 | # 6 - DAYOFWEEK 22 | 23 | SELECT last_update, DAYOFWEEK(last_update) AS dia FROM actor; 24 | 25 | # 7 - DAYOFYEAR 26 | 27 | SELECT last_update, DAYOFYEAR(last_update) AS dia_do_ano FROM actor; 28 | 29 | # 8 - WEEKOFYEAR 30 | 31 | SELECT last_update, WEEKOFYEAR(last_update) AS semana FROM actor; 32 | 33 | # 9 - MONTH 34 | 35 | SELECT last_update, MONTH(last_update) AS mes FROM actor; 36 | 37 | # 10 - YEAR 38 | 39 | SELECT last_update, YEAR(last_update) AS ano FROM actor; -------------------------------------------------------------------------------- /12_relacoes/comandos.txt: -------------------------------------------------------------------------------- 1 | # 1 - ONE TO ONE 2 | CREATE DATABASE relacoes; 3 | 4 | USE relacoes; 5 | 6 | CREATE TABLE estudantes( 7 | id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 8 | nome VARCHAR(100), 9 | turma VARCHAR(5) 10 | ); 11 | 12 | CREATE TABLE contatos ( 13 | id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 14 | telefone VARCHAR(20), 15 | estudante_id INT NOT NULL, 16 | FOREIGN KEY (estudante_id) REFERENCES estudantes(id) 17 | ); 18 | 19 | INSERT INTO estudantes (nome, turma) VALUES ("Matheus", "304d"); 20 | INSERT INTO estudantes (nome, turma) VALUES ("João", "101a"); 21 | 22 | INSERT INTO contatos (telefone, estudante_id) VALUES ("(48)9999-9999", 1); 23 | INSERT INTO contatos (telefone, estudante_id) VALUES ("(48)8888-8888", 2); 24 | 25 | SELECT estudantes.nome, contatos.telefone 26 | FROM estudantes 27 | JOIN contatos ON contatos.estudante_id = estudantes.id; 28 | 29 | # 2 - ONE TO MANY 30 | 31 | CREATE TABLE clientes ( 32 | id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 33 | nome VARCHAR(100), 34 | data_nascimento DATE 35 | ); 36 | 37 | CREATE TABLE pedidos ( 38 | id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 39 | qtd_itens INT(10), 40 | total FLOAT, 41 | cliente_id INT NOT NULL, 42 | FOREIGN KEY (cliente_id) REFERENCES clientes(id) 43 | ); 44 | 45 | 46 | INSERT INTO clientes (nome, data_nascimento) VALUES ("Matheus", "1991-05-01"); 47 | INSERT INTO clientes (nome, data_nascimento) VALUES ("João", "1985-02-04"); 48 | 49 | INSERT INTO pedidos (qtd_itens, total, cliente_id) VALUES (5, 214.54, 1); 50 | INSERT INTO pedidos (qtd_itens, total, cliente_id) VALUES (3, 120.00, 1); 51 | INSERT INTO pedidos (qtd_itens, total, cliente_id) VALUES (2, 89.47, 1); 52 | 53 | 54 | SELECT clientes.nome, pedidos.id AS pedido_id 55 | FROM clientes 56 | JOIN pedidos ON pedidos.cliente_id = clientes.id 57 | WHERE pedidos.cliente_id = 1; 58 | 59 | # 3 - MANY TO MANY 60 | 61 | CREATE TABLE materias ( 62 | id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 63 | nome VARCHAR(100) 64 | ); 65 | 66 | CREATE TABLE estudante_materia ( 67 | estudante_id INT NOT NULL, 68 | materia_id INT NOT NULL, 69 | FOREIGN KEY (estudante_id) REFERENCES estudantes(id), 70 | FOREIGN KEY (materia_id) REFERENCES materias(id) 71 | ); 72 | 73 | INSERT INTO materias (nome) VALUES ("Matemática"); 74 | INSERT INTO materias (nome) VALUES ("Química"); 75 | INSERT INTO materias (nome) VALUES ("Física"); 76 | 77 | INSERT INTO estudantes (nome, turma) VALUES ("Maria", "202b"); 78 | INSERT INTO estudantes (nome, turma) VALUES ("Amanda", "104c"); 79 | 80 | INSERT INTO estudante_materia (estudante_id, materia_id) VALUES (1, 1); 81 | INSERT INTO estudante_materia (estudante_id, materia_id) VALUES (1, 2); 82 | INSERT INTO estudante_materia (estudante_id, materia_id) VALUES (1, 3); 83 | INSERT INTO estudante_materia (estudante_id, materia_id) VALUES (2, 1); 84 | INSERT INTO estudante_materia (estudante_id, materia_id) VALUES (2, 2); 85 | INSERT INTO estudante_materia (estudante_id, materia_id) VALUES (2, 3); 86 | INSERT INTO estudante_materia (estudante_id, materia_id) VALUES (3, 1); 87 | INSERT INTO estudante_materia (estudante_id, materia_id) VALUES (3, 2); 88 | INSERT INTO estudante_materia (estudante_id, materia_id) VALUES (3, 3); 89 | INSERT INTO estudante_materia (estudante_id, materia_id) VALUES (4, 2); 90 | 91 | // ALUNOS QUIMICA 92 | SELECT * FROM alunos 93 | JOIN estudante_materia ON estudante_materia.estudante_id = alunos.id 94 | AND estudante_materia.materia_id = 2; -------------------------------------------------------------------------------- /13_database_design/diagrama_er.mwb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matheusbattisti/curso_sql/6a70c7fc8d995948511b891e4e6ad359e5849d37/13_database_design/diagrama_er.mwb -------------------------------------------------------------------------------- /13_database_design/pizzaria.mwb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matheusbattisti/curso_sql/6a70c7fc8d995948511b891e4e6ad359e5849d37/13_database_design/pizzaria.mwb -------------------------------------------------------------------------------- /13_database_design/pizzaria.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matheusbattisti/curso_sql/6a70c7fc8d995948511b891e4e6ad359e5849d37/13_database_design/pizzaria.pdf -------------------------------------------------------------------------------- /14_pizzaria_do_joao/css/styles.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | height: 100%; 3 | } 4 | 5 | /* NAVBAR */ 6 | #brand-logo { 7 | width: 50px; 8 | } 9 | 10 | .navbar.navbar-expand-lg { 11 | background-color: #000; 12 | font-weight: bold; 13 | } 14 | 15 | .navbar.navbar-expand-lg a { 16 | color: #FFF; 17 | } 18 | 19 | /* HOME */ 20 | #main-banner { 21 | background-image: url("../img/pizza-banner.jpg"); 22 | height: 300px; 23 | background-position: center; 24 | background-size: cover; 25 | width: 100%; 26 | background-position-y: -300px; 27 | display: flex; 28 | align-items: center; 29 | justify-content: center; 30 | } 31 | 32 | #main-banner h1 { 33 | color: #FFF; 34 | background-color: #000; 35 | text-align: center; 36 | padding: 30px; 37 | text-transform: uppercase; 38 | width: 550px; 39 | font-size: 50px; 40 | } 41 | 42 | #main-container { 43 | margin-bottom: 100px; 44 | padding: 50px 0; 45 | text-align: center; 46 | min-height: 50%; 47 | } 48 | 49 | #main-container h2 { 50 | margin-bottom: 30px; 51 | } 52 | 53 | .row { 54 | margin: 0; 55 | } 56 | 57 | #pizza-form { 58 | max-width: 550px; 59 | margin: 0 auto; 60 | text-align: left; 61 | } 62 | 63 | #pizza-form label { 64 | font-weight: bold; 65 | } 66 | 67 | .btn.btn-primary { 68 | background-color: #000; 69 | border-color: #000; 70 | } 71 | 72 | /* ALERTA */ 73 | .alert { 74 | border-radius: 0; 75 | text-align: center; 76 | margin-bottom: 0; 77 | font-weight: bold; 78 | padding: 20px; 79 | font-size: 18px; 80 | } 81 | 82 | .alert.alert-success { 83 | border: 2px solid #155724; 84 | } 85 | 86 | .alert.alert-warning { 87 | border: 2px solid #856404; 88 | } 89 | 90 | .alert p { 91 | margin-bottom: 0; 92 | } 93 | 94 | /* DASHBOARD */ 95 | .delete-btn, .update-btn { 96 | border: none; 97 | background-color: transparent; 98 | } 99 | 100 | .delete-btn { 101 | padding-top: 10px; 102 | } 103 | 104 | .delete-btn i { 105 | color: #721c24; 106 | font-size: 20px; 107 | } 108 | 109 | .update-btn { 110 | margin-left: 10px; 111 | } 112 | 113 | .update-btn i { 114 | color: #004085; 115 | } 116 | 117 | .update-form { 118 | display: flex; 119 | flex-direction: row; 120 | } 121 | 122 | .status-input { 123 | width: 65%; 124 | } 125 | 126 | .table ul { 127 | text-align: left; 128 | } 129 | 130 | /* FOOTER */ 131 | footer { 132 | position: relative; 133 | width: 100%; 134 | height: 175px; 135 | background-color: #000; 136 | color: #FFF; 137 | display: flex; 138 | align-items: center; 139 | justify-content: center; 140 | font-weight: bold; 141 | } 142 | 143 | /* RESPONSIVO */ 144 | @media(max-width: 425px) { 145 | 146 | #main-banner { 147 | background-position-y: 0; 148 | } 149 | 150 | #main-banner h1 { 151 | padding: 10px; 152 | } 153 | 154 | #main-container { 155 | margin-bottom: 0; 156 | } 157 | 158 | #main-container .container { 159 | padding: 10px; 160 | } 161 | 162 | .form-group .btn.btn-primary { 163 | width: 100%; 164 | height: 50px; 165 | margin-top: 15px; 166 | text-transform: uppercase; 167 | } 168 | 169 | .table-container { 170 | padding: 0; 171 | } 172 | 173 | .table td, .table th { 174 | padding: .5rem; 175 | } 176 | 177 | th span { 178 | display: none; 179 | } 180 | 181 | .table thead th:nth-child(5), 182 | .table thead th:nth-child(6), 183 | .table tbody td:nth-child(5), 184 | .table tbody td:nth-child(6) { 185 | display: none; 186 | } 187 | 188 | } -------------------------------------------------------------------------------- /14_pizzaria_do_joao/dashboard.php: -------------------------------------------------------------------------------- 1 | 5 |
6 |
7 |
8 |
9 |

Gerenciar pedidos:

10 |
11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 36 | 50 | 59 | 60 | 61 | 62 |
Pedido #BordaMassaSaboresStatusAções
30 |
    31 | 32 |
  • 33 | 34 |
35 |
37 |
38 | 39 | "> 40 | 45 | 48 |
49 |
51 |
52 | 53 | "> 54 | 57 |
58 |
63 |
64 |
65 |
66 |
67 | -------------------------------------------------------------------------------- /14_pizzaria_do_joao/img/pizza-banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matheusbattisti/curso_sql/6a70c7fc8d995948511b891e4e6ad359e5849d37/14_pizzaria_do_joao/img/pizza-banner.jpg -------------------------------------------------------------------------------- /14_pizzaria_do_joao/img/pizza.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /14_pizzaria_do_joao/index.php: -------------------------------------------------------------------------------- 1 | 5 |
6 |

Faça seu Pedido

7 |
8 |
9 |
10 |
11 |
12 |

Monte a pizza como desejar:

13 |
14 |
15 | 16 | 22 |
23 |
24 | 25 | 31 |
32 |
33 | 34 | 39 |
40 |
41 | 42 |
43 |
44 |
45 |
46 |
47 |
48 | -------------------------------------------------------------------------------- /14_pizzaria_do_joao/process/conn.php: -------------------------------------------------------------------------------- 1 | setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 14 | $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 15 | 16 | } catch (PDOException $e) { 17 | 18 | print "Erro: " . $e->getMessage() . "
"; 19 | die(); 20 | 21 | } 22 | 23 | ?> -------------------------------------------------------------------------------- /14_pizzaria_do_joao/process/orders.php: -------------------------------------------------------------------------------- 1 | query("SELECT * FROM pedidos;"); 10 | 11 | $pedidos = $pedidosQuery->fetchAll(); 12 | 13 | $pizzas = []; 14 | 15 | // Montando pizza 16 | foreach($pedidos as $pedido) { 17 | 18 | $pizza = []; 19 | 20 | // definir um array para a pizza 21 | $pizza["id"] = $pedido["pizza_id"]; 22 | 23 | // resgatando a pizza 24 | $pizzaQuery = $conn->prepare("SELECT * FROM pizzas WHERE id = :pizza_id"); 25 | 26 | $pizzaQuery->bindParam(":pizza_id", $pizza["id"]); 27 | 28 | $pizzaQuery->execute(); 29 | 30 | $pizzaData = $pizzaQuery->fetch(PDO::FETCH_ASSOC); 31 | 32 | // resgatando a borda da pizza 33 | $bordaQuery = $conn->prepare("SELECT * FROM bordas WHERE id = :borda_id"); 34 | 35 | $bordaQuery->bindParam(":borda_id", $pizzaData["borda_id"]); 36 | 37 | $bordaQuery->execute(); 38 | 39 | $borda = $bordaQuery->fetch(PDO::FETCH_ASSOC); 40 | 41 | $pizza["borda"] = $borda["tipo"]; 42 | 43 | // resgatando a borda da pizza 44 | $massaQuery = $conn->prepare("SELECT * FROM massas WHERE id = :massa_id"); 45 | 46 | $massaQuery->bindParam(":massa_id", $pizzaData["massa_id"]); 47 | 48 | $massaQuery->execute(); 49 | 50 | $massa = $massaQuery->fetch(PDO::FETCH_ASSOC); 51 | 52 | $pizza["massa"] = $massa["tipo"]; 53 | 54 | // resgatando os sabores da pizza 55 | $saboresQuery = $conn->prepare("SELECT * FROM pizza_sabor WHERE pizza_id = :pizza_id"); 56 | 57 | $saboresQuery->bindParam(":pizza_id", $pizza["id"]); 58 | 59 | $saboresQuery->execute(); 60 | 61 | $sabores = $saboresQuery->fetchAll(PDO::FETCH_ASSOC); 62 | 63 | // resgatando o nome dos sabores 64 | $saboresDaPizza = []; 65 | 66 | $saborQuery = $conn->prepare("SELECT * FROM sabores WHERE id = :sabor_id"); 67 | 68 | foreach($sabores as $sabor) { 69 | 70 | $saborQuery->bindParam(":sabor_id", $sabor["sabor_id"]); 71 | 72 | $saborQuery->execute(); 73 | 74 | $saborPizza = $saborQuery->fetch(PDO::FETCH_ASSOC); 75 | 76 | array_push($saboresDaPizza, $saborPizza["nome"]); 77 | 78 | } 79 | 80 | $pizza["sabores"] = $saboresDaPizza; 81 | 82 | // adicionar o status do pedido 83 | $pizza["status"] = $pedido["status_id"]; 84 | 85 | // Adicionar o array de pizza, ao array das pizzas 86 | array_push($pizzas, $pizza); 87 | 88 | } 89 | 90 | // Resgatando os status 91 | $statusQuery = $conn->query("SELECT * FROM status;"); 92 | 93 | $status = $statusQuery->fetchAll(); 94 | 95 | } else if($method === "POST") { 96 | 97 | // verificando tipo de POST 98 | $type = $_POST["type"]; 99 | 100 | // deletar pedido 101 | if($type === "delete") { 102 | 103 | $pizzaId = $_POST["id"]; 104 | 105 | $deleteQuery = $conn->prepare("DELETE FROM pedidos WHERE pizza_id = :pizza_id;"); 106 | 107 | $deleteQuery->bindParam(":pizza_id", $pizzaId, PDO::PARAM_INT); 108 | 109 | $deleteQuery->execute(); 110 | 111 | $_SESSION["msg"] = "Pedido removido com sucesso!"; 112 | $_SESSION["status"] = "success"; 113 | 114 | // Atualizar status do pedido 115 | } else if($type === "update") { 116 | 117 | $pizzaId = $_POST["id"]; 118 | $statusId = $_POST["status"]; 119 | 120 | $updateQuery = $conn->prepare("UPDATE pedidos SET status_id = :status_id WHERE pizza_id = :pizza_id"); 121 | 122 | $updateQuery->bindParam(":pizza_id", $pizzaId, PDO::PARAM_INT); 123 | $updateQuery->bindParam(":status_id", $statusId, PDO::PARAM_INT); 124 | 125 | $updateQuery->execute(); 126 | 127 | $_SESSION["msg"] = "Pedido atualizado com sucesso!"; 128 | $_SESSION["status"] = "success"; 129 | 130 | } 131 | 132 | // retorna usuário para dashboard 133 | header("Location: ../dashboard.php"); 134 | 135 | } 136 | 137 | ?> -------------------------------------------------------------------------------- /14_pizzaria_do_joao/process/pizza.php: -------------------------------------------------------------------------------- 1 | query("SELECT * FROM bordas;"); 11 | 12 | $bordas = $bordasQuery->fetchAll(); 13 | 14 | $massasQuery = $conn->query("SELECT * FROM massas;"); 15 | 16 | $massas = $massasQuery->fetchAll(); 17 | 18 | $saboresQuery = $conn->query("SELECT * FROM sabores;"); 19 | 20 | $sabores = $saboresQuery->fetchAll(); 21 | 22 | // Criação do pedido 23 | } else if($method === "POST") { 24 | 25 | $data = $_POST; 26 | 27 | $borda = $data["borda"]; 28 | $massa = $data["massa"]; 29 | $sabores = $data["sabores"]; 30 | 31 | // validação de sabores máximos 32 | if(count($sabores) > 3) { 33 | 34 | $_SESSION["msg"] = "Selecione no máximo 3 sabores!"; 35 | $_SESSION["status"] = "warning"; 36 | 37 | } else { 38 | 39 | // salvando borda e massa na pizza 40 | $stmt = $conn->prepare("INSERT INTO pizzas (borda_id, massa_id) VALUES (:borda, :massa)"); 41 | 42 | // filtrando inputs 43 | $stmt->bindParam(":borda", $borda, PDO::PARAM_INT); 44 | $stmt->bindParam(":massa", $massa, PDO::PARAM_INT); 45 | 46 | $stmt->execute(); 47 | 48 | // resgatando último id da última pizza 49 | $pizzaId = $conn->lastInsertId(); 50 | 51 | $stmt = $conn->prepare("INSERT INTO pizza_sabor (pizza_id, sabor_id) VALUES (:pizza, :sabor)"); 52 | 53 | // repetição até terminar de salvar todos os sabores 54 | foreach($sabores as $sabor) { 55 | 56 | // filtrando os inputs 57 | $stmt->bindParam(":pizza", $pizzaId, PDO::PARAM_INT); 58 | $stmt->bindParam(":sabor", $sabor, PDO::PARAM_INT); 59 | 60 | $stmt->execute(); 61 | 62 | } 63 | 64 | // criar o pedido da pizza 65 | $stmt = $conn->prepare("INSERT INTO pedidos (pizza_id, status_id) VALUES (:pizza, :status)"); 66 | 67 | // status -> sempre inicia com 1, que é em produção 68 | $statusId = 1; 69 | 70 | // filtrar inputs 71 | $stmt->bindParam(":pizza", $pizzaId); 72 | $stmt->bindParam(":status", $statusId); 73 | 74 | $stmt->execute(); 75 | 76 | // Exibir mensagem de sucesso 77 | $_SESSION["msg"] = "Pedido realizado com sucesso"; 78 | $_SESSION["status"] = "success"; 79 | 80 | } 81 | 82 | // Retorna para página inicial 83 | header("Location: .."); 84 | 85 | } 86 | 87 | ?> -------------------------------------------------------------------------------- /14_pizzaria_do_joao/templates/footer.php: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /14_pizzaria_do_joao/templates/header.php: -------------------------------------------------------------------------------- 1 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | Faça seu Pedido! 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
34 | 46 |
47 | 48 |
49 |

50 |
51 | -------------------------------------------------------------------------------- /15_extra_php_blog/contato.php: -------------------------------------------------------------------------------- 1 | 4 |

Página de contato

5 | -------------------------------------------------------------------------------- /15_extra_php_blog/css/styles.css: -------------------------------------------------------------------------------- 1 | * { 2 | font-family: 'Montserrat', sans-serif; 3 | padding: 0; 4 | margin: 0; 5 | box-sizing: border-box; 6 | } 7 | 8 | html { 9 | min-height: 100vh; 10 | position: relative; 11 | } 12 | 13 | main { 14 | margin-bottom: 250px; 15 | } 16 | 17 | /* NAVBAR */ 18 | #logo { 19 | position: absolute; 20 | top: 10px; 21 | left: 9.5%; 22 | } 23 | 24 | #logo img { 25 | width: 50px; 26 | } 27 | 28 | #navbar { 29 | display: flex; 30 | align-items: center; 31 | justify-content: center; 32 | background-color: #161616; 33 | padding: 20px; 34 | text-transform: uppercase; 35 | list-style: none; 36 | } 37 | 38 | #navbar li { 39 | margin: 0 10px; 40 | padding: 5px; 41 | } 42 | 43 | #navbar .nav-link { 44 | color: #FFF; 45 | text-decoration: none; 46 | transition: .5s; 47 | font-size: 14px; 48 | } 49 | 50 | #navbar .nav-link:hover { 51 | color: #999; 52 | } 53 | 54 | /* HOME */ 55 | #title-container { 56 | min-width: 500px; 57 | text-align: center; 58 | margin-top: 30px; 59 | } 60 | 61 | #title-container h1 { 62 | font-size: 50px; 63 | } 64 | 65 | #title-container p { 66 | margin-top: 10px; 67 | text-transform: uppercase; 68 | color: #999; 69 | } 70 | 71 | #posts-container { 72 | max-width: 1200px; 73 | margin: 0 auto; 74 | margin-top: 30px; 75 | display: flex; 76 | flex-wrap: wrap; 77 | } 78 | 79 | .post-box:first-child { 80 | min-width: 100%; 81 | } 82 | 83 | .post-box { 84 | flex: 1 1 0; 85 | margin-bottom: 20px; 86 | } 87 | 88 | .post-box:nth-child(3) { 89 | margin: 0 1%; 90 | } 91 | 92 | .post-box img { 93 | width: 100%; 94 | } 95 | 96 | .post-box .post-title { 97 | font-size: 24px; 98 | margin: 10px 0; 99 | } 100 | 101 | .post-box .post-title a { 102 | color: #000; 103 | transition: .5s; 104 | } 105 | 106 | .post-box .post-title a:hover { 107 | color: #999; 108 | } 109 | 110 | .post-box .post-description { 111 | color: #666; 112 | } 113 | 114 | .tags-container { 115 | margin-top: 10px; 116 | } 117 | 118 | .tags-container a { 119 | font-size: 14px; 120 | color: #333; 121 | display: inline-block; 122 | margin-right: 5px; 123 | } 124 | 125 | /* POST */ 126 | #post-container { 127 | display: grid; 128 | grid-template-columns: 75% 25%; 129 | grid-template-rows: auto; 130 | grid-template-areas: "main sidebar"; 131 | grid-gap: 10px; 132 | padding-top: 30px; 133 | max-width: 1200px; 134 | margin: 0 auto; 135 | margin-bottom: 250px; 136 | } 137 | 138 | .content-container { 139 | grid-area: main; 140 | } 141 | 142 | #main-title { 143 | font-size: 36px; 144 | margin-bottom: 30px; 145 | } 146 | 147 | #post-description { 148 | font-style: italic; 149 | margin-bottom: 40px; 150 | } 151 | 152 | .post-content { 153 | line-height: 1.8; 154 | margin: 10px 0; 155 | } 156 | 157 | .img-container { 158 | margin-bottom: 30px; 159 | } 160 | 161 | .img-container img { 162 | width: 60%; 163 | } 164 | 165 | /* POST ASIDE */ 166 | .nav-container { 167 | grid-area: sidebar; 168 | } 169 | 170 | #tags-title, #categories-title { 171 | font-size: 24px; 172 | margin-bottom: 10px; 173 | background-color: #000; 174 | color: #FFF; 175 | text-align: center; 176 | padding: 10px; 177 | font-weight: 300; 178 | } 179 | 180 | #tag-list, #categories-list { 181 | list-style: none; 182 | } 183 | 184 | #tag-list li, #categories-list li { 185 | margin-bottom: 10px; 186 | } 187 | 188 | #tag-list a, #categories-list a { 189 | color: #666; 190 | transition: .5s; 191 | } 192 | 193 | #tag-list a:hover, #categories-list a:hover { 194 | color: #000; 195 | } 196 | 197 | /* FOOTER */ 198 | 199 | footer { 200 | width: 100%; 201 | position: absolute; 202 | bottom: 0; 203 | text-align: center; 204 | background-color: #000; 205 | color: #FFF; 206 | padding: 50px 0; 207 | } 208 | 209 | /* MOBILE */ 210 | @media(max-width: 480px) { 211 | 212 | /* HOME */ 213 | header { 214 | width: 100%; 215 | } 216 | 217 | #logo { 218 | display: block; 219 | position: relative; 220 | margin: 0 auto; 221 | left: 0; 222 | width: 50px; 223 | } 224 | 225 | #navbar { 226 | display: none; 227 | } 228 | 229 | #title-container { 230 | min-width: 100%; 231 | margin-top: 20px; 232 | } 233 | 234 | #posts-container { 235 | margin-top: 20px; 236 | } 237 | 238 | .post-box { 239 | flex: 100% 1 0; 240 | padding: 15px; 241 | margin: 0; 242 | } 243 | 244 | /* POST */ 245 | #post-container { 246 | grid-template-columns: 100%; 247 | padding: 15px; 248 | grid-template-areas: "main" 249 | "sidebar"; 250 | } 251 | 252 | .img-container img { 253 | width: 100%; 254 | } 255 | 256 | } -------------------------------------------------------------------------------- /15_extra_php_blog/data/categories.php: -------------------------------------------------------------------------------- 1 | 1, 6 | 'title' => 'Programando em PHP', 7 | 'description' => 'Neste post você vai aprender tudo que precisa para ser um bom programador de PHP!', 8 | 'tags' => ['programação', 'PHP', 'lógica de programação'], 9 | 'img' => 'prog-1.jpg' 10 | ], 11 | [ 12 | 'id' => 2, 13 | 'title' => 'Orientação a Objetos com Java', 14 | 'description' => 'Aprenda o paradigma de orientação a objetos com Java, uma linguagem em alta no mercado.', 15 | 'tags' => ['Java', 'OOP', 'Programação Avançada'], 16 | 'img' => 'prog-2.jpg' 17 | ], 18 | [ 19 | 'id' => 3, 20 | 'title' => 'A importância da lógica de programação', 21 | 'description' => 'A lógica de programação é o ponto inicial de muitos estudantes de programação, será que é importante?', 22 | 'tags' => ['lógica', 'programação', 'algoritmos'], 23 | 'img' => 'prog-3.jpg', 24 | ], 25 | [ 26 | 'id' => 4, 27 | 'title' => 'Programando em PHP', 28 | 'description' => 'Neste post você vai aprender tudo que precisa para ser um bom programador de PHP!', 29 | 'tags' => ['programação', 'PHP', 'lógica de programação'], 30 | 'img' => 'prog-4.jpg' 31 | ], 32 | ]; -------------------------------------------------------------------------------- /15_extra_php_blog/helpers/url.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /15_extra_php_blog/img/prog-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matheusbattisti/curso_sql/6a70c7fc8d995948511b891e4e6ad359e5849d37/15_extra_php_blog/img/prog-1.jpg -------------------------------------------------------------------------------- /15_extra_php_blog/img/prog-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matheusbattisti/curso_sql/6a70c7fc8d995948511b891e4e6ad359e5849d37/15_extra_php_blog/img/prog-2.jpg -------------------------------------------------------------------------------- /15_extra_php_blog/img/prog-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matheusbattisti/curso_sql/6a70c7fc8d995948511b891e4e6ad359e5849d37/15_extra_php_blog/img/prog-3.jpg -------------------------------------------------------------------------------- /15_extra_php_blog/img/prog-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matheusbattisti/curso_sql/6a70c7fc8d995948511b891e4e6ad359e5849d37/15_extra_php_blog/img/prog-4.jpg -------------------------------------------------------------------------------- /15_extra_php_blog/index.php: -------------------------------------------------------------------------------- 1 | 4 |
5 |
6 |

Blog Codar

7 |

O seu blog de programação

8 |
9 |
10 | 11 |
12 | <?= $post['title'] ?> 13 |

14 | 15 |

16 |

17 |
18 | 19 | 20 | 21 |
22 |
23 | 24 |
25 |
26 | -------------------------------------------------------------------------------- /15_extra_php_blog/post.php: -------------------------------------------------------------------------------- 1 | 18 |
19 |
20 |

21 |

22 |
23 | <?= $currentPost['title'] ?> 24 |
25 |

Lorem, ipsum dolor sit amet consectetur adipisicing elit. Quo, explicabo provident, voluptatum, veniam nihil repellat eveniet quae adipisci exercitationem quos minus corrupti placeat veritatis architecto excepturi laudantium nulla tenetur cupiditate. 26 | Odit saepe voluptas voluptates, iusto minima dolore deleniti corporis itaque, rem facere inventore in sed cumque voluptatibus unde! Assumenda nam aspernatur eveniet id illo inventore ratione laboriosam iusto culpa provident. 27 | Nam blanditiis autem fugiat officiis animi, adipisci consequuntur minima. Mollitia atque iste sapiente quod pariatur necessitatibus minus voluptatem rerum eos modi enim perspiciatis provident ducimus, iure nostrum nobis eum iusto. 28 | Perspiciatis sed numquam animi quae assumenda nesciunt voluptatibus rem! Deserunt, quae ex, pariatur nemo eveniet ipsam delectus aperiam aut quas blanditiis repellat quibusdam debitis sequi odit nostrum? Dolores, iure quam! 29 | Beatae vel corrupti laborum repudiandae, placeat neque officiis odit provident reiciendis ducimus amet rem. Exercitationem similique itaque labore asperiores quasi officia aspernatur quas soluta quos. Quasi aliquam in laboriosam illum.

30 |

Lorem, ipsum dolor sit amet consectetur adipisicing elit. Quo, explicabo provident, voluptatum, veniam nihil repellat eveniet quae adipisci exercitationem quos minus corrupti placeat veritatis architecto excepturi laudantium nulla tenetur cupiditate. 31 | Odit saepe voluptas voluptates, iusto minima dolore deleniti corporis itaque, rem facere inventore in sed cumque voluptatibus unde! Assumenda nam aspernatur eveniet id illo inventore ratione laboriosam iusto culpa provident. 32 | Nam blanditiis autem fugiat officiis animi, adipisci consequuntur minima. Mollitia atque iste sapiente quod pariatur necessitatibus minus voluptatem rerum eos modi enim perspiciatis provident ducimus, iure nostrum nobis eum iusto. 33 | Perspiciatis sed numquam animi quae assumenda nesciunt voluptatibus rem! Deserunt, quae ex, pariatur nemo eveniet ipsam delectus aperiam aut quas blanditiis repellat quibusdam debitis sequi odit nostrum? Dolores, iure quam! 34 | Beatae vel corrupti laborum repudiandae, placeat neque officiis odit provident reiciendis ducimus amet rem. Exercitationem similique itaque labore asperiores quasi officia aspernatur quas soluta quos. Quasi aliquam in laboriosam illum.

35 |
36 | 50 |
51 | -------------------------------------------------------------------------------- /15_extra_php_blog/templates/footer.php: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /15_extra_php_blog/templates/header.php: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | Blog Codar 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 23 | 31 |
-------------------------------------------------------------------------------- /1_intro/empresa.sql: -------------------------------------------------------------------------------- 1 | -- MySQL dump 10.13 Distrib 5.7.17, for Win64 (x86_64) 2 | -- 3 | -- Host: localhost Database: empresa 4 | -- ------------------------------------------------------ 5 | -- Server version 5.5.5-10.4.14-MariaDB 6 | 7 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 8 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 9 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 10 | /*!40101 SET NAMES utf8 */; 11 | /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; 12 | /*!40103 SET TIME_ZONE='+00:00' */; 13 | /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 14 | /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 15 | /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 16 | /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; 17 | 18 | -- 19 | -- Table structure for table `funcionarios` 20 | -- 21 | 22 | DROP TABLE IF EXISTS `funcionarios`; 23 | /*!40101 SET @saved_cs_client = @@character_set_client */; 24 | /*!40101 SET character_set_client = utf8 */; 25 | CREATE TABLE `funcionarios` ( 26 | `id` int(11) NOT NULL AUTO_INCREMENT, 27 | `nome` varchar(255) DEFAULT NULL, 28 | `idade` varchar(45) DEFAULT NULL, 29 | PRIMARY KEY (`id`) 30 | ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4; 31 | /*!40101 SET character_set_client = @saved_cs_client */; 32 | 33 | -- 34 | -- Dumping data for table `funcionarios` 35 | -- 36 | 37 | LOCK TABLES `funcionarios` WRITE; 38 | /*!40000 ALTER TABLE `funcionarios` DISABLE KEYS */; 39 | INSERT INTO `funcionarios` VALUES (1,'Juliana','23'),(2,'João','30'),(3,'Maria','42'),(4,'Pedro','19'); 40 | /*!40000 ALTER TABLE `funcionarios` ENABLE KEYS */; 41 | UNLOCK TABLES; 42 | 43 | -- 44 | -- Table structure for table `servicos` 45 | -- 46 | 47 | DROP TABLE IF EXISTS `servicos`; 48 | /*!40101 SET @saved_cs_client = @@character_set_client */; 49 | /*!40101 SET character_set_client = utf8 */; 50 | CREATE TABLE `servicos` ( 51 | `id` int(11) NOT NULL AUTO_INCREMENT, 52 | `nome` varchar(255) DEFAULT NULL, 53 | PRIMARY KEY (`id`) 54 | ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4; 55 | /*!40101 SET character_set_client = @saved_cs_client */; 56 | 57 | -- 58 | -- Dumping data for table `servicos` 59 | -- 60 | 61 | LOCK TABLES `servicos` WRITE; 62 | /*!40000 ALTER TABLE `servicos` DISABLE KEYS */; 63 | INSERT INTO `servicos` VALUES (1,'desenvolvimento'),(2,'análise de banco de dados'),(3,'análise de infraestrutura'),(4,'projeto de softwares'),(5,'design de interfaces'); 64 | /*!40000 ALTER TABLE `servicos` ENABLE KEYS */; 65 | UNLOCK TABLES; 66 | /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 67 | 68 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; 69 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; 70 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; 71 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 72 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 73 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 74 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 75 | 76 | -- Dump completed on 2021-03-21 12:38:36 77 | -------------------------------------------------------------------------------- /1_intro/empresa2.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matheusbattisti/curso_sql/6a70c7fc8d995948511b891e4e6ad359e5849d37/1_intro/empresa2.sql -------------------------------------------------------------------------------- /3_tabelas/comandos.txt: -------------------------------------------------------------------------------- 1 | # 38 - TABELA COM TIPO DE DADO STRING 2 | CREATE TABLE produtos (nome VARCHAR(100), sku CHAR(5), informacoes MEDIUMTEXT); 3 | 4 | # 40 - INSERIR DADO TIPO STRING 5 | INSERT INTO produtos (nome, sku, informacoes) VALUES ('Playstation 5', 'PS5ABC', 'É um videogame de última geração'); 6 | 7 | # 43 - TABELA COM TIPO DE DADO NUMERO 8 | CREATE TABLE servidores (nome VARCHAR(100), espaco_disco INT(10), ligado BOOL); 9 | 10 | INSERT INTO servidores (nome, espaco_disco, ligado) VALUES ('servidor 1', 123994, 0); 11 | 12 | # 46 - TABELA COM DATA 13 | CREATE TABLE aniversarios (nome VARCHAR(100), data_nascimento DATE); 14 | 15 | INSERT INTO aniversarios (nome, data_nascimento) VALUES ('João Pedro', '1991-05-02'); 16 | 17 | # 49 - ALTERAR TABELA 18 | CREATE TABLE funcionarios (nome VARCHAR(100)); 19 | 20 | # 50 - ADICIONAR COLUNA 21 | ALTER TABLE funcionarios ADD COLUMN profissao VARCHAR(100); 22 | 23 | # 51 - REMOVER COLUNA 24 | ALTER TABLE funcionarios DROP COLUMN profissao; 25 | 26 | # 52 - ALTERAR COLUNA 27 | ALTER TABLE funcionarios ADD COLUMN data_nascimento VARCHAR(100); 28 | 29 | ALTER TABLE funcionarios MODIFY COLUMN data_nascimento DATE; 30 | 31 | -------------------------------------------------------------------------------- /4_crud/comandos.txt: -------------------------------------------------------------------------------- 1 | # 53 - CRUD 2 | CREATE DATABASE cadastro; 3 | 4 | CREATE TABLE pessoas (nome VARCHAR(100), rg VARCHAR(7), cpf VARCHAR(11), limite INT(10)); 5 | -------------------------------------------------------------------------------- /5_select_avancado/comandos.txt: -------------------------------------------------------------------------------- 1 | 2 | # 65 - AVANÇANDO NO SELECT 3 | CREATE DATABASE employees 4 | 5 | USE employees 6 | 7 | source employees.sql 8 | 9 | # EXERCICIO 14 10 | 11 | SELECT * FROM titles WHERE emp_no >= 11500; 12 | 13 | # 69 - DISTINCT 14 | 15 | SELECT DISTINCT gender FROM employees; 16 | SELECT DISTINCT title FROM titles; 17 | 18 | # 74 - ORDER BY 19 | 20 | SELECT * FROM salaries WHERE salary > 60000 ORDER BY salary DESC 21 | 22 | # EXERCíCIO 15 23 | 24 | SELECT * FROM titles ORDER BY title DESC; 25 | 26 | # 75 - limite 27 | 28 | SELECT * FROM salaries WHERE salary > 80000 LIMIT 10; 29 | 30 | # EXERCíCIO 16 31 | 32 | SELECT * FROM titles ORDER BY title ASC LIMIT 5; 33 | 34 | # 76 - Função MIN 35 | 36 | SELECT MIN(salary) FROM salaries; 37 | 38 | # 77 - Função MAX 39 | 40 | SELECT MAX(salary) FROM salaries; 41 | 42 | # 78 - COUNT 43 | 44 | SELECT COUNT(*) FROM salaries WHERE salary > 100000; 45 | 46 | # EXERCíCIO 17 47 | 48 | SELECT COUNT(*) FROM departments; 49 | 50 | # 79 - AVG 51 | 52 | SELECT AVG(salary) FROM salaries; 53 | 54 | # 80 - SUM 55 | 56 | SELECT SUM(salary) FROM salaries; 57 | 58 | # 81 - LIKE 59 | 60 | SELECT * FROM employees WHERE first_name LIKE '%ber%'; 61 | 62 | # EXERCICIO 18 63 | 64 | SELECT * FROM titles WHERE title LIKE '%Engineer%'; 65 | 66 | # 82 - IN 67 | 68 | SELECT * FROM dept_emp WHERE dept_no IN ('d004', 'd005', 'd006'); 69 | 70 | # EXERCICIO 19 71 | 72 | SELECT * FROM employees WHERE last_name IN ('Facello', 'Peac'); 73 | 74 | # 83 - BETWEEN 75 | 76 | SELECT * FROM dept_emp WHERE dept_no BETWEEN 'd001' AND 'd008'; 77 | 78 | # EXERCICIO 20 79 | 80 | SELECT * FROM salaries WHERE salary BETWEEN 125000 AND 225000; 81 | 82 | # 84 - ALIAS 83 | 84 | SELECT SUM(salary) AS soma_salario FROM salaries; 85 | -------------------------------------------------------------------------------- /6_constraints/comandos.txt: -------------------------------------------------------------------------------- 1 | CREATE DATABASE constraints; 2 | 3 | # 1 - NOT NULL 4 | CREATE TABLE pessoas( 5 | nome VARCHAR(100) NOT NULL, 6 | idade INT 7 | ); 8 | 9 | INSERT INTO pessoas (nome) VALUES ("Matheus"); 10 | 11 | INSERT INTO pessoas (nome, idade) VALUES (NULL, 30); 12 | 13 | # 2 - UNIQUE 14 | ALTER TABLE pessoas ADD COLUMN email VARCHAR(255) UNIQUE; 15 | 16 | INSERT INTO pessoas (nome, idade, email) VALUES ("João", 30, "joao@gmai.com"); 17 | 18 | # 3 - PRIMARY KEY 19 | CREATE TABLE produtos( 20 | id INT NOT NULL, 21 | nome VARCHAR(255), 22 | sku VARCHAR(10), 23 | PRIMARY KEY (id) 24 | ); 25 | 26 | INSERT INTO produtos (id, nome, sku) VALUES (1, 'Batedeira', '123asd'); 27 | 28 | INSERT INTO produtos (id, nome, sku) VALUES (NULL, 'Fogão', '1244'); 29 | 30 | INSERT INTO produtos (id, nome, sku) VALUES (1, 'TV', '555'); 31 | 32 | # 4 - AUTO INCREMENT 33 | 34 | CREATE TABLE frutas ( 35 | id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 36 | nome VARCHAR(200) 37 | ) 38 | 39 | INSERT INTO frutas (nome) VALUES ("Maçã"); 40 | INSERT INTO frutas (nome) VALUES ("Mamão"); 41 | INSERT INTO frutas (nome) VALUES ("Morango"); 42 | 43 | # 5 - FOREIGN KEY 44 | DROP TABLE pessoas; 45 | 46 | CREATE TABLE pessoas( 47 | id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 48 | nome VARCHAR(100) NOT NULL, 49 | idade INT 50 | ); 51 | 52 | CREATE TABLE enderecos ( 53 | id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 54 | rua VARCHAR(100), 55 | numero VARCHAR(10), 56 | pessoa_id INT NOT NULL, 57 | FOREIGN KEY (pessoa_id) REFERENCES pessoas(id) 58 | ); 59 | 60 | INSERT INTO enderecos (rua, numero, pessoa_id) VALUES ("Rua teste", "12", 555); 61 | 62 | INSERT INTO pessoas (nome, idade) VALUES ("Pedro", 32); 63 | INSERT INTO enderecos (rua, numero, pessoa_id) VALUES ("Rua teste", "12", 1); 64 | 65 | DROP TABLE pessoas; // após insert 66 | 67 | # 6 - INDEX 68 | 69 | CREATE INDEX index_nome 70 | ON pessoas (nome); 71 | 72 | SHOW INDEX FROM pessoas; 73 | 74 | # 7 - DELETE INDEX 75 | 76 | DROP INDEX index_nome ON pessoas; 77 | 78 | # EXERCICIO 21 79 | CREATE DATABASE banco; 80 | 81 | USE banco; 82 | 83 | CREATE TABLE contas ( 84 | id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 85 | nome VARCHAR(100), 86 | sobrenome VARCHAR(100), 87 | saldo INT, 88 | data_nascimento DATE 89 | ); 90 | 91 | CREATE INDEX idx_saldo 92 | ON contas (saldo); 93 | 94 | INSERT INTO contas (nome, sobrenome, saldo, data_nascimento) VALUES ("Matheus", "Battisti", 10000, "1991-02-05"); 95 | INSERT INTO contas (nome, sobrenome, saldo, data_nascimento) VALUES ("Aléxia", "Couto", 25000, "1995-08-30"); 96 | INSERT INTO contas (nome, sobrenome, saldo, data_nascimento) VALUES ("Bruno", "Ribeiro", 100000, "1982-12-15"); -------------------------------------------------------------------------------- /7_joins/comandos.txt: -------------------------------------------------------------------------------- 1 | # 1 - INNER JOIN 2 | SELECT employees.first_name, employees.last_name, salaries.salary 3 | FROM employees 4 | INNER JOIN salaries 5 | ON employees.emp_no = salaries.emp_no; 6 | 7 | # EXERCICIO 22 8 | 9 | SELECT employees.first_name, employees.gender, titles.title 10 | FROM employees 11 | INNER JOIN titles 12 | ON employees.emp_no = titles.emp_no; 13 | 14 | # 2 LEFT JOIN 15 | 16 | USE constraints; 17 | 18 | INSERT INTO pessoas (nome, idade) VALUES ("José", 55); 19 | 20 | SELECT pessoas.nome, enderecos.* 21 | FROM pessoas 22 | LEFT JOIN enderecos 23 | ON pessoas.id = enderecos.pessoa_id; 24 | 25 | # 3 RIGHT JOIN 26 | 27 | INSERT INTO pessoas (nome, idade) VALUES ("Otávio", 16); 28 | 29 | SELECT pessoas.nome, enderecos.* 30 | FROM pessoas 31 | RIGHT JOIN enderecos 32 | ON pessoas.id = enderecos.pessoa_id; 33 | -------------------------------------------------------------------------------- /8_de_volta_ao_select/comandos.txt: -------------------------------------------------------------------------------- 1 | # 1 - UNION 2 | 3 | SELECT dept_no FROM departments UNION SELECT dept_no FROM dept_emp; 4 | 5 | # 2 - UNION ALL 6 | 7 | SELECT dept_no FROM departments UNION ALL SELECT dept_no FROM dept_emp; 8 | 9 | # 3 - GROUP BY 10 | 11 | SELECT gender, COUNT(gender) as 'Qtd por gênero' 12 | FROM employees 13 | GROUP BY gender; 14 | 15 | # EXERCICIO 23 16 | 17 | SELECT hire_date, COUNT(hire_date) as 'Data de contratação' 18 | FROM employees 19 | GROUP BY hire_date; 20 | 21 | # 4 - HAVING 22 | 23 | SELECT title, COUNT(title) as 'titulos' 24 | FROM titles 25 | GROUP BY title; 26 | 27 | # só com 100 pessoas + 28 | SELECT title, COUNT(title) as 'titulos' 29 | FROM titles 30 | GROUP BY title 31 | HAVING COUNT(title) > 100; 32 | 33 | # EXERCICIO 24 34 | 35 | SELECT hire_date, COUNT(hire_date) as 'Data de contratação' 36 | FROM employees 37 | GROUP BY hire_date 38 | HAVING COUNT(hire_date) > 50; 39 | 40 | # 5 - subquery 41 | 42 | SELECT first_name, ( 43 | SELECT SUM(salary) 44 | FROM salaries 45 | WHERE employees.emp_no = salaries.emp_no 46 | ) AS soma_salario 47 | FROM employees; 48 | 49 | # 6 - EXISTS 50 | 51 | - somente salarios maiores que 1 milhao 52 | 53 | SELECT first_name, last_name, ( 54 | SELECT SUM(salary) 55 | FROM salaries 56 | WHERE employees.emp_no = salaries.emp_no 57 | LIMIT 1 58 | ) AS soma_salario 59 | FROM employees 60 | WHERE EXISTS ( 61 | SELECT salary 62 | FROM salaries 63 | WHERE employees.emp_no = salaries.emp_no 64 | HAVING SUM(salary) > 1000000 65 | ) 66 | 67 | # 7 - ANY 68 | 69 | SELECT first_name 70 | FROM employees 71 | WHERE emp_no = ANY ( 72 | SELECT emp_no 73 | FROM salaries 74 | WHERE salary > 150000 75 | ); 76 | 77 | # EXERCICIO 25 78 | 79 | -- Criação de tabela dos posts 80 | CREATE TABLE posts( 81 | -- Coluna de ID, com auto incremento e chave primária 82 | id INT PRIMARY KEY AUTO_INCREMENT, 83 | -- Coluna de título do post, no máximo 255 caracteres 84 | titulo VARCHAR(255), 85 | -- Coluna de texto do post 86 | corpo_do_post TEXT, 87 | -- Coluna de tags para o post 88 | tags VARCHAR(255) 89 | ); -------------------------------------------------------------------------------- /9_funcoes_string/comandos.txt: -------------------------------------------------------------------------------- 1 | # 1 - CHAR LENGTH 2 | 3 | SELECT nome, CHAR_LENGTH(nome) AS qtd_chars 4 | FROM funcionarios; 5 | 6 | # EXERCICIO 26 7 | 8 | SELECT address_id, address, CHAR_LENGTH(postal_code) 9 | FROM address 10 | ORDER BY address_id DESC; 11 | 12 | # 2 - CONCAT 13 | 14 | SELECT CONCAT(nome, " tem ", idade, " anos de idade!") AS nome_e_idade 15 | FROM funcionarios; 16 | 17 | # EXERCICIO 27 18 | 19 | SELECT actor_id, CONCAT(first_name, " ", last_name) FROM actor; 20 | 21 | # 3 - CONCAT_WS 22 | 23 | SELECT CONCAT_WS(",", nome, idade) AS nome_e_idade 24 | FROM funcionarios; 25 | 26 | # 4 - FORMAT 27 | USE sakila; 28 | 29 | SELECT customer_id, amount, FORMAT(amount, 1) AS formatado FROM payment; 30 | 31 | # 5 - INSTr 32 | 33 | SELECT email, INSTR(email, '@') FROM customer; 34 | 35 | # 6 - LCASE 36 | 37 | SELECT first_name, last_name, LCASE(CONCAT(first_name, " ", last_name)) FROM sakila.customer; 38 | 39 | # 7 - LEFT 40 | 41 | SELECT title, LEFT(title, 8) FROM film WHERE film_id = 1; 42 | 43 | # EXERCICIO 28 44 | 45 | SELECT address_id, LEFT(last_update, 10) as data FROM address 46 | WHERE address_id > 150; 47 | 48 | # 8 - REPLACE 49 | 50 | SELECT REPLACE(name, "Action", "Ação") FROM category; 51 | 52 | # EXERCICIO 29 53 | 54 | SELECT REPLACE(first_name, "MARY", "Mary") as nome, 55 | REPLACE(last_name, "SMITH", "Smith") as sobrenome 56 | FROM customer WHERE last_name = "SMITH"; 57 | 58 | # 9 - RIGHT 59 | 60 | SELECT RIGHT(last_update, 8) AS horario FROM category; 61 | 62 | # 10 - SUBSTRING 63 | 64 | SELECT SUBSTR(last_update, 6, 2) AS mês FROM sakila.actor; 65 | 66 | # 11 - UCASE 67 | 68 | SELECT UCASE(description) FROM film; 69 | 70 | # EXERCICIO 30 71 | 72 | SELECT country_id, UCASE(country) AS country FROM country; -------------------------------------------------------------------------------- /9_funcoes_string/sakila-schema.sql: -------------------------------------------------------------------------------- 1 | -- Sakila Sample Database Schema 2 | -- Version 1.2 3 | 4 | -- Copyright (c) 2006, 2019, Oracle and/or its affiliates. 5 | 6 | -- Redistribution and use in source and binary forms, with or without 7 | -- modification, are permitted provided that the following conditions are 8 | -- met: 9 | 10 | -- * Redistributions of source code must retain the above copyright notice, 11 | -- this list of conditions and the following disclaimer. 12 | -- * Redistributions in binary form must reproduce the above copyright 13 | -- notice, this list of conditions and the following disclaimer in the 14 | -- documentation and/or other materials provided with the distribution. 15 | -- * Neither the name of Oracle nor the names of its contributors may be used 16 | -- to endorse or promote products derived from this software without 17 | -- specific prior written permission. 18 | 19 | -- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 20 | -- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21 | -- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 | -- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 23 | -- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24 | -- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 | -- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 26 | -- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 27 | -- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28 | -- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29 | -- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | 31 | SET NAMES utf8mb4; 32 | SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 33 | SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 34 | SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'; 35 | 36 | DROP SCHEMA IF EXISTS sakila; 37 | CREATE SCHEMA sakila; 38 | USE sakila; 39 | 40 | -- 41 | -- Table structure for table `actor` 42 | -- 43 | 44 | CREATE TABLE actor ( 45 | actor_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 46 | first_name VARCHAR(45) NOT NULL, 47 | last_name VARCHAR(45) NOT NULL, 48 | last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 49 | PRIMARY KEY (actor_id), 50 | KEY idx_actor_last_name (last_name) 51 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 52 | 53 | -- 54 | -- Table structure for table `address` 55 | -- 56 | 57 | CREATE TABLE address ( 58 | address_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 59 | address VARCHAR(50) NOT NULL, 60 | address2 VARCHAR(50) DEFAULT NULL, 61 | district VARCHAR(20) NOT NULL, 62 | city_id SMALLINT UNSIGNED NOT NULL, 63 | postal_code VARCHAR(10) DEFAULT NULL, 64 | phone VARCHAR(20) NOT NULL, 65 | -- Add GEOMETRY column for MySQL 5.7.5 and higher 66 | -- Also include SRID attribute for MySQL 8.0.3 and higher 67 | /*!50705 location GEOMETRY */ /*!80003 SRID 0 */ /*!50705 NOT NULL,*/ 68 | last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 69 | PRIMARY KEY (address_id), 70 | KEY idx_fk_city_id (city_id), 71 | /*!50705 SPATIAL KEY `idx_location` (location),*/ 72 | CONSTRAINT `fk_address_city` FOREIGN KEY (city_id) REFERENCES city (city_id) ON DELETE RESTRICT ON UPDATE CASCADE 73 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 74 | 75 | -- 76 | -- Table structure for table `category` 77 | -- 78 | 79 | CREATE TABLE category ( 80 | category_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, 81 | name VARCHAR(25) NOT NULL, 82 | last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 83 | PRIMARY KEY (category_id) 84 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 85 | 86 | -- 87 | -- Table structure for table `city` 88 | -- 89 | 90 | CREATE TABLE city ( 91 | city_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 92 | city VARCHAR(50) NOT NULL, 93 | country_id SMALLINT UNSIGNED NOT NULL, 94 | last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 95 | PRIMARY KEY (city_id), 96 | KEY idx_fk_country_id (country_id), 97 | CONSTRAINT `fk_city_country` FOREIGN KEY (country_id) REFERENCES country (country_id) ON DELETE RESTRICT ON UPDATE CASCADE 98 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 99 | 100 | -- 101 | -- Table structure for table `country` 102 | -- 103 | 104 | CREATE TABLE country ( 105 | country_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 106 | country VARCHAR(50) NOT NULL, 107 | last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 108 | PRIMARY KEY (country_id) 109 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 110 | 111 | -- 112 | -- Table structure for table `customer` 113 | -- 114 | 115 | CREATE TABLE customer ( 116 | customer_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 117 | store_id TINYINT UNSIGNED NOT NULL, 118 | first_name VARCHAR(45) NOT NULL, 119 | last_name VARCHAR(45) NOT NULL, 120 | email VARCHAR(50) DEFAULT NULL, 121 | address_id SMALLINT UNSIGNED NOT NULL, 122 | active BOOLEAN NOT NULL DEFAULT TRUE, 123 | create_date DATETIME NOT NULL, 124 | last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 125 | PRIMARY KEY (customer_id), 126 | KEY idx_fk_store_id (store_id), 127 | KEY idx_fk_address_id (address_id), 128 | KEY idx_last_name (last_name), 129 | CONSTRAINT fk_customer_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE, 130 | CONSTRAINT fk_customer_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE 131 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 132 | 133 | -- 134 | -- Table structure for table `film` 135 | -- 136 | 137 | CREATE TABLE film ( 138 | film_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 139 | title VARCHAR(128) NOT NULL, 140 | description TEXT DEFAULT NULL, 141 | release_year YEAR DEFAULT NULL, 142 | language_id TINYINT UNSIGNED NOT NULL, 143 | original_language_id TINYINT UNSIGNED DEFAULT NULL, 144 | rental_duration TINYINT UNSIGNED NOT NULL DEFAULT 3, 145 | rental_rate DECIMAL(4,2) NOT NULL DEFAULT 4.99, 146 | length SMALLINT UNSIGNED DEFAULT NULL, 147 | replacement_cost DECIMAL(5,2) NOT NULL DEFAULT 19.99, 148 | rating ENUM('G','PG','PG-13','R','NC-17') DEFAULT 'G', 149 | special_features SET('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') DEFAULT NULL, 150 | last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 151 | PRIMARY KEY (film_id), 152 | KEY idx_title (title), 153 | KEY idx_fk_language_id (language_id), 154 | KEY idx_fk_original_language_id (original_language_id), 155 | CONSTRAINT fk_film_language FOREIGN KEY (language_id) REFERENCES language (language_id) ON DELETE RESTRICT ON UPDATE CASCADE, 156 | CONSTRAINT fk_film_language_original FOREIGN KEY (original_language_id) REFERENCES language (language_id) ON DELETE RESTRICT ON UPDATE CASCADE 157 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 158 | 159 | -- 160 | -- Table structure for table `film_actor` 161 | -- 162 | 163 | CREATE TABLE film_actor ( 164 | actor_id SMALLINT UNSIGNED NOT NULL, 165 | film_id SMALLINT UNSIGNED NOT NULL, 166 | last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 167 | PRIMARY KEY (actor_id,film_id), 168 | KEY idx_fk_film_id (`film_id`), 169 | CONSTRAINT fk_film_actor_actor FOREIGN KEY (actor_id) REFERENCES actor (actor_id) ON DELETE RESTRICT ON UPDATE CASCADE, 170 | CONSTRAINT fk_film_actor_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE RESTRICT ON UPDATE CASCADE 171 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 172 | 173 | -- 174 | -- Table structure for table `film_category` 175 | -- 176 | 177 | CREATE TABLE film_category ( 178 | film_id SMALLINT UNSIGNED NOT NULL, 179 | category_id TINYINT UNSIGNED NOT NULL, 180 | last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 181 | PRIMARY KEY (film_id, category_id), 182 | CONSTRAINT fk_film_category_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE RESTRICT ON UPDATE CASCADE, 183 | CONSTRAINT fk_film_category_category FOREIGN KEY (category_id) REFERENCES category (category_id) ON DELETE RESTRICT ON UPDATE CASCADE 184 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 185 | 186 | -- 187 | -- Table structure for table `film_text` 188 | -- 189 | -- InnoDB added FULLTEXT support in 5.6.10. If you use an 190 | -- earlier version, then consider upgrading (recommended) or 191 | -- changing InnoDB to MyISAM as the film_text engine 192 | -- 193 | 194 | -- Use InnoDB for film_text as of 5.6.10, MyISAM prior to 5.6.10. 195 | SET @old_default_storage_engine = @@default_storage_engine; 196 | SET @@default_storage_engine = 'MyISAM'; 197 | /*!50610 SET @@default_storage_engine = 'InnoDB'*/; 198 | 199 | CREATE TABLE film_text ( 200 | film_id SMALLINT NOT NULL, 201 | title VARCHAR(255) NOT NULL, 202 | description TEXT, 203 | PRIMARY KEY (film_id), 204 | FULLTEXT KEY idx_title_description (title,description) 205 | ) DEFAULT CHARSET=utf8mb4; 206 | 207 | SET @@default_storage_engine = @old_default_storage_engine; 208 | 209 | -- 210 | -- Triggers for loading film_text from film 211 | -- 212 | 213 | DELIMITER ;; 214 | CREATE TRIGGER `ins_film` AFTER INSERT ON `film` FOR EACH ROW BEGIN 215 | INSERT INTO film_text (film_id, title, description) 216 | VALUES (new.film_id, new.title, new.description); 217 | END;; 218 | 219 | 220 | CREATE TRIGGER `upd_film` AFTER UPDATE ON `film` FOR EACH ROW BEGIN 221 | IF (old.title != new.title) OR (old.description != new.description) OR (old.film_id != new.film_id) 222 | THEN 223 | UPDATE film_text 224 | SET title=new.title, 225 | description=new.description, 226 | film_id=new.film_id 227 | WHERE film_id=old.film_id; 228 | END IF; 229 | END;; 230 | 231 | 232 | CREATE TRIGGER `del_film` AFTER DELETE ON `film` FOR EACH ROW BEGIN 233 | DELETE FROM film_text WHERE film_id = old.film_id; 234 | END;; 235 | 236 | DELIMITER ; 237 | 238 | -- 239 | -- Table structure for table `inventory` 240 | -- 241 | 242 | CREATE TABLE inventory ( 243 | inventory_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT, 244 | film_id SMALLINT UNSIGNED NOT NULL, 245 | store_id TINYINT UNSIGNED NOT NULL, 246 | last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 247 | PRIMARY KEY (inventory_id), 248 | KEY idx_fk_film_id (film_id), 249 | KEY idx_store_id_film_id (store_id,film_id), 250 | CONSTRAINT fk_inventory_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE, 251 | CONSTRAINT fk_inventory_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE RESTRICT ON UPDATE CASCADE 252 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 253 | 254 | -- 255 | -- Table structure for table `language` 256 | -- 257 | 258 | CREATE TABLE language ( 259 | language_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, 260 | name CHAR(20) NOT NULL, 261 | last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 262 | PRIMARY KEY (language_id) 263 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 264 | 265 | -- 266 | -- Table structure for table `payment` 267 | -- 268 | 269 | CREATE TABLE payment ( 270 | payment_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 271 | customer_id SMALLINT UNSIGNED NOT NULL, 272 | staff_id TINYINT UNSIGNED NOT NULL, 273 | rental_id INT DEFAULT NULL, 274 | amount DECIMAL(5,2) NOT NULL, 275 | payment_date DATETIME NOT NULL, 276 | last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 277 | PRIMARY KEY (payment_id), 278 | KEY idx_fk_staff_id (staff_id), 279 | KEY idx_fk_customer_id (customer_id), 280 | CONSTRAINT fk_payment_rental FOREIGN KEY (rental_id) REFERENCES rental (rental_id) ON DELETE SET NULL ON UPDATE CASCADE, 281 | CONSTRAINT fk_payment_customer FOREIGN KEY (customer_id) REFERENCES customer (customer_id) ON DELETE RESTRICT ON UPDATE CASCADE, 282 | CONSTRAINT fk_payment_staff FOREIGN KEY (staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE 283 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 284 | 285 | 286 | -- 287 | -- Table structure for table `rental` 288 | -- 289 | 290 | CREATE TABLE rental ( 291 | rental_id INT NOT NULL AUTO_INCREMENT, 292 | rental_date DATETIME NOT NULL, 293 | inventory_id MEDIUMINT UNSIGNED NOT NULL, 294 | customer_id SMALLINT UNSIGNED NOT NULL, 295 | return_date DATETIME DEFAULT NULL, 296 | staff_id TINYINT UNSIGNED NOT NULL, 297 | last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 298 | PRIMARY KEY (rental_id), 299 | UNIQUE KEY (rental_date,inventory_id,customer_id), 300 | KEY idx_fk_inventory_id (inventory_id), 301 | KEY idx_fk_customer_id (customer_id), 302 | KEY idx_fk_staff_id (staff_id), 303 | CONSTRAINT fk_rental_staff FOREIGN KEY (staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE, 304 | CONSTRAINT fk_rental_inventory FOREIGN KEY (inventory_id) REFERENCES inventory (inventory_id) ON DELETE RESTRICT ON UPDATE CASCADE, 305 | CONSTRAINT fk_rental_customer FOREIGN KEY (customer_id) REFERENCES customer (customer_id) ON DELETE RESTRICT ON UPDATE CASCADE 306 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 307 | 308 | -- 309 | -- Table structure for table `staff` 310 | -- 311 | 312 | CREATE TABLE staff ( 313 | staff_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, 314 | first_name VARCHAR(45) NOT NULL, 315 | last_name VARCHAR(45) NOT NULL, 316 | address_id SMALLINT UNSIGNED NOT NULL, 317 | picture BLOB DEFAULT NULL, 318 | email VARCHAR(50) DEFAULT NULL, 319 | store_id TINYINT UNSIGNED NOT NULL, 320 | active BOOLEAN NOT NULL DEFAULT TRUE, 321 | username VARCHAR(16) NOT NULL, 322 | password VARCHAR(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, 323 | last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 324 | PRIMARY KEY (staff_id), 325 | KEY idx_fk_store_id (store_id), 326 | KEY idx_fk_address_id (address_id), 327 | CONSTRAINT fk_staff_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE, 328 | CONSTRAINT fk_staff_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE 329 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 330 | 331 | -- 332 | -- Table structure for table `store` 333 | -- 334 | 335 | CREATE TABLE store ( 336 | store_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, 337 | manager_staff_id TINYINT UNSIGNED NOT NULL, 338 | address_id SMALLINT UNSIGNED NOT NULL, 339 | last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 340 | PRIMARY KEY (store_id), 341 | UNIQUE KEY idx_unique_manager (manager_staff_id), 342 | KEY idx_fk_address_id (address_id), 343 | CONSTRAINT fk_store_staff FOREIGN KEY (manager_staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE, 344 | CONSTRAINT fk_store_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE 345 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 346 | 347 | -- 348 | -- View structure for view `customer_list` 349 | -- 350 | 351 | CREATE VIEW customer_list 352 | AS 353 | SELECT cu.customer_id AS ID, CONCAT(cu.first_name, _utf8mb4' ', cu.last_name) AS name, a.address AS address, a.postal_code AS `zip code`, 354 | a.phone AS phone, city.city AS city, country.country AS country, IF(cu.active, _utf8mb4'active',_utf8mb4'') AS notes, cu.store_id AS SID 355 | FROM customer AS cu JOIN address AS a ON cu.address_id = a.address_id JOIN city ON a.city_id = city.city_id 356 | JOIN country ON city.country_id = country.country_id; 357 | 358 | -- 359 | -- View structure for view `film_list` 360 | -- 361 | 362 | CREATE VIEW film_list 363 | AS 364 | SELECT film.film_id AS FID, film.title AS title, film.description AS description, category.name AS category, film.rental_rate AS price, 365 | film.length AS length, film.rating AS rating, GROUP_CONCAT(CONCAT(actor.first_name, _utf8mb4' ', actor.last_name) SEPARATOR ', ') AS actors 366 | FROM category LEFT JOIN film_category ON category.category_id = film_category.category_id LEFT JOIN film ON film_category.film_id = film.film_id 367 | JOIN film_actor ON film.film_id = film_actor.film_id 368 | JOIN actor ON film_actor.actor_id = actor.actor_id 369 | GROUP BY film.film_id, category.name; 370 | 371 | -- 372 | -- View structure for view `nicer_but_slower_film_list` 373 | -- 374 | 375 | CREATE VIEW nicer_but_slower_film_list 376 | AS 377 | SELECT film.film_id AS FID, film.title AS title, film.description AS description, category.name AS category, film.rental_rate AS price, 378 | film.length AS length, film.rating AS rating, GROUP_CONCAT(CONCAT(CONCAT(UCASE(SUBSTR(actor.first_name,1,1)), 379 | LCASE(SUBSTR(actor.first_name,2,LENGTH(actor.first_name))),_utf8mb4' ',CONCAT(UCASE(SUBSTR(actor.last_name,1,1)), 380 | LCASE(SUBSTR(actor.last_name,2,LENGTH(actor.last_name)))))) SEPARATOR ', ') AS actors 381 | FROM category LEFT JOIN film_category ON category.category_id = film_category.category_id LEFT JOIN film ON film_category.film_id = film.film_id 382 | JOIN film_actor ON film.film_id = film_actor.film_id 383 | JOIN actor ON film_actor.actor_id = actor.actor_id 384 | GROUP BY film.film_id, category.name; 385 | 386 | -- 387 | -- View structure for view `staff_list` 388 | -- 389 | 390 | CREATE VIEW staff_list 391 | AS 392 | SELECT s.staff_id AS ID, CONCAT(s.first_name, _utf8mb4' ', s.last_name) AS name, a.address AS address, a.postal_code AS `zip code`, a.phone AS phone, 393 | city.city AS city, country.country AS country, s.store_id AS SID 394 | FROM staff AS s JOIN address AS a ON s.address_id = a.address_id JOIN city ON a.city_id = city.city_id 395 | JOIN country ON city.country_id = country.country_id; 396 | 397 | -- 398 | -- View structure for view `sales_by_store` 399 | -- 400 | 401 | CREATE VIEW sales_by_store 402 | AS 403 | SELECT 404 | CONCAT(c.city, _utf8mb4',', cy.country) AS store 405 | , CONCAT(m.first_name, _utf8mb4' ', m.last_name) AS manager 406 | , SUM(p.amount) AS total_sales 407 | FROM payment AS p 408 | INNER JOIN rental AS r ON p.rental_id = r.rental_id 409 | INNER JOIN inventory AS i ON r.inventory_id = i.inventory_id 410 | INNER JOIN store AS s ON i.store_id = s.store_id 411 | INNER JOIN address AS a ON s.address_id = a.address_id 412 | INNER JOIN city AS c ON a.city_id = c.city_id 413 | INNER JOIN country AS cy ON c.country_id = cy.country_id 414 | INNER JOIN staff AS m ON s.manager_staff_id = m.staff_id 415 | GROUP BY s.store_id 416 | ORDER BY cy.country, c.city; 417 | 418 | -- 419 | -- View structure for view `sales_by_film_category` 420 | -- 421 | -- Note that total sales will add up to >100% because 422 | -- some titles belong to more than 1 category 423 | -- 424 | 425 | CREATE VIEW sales_by_film_category 426 | AS 427 | SELECT 428 | c.name AS category 429 | , SUM(p.amount) AS total_sales 430 | FROM payment AS p 431 | INNER JOIN rental AS r ON p.rental_id = r.rental_id 432 | INNER JOIN inventory AS i ON r.inventory_id = i.inventory_id 433 | INNER JOIN film AS f ON i.film_id = f.film_id 434 | INNER JOIN film_category AS fc ON f.film_id = fc.film_id 435 | INNER JOIN category AS c ON fc.category_id = c.category_id 436 | GROUP BY c.name 437 | ORDER BY total_sales DESC; 438 | 439 | -- 440 | -- View structure for view `actor_info` 441 | -- 442 | 443 | CREATE DEFINER=CURRENT_USER SQL SECURITY INVOKER VIEW actor_info 444 | AS 445 | SELECT 446 | a.actor_id, 447 | a.first_name, 448 | a.last_name, 449 | GROUP_CONCAT(DISTINCT CONCAT(c.name, ': ', 450 | (SELECT GROUP_CONCAT(f.title ORDER BY f.title SEPARATOR ', ') 451 | FROM sakila.film f 452 | INNER JOIN sakila.film_category fc 453 | ON f.film_id = fc.film_id 454 | INNER JOIN sakila.film_actor fa 455 | ON f.film_id = fa.film_id 456 | WHERE fc.category_id = c.category_id 457 | AND fa.actor_id = a.actor_id 458 | ) 459 | ) 460 | ORDER BY c.name SEPARATOR '; ') 461 | AS film_info 462 | FROM sakila.actor a 463 | LEFT JOIN sakila.film_actor fa 464 | ON a.actor_id = fa.actor_id 465 | LEFT JOIN sakila.film_category fc 466 | ON fa.film_id = fc.film_id 467 | LEFT JOIN sakila.category c 468 | ON fc.category_id = c.category_id 469 | GROUP BY a.actor_id, a.first_name, a.last_name; 470 | 471 | -- 472 | -- Procedure structure for procedure `rewards_report` 473 | -- 474 | 475 | DELIMITER // 476 | 477 | CREATE PROCEDURE rewards_report ( 478 | IN min_monthly_purchases TINYINT UNSIGNED 479 | , IN min_dollar_amount_purchased DECIMAL(10,2) 480 | , OUT count_rewardees INT 481 | ) 482 | LANGUAGE SQL 483 | NOT DETERMINISTIC 484 | READS SQL DATA 485 | SQL SECURITY DEFINER 486 | COMMENT 'Provides a customizable report on best customers' 487 | proc: BEGIN 488 | 489 | DECLARE last_month_start DATE; 490 | DECLARE last_month_end DATE; 491 | 492 | /* Some sanity checks... */ 493 | IF min_monthly_purchases = 0 THEN 494 | SELECT 'Minimum monthly purchases parameter must be > 0'; 495 | LEAVE proc; 496 | END IF; 497 | IF min_dollar_amount_purchased = 0.00 THEN 498 | SELECT 'Minimum monthly dollar amount purchased parameter must be > $0.00'; 499 | LEAVE proc; 500 | END IF; 501 | 502 | /* Determine start and end time periods */ 503 | SET last_month_start = DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH); 504 | SET last_month_start = STR_TO_DATE(CONCAT(YEAR(last_month_start),'-',MONTH(last_month_start),'-01'),'%Y-%m-%d'); 505 | SET last_month_end = LAST_DAY(last_month_start); 506 | 507 | /* 508 | Create a temporary storage area for 509 | Customer IDs. 510 | */ 511 | CREATE TEMPORARY TABLE tmpCustomer (customer_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY); 512 | 513 | /* 514 | Find all customers meeting the 515 | monthly purchase requirements 516 | */ 517 | INSERT INTO tmpCustomer (customer_id) 518 | SELECT p.customer_id 519 | FROM payment AS p 520 | WHERE DATE(p.payment_date) BETWEEN last_month_start AND last_month_end 521 | GROUP BY customer_id 522 | HAVING SUM(p.amount) > min_dollar_amount_purchased 523 | AND COUNT(customer_id) > min_monthly_purchases; 524 | 525 | /* Populate OUT parameter with count of found customers */ 526 | SELECT COUNT(*) FROM tmpCustomer INTO count_rewardees; 527 | 528 | /* 529 | Output ALL customer information of matching rewardees. 530 | Customize output as needed. 531 | */ 532 | SELECT c.* 533 | FROM tmpCustomer AS t 534 | INNER JOIN customer AS c ON t.customer_id = c.customer_id; 535 | 536 | /* Clean up */ 537 | DROP TABLE tmpCustomer; 538 | END // 539 | 540 | DELIMITER ; 541 | 542 | DELIMITER $$ 543 | 544 | CREATE FUNCTION get_customer_balance(p_customer_id INT, p_effective_date DATETIME) RETURNS DECIMAL(5,2) 545 | DETERMINISTIC 546 | READS SQL DATA 547 | BEGIN 548 | 549 | #OK, WE NEED TO CALCULATE THE CURRENT BALANCE GIVEN A CUSTOMER_ID AND A DATE 550 | #THAT WE WANT THE BALANCE TO BE EFFECTIVE FOR. THE BALANCE IS: 551 | # 1) RENTAL FEES FOR ALL PREVIOUS RENTALS 552 | # 2) ONE DOLLAR FOR EVERY DAY THE PREVIOUS RENTALS ARE OVERDUE 553 | # 3) IF A FILM IS MORE THAN RENTAL_DURATION * 2 OVERDUE, CHARGE THE REPLACEMENT_COST 554 | # 4) SUBTRACT ALL PAYMENTS MADE BEFORE THE DATE SPECIFIED 555 | 556 | DECLARE v_rentfees DECIMAL(5,2); #FEES PAID TO RENT THE VIDEOS INITIALLY 557 | DECLARE v_overfees INTEGER; #LATE FEES FOR PRIOR RENTALS 558 | DECLARE v_payments DECIMAL(5,2); #SUM OF PAYMENTS MADE PREVIOUSLY 559 | 560 | SELECT IFNULL(SUM(film.rental_rate),0) INTO v_rentfees 561 | FROM film, inventory, rental 562 | WHERE film.film_id = inventory.film_id 563 | AND inventory.inventory_id = rental.inventory_id 564 | AND rental.rental_date <= p_effective_date 565 | AND rental.customer_id = p_customer_id; 566 | 567 | SELECT IFNULL(SUM(IF((TO_DAYS(rental.return_date) - TO_DAYS(rental.rental_date)) > film.rental_duration, 568 | ((TO_DAYS(rental.return_date) - TO_DAYS(rental.rental_date)) - film.rental_duration),0)),0) INTO v_overfees 569 | FROM rental, inventory, film 570 | WHERE film.film_id = inventory.film_id 571 | AND inventory.inventory_id = rental.inventory_id 572 | AND rental.rental_date <= p_effective_date 573 | AND rental.customer_id = p_customer_id; 574 | 575 | 576 | SELECT IFNULL(SUM(payment.amount),0) INTO v_payments 577 | FROM payment 578 | 579 | WHERE payment.payment_date <= p_effective_date 580 | AND payment.customer_id = p_customer_id; 581 | 582 | RETURN v_rentfees + v_overfees - v_payments; 583 | END $$ 584 | 585 | DELIMITER ; 586 | 587 | DELIMITER $$ 588 | 589 | CREATE PROCEDURE film_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT) 590 | READS SQL DATA 591 | BEGIN 592 | SELECT inventory_id 593 | FROM inventory 594 | WHERE film_id = p_film_id 595 | AND store_id = p_store_id 596 | AND inventory_in_stock(inventory_id); 597 | 598 | SELECT COUNT(*) 599 | FROM inventory 600 | WHERE film_id = p_film_id 601 | AND store_id = p_store_id 602 | AND inventory_in_stock(inventory_id) 603 | INTO p_film_count; 604 | END $$ 605 | 606 | DELIMITER ; 607 | 608 | DELIMITER $$ 609 | 610 | CREATE PROCEDURE film_not_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT) 611 | READS SQL DATA 612 | BEGIN 613 | SELECT inventory_id 614 | FROM inventory 615 | WHERE film_id = p_film_id 616 | AND store_id = p_store_id 617 | AND NOT inventory_in_stock(inventory_id); 618 | 619 | SELECT COUNT(*) 620 | FROM inventory 621 | WHERE film_id = p_film_id 622 | AND store_id = p_store_id 623 | AND NOT inventory_in_stock(inventory_id) 624 | INTO p_film_count; 625 | END $$ 626 | 627 | DELIMITER ; 628 | 629 | DELIMITER $$ 630 | 631 | CREATE FUNCTION inventory_held_by_customer(p_inventory_id INT) RETURNS INT 632 | READS SQL DATA 633 | BEGIN 634 | DECLARE v_customer_id INT; 635 | DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL; 636 | 637 | SELECT customer_id INTO v_customer_id 638 | FROM rental 639 | WHERE return_date IS NULL 640 | AND inventory_id = p_inventory_id; 641 | 642 | RETURN v_customer_id; 643 | END $$ 644 | 645 | DELIMITER ; 646 | 647 | DELIMITER $$ 648 | 649 | CREATE FUNCTION inventory_in_stock(p_inventory_id INT) RETURNS BOOLEAN 650 | READS SQL DATA 651 | BEGIN 652 | DECLARE v_rentals INT; 653 | DECLARE v_out INT; 654 | 655 | #AN ITEM IS IN-STOCK IF THERE ARE EITHER NO ROWS IN THE rental TABLE 656 | #FOR THE ITEM OR ALL ROWS HAVE return_date POPULATED 657 | 658 | SELECT COUNT(*) INTO v_rentals 659 | FROM rental 660 | WHERE inventory_id = p_inventory_id; 661 | 662 | IF v_rentals = 0 THEN 663 | RETURN TRUE; 664 | END IF; 665 | 666 | SELECT COUNT(rental_id) INTO v_out 667 | FROM inventory LEFT JOIN rental USING(inventory_id) 668 | WHERE inventory.inventory_id = p_inventory_id 669 | AND rental.return_date IS NULL; 670 | 671 | IF v_out > 0 THEN 672 | RETURN FALSE; 673 | ELSE 674 | RETURN TRUE; 675 | END IF; 676 | END $$ 677 | 678 | DELIMITER ; 679 | 680 | SET SQL_MODE=@OLD_SQL_MODE; 681 | SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; 682 | SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; 683 | 684 | 685 | --------------------------------------------------------------------------------