SQL SERVER 2008-2012 Curso Teórico-Práctico
IMPLEMENTACION DE LA BASE DE DATOS
Nomenclatura Todas las tablas tendrán: - Un identificador de tipo entero auto numérico. Ésta será la clave primaria. La denominamos ID para poder compatibilizar con el framework. Un indicador de baja lógica denominado FLAG_MOSTRAR que admitirá 0 1 como valores 0 el registro es visible 1 el registro se considera eliminado Para procesos internos utilizamos también el valor 99 -Un campo de ultima modificación, donde se almacenará la fecha y hora en que un registro se dio de alta o ha sido modificado. Sirve también para bloquear lógicamente un registro, llamada ULTIMA_MODIFICACION Un campo de usuario donde se almacenará el usuario que realizó el alta o modificación del registro, denominada USUARIO Un campo que se utiliza para almacenar el ID de transacción del framework cuando el programa realiza una acción sobre un registro denominado IDTX
Nomenclatura Otras especificaciones Al utilizar un campo como clave foránea o referenciar al id de otra tabla utilizaremos el nombre ID + NOMBRE TABLA Tendremos una tabla de log por cada tabla a auditar, actualizada por un trigger. Un diseño tipo se observa en la siguiente figura, los tipos de datos son los reales. PERSONAS Nombre Tipo Nulos ID int NOT NULL ID_GRADOS int NULL NOMBRE APELLIDO varchar(5 0) varchar(5 0) NULL NOT NULL FECHA_NAC datetime NULL FLAG_MOSTRAR Tinyint NOT NULL IDTX Bigint NULL ULTIMA_MODIFICACI ON GRADOS ID Datetime NOT NULL
Consultas T-SQL - Es el lenguaje utilizado para realizar las consultas en SQL server - No es un lenguaje estándar aunque cumple con varios estándares del SQL genérico. Permite Selección de datos Actualización de datos Inserción de datos Eliminación de datos Selección de datos Se utiliza la instrucción SELECT Selección de un conjunto de columnas sobre un conjunto de datos de una o varias tablas. Para elegir el conjunto de datos se utiliza la expresión FROM
Consultas Elementos de una consulta SELECT Instrucción de selección, se indican las columnas a obtener. FROM Especifica el origen de datos. WHERE Condiciones a aplicar. GROUP BY Para consultas agrupadas se indican las columnas a agrupar. HAVING Devuelve para las consultas agrupadas valores especificos. ORDER BY Indica como será el ordenamiento de los resultados El orden de ejecución de una consulta se realiza en el siguiente orden: FROM WHERE GROUP BY HAVING SELECT ORDER BY
Consultas - Clausulas FROM -Se debe especificar el nombre de las tablas de donde se obtendrán los datos. Un SELECT con FROM devuelve los datos de todas las filas de una tabla. Se puede especificar un alias para las tablas SELECT NOMBRE, APELLIDO P WHERE -Se indica la expresión lógica para filtras las filas que serán devueltas. Se devolverán aquellas filas cuya expresión sea TRUE. Se escribe SELECT COLUMNAS FROM TABLA WHERE CONDICIÓN Ej: SELECT NOMBRE, APELLIDO P WHERE FECHA_NAC> 31/12/1970
Consultas - Clausulas GROUP BY -Devuelve los resultados agrupados por las columnas que se elijan como grupo. Ejemplo SELECT DNI, YEAR(FECHA_NAC) GROUP BY YEAR(FECHA_NAC) Se pueden utilizar en consultas de agregación SUM AVG MAX MIN COUNT SELECT YEAR(FECHA_NAC), COUNT(*), GROUP BY YEAR(FECHA_NAC) Devuelve las cantidades de la tabla personas nacidas por año. Consideraciones SUM MAX AVG MIN SE REALIZAN SOBRE COLUMNAS ESPECIFICAS -COUNT PUEDE REALIZARSE SOBRE UNA COLUMNA O SOBRE TODAS UTILIZANDO EL *. SI SE REALIZA SOBRE UN CAMPO NO TIENE EN CUENTA EL VALOR NULL Ejemplos: SELECT SUM(IMPORTE) FROM FACTURA SELECT COUNT(*) SELECT COUNT(ID_GRADOS) FROM PERSONAS
Consultas - Clausulas HAVING - Con la cláusula HAVING, se puede especificar un predicado para filtrar los grupos en lugar de filtrado individuales Debido a que la cláusula HAVING se procesa después de que las filas se han agrupado, puede hacer referencia a consultas agregadas SELECT DNI,ANIO,SUM(SANCIONES) FROM SANCIONES WHERE ANIO>2009 HAVING SUM(SANCIONES)>5 Aquí nos devolvería todas las personas por año, que tuvieron mas de 5 sanciones en cada año, a partir del año 2010. SIN HAVING DNI ANI O 238889 99 238889 99 238889 99 2010 7 2011 6 2012 3 SUM (SANCIONES) 240000 2010 3 CON 00 HAVING DNI ANI SUM 240000 2011 O 6(SANCIONES) 00 238889 2010 7 99 238889 99 2011 6 240000 2011 6
Consultas - Clausulas SELECT -Sirve para especificar las columnas que devolverán las consultas. Se pueden especificar alias para las columnas Se pueden realizar operaciones sobre las columnas, pero no sobre los alias. Se pueden incluir funciones como getdate(), substring,funciones propias. Admite consultas como columnas Se puede especificar un alias para las tablas. Mediante la clausula DISTINCT se pueden ignorar valores duplicados Con la clausula TOP, devolvemos una cierta cantidad de registros, los primeros (TOP). SELECT TOP(10) Devuelve los primeros 10registros según la clave primaria. SELECT DISTINCT APELLIDO El resultado serán todos los apellidos que existen en la tabla. SELECT APELLIDO+ +NOMBRE as APENOM, FECHA_NAC AS FECHA NACIMIENTO Retorna el nombre y apellido en una columna llamada APENOM y la fecha de nacimiento en una denominada FECHA NACIMIENTO.
Consultas - Clausulas COMPUTE -Sirve para calcular resultados en base a la consulta. -Se escribe siempre luego del order by, que es obligatorio. [ COMPUTE { { AVG COUNT MAX MIN STDEV STDEVP VAR VARP SUM } ( expression ) } [,...n ] [ BY expression [,...n ] ] ] AVG COUNT MAX MIN STDEV STDEVP VAR VARP SUM son las funciones de agregado que admite No existe para count(*) No se permite utilizar la palabra clave DISTINCT Pueden especificarse cortes de control, utilizando mas de un compute BY Ejemplo SELECT DNI, CANT_SANCIONES, TIPO_SANCION FROM SANCIONES ORDER BY DNI, TIPO_SANCION COMPUTE SUM(SANCIONES) by TIPO_SANCION COMPUTE SUM(SANCIONES) UNION Devuelve los resultados de la combinación de 2 o mas consultas El número y el orden de las columnas deben ser idénticos en todas las consultas Los tipos de datos deben ser compatibles. SELECT CAMPO1, CAMPO2 FROM TABLA1 UNION SELECT CAMPO1, CAMPO2 FROM TABLA2 Si se especifica UNION ALL devuelve las filas duplicadas, si no las ignora. El order by se especifica al final de la consulta y debe ser sobre campos que estén en el resultado
Consultas - Clausulas ORDER BY -Determina como estarán ordenados los resultados. -Se escribe al final de la consulta Admite orden ascendente y descendente Se puede dentro de la misma consulta ordenar por una ascendente y otra descendente Puede especificarse un orden sobre un campo que no este dentro del select pero que forme parte de la consulta PREDICADOS Y OPERADORES =, >=, <=,<>,!=,!>,!< IN LIKE BETWEEN - AND OR NOT () *+/- + concatenación = Asignación
Consultas - Clausulas Precedencia de los operadores 1- () 2- *, /,% 3- +,- (Positivo, negativo, suma, resta, concatenación) 4- =, >=, <=,<>,!=,!>,!< Comparación 5- NOT 6- AND 7- BETWEEN, IN, LIKE, OR 8- = Asignación IN El valor a filtrar puede ser cualquiera de un set de valores. SELECT * WHERE YEAR(FECHA_NAC) in(1988,1989,1990) LIKE Realiza una comparación de campos de tipo texto según un patrón dado. SELECT * WHERE APELLIDO LIKE CON% Devuelve aquellas personas cuyo apellido comience con CON BETWEEN Filtra por un rango especificado. SELECT * WHERE FECHA_NAC BETWEEN 01/01/1980 and 01/01/1991 Retorna quienes nacieron entre el 01/01/1980 y el 01/01/1991
Consultas - Clausulas Ejemplo de consulta SELECT NOMBRE + +APELLIDO as APENOM,DNI WHERE (FECHA_NAC BETWEEN 01/01/1980 and 01/01/1991 OR YEAR(FECHA_NAC) IN(1988,1989,1990)) AND NOT APELLIDO LIKE CON % Valores nulos Se pueden filtrar con IS NULL IS NOT NULL EJEMPLO SELECT * FROM UNIFORMADOS WHERE FECHA_BAJA IS NOT NULL Retorna los uniformados que tienen fecha de baja. Se puede forzar un valor nulo con la función ISNULL o COALESCE que es estandar.
Consultas Funciones Comunes Manejo de caracteres, funciones mas comunes Operador+ SELECT NOMBRE + +APELLIDO SUBSTRING SELECT SUBSTRING( 12345,1,3) LEFT SELECT LEFT( ertyu,3) RIGHT SELECT RIGHT( qwerty,2) LEN SELECT LEN( pepe ), SELECT LEN(APELLIDO) DATALENGTH SELECT DATALENGTH(APELLIDO) CHARINDEX SELECT CHARINDEX( X, ASSX,1) PATINDEX SELECT PATINDEX('%[0-9]%', e23h') REPLACE SELECT REPLACE( cadena, DE, de ) REPLICATE SELECT REPLICATE( 0,10) UPPER SELECT UPPER ( minuscula ) LOWER SELECT LOWER ( MAYUSCULA ) RTRIM SELECT RTRIM( ESPACIOS ) LTRIM SELECT RTRIM( ESPACIOS ) FORMAT SELECT FORMAT (2233, 0000000 ) Manejo de fecha y hora, funciones mas comunes - LITERALES una fecha se puede expresar en una cadena literal como aaaammdd CAST SELECT CAST( 02/12/2011 as DATETIME) Depende del lenguaje devuelve 2 de febrero de2011 o 2 de diciembre de 2011 Se puede utilizar la sentencia SET LANGUAGE para que devuelva la fecha según el lenguaje. CONVERT SELECT CONVERT(DATETIME, 02/12/2011,101) Devuelve en formato mm/dd/aaaa CONVERT SELECT CONVERT(DATETIME, 02/12/2011,103) Devuelve en formato dd/mm/aaaa YEAR SELECT YEAR(FECHA) MONTH SELECT MONTH(FECHA) DAY SELECT DAY(FECHA) GETDATE() Devuelve la fecha del día DATEADD SELECT DATEADD(DD,31,FECHA) DATEDIFF SELECT DATEDIFF(day,FECHA_DESDE,FECHA_HASTA) DATEPART SELECT DATEPART(month, 12/10/2012 )
Consultas Varios CASE...WHEN Instrucción condicional Se aplica en el SELECT Devuelve una expresión escalar. Acepta 2 modos Evaluando la expresión SELECT CASE [Expresion] WHEN [Valor1] THEN Resultado1 WHEN [Valor2] THEN Resultado2 END AS CAMPO -Sin evaluación de expresión SELECT CASE WHEN CAMPO1<10 THEN Resultado1 WHEN CAMPO1>10 THEN Resultado2 END AS CAMPO Manejo de literales con LIKE Permite búsquedas de cadenas parciales mediante patrones. Utiliza el % como comodín para indicar que a partir de ahí o hasta ahí acepta cualquier valor. SELECT DNI, APELLIDO WHERE APELLIDO LIKE C% Devuelve aquellas personas empiezan con C. El comodín _ (guión bajo) representa un carácter solo que puede tomar cualquier valor a diferencia de % que pueden ser n caracteres. SELECT DNI, APELLIDO WHERE APELLIDO LIKE _O% Devuelve aquellos cuyo apellido tiene como segunda letra una O.
Consultas Varios Manejo de literales con LIKE SELECT DNI, APELLIDO WHERE APELLIDO LIKE _O% Devuelve aquellos cuyo apellido contiene una O. Una [lista de caracteres] como comodín SELECT DNI, APELLIDO WHERE APELLIDO LIKE [ABC]% Devuelve aquellas personas empiezan con A, B o C. Una [lista de caracteres con rango ] como comodín SELECT DNI, APELLIDO WHERE APELLIDO LIKE [A-D]% Devuelve aquellas personas empiezan con A, B,C o. Manejo de literales con LIKE Permite búsquedas de cadenas parciales mediante patrones. Utiliza el % como comodín para indicar que a partir de ahí o hasta ahí acepta cualquier valor. SELECT DNI, APELLIDO WHERE APELLIDO LIKE C% Devuelve aquellas personas empiezan con C. El comodín _ (guión bajo) representa un carácter solo que puede tomar cualquier valor a diferencia de % que pueden ser n caracteres. SELECT DNI, APELLIDO WHERE APELLIDO LIKE _O% Devuelve aquellos cuyo apellido tiene como segunda letra una O. SELECT DNI, APELLIDO WHERE APELLIDO LIKE _O% Devuelve aquellos cuyo apellido contiene una O.
RECURSOS VIRTUALES el aula virtual se encuentran los recursos complementarios referidos a creación de bases de datos en SQL Server