¿Qué es SQL? Introducción con ejemplos
La sintaxis del lenguaje de programación SQL se basa en el álgebra relacional y, por tanto, se distingue de otros lenguajes de programación. Para aprender a usar SQL, se requiere tener conocimientos de la sintaxis del lenguaje y con ejemplos ilustrativos se vuelve más fácil.
Conceptos básicos de la sintaxis SQL
En general, la sintaxis es la “notación” de un lenguaje de programación. La sintaxis determina qué tipos de estructuras básicas de código existen y cómo pueden unirse entre sí. Entender la sintaxis es un requisito fundamental para poder leer y escribir código en el respectivo lenguaje de programación.
Las estructuras sintácticas más importantes de SQL son las sentencias SQL con las respectivas cláusulas que estas puedan contener. Aunque técnicamente no es del todo correcto, ambas se denominan generalmente “comandos SQL”. Además, hay otras construcciones sintácticas que presentamos para una mayor claridad:
Término | Equivalente en inglés | Explicación | Ejemplo |
---|---|---|---|
Sentencia | Statement | Ordena al DBMS que realice una acción; termina con un punto y coma | CREATE TABLE People;
|
Cláusula | Clause | Modifica una sentencia; solo puede utilizarse dentro de una sentencia | WHERE, HAVING
|
Expresión | Expression | Al ser evaluada, devuelve un determinado valor | 6 * 7
|
Identificador | Identifier | Nombre de un objeto, una variable o un procedimiento de la base de datos; puede ser cualificado o no cualificado | dbname.tablename / tablename
|
Predicado | Predicate | Expresión que se evalúa como TRUE, FALSE o UNKNOWN
|
Age < 42
|
Consulta | Query | Sentencia especial; retorna el conjunto de resultados de los registros | SELECT Name FROM People WHERE Age < 42;
|
Función | Function | Procesa uno o más valores; normalmente crea un nuevo valor | UPPER('text') -- Devuelve 'TEXT'
|
Comentario | Comment | Se utiliza para realizar comentarios en el código SQL; el RBDMS lo ignora | -- Comentario hasta el final de la línea / /*Si procede, comentario de varias líneas*/
|
Los comandos SQL, como SELECT y CREATE TABLE, suelen ir en mayúsculas. Sin embargo, SQL no distingue entre mayúsculas y minúsculas. Se trata únicamente de una convención muy extendida.
¿Cómo se ejecuta el código SQL?
El código SQL existe como código fuente dentro de un archivo de texto, y solo puede cobrar vida en un entorno de ejecución adecuado. Un intérprete de SQL lee el código fuente y lo convierte en acciones de un RDBMS. Hay dos enfoques principales al respecto:
- Ejecutar código SQL en una sesión interactiva
Con este enfoque, el código SQL se introduce o se copia y pega directamente en una ventana de texto. Entonces, se ejecuta el código SQL y se muestra el resultado. Ahí, el usuario tiene la oportunidad de modificar el código y volver a ejecutarlo. La rápida secuencia de manipulación del código y visualización de los resultados hace que este enfoque sea el más adecuado para aprender y crear consultas complejas.
- Ejecutar el código SQL como script
Con este enfoque, se ejecuta línea por línea todo un archivo con código SQL. El feedback solo se transmite al usuario al final de la ejecución. Este enfoque es el más adecuado para automatizar procesos e importar copias de seguridad de bases de datos MySQL con MySQL Dump.
Interfaz | Descripción | Ejemplos |
---|---|---|
Interfaz de línea de comandos (CLI) | Interfaz basada en texto; el código SQL se introduce y ejecuta, el resultado se muestra en forma de texto | mysql, psql, mysqlsh |
Interfaz gráfica de usuario (GUI) | El código SQL se introduce en una ventana de texto y/o se genera en respuesta a la interacción del usuario; el código SQL se ejecuta, el resultado se muestra en forma de tablas | phpMyAdmin, MySQL Workbench, HeidiSQL |
Interfaz de programación de aplicaciones (API) | Permite la comunicación directa con un RDBMS; el código SQL se introduce como string en el código del respectivo lenguaje de programación y se ejecuta; los resultados están disponibles como estructuras de datos para su posterior uso | PHP Data Objects (PDO), Connector/J (Java), Connector/Python, C API |
Utilizar SQL como ejemplo para configurar la gestión de productos
La forma más fácil de aprender un lenguaje de programación es escribir y ejecutar el código uno mismo. Para ello, primero debemos crear una minibase de datos para poder ejecutar consultas en ella. Después, utilizaremos el Online SQL interpreter del sitio web sql.js. Accede al enlace del sitio web y sustituye el código SQL ya introducido por el código de nuestros ejemplos. Ejecuta el código fragmento a fragmento para obtener los resultados mostrados.
Procedimiento básico para configurar una base de datos SQL
A modo de ejemplo, vamos a crear un sistema de gestión de productos comerciales, tal y como se utilizaría en una tienda física u online. Para ello, vamos a definir los requisitos a grandes rasgos:
- Hay una serie de productos de los que tenemos un número determinado de existencias en todo momento.
- Nuestra cartera consta de varios clientes.
- Un cliente realiza un pedido que puede contener varios productos.
- Guardamos la fecha y la persona que realiza cada pedido, además de los productos y la cantidad que se ha pedido de cada uno.
Primero convertimos estos requisitos en una descripción abstracta y luego en código SQL. Seguimos el siguiente guion:
- Crear el modelo
- Definir el esquema
- Introducir los registros de datos
- Definir las consultas
Crear un modelo de entidades y relaciones
El primer paso se realiza en papel o con herramientas específicas de modelado. Recogemos información sobre el sistema que vamos a modelar y extraemos sus entidades y relaciones de él. Esto suele hacerse con un diagrama de Entity Relationship (ER).
¿Qué entidades hay y cómo se relacionan? Las entidades son clases de cosas. En nuestro ejemplo de gestión de productos existen las entidades producto, cliente y pedido. Cada entidad requiere una tabla. Debido a las características especiales del modelo relacional, pueden añadirse otras tablas para modelar las relaciones. Para entender todo esto bien y aplicarlo correctamente, hace falta experiencia.
Una cuestión fundamental es cómo se relacionan las entidades entre sí. Para ello, han de considerarse los dos sentidos de una relación y distinguir entre singular y plural. Utilizando el ejemplo de la relación propietario-coche:
- “Un propietario es potencialmente dueño de varios coches”
- “Un coche pertenece únicamente a un propietario”
Surgen tres posibles modelos de relación entre dos entidades:
Relación | Entidades | Desde la izquierda | Desde la derecha |
---|---|---|---|
Relación 1:1 | Coche:Matrícula | „Un coche tiene únicamente una matrícula“ | „Una matrícula pertenece únicamente a un coche“ |
Relación 1:n | Propietario:Coche | „Un propietario es potencialmente dueño de varios coches“ | „Un coche pertenece únicamente a un propietario“ |
Relación m:n | Coche:Carretera | „Un coche circula por varias carreteras“ | „En una carretera circulan varios coches“ |
Implementar productos
El primer paso es implementar la tabla de productos. Para ello, hay que definir un esquema, introducir los registros de datos y ejecutar algunas consultas sencillas a modo de prueba. Entremos en detalle para cada uno de los pasos.
Definir el esquema
El principal comando SQL utilizado para definir las tablas de la base de datos es CREATE TABLE. Este comando crea una tabla, le asigna un nombre y define las propiedades de las columnas. Al mismo tiempo, se definen los tipos de datos y, si es necesario, las limitaciones de los valores que se van a almacenar:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products ( product_id int, product_name text, stocked int, price int );
sqlEcha mano de una sentencia DROP TABLE IF EXISTS antes de definir la tabla para eliminar cualquier tabla que existiera previamente y permitir que el mismo código SQL pueda ejecutarse varias veces sin generar mensajes de error.
Introducir registros de datos
Crea varios registros de prueba y luego utiliza tanto el comando SQL INSERT INTO como la función VALUES para rellenar los campos:
INSERT INTO Products VALUES (10, 'ABC Product', 74, 1050);
INSERT INTO Products VALUES (20, 'KLM Product', 23, 750);
INSERT INTO Products VALUES (30, 'XYZ Product', 104, 350);
sqlDefinir las consultas
Redacta una consulta sencilla para comprobar el estado de la tabla de productos. Usa el comando SELECT FROM y emite la tabla completa:
SELECT * FROM Products;
sqlHaz también una consulta algo más compleja que calcule el valor total de los productos almacenados:
SELECT product_name AS 'Name', (stocked * price) AS 'Value' FROM Products;
sqlImplementar el resto de tablas
En la siguiente sección tendrás que crear el resto de tablas necesarias. Procede de la misma manera que para la tabla de productos. Primero, hay que crear la tabla de clientes:
DROP TABLE IF EXISTS Customers;
CREATE TABLE Customers ( customer_id int, customer_name text, contact text );
sqlGuarda los registros de datos de los clientes. En este ejemplo, guardamos los de dos clientes:
INSERT INTO Customers VALUES (100, 'EDC Customer', 'ED@example.com');
INSERT INTO Customers VALUES (200, 'WVU Customer', 'WV@example.com');
sqlPara verificarlo, emite la tabla de clientes:
SELECT * FROM Customers;
sqlEl siguiente paso es crear la tabla de pedidos:
DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders ( order_id int, customer_id int, order_date text );
sqlAquí, introducimos tres pedidos a modo de ejemplo. Fíjate que asignamos un identificador de clave primaria como primer valor de los registros. Sin embargo, el segundo valor es el identificador de clientes ya existentes a modo de claves externas. Además, también almacenamos la fecha del pedido:
INSERT INTO Orders VALUES (1000, 100, '2022-05-03');
INSERT INTO Orders VALUES (1001, 100, '2022-05-04');
INSERT INTO Orders VALUES (1002, 200, '2022-05-08');
sqlEmite los pedidos para comprobar:
SELECT * FROM Orders;
sqlPor último, hace falta una tabla para los productos contenidos en un pedido y su número. Se trata de una relación m:n ya que un pedido puede contener varios productos y un producto puede aparecer en varios pedidos. Define una tabla que contenga los identificadores de los pedidos y los productos como claves externas:
DROP TABLE IF EXISTS OrderItems;
CREATE TABLE OrderItems ( orderitem_id int, order_id int, product_id int, count int );
sqlIntroduce algunos productos pedidos. Selecciona los identificadores (ID) de los pedidos y los productos para que haya un pedido con dos productos y otro con un solo producto:
INSERT INTO OrderItems VALUES (10001, 1000, 10, 3);
INSERT INTO OrderItems VALUES (10002, 1000, 20, 2);
INSERT INTO OrderItems VALUES (10003, 1002, 30, 12);
sqlEmite los productos pedidos a modo de comprobación:
SELECT * FROM OrderItems;
sqlRealizar consultas complejas
Si has ejecutado todos los fragmentos de código mostrados hasta el momento, deberías ser capaz de entender la estructura de nuestra base de datos de prueba. Pasemos ahora a consultas más complejas que demuestran el potencial del lenguaje SQL. Primero, haremos una consulta que unifique datos repartidos por varias tablas. Utilizaremos un comando SQL JOIN para unir los datos de la tabla de clientes con la de pedidos. Al hacerlo, nombramos algunas de las columnas y establecemos que el identificador del cliente coincida como una condición JOIN. Ten en cuenta que utilizamos identificadores cualificados para distinguir las columnas de las dos tablas:
SELECT customers.customer_name as 'Customer', customers.customer_id, orders.order_id, orders.order_date AS 'Date' FROM Customers JOIN Orders ON Orders.customer_id = Customers.customer_id ORDER BY Customers.customer_id;
sqlPor último, pero no por ello menos importante, utilizamos otro comando JOIN para calcular el coste total de los productos pedidos:
SELECT OrderItems.order_id, OrderItems.orderitem_id AS 'Order Item', Products.product_name AS 'Product', Products.price AS 'Unit Price', OrderItems.count AS 'Count', (OrderItems.count * Products.price) AS 'Total' FROM OrderItems JOIN Products ON OrderItems.product_id = Products.product_id;
sqlSi deseas saber qué es SQL, necesitas ayuda con problemas específicos del lenguaje de bases de datos o simplemente quieres ampliar tus conocimientos, te recomendamos los siguientes artículos: