Artículo original escrito por Sameer Khoja
Artículo original What is SQL? What is a Database? Relational Database Management Systems (RDBMS) Explained in Plain English.
Traducido y adaptado por andres-torres

Las Bases de Datos pueden ser complicadas de entender. Sin embargo, son esenciales en programación full-stack y en construcción de servicios back-end que almacenan datos.

En este artículo, estaremos desenmascarando SQL, Bases de Datos, así cómo sistemas de bases de datos relacionales. También se emplearán algunas analogías en ejemplos, incluyendo  Harry Potter y algunas de las clases que toma en Hogwarts.

Antes de sumergirnos en los términos principales, definamos qué es una Base de Datos.

Una Base de Datos es un conjunto estructurado de datos, almacenado en una computadora, siendo, por lo general; accesible de múltiples formas.

Términos claves.

A continuación, se presentan algunos términos que pasaremos a aclarar:

  • SBDR: Sistemas de Bases de Datos Relacionales. Este framework es la base de MySQL.
  • SQL: Acrónimos en Inglés de "Structured Query Language", es decir, Lenguaje de Consulta Estructurado.
  • Tablas: Objetos de Base de Datos que contienen datos. Supongamos que buscamos crear una base de datos (en inglés), posibles nombres de una tabla serían los siguientes: "Students" , o "Teachers", o "Courses".
  • Campos: Los valores de una tabla se conocen como campos. Ejemplos para los estudiantes serían "First Name", "Last Name", y"GPA". Es decir, nombres y apellidos, así cómo su calificación.
  • Record/fila: Entrada individual en una tabla.

Luego de añadir docentes y cursos a la base de datos, tenemos tablas respectivamente para estudiantes, maestros y cursos.

Conforme avancemos en esta guía, solo estaremos usando el ejemplo de los estudiantes (Students) como referencia. Si tuvieras la fortuna suficiente de tener un empleo de Ingeniería de Software Hogwarts, tu base de datos podría hacer un muy buen uso de estos comandos :D.

Sentencias SQL

Sintaxis

El punto y coma es la forma estándar de separar una sentencia en SQL de otra. Permite que múltiples declaraciones se ejecuten en la misma llamada. En esta guía, tendremos un punto y coma al final de cada declaración.

Los comandos SQL más importantes

CREATE:  Crea una nueva tabla SQL.

Si estuviéramos creando la base de datos de estudiantes en la escuela de Hogwarts, usaríamos CREATE para hacer una tabla llamada Estudiantes (Students).

  • Sintaxis
CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    column3 datatype,
   ....
);
  • Ejemplo.
CREATE TABLE Students
                (first_name VARCHAR(255),
                last_name VARCHAR(255),
                login VARCHAR(255),
                age INTEGER,
                gpa REAL,
                house VARCHAR(255));

DROP: Borra una tabla. ¡Ten mucho cuidado cuando usas este comando, puesto que borrará todos los datos en la tabla!

Si buscamos borrar la base de datos entera de los estudiantes usaríamos DROP para efectuar dicha acción.

  • Sintaxis
DROP TABLE table_name;
  • Ejemplo
DROP TABLE Students;

INSERT: añade nuevas filas de datos a la tabla.

Usaremos INSERT para añadir nuevos estudiantes según se inscriban en Hogwarts.

  • Sintaxis
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
  • Ejemplo
INSERT 
INTO Students(first_name, last_name, login, age, gpa, house)
VALUES 
('Harry',     'Potter', 'theboywholived', 15, 4.0, 'Gryffindor'),
('Hermionie', 'Granger','granger2',       15, 4.5, 'Gryffindor'),
('Ron',       'Weasley','weasley7',       15, 3.7, 'Gryffindor'),
('Draco',     'Malfoy', 'malfoy999',      15, 4.0, 'Slytherin'),
('Cedric',    'Diggory','diggory123',     15, 4.0, 'Hufflepuff');

SELECT: Usado para traer elementos de una base de datos de regreso a un formato de tabla.

