SQL son las siglas de Structured Query Language, que traducido significa Lenguaje de consulta estructurado y que es el estandar de facto para acceso a base de datos.
En lenguaje SQL surgió a raiz de la creación en IBM durante la decada de los 70 de un sistema de base de datos llamado "System R". Para manipular y recuperar datos de dicho sistema se diseño un lenguaje llamado SEQUEL (Standard English Query Language) que finalmente se convertiría en SQL (la historia del cambio de nombre es curiosa y se debió a que el nombre SEQUEL ya estaba registrado por otra compañía, aún así hoy en día una de las pronunciaciones para SQL es, precisamente SEQUEL).
Este no pretende ser un tutorial de base de datos sino una pequeña introducción a SQL de forma que es recomendable saber algo de bases de datos antes de meterse en SQL. Es conveniente saber lo que es una base de datos, su estructura y cuanto menos algunos conceptos básicos (como el hecho de que está organizada en tablas, campos y registros). Si no lo has hecho ya y no tienes esos conceptos sería mejor que comenzaras por la Introducción a bases de datos. Además esto es, como se indica, solo una introducción, en posteriores entregas iremos viendo métodos más complejos, especialmente en lo que a los operadores de selección se refiere e iremos entrando con más profundidad en cada uno de ellos.
En principio SQL es un estandar ISO desde 1987 sin embargo la especificación SQL es bastante grande y compleja de forma que casi ninguna base de datos implementa la especificación de forma totalmente completa. Por otro lado, las grandes cases de bases de datos (ORACLE o SQL Server por ejemplo) han añadido diversa funcionalidad de forma no homogenea y "fuera" de la especificación a sus propias bases de datos.
En principio SQL, a efectos prácticos, no se puede decir que sea un estandar. Ahora bien, que nadie se asuste, la mayoría de las aplicaciones sencillas funcionarán prácticamente sin cambiar código SQL ya que en muchos casos las diferencias son minimas o se dan en sentencias que, en general se utilizan poco, de forma que la mayor parte de las consultas SQL funcionarán en cualquier base de datos tanto si es Access como si es ORACLE o MySQL.
Dicho lo anterior sin embargo, a modo de ejemplo, en ORACLE las consultas con parametros (que son como argumentos que se deben suministrar a una cadena) se forman precediendo el nombre del parametro con ":" mientras que en SQL Server se forman precediendolo de "@".
Dentro del lenguaje SQL podemos distinguir las sentencias en dos tipos dependiendo de la función que realicen. Así podemos distinguir entre sentencias DML y DDL.
DML son las siglas de Data Manipulation Language (lenguaje de manipulación de datos) y engloba todas aquellas sentencias que nos permiten consultar o modificar los datos almacenados en la base de datos. Dentro de estas sentencias se encuentran las consultas SELECT, INSERT y DELETE por ejemplo que nos permiten (como veremos más adelante) consultar, insertar y borrar datos de la base de datos respectivamente.
DDL son las siglas de Data Definition Language (lenguaje de definicion de datos) y engloba todas aquellas sentencias que nos permiten definir la propia forma de los datos, es decir, su estructura. Esto, como norma general para las base de datos relacionales, quiere decir modificar la estructura de las tablas que forman la base de datos. Dentro de estas sencencias se encuentran consultas como por ejemplo CREATE TABLE o ADD COLUMN que permiten crear una tabla en la base de datos o añadir una columna a una tabla respectivamente.
En esta primera parte del tutorial vamos a ver las consultas más comunes de acceso a la base de datos, es decir, aquellas que nos van a permitir obtener datos de la base de datos, insertarlos, actualizarlos y borrarlos y que, como norma general, constituiran el 80% de las consultas que realicemos sobre una base de datos.
La consulta SELECT nos permite obtener información de la base de datos. Su sintaxis general es la siguiente:
En toda base de datos actual que siga el modelo relacional la información está organizada en tablas y campos. La consulta select nos permite obtener los datos de determinados campos de una o varias tablas, imponer condiciones sobre ellos y realizar otras operaciones de conjuntos (tales como uniones o intersecciones).
Vamos a ver algunos ejemplos sencillos. Para todos ellos vamos a suponer que tenemos dos tablas, la tabla empresas y la tabla productos con los siguientes datos
| Empresas | ||
| IdEmpresa | Nombre | Provincia |
|---|---|---|
| 1 | PreMuch Systems | Madrid |
| 2 | Ocasium | Barcelona |
| Productos | |||
| IdProducto | IdEmpresa | Producto | Precio |
|---|---|---|---|
| 1 | 1 | CX System | 1542 |
| 2 | 1 | MX System | 2100 |
| 3 | 2 | Ford Escort | 2500 |
| 4 | 2 | Opel Laguna | 4500 |
| 5 | 1 | Ultra System | 2800 |
Si queremos seleccionar todos los campos de una tabla dada podemos utilizar la siguiente consulta
que nos devolverá lo siguiente:
| IdEmpresa | Nombre | Provincia |
|---|---|---|
| 1 | PreMuch Systems | Madrid |
| 2 | Ocasium | Barcelona |
En este caso el asterisco (*) en la sección que especifica los campos de la consulta indica que deseamos que la consulta devuelva todos los campos de la consulta
Si queremos obtener la información de tan solo determinados campos de la tabla deberemos especificar dichos campos separados por comas como en la siguiente consulta
lo cual produce el siguiente resultado
| Producto | Precio |
|---|---|
| CX System | 1542 |
| MX System | 2100 |
| Ford Escort | 2500 |
| Opel Laguna | 4500 |
| Ultra System | 2800 |
Podemos imponer determinadas condiciones a los campos que nos va a devolver la consulta, por ejemplo si queremos tan solo aquellos campos de la consulta anterior cuyo precio sea inferior a 2600 tendremos
La clausula WHERE nos permite imponer condiciones que deben cumplir los campos que devuelva la consulta, hay diversos operadores que veremos más adelante, incluyendo los de comparación (<, >, =) algunos matemáticos (MAX, MIN, SUM) y algunos otros, en nuestro caso la consulta nos devolverá un subconjunto de la anterior, formada por solo aquellos cuyo precio es menor que 2600.
| Producto | Precio |
|---|---|
| CX System | 1542 |
| MX System | 2100 |
| Ford Escort | 2500 |
Otra consulta podría ser, por ejemplo, devolver tan solo aquellos productos pertenecientes a la empresa cuyo identificador es el 2.
Cuyo resultado sería
| Producto | Precio |
|---|---|
| Ford Escort | 2500 |
| Opel Laguna | 4500 |
A veces lo que necesitamos es mezclar los datos de varias tablas. Por ejemplo, en las tablas anteriores quizá queramos obtener todos los productos que pertenecen a la empresa PreMuch Systems (pero sin saber cual es el identificador de dicha empresa). Una forma de hacerlo sería con dos consultas, una para obtener el identificador de la empresa con ese nombre y otra, una vez sabido dicho identificador, para obtener los productos como hemos hecho en el caso anterior. Sin embargo SQL nos permite hacerlo de una forma mucho más sencilla
Cuyos resultados son
| Producto | Precio |
|---|---|
| CX System | 1542 |
| MX System | 2100 |
| Ultra System | 2800 |
Si examinamos el código anterior podemos observar que, en lenguaje llano, lo que le estamos diciendo a SQL es: "dame los campos Producto y Precio consultando las tablas Productos y Empresas en las que el nombre de la empresa sea PreMuch Systems y cuyo id de empresa coincida con el id de empresa de la tabla productos".
Podemos observar también que en los campos en los que no existe conflicto, es decir, posibilidad de que SQL se "equivoque" podemos usar los nombres normales (Producto y Precio solo existen en la tabla Productos asi que no hay posibilidad de equivocacion) sin embargo IdEmpresa existe en ambas tablas por lo que debemos especificar a que campo nos referimos poniendo el nombre de la tabla seguido de un punto (.) y después el nombre del campo para que no haya ambiguedades. Esto lo podemos hacer, de hecho, para todos los campos que queramos, por ejemplo el campo Nombre solo existe en la tabla Empresas pero aún así le hemos precedido del nombre de la tabla.
Las consultas de inserción nos permiten, como su nombre indica, introducir datos en la base de datos. Su sintaxis general es la siguiente:
donde tabla indica la tabla en la que vamos a insertar el registro, campo1, campo2 ... indican los campos a los que vamos a dar valores en nuestra inserción y valor1, valor2 ... indican los valores para dichos campos (valor1 para el campo1, valor2 para el campo2, etc)
Hay otra sintaxis para la consulta que omite los nombres de los campos
en la cual se omiten los nombres de los campos. En este caso deberemos proporcionar tantos valores como campos tenga la tabla y además en el orden correcto, por ejemplo para la tabla Empresas anterior habrá que suministrar los valores id, nombre y ciudad y además en ese orden (la única excepción a esto es el primer campo o campos autoincrementales que suelen corresponderse con las claves).
Las consultas de inserción son razonablemente más sencillas que las consultas de selección, fundamentalmente porque constituyen tan solo datos a insertar en una sola tabla. Aún así, antes de pasar a los ejemplos, merece la pena tocar algunas peculiaridades.
Insertar un registro en la tabla empresas (una nueva empresa)
o bién
e incluso si asumimos que el campo IdEmpresa es autoincremental podríamos hacer
En cualquiera de los casos obtendríamos una nueva entrada en nuesta tabla Empresas
| Empresas | ||
| IdEmpresa | Nombre | Provincia |
|---|---|---|
| 1 | PreMuch Systems | Madrid |
| 2 | Ocasium | Barcelona |
| 3 | TheAlphasite | Madrid |
La consulta update permite actualizar (modificar) datos ya existentes en la base de datos. Su sintaxis general es
Las consultas UPDATE nos permiten tan solo actualizar datos existentes, es decir, si no existe un registro que coincida con la condición (o si la tablas esta vacía aunque no haya condición). Veamos algunos ejemplos
Si no imponemos restricciones una consulta update actualizará todos los campos de la tabla poniendo los valores suministrados.
producirá el siguiente resultado
| IdProducto | IdEmpresa | Producto | Precio |
|---|---|---|---|
| 1 | 1 | CX System | 3000 |
| 2 | 1 | MX System | 3000 |
| 3 | 2 | Ford Escort | 3000 |
| 4 | 2 | Opel Laguna | 3000 |
| 5 | 1 | Ultra System | 3000 |
Podemos imponer el mismo tipo de condiciones al UPDATE que las que imponiamos en las consultas SELECT. Por ejemplo, si queremos cambiar el precio de todos aquellos productos cuyo precio sea inferior a 2300 tendremos
que produce el siguiente resultado
| IdProducto | IdEmpresa | Producto | Precio |
|---|---|---|---|
| 1 | 1 | CX System | 1500 |
| 2 | 1 | MX System | 1500 |
| 3 | 2 | Ford Escort | 2500 |
| 4 | 2 | Opel Laguna | 4500 |
| 5 | 1 | Ultra System | 2800 |
o si queremos modificar solo los productos de la empresa cuyo id es el 2
| IdProducto | IdEmpresa | Producto | Precio |
|---|---|---|---|
| 1 | 1 | CX System | 1542 |
| 2 | 1 | MX System | 2100 |
| 3 | 2 | Ford Escort | 1500 |
| 4 | 2 | Opel Laguna | 1500 |
| 5 | 1 | Ultra System | 2800 |
Para finalizar la consulta DELETE nos permite eliminar registros de una tabla, su sintaxis general es
Si omitimos la condición estaremos borrando todos los registros de la tabla dada
aunque la siguiente consulta también se considera válida
El uso de la condición nos permite seleccionar con mayor precisión cuales son exactamente los registros que deseamos borrar.
que produciría el siguiente resultado (observad que es menor (<) y no menor o igual (<=))
| IdProducto | IdEmpresa | Producto | Precio |
|---|---|---|---|
| 4 | 2 | Opel Laguna | 4500 |
| 5 | 1 | Ultra System | 2800 |
O por ejemplo podemos borrar todas las empresas ubicadas en Madrid
Solo hemos cubierto algunas de las acciones más básicas que se pueden llevar a cabo. SQL es un lenguaje con muchisimo potencial en sus consultas (principalmente de selección) y nos hemos dejado fuera cosas como consultas anidadas, varios tipos de JOINS entre tablas (mezclar los datos de varias tablas) y algunas otras cosas que veremos más adelante.
Por otro lado en todos los ejemplos las palabras reservadas (select, from, etc) están escritas en mayusculas. SQL es case insensitive, es decir, no distingue entre mayusculas y minusculas, sin embargo yo recomendaría utilizar siempre ese estilo para facilitar la lectura.