Intro SQL

This commit is contained in:
devfzn 2023-08-10 15:25:26 -04:00
parent 558ce4ddbf
commit 27f8a8ed08
Signed by: devfzn
GPG Key ID: E070ECF4A754FDB1
4 changed files with 457 additions and 0 deletions

View 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)

View 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');
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -45,3 +45,5 @@ primoridiales en programación con Javascript
- Desafío Conversor [Gitea](https://gitea.kickto.net/devfzn/desafio_conversor) - - Desafío Conversor [Gitea](https://gitea.kickto.net/devfzn/desafio_conversor) -
[Github](https://github.com/DevFzn/Desafio_Conversor) [Github](https://github.com/DevFzn/Desafio_Conversor)
- [Emprendimiento](./009_emprendimiento/) - [Emprendimiento](./009_emprendimiento/)
- [Spring Boot](./010_spring_boot/README.md)
- [Base de datos](./010_spring_boot/base_de_datos.md)