El lenguaje SQL El lenguaje SQL Índice de contenido El lenguaje SQL..............................................................................................................................................1 Licencia......................................................................................................................................................1 Introducción e historia...............................................................................................................................1 Sentencias DDL..........................................................................................................................................2 Gestión de esquemas..............................................................................................................................2 Gestión de tablas....................................................................................................................................2 Sentencias DML.........................................................................................................................................3 Sentencias DCL..........................................................................................................................................3 Sentencias DQL..........................................................................................................................................3 Consultas básicas....................................................................................................................................3 Funciones de agregado...........................................................................................................................4 Joins.......................................................................................................................................................4 Subquerys...............................................................................................................................................5 Vistas......................................................................................................................................................5 Combinación de querys..........................................................................................................................5 Extensiones propietarias............................................................................................................................6 Lenguaje procedural PL/SQL.................................................................................................................6 Otros.......................................................................................................................................................6 Extensiones SQL'1999 i SQL'2003 orientadas a objetos..........................................................................7 SQL'1999................................................................................................................................................7 SQL'2003................................................................................................................................................7 Licencia Este obra de Jesús Jiménez Herranz está bajo una licencia Creative Commons AtribuciónLicenciarIgual 3.0 España. Basada en una obra en oposcaib.wikispaces.com. Introducción e historia SQL (Structured Query Language) es un lenguaje de acceso a bases de datos. Permite tanto definir la estructura de los datos como hacer consultas sobre ellos, siempre según las directrices del álgebra y el cálculo relacionales. A día de hoy, SQL es el lenguaje estándar de acceso a bases de datos. El origen de SQL viene de un intento de crear una sintaxis legible para el álgebra relacional propuesta por Codd. Aunque los orígenes de SQL están en IBM, la primera implementación fue llevada a cabo por Oracle a finales de los años 70. Posteriormente fue adoptado por el resto de SGBD. En 1987, la ISO lo establece como estándar. A partir de aquí, ha habido diferentes revisiones: ● ● ● ● SQL'1987: Versión inicial. SQL'1992: Se añade integridad referencial. SQL'1999: Se añaden los triggers, así como características de orientación a objetos. SQL'2003: Soporte para XML, mejor orientación a objetos. Las instrucciones del lenguaje SQL se pueden dividir, según su función, en diferentes categorías: ● DDL (Data Definition Language): Instrucciones para crear y alterar las estructuras relacionales. Jesús Jiménez Herranz, http://oposcaib.wikispaces.com 1 El lenguaje SQL ● ● ● DML (Data Manipulation Language): Instrucciones para manipular los datos. DQL (Data Query Language): Instrucciones para consultar datos. DCL (Data Control Language): Instrucciones de gestión interna del SGBD (permisos, etc.). Sentencias DDL Las sentencias de definición de datos permiten crear y alterar las estructuras básicas de la base de datos. Si bien el modelo relacional establece que los datos se almacenan estructurados como relaciones (llamadas tablas en SQL), el lenguaje permite agrupar las relaciones de forma lógica en lo que se conoce como esquemas o bases de datos Gestión de esquemas Estas sentencias permiten crear o eliminar un esquema, que es una estructura lógica que contendrá una o más tablas. La sintaxis es la siguiente: CREATE SCHEMA nombre; DROP SCHEMA nombre; Es común que se utilice el término DATABASE en lugar de SCHEMA en muchos SGBDs. Gestión de tablas La sintaxis para gestionar tablas es la siguiente: CREATE TABLE nombre ( columna tipodatos [NULL|NOT NULL] opciones, ... ); ALTER TABLE nombre [ADD|DROP] [COLUMN|CONSTRAINT|INDEX|...] SET ...; DROP TABLE nombre; Por tanto, una tabla puede tener diferentes columnas, cada una de ellas con un tipo de datos. Los tipos de datos básicos que define el estándar son: ● ● ● Textuales: char, varchar Numéricos: numeric, integer, float, double Fecha y hora: date, time En realidad, cada SGBD acostumbra a definir sus propios tipos de datos, por lo que los tipos de datos estándar no se suelen usar demasiado. Además de un tipo de datos, cada columna tiene asociadas una serie de opciones adicionales. Estas opciones pueden ser: ● ● ● Indicadores de clave primaria: Permiten establecer si la columna es o forma parte de la clave primaria de la tabla. Restricciones de integridad: Permite establecer restricciones para mantener la integridad de la tabla. Por ejemplo, aquí se podría indicar si la columna es una clave externa a otra tabla, si se permiten valores nulos o si se debe hacer alguna comprobación sobre los valores. Otros: Por ejemplo, establecer valores por defecto de una columna o crear índices. La sentencia ALTER permite hacer cambios a la estructura de tablas ya creadas, modificando, añadiendo o eliminando características. Jesús Jiménez Herranz, http://oposcaib.wikispaces.com 2 El lenguaje SQL Sentencias DML Las sentencias DML permiten actuar sobre los datos de la base de datos. Así, a diferencia de las DDL, que definen la estructura de las tablas, las sentencias DML permiten alterar los datos contenidos en las mismas. Los tres tipos de sentencias DML son: INSERT INTO tabla (col1,col2,...,coln) VALUES (val1,val2,...,valn); UPDATE tabla SET col1=val1[,col2=val2,...,coln=valn] WHERE condicion; DELETE FROM tabla [WHERE condicion]; De esta manera, la sentencia INSERT permite insertar nuevos datos a una tabla, mientras que la sentencia UPDATE permite alterar datos ya existentes. La sentencia DELETE elimina registros de una tabla. Sentencias DCL Las sentencias DCL permiten llevar a cabo tareas administrativas de la base de datos tales como la asignación de permisos. Las instrucciones DCL definidas por SQL son: GRANT [SELECT|INSERT|UPDATE|DELETE|REFERENCE] ON objeto TO usuario [WITH GRANT OPTION]; REVOKE [SELECT|INSERT|UPDATE|DELETE|REFERENCE] ON objeto TO usuario [WITH GRANT OPTION]; De esta manera, es posible asignar o eliminar permisos a un usuario, habilitándole para realizar determinadas operaciones sobre los diferentes objetos de la base de datos. Además de esta asignación, también es posible establecer si el usuario puede o no propagar sus permisos a otros usuarios. Sentencias DQL Las sentencias DQL permiten consultar los datos de la base de datos, de diferentes maneras. Es uno de los aspectos más potentes tanto de SQL como del modelo relacional en general. Consultas básicas El conjunto de sentencias DQL se compone únicamente de la sentencia SELECT. Si bien es una instrucción relativamente compleja, su sintaxis básica es la siguiente: SELECT [DISTINCT] columnas FROM tablas [WHERE condicion] [GROUP BY columnas] [ORDER BY columnas]; Por tanto, las únicas partes obligatorias de un SELECT son la especificación de la(s) tabla(s) desde las que leer los datos, así como las columnas que se desean consultar. A partir de ahí, se puede hacer más compleja la consulta indicando alguna condición extra que deban cumplir los datos a consultar, estableciendo una ordenación de los resultados, o bien agrupando los resultados según los valores de alguna de las columnas. Un ejemplo sería el siguiente: SELECT dni,nombre,apellidos,salario FROM empleado WHERE salario>20000 ORDER BY dni; Jesús Jiménez Herranz, http://oposcaib.wikispaces.com 3 El lenguaje SQL Funciones de agregado Además de obtener valores de columnas mediante la sentencia SELECT, también es posible calcular determinadas estadísticas sobre el conjunto de los datos. Esto se consigue mediante las funciones de agregado, como muestra el siguiente ejemplo: SELECT MAX(salario) FROM empleado; Las funciones de agregado disponibles en el SQL estándar son MAX, MIN, AVG, COUNT y SUM. Si además se quiere calcular estas estadísticas para los diferentes valores de una columna, se puede hacer utilizando la cláusula GROUP BY, por ejemplo para saber cuántos empleados hay con cada nombre: SELECT COUNT(*) FROM empleado GROUP BY nombre; Joins La sentencia SELECT no está limitada a consultar datos de una sola tabla, sino que permite consultar datos de diferentes tablas a la vez. Ahora bien, al ejecutar una sentencia SELECT sobre varias tablas, se considera el producto cartesiano de todos sus valores, por lo que generalmente es deseable añadir alguna condición que restrinja el número de resultados. Esto es lo que se conoce como JOIN. Un ejemplo sería el siguiente: SELECT e.dni,d.nombredep FROM empleado e,departamento d WHERE e.coddep=d.codigo; Un aspecto a tener en cuenta de los JOINs es que sólo se mostrarán aquellos registros que cumplan la condición especificada. Esto en ocasiones no es deseable, de manera que se definen diferentes tipos de JOIN según el resultado deseado: ● ● ● ● Equi-Join o Inner Join: Es el JOIN “estándar”, que se consigue mediante el uso de la cláusula WHERE Left Outer Join: Al hacer JOIN de dos tablas, recorre la tabla de la izquierda, buscando su correspondencia en la de la derecha. Si no hay correspondencia, se muestra el registro con el valor derecho a NULL Right Outer Join: El mismo comportamiento, pero recorriendo la tabla de la derecha Full Outer Join: El comportamiento de los JOINs left y right El siguiente ejemplo muestra el resultado de hacer la misma consulta, pero utilizando diferentes tipos de JOIN: JOIN estándar Left JOIN Outer JOIN Consulta SELECT e.dni,d.nombredep FROM empleado e, departamento d WHERE e.coddep=d.codigo; SELECT e.dni,d.nombredep FROM empleado e LEFT JOIN departamento d ON e.coddep=d.codigo; SELECT e.dni,d.nombredep FROM empleado e OUTER JOIN departamento d ON e.coddep=d.codigo; Resultado DNI NOMBREDEP ---------- ---------43123456 Ventas DNI NOMBREDEP ---------- ---------43123456 Ventas 43111222 NULL DNI NOMBREDEP ---------- ---------43123456 Ventas 43111222 NULL NULL Personal Jesús Jiménez Herranz, http://oposcaib.wikispaces.com 4 El lenguaje SQL Subquerys Las sentencias SELECT se pueden anidar, dando lugar a expresiones más complejas. Para ello, se introduce la subsentencia SELECT entre paréntesis en cualquier lugar de la sentencia donde generalmente se usaría un valor literal o un identificador de columna. A continuación se muestra un ejemplo: SELECT dni,nombre FROM empleado e WHERE e.salario=(SELECT MAX(salario) FROM empleado); Vistas Cuando se utilizan extensivamente los JOINs y los subquerys, es posible que el código SQL pierda legibilidad. Para aliviar en cierta medida este problema, el lenguaje ofrece la posibilidad de crear vistas, que no son más que tablas “virtuales” que contienen el resultado de una sentencia SELECT. De esta manera, podemos extraer algunos subquerys de una sentencia SELECT compleja en forma de vistas, ganando en legibilidad. La sintaxis de creación de vistas es la siguiente: CREATE VIEW nombre AS SELECT ...; A partir de aquí, podemos usar la vista creada como si fuera cualquier otra tabla. En realidad, las vistas normalmente no son más que una facilidad puramente sintáctica, y la mayoría de SGBDs las implementan simplemente guardando su sentencia SELECT asociada. A la hora de ejecutar una sentencia SELECT con vistas, se sustituyen internamente las referencias a las vistas por su código, y se ejecuta la sentencia final resultante, por lo que desde el punto de vista del rendimiento no hay ninguna diferencia entre usar vistas o subquerys (excepto, tal vez, el pequeño overhead adicional de procesar las referencias a las vistas). Algunos SGBDs permiten no sólo consultar las vistas, sino también manipular sus datos. Para ello debe ser posible determinar a qué tabla corresponde cada una de las columnas de una vista. Por supuesto, si la vista consiste en valores calculados (p. ej. con funciones de agregación, esto no es posible). Combinación de querys Es posible combinar los resultados de varias sentencias SELECT en una sola, mediante el uso de la siguiente sintaxis: (SELECT ...) [UNION|INTERSECT|EXCEPT] [ALL|CORRESPONDING BY columna] (SELECT ...) De esta manera, es posible combinar los resultados de diferentes consultas en una sola sentencia, ya sea uniéndolos, mostrando sólo los registros comunes o efectuando la diferencia entre resultados. Por defecto, se eliminan del resultado los registros repetidos, pero es posible mantener absolutamente todos los registros, incluidos los repetidos, usando el modificador ALL. De la misma manera, si no se usa ALL, es posible indicar qué columnas se compararán a la hora de buscar repetidos mediante la cláusula CORRESPONDING BY. Jesús Jiménez Herranz, http://oposcaib.wikispaces.com 5 El lenguaje SQL Extensiones propietarias Lenguaje procedural PL/SQL El lenguaje PL/SQL es una extensión de SQL que permite escribir programas de forma modular. Si bien es una extensión propietaria de Oracle, el resto de SGBDs han desarrollado extensiones similares. Los programas PL/SQL se almacenan en la base de datos, ya sea como procedimientos almacenados, que se ejecutan explícitamente, o bien como triggers, que son rutinas de código que se ejecutan ante determinados eventos como insertar datos, eliminar tablas, etc. La sintaxis de PL/SQL mezcla elementos del propio SQL con otros muy en la línea de lenguajes como ADA, y así soporta la mayoría de construcciones de un lenguaje estructurado: variables, bucles, condicionales, etc., así como otras menos habituales como excepciones. La estructura básica de un bloque de código PL/SQL es la siguiente: DECLARE -- Declaración de variables dni number(8); s varchar2(100); BEGIN -- Cuerpo del programa dni:=43123456; select nombre into s from empleado e where e.dni=dni; EXCEPTION -- Gestión de excepciones WHEN NO_DATA_FOUND THEN dbms_output.put_line("Error"); END Otros SGBDs disponen de lenguajes similares a PL/SQL, aunque la sintaxis varía de uno a otro. Otros Además de la sintaxis definida por el estándar SQL, cada fabricante de SGBDs acostumbra a añadir ciertas extensiones específicas de su producto. Esto es especialmente aplicable a los tipos básicos, para los que raramente se utilizan los que define el estándar sino que se usan los propios del SGBD. A continuación se muestran algunas de estas extensiones para los SGBDs más importantes. ● ● ● ● Tipos de datos: Cada SGBD acostumbra a implementar sus propios tipos de datos, que sustituyen a los tipos especificados en el estándar. Sentencia REPLACE: MySQL define la sentencia REPLACE, de funcionamiento idéntico a INSERT pero que, en caso de que ya exista una fila con la clave primaria especificada, la sustituye en lugar de mostrar un error. Otros SGBDs consiguen una funcionalidad similar mediante la adición de nuevas opciones a la sentencia INSERT. Operar tablas mediante SELECTS: La mayoría de SGBDs (Oracle, MySQL, PostgreSQL) permiten hacer cosas como insertar en una tabla el resultado de un SELECT (INSERT INTO tabla SELECT ...), o crear una tabla con la estructura y los datos de un SELECT (CREATE TABLE tabla AS SELECT ...). Limitar resultados de un SELECT: Mediante construcciones como SELECT FIRST, la mayoría de SGBDs permiten limitar el número de resultados de una consulta. Jesús Jiménez Herranz, http://oposcaib.wikispaces.com 6 El lenguaje SQL Extensiones SQL'1999 i SQL'2003 orientadas a objetos Desde la publicación de SQL'1992, el paradigma de la orientación a objetos ha ido tomando fuerza tanto en el ámbito de la programación como en el de las bases de datos, apareciendo así SGBDs orientados a objetos. Debido a esta tendencia, en las posteriores revisiones de SQL (en el 1999 y en el 2003) se añadieron diferentes mecanismos de orientación a objetos. Si bien estas revisiones del estándar de 1992 añaden numerosas funcionalidades, el soporte de las mismas por parte de los SGBDs es bastante irregular. Además, existen numerosas críticas a determinados aspectos como los tipos estructurados, que chocan frontalmente con algunos postulados del modelo relacional. Estos problemas hacen que el único estándar ampliamente soportado sea el SQL'1992. SQL'1999 SQL'1999 es la primera revisión del estándar desde 1992, e incluye una serie de nuevas funcionalidades agrupadas en grupos. Así, un primer grupo de características, llamadas Core Features, incluye pequeñas modificaciones y añadidos similares a las características propietarias de cada SGBD. Así, por ejemplo, se añaden nuevas funciones, nuevos tipos de JOIN, etc. Además de este grupo, hay una serie de novedades adicionales, de mayor envergadura, y que se separan de las Core Features para no obligar a todos los SGBDs a cumplirlas, ya que puede ser complicado. Estas características adicionales son principalmente: ● ● ● ● Tipos personalizados: Pueden estar basados en un tipo ya existente (p. ej., un entero con un rango de valores limitado), o bien tener una estructura. En este último caso, se permite además crear jerarquías mediante el uso de herencia. Arrays: Se soportan los arrays como un tipo básico más. Procedimientos almacenados: Se permite almacenar procedimientos en la base de datos. Este era un aspecto que ya soportaban la mayoría de SGBDs, si bien mediante sus propios lenguajes. SQL'1999 define un dialecto estándar. Microtransacciones: Se añade la posibilidad de guardar el estado de la transacción en un punto dado, para volver a él si algo sale mal (microrollback). SQL'2003 SQL'2003 refina algunos aspectos de SQL'1999 y añade nuevas características: ● ● ● ● Nuevos tipos de datos: Entre otros, enteros grandes, conjuntos y el tipo XML. Instrucción MERGE: Permite hacer inserts que tengan en cuenta que el registro ya existe. Secuencias: Objetos especiales que generan una secuencia de números. Columnas generadas: Es posible, en el momento de crear una tabla, indicar que una columna se obtiene operando sobre otras, o a través de una secuencia. Esto permite simplificar los querys y mejorar el rendimiento. Jesús Jiménez Herranz, http://oposcaib.wikispaces.com 7