
-- Principales comandos DML (Data Manipulation Language) se utilizan para manipular los datos en una base de datos.
--SELECT: Se utiliza para recuperar datos de una o más tablas de la base de datos. 
SELECT columna1, columna2 FROM tabla WHERE condicion;

--INSERT: Se utiliza para agregar nuevos registros a una tabla.
INSERT INTO tabla (columna1, columna2) VALUES (valor1, valor2);

--UPDATE: Se utiliza para actualizar registros existentes en una tabla. ¡¡¡¡¡¡¡WHERE!!!!!!!
UPDATE tabla SET columna1 = valor1, columna2 = valor2 WHERE condicion;

--DELETE: Se utiliza para eliminar registros de una tabla.
DELETE FROM tabla WHERE condicion;

--REPLACE: En MySQL, REPLACE es similar a INSERT, pero si hay un registro existente con la misma clave primaria o única, se elimina antes de insertar el nuevo registro. Si no hay conflicto, se comporta igual que INSERT.
REPLACE INTO tabla (columna1, columna2) VALUES (valor1, valor2);

--LOAD DATA INFILE: Se utiliza para cargar datos de un archivo CSV o de texto en una tabla de la base de datos.
LOAD DATA INFILE 'archivo.csv' INTO TABLE tabla;


--SELECT
--SELECT DISTINCT  solo valores diferentes, no repetidos.

--Operadores WHERE establecer una condición (puede ser múltiple AND OR) y WHERE NOT.

= 	Igual
<> 	No igual (en algunas versiones de SQL es !=)
> 	Mayor que
< 	Menor que
>= 	Mayor o igual que
<= 	Menor o igual que
BETWEEN 	Entre un rango de valores
LIKE 	Buscar un patrón
IN 	Especifica múltiples posibles valores para una columna
LIMIT establecer un límite de filas

--LIKE para establecer patrones en combinación con WHERE
% 	Sustituye por cero o más caracteres  por%  %es   
_ 	Sustituye por un sólo carácter   prue_a
[caracteres] 	Establece y crea rangos de caracteres a encontrar
[^caracteres] ó [!caracteres] 	Establece y crea rangos de caracteres a evitar


SELECT *
FROM productos
WHERE precio BETWEEN 50 AND 100; -- Rango entre 50 y 100


SELECT * FROM Clientes
WHERE Ciudad LIKE '%[a-j]' --Que terminen en un rango entre a-j


SELECT *
FROM clientes
WHERE pais IN ('USA', 'Canadá', 'México'); -- Si coinciden con alguno de los valores


SELECT *
FROM clientes
WHERE id IN (SELECT cliente_id FROM pedidos WHERE total > 1000); -- Combinando dos SELECT

SELECT *
FROM productos
LIMIT 5 OFFSET 5; -- Limitidado a 5 registros y descartando los 5 primeros

-- LIMIT 10,5  o esta LIMIT 5 OFFSET 10


--ORDER BY (ASC|DESC)
--Ordenados según orden ascendente de NombreCliente y descendente de Ciudad
SELECT * FROM Clientes
ORDER BY NombreCliente DESC;

SELECT * FROM Clientes
ORDER BY NombreCliente ASC, Ciudad DESC;

-- ***********Más contenido************* --

--ALIAS: para abreviar nombres de tablas y columnas, o para renombrar columnas.
--COLUMNAS
SELECT nombre
AS nombre_ciudad
FROM ciudad;

--TABLAS
SELECT ci.nombre
FROM ciudad AS ci;

--ALIAS sin AS
SELECT nombre primer_nombre, apellido
FROM empleados;

--*******************

--FUNCIONES DE AGREGACIÓN
    COUNT: Calcula el número de filas en un conjunto de resultados. No cuenta los nulos.
    SUM: Calcula la suma de los valores en una columna.
    AVG: Calcula el promedio de los valores en una columna.
    MAX: Devuelve el valor máximo en una columna.
    MIN: Devuelve el valor mínimo en una columna.

| id_empleado | nombre   | departamento | salario |
|-------------|----------|--------------|---------|
| 1           | Juan     | Ventas       | 3000    |
| 2           | María    | Ventas       | 3500    |
| 3           | Pedro    | Recursos Hum | 4000    |
| 4           | Ana      | Finanzas     | 3800    |
| 5           | José     | Ventas       | 3200    |

--COUNT Calcula el número de filas en un conjunto de resultados. No cuenta los nulos.
SELECT COUNT(*) AS total_empleados
FROM empleados;
| total_empleados |
|-----------------|
| 5               |

--SUM Calcula la suma de los valores en una columna.
SELECT SUM(salario) AS salarios_empleados
FROM empleados;
| salarios_empleados |
|--------------------|
| 17500              |

--AVG Calcula el promedio de los valores en una columna.
SELECT AVG(salario) AS salario_promedio
FROM empleados;
| salario_promedio |
|------------------|
| 3500             |

--MAX Devuelve el valor máximo en una columna.
SELECT MAX(salario) AS salario_maximo
FROM empleados;
| salario_maximo   |
|------------------|
| 4000             |

--MIN Devuelve el valor mínimo en una columna.
SELECT MIN(salario) AS salario_minimo
FROM empleados;
| salario_minimo   |
|------------------|
| 3000             |
	
--**************	
--GROUP BY
-- Para agrupar filas que comparten un valor común en una o más columnas y para aplicar funciones de agregación.
--Agregación de datos - Salario promedio por departamento:
SELECT departamento, AVG(salario) AS salario_promedio
FROM empleados
GROUP BY departamento;
| departamento   | salario_promedio |
|----------------|------------------|
| Ventas         | 3233.33          |
| Recursos Hum   | 4000.00          |
| Finanzas       | 3800.00          |

--Agrupación por departamentos
SELECT departamento, COUNT(*) AS cantidad_empleados
FROM empleados
GROUP BY departamento;
| departamento   | cantidad_empleados |
|----------------|--------------------|
| Ventas         | 3                  |
| Recursos Hum   | 1                  |
| Finanzas       | 1                  |


--HAVING filtrar los resultados de una consulta que incluye una cláusula GROUP BY
--Filtrado de resultados
SELECT departamento, AVG(salario) AS salario_promedio --4
FROM empleados --1
GROUP BY departamento --2
HAVING AVG(salario) > 3500; --3
| departamento   | salario_promedio |
|----------------|------------------|
| Recursos Hum   | 4000             |
| Finanzas       | 3800             |

------------*********ORDEN*********-----------
--Orden de escritura       Orden de ejecución
      SELECT                   FROM 
      DISTINCT                 JOIN
      FROM                     WHERE
      JOIN                     GROUP BY
      WHERE                    HAVING
      GROUP BY                 SELECT
      HAVING                   DISTINCT
      ORDER BY                 ORDER BY
      LIMIT OFFSET             LIMIT OFFSET

