8. Lenguajes de consulta y extracción de datos

8. Lenguajes de consulta y extracción de datos




 

Los lenguajes de consulta y extracción de datos son muy importantes pues de su facilidad y potencia dependen los programas y aplicaciones que hacen uso de ellos. Aparte del SQL que es el lenguaje de consulta por antonomasia, en este capítulo se estudiarán algunos otros con cierta relevancia.

 

8.1 Características generales

 

Los lenguajes de consulta y extracción de datos surgieron en los 70 con CODD y las bases de datos relacionales. El lenguaje SEQUEL (creado por CODD en los 70) que posteriormente dió a la luz el SQL que es el más extendido se basa en cálculo y álgebra relacional. Ambos lenguajes (cálculo y álgebra) aun siendo distintos son lógicamente equivalentes. Cualquier expresión de cálculo se puede expresar en álgebra y viceversa. Estos lenguajes tienen bases matemáticas y permiten realizar cualquier consulta en un base de datos (aunque el álgebra es más sencilla para realizar consultas complejas).

 

El lenguaje SQL.

El lenguaje SQL es el más veterano y más utilizado en la actualidad. Este lenguaje se estudiará en detalle en el capítulo 9.

 

8.2 OQL

 

OQL u Object Query Language es un lenguaje utilizado en bases de datos orientadas a objetos y que fué creado por el ODMG (Object Data Management Group). Una de sus debilidades es la complejidad de su implementación y por eso no es un lenguaje muy utilizado en la actualidad.

 

Este lenguaje fue creado después del SQL y por eso guarda ciertas similitudes con el mismo. En este lenguaje hay que tener en cuenta que en vez de tablas se trabaja con clases, en vez de filas tenemos objetos y en vez de columnas tenemos atributos o campos.

 

Una sentencia en este lenguaje puede ser la siguiente:

 

SELECT Coches.marca, Coches.modelo

FROM Coches coche

WHERE coche.año > 1995;

 

En esta consulta seleccionamos de todos los objetos coche del tipo Coches, la marca y el modelo siempre y cuando dicho coche sea posterior al año 1995.

 

8.3 JPQL

 

Figura 8.1. Ejemplo de JPQL en Netbeans

 

El JPQL o Java Persistence Query Language (lenguaje de consulta para persistencia de Java) se utiliza para realizar consultas en entidades independientemente del mecanismo que utilicen dichas entidades para almacenarse (ser persistentes), ya sean bases de datos, ficheros, etc. Al igual que Java, JPQL es portable, esto quiere decir que no está ligado a ningún sistema particular de almacenamiento.

 

El JPQL es una extensión del EJB QL o Enterprise JavaBeans Query Language el cual añade operaciones como borrados y actualizaciones en bruto, operaciones join, agregaciones, subconsultas y proyecciones. Además, las consultas JPQL se pueden crear dinámicamente con lo cual le ofrecen más versatilidad al programador.

 

La sintaxis de JPQL es muy similar a SQL, la única diferencia es que opera con objetos, relaciones y atributos en vez de con tablas y columnas. De hecho, para ver las similitudes vamos a ver algunas consultas en JPQL:

 

// Consulta de una serie de objetos
Query consulta = em.createQuery(«Select c FROM coches c WHERE c.marca = ‘VolksWagen’ «);
List<Coches> result = consulta.getResultList();

 

Como se puede observar, en esta primera consulta se utiliza un objeto de tipo Query para almacenar la consulta en JPQL. El resultado de la misma se almacena en una lista (List) de objetos de tipo “Coches”.

// Consulta de un objeto determinado conociendo el dato
Query consulta = em.createQuery(«Select c FROM coches c WHERE c.matrícula = ‘4459BVN’ «);
Coches result2 = (Coches)consulta.getSingleResult();

 

En esta segunda consulta, en vez de utilizar el método getResultList() que devuelve una lista de objetos, vamos a utilizar el método getSingleResult() que devolverá solamente una instancia.

 

La diferencia de esta consulta con la siguiente es que en esta última, la matrícula se pasa como parámetro, por eso se utiliza el método setParameter() del objeto Query.

 

// Consulta de un objeto determinado pasándole el dato como parámetro
Query consulta = em.createQuery(«Select c FROM coches c WHERE c.matrícula = :id «);
consulta.setParameter(«id», matri_coche);
Coches result3 = (Coches)consulta.getSingleResult();

 

8.4 XMLQL

 

XML es el estándar de facto del intercambio de datos a través de Internet. De hecho XML ya se ha establecido como estándar de intercambio de datos en multimedia, e-commerce, finanzas, datos bibliográficos, etc. Actualmente existen al menos seis lenguajes de consulta diferentes para bases de datos en XML los cuales tienen diferentes características de los cuales quizás el que más destaque es XQuery.

 

