sábado, 15 de junio de 2024

Curso de DevOps. Automatización IT y Tareas IT

Vamos a describir el concepto de automatización de IT, junto con la tarea crítica de automatización de TI que aporta valor a los sistemas empresariales. 

Hay diferentes niveles de gestión en las empresas. Necesitamos asegurarnos de que somos capaces de automatizar diversas tareas habilitadas por las IT para garantizar la precisión y también acelerar los procesos de la empresa. Para hacer eso, dependiendo del nivel de gestión, tenemos que crear una mesa de servicio e intentar automatizarla. Vamos a intentar comprender cuál es el papel de la mesa de servicio cuando se trata de la automatización de varios servicios diferentes. 

Automatización IT y Tareas IT

Prestación de servicios

Como podemos ver en la imagen superior, se ha dividido en dos partes diferenciadas. En primer lugar está la prestación de servicios, que necesita automatizar la gestión de la capacidad y la gestión financiera. La gestión de la continuidad del servicio con el fin de garantizar que haya un mínimo o ningún fallo. La gestión del nivel de servicio para cuidar de todos y cada uno de los servicios. Y por último, la gestión de la disponibilidad para garantizar que los servicios estén siempre disponibles. 

Soporte de servicios

La segunda parte de la automatización de IT, es para automatizar específicamente la mesa de servicio, y está relacionada con el soporte del servicio. El soporte de servicio entra en juego cuando hablamos de gestión de incidentes, donde siempre que hay un incidente, debemos descubrirlo y automatizar la respuesta a ese incidente en particular. 

La gestión de cambios, la gestión de configuración y la gestión de versiones. Todo esto es parte del soporte de servicio, que podemos planificar para automatizar, con el fin de construir una mesa de servicio sólida para nuestra empresa. 

Ahora centrémonos en la tarea de automatización crítica, que puede tener un impacto en la aplicación general.

Gestión del cambio

La primera tarea que debemos planificar para automatizar es la gestión del cambio. Siempre que hay un cambio en los escenarios empresariales, descubriremos que nuestra IT debe ajustarse de acuerdo con ese cambio en particular. Necesitamos evaluar el alcance de la automatización de ese cambio en particular. 

Gestión de la configuración

En segundo lugar está la gestión de la configuración, necesitamos evaluar con frecuencia la necesidad de gestión de la configuración y el cambio que debemos realizar en la configuración, debido al diferente estado de los servicios existentes. 

Gestión de la automatización

La tercera tarea de automatización de IT esencial o crítica está relacionada con el aprovisionamiento. Dependiendo de varias métricas diferentes, también podemos planificar la automatización del aprovisionamiento, para garantizar que siempre proporcionamos una infraestructura sólida y recursos óptimos para que se ejecuten las aplicaciones. 

También debemos planificar la automatización de las tareas de mantenimiento de rutina. Por ejemplo, borrar el caché, borrar el disco. La automatización de la copia de seguridad y la restauración, para que podamos adoptar una copia de seguridad. Siempre que haya un desencadenante que indique un fallo, deberíamos invocar automáticamente la restauración

Gestión de identidades y accesos

Hay otra tarea crítica de automatización de IT, se trata de la automatización de la gestión de identidades y accesos. Necesitamos asegurarnos de que somos capaces de automatizar los escenarios de gestión de identidades y accesos. 

Gestión de la recuperación ante desastres

La recuperación ante desastres es otra área donde podemos aplicar la automatización de IT. Pero sí, necesitamos identificar cuál es la causa crítica del desastre, dependiendo de las rutinas que podemos identificar para que se responsabilicen de la recuperación ante desastres. 

Gestión del movimiento de datos

Y finalmente, el movimiento de datos, cuando queremos tener un movimiento de datos incremental o completo, de un sistema a otro, y queremos programarlo, podemos seguir adelante con la automatización de IT. 

Automatización IT y Tareas IT


 Automatización de los procesos de negocio

El proceso de negocio es esencial porque nos proporciona lo que necesitamos saber para impulsarlo con nuestras IT. Las empresas pueden incluir funcionalidades tanto no relacionadas con IT como de IT. Necesitamos identificar qué papel puede desempeñar la automatización de procesos de negocio. Para empezar, la primera tarea siempre será el análisis, donde realizaremos un análisis adecuado, teniendo en cuenta el alcance de la automatización. El análisis posterior quedará claro con el alcance de la automatización, y que debe implementarse en la fase de implementación, como se muestra en el diagrama  inferior. 

Una vez finalizada la implementación, debemos compartir el conocimiento sobre la implementación actual con diferentes niveles de ingenieros de soporte, eso lo hacemos en la tercera fase de capacitación y soporte. Y, por último, es necesario integrar la implementación para garantizar que cualquier actividad o proceso comercial identificado pueda ser automatizado, integrándolo en la aplicación de la empresa. 

Automatización de los procesos de negocio


Derivación del valor de la automatización

