A.1. Definiciones de datos en SQL Las Sentencias del lenguaje de definición de datos (DDL) que posee SQL operan en base a tablas. Las Principales sentencias DDL son las siguientes: CREATE TABLE DROP TABLE ALTER TABLE CREATE INDEX DROP INDEX Las sentencias antes mencionadas restringen la atención a los aspectos que son de directo interés para el usuario y no los aspectos que tienen que ver con el nivel interno del sistema (tales detalles son de importancia para el DBA [15] ). Una tabla base se define en los sistemas relacionales como una fila de encabezados de columnas más cero o más filas con valores de datos. Esta tabla es creada usando la sentencia CREATE TABLE del DDL de SQL. La fila de encabezados de columna especifica una o más columnas asociadas cada una a sus respectivos tipos de datos. Cada fila de datos contiene exactamente un valor de dato para cada columna. No existe un orden de filas, pero es posible imponer un orden sobre ellas. Las columnas están ordenadas de izquierda a derecha pero este orden no es parte del modelo relacional. Las Tablas son autónomas e independientes a diferencia de las vistas las cuales no existen en su propio espacio pero si se derivan de una o más tablas. A.1.1. Comando CREATE TABLE El comando CREATE TABLE se usa para especificar una nueva relación por medio de un nombre y especificando cada uno de sus atributos. A cada atributo se le da un nombre, un tipo de datos (para especificar su dominio) y algunas constraints [16] sobre el atributo. La sintaxis del comando es : CREATE TABLE nombre_de_tabla (definicion_de_columna [,definicion_de_columna ]...) donde la definición de columna es de la forma : nombre_de_columna tipo_de_dato [ NOT NULL ] create table DUENOS ( RUT INTEGER not null, NOMBRE CHAR(30) not null, TELEFONO CHAR(10), DIRECCION CHAR(50) ); A.1.1.1. Definición de NOT NULL (no nulo)
Puesto que SQL permite valores nulos como valores de atributos, una constraint NOT NULL puede ser especificada en un atributo para indicar que no se permiten valores nulos para este atributo. En general NOT NULL debe ser especificado para los atributos que componen la llave primaria de cada relación. A.1.1.2. Tipos de datos SQL Los siguientes tipos de datos son los comúnmente soportados por el estándar SQL. Datos Numéricos INTEGER Entero con signo de 31 bits SMALLINT Entero con signo de 15 bits DECIMAL(p,q) FLOAT(p) Número con signo de p dígitos, q decimales Número de punto flotante, p bits de precisión Datos String CHAR(n) Cadena de texto de largo fijo de n bytes VARCHAR(n) GRAPHIC(n) Cadena de texto de largo variante, hasta los n bytes Cadena de texto de largo fijo, n*2 bytes Datos de Fecha y Hora VARGRAPHIC(n) Cadena de texto de largo variante, hasta los n*2 bytes DATE TIME Fecha (aaaammmdd) Hora (hhmmss) TIMESTAMP Combinación de fecha y hora Tabla A-1 - Tipos de datos de SQL A.1.2. Comando DROP TABLE El comando DROP TABLE se usa para eliminar una relación y su definición de atributos como también borra del catálogo la tupla relacionada a esta. La sintaxis de la Instrucción es : DROP TABLE nombre_de_tabla; drop table DUENOS; A.1.3. Comando ALTER TABLE El comando ALTER TABLE es usado para agregar un atributo a una de las tablas de la base de datos. Además cambia las tuplas en el catalogo de sistema de la BD. El nuevo atributo tendrá el valor nulo (NULL) en todas la tuplas de la relación inmediatamente después de ejecutada la instrucción,
puesto que no se permite la constraint NOT NULL. La sintaxis de este comando es : ALTER TABLE nombre_de_tabla ADD nombre_de_columna tipo_de_dato; alter table DUENOS add VIGENCIA CHAR(1); A.1.4. Comando CREATE INDEX El Comando CREATE INDEX se usa para crear un índice. Cada índice tiene un nombre el cual será usado para borrarlo en caso de que no se necesite más. La sintaxis de este comando es la siguiente: CREATE [ UNIQUE ] INDEX nombre_de_indice ON nombre_de_tabla ( nombre_de_columna [orden] [,nombre_de_columna [orden] ]... ) [CLUSTER]; CLUSTER: La especificación opcional CLUSTER [17] en un comando CREATE INDEX indica si este índice estará el cluster. Una tabla dada puede tener un sólo índice en cluster en un momento dado. ORDER: Toda especificación ORDER en una sentencia SQL CREATE INDEX debe ser ya sea ASC (ascendente) o DESC (descendente) y por lo tanto especifica el orden en que se organizarán los datos, el valor por defecto para ORDER es ASC. UNIQUE: La opción UNIQUE en una sentencia SQL CREATE INDEX especifica que no se permitirán dos registros en la tabla a indexar que tengan el mismo valor para el campo (o la combinación de estos) para el cual se está creando el índice. create unique index DUENO_PK on DUENOS (RUT asc); A.1.5. Comando DROP INDEX El comando SQL DROP INDEX se usa para soltar el índice de la tabla relacionada y borrar la tupla correspondiente desde el catalogo de sistema de la base de datos. Una razón para borrar índices es que es costoso mantenerlos cada vez que la relación base es actualizada y por lo tanto se requiere espacio adicional. Los índices que especifican una constraint de llave (primaria, alterna o externa) no se pueden borrar a menos que se quiera borrar también la constraint asociada. La sintaxis de la cláusula DROP INDEX es: DROP INDEX nombre_de_indice; drop index DUENO_PK; [15] DataBase Administrator. Administrador de la base de datos. [16] Una Constraint es una regla que se debe aplicar a un atributo de una tabla. Las constraints proveen un mecanismo rápido y eficiente para asegurar la integridad de la base de datos sin importar los cambios que requiera el usuario. [17] La técnica de clustering involucra el tratar de almacenar en disco lo más cerca posible los registros que están relacionados lógicamente, de manera de poder mejorar el rendimiento. A.2. Manipulación de datos en SQL
SQL provee cuatro sentencias de manipulación de datos (DML). Esas son: SELECT UPDATE DELETE INSERT A.2.1. Comando SELECT El comando DML SELECT es la sentencia SQL básica para la recuperación de información desde una base de datos. (nótese que el comando SELECT de SQL no guarda relación con el operador de selección del álgebra relacional). La sintaxis del comando es la siguiente: SELECT [DISTINCT] ítem(s) FROM tabla(s) [ WHERE condición ] [ GROUP BY campo(s) ] [ HAVING condición ] [ ORDER BY campos] [ UNION SQL_SELECT] La palabra clave DISTINCT se usa para indicar que los valores duplicados o redundantes deben ser eliminados antes que la función sea ejecutada. DISTINCT puede ser especificada con las funciones agregadas COUNT y AVG pero es totalmente irrelevante para las funciones MAX y MIN. No se puede usar esta cláusula junto con la función especial COUNT(*). La palabra Clave UNIQUE es un sinónimo para DISTINCT y las dos se pueden usar sin distinción. select COUNT(DISCTINCT MARCA) FROM MOVIL; Retorna el número de Marcas de autos que tiene la empresa A.2.1.1. Funciones Agregadas de la cláusula SELECT SQL provee algunas funciones especiales que pueden ser usadas con el comando SELECT. Esas funciones son las siguientes: COUNT SUM AVG MAX MIN COUNT(*) COUNT : La función COUNT se usa para obtener el número de valores en la columna. Opera sobre una colección de valores en una columna de la tabla. La palabra clave DISTINCT se puede usar conjuntamente con COUNT. Si el resultado
del argumento es el conjunto vacío la función COUNT retorna el valor cero. Un ejemplo de COUNT es: SELECT COUNT (DISTINCT MARCA) FROM MOVIL; SUM : La función SUM se usa para sumar los valores de una columna. La función opera sobre una colección de valores en una columna de la tabla. Los valores deben ser numéricos. Si el resultado del argumento es el conjunto vacío, SUM retorna NULL. Un ejemplo de SUM es: SELECT SUM (HORA_HASTA - HORA_DESDE) WHERE PATENTE_MOVIL = 'HL-8483'; AVG : La Función AVG se usa para promediar todos los valores seleccionados en una columna, opera sobre una colección de valores (numéricos) en una sola columna de la tabla. La función AVG puede ir precedida por la palabra clave DISTINCT lo cual promediará sólo los valores únicos. Si el resultado del argumento es el conjunto vacío, AVG retorna NULL. SELECT AVG (HORA_HASTA - HORA_DESDE) WHERE PATENTE_MOVIL = 'HL-8483'; MIN (MAX): La función MIN (MAX) se usa para obtener el menor (mayor) valor en una columna. Ambas funciones operan sobre una colección de valores en una columna. Los valores no necesitan ser numéricos. Si el resultado del argumento es el conjunto vacío, ambas retornan NULL. SELECT MAX (HORA_HASTA - HORA_DESDE) ; SELECT MIN (HORA_HASTA - HORA_DESDE) ; COUNT(*): La función COUNT(*) se usa para contar la cardinalidad de una tabla sin eliminación de valores duplicados. En las funciones anteriores, cualquier valor nulo en el argumento se elimina antes que la función se aplique (indiferentemente de si se usa o no la cláusula DISTINCT). COUNT(*) retorna cero si el resultado del argumento es el conjunto vacío. SELECT COUNT(*) S WHERE PATENTE_MOVIL = 'HL-8483'; A.2.1.2. Cláusula GROUP BY La cláusula GROUP BY en una sentencia SELECT reordena lógicamente la tabla representada por la cláusula FROM en grupos, tal que dentro de cada grupo todas las filas tienen el mismo valor para el campo dado en la cláusula GROUP BY (esto es conceptual; la tablas no se reordena físicamente en la base de datos). Cada expresión en la cláusula SELECT debe ser reducible a valor simple dentro de un grupo, es decir, que puede ser ya sea el mismo campo evaluado en la Cláusula GROUP BY (o talvez una expresión que lo contenga), un literal, o una función tal como SUM que opera sobre todos los valores de un grupo dentro de un campo y que reduce todos aquellos valores a un valor simple.
GROUP BY no implica ORDER BY; para garantizar que el resultado aparezca en un determinado orden se debe especificar también la cláusula ORDER BY. SELECT PATENTE_MOVIL, SUM(HORA_HASTA - HORA_DESDE) GROUP BY PATENTE_MOVIL; A.2.1.3. Cláusula HAVING La cláusula HAVING en una sentencia SELECT se usa para eliminar grupos, (tal como se usa WHERE para eliminar filas). Si se especifica, debe existir una cláusula GROUP BY también. La Expresión en la cláusula HAVING debe ser reducible a valor simple dentro de un grupo. SELECT PATENTE_MOVIL, SUM(HORA_HASTA - HORA_DESDE) GROUP BY PATENTE_MOVIL HAVING SUM(HORA_HASTA - HORA_DESDE) > 10; A.2.1.4. Cláusula ORDER BY Esta cláusula se utiliza en un comando SELECT para producir como resultado una relación en un orden específico. En general, la relación resultado no se garantiza que esté en un orden particular. De ahí que la cláusula ORDER BY se utilice para ordenar el resultado en alguna secuencia particular antes de que los datos sean desplegados. AL igual que la cláusula ORDER del comando CREATE INDEX el argumento puede ser ya sea ASC o DESC. ASC es el valor por defecto. También es posible identificar columnas por su número de columna en lugar de su nombre, esto es, por la posición ordinal (de izquierda a derecha) de la columna en cuestión dentro de la tabla resultado. Esta característica hace posible ordenar un resultado en base a una columna que no tiene nombre. SELECT RUT, NOMBRE FROM CHOFER WHERE SYSDATE < FECHA_LCENCIA_HASTA ORDER BY 2 DESC; A.2.1.5. Cláusula EXIST La cláusula EXISTS en un comando SELECT representa el calificador de
existencia. La expresión se avaluara como verdadera, si y sólo si, el resultado de evaluar la sentencia SELECT... FROM... no es vacía, esto es, si y sólo si, existe un registro en la tabla dada en FROM desde el nivel más externo de la consulta. La negación (NOT EXISTS) es especialmente importante para una cierta clase de consultas bastante más complejas que el común. SELECT PATENTE FROM MOVIL WHERE EXISTS ( SELECT * WHERE MOVIL.PATENTE = VIAJE.PATENTE_MOVIL); A.2.1.6. Subconsultas. Una Subconsulta en una cláusula SELECT es una expresión de la forma SELECT - FROM - WHERE - GROUP BY - HAVING que se anida dentro de otra expresión. Las Subconsultas se usan comúnmente para representar un conjunto de valores que se buscan por medio de una condición IN condición. El sistema evalúa toda la consulta evaluando la Subconsultas anidadas. Ejemplos : * Retorna todos los móviles que tienen más de 10 horas de viaje. SELECT CHOFER.NOMBRE, MOVIL.PATENTE FROM MOVIL, CHOFER WHERE PATENTE IN ( SELECT PATENTE_MOVIL WHERE (HORA_HASTA - HORA_DESDE) > 10) AND MOVIL.RUT_CHOFER = CHOFER.RUT; A.2.2. Comando UPDATE El comando DML UPDATE se usa para modificar valores de atributos de una o más tuplas seleccionadas. Al igual que con el comando SELECT la cláusula WHERE es la que selecciona la o las tuplas que serán modificadas desde una relación simple. La cláusula adicional SET especifica los atributos que serán modificados y sus nuevos valores. La Sintaxis de UPDATE es la siguiente UPDATE nombre_de_tabla SET campo = expresion_escalar [, campo = expresion_escalar ]... [ WHERE condicion ] ; Todos los registros en la tabla que satisfagan la condición serán modificados de acuerdo a sus asignaciones ( campo = expresion_escalar ) en la cláusula SET.
El siguiente ejemplo demuestra el uso del comando UPDATE en un Registro. UPDATE CHOFER SET DIRECCION = Otra Dirección, TELEFONO = 5555555 WHERE RUT = 12657378 El siguiente ejemplo demuestra el uso del comando UPDATE para un conjunto de registros. UPDATE CHOFER SET VIGENCIA = N WHERE SYSDATE > FECHA_LICENCIA_HASTA; A.2.3. Comando DELETE El comando DML DELETE borra tuplas desde una relación. Al igual que el comando UPDATE puede incluir la cláusula WHERE para seleccionar las tuplas a ser eliminadas. Las tuplas son borradas sólo desde una tabla a la vez. Dependiendo del número de tuplas seleccionadas por la condición en la cláusula WHERE será la cantidad (cero, una o más) de tuplas que serán eliminadas con un sólo comando DELETE. Si se omite la cláusula WHERE se asume que todas las tuplas de la relación deben ser borradas, sin embargo la tabla permanece en la base de datos como una tabla vacía. (el comando DROP TABLE se usa para eliminar completamente la tabla, aún si esta no está vacía). La sintaxis del comando DELETE es la siguiente : DELETE FROM table [ WHERE condition ] ; El siguiente ejemplo borra una sola tupla en la tabla base: DELETE FROM MOVIL WHERE PATENTE = 'HL-8205' ; El siguiente ejemplo borra todas las tuplas que satisfagan la condición DELETE FROM MOVIL WHERE ANO <= 1960; A.2.4. Comando INSERT El comando DML INSERT en su forma más simple se usa para agregar una sola tupla a una relación. Se debe especificar el nombre de la relación y una lista de los valores que se agregarán para la tupla. La lista de valores se debe proporcionar en el mismo orden que sus respectivos atributos. Es posible también insertar múltiples registros de una sola vez por medio de una subconsulta.
La sintaxis es la siguiente: INSERT INTO TABLE [ ( campo [, campo ]... ) ] VALUES ( literal [, literal ]... ) ; o INSERT INTO TABLE [ ( campo [, campo ]... ) ] subconsulta; En el primer formato se inserta una fila en la tabla especificada dados los valores para los campos respectivos. En el segundo formato, la subconsulta será evaluada y se insertará en la tabla una copia de su resultado. Omitir la lista de campos es equivalente a especificar una lista con todos los campos de la tabla (en orden de creación, de izquierda a derecha). El siguiente es un ejemplo de la inserción de un sólo registro. INSERT INTO DUENO ( RUT, NOMBRE, VIGENCIA ) VALUES ( 12657378, MARIO CISTERNA, S ); El siguiente ejemplo muestra la inserción por medio de una Subconsultas. INSERT INTO CHOFER (RUT, NOMBRE, TELEFONO, DIRECCION, VIGENCIA) SELECT RUT, NOMBRE, TELEFONO, DIRECCION, VIGENCIA FROM DUENO WHERE VIGENCIA = S