XQuery es un lenguaje de consulta en bases de datos XML. XQuery se estudia en el capítulo 4 “Modelos avanzados de bases de datos”.

 

XMLQL es un lenguaje declarativo que extrae datos de un documento XML. Este lenguaje se puede utilizar para extraer datos sencillos de documentos XML o también para realizar consultas complejas realizando joins y otras operaciones entre distintos documentos XML para realizar una consulta.

 

XML tiene una ventaja que es su simplicidad. Un documento XML es una secuencia de elementos que pueden contener a su vez otros documentos. Al igual que el HTML los elementos tienen que estar entre etiquetas. Por ejemplo, la etiqueta <COCHE> tiene que tener otra etiqueta de cierre </COCHE>.

 

Veamos un ejemplo sencillo de cómo funciona este lenguaje. Imaginemos que tenemos el fichero coches.xml con la siguiente información:

 

<coches>

 <coche año=»2010″>

    <marca> VolksWagen </marca>

    <modelo> Passat </modelo>

    <combustible> Diesel  </combustible>

    <color> Azul  cielo </color>

 </coche>

 

 <coche año=»2011″>

    <marca> VolksWagen </marca>

    <modelo> Golf </modelo>

    <combustible> Gasolina  </combustible>

    <color> Plata </color>

    <datos> Muy cuidado, tiene faros antinieblas y cierre centralizado </datos>

 </coche>

 

 <coche año=»2013″>

    <marca> VolksWagen </marca>

    <modelo> Touareg </modelo>

    <combustible> Diesel  </combustible>

    <color> Blanco </color>

    <datos> Muy cuidado, todos los extras </datos>

 </coche>

 <coche año=»1996″>

    <marca> Opel </marca>

    <modelo> Astra </modelo>

    <combustible> Diesel  </combustible>

    <color> Negro </color>

    <datos> Lleva climatizador y tiene asientos de cuero </datos>

 </coche>

 

</coches>

 

Queremos realizar una consulta para listar todos los coches disponibles de la marca VolksWagen. Los datos se encuentran en el fichero coches.xml. La consulta tendría el siguiente aspecto:

 

WHERE <coche>

       <marca> VolksWagen </>

       <modelo> $m</>

       <combustible> $c</>

       <datos> $d</>

     </> IN «coches.xml»

CONSTRUCT <consulta>

            <modelo> $m</>

            <combustible> $c</>

            <datos> $d</>

         </>

 

Como se puede observar, la consulta tiene dos partes diferenciadas. En la primera con la cláusula WHERE se filtran los datos para luego en la cláusula CONSTRUCT modelar el resultado de la consulta en formato XML.

 

Una vez realizada la consulta en XML-QL, el resultado de la misma sería esta información en XML:

 

 <coche>

    <modelo> Passat </modelo>

    <combustible> Diesel  </combustible>

    <color> Azul  cielo </color>

 </coche>

 

 <coche>

    <modelo> Golf </modelo>

    <combustible> Gasolina  </combustible>

    <color> Plata </color>

    <datos> Muy cuidado, tiene faros antinieblas y cierre centralizado </datos>

 </coche>

 

 <coche>

    <modelo> Touareg </modelo>

    <combustible> Diesel  </combustible>

    <color> Blanco </color>

    <datos> Muy cuidado, todos los extras </datos>

 </coche>

 

Las consultas se pueden complicar. Imaginemos ahora que queremos recuperar todos los coches de la marca VolksWagen que han sido matriculados a partir del año 2012. La consulta en XML-QL sería la siguiente:

 

WHERE <coche año=$a>

       <marca> VolksWagen </>

       <modelo> $m</>

       <combustible> $c</>

       <datos> $d</>

     </> IN «coches.xml»

a > 2012

CONSTRUCT <consulta>

            <modelo> $m</>

            <combustible> $c</>

            <datos> $d</>

         </>

 

Como se puede observar se utiliza en la cláusula WHERE de la consulta la variable a para luego incluir la restricción a > 2012. El resultado en este caso sería el siguiente:

 

 <coche>

    <modelo> Touareg </modelo>

    <combustible> Diesel  </combustible>

    <color> Blanco </color>

    <datos> Muy cuidado, todos los extras </datos>

 </coche>

 

8.5 Otros lenguajes de consulta

 

Como complemento a los lenguajes de consulta vistos en apartados anteriores se va a estudiar el HTSQL diseñado para realizar consultas complejas y representación de datos y el LINQ, utilizado en el framework .NET.

 

8.5.1 HTSQL

htsql

Figura 8.2. Logo de HTSQL. http://htsql.org/

 

HTSQL se diseñó para aquellos programadores o analistas de datos que necesitan hacer consultas complejas a bases de datos y necesitan una herramienta eficaz que sea potente y que represente los datos de una manera estructurada.

 