El primer beneficio que aporta la derivación de la automatización, es que elimina muchos trabajos. Aparte de eso, también nos brinda la capacidad de ampliar los procesos fácilmente. Mejora el rendimiento de los procesos y, por  tanto, tendremos una mayor velocidad de los procesos. La automatización también conduce a una mayor precisión en el trabajo, porque un script de automatización o mecanismo de automatización garantizará que primero se pruebe y luego se aplique.

Derivación del valor de la automatización


 También ofrece una mejor participación del personal, debido a que al automatizar tareas  la plantilla se verá liberada de realizar tareas repetitivas. Y, por último, la estandarización automatizada de procesos, que ayuda a adoptar un estándar dentro de la organización para determinadas tareas, lo que aporta mucho valor. Y también acelera el desarrollo de aplicaciones. Finalmente, vamos a ver los que beneficios podemos obtener de la automatización. E principio tendremos siempre una mayor visibilidad de las métricas, genera responsabilidad. Proporciona suficiente espacio para mejorar la eficiencia operativa y se encarga de eliminar el error humano. Otro beneficio es que reduce el tiempo de respuesta, seguido de una mejora de la productividad, o mejora la productividad. Reduce el costo de operación, proporciona una mejor colaboración debido al conocimiento que se obtiene una vez que se automatizan las actividades. Y finalmente, proporciona o mejora una mayor satisfacción del cliente.

Beneficios de la automatización


 


sábado, 1 de junio de 2024

Subconsultas en SQL

Imagina que queremos encontrar alumnos que tengan la misma puntuación que un alumno concreto, p. ej. El alumno_tipo. Lo primero sería saber la puntuación del alumno_tipo. Lo podemos ver con la siguiente consulta:

SELECT puntuacion FROM alumnos WHERE nombre = 'alumno_tipo';

Luego, tendríamos que anotar el resultado de la consulta anterior en algún lugar y crear otra consulta como la siguiente:

SELECT nombre FROM alumnos WHERE puntuacion = 6;

Las subconsultas se crearon para ayudar con estos ejemplos. Son "consultas dentro de consultas" y siempre se ponen entre paréntesis. Echa un vistazo a la siguiente:

SELECT nombre FROM alumnos WHERE puntuacion = (  SELECT     puntuacion   FROM alumnos  WHERE nombre = 'alumno_tipo' );

La base de datos primero ejecutará la subconsulta (entre paréntesis), luego devolverá su resultado y lo pondrá en lugar de la subconsulta y, a continuación, ejecutará la consulta final.

Subconsultas en SQL



En este ejemplo concreto, debemos escribir la subconsulta para que devuelva exactamente un valor (una columna de una fila), para que se pueda usar en la ecuación "puntuacion = X". No tendría mucho sentido poner una tabla entera.

Subconsultas con varios operadores lógicos

Las subconsultas también se pueden utilizar con otros operadores lógicos. Observa el siguiente ejemplo:

SELECT * FROM montana WHERE altura > (   SELECT altura   FROM montana   WHERE nombre = 'Mont Blanc' );

La consulta anterior devolverá todas las montañas que son más altas que el Mont Blanc. Como se puede ver, hemos utilizado el signo "mayor que" (>) junto con una subconsulta.

Funciones en subconsultas

Echa un vistazo a la siguiente consulta:

SELECT nombre FROM alumnos WHERE puntuacion <(SELECT AVG(puntuacion) FROM alumnos WHERE nombre = 'Alumno_tipo');

Ahora, nuestra consulta busca todos los alumnos con una puntuación inferior al promedio del alumno tipo. Como se puede ver, en la subconsulta utilizamos la función AVG() que nos da el valor promedio de una columna.

El operador IN

Hasta ahora, nuestras subconsultas solo devolvían valores únicos (como 6 o 16,28, por ejemplo).

SELECT *  FROM alumno WHERE puntuacion IN (3, 4, 5);

IN permite especificar varios valores en la cláusula WHERE, en lugar de uno solo.

En nuestro ejemplo, solo queremos mostrar alumnos que tengan una puntuación de 3 OR 4 OR 5. Eso es lo que significa IN (3,4,5).

Usar el operador IN con subconsultas

Para  utilizar el nuevo operador IN junto con subconsultas.  Hacemos lo siguiente:

SELECT precio FROM viaje WHERE id_ciudad IN (   SELECT id   FROM ciudad   WHERE poblacion < 2000000 );

En la subconsulta, buscamos los Id de todas las ciudades con una población inferior a 2 millones de habitantes. A continuación, utilizamos estos ID como valores para el operador IN.

Así, podemos obtener los precios de los viajes a las ciudades que tienen una población inferior a 2 millones de personas.

El operador ALL

SELECT * FROM pais WHERE superficie > ALL ( SELECT superficie   FROM ciudad );

Como se puede ver, tenemos el nuevo operador ALL a la derecha del operador lógico >. En este caso, > ALL significa "mayor que todos los valores del paréntesis".

