SQL y sus sublenguajes
Por qué se dice que SQL es declarativo, qué añade su extensión procedural, en qué cuatro sublenguajes se reparten las sentencias y sobre qué estándar trabajan todos los gestores.
Un lenguaje declarativo con una extensión procedural
SQL es el lenguaje normalizado para trabajar con bases de datos relacionales. Se le clasifica como lenguaje de cuarta generación (4GL) y como lenguaje declarativo, y las dos etiquetas dicen lo mismo desde ángulos distintos: en una sentencia se describe el resultado que se quiere, no el procedimiento para conseguirlo.
Cuando se pide la media de aciertos de un alumno no se dice al gestor que abra el fichero, que recorra los registros uno a uno y que vaya sumando. Se dice qué se quiere y el optimizador de consultas del gestor decide el cómo: qué índice usar, en qué orden combinar las tablas y qué algoritmo aplicar. Por eso la misma consulta puede ejecutarse de forma distinta según los datos que haya en ese momento, y por eso existe la sentencia que muestra el plan elegido.
Ese carácter declarativo se queda corto en cuanto hace falta lógica: condiciones, bucles, variables o control de errores. Para eso el estándar incorpora una extensión procedural, SQL/PSM (Persistent Stored Modules), que es la parte del lenguaje con la que se escriben los procedimientos almacenados y los disparadores. Cada fabricante tiene su dialecto de esa extensión: PL/SQL en Oracle, Transact-SQL en SQL Server y PL/pgSQL en PostgreSQL.
SQL declara el qué y el optimizador resuelve el cómo. La programación dentro del gestor no la hace el SQL declarativo, la hace su extensión procedural SQL/PSM.
Para el examen
Qué tipo de lenguaje es: declarativo de cuarta generación (4GL)
Quién decide el plan: el optimizador del gestor
Extensión procedural del estándar: SQL/PSM
Dialectos: PL/SQL en Oracle, Transact-SQL en SQL Server y PL/pgSQL en PostgreSQL
DDL, DML, DCL y TCL
Las sentencias de SQL se agrupan en familias según sobre qué actúan. La distinción es de las que caen todos los años, y la forma rápida de fijarla es preguntarse sobre qué manda cada una: sobre el recipiente, sobre lo que hay dentro, sobre quién puede tocarlo o sobre cuándo se da por bueno el cambio.
| Sublenguaje | Sobre qué manda | Sentencias características |
|---|---|---|
| DDL, definición de datos | La estructura: los objetos donde viven los datos | CREATE, ALTER, DROP, TRUNCATE |
| DML, manipulación de datos | El contenido: las filas que hay dentro de esos objetos | SELECT, INSERT, UPDATE, DELETE, MERGE |
| DCL, control de datos | El acceso: quién puede hacer qué sobre cada objeto | GRANT, REVOKE |
| TCL, control de transacciones | El principio y el final de una unidad de trabajo | COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION |
El reparto no es único y conviene saberlo antes del examen. Hay clasificaciones que presentan el TCL como una parte del DCL, porque las dos gobiernan cómo se accede a los datos y no los datos mismos. También se discute dónde cae TRUNCATE, que borra filas como el DML pero se comporta como DDL, y CALL, que unos fabricantes consideran DML y otros DCL. Si una pregunta admite esas dos lecturas, suele ser porque está copiada de un manual concreto.
DDL toca el continente, DML el contenido, DCL los permisos y TCL las transacciones.
SQL y sus sublenguajes
DDL: la estructura
- CREATE
- ALTER
- DROP
- TRUNCATE
DML: los datos
- SELECT
- INSERT
- UPDATE
- DELETE
- MERGE
DCL: los permisos
- GRANT
- REVOKE
TCL: las transacciones
- COMMIT
- ROLLBACK
- SAVEPOINT
- SET TRANSACTION
Para el examen
DDL: CREATE, ALTER, DROP y TRUNCATE
DML: SELECT, INSERT, UPDATE, DELETE y MERGE
DCL: GRANT y REVOKE
TCL: COMMIT, ROLLBACK, SAVEPOINT y SET TRANSACTION
El estándar y los dialectos
SQL está normalizado por ANSI y por ISO desde 1986. La revisión de 1992, conocida como SQL-92 o SQL2, es la ampliación grande del lenguaje y sigue siendo la referencia más citada: cuando alguien dice «SQL estándar» sin más apellidos, casi siempre está pensando en ella.
Ningún gestor implementa el estándar entero ni se limita a él. Todos añaden extensiones propias, y de ahí salen los dialectos. La consecuencia práctica es que una aplicación escrita contra el subconjunto estándar se migra de un gestor a otro con poco trabajo, mientras que otra escrita a base de extensiones del fabricante queda atada a él.
Para el examen
Quién lo normaliza: ANSI e ISO, desde 1986
Revisión más citada: SQL-92, también llamada SQL2
Gestores relacionales del mercado
Los sistemas gestores de bases de datos relacionales más presentes en la Administración y en la industria hablan todos SQL, con su dialecto propio encima del estándar.
- Oracle Database, con su extensión procedural PL/SQL.
- Microsoft SQL Server, con Transact-SQL.
- MySQL y su bifurcación libre MariaDB.
- PostgreSQL, el más cercano al estándar entre los libres.
- IBM Db2 e IBM Informix.
- SAP MaxDB.
Para el examen
Oracle: PL/SQL
SQL Server: Transact-SQL
MariaDB: bifurcación de MySQL
PostgreSQL: el libre más cercano al estándar
SQLite: SQL sin servidor
SQLite es el caso raro de la lista: no sigue la arquitectura cliente/servidor. No hay un proceso servidor escuchando en un puerto al que se conecten los clientes; el motor entero es una biblioteca que se enlaza dentro del propio programa y que lee y escribe un fichero local. Por eso no se accede a él por red y no sirve para dar servicio a muchos usuarios concurrentes.
Conviene no confundir la ausencia de servidor con la ausencia de gestor. SQLite es un motor relacional completo: analiza SQL, optimiza consultas, mantiene índices y cumple las propiedades ACID, de modo que dentro de él se pueden abrir y confirmar transacciones igual que en cualquier otro. Lo que ocurre es que toda la base de datos cabe en un único fichero, lo que lo hace ideal para aplicaciones de escritorio y para el móvil: es el almacenamiento estructurado estándar de Android.
SQLite no es «menos base de datos», es una base de datos sin servidor: se enlaza como biblioteca en el programa que la usa.
Para el examen
Qué es: motor relacional completo, que cumple ACID
Arquitectura: sin cliente/servidor: biblioteca más fichero local
Dónde se usa: es el almacenamiento estándar de Android