Introducción al SQL (Parte 1: Los tipos de datos)

  El lenguaje de consulta estructurada ["Structured Query Language" ("SQL"), en inglés], más conocido popularmente como lenguaje SQL o SQL a secas, es un lenguaje específico del dominio utilizado en programación, diseñado para administrar, y recuperar información de sistemas de gestión de bases de datos relacionales.  Una de sus principales características es el manejo del álgebra y el cálculo relacional para efectuar consultas con el fin de recuperar, de forma sencilla, información de bases de datos, así como realizar cambios en ellas.
  Este tipo de lenguaje informático consiste en un lenguaje de definición de datos, un lenguaje de manipulación de datos y un lenguaje de control de datos. El alcance de SQL incluye la inserción de datos, consultas, actualizaciones y borrado, la creación y modificación de esquemas y el control de acceso a los datos. A veces, el SQL también se describe como un lenguaje declarativo, puesto que incluye elementos procesales.
  Actualmente, este tipo de lenguaje es el lenguaje de base de datos más usado. De hecho, hace tiempo que pasó a ser el estándar del ANSI y de la ISO, siendo revisado para incluir más características desde entonces. No obstante, la mayoría de los códigos SQL no son completamente portables entre sistemas de bases de datos diferentes sin ajustes.

  SQL es un lenguaje de acceso a bases de datos que explota la flexibilidad y potencia de los sistemas relacionales y permite así gran variedad de operaciones.
  Es un lenguaje declarativo de "alto nivel" o "de no procedimiento" que, gracias a su fuerte base teórica y su orientación al manejo de conjuntos de registros, y no a registros individuales, permite una alta productividad en codificación y la orientación a objetos. De esta forma, una sola sentencia puede equivaler a uno o más programas que se utilizarían en un lenguaje de bajo nivel orientado a registros. Asimismo, también tiene las siguientes características:
  •   Lenguaje de definición de datos (LDD): El LDD de SQL proporciona comandos para la definición de esquemas de relación, borrado de relaciones y modificaciones de los esquemas de relación.
  •   Lenguaje interactivo de manipulación de datos (LMD): El LMD de este lenguaje incluye lenguajes de consultas basados tanto en álgebra relacional como en cálculo relacional de tuplas.
  •   Integridad: El LDD de SQL incluye comandos para especificar las restricciones de integridad que deben cumplir los datos almacenados en la base de datos.
  •   Definición de vistas: El LDD incluye comandos para definir las vistas.
  •   Control de transacciones: SQL tiene comandos para especificar el comienzo y el final de una transacción.
  •   SQL incorporado y dinámico: Esto quiere decir que se pueden incorporar instrucciones de SQL en lenguajes de programación como: C++, C, Java, PHP, Cobol, Pascal y Fortran.
  •   Autorización: El LDD incluye comandos para especificar los derechos de acceso a las relaciones y a las vistas.

TIPOS DE DATOS

    Al igual que sucede en otras clases de programación, el lenguaje SQL tiene su propia manera de definir y clasificar los datos con los que trabaja. De este modo, se consideran los siguientes tipos de dato básicos:

Cadena
  La cadena de caracteres ("string", en inglés), que puede ser sólo de texto, o de caracteres alfanuméricos, se entrecomillan al utiizarse en consultas en SQL. En SQL hay de dos subtipos genéricos:
  •   CHAR [(n)]: Datos de cadena de longitud fija. La "n" define la longitud de la cadena en bytes, que  debe ser un valor entre 1 (el predeterminado si no se especifica otro) y 8000. Para juegos de caracteres de codificación de byte único, como el latino, el tamaño de almacenamiento es n bytes y el número de caracteres que se pueden almacenar también es "n". Para los juegos de caracteres de codificación multibyte, el tamaño de almacenamiento sigue siendo n bytes, pero el número de caracteres que se pueden almacenar puede ser menor que n. Se debe utilizar cuando los tamaños de las entradas de datos de columna sean coherentes.
  •   VARCHAR [(n | max)]: Datos de cadena de longitud variable. La "n" define la longitud de la cadena en bytes,  que puede ser un valor entre 1 y 8000. Por su parte, el "max" indica que el tamaño máximo de almacenamiento es de 2^31-1 bytes (2 GB). Para juegos de caracteres de codificación de byte único, como el latino, el tamaño de almacenamiento es n bytes + 2 bytes y el número de caracteres que se pueden almacenar también es n. Para los juegos de caracteres de codificación multibyte, el tamaño de almacenamiento sigue siendo n bytes + 2 bytes, pero el número de caracteres que se pueden almacenar puede ser menor que n. Se debe utilizar cuando los tamaños de las entradas de datos de columna varíen considerablemente; en el caso de "max", se debe emplear cuando los tamaños de las entradas de datos de columna varíen de forma considerable y la longitud de la cadena pueda superar los 8000 bytes.