Como resultado, obtendremos todos los países cuya superficie sea mayor que las superficies de todas las ciudades. Liechtenstein, por ejemplo, es un país muy pequeño. Es mayor que algunas ciudades (como, por ejemplo, Lyon), pero no es mayor que todas las demás (Berlín, por ejemplo, es mayor), por lo que Liechtenstein no aparecerá en el resultado.

También se puede utilizar ALL con otros operadores lógicos, como, por ejemplo, = ALL, != ALL, < ALL, <= ALL y >= ALL.

Usar el operador ALL en subconsultas correlacionadas

SELECT * FROM alumnos mejor_alumno WHERE puntuacion >= ALL ( SELECT puntuacion   FROM alumnos otros_alumnos   WHERE mejor_alumno.id_clase = otros_alumnos.id_clase);

La consulta anterior busca todos los alumnos que han sacado la mayor puntuación de cada clase. La consulta solo devuelve los alumnos cuya puntuación es igual o superior a la de todos los alumnos de su clase.

El operador ANY

SELECT * FROM viaje WHERE precio < ANY (   SELECT precio   FROM viaje_de_senderismo   WHERE id_montana = 1 );

En el ejemplo anterior, queremos encontrar viajes a ciudades que sean más baratos que algún viaje de senderismo a la montaña con id 1 (Mont Blanc). Si encuentra un viaje urbano que sea más barato que cualquiera de los valores de los viajes al Mont Blanc, se mostrará en el resultado.

También se puede usar con otros operadores, como, por ejemplo, = ANY, != ANY, < ANY, <= ANY y >= ANY.

Usar el operador ANY en subconsultas correlacionadas

También se puede utilizar el operador ANY en las subconsultas correlacionadas.

SELECT * FROM viajes_america WHERE precio < ANY (   SELECT precio FROM viaje_asia   WHERE viaje_america.dias = viaje_asia.dias );

La consulta anterior compara los viajes a américa y los viajes a asia que duran el mismo número de días. Después, devuelve todos los viajes a asia que sean más baratos que cualquier viaje a una viaje a américa que dure los mismos días.

Consultas correlacionadas

Hasta ahora, solo hemos  visto subconsultas que eran independientes de la consulta principal. Se podría ejecutar solo la subconsulta y, luego, poner su resultado en la consulta principal.

Vamos a ver subconsultas que dependen de la consulta principal. Se llaman subconsultas correlacionadas.

SELECT * FROM país WHERE superficie <= ( SELECT MIN(superficie)   FROM ciudad

 WHERE ciudad.id_pais = pais.id );

Queremos obtener todos los países cuya superficie sea igual o menor que la superficie mínima de las ciudades de ese país. En otras palabras, si hay un país más pequeño que su ciudad más pequeña, se mostrará. ¿Por qué utilizaríamos una consulta de este tipo? Puede ser muy útil para comprobar si hay algún error en la base de datos. Si esta consulta devolviera algún registro, sabríamos que algo raro está pasando con nuestros datos.

¿Cuál es la novedad en esta consulta? Echa un vistazo a la cláusula WHERE de la subconsulta. utiliza pais.id. ¿A qué país se refiere? Obviamente, al país de la consulta principal. Éste es el secreto de las subconsultas correlacionadas; si se ejecutase solo la subconsulta, la base de datos dará error.

Pero, si se ejecutase la instrucción como una subconsulta y se utiliza por ejemplo el campo fecha que explore la tabla pais, la base de datos compararía todas las veces el pais.id de la subconsulta con el pais.id de ese momento de la fecha.

Recuerde la regla de oro: las subconsultas pueden utilizar tablas de la consulta principal, ¡pero la consulta principal no puede utilizar tablas de la subconsulta!

Usar alias para las tablas

Puede haber ejemplos en los que la misma tabla se utilice tanto en la consulta principal como en la subconsulta correlacionada.

SELECT * FROM ciudad ciudad_principal WHERE poblacion > (SELECT AVG(poblacion)

  FROM ciudad  media_ciudades WHERE media_ciudades.id_pais = ciudad_principal.id_pais);

En este ejemplo, queremos encontrar ciudades con una población superior a la media de la población de todas las ciudades del país en cuestión. El problema es que buscamos las ciudades en la cláusula principal y comprobamos el valor de la media de la población de las ciudades en la subconsulta. La misma tabla aparece dos veces, lo que no es bueno.

Por eso, debemos utilizar alias para las tablas. En la subconsulta ponemos ... FROM ciudad media_ciudades ... y en la consulta principal ... FROM ciudad ciudad_principal. Como se puede ver, dimos nuevos nombres temporales a la tabla ciudad, y son diferentes para la consulta principal y para la subconsulta. El nombre temporal (el llamado alias) se pone después del nombre de la tabla, separado por un espacio. Recuerda, aquí no se usan comas.

Usar el operador IN con subconsultas correlacionadas

El operador IN nos permite especificar algunos valores en la cláusula WHERE, por lo que funciona un poco como el operador OR.

