Tema 33. El lenguaje SQL 31/05/2011 Tema 33. El lenguaje SQL Introducción.......................................................................................................................1 Modos de uso.....................................................................................................................2 Ejecución de las sentencias SQL...................................................................................2 Instrucciones DDL – Data Definition Language-..............................................................3 Instrucciones DML – Data Manipulation Language-........................................................4 Instrucciones DQL – Data Query Language-....................................................................5 Creación de vistas..............................................................................................................6 Control de acceso a los datos.............................................................................................6 Control de transacciones....................................................................................................7 Críticas al lenguaje SQL....................................................................................................8 Introducción El lenguaje SQL (Structured Query Language) es el lenguaje estándar para interactuar con las bases de datos relacionales. Su antecesor fue el SEQUEL – Structured English QUEry Language -, lenguaje desarrollado por IBM. En 1986, la ISO – La Organización internacional de estandarización- publicó la primera versión de SQL. La versión actual de SQL es el SQL:2006, una versión que establece como usar SQL con XML. A pesar de su nombre, SQL no es sólo un lenguaje de consulta de datos –DQL-, posee las siguientes características: • Posee instrucciones de definición de datos –DDL• Posee instrucciones de manipulación de datos –DDL• Posee instrucciones de creación de vistas. • Posee instrucciones de definición del control de acceso a los datos. • Posee instrucciones de control de la integridad de los datos. • Posee instrucciones de control de transacciones. El lenguaje SQL es un lenguaje declarativo, es decir, especifica que operaciones se deben realizar pero no cómo. Se basa en el lenguaje formal de cálculo relacional, pero tiene una sintaxis y un léxico más amigables. SQL incorpora unas pocas operaciones del álgebra relacional. SQL es un lenguaje orientado a realizar operaciones complejas sobre datos simples almacenados y organizados dentro de bases de datos relacionales. SQL trabaja a nivel conceptual, es por ello que el estándar no contempla la gestión de índices desde el SQL2. Aunque el SQL de las bases de datos si posee esta funcionalidad. El motivo es que los fabricantes implementan el lenguaje SQL con más funcionalidad. Esto da lugar a incompatibilidades. La gestión de índices con SQL es diferente por ejemplo entre ORACLE y MySQL. Página 1 de 8 Tema 33. El lenguaje SQL 31/05/2011 Modos de uso El SQL permite fundamentalmente dos modos de uso: • Un uso interactivo, destinado principalmente a los usuarios finales avanzados, en el que las sentencias SQL se escriben y ejecutan en línea de comandos, o un entorno semejante. • Un uso integrado, destinado al uso por parte de los programadores dentro de programas escritos en cualquier lenguaje de programación anfitrión. En este caso el SQL asume el papel de sublenguaje de datos. En el caso de hacer un uso embebido del lenguaje podemos utilizar dos técnicas alternativas de programación: SQL estático, las sentencias SQL aparecen fijas en los programas, no cambian durante la ejecución del programa. 1. SQL dinámico, se produce una modificación total o parcial de las sentencias en el transcurso de la ejecución del programa. 2. La utilización de SQL dinámico permite mayor flexibilidad y mayor complejidad en las sentencias, pero como contra punto obtenemos una eficiencia menor y el uso de técnicas de programación más complejas en el manejo de memoria y variables. Ejecución de las sentencias SQL SQL es un lenguaje declarativo. O sea, que especifica que es lo que se quiere y no como conseguirlo, por lo que una sentencia no establece explícitamente un orden de ejecución El orden de ejecución interno de una sentencia puede afectar gravemente a la eficiencia del SGBD, por lo que se hace necesario que éste lleve a cabo una optimización antes de la ejecución de la misma. Muchas veces, el uso de índices acelera una instrucción de consulta, pero ralentiza la actualización de los datos. Dependiendo del uso de la aplicación, se priorizará el acceso indexado o una rápida actualización de la información. La optimización difiere sensiblemente en cada motor de base de datos y depende de muchos factores. Como he indicado en la introducción, SQL trabaja a nivel conceptual, es por ello que no tiene en cuenta el uso de índices o la optimización de las instrucciones. La optimización de las instrucciones SQL dependen de las características de cada SGBD, aunque existen técnicas de optimización de las sentencias SQL comunes a todos los SGBD. Página 2 de 8 Tema 33. El lenguaje SQL 31/05/2011 Instrucciones DDL – Data Definition LanguageSQL utiliza los términos tabla, fila y columna para referirse a las relaciones, tuplas y atributos, respectivamente. El esquema y el catálogo en SQL SQL organiza las tablas en esquemas. Las tablas y otros componentes de una misma base de datos de una aplicación pertenecen a un mismo esquema. La instrucción de creación de un esquema es: CREATE SCHEMA NOM_ESQUEMA AUTHORIZATION NOM_USUARIO Los esquemas de un mismo entorno SQL se almacenan en un mismo catálogo. Los esquemas de un mismo catálogo pueden compartir elementos, como la definición de un dominio. Creación de objetos La creación de objetos dentro de un esquema se realiza con la instrucción “create”. El objeto puede se una tabla, una vista, una función... Por ejemplo: Para crear una tabla se especifica su nombre, las columnas (nombre, tipo de datos y el valor por defecto) y las ligaduras a nivel de columna (clave obligatoria, clave única) como de fila (clave primaria, clave externa). Ejemplo: CREATE TABLE TABLA1 ( CODIGO VARCHAR2(10), COLUMNA1 VARCHAR2(8) NOT NULL, COLUMNA2 INT DEFAULT 1, PRIMARY KEY (CODIGO), FOREIGN KEY (COLUMNA2) REFERENCES TABLA2(CODIGO)); La modificación de los objetos se consigue con la instrucción “alter”. Por ejemplo: Se puede modificar la tabla posteriormente con la instrucción ALTER TABLE <nombre tabla> [ADD|DROP <tipo elemento>] [columnas o ligaduras] (CASCADE | RESTRICT] . Ejemplo: ALTER TABLE TABLA ADD COLUMNA 3 BOOLEAN; El termino CASCADE indica que, en el caso de borrar una columna, elimine todas las vistas y ligaduras asociadas. RESTRICT se utiliza para indicar que no borre la columna en el caso de haber vistas o ligaduras asociadas a ella. La eliminación de los objetos se realiza con la instrucción “drop”. Para borrar una tabla: DROP TABLE <nombre de la tabla> Dominios SQL permite crear dominios de datos escalares y simples. Como por ejemplo: CREATE DOMAIN t_nombre CHAR(20) Los tipos de dominio predefinidos por SQL son: char(n), varchar(n), int, smallint, numeric(p,d), real , float(n) y date. Página 3 de 8 Tema 33. El lenguaje SQL 31/05/2011 Instrucciones DML – Data Manipulation LanguageSon las instrucciones encargadas de la modificación la información almacenadas dentro de las tablas. Existen tres instrucciones básicas Insert: Inserta nuevos registros en una tabla. Antes de insertar un registro comprueba que se cumplan todas las restricciones –constraints- que le afecten. INSERT nombre_tabla [(Columna1, Columna2,...)] VALUES (value1, value2...); Si no se indica el nombre de las columnas donde insertar los valores, se utiliza el mismo orden que aparecen en el esquema de la tabla. Si una columna no se le indica un valor, se pone a nulo. Delete: Elimina registros de una tabla. Con la cláusula “where” se indica que registros hay que eliminar. DELETE FROM nombre_tabla WHERE predicado; Update: Modifica el valor de la columnas de los registros de una tabla determinada. Los registros a modificar se indican en las cláusulas “where”. UPDATE nombre_tabla SET Columna1 = valor1, Columna2 = valor2... WHERE predicado; En la cláusula “set” se indica que columnas se modifican y que valores se utilizan. Además de estas tres instrucciones, existen otras dos: Merge: Definida en el estándar SQL:2003. Sirve para combinar datos de múltiples tablas. Truncate: No es una instrucción estándar, pero es común a la mayoría de las extensiones del SQL de los fabricantes. Sirve para eliminar rápidamente todos los datos de una table. Página 4 de 8 Tema 33. El lenguaje SQL 31/05/2011 Instrucciones DQL – Data Query LanguageSQL tiene una sola instrucción para realizar consultas: el Select. Aunque está es la instrucción más versátil de todo el juego de instrucciones de SQL. La instrucción SQL no es una instrucción 100% válida según el modelo relacional formal. Dado que este modelo exige que todas las operaciones con relaciones den como resultado otra relación. El Select puede dar como resultado una tablea no válida, pues permite que haya registros repetidos. La instrucción sql básica es la siguiente: SELECT [DISTINCT | ALL] expresión1, expresión2... FROM tabla1, tabla2... La cláusula SELECT indica las expresiones que se utilizarán para obtener los datos que compondrán las tuplas devueltas en las consulta. Las expresiones utilizan generalmente los datos de las columnas de las tablas señaladas en la clausula FROM. Las tablas utilizadas pueden renombrarse utilizando el operador “AS”, aunque no es obligatorio. La palabra clave DISTINCT sirve para indicar que queremos que la consulta no devuelva tuplas repetidas. La palabra “ALL” significa lo contrario, queremos que aparezcan todas las tuplas. La instrucción select puede además contener las siguientes cláusulas: Where: Contiene un predicado utilizado para determinar que tuplas de las tablas de entrada se utilizan. Ejemplo: SELECT nombre FROM usuario AS usu WHERE usu.cod_dept = 1; Selecciona el nombre de todos los usuarios del departamento 1. Order by: Indica que las tuplas resultantes deben ser ordenadas por los valores de una o varias de sus columnas. El orden se establece con las palablas “ASC” -ascendente- o DESC –descendente-. Por defecto es ascendente. SELECT nombre, DNI FROM usuario ORDER BY DNI; Muestra los valores de las columnas nombre y DNI de la tabla usuario, ordenadas por el valor del DNI. Group by: Esta cláusula sirve para indicar como hacer las agrupaciones al utilizar funciones de agrupación. SQL proporciona por defecto cinco funciones de agrupación: sum(), avg(), count(), max() y min(). Having: Se utiliza siempre junto a la cláusula “group by”. Sirve para establecer un predicado que debe cumplir la función de agragación. Ejemplo: SELECT nombre, count(*) FROM usuario GROUP BY nombre HAVING count(*) > 1 Muestra los nombres y el némero de usuarios con ese nombre siempre que sea mayor que 1 de la tabla usuario. Página 5 de 8 Tema 33. El lenguaje SQL 31/05/2011 Funciones SQL proporciona un conjunto de funciones utilizables en las consultas. Estas funciones son: 1. De agregación: Vistas anteriormente. 2. De conversión de tipo: Permiten transformar el tipo de dato del parámetro de entrada. To_char(), to_date(), to_numbre()... Ejemplo: SELECT nombre FROM usuario WHERE to_char(fecha_nacimiento,’YYYY’); 3. De manejo de Strings: LTRIM, LIKE, SUBSTR()... 4. De manejo de números: exp(), abs(), power()... Creación de vistas Las vistas son tablas virtuales, generalmente de solo lectura, cuyos datos se obtienen dinámicamente de otras tablas. Su finalidad es obtener una visión diferente a la visión conceptual de los datos. Se utilizan para: 1. Mostrar los datos de una forma más clara al usuario. 2. Ocultar datos confidenciales, haciendo que no aparezcan en las vistas usadas. 3. Permitir modificar la estructura lógica de la BD sin que se vean afectadas las aplicaciones. Se modifican las vistas para que sigan mostrando los mismos datos. Las funciones utilizadas para la creación y eliminación de las vistas son create y drop. Ejemplo: CREATE VIEW nombre_de_la_vista AS (Sentencia select). CREATE VIEW usuarios_por_pais AS ( SELECT pais, count(*) FROM usuario GROUP BY pais ) Control de acceso a los datos SQL implementa medidas de seguridad utilizando un control de acceso discreccional, basado en dar y revocar permisos a los usuarios. Existen dos tipos de permisos: A nivel de cuenta. A un usuario se le dan privilegios sobre la base de datos. Se le permite crear vistas, tablas, esquemas... A nivel de tabla. Se restringe el acceso y operaciones a tablas y vistas. En SQL, los usuarios están identificados. Generalmente la autentificación se realiza mediante mecanismos de usuario-contraseña. Además los usuarios pueden estar clasificados en roles. Los roles agrupan a los usuarios con unas funciones comunes en una aplicación. El control de acceso puede realizarse a nivel de usuario o de rol, aunque es mejor hacerlo a nivel de rol, pues facilita la administración. Página 6 de 8 Tema 33. El lenguaje SQL 31/05/2011 El creador de un objeto, por ejemplo una vista, se convierte en el dueño del objeto y está capacitado en otorgar, en primera instancia, los privilegios sobre sus tablas o vistas. Las sentencias básicas de control de los privilegios son: Grant. Otorga un privilegio a un usuario o rol sobre una tabla o vista. GRANT (privilegio)+ ON tabla TO ( USER | ROLE ) [WITH GRANT OPTION]. Los privilegios pueden ser: select, update, delete, insert y reference. Reference es el privilegio de poder crear restricciones sobre la tabla. Los privilegios generalmente se aplican a nivel de tabla, aunque update, insert y reference pueden darse a nivel de columna. La opción “With grant option” permite al usuario poder a su vez otorgar el privilegio a otros. Revoke: Se utiliza para revocar un privilegio concedido. Control de transacciones SQL establece controles sobre el acceso concurrente a tablas y sus columnas para poder asegurar la consistencia de las operaciones sobre los datos. Las instrucciones de control de transacción son: Start transaction: Indica donde comienza la transacción. En muchos entornos, el inicio de transacción se realiza por defecto, por lo que no es necesario el uso de esta sentencia. Commit: Da validez a todos los cambios realizados en la transacción. Rollback: Ordena deshacer los cambios realizados en la transacción. Las transacciones en SQL tienen tres características: Modo de acceso: “Read write” y “Read Only” Nivel de diagnóstico: Número de condiciones simultáneas del área de diagnóstico. Insolation: Nivel de consistencia exigida, de más a menos son: Operaciones serializables, lectura repetible, lectura confirmada y lectura no confirmada. Las transacciones se configuran con la instrucción siguiente: SET TRANSACTION (modo de acceso) DIAGNOSTIC LEVEL N (nivel de consistencia); Ejemplo: SET TRANSACTION READ ONLY DIAGNOSTIC LEVEL SERIALIZABLE; Página 7 de 8 Tema 33. El lenguaje SQL 31/05/2011 Críticas al lenguaje SQL Los inconvenientes de SQL como lenguaje son: Es un lenguaje demasiado extenso. Su sintaxis similar al inglés, destinada a facilitar su uso por usuarios no técnicos, provoca que el código SQL sea muy extenso. Las implementaciones en los diferentes SGBD son inconsistentes entre ellos y, muchas veces, incompatibles. Esto es debido que los fabricantes de sistemas de gestión de BD amplían la funcionalidad del SQL de sus productos. Usar esta funcionalidad extra limita las ventajas de SQL como lenguaje estándar. No dispone de mecanismos que faciliten el manejo de las sentencias de consultas complejas y extensas, lo que provoca problemas de mantenibilidad del código. Página 8 de 8