Publicado el 09.11.2019 a las 09:22
Algunas sintaxis SQL frecuentes
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 column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
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
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
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
SELECT fecha, pedido FROM dbo.pedidos WHERE fecha =(select MAX(fecha) FROM dbo.pedidos)
SELECT * FROM ventas WHERE Date='2022-10-20T19:00:00.000'
SELECT * FROM pedidos WHERE caduca > '2015-01-23 00:00:00' ORDER BY caduca LIMIT 100 OFFSET 25
CREATE DATABASE IF NOT EXISTS [nombre_bdd] CHARACTER SET UTF8 COLLATE utf8_general_ci
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
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;
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
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 🖖