SELECT * FROM ciudad WHERE id_pais IN (SELECT id FROM país WHERE pais.poblacion < 40000);

Mostrará todas las ciudades de aquellos países que tengan una población total inferior a 40.000 habitantes.

El operador EXISTS

EXISTS es un operador que comprueba si alguna fila cumple la condición.

SELECT * FROM empleado WHERE EXISTS ( SELECT * FROM jefe WHERE id_empleado = empleado.id );

La consulta anterior solo mostrará la información de los empleados para los que existe al menos un empleado subordinado, del que es jefe el primero. No se mostrarán los empleados que no son jefes, (no tienen empleados subordinados). Si queremos lo contrario podemos poner NOT EXISTS

Usar subconsultas en la cláusula FROM

Las consultas también pueden utilizarse en otros lugares. Por ejemplo, en la cláusula FROM se puede utilizar una subconsulta en lugar de una tabla.

SELECT * FROM empleado, (SELECT  *   FROM jefe  WHERE subordinados < 10) AS jefe_grupo_pequeño WHERE jefe_grupo_pequeño.id =empleado.id_jefe;

La consulta anterior devuelve los jefes de los grupos pequeños. Pero, en nuestra base de datos no existe ninguna tabla llamada jefe_grupo_pequeño, así que... la creamos "sobre la marcha", utilizando una subconsulta en la cláusula FROM. Ya que tenemos que ponerle un nombre, utilizamos la palabra clave AS. Como resultado, la consulta muestra los empleados junto con sus jefes, siempre que estos tengan un grupo de menos de 10 subordinados.  Tenemos que poner la condición en la cláusula WHERE, porque, de lo contrario, cada empleado se mostraría junto con todos los jefes posibles.

Usar subconsultas en la cláusula FROM

SELECT  nombre,   dias,   precio FROM viaje, (     SELECT       *     FROM ciudad     WHERE puntuacion = 5) AS ciudad_bonita WHERE ciudad_bonita.id = viaje.id_ciudad;

La consulta anterior encuentra los viajes y sus respectivas ciudades para las ciudades que tienen una puntuación de 5. A continuación, muestra las columnas nombre, dias y precio para estas tablas. Cuando todas las columnas de las tablas tienen nombres diferentes, se pueden suprimir los nombres de las tablas (es decir, se puede escribir precio en lugar de viaje.precio, porque solo hay una columna llamada precio).

Obviamente, en esas consultas se pueden elegir solo algunas columnas. Estudia el siguiente ejemplo:

SELECT   nombre,   dias,   precio FROM viaje, ( SELECT       *     FROM ciudad     WHERE puntuacion = 5) AS ciudad_bonita WHERE ciudad_bonita.id = viaje.id_ciudad;

La consulta anterior encuentra los viajes y sus respectivas ciudades para las ciudades que tienen una puntuación de 5. A continuación, muestra las columnas nombre, dias y precio para estas tablas. Cuando todas las columnas de las tablas tienen nombres diferentes, se pueden suprimir los nombres de las tablas (es decir, se puede escribir precio en lugar de viaje.precio, porque solo hay una columna llamada precio).

Usar subconsultas en la cláusula SELECT

También se pueden usar subconsultas dentro de la lista de columnas de una cláusula SELECT. Para ello, es importante que la subconsulta devuelva exactamente una fila y una columna.

 SELECT   nombre,   (SELECT COUNT(*)   FROM viaje   WHERE id_ciudad = ciudad.id) AS numero_de_viajes FROM ciudad;

La consulta anterior devuelve el nombre de cada ciudad junto con el número de viajes que se realizan a la misma. Observa que utilizamos la función COUNT() para contar el número de viajes a cada ciudad.

 

sábado, 18 de mayo de 2024

Apilar imágenes en Photoshop para mejorar el enfoque (Photo Stacking)

Los seres humanos enfocamos rápida e inconscientemente lejos y cerca prácticamente sin darnos cuenta, y en nuestra mente se forma una imagen nítida con objetos cercanos y lejanos nítidos. 

Cuando se fotografía una imagen de cerca, la cámara enfoca en un área muy específica del objeto pero el fondo sale borroso.

 

Apilar imágenes en Photoshop para mejorar el enfoque (Photo Stacking)
Imagen con el enfoque en las flores de brezo y fondo borroso

Si enfocamos el fondo, es el objeto cercano el que sale borroso. 

 

Imagen con el enfoque en las flores de brezo y fondo borroso
Imagen con el fondo enfocado y las flores de brezo borrosas

Para obtener una visión nítida con una mayor profundidad de campo de objetos cercanos y lejanos se pueden realizar dos o más fotos de la imagen deseada, una o varias con el fondo enfocado y otra o varias con el objeto cercano enfocado.

Hecho esto, desde Photoshop importamos nuestras imágenes y elegimos Archivo -> Secuencias de comandos -> Cargar archivos en pila

Apilar imágenes en Photoshop para mejorar el enfoque (Photo Stacking)
 