Si buscamos recuperar todos los nombres de los estudiantes que están en el dormitorio de Gryffindor, usaremos el comando SELECT. El siguiente ejemplo se basa en una consulta de la tabla de estudiantes por el primer nombre y apellido de cada estudiante en la base de datos.

  • Sintaxis
SELECT column1, column2, ...
FROM table_name;
  • Ejemplo
SELECT first_name, last_name FROM Students;
first_name last_name
Harry Potter
Hermionie Granger
Ron Weasley
Draco Malfoy
Cedric Diggory

Alternativamente, si buscamos seleccionar todos los campos en la tabla, nuestro comando utilizaría la sintaxis "*", que implica seleccionar todos los campos:

SELECT * FROM Students;
first_name last_name login age gpa house
Harry Potter theboywholived 15 4 Gryffindor
Hermionie Granger granger2 15 4.5 Gryffindor
Ron Weasley weasley7 15 3.7 Gryffindor
Draco Malfoy malfoy999 15 4 Slytherin
Cedric Diggory diggory123 15 4 Hufflepuff

Cláusulas

Una cláusula es un fragmento lógico de una declaración SQL, y es (en teoría), un campo opcional.

En la declaración anterior, simplemente retornamos todos los campos en la base de datos de estudiantes. No especificamos una condición en los valores a ser retornados.

¿Qué pasa si hubiésemos buscado hacer una consulta, con los estudiantes, pero solo con aquellos cuyo dormitorio es Gryffindor? ¿Y qué si queremos consultar los estudiantes cuyo nombre empieza con la letra"H", o los estudiantes en Hufflepuff y Slytherin? Para estos casos más complejos, necesitamos las cláusulas SQL.

Abajo hay una descripción de las cláusulas más comunes, pero hay muchas más cláusulas en el lenguaje SQL. Aquí hay un buen recurso por si deseas más información.

Ejemplos de cláusulas.

WHERE: Usada para declarar una condición para especificar una parte de la base de datos. Regresando a nuestro ejemplo con Select, podríamos haber usado WHERE para especificar el dormitorio de Gryffindor.

  • Sintaxis
SELECT column1, column2, ...
FROM table_name
WHERE condition;
  • Ejemplo
SELECT * FROM Students
WHERE house='Gryffindor';
first_name last_name login age gpa house
Harry Potter theboywholived 15 4 Gryffindor
Hermionie Granger granger2 15 4.5 Gryffindor
Ron Weasley weasley7 15 3.7 Gryffindor

AND: Usado para combinar múltiples cláusulas en una declaración SQL, donde todas las condiciones separadas por el AND son verdaderas. Podríamos usar AND para obtener los estudiantes de Gryffindor que tienen un GPA mayor a  3.8.

  • Sintaxis
SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 AND condition3 ...;
  • Ejemplo
SELECT * FROM Students
WHERE house='Gryffindor' AND gpa>3.8;
first_name last_name login age gpa house
Harry Potter theboywholived 15 4 Gryffindor
Hermionie Granger granger2 15 4.5 Gryffindor

OR: Similar a AND, difiere en el hecho de retornar los datos en los cuales solo UNA de las condiciones separadas por OR son verdaderas. Si queremos recuperar los estudiantes en Hufflepuff o Slytherin, pero no ambos, usaremos el comando OR.

  • Sintaxis
SELECT column1, column2, ...
FROM table_name
WHERE condition1 OR condition2 OR condition3 ...;
  • Ejemplo
SELECT * FROM Students
WHERE house='Slytherin' OR house='Hufflepuff';
first_name last_name login age gpa house
Draco Malfoy malfoy999 15 4 Slytherin
Cedric Diggory diggory123 15 4 Hufflepuff

LIKE: Usado con WHERE para buscar un patrón específico. Si solo buscamos el nombre y apellido de los magos y magas que tienen como inicial de nombre la letra "H", podemos usar este comando.

  • Sintaxis
SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;
  • Ejemplo
SELECT first_name, last_name FROM Students
WHERE first_name LIKE 'H%';
first_name last_name
Harry Potter
Hermionie Granger

COUNT: Usada para contar el número de columnas en una tabla.

  • Sintaxis
