Ayuda y recursos SQL

Publicado el 09.11.2019 a las 09:22

Ayuda y recursos SQL

⚫ SELECT

🟣 Consultando tablas indexadas

🟣 Creando campos calculados

🟣 Creando campos con un switch o select case

🟣 Creando consultas sobre subconsultas

⚫ Fechas

🟣 Últimos registros según un campo de fecha

🟣 MS SQL Server

🟣 MySQL

Ayuda y recursos SQL

Algunas sintaxis SQL frecuentes

¿Qué es SQL?

SQL (por sus siglas en inglés Structured Query Language) es un lenguaje de dominio específico utilizado en programación, diseñado para administrar, y recuperar información de sistemas de gestión de bases de datos relacionales.


Para más información puedes consulta este artículo al respecto de Wikipedia

SELECT

Consultando tablas indexadas

SELECT column_name(s)
        FROM table1
        INNER JOIN table2
        ON table1.column_name = table2.column_name;

Creando campos calculados

Podemos hacer operaciones con campos, tanto si son números como textos.


Imagina que tenemos una tabla de productos y queremos calcular su precio con el IVA y queremos otro campo, que llamaremos description, que nos diga qué producto es y cuál es su proveedor

SELECT (products.price * 1.21) as priceWithIVA, CONCAT(products.name, ' ', provider.name)
FROM products INNER JOIN providers ON providers.providerId = productos.productId
        

Creando campos con un switch o select case 🤯

Podemos crear un campo en función de los valores de un determinado campo.


Imagina que tenemos la tabla de productos y queremos crear un campo buy en función del valor de la columna de stock.

SELECT stock
CASE WHEN stock = 0 THEN 'BUY RIGHT NOW' 
WHEN stock = 1 THEN 'ONLY ONE' 
ELSE 'OK' as buy
FROM products 
        

Creando consultas sobre subconsultas

Imagina que tengo dos tablas, una de productos que está ligada a otra tabla de proveedores.


Supón que queremos obtener los proveedores donde tengo más de 10 productos.


La forma de resolver esto sería hacer primero una consulta donde obtengo el total de los productos y a esa consulta hacerle un where para filtrar por los que tenga más de 10. Al lío 👇


Con la siguiente consulta obtengo los productos que tengo de cada proveedor

SELECT proveedor.nombre, COUNT(proveedor.proveedorId) as Total
FROM productos
INNER JOIN proveedor ON proveedor.proveedorId = producto.proveedorId
GROUP BY proveedor.nombre
        

A la consulta anterior le agrego el alias de MiTabla y a esa "tabla" le puedo hacer la consulta que quieras, mira:

SELECT nombre, Total FROM
  (SELECT proveedor.nombre, COUNT(proveedor.proveedorId) as Total
  FROM productos
  INNER JOIN proveedor ON proveedor.proveedorId = producto.proveedorId
  GROUP BY proveedor.nombre) as MiTabla
WHERE MiTabla.Total > 10
        

Fechas

Obtener los últimos objetos de una tabla según un campo de fecha

  SELECT fecha, pedido
  FROM dbo.pedidos 
  WHERE fecha =(select MAX(fecha) FROM dbo.pedidos)
  

MS SQL Server

SELECT *
FROM ventas
WHERE Date='2022-10-20T19:00:00.000'

MySQL

  SELECT * 
  FROM pedidos 
  WHERE caduca > '2015-01-23 00:00:00' 
  ORDER BY caduca LIMIT 100 OFFSET 25
  

Crear base de datos

CREATE DATABASE IF NOT EXISTS [nombre_bdd] CHARACTER SET UTF8 COLLATE utf8_general_ci

Llaves foráneas

Las llaves foráneas se usan para crear dependencias entre tablas

El campo que se relacionará de cada una de las tablas a relacionar debe ser del mismo tipo y tamaño para evitar haciendo conversiones