Aparecerá un cuadro de diálogo, podemos elegir Añadir archivos abiertos para tratar todas nuestras imágenes tomadas.

Apilar imágenes en Photoshop para mejorar el enfoque (Photo Stacking)

Hecho esto, es importante ir a la pestaña capas de la derecha y seleccionar todas las capas que deseemos alinear para que la foto quede lo más exacta posible a la realidad. Después elegimos Edición -> Alinear capas automáticamente

 

Apilar imágenes en Photoshop para mejorar el enfoque (Photo Stacking)

Nos mostrará un cuadro de diálogo de alineamiento de capas, elegimos automática.

Apilar imágenes en Photoshop para mejorar el enfoque (Photo Stacking)


Después de esto seleccionamos desde el menú Edición -> Fusionar capas automáticamente.

Apilar imágenes en Photoshop para mejorar el enfoque (Photo Stacking)


 Lo que nos muestra un cuadro de diálogo con dos opciones, elegimos Apilar imágenes.

Apilar imágenes en Photoshop para mejorar el enfoque (Photo Stacking)


  
Y Photoshop creará una foto con el fondo y el objeto cercano nítidos.

Apilar imágenes en Photoshop para mejorar el enfoque (Photo Stacking)
Apilar imágenes en Photoshop para mejorar el enfoque (Photo Stacking)
Resultado final con las flores de brezo y el fondo nítidos, puedes adquirir esta foto aquí
Resultado final con las flores de brezo y el fondo nítidos



 



sábado, 4 de mayo de 2024

Clausula GROUP BY en SQL, Agrupar las filas y contarlas

La sentencia GROUP BY identifica una columna seleccionada para utilizarla para agrupar resultados. Divide los datos en grupos por los valores de la columna especificada, y devuelve una fila de resultados para cada grupo.

Se puede utilizar GROUP BY con más de un nombre de columna (separando los nombres de columna con comas). Es necesario colocar siempre GROUP BY después de FROM y WHERE en una consulta, y antes de HAVING y ORDER BY.

Todas las columnas seleccionadas sin una agregación asociada deben aparecer en la cláusula GROUP BY.

SELECT   id_cliente,   COUNT(*) FROM tarjeta GROUP BY id_cliente;

GROUP BY agrupa todas las filas que tengan el mismo valor en la columna especificada.

Clausula GROUP BY en SQL, Agrupar las filas y contarlas


En este ejemplo, todas las tarjetas  pertenecientes al mismo cliente se agruparán en una fila. Después, la función COUNT(*) contará todas las filas de los clientes. Como resultado, obtendremos una tabla en la que aparecerá cada id_cliente junto con el número de tarjetas de las que es titular.

Por ejemplo para obtener el número de empleados de cada departamento en el año 2023. Mostramos el nombre del departamento junto con el número de empleados. Y llamamos a la segunda columna numero_de_empleados

SELECT departamento, COUNT(*) AS numero_de_empleados FROM empleados WHERE fecha = 2023 GROUP BY departamento;

Obtener los valores mínimos y máximos de grupos

GROUP BY se puede utilizar junto con muchas otras funciones.

SELECT   id_cliente,   MAX(saldo_total) FROM tarjetas GROUP BY id_cliente;

Se ha sustituido COUNT(*) por MAX(saldo_total).

En lugar de contar todos las trajetas de determinados clientes, obtendremos el saldo de tarjeta con el valor más alto de cada cliente.

Obtener el promedio de grupos

SELECT  id_cliente,  AVG(saldo_total) FROM tarjetas WHERE fecha_de_compra >= '2023-01-01'   AND fecha_de_compra < '2024-01-01' GROUP BY id_cliente;

Utilizamos la función AVG(saldo_total)  para obtener el promedio de los pedidos de cada uno de nuestros clientes, pero solo para los pedidos que realizaron en 2023.

Agrupar por varias columnas

A veces queremos agrupar las filas por más de una columna. Imaginemos que tenemos unos cuantos clientes que hacen montones de compras cada día, y que nos gustaría saber el importe que gastan diariamente en sus compras.

SELECT  id_cliente,  fecha_de_compra,  SUM(importe) FROM tarjetas GROUP BY id_cliente, fecha_de_compra;

Como se puede ver, agrupamos por dos columnas (id_cliente y fecha_de_compra). Seleccionamos estas columnas y la función SUM(importe).

Recordar: en este tipo de consultas, todas las columnas de la parte SELECT deben usarse posteriormente para la agrupación o con una de las funciones.

Filtrar grupos

Veremos cómo se pueden filtrar los grupos. Existe una palabra clave especial (HAVING) que está reservada para ello.

SELECT  id_cliente,  fecha_de_compra,  SUM(importe) FROM tarjetas GROUP BY id_cliente, fecha_de_compra HAVING SUM(importe) > 2000;

Utilizamos la palabra clave HAVING y, después, indicamos la condición para filtrar los resultados. En este caso, solo queremos mostrar a los clientes que, en días concretos, compraron productos por un valor total diario superior a 2.000 dólares.