Número
  Tipo de dato que implica únicamente números, por lo que no se entrecomillan en las consultas de SQL. SQL posee varios subtipos de este tipo:
  •   BIT: Tipo de datos entero que puede aceptar los valores "1", "0" o "NULL". Algunos sistemas de gestión de bases de datos pueden optimizar el almacenamiento de las columnas de tipo bit. Los valores de cadena "TRUE" y "FALSE" se pueden convertir en valores de tipo bit: "TRUE" se convierte en "1" y "FALSE" en "0". La conversión a bit promueve cualquier valor distinto de cero a uno.
  •   DECIMAL[ *(***p[ *,***s] )]: Números de precisión y escala fijas. Cuando se utiliza la precisión máxima, los valores válidos se sitúan entre - 10^38 +1 y 10^38 - 1. La precisión (p) consiste en el número total máximo de dígitos decimales que almacenará, tanto a la izquierda como a la derecha del separador decimal; esta debe ser un valor comprendido entre "1" y la precisión máxima de "38", siendo la predeterminada "18". por su parte, la escala (s) es el número de dígitos decimales que se almacenará a la derecha del separador decimal; dicho número se extrae de p para determinar el número máximo de dígitos a la izquierda del separador decimal; la escala debe ser un valor comprendido entre "0" y p, y solo es posible especificar la escala si se ha especificado la precisión; la escala predeterminada es "0"; por tanto, 0 <= s <= p. Los tamaños de almacenamiento máximo varían según la precisión. El lenguaje SQL considera cada combinación específica de precisión y escala como un tipo de datos distinto. Además, una constante con un separador decimal se convierte automáticamente a un valor de datos numeric (que es igual al decimal a efectos prácticos), con la precisión y escala mínimas necesarias. Algunos gestores de bases de datos utilizan el redondeo cuando convierten un número a un valor decimal o numeric con una precisión y una escala inferiores. La transformación de datos de este tipo a datos de números enteros o de coma flotante pueden provocar pérdida de precisión, y el proceso inverso (que también puede hacerse con datos de tipo monetario) puede provocar desbordamiento.
Tamaños de almacenamiento
PRECISIÓN
BYTES DE ALMACENAMIENTO
1 - 9 5
10 - 19 9
20 -28 13
29 - 38 17

  •   FLOAT[(n)]: Se trata de los números decimales, donde existen varios tipos de dato con diferente rango de valores posibles, la parte entera se separa con un punto de la parte decimal. Este es un tipo de dato numérico y aproximado que se utiliza con datos numéricos de coma flotante, que son aproximados; por tanto, no todos los valores del rango del tipo de datos se pueden representar con exactitud. "n" es el número de bits que se usan para almacenar la mantisa del número de coma flotante en notación científica y, por tanto, dicta su precisión y el tamaño de almacenamiento. Si se especifica "n", debe ser un valor entre "1" y "53". El valor predeterminado de "n" es "53". Los valores de coma flotante se truncan cuando se convierten a cualquier tipo de entero. Otro tipo de datos equivalente a este es "real".
  •   NÚMERO ENTERO: Para los números enteros ("integer", en ingés) existen varios tipos de dato de tamaño fijo, pudiéndose elegir uno u otro en función del tamaño máximo que se necesite establecer. Cuando se trata de números es más correcto hablar de rango que de tamaño, es decir, bajo que rango de valores (máximo y mínimo) se puede operar con ese tipo. Así, existe bigint [de -2^63 (-9.223.372.036.854.775.808) a 2^63-1 (9.223.372.036.854.775.807)], int [de -2^31 (-2.147.483.648) a 2^31-1 (2.147.483.647)], smallint [de -2^15 (-32.768) a 2^15-1 (32.767)], y tinyint (de 0 a 255).
  •   MONEY: Tipos de datos que representan valores monetarios o de moneda. Al igual
    que sucedía con los números enteros, posee varias opciones según el rango de valores (máximo y mínimo) existente. De este modo, se utiliza money con un rango de -922.337.203.685.477,5808 a 922.337.203.685.477,5807 (de -922.337.203.685.477,58 a 922.337.203.685.477,58); y se emplea smallmoney si el rango es desde -214.748,3648 a 214.748,3647. Los tipos de datos money y smallmoney tienen una precisión de una diezmilésima de las unidades monetarias que representan. Al igual que sucedía con los tipos decimal y float, se usa un punto para separar las unidades parciales de moneda, como céntimos, de las unidades completas de moneda. Además, aunque es posible especificar valores monetarios precedidos de un símbolo de moneda, ciertos gestores de bases de datos no almacenan ninguna información de moneda asociada con el símbolo, solo almacenan el valor numérico.
