Intro SQL
This commit is contained in:
parent
558ce4ddbf
commit
27f8a8ed08
7
010_spring_boot/README.md
Normal file
7
010_spring_boot/README.md
Normal file
@ -0,0 +1,7 @@
|
||||
# Java y Spring Boot
|
||||
|
||||
Tablero en [trello](https://trello.com/b/gWJsG18e/g5-formaci%C3%B3n-spring-boot)
|
||||
|
||||
- [Curso](https://app.aluracursos.com/course/introduccion-sql-mysql-manipule-consulte-datos)
|
||||
Java y [bases de datos](./base_de_datos.md)
|
||||
|
448
010_spring_boot/base_de_datos.md
Normal file
448
010_spring_boot/base_de_datos.md
Normal file
@ -0,0 +1,448 @@
|
||||
# Java y Bases de Datos
|
||||
|
||||
Para desarrollar una aplicación más completa y robusta, es probable que se
|
||||
necesite manejar información de clientes y/o productos, que deben estar
|
||||
almacenadas de forma segura. Por lo tanto, es importante aprender a trabajar
|
||||
con una base de datos.
|
||||
|
||||
Este módulo desarrolla un mayor conocimiento acerca de bases de datos relacionales
|
||||
**MySQL**, la API de Java para el acceso a la base de datos llamada **JDBC**, y
|
||||
también acerca de la **JPA**, que facilita el desarrollo de la conexión a la base
|
||||
de datos.
|
||||
|
||||
El lenguaje **SQL**,funciona siguiendo **CRUD**, que es **C**reate **R**ead
|
||||
**U**pdate **D**elete.
|
||||
|
||||
La ***ANSI*** divide estos comandos en 3 grupos mayores:
|
||||
|
||||
- **DDL** Data Definition Language: se encarga de manipular todas las estructuras
|
||||
de las bases de datos en sí. Por ejemplo, el comando create para crear una base
|
||||
de datos o una tabla, etc.
|
||||
- **DML** Data Manipulation Lenguaje: lenguaje de manipulación de los datos. Select,
|
||||
para seleccionar unos datos, insert para insertar datos a las tablas, etc.
|
||||
- **DCL** Data Control Language: se encarga de la administración en sí de toda la
|
||||
estructura de la base de datos. Ejemplo, la administración de la base de datos, la
|
||||
administración de los accesos a usuarios de los logs, es toda la parte de políticas
|
||||
de crecimiento de la base de datos, etc.
|
||||
|
||||
#### Principles Ventajas
|
||||
|
||||
- Bajo costo de aprendizaje
|
||||
- Portabilidad
|
||||
- Longevidad
|
||||
- Comunicación
|
||||
- Libertad de elección
|
||||
|
||||
#### Principales Desventajas
|
||||
|
||||
- Falta de creatividad
|
||||
- NoSQL
|
||||
- Falta de mayor estructuración del lenguage
|
||||
|
||||
## MySQL
|
||||
|
||||
### Historía
|
||||
|
||||
Creada por *David Axmark*, *Allan Larsson*, *Michael Widenius* como **software libre**,
|
||||
desarrollaron su propia API de consultas y base de datos utilzando C++.
|
||||
El 2008 Sun Microsystems compró MySQL. El 2009 Oracle compró Sun Microsystems
|
||||
(JAVA y MySQL).
|
||||
|
||||
### Características
|
||||
|
||||
- Servidor robusto. Multi-access, data integrity, transaction control
|
||||
- Portabilidad. Linux, Windows. Acceso a datos usando DotNET, Python, Java, JS, PHP, etc
|
||||
- Multi-thread. Facilita la integración con Hardware. Mas escalabilidad
|
||||
- Almacenamiento. Prioriza Velocidad/Volumen
|
||||
- Velocidad. Más rápida, ideal para e-commerce, AWS/BiqQuery/Azure tienen
|
||||
instancias de MySQL
|
||||
- Seguridad
|
||||
- Capacidad. Hasta 65000TB
|
||||
- Aplicabilidad. Internet/Desktop/Corporativo
|
||||
- Logs. Registra todo. Recuperación, Réplica de servidores
|
||||
|
||||
|
||||
### Como está organizada una base de datos
|
||||
|
||||
|
||||
```mermaid
|
||||
%%{init: {'theme':'dark', 'flowchart': {'curve': 'stepBefore'}}}%%
|
||||
graph LR
|
||||
A[(DB)]--entidades-->B(Tabla)
|
||||
B--def. al crear tabla-->C(Campos: cantidad y tipos)
|
||||
C--Texto-->D[char varchar text etc]
|
||||
C--Números-->E[int bigint smallint float bool etc]
|
||||
C--Fecha-->F[date datetime timestamp etc]
|
||||
B-->G(Registros)
|
||||
G--ilimitados*-->H[Datos contenidos en los campos]
|
||||
D--unica/comb. única-->J{Clave Primaria y Foránea}
|
||||
E--unica/comb. única-->J
|
||||
F--unica/comb. única-->J
|
||||
```
|
||||
|
||||
#### Schemes
|
||||
|
||||
```mermaid
|
||||
%%{init: {'theme': 'dark','themeVariables': {'clusterBkg': '#2b2f38'}, 'flowchart': {'curve': 'monotoneY'}}}%%
|
||||
flowchart
|
||||
subgraph Esquemas
|
||||
DB[(Base de Datos)]
|
||||
subgraph esqA[Esquema A]
|
||||
f(tabla)
|
||||
style f fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||
g(tabla)
|
||||
style g fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||
end
|
||||
subgraph esqB[Esquema B]
|
||||
c(tabla)
|
||||
style c fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||
d(tabla)
|
||||
style d fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||
e(tabla)
|
||||
style e fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||
end
|
||||
subgraph esqC[Esquema C]
|
||||
a(tabla)
|
||||
style a fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||
b(tabla)
|
||||
style b fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||
end
|
||||
DB-->esqA
|
||||
DB-->esqB
|
||||
DB-->esqC
|
||||
end
|
||||
```
|
||||
|
||||
#### Views
|
||||
|
||||
- Las vistas consulta de `n` tablas al mismo tiempo
|
||||
- Alto costo de procesamiento
|
||||
- Unen tablas a travez de un ***join***
|
||||
- Creación de filtros
|
||||
|
||||
```mermaid
|
||||
%%{init: {'theme': 'dark','themeVariables': {'clusterBkg': '#2b2f38'}, 'flowchart': {'curve': 'monotoneY'}}}%%
|
||||
flowchart
|
||||
subgraph Vistas
|
||||
DB[(Base de Datos)]
|
||||
subgraph esqA[Tablas]
|
||||
c[tabla a]-->d
|
||||
style c fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||
d[tabla b]-->e
|
||||
style d fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||
e[tabla c]
|
||||
style e fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||
end
|
||||
subgraph vista[Vista]
|
||||
end
|
||||
DB-->esqA
|
||||
vista--query-->esqA
|
||||
end
|
||||
```
|
||||
|
||||
#### Procedures
|
||||
|
||||
Procedimientos
|
||||
|
||||
- Lógica estructurada con lenguage nativo SQL `if, while, for...`
|
||||
|
||||
```sql
|
||||
IF a > 0 THEN
|
||||
X= y + z
|
||||
z = ISNTR (z + 1)
|
||||
SELECT * FROM alpha
|
||||
PUT ...
|
||||
...
|
||||
```
|
||||
|
||||
#### Trigger
|
||||
|
||||
Disparador
|
||||
|
||||
- Avisos automáticos cuando hay algún tipo de cambio en la base de datos o
|
||||
en la tabla
|
||||
- Ejecuta una función o procedimiento cuando se cumple la condición del ***trigger***
|
||||
|
||||
### Esquema global de una DB
|
||||
|
||||
```mermaid
|
||||
%%{init: {'theme': 'dark','themeVariables': {'clusterBkg': '#2b2f38'}, 'flowchart': {'curve': 'monotoneY'}}}%%
|
||||
flowchart TB
|
||||
subgraph Esquema general
|
||||
DB[(Base de Datos)]
|
||||
subgraph Scheme
|
||||
direction LR
|
||||
T(Tables)-->V{{Views}}
|
||||
G(Triggers)-->P{{Procedures}}
|
||||
end
|
||||
DB-->Scheme
|
||||
end
|
||||
```
|
||||
|
||||
## Manipulando la base de datos
|
||||
|
||||
### Crear base de datos
|
||||
|
||||
```sql
|
||||
CREATE DATABASE jugos;
|
||||
```
|
||||
|
||||
```sql
|
||||
CREATE SCHEMA `jugos2` DEFAULT CHARACTER SET utf8;
|
||||
```
|
||||
|
||||
### Eliminar base de datos
|
||||
|
||||
```sql
|
||||
DROP SCHEMA jugos;
|
||||
```
|
||||
|
||||
### Crear tabla
|
||||
|
||||
#### Números enteros
|
||||
|
||||
| Tipo | Valor en Bytes | Menor Valor | Menor Valor (unsigned) | Mayor valor | Mayor valor (unsigned) |
|
||||
| - | - | - | - | - | - |
|
||||
| **TINYINT** | 1 | -128 | 0 | 127 | 255 |
|
||||
| **SMALLINT** | 2 | -32768 | 0 | 32767 | 65535 |
|
||||
| **MEDIUMINT** | 3 | -8388608 | 0 | 83888607 | 16777215 |
|
||||
| **INT** | 4 | -2147483648 | 0 | 2147483647 | 4294967295 |
|
||||
| **BIGINT** | 8 | -2⁶³ | 0 | 2⁶³-1 | 2⁶⁴-1 |
|
||||
|
||||
#### Números decimales
|
||||
|
||||
|
||||
| Tipo | Precisión Bytes | Tipo |
|
||||
| - | - | - |
|
||||
| **FLOAT¹** | 4 | Simple |
|
||||
| **DOUBLE¹** | 8 | Doble |
|
||||
|
||||
> [¹] coma flotante: ej. si se declara un `FLOAT (6,4)` y se incluye el número
|
||||
`76.00009` el valor almacenado será `76.0001`
|
||||
|
||||
| Tipo | Cantidad de dígitos |
|
||||
| - | - |
|
||||
| **DECIMAL** o<br>**NUMERIC** | 65 |
|
||||
|
||||
> Es un nro. fijo, si se declara un `DECIMAL(5,3)` solo se podrá almacenar desde
|
||||
`-99.999` hasta `99.999`
|
||||
|
||||
| Tipo | Cantidad de Bits |
|
||||
| - | - |
|
||||
| **BIT** | 64 |
|
||||
|
||||
> ej. `BIT(1)` puede ser `0` o `1`,
|
||||
`BIT(3)` puede ser `000`, `001`, `010`, `011`, `100`,`101`,`110`,`111`.
|
||||
|
||||
#### Atributos de los campos numéricos
|
||||
|
||||
- **SIGNED** o **UNSIGNED**: con o sin signo
|
||||
- **ZEROFILL**: llena los espacios con ceros, ej. `INT(5)` al almacenar `54`, el
|
||||
campo queda `00054`
|
||||
- **AUTO_INCREMENT**: incremento secuencial, ej, `1`, `2`, `3`, `4`,...; `2`,
|
||||
`4`,`8`,...
|
||||
- **OUT OF RANGE**: Error cuando los valores salen de los límites
|
||||
|
||||
#### Fecha y hora
|
||||
|
||||
- **DATE**: `1000-01-01` hasta `9999-12-31`
|
||||
- **DATETIME**: `1000-01-01 00:00:00` hasta `9999-12-31 23:59:59`
|
||||
- **TIMESTAMP**: `1970-01-01 00:00:01 UTC` hasta `2038-01-19 UTC`
|
||||
- **TIME**: `-838:59:59` hasta `839:59:59`
|
||||
- **YEAR**: `1901` hasta `2155` (se puede expresar en formad ode 2 o 4 dígitos)
|
||||
|
||||
#### String
|
||||
|
||||
- **CHAR**: cadena de caracteres con valor fijo de **0 a 255**. Ej.
|
||||
`CHAR(4) = "aa"` -> `"··aa"`
|
||||
- **VARCHAR**: cadena de caracteres con valor variable de **0 a 255**.
|
||||
Ej. `VARCHAR(4) = "aa"` -> `"aa"`
|
||||
- **BINARY**: cadena de caracteres con valor fijo de **0 a 255** (Con números
|
||||
binarios - bits)
|
||||
- **VARBINARY**: cadena de caracteres con valor variable de **0 a 255** (Con
|
||||
números binarios - bits)
|
||||
- **BLOB**: Binarios largos -> `TINYBLOB`, `MEDIUMBLOB`, `LONGBLOG`
|
||||
- **ENUM**: Para definir una lista predefinida -> `Talla ENUM(´pequeño´,
|
||||
´medio´,´grande´)`
|
||||
|
||||
#### Atributos de los campos string
|
||||
|
||||
**SET** y **COLLATE**: Tipo de conjunto de caracteres que van a ser aceptados ->
|
||||
`utf-8`,`utf-16`, ...
|
||||
|
||||
#### Campos espaciales (GPS)
|
||||
|
||||
- **GEOMETRY** -> Area
|
||||
- **LINESTRING** -> Línea
|
||||
- **POINT** -> Punto
|
||||
- **POLYGON** -> Area
|
||||
|
||||
----
|
||||
|
||||
## Prácticas
|
||||
|
||||
### Empresa de jugos
|
||||
|
||||
Desde el área de registro de clientes, comentan que la información más
|
||||
relevante de un cliente es el DNI, nombre completo, dirección, edad, sexo,
|
||||
límite de crédito, volumen mínimo de jugo que puede comprar, y si ya ha
|
||||
realizado su primera compra.
|
||||
|
||||
#### Creación de tabla **`cliente`**, query manual
|
||||
|
||||
```sql
|
||||
-- show databases;
|
||||
use jugos;
|
||||
CREATE TABLE cliente(
|
||||
dni VARCHAR(20),
|
||||
nombre VARCHAR(150),
|
||||
direccion1 VARCHAR(150),
|
||||
direccion2 VARCHAR(150),
|
||||
barrio VARCHAR(50),
|
||||
cuidad VARCHAR(50),
|
||||
estado VARCHAR(50),
|
||||
codpost VARCHAR(10),
|
||||
edad SMALLINT,
|
||||
sexo VARCHAR(1),
|
||||
limite_credito FLOAT,
|
||||
volumen_compra FLOAT,
|
||||
primera_compra BIT(1)
|
||||
);
|
||||
```
|
||||
|
||||
#### Creación de tabla **`producto`**, interfáz workbench
|
||||
|
||||
![img](./jugos/tabla_producto.png)
|
||||
|
||||
#### Creación de tabla **`vendedor`**
|
||||
|
||||
```sql
|
||||
use jugos;
|
||||
CREATE TABLE vendedor(
|
||||
matricula VARCHAR(4),
|
||||
nombre VARCHAR(100),
|
||||
comision FLOAT
|
||||
);
|
||||
```
|
||||
|
||||
#### Elimnar tabla
|
||||
|
||||
```sql
|
||||
use jugos;
|
||||
-- CREATE TABLE vendedor2(
|
||||
-- matricula VARCHAR(4),
|
||||
-- nombre VARCHAR(100),
|
||||
-- comision FLOAT
|
||||
-- );
|
||||
|
||||
DROP TABLE vendedor2;
|
||||
```
|
||||
|
||||
#### Insertar registros
|
||||
|
||||
```sql
|
||||
USE jugos;
|
||||
|
||||
INSERT INTO producto(id_producto, nombre, envase, volumen, sabor, precio)
|
||||
VALUES ('695594', 'Festival de Sabores', 'Botella PET', '1.5 Litros', 'Asaí',
|
||||
18.51);
|
||||
|
||||
INSERT INTO producto(id_producto, nombre, envase, volumen, sabor, precio)
|
||||
VALUES ('1041119', 'Línea Citrus', 'Botella de Vidrio', '700 ml', 'Lima',
|
||||
4.90);
|
||||
```
|
||||
|
||||
```sql
|
||||
USE jugos;
|
||||
INSET INTO vendedor(matricula, nombre, comision) VALUES(
|
||||
'0233', 'Joan Geraldo de la Fonseca', 0.1);
|
||||
|
||||
INSET INTO vendedor(matricula, nombre, comision) VALUES(
|
||||
'0235', 'Máricio Almeida Silva', 0.08);
|
||||
|
||||
INSET INTO vendedor(matricula, nombre, comision) VALUES(
|
||||
'0236', 'Cláudia Morais', 0.08);
|
||||
```
|
||||
|
||||
#### Modificar registros
|
||||
|
||||
```sql
|
||||
UPDATE vendedor SET comision = 0.11 WHERE matricula = '0236';
|
||||
|
||||
UPDATE vendedor SET nombre = 'Joan Geraldo de la Fonseca'
|
||||
WHERE matricula = '0233';
|
||||
```
|
||||
|
||||
#### Eliminar registros
|
||||
|
||||
```sql
|
||||
DELETE FROM producto WHERE id_producto = '1041119';
|
||||
```
|
||||
Precaución de **Siempre** usar clausula `WHERE`, de lo contrario se eliminan
|
||||
todos los registros de la tabla
|
||||
|
||||
|
||||
#### Modificar tabla
|
||||
|
||||
Modificar tabla `producto` para que el campo `id_producto` sea una llave primaria
|
||||
|
||||
```sql
|
||||
ALTER TABLE producto ADD PRIMARY KEY(id_producto);
|
||||
```
|
||||
|
||||
Modificar tabla `cliente` para agregar el campo `fecha_nacimiento` como `DATE`
|
||||
|
||||
```sql
|
||||
ALTER TABLE cliente ADD COLUMN(fecha_nacimiento DATE);
|
||||
```
|
||||
|
||||
#### Seleccionar registros
|
||||
|
||||
```sql
|
||||
SELECT nombre, matricula FROM vendedor;
|
||||
|
||||
-- Filtrando resultados
|
||||
SELECT nombre, matricula FROM vendedor WHERE matricula='00236';
|
||||
```
|
||||
|
||||
Filtro por edad
|
||||
|
||||
```sql
|
||||
-- Mayor que
|
||||
SELECT * FROM cliente WHERE edad < 27;
|
||||
|
||||
-- Menor que
|
||||
SELECT * FROM cliente WHERE edad > 27;
|
||||
|
||||
-- Menor o igual que
|
||||
SELECT * FROM cliente WHERE edad <= 27;
|
||||
|
||||
-- Distinto de
|
||||
SELECT * FROM cliente WHERE edad <> 27;
|
||||
```
|
||||
|
||||
> este tipo de filtro también funciona con strings
|
||||
|
||||
Filtro por rango `BETWEEN`
|
||||
|
||||
```sql
|
||||
SELECT * FROM producto WHERE precio BETWEEN 28.49 AND 28.52;
|
||||
```
|
||||
|
||||
Por año
|
||||
|
||||
```sql
|
||||
SELECT * FROM cliente WHERE fecha_nacimiento = '1995-01-13';
|
||||
|
||||
SELECT * FROM cliente WHERE YEAR(fecha_nacimiento) = 1995;
|
||||
|
||||
SELECT * FROM cliente WHERE DAY(fecha_nacimiento) = 20;
|
||||
```
|
||||
|
||||
#### Filtros compuestos
|
||||
|
||||
```sql
|
||||
SELECT * FROM producto
|
||||
WHERE (precio >= 15 AND precio <= 25) or (envase = 'Botella PET');
|
||||
```
|
||||
|
BIN
010_spring_boot/jugos/tabla_producto.png
Normal file
BIN
010_spring_boot/jugos/tabla_producto.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
@ -45,3 +45,5 @@ primoridiales en programación con Javascript
|
||||
- Desafío Conversor [Gitea](https://gitea.kickto.net/devfzn/desafio_conversor) -
|
||||
[Github](https://github.com/DevFzn/Desafio_Conversor)
|
||||
- [Emprendimiento](./009_emprendimiento/)
|
||||
- [Spring Boot](./010_spring_boot/README.md)
|
||||
- [Base de datos](./010_spring_boot/base_de_datos.md)
|
||||
|
Loading…
Reference in New Issue
Block a user