Ejercicio

Obtener los departamentos en los que el salario promedio en 2022 fue superior a 3.000 €. Mostrar el nombre del departamento junto con el salario promedio.

SELECT departamento, AVG(salario) FROM empleados WHERE fecha = 2022 GROUP BY departamento HAVING AVG(salario) > 3000

Ordenar grupos

Los grupos se pueden ordenar igual que las filas. Echar un vistazo a lo siguiente:

SELECT  id_cliente,  fecha_de_compra,  SUM(importe) FROM tarjetas GROUP BY id_cliente, fecha_de_compra ORDER BY SUM(importe) DESC;

En este caso, ordenamos nuestras filas según el importe total diario de todas las compras de cada cliente. Las filas con el valor más alto aparecerán primero.

Ejercicio

Mostrar las columnas apellido y nombre de la tabla empleados junto con el salario medio de cada persona y el número de años que trabajó en la empresa.

Utilizar los siguientes alias: salario_medio para el salario medio de cada persona y fechas_trabajados para el número de años trabajados en la empresa. Muestre solo los empleados que estuvieron más de 2 años en la empresa. Ordene los resultados según el salario medio, en orden descendente.

SELECT apellido, nombre, AVG(salario) as salario_medio, COUNT(DISTINCT fecha) as fechas_trabajados FROM empleados GROUP BY apellido, nombre HAVING COUNT(DISTINCT fecha) > 2 ORDER BY AVG(salario) DESC;

Alias para tablas

Si queremos seleccionar muchas columnas de dos tablas combinadas, hay que escribir mucho. Todos esos nombres de columnas junto con los nombres de sus tablas. Hay una forma de simplificar la consulta, podemos introducir nuevos nombres temporales (llamados alias) para nuestras tablas:

SELECT  p.campo1,   p.campo2,   p.campo3,   c.campo1,   c.campo2,   c.campo3 FROM tabla1 AS p JOIN tabla2 AS c   ON p.campo1 = c.campo2;

Como se puede ver, en la cláusula FROM, después de los nombres de las tablas utilizamos la palabra clave AS. Esta palabra clave indica que lo que va a continuación se convertirá en el nuevo nombre temporal (alias) de la tabla. Gracias a esto, podemos ahorrarnos un poco de tiempo y escribir nombres más cortos para nuestras tablas.

Usar alias en autocombinaciones

Los alias también son útiles en otras situaciones. Si queremos introducir información sobre los empleados y sus jefes en una base de datos. En un momento dado, también queremos mostrar a los empleados junto con sus jefes, mediante una JOIN. Digamos que almacenamos a los empleados y a los jefes en la misma tabla persona. Todas las filas tienen una columna llamada id_jefe, que contiene el Id del jefe de cada empleado. Podemos combinar la tabla persona con la tabla persona, pero, en SQL no se acepta la siguiente consulta:

persona JOIN persona

Hay que proporcionar dos alias diferentes para la misma tabla de la siguiente manera:

SELECT * FROM persona AS empleado JOIN persona AS jefe   ON empleado.id_jefe = jefe.id;

Gracias a los alias, el motor de la base de datos puede utilizar dos veces la misma tabla (persona), la primera vez para buscar a los empleados y, la segunda, para buscar a sus jefes.

Ejercicio

Queremos saber quién vive en la misma habitación que el alumno Juan García. Utilice la autocombinación para mostrar todas las columnas del alumno Juan García junto con todas las columnas de cada alumno que vive con él en la misma habitación.

Excluir al propio Juan García del resultado.

SELECT * FROM alumno AS alumno1 JOIN alumno AS alumno2     ON alumno1.id_de_habitacion = alumno2.id_de_habitacion WHERE alumno1.nombre = ‘Juan García’ AND alumno1.id <> alumno2.id;

Combinar más tablas

También se puede usar más de una combinación en nuestra consulta de SQL. Digamos que también queremos mostrar toda la información de las habitaciones de los alumnos que viven con Juan García. Lamentablemente, la información del tipo: número de habitación o piso no se almacena en la tabla alumno; necesitamos crear otra combinación con la tabla habitación. Podríamos hacerlo de la siguiente manera:

SELECT * FROM alumno AS s1 JOIN alumno AS s2   ON s1.id_de_habitacion = s2.id_de_habitacion JOIN habitación   ON s2.id_de_habitacion = habitacion.id WHERE s1.nombre = ‘Juan García’ AND s1.nombre != s2.nombre;

Ejercicio

El reto es el siguiente: para cada habitación con 2 camas en la que haya realmente 2 alumnos, queremos mostrar una fila que contenga las siguientes columnas:

El nombre del primer alumno.

El nombre del segundo alumno.

El número de la habitación.

No cambiar ningún nombre de columna. Cada par de alumnos solo debe mostrarse una vez. El alumno cuyo nombre sea el primero en el alfabeto debe mostrarse primero.

