Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Instituto Tecnológico de Salina Cruz: Ing. Rosales Ruiz Maria de Los Angeles
Instituto Tecnológico de Salina Cruz: Ing. Rosales Ruiz Maria de Los Angeles
GRADO Y GRUPO: 4E
FACILITADOR:
ING. ROSALES RUIZ MARIA DE LOS ANGELES
Lenguaje de Manipulación de Datos (Data Manipulation Language, DML) es un idioma proporcionado por
los sistemas gestores de bases de datos que permite a los usuarios de la misma llevar a cabo las tareas de
consulta o modificación de los datos contenidos en las Bases de Datos del Sistema Gestor de Bases de Datos.
El lenguaje de manipulación de datos más popular hoy día es SQL, usado para recuperar y manipular datos en
una base de datos relacional. Otros ejemplos de DML son los usados por bases de datos IMS/DL1,
CODASYL u otras.
Lenguajes procedimentales. En este tipo de lenguaje el usuario da instrucciones al sistema para que realice
una serie de procedimientos u operaciones en la base de datos para calcular un resultado final.
El lenguaje de manipulación de datos más popular hoy día es SQL, usado para recuperar y manipular datos en
una base de datos relacional. Otros ejemplos de DML son los usados por bases de datos IMS/DL1,
CODASYL u otras.
1- INSERT
Una sentencia INSERT de SQL agrega uno o más registros a una (y sólo una) tabla en una base de datos
relacional.
2- UPDATE
Una sentencia UPDATE de SQL es utilizada para modificar los valores de un conjunto de registros existentes
en una tabla.
3- DELETE
Una sentencia DELETE de SQL borra uno o más registros existentes en una tabla.
Ejemplo 1 (borro todos los valores de las columnas alumno y materia donde la materia sea spd2):
Empezaremos por estudiar la sentencia SELECT, que permite recuperar datos de una o varias tablas. La
sentencia SELECT es con mucho la más compleja y potente de las sentencias SQL. Empezaremos por ver las
consultas más simples, basadas en una sola tabla.
Esta sentencia forma parte del DML (lenguaje de manipulación de datos), en este tema veremos cómo
seleccionar columnas de una tabla, cómo seleccionar filas y cómo obtener las filas ordenadas por el criterio
que queramos.
El resultado de la consulta es una tabla lógica, porque no se guarda en el disco sino que está en memoria y
cada vez que ejecutamos la consulta se vuelve a calcular.
Cuando ejecutamos la consulta se visualiza el resultado en forma de tabla con columnas y filas, pues en la
SELECT tenemos que indicar qué columnas queremos que tenga el resultado y qué filas queremos seleccionar
de la tabla origen.
Con la cláusula FROM indicamos en qué tabla tiene que buscar la información. En este capítulo de consultas
simples el resultado se obtiene de una única tabla. La sintaxis de la cláusula es:
FROM especificación de tabla
Una especificación de tabla puede ser el nombre de una consulta guardada (las que aparecen en la ventana de
base de datos), o el nombre de una tabla que a su vez puede tener el siguiente formato:
Tabla es un nombre de alias, es como un segundo nombre que asignamos a la tabla, si en una consulta
definimos un alias para la tabla, esta se deberá nombrar utilizando ese nombre y no su nombre real, además
ese nombre sólo es válido en la consulta donde se define. El alias se suele emplear en consultas basadas en
más de una tabla que veremos en el tema siguiente. La palabra AS que se puede poner delante del nombre de
alias es opcional y es el valor por defecto por lo que no tienen ningún efecto.
Ejemplo: SELECT ......FROM oficinas ofi; equivalente a SELECT ......FROM oficinas AS ofi esta sentencia
me indica que se van a buscar los datos en la tabla oficinas que queda renombrada en esta consulta conofi.
En una SELECT podemos utilizar tablas que no están definidas en la base de datos (siempre que tengamos
los permisos adecuados claro), si la tabla no está en la base de datos activa, debemos indicar en qué base de
datos se encuentra con la cláusula IN.
En la cláusula IN el nombre de la base de datos debe incluir el camino completo, la extensión (.mdb), y estar
entre comillas simples.
Supongamos que la tabla empleados estuviese en otra base de datos llamada otra en la carpeta c:\mis
documentos\, habría que indicarlo así:
SELECT *
Generalmente tenemos las tablas en la misma base de datos y no hay que utilizar la cláusula IN.
Selección de columnas
La lista de columnas que queremos que aparezcan en el resultado es lo que llamamos lista de selección y se
especifica delante de la cláusula FROM.
Se utiliza el asterisco * en la lista de selección para indicar 'todas las columnas de la tabla'.
Si añadimos una columna nueva en la tabla, esta nueva columna saldrá sin tener que modificar la consulta.
Se puede combinar el * con el nombre de una tabla (ej. oficinas.*), pero esto se utiliza más cuando el origen
de la consulta son dos tablas.
o bien
Las columnas se pueden especificar mediante su nombre simple (nbcol) o su nombre cualificado
(nbtabla.nbcol, el nombre de la columna precedido del nombre de la tabla que contiene la columna y
separados por un punto).
El nombre cualificado se puede emplear siempre que queramos y es obligatorio en algunos casos que veremos
más adelante.
Cuando el nombre de la columna o de la tabla contiene espacios en blanco, hay que poner el nombre entre
corchetes [ ] y además el número de espacios en blanco debe coincidir. Por ejemplo [codigo de cliente] no es
lo mismo que [ codigo de cliente] (el segundo lleva un espacio en blanco delante de código)
Ejemplos :
FROM productos
Alias de columna.
Cuando se visualiza el resultado de la consulta, normalmente las columnas toman el nombre que tiene la
columna en la tabla, si queremos cambiar ese nombre lo podemos hacer definiendo un alias de columna
mediante la cláusula AS será el nombre que aparecerá como título de la columna.
Ejemplo:
FROM productos
Columnas calculadas.
Además de las columnas que provienen directamente de la tabla origen, una consulta SQL puede incluir
columnas calculadas cuyos valores se calculan a partir de los valores de los datos almacenados.
Para solicitar una columna calculada, se especifica en la lista de selección una expresión en vez de un nombre
de columna. La expresión puede contener sumas, restas, multiplicaciones y divisiones, concatenación & ,
paréntesis y también funciones predefinidas).
Para ver con más detalle cómo formar una expresión pincha aquí
Ejemplos:
FROM oficinas
FROM productos
FROM repventas
FROM oficinas
Listar las ventas en cada oficina con el formato: 22 tiene ventas de 186,042.00 ptas
Ejemplo-1: Supongamos que en la federación de golf (siguiendo con el ejemplo de la base de datos Socios del Club) se ha asignado un
responsable tutor por cada uno de los niveles de juego de forma que a cada jugador le pasa a corresponder un responsable deportivo en virtud
de si su nivel de juego es principiante, medio o senior. Dicho tutor, tiene unos datos que lo identifican, tales como son su nombre, apellidos,
teléfono de contacto, fax, dirección de e-mail, dirección de ficina...Sería preciso que en el registro de cada socio se dispusiera de toda la
información de su tutor o responsable deportivo.
Tras un análisis de la nueva situación, se deduce que si en la tabla socios agregamos tantos campos como para albergar la información de
dichos tutores, a todos los socios con el mismo nivel de juego, les va a corresponder el mismo tutor, con lo que todos los datos del tutor
estarían repetidos de forma masiva y redundante en la tabla socios (ocupando mucho espacio y lentificando el proceso básicamente). Quizás la
mejor solución sea, en este caso, definir otra tabla llamada Tutores, en la que deberá existir un registro para cada nivel de juego y por lo tanto
para cada tutor. La estructura de la tabla sería la siguiente:
Se introducirán los datos de los niveles junto a sus responsables...
Pero, ¿de qué manera podríamos enlazar o relacionar esta nueva tabla de tutores con la gran tabla de socios?
Será necesario relacionar el nivel de juego de cada socio de la tabla de socios con el código de nivel de la tabla de tutores. Pero como son de
distinto tipo (texto -en socios- frente a numérico -en tutores-) no se podrá. La solución es sustituir en la tabla de socios el campo nivel por el
campo codnivel (por ejemplo) de tipo numérico y luego colocar a cada socio un código (el que corresponde a su nivel de juego) en este campo
de acuerdo a los niveles y tutores introducidos en la tabla de
tutores (1, 2 o 3).
2. Mediante tres consultas de actualización, a aquellos que tengan nivel de juego principiante, actualizaremos ese nuevo campo
codnivel (de la tabla de socios) a 1. De igual manera, los socios con nivel senior actualizaremos a 2 su campo codnivel. Y a 3 el
campo codnivel de los socios con nivel senior.
3. A continuación deberemos (de forma recomendada, aunque en este ejemplo no lo borremos) eliminar el campo nivel de la tabla
socios ya que, a partir de ahora, Se conocerá el nivel de juego gracias a un código en la tabla de socios, que se corresponderá con
uno de los niveles y tutores de la tabla tutores.
4. Ahora tendremos que establecer la relación (en la pantalla de relaciones) de acuerdo a la siguiente pantalla:
A partir de este momento, podríamos crear consultas, formularios e informes en donde aparecen ambas tablas implicadas, eso si, previamente
relacionadas.
Ejemplo-2: Supongamos un ejemplo superficial de gestión de sanciones de tráfico en una localidad. Existen diferentes tipos de sanción (tipos
de multa), diferentes guardias o agentes, los vehículos, los cuales pertenecen a un
ciudadano o propietario, y... por supuesto sanciones. Las sanciones las "pone" un agente a un vehículo, un determinado día, a una hora, en un
lugar, y esa infracción es de un determinado tipo de entre las que se pueden
sancionar. Un ciudadano puede tener más de un vehículo.
La información habrá que disgregarla en diferentes tablas, (la de vehículos se supone que la facilita tráfico con todos los vehículos), que
deberán estar... Relacionadas. La siguiente imagen muestra un posible planteamiento.
2.3.1 Subconsultas en SQL
Si ya dominas las consultas SELECT de SQL con WHERE, GROUP BY o HAVING lo siguiente que debes
aprender son las subconsultas SQL.
Primero una definición: una subconsulta es una instrucción SELECT SQL anidada dentro de otra instrucción
SELECT, INSERT, DELETE o UPDATE. Además, debes saber que se realizarán casi siempre dentro de la
cláusula WHERE de las consultas.
Otra forma de explicarlo sería diciendo que tenemos un SELECT dentro de otra consulta SELECT,
INSERT ... INTO, UPDATE o DELETE.
En esta parte me voy a centrar en las consultas anidadas dentro de la cláusula WHERE, ya que las consultas
INSERT INTO las expliqué en otro artículo.
Una cláusula WHERE o HAVING con las condiciones deseadas más uno de los operadores SQL anteriores
(ANY, ALL, SOME, IN, NOT IN, EXISTS o NOT EXISTS) u operadores de comparación como "=", ">" o
"<"
La consulta SELECT entre paréntesis.
Hay varios puntos importantes sobre su uso a tener en cuenta para evitar errores:
La subconsulta siempre deberá devolver el mismo tipo y número de valores a comparar: no puede haber una
subconsulta que devuelva dos columnas para una comparación con 1 columna.
La subconsulta siempre debería (aunque no es obligatorio) de colocarse a la derecha del operador relacional.
Ahora que ya tienes la teoría rondando por tu cabeza, a continuación, te enseño un pequeño ejemplo
cumpliendo los tres puntos recién comentados.
Primero voy a crear una consulta SELECT normal, que obtenga el nombre y apellidos de las filas de una tala
llamada ciudadanos
FROM ciudadanos
Ahora añado la cláusula WHERE a la consulta anterior y le voy a añadir uno de los operadores compatibles.
FROM ciudadanos
Y por último voy a realizar la subconsulta entre paréntesis que seleccione la columna DNI de una tabla
"delincuentes":
FROM ciudadanos
Después comparara los valores devueltos por el DNI de la subconsulta con el dni de la consulta SELECT
"PADRE".
Hora de los ejemplos. A partir de aquí voy a mostrarte varios ejemplos para que acabes de interiorizar las
subconsultas.
Empezaré con un par de ejemplos sencillos, siguiendo la tónica del anterior apartado y continuaré con
ejemplos más complejos y avanzados.
);
);
Ahora que ya tengo mis dos tablas vamos a realizar unas subconsultas.
Ejemplo subconsultas 1
SELECT *
FROM videojuego
Otra forma alternativa de realizar esta subconsulta sería utilizando la cláusula ANY o SOME:
SELECT *
FROM videojuego
SELECT *
FROM videojuego
Realmente las dos condiciones son iguales ya que SOME es un ALIAS de ANY, lo que quiere decir que son el
mismo comando.
Ejemplo de subqueries 2
En el siguiente ejemplo seleccionaré todos los jugadores que juegan a un juego en Español:
FROM jugador
Para demostrártelo selecciono los jugadores que tienen la mayor edad entre los jugadores:
FROM jugador
En este ejemplo voy a subir un poco la dificultad, voy a mostrarte las posiblidades casi infinitas de las
subqueries utilizando para ello una subconsulta anidada dentro de otra subconsulta. Lo entenderás mejor con
el ejemplo.
SELECT *
FROM videojuego
WHERE lenguaje IN ( SELECT lenguaje FROM videojuego WHERE id = SOME ( SELECT id_videojuego
FROM jugador WHERE es_famoso = 1 ) );
¿Lo has entendido? La consulta en su totalidad selecciona todos los videojuegos de uno de los lenguajes a los
que juega algún jugador famoso.
El lenguaje de todos los videojuegos que si ID coincide con el ID de los jugadores famosos.
Todos los datos de los videojuegos que su lenguaje coincide con alguno de los idiomas de la subconsulta del
punto 2.
Creo que con las consultas SELECT se ven todas las posibilidades de las subconsultas, pero para que veas de
forma gráfica un ejemplo de cómo usarlas en UPDATE o DELETE te dejo ahora un ejemplo.
En concreto, voy a añadir 1 al contador de total jugadores de aquellos videojuegos que tienen un jugador
jugándolo en la fecha '2019-12-01'
UPDATE videojuego
Que estas columnas contengan el mismo tipo de datos, o al menos tipos de datos que se puedan convertir de
forma implícita.
Estos tres operadores se incorporaron a SQL-Server a partir de la versión 2008 y están también disponibles en
la base de datos SQL de la plataforma Azure. Los tres operadores aceptan además el parámetro ALL, que
modificará ligeramente los resultados ¿Cómo funcionan y qué diferencia hay entre ellas?
EXCEPT:
Este operador encuentra la diferencia entre las dos consultas y devuelve las filas que pertenecen únicamente a
la primera consulta. Es decir, si una tupa aparece tanto en la consulta de la izquierda como en la de la derecha
no será incluida en el resultado final. Si aparece solo en la de izquierda y en la de la derecha no, entonces será
devuelta una vez.
Si añadimos ALL al EXCEPT notaremos una pequeña diferencia. Al igual que con el EXCEPT a secas el
operador buscará la diferencia entre las dos consultas, pero los datos devueltos cambian. En este caso si una
tupla aparece un número m de veces en la primera consulta, y la misma tupla aparece un número n veces en la
segunda consulta, entonces esa tupla aparece m – n veces en la respuesta de salida, si dicha resta es mayor que
0.
EXCEPT
Select Descripcion, Codigo from Almacen
EXCEPT ALL
INTERSECT:
Este operador combina los resultados de dos consultas en un único resultado que comprime todas las filas
comunes para ambas consultas. Es decir, funcionaría como un AND lógico: devuelve solo las ocurrencias
existentes en ambas consultas.
Si añadimos ALL a este operador el resultado también cambiará. En ese caso si una tupla aparece un número
m de veces en el resultado de la primera consulta y la misma tupla aparece n veces en la segunda, entonces
esa tupla aparece el menor número de entre m o n en la respuesta de salida.
INTERSECT
Select Descripcion, Codigo from Almacen
UNION:
Finalmente vamos con UNION. Si antes os decía que INTERSECT funciona como un operador lógico AND
entonces UNION funcionaría como un operador lógico OR. Devuelve las filas únicas que existen o en la
consulta de la izquierda o en la de la derecha.
En este caso el operador ALL lo que hará será modificar el resultado del UNION de forma que en lugar de
recibir solo las filas únicas recibamos tantas filas como haya en la primera consulta y en la segunda, un poco
la operación contraria a la que realiza EXCEPT ALL. En este caso si una tupla aparece un número m de veces
en la primera consulta, y la misma tupla aparece un número n veces en la segunda consulta, entonces esa tupla
aparece m + n veces en la respuesta de salida.
UNION
UNION ALL
Select Descripcion, Codigo from Almacen
Una función de agregado realiza un cálculo sobre un conjunto de valores y devuelve un solo valor. Con la
excepción de COUNT, las funciones de agregado ignoran los valores NULL. Las funciones de agregado se
suelen usar con la cláusula GROUP BY de la instrucción SELECT.
Todas las funciones de agregado son deterministas. En otras palabras, las funciones de agregado devuelven el
mismo valor cada vez que se las llama con un conjunto específico de valores de entrada. Vea Funciones
deterministas y no deterministas para obtener más información sobre el determinismo de las
funciones. La cláusula OVER puede seguir todas las funciones de agregado excepto STRING_AGG,
GROUPING o GROUPING_ID.
Las funciones de agregado solo se pueden usar como expresiones en las situaciones siguientes:
La lista de selección de una instrucción SELECT (una subconsulta o una consulta externa).
Cláusula HAVING.
TA B L A 1
APPROX_COUNT_DISTINCT MIN
AVG STDEV
CHECKSUM_AGG STDEVP
COUNT STRING_AGG
COUNT_BIG SUM
GROUPING VAR
GROUPING_ID VARP
MAX