¿Qué es SQL? Introducción con ejemplos

SQL puede utilizarse tanto para crear bases de datos como para consultar bases de datos existentes, y forma parte del repertorio estándar de desarrolladores web, analistas de datos e investigadores. En comparación con otros lenguajes de programación, SQL es especial. Te mostramos cómo está estructurado este lenguaje y cómo funciona.

Dominios web baratos

Dominios tan originales como tus ideas.
Registra tu dominio con IONOS y disfruta de las funciones integrales que tenemos para ofrecerte.

Correo incluido
Certificado SSL
Asistencia 24/7

¿Qué es SQL?

SQL es un “Structured Query Language”, o “Lenguaje de Consultas Estructurado” en español. Desarrollado a mediados de los años 70, SQL se ha convertido en el lenguaje de programación estándar para aplicaciones de bases de datos. SQL es mucho más que simplemente las consultas que le dan nombre: este lenguaje representa la interfaz predominante para la interacción con datos relacionales o para sistemas de gestión de bases de datos relacionales.

Para poder entender el desarrollo de SQL es esencial saber que el lenguaje se basa en el “álgebra relacional”. Se trata de una teoría matemática para estructurar los datos y determinar los resultados de las consultas. Muchas de las características especiales de SQL como lenguaje de programación se derivan de esta base matemática.

SQL como interfaz para el control del RDBMS

SQL se utiliza como interfaz de comunicación con un sistema de gestión de bases de datos relacionales (RDBMS). Los propios usuarios pueden introducir y ejecutar el código SQL directamente mediante una interfaz basada en texto o integrarlo en los accesos del API. También existen interfaces gráficas de usuario que traducen las interacciones del usuario a código SQL. En cualquier caso, el código SQL es ejecutado por el RDBMS. Un RDBMS consta de varios componentes:

  1. Motor de almacenamiento o de base de datos: gestiona los datos a nivel técnico.
  2. Interfaz de programación API (puede haber más de una) – permite el control programático del RDBMS y proporciona acceso a los datos.
  3. Interfaces de usuario (GUI/CLI) – permiten el control humano del RDBMS y el acceso a los datos.
  4. Base(s) de datos real(es) – organizan los datos a un nivel lógico.

Un RDBMS comprende una jerarquía de capas de almacenamiento, desde el servidor de la base de datos hasta el valor almacenado en un campo. SQL contiene comandos para operar con todas ellas. He aquí una visión general de la jerarquía de los objetos RDBMS:

Objeto RDBMS Contiene
Servidor Bases de datos
Bases de datos Tablas
Tablas Registros
Registros Campos
Campos Valores tipificados

SQL es un lenguaje específico y declarativo

SQL es distinto a la mayoría de los lenguajes de programación establecidos. Por un lado, SQL se creó antes de la era de Internet y, por otro, es un “lenguaje específico de dominio” (“domain specific language”, DSL). El contrapunto son los “General Purpose Languages”, que se pueden utilizar en muchas situaciones distintas. Los ejemplos más conocidos de los General Purpose Languages son C, C++, C#, Java, JavaScript, Python y PHP.

Entre los lenguajes utilizados actualmente para la web, solo hay otro lenguaje específico de dominio, el CSS. Curiosamente, tanto SQL como CSS son lenguajes de programación “declarativos”. Es decir, el programador describe el resultado que desea, y el sistema que ejecuta el código se encarga de que se consiga ese resultado. Esto contrasta con la programación “imperativa”, que es más común, donde se especifican explícitamente en el código los pasos que hay que dar para alcanzar los objetivos.

El alcance del lenguaje SQL se define en varias normas ISO/IEC. Por otra parte, también existen dialectos de los principales proveedores de las diferentes implementaciones de SQL. Por eso mismo MySQL/MariaDB, PostgreSQL, Oracle SQL y Microsoft SQL Server tienen cada uno sus propios comandos o variantes de comandos.

¿Para qué se utiliza SQL?

SQL puede utilizarse para controlar todos los aspectos de un RDBMS. Aunque generalmente se habla de SQL como un único lenguaje, sus funciones abarcan al menos cinco sublenguajes con nombre distinto. Cada uno de los cinco lenguajes incluye sus propios comandos SQL que abarcan el sublenguaje correspondiente. Veamos algunos ejemplos:

Sublenguaje SQL Comandos Ejemplos
Data Definition Language (DDL) Comandos para definir el esquema de la base de datos: crear, modificar y eliminar tablas de la base de datos; definir claves primarias, claves externas y limitaciones CREATE TABLE, DROP TABLE
Data Manipulation Language (DML) Comandos para la manipulación de datos: modificar, insertar y eliminar registros INSERT, UPDATE
Data Query Language (DQL) Comandos para consultar y preparar los datos SELECT
Data Control Language (DCL) Comandos para la gestión de derechos GRANT, REVOKE
Transaction Control Language (TCL) Comandos para el control de transacciones COMMIT, ROLLBACK

Aprender la sintaxis de SQL con ejemplos

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. Antes de ver la sintaxis de SQL en detalle, veamos primero cómo se ejecuta el código SQL.

Consejo

Aprende a usar MySQL de forma sencilla – con nuestro tutorial de MySQL.

¿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:

  1. 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.

  1. 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 sólo 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

Estructuras sintácticas en SQL

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 RDBMS lo ignora -- Comentario hasta el final de la línea / /* Si procede, comentario de varias líneas */
Nota

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.

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:

  1. Crear el modelo
  2. Definir el esquema
  3. Introducir los registros de datos
  4. 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:

  1. “Un propietario es potencialmente dueño de varios coches”
  2. “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 );