Una pequeña pista: en términos de SQL, "primero en el alfabeto" significa "menor que" en los valores de texto.

SELECT   st1.nombre,   st2.nombre,   numero_de_habitacion FROM alumno st1 JOIN alumno st2   ON st1.id_de_habitacion = st2.id_de_habitacion JOIN habitación   ON st1.id_de_habitacion = habitacion.id WHERE st1.nombre < st2.nombre AND camas = 2;

 

sábado, 20 de abril de 2024

Fotos en Blanco y Negro con Photoshop

El color en una fotografía es indispensable cuando los colores y sombras, o los tonos, de la imagen son distintivos y vivos. La fotografía en blanco y negro es la mejor opción si desea centrarse en el sujeto y las texturas de una imagen sin distraerse con los colores, o si el sujeto no tiene una gama muy alta de colores (como una locomotora herrumbrosa) los efectos en blanco y negro pueden ayudar a resaltar el dramatismo de las imágenes.

Aquí propongo el método más fácil que utiliza el canal de luminosidad desde el modo Color Lab y nos proporciona una buena imagen en blanco y negro.

Para convertir fácilmente una imagen en color a blanco y negro podemos seguir estos pasos que se indican a continuación:

Abrimos la foto en color que queremos transformar a blanco y negro, duplicamos la foto desde el menú Imagen -> Duplicar.

Fotos en Blanco y Negro con Photoshop


 
 y pulsamos ok cambiando el nombre al archivo

 

Fotos en Blanco y Negro con Photoshop

Abrimos el menú Imagen -> Modo -> Color Lab

 

Color Lab Photoshop

Esto aparentemente no hace nada, por debajo nuestra imagen se convierte de modo RGB a modo Color Lab, la diferencia está en los canales de color que veremos a continuación.

Vamos al menú canales bajo el menú ventana

Canales de Color Lab

Y se abre la ventana de canales, en la cual en vez del típico RGB vemos los canales Lab, Luminosidad y a y b (bajando el scroll).

Estos canales nos permitirán ajustar nuestra foto a modo en blanco y negro de forma mucho más precisa y el resultado será más espectacular que utilizando los canelas por defecto RGB.

Pulsamos sobre el canal luminosidad para hacerlo activo y la foto se nos pone automáticamente en blanco y negro.

 

Canal luminosidad photoshop

Ahora volvemos al menú imagen-> modo y elegimos escala de grises y pulsamos ok.

 

Escala de grises photoshop

Escala de grises photoshop

Ahora echamos un vistazo a nuestra foto para ver si es demasiado clara o demasiado oscura.

Si es demasiado clara:

Vamos al panel de capas 

 

Panel de capas photoshop

Pulsamos sobre la capa fondo y Ctrl –J lo que nos duplica la capa fondo. Para hacer esta capa más oscura cambiamos el combo de arriba a Multiplicar

 

Panel de capas photoshop

Esto hace nuestra imagen algo más oscura.

Si la foto es demasiado oscura:

Seguimos los mismos pasos que en el paso anterior, pero en vez de dejar el combo en Multiplicar, lo dejamos en Normal.

Para dejar la foto a nuestro gusto podemos mover la barra de desplazamiento Opacidad, como nos convenga.

Panel de capas photoshop
 

Y ya lo tenemos, una vez esté a nuestro gusto guardamos la foto en archivo -> guardar.

Fotos en Blanco y Negro con Photoshop
Si te gusta esta foto la puedes descargar aquí


 

sábado, 6 de abril de 2024

Clausula JOIN en Lenguaje SQL

Los JOINs en SQL sirven para combinar filas de dos o más tablas basándose en un campo común entre ellas, devolviendo por tanto datos de diferentes tablas. Un JOIN se produce cuando dos o más tablas se juntan en una sentencia SQL.

En el gráfico que se muestra a continuación, cada tabla se representa como un conjunto (diagrama de Venn) lo que nos da una idea de las filas de que tabla devuelve cada JOIN diferente.

Clausula JOIN en Lenguaje SQL


Unión de varias tablas.

Este es el JOIN más sencillo posible.

SELECT * FROM tabla1, tabla2;

SQL toma cada fila de la tabla1 y la une con todas las filas de la tabla2. Así que si tenemos 8 filas en la tabla 1 y 5 en la tabla2 tendremos 8 * 5 = 40 filas. Es decir hace un producto cartesiano.

¿Por qué ocurrió esto? SQL no sabe qué hacer con los resultados de las dos tablas, así que, devolvió todas las combinaciones posibles. ¿Cómo podemos cambiar este resultado? 

SELECT * FROM tabla1, tabla2 WHERE tabla1.id_tabla1 = tabla2.id_tabla1;

Establecimos una nueva condición en la cláusula WHERE. Ahora, solo vemos las conexiones en las que el id de la tabla1  es el mismo que el id_tabla1 de la tabla 1 definido en la tabla2.

Si hay varias tablas, hay que referirse a las columnas indicando el nombre de la tabla y de la columna separados por un punto (.). Así, la columna id_tabla1 de la tabla2 se convierte en tabla2.id_tabla1 y, así, sucesivamente.

