Ayuda y recursos SQL

Algunas sintaxis SQL frecuentes

09.11.2019 a las 10:22

Ayuda y recursos SQL

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

Crear base de datos

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

Consultas con tablas indexadas

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

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 

Consultas con fechas

Obtener filas por fecha sin importar la hora (suponiendo que tu campo de fecha es datetime)

Si tenemos un campo datetime y queremos filtrar por ese campo sin importar la hora, la consulta sería:

SELECT *
        FROM ventas
        WHERE DATE(fecha)='2021-03-23'

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)
  

Obtener los datos con una fecha mayor a una dada

  • MySQL

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

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 🖖

Servicios

Software

IoT

Digitalización

Aplicaciones móviles

Consultoría

fjmduran.com v0.1.2