Algunas de las características de este lenguaje son las siguientes:

 

  • Pasarela a bases de datos relacionales. Las consultas realizadas con HTSQL se traducen a sentencias SQL. HTSQL además funciona con características de diferentes bases de datos como pueden ser MySQL, Oracle, Microsoft SQL Server, SQLite o PostgreSQL.

  • Lenguaje de consulta avanzado. Con HTSQL se pueden hacer filtros, macros, agregaciones, proyecciones, y además permite utilizar numerosos tipos de datos y funciones.

  • Integración de servicios Web. HTSQL es un servicio web que acepta consultas como URLs y devuelve resultados formateados en HTML, XML, CSV o JSON.

  • Entorno de desarrollo. HTSQL incluye línea de comandos y un editor potente que colorea la sintaxis, muestra mensajes de error, sugerencias, etc.

  • Generación de informes. HTSQL tiene herramientas de generación de informes las cuales pueden incluirse en el lado del cliente como código JavaScript o en el lado del servidor como aplicaciones en Python. Además los plugin de HTSQL permiten adaptaciones según necesidad.

  • Herramienta colaborativa. HTSQL ofrece una herramienta colaborativa de desarrollo la cual permite al equipo comunicarse entre ellos. Además, las consultas pueden ser enviadas por correo, incluidas en informes, etc.

 

Veamos un ejemplo realizado con HTSQL:

 

/coches{marca, modelo}

 

Como se puede observar todos los comandos en HTSQL comienzan por “\”.

 

El comando anterior mostrará la siguiente tabla:

coches
___________________________________________________________
marca            | modelo
——————+——————————-
VolksWagen  | Passat
Fiat                | Panda
Fiat                | Cinquecento
Seat               | Toledo

HTSQL tiene una doble licencia. Una gratuita para bases de datos open source como MySQL o PostgreSQL y otra versión comercial con bases de datos propietarias como Oracle o Microsoft SQL Server.

8.5.2 LINQ

 

Algunos de los lenguajes de manipulación de datos tienen su razón de existencia en el hecho de que el desarrollador muchas veces realiza mucho esfuerzo en líneas de código en recuperar y manipular datos en una base de datos. Muchas veces los datos pueden estar almacenados además de en bases de datos en colecciones, documentos XML, etc.

 

LINQ es un lenguaje de manipulación de datos que puede utilizarse directamente dentro del código de C# y Visual Basic. Es una extensión del framework .NET.

 

El lenguaje es similar al SQL (comparte muchos operadores) dado que muchos programadores están acostumbrados al mismo y las expresiones son similares.

 

LINQ permite expresiones de consulta que pueden manipular colecciones de objetos, documentos XML (LINQ to XML), implementaciones de cualquier objeto IEnumerable<T> (LINQ to Objects) y bases de datos relacionales por supuesto (LINQ to SQL).

 

Todas las operaciones en LINQ consisten en tres pasos:

  • Paso 1: Obtener el datasource.

  • Paso 2: Crear la consulta.

  • Paso 3: Ejecutar la consulta.

Veamos un ejemplo sencillo de LINQ en C#:

 

using (ServiceContext servContext = new ServiceContext(_serviceProxy))

{

var consulta_cond = from a in servContext.AccountSet

                   where a.Name.Contains(«VolksWagen»)

                   where a.Modelo == «Passat»

                   select a;

 

foreach (var a in consulta_cond)

{

 System.Console.WriteLine(a.Name + » » + a.Modelo);

}

}

Como se puede ver, en el paso 1 se obtiene el datasource que es el handler o manejador para poder acceder a los datos. En nuestro caso es la creación de la variable servContext que es un objeto del tipo ServiceContext.

 

Posteriormente se crea la consulta en la variable consulta_cond. Como se puede observar, la consulta es parecida a una consulta en SQL, en ella podemos distinguir las cláusulas select, from y where que son comunes a las que se utilizan en SQL.

 

Por último, con el bucle foreach se accede a cada elemento de la consulta y se muestra por pantalla utilizando el método System.Console.WriteLine().

 

Veamos el mismo ejemplo sencillo de LINQ pero en Visual Basic:

 

Using servContext As New ServiceContext(_serviceProxy)

Dim consulta_cond = From c In servContext.AccountSet _

                   Where c.Marca.Contains(«VolksWagen») _

                   Where c.Modelo.Equals(«Passat») _

                   Select c

 

For Each c In consulta_cond

 Console.WriteLine(c.Marca & » » & c.Modelo)

Next c

End Using

Como se puede observar los códigos anteriores son similares, la única diferencia es que la sintaxis de C# a Visual Basic tiene algunas variaciones.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.