SQL -siglas de Structured Query Language-, es el lenguaje de consultas a bases de datos, que nos permitirá crear, modificar, consultar y eliminar tanto bases de datos como sus tablas y registros, desde el shell interactivo de MySQL y también desde Python.
Como todo lenguaje informático, posee su propia sintaxis, tipos de datos y elementos.
En este curso, abordaremos los conceptos básicos sobre SQL que nos permitan desarrollar aplicaciones de media complejidad, sin profundizar en el lenguaje en sí, sino solo en aquellos aspectos mínimamente necesarios relacionados con MySQL.
11.2.1. Tipos de datos más comunes (recomendados)
La siguiente tabla, muestra los tipos de datos más comunes, aceptados por versiones la versión 5.0.3 o superior, de MySQL.
Tipo de dato | Denominación | Especificaciones | Ejemplo |
---|---|---|---|
Entero | INT(N) |
N = cantidad de dígitos |
INT(5) |
Número decimal | DECIMAL(N, D) |
N = cantidad de dígitos totales, D = cantidad de decimales |
DECIMAL(10, 2) |
Booleano | BOOL |
BOOL |
|
Fecha | DATE |
DATE |
|
Fecha y hora | DATETIME |
DATETIME |
|
Fecha y hora automática | TIMESTAMP |
TIMESTAMP |
|
Hora | TIME |
TIME |
|
Año | YEAR(D) |
D = cantidad de dígitos (2 o 4) |
YEAR(4) |
Cadena de longitud fija | CHAR(N) |
N = longitud de la cadena (entre 0 y 255) |
CHAR(2) |
Cadena de longitud variable | VARCHAR(N) |
N = longitud máxima de la cadena (entre 0 y 65532) |
VARCHAR(100) |
Bloque de texto de gran longitud variable | BLOB |
BLOB |
11.2.2. Sintáxis básica de las sentencias SQL
Una sentencia SQL (denominada query en la jerga informática), es una instrucción escrita en lenguaje SQL. Veremos aquí, el tipo de sentencias más habituales.
11.2.2.1. Crear tablas en una base de datos
Sintaxis:
CREATE TABLE nombre_de_la_tabla(
nombre_del_campo TIPO_DE_DATO,
nombre_de_otro_campo TIPO_DE_DATO
);
Ejemplo:
CREATE TABLE productos(
producto VARCHAR(125),
descripcion BLOB,
precio DECIMAL(6, 2),
en_stock BOOL
);
Explicación:
- Crear una nueva tabla llamada
productos
(CREATE TABLE productos;
) - Crear un campo llamado producto, de tipo cadena de texto de longitud variable, con una longitud máxima de 125 caracteres (
producto VARCHAR(125),
). - Crear un campo llamado
descripcion
, de tipo bloque de texto de gran longitud (descripcion BLOB,
). - Crear un campo
precio
de tipo numérico de longitud máxima de 6 digítos de los cuales, solo 2 pueden ser decimales (precio DECIMAL(6, 2),
). - Crear un campo llamado
en_stock
del tipo booleano (en_stock BOOL
).
11.2.2.2. Insertar datos en una tabla
Sintaxis:
INSERT INTO
nombre_de_la_tabla(campo1, campo2, campo10..)
VALUES(dato1, dato2, dato10...);
Ejemplo:
INSERT INTO
productos(producto, precio, en_stock)
VALUES('Bolsa de dormir para alta montaña', 234.65, TRUE);
Explicación:
- Insertar un nuevo registro en los campos
producto
,precio
yen_stock
de la tablaproductos
(INSERT INTO productos(producto, precio, en_stock)
). - Con los valores
Bolsa de dormir para alta montaña
,234.65
yTRUE
, respectivamente en cada uno de los campos indicados (VALUES('Bolsa de dormir para alta montaña', 234.65, TRUE);
).
11.2.2.3. Seleccionar registros
Sintaxis:
SELECT campo1, campo2, campo10
FROM tabla;
Ejemplo:
SELECT producto, precio
FROM productos;
Explicación:
- Seleccionar los campos
producto
yprecio
(SELECT producto, precio
). - De la tabla
productos
(FROM productos;
).
11.2.2.4. Modificar registros
Sintaxis:
UPDATE tabla
SET campo1 = valor,
campo2 = valor,
campo10 = valor;
Ejemplo:
UPDATE productos
SET en_stock = FALSE,
precio = 0;
Explicación:
- Actualizar la tabla
productos
(UPDATE productos
). - Modificar el campo
en_stock
por falso (SET en_stock = FALSE,
). - Y el campo precio a
0
(precio = 0;
).
11.2.2.5. Eliminar registros
Sintaxis:
DELETE FROM tabla;
Ejemplo:
DELETE FROM productos;
Explicación:
- Eliminar todos los registros de la tabla
productos
(DELETE FROM productos;
).
11.2.3. Consultas avanzadas
Si bien no veremos aquí consultas realmente complejas, ya que el curso se basa en el lenguaje de programación Python y no, en el lenguaje de consulta SQL, haremos un rápido paseo, por las opciones disponibles en SQL para sentencias más complejas que las anteriores.
11.2.3.1. La cláusula WHERE
Las sentencias en SQL, se componen de cláusulas. Y WHERE
es una de ellas. La cláusula WHERE
nos permite filtrar registros en una sentencia SQL.
Esta cláusula, funciona de forma similar a la comparación de expresiones en Python, utilizando los siguientes operadores de comparación:
Operador | Descripción | Operador | Descripción |
---|---|---|---|
> |
mayor que | < |
menor que |
= |
igual que | <> |
distinto que |
>= |
mayor o igual que | <= |
menor o igual que |
BETWEEN n1 AND n2 |
entre n1 y n2 |
IS NULL |
es nulo |
IS TRUE |
es verdadero | IS FALSE |
es falso |
IN(valor1, valor2, va...) |
contiene |
Por supuesto, tambien admite operadores lógicos:
AND
(y)NOT
(negación)OR
(o)
Veamos algunos ejemplos:
Seleccionar productos donde precio sea menor que 1000:
SELECT producto,
precio
FROM productos
WHERE precio < 1000;
Aumentar el 10% del precio de los productos, que actualmente se encuentren entre 150 y 200:
UPDATE productos
SET precio = (precio * 1.10)
WHERE precio BETWEEN 150 AND 200;
Seleccionar productos donde en_stock
no sea falso
SELECT producto,
precio
FROM productos
WHERE en_stock IS NOT FALSE;
Eliminar productos cuyos precios sean 100, 200 y/o 300 y además, en_stock
sea falso o producto
sea nulo:
DELETE
FROM productos
WHERE precio IN(100, 200, 300)
AND (en_stock IS FALSE
OR producto IS NULL);
Modificar en_stock
a verdadero donde precio sea menor que 50 y producto
no sea nulo:
UPDATE productos
SET en_stock = TRUE
WHERE precio < 50
AND en_stock IS NOT NULL;
11.2.3.2. Ordenando consultas: la cláusula ORDER BY
Es posible además, ordenar los resultados de una consulta, en forma ascendente (ASC
) o descendente (DESC
):
SELECT producto,
descripcion,
precio
FROM productos
WHERE precio BETWEEN 1 AND 50
AND en_stock IS NOT FALSE
ORDER BY precio DESC;
También es posible, ordenar los resultados de la consulta, por más de un campo:
SELECT producto,
descripcion,
precio
FROM productos
WHERE precio BETWEEN 1 AND 50
AND en_stock IS NOT FALSE
ORDER BY precio DESC,
producto ASC;
11.2.4. Alias de tablas y campos
Otra posibilidad que nos da el lenguaje SQL, es utilizar alias para el nombre de los campos y las tablas. Estos alias se asignan mediante la palabra clave reservada, AS
:
SELECT producto AS 'Nombre del Producto',
descripcion AS Detalles,
precio AS Importe
FROM productos AS p
WHERE precio BETWEEN 1 AND 50
AND en_stock IS NOT FALSE
ORDER BY precio DESC,
producto ASC;
Nota Nótese que los alias que contengan caracteres extraños, deben ser encerrados entre comillas simples.
11.2.5. Funciones del lenguaje SQL de MySQL
Es posible también, utilizar diversas funciones propias del lenguaje SQL -ya sea estándar o de MySQL- a fin de poder obtener los datos con cierto formato. Veremos aquellas de uso más frecuente.
Contar la cantidad de registros: COUNT()
SELECT COUNT(producto) AS Cantidad
FROM productos;
Sumar totales: SUM()
SELECT SUM(precio) AS Total
FROM productos;
Concatenar cadenas: CONCAT()
SELECT producto,
CONCAT('USD ', precio, '.-') AS Precio
FROM productos;
Nótese que las cadenas de caracteres deben encerrarse entre comillas simples y que el operador de concatenación para esta función, es la coma.
Convertir a minúsculas y mayúsculas: LCASE()
y UCASE()
SELECT UCASE(producto),
LCASE(descripcion)
FROM productos;
Reemplazar datos: REPLACE()
SELECT REPLACE(descripcion, '\n', '<br/>') AS Descripcion
FROM productos;
Reemplaza \n
por <br/>
.
Obtener los primeros o últimos caracteres: LEFT()
y RIGHT()
SELECT LEFT(producto, 50)
FROM productos;
Redondear números: ROUND()
SELECT ROUND(precio, 2)
FROM productos;
Retornará los precios con 2 decimales
Obtener solo la fecha de un campo DATETIME
o TIMESTAMP
: DATE()
SELECT DATE(campo_datetime)
FROM tabla;
Obtener una fecha formateada: DATE_FORMAT()
SELECT DATE_FORMAT(campo_fecha, '%d/%m/%Y')
FROM tabla;
Obtener el registro con el valor máximo y mínimo: MAX()
y MIN()
Retorna el producto con el precio más caro:
SELECT MAX(precio)
FROM productos;
Retorna el producto con el precio más barato
SELECT MIN(precio)
FROM productos;