Nota

Echa 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);

Definir 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;

Haz 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;

Implementar 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 );

Guarda 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');

Para verificarlo, emite la tabla de clientes:

SELECT * FROM Customers;

El 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 );

Aquí, 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');

Emite los pedidos para comprobar:

SELECT * FROM Orders;

Por ú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 );

Introduce 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);

Emite los productos pedidos a modo de comprobación:

SELECT * FROM OrderItems;

Realizar 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;

Por ú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;

¿Cuáles son las ventajas y desventajas de SQL?

Ventajas de SQL

La mayor ventaja de SQL es su elevada popularidad y su uso generalizado. En lo que respecta a soluciones de bases de datos, este lenguaje es un estándar en la industria, por lo que es relativamente fácil encontrar programadores de SQL con experiencia. Además, asignando correctamente los derechos puedes dar acceso al sistema a los analistas sin que corran el riesgo de cometer errores.

Con el álgebra relacional, el lenguaje tiene una sólida base matemática. Esto permite almacenar de manera óptima los datos, pero para ello hace falta un buen conocimiento de la tecnología, así como ser habilidoso en el modelado. Con un esquema bien diseñado, es posible saber más de los datos si se hacen las consultas adecuadas.

Desventaja de SQL: alta complejidad del lenguaje

Una de las principales desventajas de SQL es la gran complejidad del lenguaje. Mientras que un lenguaje de programación como Python da de sí con menos de 40 comandos, SQL comprende cientos de comandos y cláusulas. Por si fuera poco, muchos de ellos dependen específicamente de su implementación.

Para crear una base de datos con SQL es necesario partir de una serie de supuestos sobre los datos que se van a almacenar. Estos supuestos se definen en el esquema de la base de datos y, en el mejor de los casos, garantizan la calidad de los datos. Sin embargo, si el esquema está mal diseñado, se puede prever tener problemas constantemente. Los cambios en el esquema durante su funcionamiento también pueden suponer un grave problema.

En el caso de las bases de datos SQL con muchos accesos o volúmenes de datos muy grandes, optimizar el rendimiento es de todo menos trivial. La distribución geográfica se considera un gran desafío y requiere buenos especialistas y enfoques sofisticados como la partición y la fragmentación.

Desventaja de SQL: Impedance Mismatch

La metodología orientada a objetos (OOP) se utiliza mucho en la programación. Todos los lenguajes OOP tienen en común que los datos se encapsulan como objetos. Normalmente, un programa OOP está formado por sistemas de objetos interconectados. Además de los datos, los objetos adoptan un “comportamiento” con sus métodos, que se heredan a través de las jerarquías de clases.

En cambio, el enfoque relacional es fundamentalmente diferente: los datos se distribuyen entre varias tablas. No es posible modelar el comportamiento de los objetos. En su lugar, se utilizan consultas y limitaciones de los valores de los campos. Las peculiaridades de la programación orientada a objetos no son trasladables 1:1 a las estructuras de las bases de datos relacionales. Haciendo un símil a un fenómeno de ingeniería eléctrica, se habla de “Impedance Mismatch”.

Se utilizan los llamados mapeos objeto-relacionales (object-relational mapping, ORM) para reducir la brecha entre OOP y los RDBMS basados en SQL. El ORM es una capa de traducción que instancia objetos según sea necesario y les proporciona información sobre la base de datos o bien introduce información de los objetos en la base de datos.

¿Cuáles son las posibles alternativas a SQL?

Los sistemas de gestión de bases de datos relacionales (RDBMS) y, por tanto, SQL, han sido la tecnología de bases de datos dominante durante décadas. Hoy en día existen muchas alternativas con diferentes grados de solapamiento con los RDBMS de SQL. Veamos tres alternativas comunes:

PostgreSQL

PostgreSQL es un potente sistema de gestión de bases de datos objeto-relacionales (ORDBMS). Además de usar SQL como lenguaje de consulta, soporta directamente los conceptos básicos de la programación orientada a objetos. Las jerarquías de objetos, la herencia y el comportamiento de los objetos pueden utilizarse sin necesidad del mapeo objeto-relacional (object-relational mapping, ORM). Al ser el usuario quien define y compone los tipos de datos, la complejidad de los esquemas y las consultas se reduce.

SQLite

Con SQLite, tienes a tu disposición una base de datos SQL incrustada bajo una licencia de código abierto. La base de datos SQL reducida se integra como una biblioteca y se ejecuta directamente en el navegador y en los dispositivos móviles. SQLite destaca por la reducida complejidad de su sistema; toda la base de datos está disponible como un único archivo binario.

NoSQL

El término NoSQL se refiere a una familia de DBMS no relacionales. En lugar de modelar los datos primariamente como campos en tablas, se utilizan diferentes enfoques. Normalmente, las soluciones NoSQL son menos complejas y ofrecen una mejor escalabilidad y optimización del rendimiento. Además, suele ser más fácil cambiar el esquema o almacenar los datos de forma flexible durante el funcionamiento. Por otro lado, puede haber menos garantías en cuanto a la calidad de los datos.

Entre las soluciones NoSQL más comunes se incluyen:

Utilizamos cookies propias y de terceros para mejorar nuestros servicios y mostrarle publicidad relacionada con sus preferencias mediante el análisis de sus hábitos de navegación. Si continua navegando, consideramos que acepta su uso. Puede obtener más información, o bien conocer cómo cambiar la configuración de su navegador en nuestra. Política de Cookies.