Podemos elegir dos tipo de comportamiento a la hora de borrar o actualizar un registro padre

  • En cascada

    Si se elimina un registro padre, se eliminarán todos los registros hijos.

    Por ejemplo, imaina que tenemos dos tablas, una de productos y otro de proveedores. La tabla padre será proveedores, y los productos serán hijos porque a cada producto se le asigna un proveedor.

    El borrado en cascada lo que haría es que si elimino un proveedor, automáticamente se eliminarás todos los productos (hijos) de ese proveedor

    ALTER TABLE productos ADD CONSTRAINT producto_impuesto FOREIGN KEY (id_impuesto) REFERENCES impuestos(id_impuesto) ON DELETE CASCADE
    
  • Restrictivo

    En el ejemplo anterior de las tablar productos y proveedores, lo que hará es que no se podrá eliminar un proveedor, hasta que primero se eliminen todos los productos de ese proveedor.

    El comportamiento restrictivo es el que viene por defecto

    ALTER TABLE productos ADD CONSTRAINT producto_proveedor FOREIGN KEY (id_proveedor) REFERENCES proveedores(id_proveedor) ON DELETE RESTRICT 
    

Modo seguro

El modo seguro es para evitar el tan temido DELETE FROM nombre_tabla y no especificar el id del elemento que quieres borrar, con lo que eliminarías todos los datos de la tabla.

Para evitarlo los motores de base de datos cuentan con un modo seguro el cuál te exige que en funcionese DELETE y UPDATE se especifique el WHERE.

Pero hay situaciones en los que quieres actualizar un campo de todos los registros de una tabla, por ejemplo, añadimos un nuevo campo a una base de datos que ya está en producción y queremos que ese valo por defecto esté en un valor, usaríamos

UPDATE tabla SET nuevoCampo=valor

La línea anterior no se ejecutaría porque el modo seguro lo bloquearía, para hacerlo habría que desactivarlo. No obstante, te recomiendo que simpre lo tengas activado por lo que si deseas hacer una instrucción como la anterior primero desactives el modo seguro, después ejecutes la instrucción y a continuación vuelvas a activar el modo seguro:

  SET SQL_SAFE_UPDATES = 0;
  UPDATE tabla SET nombreCampo=valorCampo;
  SET SQL_SAFE_UPDATES = 1;
  

Consulta con campo calculado

Con este tipo de consultas podremos hacer cálculos y devolver datos ya tratados.

Por ejemplo, imagina que tienes una tabla de productos con su precio y quieres obtener además su precio con el IVA (21%), pues sería:

SELECT nombre_producto, precio, ROUND(precio*1.21,2) AS precio_con_iva 
        FROM productos

Consultas de agrupación o totales

Funciones de agregado

  • AVG; calcula el promedio de un campo
  • COUNT; cuenta los registros de un campo
  • SUM; suma los valores de un campo
  • MAX; devuelve el máximo de un campo
  • MIN; devuelve el mínimo de un campo

Por ejemplo, si quiesiera obtener el total de la venta número 60 la instrucción SQL a realizar sería, teniendo una tabla para las ventas y una tabla para las posiciones de las ventas donde hay un campo de id_venta sería:

SELECT id_venta, SUM(uds*pvp_venta) AS total 
        FROM posiciones_venta 
        WHERE id_venta=60 GROUP BY id_venta

Algo más complejo, imagina que queremos obtener el total de las ventas en un día para una selección de fecha, entonces las instrucción sería:

SELECT round(SUM(uds*pvp_venta),2) AS total, date_format(ventas.fecha,'%d/%m/%Y') as fechaFormateada
        FROM ventas
        INNER JOIN posiciones_venta ON posiciones_venta.id_venta = ventas.id_venta
        INNER JOIN comercios ON ventas.id_comercio=comercios.id_comercio
        WHERE DATE(fecha) between DATE(?) AND DATE(?) GROUP BY DATE(ventas.fecha)
        ORDER BY fecha

Más compleajo aún, cálculo de los ingresos y los gastos:

SELECT round(SUM(uds*pvp_venta*((100-dto_venta)/100)),2) AS ingresos, 
          round(SUM(uds*pvp_compra*((100-dto_compra)/100)*((100+iva_compra)/100)+(uds*pvp_venta*((100-dto_venta)/100)*(1-(100/(100+iva_venta))))),2) AS gastos, 
          date_format(ventas.fecha,'%d/%m/%Y') as fechaFormateada
          FROM ventas
          INNER JOIN posiciones_venta ON posiciones_venta.id_venta = ventas.id_venta
          INNER JOIN comercios ON ventas.id_comercio=comercios.id_comercio
          WHERE DATE(fecha) between DATE(?) AND DATE(?) GROUP BY DATE(ventas.fecha)
          ORDER BY fecha

Hasta luego 🖖

fjmduran.com v 17.0.1