SELECT COUNT(column_name)
FROM table_name
WHERE condition;
  • Ejemplo
SELECT COUNT(first_name) FROM Students;
COUNT(first_name)
5

Los otros comandos que usan la misma sintaxis son AVG y SUM. AVG calculará el promedio de todos los valores, mientras que SUM, calculará el total de estos.

Select Limit: Usado para delimitar las respuestas a una cantidad específica. La forma en que las respuestas principales son elegidas, es basándonos en el orden de inserción en la base de datos, es decir cronológicamente.

  • Sintaxis
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;
  • Ejemplo
SELECT * FROM Students LIMIT 3;
first_name last_name login age gpa house
Harry Potter theboywholived 15 4 Gryffindor
Hermionie Granger granger2 15 4.5 Gryffindor
Ron Weasley weasley7 15 3.7 Gryffindor

Otros comandos útiles.

ORDER BY:  Ordena los resultados de forma ascendente o descendente.

  • Sintaxis
SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
  • Ejemplo
SELECT * FROM Students ORDER BY first_name;
first_name last_name login age gpa house
Cedric Diggory diggory123 15 4 Hufflepuff
Draco Malfoy malfoy999 15 4 Slytherin
Harry Potter theboywholived 15 4 Gryffindor
Hermionie Granger granger2 15 4.5 Gryffindor
Ron Weasley weasley7 15 3.7 Gryffindor

GROUP BY: Agrupa categorías que tienen los mismos valores en las columnas. Si buscabas saber el número de estudiantes en cada dormitorio (3 en Gryffindor por ejemplo), puedes utilizar el comando GROUP BY.

  • Sintaxis
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
  • Ejemplo
SELECT COUNT(first_name), house FROM Students GROUP BY house;
COUNT(first_name) house
3 Gryffindor
1 Hufflepuff
1 Slytherin

Bases de Datos Normalizadas vs No normalizadas

Cuando diseñamos una base de datos, hay dos principales patrones a seguir, cada uno con sus ventajas y desventajas.

Normalizada: Optimizada para minimizar la redundancia, no para tiempo de respuesta.

Digamos que tenemos una tabla de cursos con el ID del docente que enseña cada curso. También tenemos una base de datos que tiene el nombre de cada docente.

Cuando queremos obtener los nombres de los docentes enseñando un curso en específico, tendremos que hacer una consulta tanto de la tabla de los cursos, como la de los docentes, debido a que la tabla curso no tiene el nombre del docente.

No normalizada: Optimizada para tiempo de respuesta, pero no para minimizar la redundancia.

Supongamos que tenemos una tabla de cursos que tiene el ID de los docentes y además, el nombre de los mismos. Cuando queremos obtener los nombres de los docentes en el curso, solo usamos la tabla curso.

Integridad de los Datos.

Es vital para los usuarios que los datos con los que interactúan sean seguros, correctos y sensibles. Ejemplos de ello son, asegurarnos que la edad no es un número negativo, o que dos estudiantes no tengan la misma información. Esto es Integridad de Datos.

La Integridad de Datos toma varias formas y puede ser dividida en cuatro categorías:

  • Integridad de Entidades: No duplicar filas existentes en una tabla. Por ejemplo, no podemos insertar Ron Weasley dos veces.
  • Integridad de Dominio: Restringir el tipo de valores que uno puede insertar con el objetivo de reforzar su precisión. Por ejemplo, un dormitorio puede ser Gryffindor, Ravenclaw, Slytherin, or Hufflepuff.
  • Integridad Referencial: Registros que son usados por otros registros no pueden ser borrados. Un docente no puede ser borrado si actualmente está enseñando un curso.
  • Integridad definida por usuario: Cualquier otra categoría coherente con el plan del negocio acerca de cómo administrar la base de datos.

Bases de datos SQL más comunes

  • Oracle: Muy estable y desarrollada, pero puede ser costosa.
  • MySQL:  Ligera y rápida, pero no tan desarrollada como Oracle.
  • PostgreSQL: Buena para ciertos usos, pero no muy rápida.

Recursos

Para mantenerte al día.