El código SQL extrae información detallada sobre las tablas y columnas en la base de datos "Matricula" en SQL Server. Realiza joins entre vistas del sistema para recuperar los nombres de tablas y columnas, tipos de datos, propiedades como permitir nulos, si son autoincrementables, descripciones, y detalles de claves foráneas. El código provee una forma de obtener los metadatos subyacentes de una base de datos de una manera estructurada y fácil de entender.
Análisis del Diccionario de Datos de la Base de Datos Matricula
1. UNIVERSIDAD NACIONAL TECNOLÓGICA DE LIMA SUR
FACULTAD DE INGENIERÍA Y GESTIÓN
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
TAREA - ANÁLISIS “DICCIONARIO DE DATOS”
CURSO:
GESTIÓN DE BASE DE DATOS
DOCENTE:
Blas Rebaza, Maruja Emelita
ALUMNO:
Tafur Meneses Andy, CÓDIGO 2113110182
Villa El Salvador
2023
2. El código a analizar es el siguiente:
USE Matricula;
SELECT
d.object_id,
a.name [table], -- Identificará la Tabla
b.name [column], -- Identificará la columna
c.name [type], -- Identificará el Tipo
CASE -- Recibe el tipo de columna
-- Cuando c es 'numeric', 'decimal', o 'float', entonces se precisa el número
WHEN c.name = 'numeric' OR c.name = 'decimal' OR c.name = 'float' THEN b.precision
ELSE NULL
END [Precision],
-- Recibe el tamaño máximo de b
b.max_length,
CASE -- Recibe si la columna acepta nulos
WHEN b.is_nullable = 0 THEN 'NO'
3. ELSE 'SI'
END [Permite Nulos],
CASE -- Recibe si la columna es identity (autoincrementable)
WHEN b.is_identity = 0 THEN 'NO'
ELSE 'SI'
END [Es Autonumérico],
ep.value [Descripción], -- Recibe la descripción de la columna (si la hay)
f.ForeignKey, -- Recibe si es llave foránea
f.ReferenceTableName, -- Recibe la referencia de la tabla
f.ReferenceColumnName -- Recibe la referencia de la columna
FROM sys.tables a
-- // Selecciona y muestra toda la información
INNER JOIN sys.columns b ON a.object_id = b.object_id
INNER JOIN sys.systypes c ON b.system_type_id = c.xtype
INNER JOIN sys.objects d ON a.object_id = d.object_id
LEFT JOIN sys.extended_properties ep ON d.object_id = ep.major_id AND b.column_Id =
ep.minor_id
LEFT JOIN (
4. SELECT
f.name AS ForeignKey,
OBJECT_NAME(f.parent_object_id) AS TableName,
COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
OBJECT_NAME(f.referenced_object_id) AS ReferenceTableName,
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS
ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id
) f ON f.TableName = a.name AND f.ColumnName = b.name
WHERE a.name <> 'sysdiagrams'
ORDER BY a.name, b.column_Id;
5. Al correr el código tenemos:
El código que mostré se utiliza para extraer información sobre las estructuras de las tablas y
columnas dentro de la base de datos "Matricula" en un servidor SQL Server. Puede ser
utilizado para obtener detalles como nombres de tablas, nombres de columnas, tipos de
datos, restricciones, propiedades de las columnas, entre otros aspectos relacionados con la
base de datos.
Explicación:
use Matricula
6. La instrucción "use …" es una declaración SQL que se utiliza para seleccionar una
base de datos específica; esto es útil cuando trabajas con múltiples bases de datos
en un servidor de SQL Server y necesitas indicar en cuál de ellas deseas ejecutar tus
consultas y comandos. En este caso, "Matricula" es el nombre de la base de datos
que se desea utilizar.
select
d.object_id,
a.name [table],
b.name [column],
c.name [type],
La sentencia "select" trabaja con varias tablas y vistas del sistema para recuperar
información específica sobre las tablas y columnas en la base de datos "Matricula";
trabaja en conjunto con "FROM sys.tables a", esto lo veremos más adelante.
La tabla 'a' hace referencia a la vista del sistema 'sys.tables', la cual almacena
información acerca de todas las tablas en la base de datos. 'a.name' se refiere a la
columna 'name' de la vista 'a', que contiene los nombres de todas las tablas. El alias
'[table]' se utiliza para renombrar la columna 'name'.
La tabla 'b' hace referencia a la vista del sistema 'sys.columns', que contiene
información sobre las columnas de todas las tablas en la base de datos. 'b.name' se
7. refiere a la columna 'name' de la vista 'b', que almacena los nombres de las
columnas. El alias '[column]' se utiliza para renombrar la columna 'name'.
La tabla 'c' se refiere a la vista del sistema 'sys.systypes', que contiene información
sobre los tipos de datos utilizados en las columnas de las tablas de la base de
datos. 'c.name' se refiere a la columna 'name' de la vista 'c', que almacena los
nombres de los tipos de datos. El alias '[type]' se renombrar la columna 'name'.
La tabla 'd' hace referencia a la vista del sistema 'sys.objects', que contiene
información sobre diversos objetos en la base de datos. 'object_id' es un
identificador único que se asocia a cada objeto en la base de datos. No se utiliza
necesariamente para identificar objetos específicos en la consulta, sino que se
incluye en los resultados de la consulta como parte de la información relacionada
con las tablas y columnas.
CASE
WHEN c.name = 'numeric' OR c.name = 'decimal' OR c.name = 'float' THEN b.precision
ELSE null
END [Precision],
Se coloca "CASE" al iniciar evaluaciones condicionales en SQL.
8. Con "WHEN c.name = 'numeric' OR c.name = 'decimal' OR c.name = 'float'" se
establece una condición. Si el valor de "c.name" es igual a "numeric," o igual a
"decimal," o igual a "float," entonces la condición se cumple. Esto significa que
estamos buscando columnas que tengan tipos de dato numéricos o de punto
flotante.
Con "THEN b.precision", si la condición es verdadera se tomará la acción
especificada después de "THEN". En este caso, la acción es devolver el valor de
b.precision, que es la precisión de la columna. La precisión generalmente se refiere
a la cantidad de dígitos que pueden almacenarse en la columna para los tipos de
datos numéricos y de punto flotante.
Con "ELSE null", si la condición no se cumple entonces se utiliza NULL, que es un
valor especial en SQL que indica la ausencia de un valor concreto.
Se coloca "END" para finalizar la expresión "CASE" y, en este caso, se le asigna un
alias "[Precision]" al resultado.
b.max_length,
Como ya sabemos, la tabla 'b' hace referencia a la vista del sistema 'sys.columns',
que contiene información sobre las columnas de todas las tablas en la base de
datos. 'b.max_length' se refiere a la columna 'max_length' de la vista 'b'; este campo
almacena información sobre la longitud máxima permitida para las columnas de
tipos de datos de caracteres, como char o varchar.
9. CASE
WHEN b.is_nullable = 0 THEN 'NO'
ELSE 'SI'
END [Permite Nulls],
Como sabemos, se coloca "CASE" al iniciar evaluaciones condicionales en SQL.
En "WHEN b.is_nullable = 0 THEN 'NO'", "WHEN" se encarga de establecer la
condición como tal; en "b.is_nullable = 0" notamos que el campo "is_nullable" es un
campo de "b", o sea de la vista "sys.columns", y se utiliza para indicar si una columna
permite valores nulos. Si "is_nullable" es igual a 0, significa que la columna no
permite valores nulos.
"THEN" se ejecuta si la condición "WHEN" es verdadera, y se devuelve la cadena de
texto 'NO'. Esto indica que no se permiten valores nulos en la columna.
"ELSE" se ejecuta si la condición "WHEN" no se cumple, y se devuelve la cadena de
texto 'SI'. Esto indica que se permiten valores nulos en la columna.
Como sabemos, se coloca "END" para finalizar la expresión "CASE" y, en este caso,
se le asigna un alias "[Permite Nulls]" al resultado.
CASE
10. WHEN b.is_identity = 0 THEN 'NO'
ELSE 'SI'
END [Es Autonumerico],
Como sabemos, se coloca "CASE" al iniciar evaluaciones condicionales en SQL.
En "WHEN b.is_identity = 0 THEN 'NO'", "WHEN" se encarga de establecer la
condición como tal; en "b.is_identity" notamos que el campo "is_identity" es un
campo de "b", es decir, de la vista "sys.columns", y se utiliza para indicar si la
columna es una columna de identidad (también conocida como columna
autoincrementable). Si "is_identity" es igual a 0, significa que la columna no es una
columna de identidad.
"THEN" se ejecuta si la condición "WHEN" es verdadera, y se devuelve la cadena de
texto 'NO'. Esto indica que la columna no es una columna de identidad (no es
autoincrementable).
"ELSE" se ejecuta si la condición "WHEN" no se cumple, y se devuelve la cadena de
texto 'SI'. Esto indica que la columna es una columna de identidad (es
autoincrementable).
Como sabemos, se coloca "END" para finalizar la expresión "CASE" y, en este caso,
se le asigna un alias "[Es Autonumerico]" al resultado.
ep.value [Descripcion],
11. En esta parte de la consulta, "ep.value" se utiliza para obtener el valor asociado con
una propiedad extendida (extended property) de una columna. Esta propiedad
extendida generalmente se utiliza para almacenar una descripción o comentario
adicional relacionado con la columna.
Una "descripción" se refiere a una explicación o comentario adicional que se adjunta a
la columna para proporcionar información adicional sobre su propósito o contenido.
Esta descripción no afecta directamente a los datos almacenados en la columna, pero
puede ser útil para los usuarios y los desarrolladores que trabajan con la base de datos
para comprender mejor la estructura y el significado de la columna.
Finalmente, el alias [Descripcion] se asigna a este valor recuperado en los resultados
de la consulta.
f.ForeignKey,
f.ReferenceTableName,
f.ReferenceColumnName
"f.ForeignKey": Indica si la columna es una clave foránea (foreign key).
"f.ReferenceTableName": Muestra el nombre de la tabla a la que la columna hace
referencia en caso de ser clave foránea.
"f.ReferenceColumnName": Muestra el nombre de la columna de la tabla de referencia
a la que la columna actual se relaciona si es clave foránea.
12. Pequeña ilustración de la diferencia entre llave primaria (primary key) y llave foránea
(foreign key):
FROM sys.tables a
La cláusula "FROM" se utiliza para especificar la(s) tabla(s) de las cuales deseas
recuperar datos. Es decir, defines las fuentes de datos que se utilizarán en la
consulta.
Como sabemos, "sys.tables" es una tabla del sistema en SQL Server que almacena
información sobre todas las tablas de la base de datos actual, como sus nombres,
identificadores únicos de objetos (object_id), esquemas, fechas de creación y otras
propiedades.
13. "a" es un alias que se utiliza para hacer referencia a la tabla "sys.tables" dentro de la
consulta.
inner join sys.columns b on a.object_id= b.object_id
inner join sys.systypes c on b.system_type_id= c.xtype
inner join sys.objects d on a.object_id= d.object_id
LEFT JOIN sys.extended_properties ep ON d.object_id = ep.major_id AND
b.column_Id = ep.minor_id
LEFT JOIN (
SELECT
f.name AS ForeignKey,
OBJECT_NAME (f.parent_object_id) AS TableName,
COL_NAME (fc.parent_object_id,fc.parent_column_id) AS
ColumnName,
OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
COL_NAME (fc.referenced_object_id,fc.referenced_column_id) AS
ReferenceColumnName
FROM sys.foreign_keys AS f
14. INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID =
fc.constraint_object_id) f ON f.TableName =a.name AND f.ColumnName =b.name
Las operaciones "INNER JOIN" se utilizan para combinar datos de varias vistas del
sistema.
En "INNER JOIN sys.columns b ON a.object_id = b.object_id", "INNER JOIN" relaciona
la tabla "sys.tables" (representada por el alias "a") con la vista "sys.columns"
(representada por el alias "b") utilizando una condición de igualdad en el campo
"object_id". Esto significa que para cada tabla en la base de datos (representada por
"a"), se unen todas las columnas correspondientes (representadas por "b") que
tienen el mismo "object_id". Esto vincula cada tabla a sus columnas respectivas.
En "INNER JOIN sys.systypes c ON b.system_type_id = c.xtype", "INNER JOIN"
relaciona la vista "sys.columns" (representada por el alias "b") con la vista
"sys.systypes" (representada por el alias "c") mediante una condición de igualdad en
el campo "system_type_id" de "b" y el campo "xtype" de "c". Esto permite obtener
información detallada sobre los tipos de datos de las columnas, ya que "c" contiene
detalles sobre los tipos de datos en la base de datos.
"system_type_id" almacena un identificador numérico que representa el tipo de dato
subyacente de una columna, mientras que "c.xtype" contiene una cadena de caracteres
que representa el nombre del tipo de dato.
En "INNER JOIN sys.objects d ON a.object_id = d.object_id", "INNER JOIN" relaciona
nuevamente la tabla "sys.tables" (representada por el alias "a") con la vista
15. "sys.objects" (representada por el alias "d") utilizando el campo "object_id". Esto
proporciona información adicional sobre los objetos relacionados con las tablas,
como su fecha de creación y otros detalles. En esencia, vincula cada tabla a la
información relacionada con sus objetos en la base de datos.
En un "LEFT JOIN", todas las filas de la tabla de la izquierda ("d" y "b" en este caso)
se incluyen en los resultados, incluso si no tienen coincidencias en la tabla de la
derecha ("ep"). Esto asegura que todas las tablas y columnas se muestren en los
resultados, La vista "sys.extended_properties" almacena información adicional o
propiedades extendidas relacionadas con objetos en la base de datos, le asignamos
el alias "ep".
En "ON d.object_id = ep.major_id AND b.column_Id = ep.minor_id", se establece las
condiciones de unión entre las tablas "d" y "b" con las propiedades extendidas en
"ep". Las condiciones de unión indican cómo relacionar las filas de las tablas "d" y
"b" con las filas correspondientes en "ep".
En "d.object_id = ep.major_id" se establece una relación entre los objetos principales
(generalmente tablas) representados por "d" y las propiedades extendidas
almacenadas en "ep". El "object_id" de "d" se compara con el "major_id" de "ep" para
vincular las propiedades extendidas con las tablas correctas en la base de datos.
En "b.column_Id = ep.minor_id" se vincula columnas específicas representadas por b
con las propiedades extendidas correspondientes en "ep". El "column_Id" de "b" se
compara con el "minor_id" de "ep" para garantizar que las propiedades extendidas se
relacionen con las columnas específicas de manera precisa.
16. `LEFT JOIN (...) f`: Utilizamos un "LEFT JOIN" para combinar la tabla principal con
una subconsulta (identificada como "f") que recuperará detalles sobre las claves
foráneas y sus relaciones con tablas en la base de datos.
`SELECT f.name AS ForeignKey, ...`: En la subconsulta, seleccionamos ciertos datos
relacionados con las claves foráneas. Esto incluye el nombre de la clave foránea
("ForeignKey"), el nombre de la tabla principal ("TableName"), el nombre de la
columna que actúa como clave foránea ("ColumnName"), el nombre de la tabla de
referencia ("ReferenceTableName") y el nombre de la columna en la tabla de
referencia que está relacionada con la clave foránea ("ReferenceColumnName").
OBJECT_NAME(f.parent_object_id) AS TableName: Esta expresión obtiene el
nombre de la tabla principal (donde se encuentra la clave foránea) usando el
"parent_object_id" de la clave foránea. Luego, asigna este nombre a un alias llamado
"TableName". Esto nos permite conocer la tabla principal involucrada en la relación
de clave foránea.
COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName: Aquí, se
obtiene el nombre de la columna específica en la tabla principal que actúa como
clave foránea. Se hace usando el "parent_object_id" y "parent_column_id" de la clave
foránea y luego asignando ese nombre a un alias llamado "ColumnName". Esto
identifica la columna que establece la relación de clave foránea.
OBJECT_NAME(f.referenced_object_id) AS ReferenceTableName: Esta parte extrae
el nombre de la tabla de referencia (la tabla relacionada) utilizando el
"referenced_object_id" de la clave foránea. El resultado se guarda en un alias
llamado "ReferenceTableName". Esto nos informa sobre la tabla a la que se hace
17. referencia en la relación de clave foránea.
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS
ReferenceColumnName: Similar al punto anterior, esta expresión obtiene el nombre
de la columna en la tabla de referencia que se relaciona con la clave foránea. Se
hace utilizando el "referenced_object_id" y "referenced_column_id" de la clave
foránea y se asigna a un alias llamado "ReferenceColumnName". Esto identifica la
columna en la tabla de referencia que está conectada a través de la clave foránea.
En conjunto, estas partes de la subconsulta proporcionan detalles esenciales sobre
las relaciones de clave foránea, incluyendo los nombres de las tablas principales y
de referencia, así como las columnas involucradas en la base de datos.
`FROM sys.foreign_keys AS f INNER JOIN sys.foreign_key_columns AS fc ON
f.OBJECT_ID = fc.constraint_object_id`: En esta parte, especificamos de dónde
provienen los datos de la subconsulta. La subconsulta utiliza las vistas
"sys.foreign_keys" (alias "f") y "sys.foreign_key_columns" (alias "fc") para obtener
información sobre las claves foráneas y las columnas que están relacionadas con
ellas. La unión entre estas dos vistas se realiza mediante el campo "OBJECT_ID" de
"f" y el campo "constraint_object_id" de "fc", lo que establece la relación entre las
claves foráneas y las columnas involucradas.
`f ON f.TableName = a.name AND f.ColumnName = b.name`: Finalmente, utilizamos
esta parte para unir la subconsulta "f" con las tablas principales en la consulta
principal. Aquí es donde se establecen las conexiones entre las claves foráneas
recuperadas y las tablas y columnas en la base de datos principal. Se relacionan a
través de los nombres de tabla ("TableName") y nombres de columna
18. ("ColumnName"), lo que nos permite obtener una visión completa de las relaciones
de clave foránea en la base de datos principal.
WHERE a.name <> 'sysdiagrams'
ORDER BY a.name,b.column_Id
WHERE a.name <> 'sysdiagrams': En esta parte filtra las filas donde el nombre de la
tabla en la base de datos principal (a.name) no sea igual a 'sysdiagrams'. En otras
palabras, excluye las tablas con el nombre 'sysdiagrams' de los resultados.
ORDER BY a.name, b.column_Id: Ordena los resultados primero por el nombre de la
tabla (a.name) en orden ascendente y, luego, por el identificador de columna
(b.column_Id) en orden ascendente. Esto organiza la salida de la consulta en función
de estos dos criterios.