1 00:00:00,820 --> 00:00:05,500 Bueno, pues estamos aquí en la unidad 6 en la que vamos a tratar xQuery. 2 00:00:06,139 --> 00:00:13,460 Ya os hice un vídeo de Basics, que es la herramienta que vamos a utilizar para las xQuery. 3 00:00:13,660 --> 00:00:22,039 Es una herramienta que está especializada en xQuery y además es gratuita y ya veréis que es muy intuitiva y es fácil de usar. 4 00:00:23,079 --> 00:00:28,500 Es la herramienta que vamos a utilizar también para la tarea, así que sería conveniente que os vierais este vídeo 5 00:00:28,500 --> 00:00:39,240 y instalará es basics y bueno os dejo también claro el código de x query que es como en todas 6 00:00:39,240 --> 00:00:44,259 las unidades que es el que vamos a tomar de referencia para para explicar un poco cómo 7 00:00:44,259 --> 00:00:53,619 funciona todo esto entonces si abrís el archivo comprimido que os he subido veréis que tiene 8 00:00:53,619 --> 00:01:00,340 dos archivos. Uno es el XML del cual vamos a hacer las consultas y luego las consultas 9 00:01:00,340 --> 00:01:07,579 propiamente dichas. Vamos a echarle un ojo en el Visual Studio Code al XML que os he 10 00:01:07,579 --> 00:01:15,459 subido. Entonces, tenemos una etiqueta raíz que es biblioteca. En la biblioteca lo que 11 00:01:15,459 --> 00:01:25,239 vamos a tener son libros y cada libro pues tenemos dos atributos edición y publicación y luego una 12 00:01:25,239 --> 00:01:31,560 serie de elementos propios de cada libro entonces con x query lo que vamos a poder hacer es 13 00:01:31,560 --> 00:01:39,000 posicionarnos en el nodo que nos interese y para posicionarnos nos vamos a valer de xpath no que 14 00:01:39,000 --> 00:01:44,180 que es la tecnología que utilizábamos ya en la unidad anterior. 15 00:01:45,700 --> 00:01:51,340 Entonces haremos lo mismo, biblioteca barra libros barra libro, y nos posicionaremos en libro. 16 00:01:51,340 --> 00:02:03,299 Y una vez posicionados en libro, por ejemplo, podremos sacar los valores de los que se compone el libro. 17 00:02:03,299 --> 00:02:06,019 Podemos hacer consultas 18 00:02:06,019 --> 00:02:07,739 De que por ejemplo las páginas 19 00:02:07,739 --> 00:02:11,060 Tengan un determinado valor 20 00:02:11,060 --> 00:02:12,199 O sea mayor o menor 21 00:02:12,199 --> 00:02:14,900 Podemos utilizar estos datos 22 00:02:14,900 --> 00:02:15,719 Para funciones 23 00:02:15,719 --> 00:02:18,819 Y podemos ver si hay campo vacío 24 00:02:18,819 --> 00:02:20,340 Si no, etc 25 00:02:20,340 --> 00:02:21,319 ¿Vale? 26 00:02:21,819 --> 00:02:24,719 Pues como consultas básicas de SQL 27 00:02:24,719 --> 00:02:25,840 Básicamente 28 00:02:25,840 --> 00:02:29,000 Entonces, venga, vamos con ello 29 00:02:29,000 --> 00:02:32,060 Ejecutamos BaseX 30 00:02:32,060 --> 00:02:43,590 y lo primero que vamos a hacer va a ser cargar nuestra base de datos que en este caso es el xml de libros 31 00:02:43,590 --> 00:02:51,110 yo aquí ya tengo la ruta puesta, vosotros tendréis que descargar el archivo comprimido, descomprimirlo 32 00:02:51,110 --> 00:02:55,930 y luego aquí buscar el xml de libros 33 00:02:55,930 --> 00:03:06,419 si lo cargamos pues ya lo carga la herramienta y está bastante bien porque aquí tenéis un visor 34 00:03:06,419 --> 00:03:08,379 que os podéis situar en cada 35 00:03:08,379 --> 00:03:10,419 nodo y ver lo que tiene 36 00:03:10,419 --> 00:03:13,840 los elementos 37 00:03:13,840 --> 00:03:14,960 de cada nodo y 38 00:03:14,960 --> 00:03:17,460 está guay, vale 39 00:03:17,460 --> 00:03:19,479 luego tenéis esta 40 00:03:19,479 --> 00:03:21,740 pequeña editor de texto 41 00:03:21,740 --> 00:03:23,780 que es donde vamos a 42 00:03:23,780 --> 00:03:25,419 ir construyendo nuestras consultas 43 00:03:25,419 --> 00:03:28,889 entonces 44 00:03:28,889 --> 00:03:31,469 las consultas ya las tengo yo aquí 45 00:03:31,469 --> 00:03:33,389 vale, que es del otro fichero 46 00:03:33,389 --> 00:03:35,889 de este de consultas 47 00:03:35,889 --> 00:03:38,050 vale, os, me voy a valer 48 00:03:38,050 --> 00:03:48,810 de un notepad y vamos a ir viendo las consultas una a una. Vale. Como veis aquí los comentarios 49 00:03:48,810 --> 00:03:56,729 se hacen con estas caritas sonrientes, entonces se abre paréntesis, dos puntos, comentario, 50 00:03:57,210 --> 00:04:02,650 dos puntos, se cierra paréntesis. Así es como se hacen los comentarios. Entonces, ¿cómo 51 00:04:02,650 --> 00:04:25,269 ¿Cómo manejamos las consultas de XQuery? Vamos a estar recorriendo nodos. Para recorrer nodos nos tenemos que hablar de un bucle for y de una variable. Las variables en XQuery se crean con el dólar. Primero se pone el dólar y luego el nombre de la variable. Esto indica que es una variable. 52 00:04:25,269 --> 00:04:32,490 Aquí lo que vamos a hacer es repetir este broker for de 1 a 5, que son los valores que va a coger nuestra variable x. 53 00:04:33,129 --> 00:04:39,649 Y lo que vamos a devolver va a ser una etiqueta text con el valor de la variable. 54 00:04:40,490 --> 00:04:45,970 Y para que salga el valor de la variable lo que lo vamos a poner es entre llaves. 55 00:04:46,910 --> 00:04:53,069 Entonces, para ejecutar esta consulta le damos aquí al play y como vemos nos da el resultado esperado. 56 00:04:53,069 --> 00:05:17,319 Que es 5 veces el test con los valores que va cogiendo de 1 a 5. ¿De acuerdo? Vale, vamos a seguir con la... Ya con consultas directamente al XML. Vale, a ver... Perfecto. 57 00:05:17,319 --> 00:05:31,600 Aquí lo que hacemos es que la variable x nos valemos de un xpath para situarnos en el nodo que nos interesa, que en este caso es libro, ¿vale? Va de biblioteca, libros, libro. 58 00:05:31,600 --> 00:05:37,560 Entonces, el valor que está cogiendo X es hasta libro 59 00:05:37,560 --> 00:05:38,779 ¿Vale? 60 00:05:39,100 --> 00:05:41,459 Entonces, si queremos sacar el título y la editorial 61 00:05:41,459 --> 00:05:45,279 Ponemos X porque está cogiendo el valor hasta libro 62 00:05:45,279 --> 00:05:48,540 Y luego sacamos el título, ya que está dentro del libro 63 00:05:48,540 --> 00:05:51,939 Y sacamos la editorial, ya que está dentro de la editorial 64 00:05:51,939 --> 00:05:54,120 Y como estamos recorriendo un bucle for 65 00:05:54,120 --> 00:05:57,500 Mientras existan libros, va a seguir recorriéndolo 66 00:05:57,500 --> 00:05:58,439 ¿De acuerdo? 67 00:05:58,439 --> 00:06:13,480 También tenemos la función test y la función data. Esto lo utilizamos para que saque solo el valor. En este caso, el título sería LearningXML y la editorial O'Reilly. 68 00:06:13,480 --> 00:06:18,300 ¿Qué es lo que pasa si, por ejemplo, le quito aquí el test? 69 00:06:20,100 --> 00:06:23,560 Que en vez de sacar solo el valor, lo que nos va a sacar son las etiquetas también 70 00:06:23,560 --> 00:06:25,060 O sea, va a sacar todo esto 71 00:06:25,060 --> 00:06:28,800 Las etiquetas, el valor, en vez de solo el valor 72 00:06:28,800 --> 00:06:32,860 Muchas veces, pues igual querremos que aparezcan las etiquetas 73 00:06:32,860 --> 00:06:34,000 Entonces lo pondremos así 74 00:06:34,000 --> 00:06:36,480 Otras veces solo queremos que aparezca el valor 75 00:06:36,480 --> 00:06:42,139 Y para que aparezca el valor, pues es con barra test o utilizando la función data 76 00:06:42,139 --> 00:06:44,680 entonces vamos a ver lo que aparece 77 00:06:44,680 --> 00:06:47,399 como veis aquí 78 00:06:47,399 --> 00:06:49,480 como hemos sacado el título 79 00:06:49,480 --> 00:06:50,939 sin el barra test ni en el data 80 00:06:50,939 --> 00:06:53,439 tenemos 81 00:06:53,439 --> 00:06:55,480 esto con el título 82 00:06:55,480 --> 00:06:57,139 con las etiquetas 83 00:06:57,139 --> 00:06:59,500 sin embargo para la editorial solo saca el valor 84 00:06:59,500 --> 00:07:00,379 ¿de acuerdo? 85 00:07:01,439 --> 00:07:03,339 vale, vamos con otra 86 00:07:03,339 --> 00:07:05,680 función 87 00:07:05,680 --> 00:07:09,139 con otra consulta 88 00:07:09,139 --> 00:07:18,279 a ver, de acuerdo 89 00:07:18,279 --> 00:07:23,360 Vale, aparte de consultar datos directamente 90 00:07:23,360 --> 00:07:25,560 Lo que podemos utilizar son condiciones 91 00:07:25,560 --> 00:07:29,860 Entonces, aquí lo que estamos haciendo también es posicionándonos 92 00:07:29,860 --> 00:07:32,720 En libro, en el nodo libro 93 00:07:32,720 --> 00:07:36,360 Y lo que vamos a hacer es que vamos a sacar 94 00:07:36,360 --> 00:07:41,100 Solo los libros que tengan menos de 100 páginas 95 00:07:41,100 --> 00:07:43,939 Vale, entonces, dentro del libro 96 00:07:43,939 --> 00:07:46,579 Hay un elemento que es páginas 97 00:07:46,579 --> 00:07:51,100 que es el que estamos consultando con la función number. 98 00:07:51,920 --> 00:07:58,579 La función number la ponemos para cerciorarnos de que está entendiendo que el valor que hay aquí dentro es un número. 99 00:07:59,420 --> 00:07:59,720 ¿De acuerdo? 100 00:08:00,300 --> 00:08:06,100 Entonces le ponemos de libro las páginas, le indicamos que es un número 101 00:08:06,100 --> 00:08:09,899 y vamos a sacar solo las que tengan menos de 100 páginas. 102 00:08:10,959 --> 00:08:12,579 Y vamos a sacar el valor. 103 00:08:13,319 --> 00:08:15,180 Por eso utilizamos la función data. 104 00:08:15,180 --> 00:08:28,439 Entonces aquí solo nos saca una, porque si vamos aquí al XML vemos que solo LearningXML tiene menos de 100 páginas, que tiene 16. 105 00:08:28,439 --> 00:08:51,620 Si, por ejemplo, le ponemos menos de 500, ya nos saca 3, porque menos de 500 tenemos el XQuery, que es este de aquí, tenemos menos de 500 el XMLSem y el LearningXML. 106 00:08:51,620 --> 00:09:08,559 ¿De acuerdo? Entonces, con esto veis que podemos también hacer consultas con condiciones muy sencillitas, pero que es muy fácil de hacer. Simplemente es posicionarse en el nodo y poner la condición con el web. 107 00:09:08,559 --> 00:09:13,120 ¿De acuerdo? Vamos con la siguiente 108 00:09:13,120 --> 00:09:29,559 Aquí nos hemos posicionado en libros 109 00:09:29,559 --> 00:09:34,039 Entonces, como nos hemos posicionado en libros y no en libro 110 00:09:34,039 --> 00:09:40,340 Lo que tenemos que hacer para consultar elementos de dentro del libro es ir al libro 111 00:09:40,340 --> 00:09:50,840 ¿Vale? Esto podríamos poner aquí libro y entonces le quitaríamos aquí el libro como hemos hecho en la anterior 112 00:09:50,840 --> 00:10:00,840 Entonces, a ver, esta consulta es parecida a la anterior, lo único que veis es que utilizamos let 113 00:10:00,840 --> 00:10:04,299 Let se utiliza para inicializar variables 114 00:10:04,299 --> 00:10:10,659 Con el let estamos declarando la variable y y estamos diciendo que le asignamos este valor 115 00:10:10,659 --> 00:10:15,500 ¿Vale? Esta lista de valores, porque puede haber más de uno, como hemos visto antes 116 00:10:15,500 --> 00:10:21,360 Entonces, luego simplemente con el count contamos los valores que hay dentro de esta lista 117 00:10:22,259 --> 00:10:33,100 Aquí estamos buscando los libros que tengan menos de 100 páginas, los almacenamos con el let en la variable y y aquí contamos el número de libros. 118 00:10:33,100 --> 00:10:40,159 Que va a salir 1, claro. Si ponemos como antes 500 salen 3. 119 00:10:41,039 --> 00:10:50,519 ¿De acuerdo? Entonces con el let inicializamos también variables y luego podemos hacer operaciones sobre ellas. 120 00:10:51,360 --> 00:11:09,649 Seguimos. A ver... Entonces, esta consulta es muy parecida. Lo único que en vez de hacerla sobre el número de páginas, lo hacemos sobre la editorial. 121 00:11:09,649 --> 00:11:22,250 Y como veis, aquí estamos buscando libros cuya editorial sea O'Reilly. También lo que hacemos es ordenarla por título, de manera alfabética. 122 00:11:22,250 --> 00:11:25,190 Y lo ponemos en una lista 123 00:11:25,190 --> 00:11:26,710 ¿De acuerdo? 124 00:11:27,409 --> 00:11:28,389 Vamos con esta 125 00:11:28,389 --> 00:11:42,919 Vale, estoy viendo que estas dos 126 00:11:42,919 --> 00:11:46,080 Realmente son iguales 127 00:11:46,080 --> 00:11:46,799 Así que 128 00:11:46,799 --> 00:11:49,559 Vamos a 129 00:11:49,559 --> 00:11:54,289 Vamos a coger el comentario de aquí 130 00:11:54,289 --> 00:11:55,950 Lo ponemos aquí 131 00:11:55,950 --> 00:11:57,309 Y esta la borramos 132 00:11:57,309 --> 00:12:02,250 No, espérate 133 00:12:02,250 --> 00:12:08,389 No, no, esta es diferente 134 00:12:08,389 --> 00:12:16,200 Espera, vamos a coger esta de aquí 135 00:12:16,200 --> 00:12:16,779 ¿De acuerdo? 136 00:12:16,779 --> 00:12:49,870 Bueno, aquí hay alguna cosilla que falla. Si esta paréntesis no tendría que estar aquí. Vale, perfecto. Entonces, ¿qué es lo que tenemos aquí? Aquí estamos... Vale, nos hemos posicionado en libro porque con el arroba lo que hacemos es consultar los atributos. 137 00:12:49,870 --> 00:12:56,950 ¿De acuerdo? Entonces, la x la inicializamos hasta libro, que es donde está el atributo 138 00:12:56,950 --> 00:13:03,570 Y luego, dentro de x, lo que hacemos es arroba publicaciones 139 00:13:03,570 --> 00:13:09,309 Cuando decimos arroba, entiende que estamos refiriéndonos a un atributo 140 00:13:09,309 --> 00:13:12,830 Que está en el mismo nivel en el cual nos hemos posicionado 141 00:13:12,830 --> 00:13:25,009 Y entonces lo que queremos buscar aquí son los libros cuya publicación, que es un atributo al cual accedemos con un arroba, es igual a 2002. 142 00:13:26,850 --> 00:13:41,929 Aquí salen estos dos, porque si nos vamos aquí al XML vemos que ese atributo lo tiene en el 2002 XMLSEM y XPath, que son justo los que salen. 143 00:13:42,830 --> 00:13:54,850 Exactamente. Entonces, de aquí nos tenemos que quedar que con el arroba accedemos a los atributos, pero nos tenemos que posicionar primero en el atributo para ello. 144 00:13:54,850 --> 00:13:57,610 Seguimos 145 00:13:57,610 --> 00:14:01,750 Sí, con este lo que hacemos 146 00:14:01,750 --> 00:14:04,110 Es sacar 147 00:14:04,110 --> 00:14:09,309 Vamos a ponerlo aquí 148 00:14:09,309 --> 00:14:14,419 Vale 149 00:14:14,419 --> 00:14:16,419 Vale 150 00:14:16,419 --> 00:14:18,720 Aquí lo que estamos mirando 151 00:14:18,720 --> 00:14:21,000 Son los autores 152 00:14:21,000 --> 00:14:23,600 Entonces 153 00:14:23,600 --> 00:14:25,980 Nos estamos posicionando en libro 154 00:14:25,980 --> 00:14:30,240 Y contamos 155 00:14:30,240 --> 00:14:33,100 El número de autores 156 00:14:33,100 --> 00:14:52,100 Entonces lo que queremos son las filas que tengan más de un autor. Vamos a verlo aquí en el Visual Studio que se verá mejor. Aquí hay uno, aquí hay dos. ¿Ves? Aquí son dos. Aquí hay uno, aquí hay uno también. 157 00:14:52,100 --> 00:15:16,100 En principio solo tendría que sacar ese. Entonces, aquí pongo editorial hacia Capón para que salga un poco más separado y se pueda leer mejor. ¿Ves? Igual que el libro aquí. O sea, podemos poner texto, pero el texto tiene que estar fuera de las llaves. ¿De acuerdo? 158 00:15:16,100 --> 00:15:37,519 O sea, aquí ponemos la etiqueta libro y luego dentro del libro podemos poner lo que nos dé la gana escribiéndolo, pero una vez que, cuando queramos poner la información del XML es cuando tenemos que abrir las llaves, por eso pongo aquí libro y abro y cierro la llave, editorial y abro y cierro la llave, ¿de acuerdo? 159 00:15:37,519 --> 00:15:55,519 Entonces, solo me saca este porque es el único que tiene dos autores, como hemos visto antes. ¿Qué es este de aquí? XML imprescindible. Exacto, este mismo. ¿Vale? Con el count. Sigamos. A ver... 160 00:15:55,519 --> 00:16:30,340 Y bueno, este que es también de cajón que podemos consultar elementos que estén vacíos, ¿vale? Si por ejemplo, en este caso, títulos de los libros que no tienen versión electrónica, entonces tenemos un campo que es versión electrónica, entonces con un where not lo que hacemos es seleccionar los que no tengan, los que es donde ese elemento esté vacío, ¿vale? 161 00:16:30,340 --> 00:17:10,809 Aquí por ejemplo está vacío y es donde salen. Y por último vamos a ver las funciones. Vamos a bajar esto un poquito para que se vean los dos. Si os habéis dado cuenta tenemos dos elementos que son precio y descuento. 162 00:17:10,809 --> 00:17:19,250 ¿Vale? Entonces, esto es una función que lo que hace es conseguir el precio después del descuento 163 00:17:19,250 --> 00:17:23,250 Tenemos dos variables que son los parámetros que metemos 164 00:17:23,250 --> 00:17:27,089 El precio y el descuento, ¿vale? Con P y D 165 00:17:27,089 --> 00:17:32,079 Y lo que vamos a sacar es un decimal 166 00:17:32,079 --> 00:17:37,279 Entonces, verificamos que lo que nos han metido 167 00:17:37,279 --> 00:17:43,039 Que los parámetros que nos han incorporado tienen información, ¿vale? 168 00:17:43,039 --> 00:17:44,460 Que no están vacíos. 169 00:17:44,759 --> 00:17:49,299 Entonces, si el precio está vacío o el descuento está vacío, no devolvemos nada. 170 00:17:50,619 --> 00:17:51,180 ¿Vale? 171 00:17:52,000 --> 00:18:02,519 Pero si no, lo que hacemos es inicializar la variable descuento con el descuento obtenido por el porcentaje. 172 00:18:02,700 --> 00:18:02,799 ¿Vale? 173 00:18:03,180 --> 00:18:05,420 O sea, el precio por el descuento dividido entre 100. 174 00:18:06,500 --> 00:18:10,339 Que es el descuento que vamos a obtener por ese libro. 175 00:18:10,339 --> 00:18:14,039 Y lo que devolvemos es el precio menos el descuento. 176 00:18:14,480 --> 00:18:25,440 ¿Vale? Bastante facilita la función. Y entonces aquí tenemos los campos precio y los campos descuento en cada libro. Precio y descuento. 177 00:18:25,440 --> 00:18:32,750 Lo que hacemos aquí es situarnos en el nodo libro 178 00:18:32,750 --> 00:18:37,650 Para recorrer todos los libros como hemos hecho antes 179 00:18:37,650 --> 00:18:41,569 Y entonces la devolvemos 180 00:18:41,569 --> 00:18:48,210 Para devolver dos elementos tenemos que enclobarlo en uno más grande 181 00:18:48,210 --> 00:18:50,410 En este caso es libro 182 00:18:50,410 --> 00:18:53,650 Libro va a coger estos dos elementos 183 00:18:53,650 --> 00:18:54,930 Que es el título 184 00:18:54,930 --> 00:19:21,980 Y con el test metemos el valor sin las etiquetas y luego el precio mínimo. Y aquí es donde llamamos a la función, ¿vale? Con las llaves llamamos a la función con el prefijo xs decimal, porque aquí lo que estamos haciendo es diciendo que esto va a ser un decimal, ¿vale? 185 00:19:21,980 --> 00:19:30,599 para que lo interprete bien y no tenga problemas y aquí le estamos metiendo la variable libro que hemos dicho que está posicionada aquí 186 00:19:30,599 --> 00:19:41,240 y dentro del libro tenemos precio y dentro del libro tenemos descuento, entonces aquí lo que estamos metiendo es que el precio son 2000 187 00:19:41,240 --> 00:19:49,680 y el descuento es el 10%, con lo cual nos tendría que devolver 1.800, ¿verdad? 188 00:19:49,740 --> 00:19:55,240 Porque el descuento, el 10% de 2.000 son 200, que es lo que le deducimos, 1.800. 189 00:19:56,759 --> 00:19:58,259 Y así con todos los demás. 190 00:19:59,660 --> 00:20:00,420 Vamos a ver. 191 00:20:02,769 --> 00:20:03,670 Exacto, 1.800. 192 00:20:04,309 --> 00:20:08,509 Y en los demás, pues ya ha aplicado el descuento y es así como se utilizan las funciones. 193 00:20:08,509 --> 00:20:13,430 Entonces como veis es bastante sencillito lo que estamos dando aquí 194 00:20:13,430 --> 00:20:15,450 Obviamente se pueden hacer cosas más avanzadas 195 00:20:15,450 --> 00:20:20,569 Pero es lo que más o menos se va a pedir en la tarea 196 00:20:20,569 --> 00:20:25,130 Os aconsejo eso, que os descarguéis el código que os he puesto 197 00:20:25,130 --> 00:20:28,670 Que instaléis el BaseX 198 00:20:28,670 --> 00:20:31,809 Como os he dejado detallado en el otro vídeo 199 00:20:31,809 --> 00:20:35,690 Por si tenéis algún problema podéis ver el vídeo y ver cómo se instala 200 00:20:35,690 --> 00:20:45,589 y pues eso, cargáis aquí en Database New el XML de libros y luego vais probando las consultas 201 00:20:45,589 --> 00:20:51,670 y podéis ir modificándolas o haciendo vuestras propias consultas, leeros también el contenido 202 00:20:51,670 --> 00:21:02,130 y con el contenido podéis ir probando aquí y luego la tarea que os he puesto es bastante parecido a todo esto 203 00:21:02,130 --> 00:21:05,609 así que lo podréis ir practicando también vosotros, ¿de acuerdo? 204 00:21:05,690 --> 00:21:12,170 Pues nada, ya la próxima unidad será para después de Semana Santa 205 00:21:12,170 --> 00:21:15,250 Así que nada, os deseo que tengáis buenas vacaciones 206 00:21:15,250 --> 00:21:17,609 Y eso, nos vemos después de Semana Santa 207 00:21:17,609 --> 00:21:18,329 Adiós