Fecha y hora
  Son tipos de datos que definen fechas y horas en las bases de datos. Existen los siguientes subtipos de SQL:
  •   DATE: Este tipo de dato tiene el tamaño apropiado para registrar un dato de: año + mes + día (formato predeterminado). Date se expresa en forma de cadena con un formato determinado, de modo que quien procesa ese dato sabe cual es el año, el día o el mes en función de la posición que ocupa en la cadena alfanumérica. Al expresarse en forma de cadena, o si el usuario lo necesita, como una cadena con un formato concreto [el formato predeterminado es "aaaammdd" ("aaaa" =año, "mm" = mes, "dd" = día)]  y sus posibles valores restringidos a una fecha válida [el intervalo temporal válido es de 0001-01-01 a 9999-12-31 (del 1 de enero del año 1 E. C. al 31 de diciembre de 9999 E. C.)], debe siempre entrecomillarse cuando aparece como constante en una consulta en SQL.
  •   DATETIME: Define una fecha que se combina con una hora del día con fracciones de segundos basada en un reloj de 24 horas. El intervalo de fechas es desde el 01.01.53 hasta el 31.12.99; el intervalo horario va desde 00:00:00 hasta 23:59:59,997, siendo su valor predeterminado "1900-01-01 00:00:00". Existe una versión mejorada de este tipo de dato llamada datemine2 que tiene rango de fechas mayor [de 0001-01-01 a 31.12.99 (del 1 de enero del año 1 después de Cristo al 31 de diciembre de 9999)], un valor predeterminado mayor de precisión fraccionaria y una precisión opcional especificada por el usuario.
  •   DATETIMEOFFSET [(precisión de fracciones de segundo)]: Define una fecha que se combina con una hora del día con reconocimiento de zona horaria y basado en un reloj de 24 horas. Su intervalo de fechas va desde 0001-01-01 hasta 31.12.99 (del 1 de enero del año 1 E. C. al 31 de diciembre de 9999 E. C.), mientras que el intervalo de horas es de 00:00:00 a 23:59:59,9999999; además, posee un intervalo de zona horaria que va desde -14:00 hasta + 14:00. Su valor predeterminado es "1900-01-01 00:00:00 00:00". 
  •   SMALLDATETIME: Define una fecha que se combina con una hora del día. La hora está en un formato de día de 24 horas, con segundos siempre a cero (: 00) y sin fracciones de segundo. Este tipo de dato tiene un intervalo de fechas de 1900-01-01 a 2079-06-06 (del 1 de enero de 1900 hasta el 6 de junio de 2079), un intervalo horario de 00:00:00 a 23:59:59, y un valor predeterminado de "1900-01-01 00:00:00".
  •   TIME [(escala de fracciones de segundo)]: Define una hora, que no distingue la zona horaria y está basada en un reloj de 24 horas, de un día. La "escala de fracciones de segundo" especifica el número de dígitos de la parte fraccionaria de los segundos, que puede ser un entero de 0 a 7. Posee un intervalo desde 00:00:00.0000000 hasta 23:59:59.9999999, siendo su valor predeterminado "00:00:00", que también se emplea para la parte de fecha anexada en la conversión implícita de date a datetime2 o datetimeoffset.


  Espero que la presente entrada haya sido del gusto del lector. Si es así, aguardo que este la comente y/o la comparta, por favor.


No hay comentarios:

Publicar un comentario

Deje aquí su comentario, si no puede comentar, pruebe a hacerlo desde otro navegador de red u otro equipo.