Se debe relacionar la clave primaria de cada tabla, así por ejemplo, el id de la tabla1  aparece en la tabla2 en el campo id_tabla1.

Combinar dos tablas es una operación tan popular y frecuente que SQL proporciona una palabra especial para ello: JOIN. Existen varios tipos de JOIN

Combinar tablas con JOIN

Observa el siguiente ejemplo:

SELECT * FROM Tabla_persona JOIN Tabla_coche ON Tabla_persona.id = Tabla_coche.id_propietario;

Queremos combinar las tablas Tabla_persona y Tabla_coche, por lo que utilizamos la palabra clave JOIN entre sus nombres.

SQL también necesita saber cómo combinar las tablas, así que, usamos otra palabra clave (ON). Tras ella, establecemos nuestra condición: combinar solamente aquellas filas en las que el id de persona sea el mismo que el id_propietario de coche.

INNER JOIN

JOIN es, en realidad, solo uno de los diferentes métodos que existen para hacer combinaciones en SQL. Es el más común, por lo que siempre se aplica de forma predeterminada cuando se escribe la palabra clave JOIN en las consultas de SQL. Pero, técnicamente hablando, su nombre completo es INNER JOIN.

La consulta del ejercicio anterior también puede escribirse de la siguiente manera:

SELECT * FROM Tabla_persona INNER JOIN Tabla_coche  ON Tabla_persona.id = Tabla_coche.id_propietario;

Las INNER JOIN (o JOIN) solo muestran las filas de las dos tablas en las que las columnas coinciden. Solo se devuelven las personas que son propietarias de un coche, y viceversa. Las personas que no son propietarios de un coche no aparecen en el resultado.

Las personas que tienen el valor NULL en la columna id_propietario no aparecen en el resultado de la INNER JOIN.

LEFT JOIN

Las LEFT JOIN devuelven todas las filas de la tabla izquierda (la primera tabla de la consulta) más todas las filas que coinciden de la tabla derecha (la segunda tabla de la consulta).

SELECT * FROM tabla1 LEFT JOIN tabla2   ON tabla1.id_tabla1 = tabla2.id_tabla1;

RIGHT JOIN

Las RIGHT JOIN devuelven todas las filas de la tabla derecha (la segunda tabla de la consulta) más todas las filas que coinciden de la tabla izquierda (la primera tabla de la consulta).

SELECT * FROM tabla1 RIGHT JOIN tabla2  ON tabla1.id_tabla1 = tabla2.id_tabla1;

La RIGHT JOIN devuelve todas las filas de la tabla anterior. El orden de las tablas en las LEFT y RIGHT JOIN es importante. En otras palabras, tabla1 RIGHT JOIN tabla2 es lo mismo que tabla2 LEFT JOIN tabla1. 

FULL JOIN

Este tipo de JOIN devuelve todas las filas de ambas tablas y combina las filas cuando hay una coincidencia. Una FULL JOIN es una unión de una LEFT JOIN y una RIGHT JOIN.

SELECT * FROM tabla1 FULL JOIN tabla2   ON tabla1.id_tabla1 = tabla2.id_tabla1;

OUTER

Las tres combinaciones que acabamos de mencionar LEFT JOIN, RIGHT JOIN y FULL JOIN son abreviaturas. Todas ellas son, en realidad, tipos de OUTER JOIN (LEFT OUTER JOIN, RIGHT OUTER JOIN y FULL OUTER JOIN). Se las puede añadir la palabra clave OUTER y los resultados de las consultas seguirán siendo los mismos.

Por ejemplo, para la LEFT JOIN se podría escribir lo siguiente:

SELECT * FROM tabla1 LEFT OUTER JOIN tabla2 ON tabla1.id_tabla1 = tabla2.id_tabla1;

NATURAL JOIN

No requiere la cláusula ON con la condición de la combinación:

SELECT * FROM tabla1 NATURAL JOIN tabla2;

Para los NATURAL JOIN no hace falta escribir los nombres de columnas, porque siempre combinan las dos tablas en base a las columnas que tienen el mismo nombre.

En este ejemplo, la tabla1 y la tabla2 se combinan en base a sus respectivas columnas de id, lo que no tiene mucho sentido.

SELECT * FROM tabla1 NATURAL JOIN tabla2; 

devuelve el mismo resultado que la siguiente consulta:

SELECT * FROM tabla1 JOIN tabla2 ON alumno.id_tabla1= habitacion.id_tabla2;

Sin embargo, podemos crear las tablas de forma que las NATURAL JOIN sean útiles. Si tuvieramos las siguientes tablas:

coche(id_coche, marca, modelo) 

propietario(id_del_propietario, nombre, id_coche)

Entonces, tendría mucho sentido utilizar NATURAL JOIN, porque combinaría las dos tablas en base a la columna id_coche. Por lo que, habría que escribir menos para combinar las dos tablas.