Una Vista (View) es una Tabla Virtual cuyo contenido está definido por una consulta (SELECT), al igual que una tabla real una vista consta de un conjunto de columnas y filas de datos con nombre. Sin embargo, debe quedar bien claro de que una Vista «no almacena datos», las filas y columnas de datos proceden de tablas a las cuales se hace referencia en la consulta que se define desde la vista .
Una Vista al ser una tabla más de la base de datos, puede ser utilizada como cualquier otra tabla (con pequeñas diferencias claro) desde java o desde el lenguaje que estemos utilizando (ASPX, VB, C++, Delphi, PHP, etc), una vista puede utilizarse por ejemplo para:
Podemos decir mucho más sobre las Vista, sin embargo yo me canso en escribir y usted se cansa en leer, si llego a este sitio, es porque lo que usted está buscando son ejemplos prácticos, y ejemplos prácticos es lo que tendra, solo nos detendremos a escribir las partes más relevantes para nuestro ejemplo.
¿Que necesita saber?
Crear una Vista (CREATE VIEW).
Para crear una vista se utiliza el comando
CREATE VIEW <Nombre de la Vista> AS <Instrucción SELECT atributos físicos de una o varias tablas>
Instruccion de selección (SELECT).
En la instrucción SELECT quee define la vista se puede utilizar más de una tabla e incluso otras vistas. Sin embargo, hay que tener en cuenta algunas restricciones de las cláusulas SELECT en una definición de una vista, no se puede:
Comencemos con la práctica 🙂
Utilizaremos una pequeña base de datos compuesta por tres tablas, Universitario, Materia y la relación muchos a muchos entre estas dos tablas, el MER es el siguiente:
La tabla UNIVERSITARIO esta formada de la siguiente manera:
-- -- Estructura de tabla para la tabla 'universitario' -- CREATE TABLE universitario ( u_carnet varchar(7) NOT NULL, u_nombre varchar(60) NOT NULL, PRIMARY KEY (u_carnet) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- Volcar la base de datos para la tabla 'universitario' -- INSERT INTO universitario VALUES ('333-123', 'Al K. Huete '); INSERT INTO universitario VALUES ('345-232', 'Aldo Lorido '); INSERT INTO universitario VALUES ('555-667', 'Alejandro Gado '); INSERT INTO universitario VALUES ('323-111', 'Alex Cremento '); INSERT INTO universitario VALUES ('321-236', 'Armando Esteban Quito '); INSERT INTO universitario VALUES ('555-349', 'Helen Chufe '); INSERT INTO universitario VALUES ('098-332', 'Monica Galindo '); INSERT INTO universitario VALUES ('998-002', 'Viviana K. Lavuelta '); INSERT INTO universitario VALUES ('009-332', 'Lali Cuadora '); INSERT INTO universitario VALUES ('911-212', 'Federico Chino ');
La tabla MATERIA con algunos datos es la siguiente:
-- -- Estructura de tabla para la tabla 'materia' -- CREATE TABLE materia ( m_sigla varchar(6) NOT NULL, m_nombre varchar(60) NOT NULL, PRIMARY KEY (m_sigla) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- Volcar la base de datos para la tabla 'materia' -- INSERT INTO materia VALUES ('SIS102', 'Base de Datos I'); INSERT INTO materia VALUES ('SIS420', 'Inteligencia Artificial'); INSERT INTO materia VALUES ('SIS100', 'Ensamblador');
La relación entre ambas tablas UNIVERSITARIO y MATERIA forma una tabla intermedia que llamremos UM, su estructura es:
-- -- Estructura de tabla para la tabla 'um' -- CREATE TABLE um ( cu varchar(7) default NULL, sigla varchar(6) default NULL, examen1 float default NULL, examen2 float default NULL, KEY cu (cu), KEY sigla (sigla) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- Volcar la base de datos para la tabla 'um' -- INSERT INTO um VALUES ('333-123', 'SIS102', 46, 23); INSERT INTO um VALUES ('333-123', 'SIS420', 56, 49); INSERT INTO um VALUES ('345-232', 'SIS100', 33, 12); INSERT INTO um VALUES ('345-232', 'SIS420', 89, 44); INSERT INTO um VALUES ('555-667', 'SIS420', 55, 45); INSERT INTO um VALUES ('555-667', 'SIS120', 45, 66); INSERT INTO um VALUES ('323-111', 'SIS100', 55, 65); INSERT INTO um VALUES ('323-111', 'SIS120', 66, 77); INSERT INTO um VALUES ('321-236', 'SIS100', 78, 87); INSERT INTO um VALUES ('321-236', 'SIS120', 87, 10); INSERT INTO um VALUES ('555-349', 'SIS100', 34, 87); INSERT INTO um VALUES ('555-349', 'SIS420', 77, 77); INSERT INTO um VALUES ('098-332', 'SIS100', 45, 65); INSERT INTO um VALUES ('998-002', 'SIS120', 23, 32); INSERT INTO um VALUES ('009-332', 'SIS420', 33, 54); INSERT INTO um VALUES ('009-332', 'SIS120', 34, 55); INSERT INTO um VALUES ('911-212', 'SIS100', 44, 55); INSERT INTO um VALUES ('911-212', 'SIS420', 34, 54);
Creo que el sentido de esta base de datos se entiende verdad, un universitario pueden llevar muchas materias y una materia puede ser llevada por muchas universitarios, ademas se necesita almacenar las calificaciones del primer y segundo examen para cada alumno.
¿Que se desea conocer?
Se desea conocer la lista de los alumnos aprobados con nota mayor de 51 de la asignatura de SIS-420 «Inteligencia Artificial», esta consulta podemos resolverla de la siguiente manera:
SELECT * FROM ( SELECT u_carnet AS CU, u_nombre AS Nombre, examen1 AS Nota1 , examen2 AS Nota2, SUM(examen1+examen2)/2 AS NotaFinal FROM universitario INNER JOIN um on u_carnet=cu INNER JOIN materia ON sigla=m_sigla WHERE m_sigla='SIS420' GROUP BY u_carnet ) AS tmp WHERE NotaFinal > 51
Tenemos una subconsulta de donde obtenemos la lista de notas de todos los alumnos de la asignatura de sis420, de esta subconsulta haciendo uso de la condición del problema (nota minima de aprobación > 51), obtenemos la lista de aprobados, es decir, con la 1ra consulta tenemos:
CU | Nombre | Nota1 | Nota2 | NotaFinal 009-332 Lali Cuadora 33 54 43.5 333-123 Al K. Huete 56 49 52.5 345-232 Aldo Lorido 89 44 66.5 555-349 Helen Chufe 77 77 77 555-667 Alejandro Gado 55 45 50 911-212 Federico Chino 34 54 44
y despues añadiendo la condicion Nota Final Aprobados > 51
CU | Nombre | Nota1 | Nota2 | NotaFinal 333-123 Al K. Huete 56 49 52.5 345-232 Aldo Lorido 89 44 66.5 555-349 Helen Chufe 77 77 77
Esta consulta podemos utilizarla directamente desde Java, sin embargo podemos hacer uso de Tablas Virtuales y llamar esta desde Java como cualquier otra tabla.
Creación de la Tabla Virtual.
Crearemos dos Vistas, ¿porqué dos?, porque estamos utilizando dos select para obtener el resultado, y una Vista no puede generarse haciendo uso de una tabla temporal, esto nos obliga a crear una vista para obtener la «lista de Notas de Alumnos de SIS420» y otra segunda vista que hara uso de la anterior vista para obtener la «Lista de Alumnos Aprobados», manos a la obra:
A la primera vista la llamaremos «notas_IA», el código para crear la vista es:
CREATE VIEW notas_IA AS SELECT u_carnet AS CU, u_nombre AS Nombre, examen1 AS Nota1 , examen2 AS Nota2, SUM(examen1+examen2)/2 AS NotaFinal FROM universitario INNER JOIN um on u_carnet=cu INNER JOIN materia ON sigla=m_sigla WHERE m_sigla='SIS420' GROUP BY u_carnet
La segunda vista se llamara: «aprobados__IA» y es:
CREATE VIEW aprobados_IA AS SELECT * FROM notas_IA WHERE NotaFinal > 51
Si te salio algún error en la creación de las tablas o de las Vistas, revisa el tuto desde el principio, eso es todo con SQL, ahora debemos hacer uso de esta Tabla Virtual desde java, esto no es nada del otro mundo, como ya dijimos una Vista no es más que una tabla virtual por tanto su utilización es igual a cualquier otra tabla, vamos programar en java
Java Netbeans
Crea un nuevo proyecto Java Netbeans (Nombre Proyecto: jcview) , y añade ademas del main que crea por defecto, añade una clase a la que llamaras «database.java», nuestra clase de conexion a MySQL, este proyecto no hara uso de una interfaz grafica ya que no es relevante para este tutorial, no te olvides de agregar la libreria de conexión «Driver MySQL JDBC mysql-connector», yo utilizo la versión 5.1.6, creo que es la ultima versión.
El codigo de la clase «database.java» es el siguiente:
package jcview; import java.sql.*; /** * @web https://www.jc-mouse.net/ * @author Mouse */ public class database { /* DATOS PARA LA CONEXION */ private String bd = "NOMBRE_BASE_DE_DATOS"; private String login = "USUARIO"; private String password = "PASSWORD_MYSQL"; private String url = "jdbc:mysql://localhost/"+bd; private Connection conn = null; //___________________________________________________________________________________ Soy una barra separadora :) public database(){ try{ //obtenemos el driver de para mysql Class.forName("com.mysql.jdbc.Driver"); //obtenemos la conexión conn = DriverManager.getConnection(url,login,password); if (conn!=null){ //System.out.println("OK base de datos "+bd+" listo"); } }catch(SQLException e){ System.out.println(e); }catch(ClassNotFoundException e){ System.out.println(e); } } //___________________________________________________________________________________ Soy una barra separadora :) /* METODO PARA REALIZAR UNA CONSULTA A LA BASE DE DATOS * INPUT: * table => nombre de la tabla donde se realizara la consulta, puede utilizarse tambien INNER JOIN * fields => String con los nombres de los campos a devolver Ej.: campo1,campo2campo_n * where => condicion para la consulta * OUTPUT: un object[][] con los datos resultantes, sino retorna NULL */ public Object [][] select(String table, String fields, String where){ int registros = 0; String colname[] = fields.split(","); //Consultas SQL String q ="SELECT " + fields + " FROM " + table; String q2 = "SELECT count(*) as total FROM " + table; if(where!=null) { q+= " WHERE " + where; q2+= " WHERE " + where; } //obtenemos la cantidad de registros existentes en la tabla try{ PreparedStatement pstm = conn.prepareStatement(q2); ResultSet res = pstm.executeQuery(); res.next(); registros = res.getInt("total"); res.close(); }catch(SQLException e){ System.out.println(e); } //se crea una matriz con tantas filas y columnas que necesite Object[][] data = new String[registros][fields.split(",").length]; //realizamos la consulta sql y llenamos los datos en la matriz "Object" try{ PreparedStatement pstm = conn.prepareStatement(q); ResultSet res = pstm.executeQuery(); int i = 0; while(res.next()){ for(int j=0; j<=fields.split(",").length-1;j++){ data[i][j] = res.getString( colname[j].trim() ); } i++; } res.close(); }catch(SQLException e){ System.out.println(e); } return data; } //___________________________________________________________________________________ Soy una barra separadora :) }
Esta clase nos permite conectarnos a MySQL, ademas cuenta un método para realizar una consulta. No te olvides rellenar tus datos de MySQL, usuario, password y nombre de la base de datos.
Implementamos esta clase en el main del proyecto de la siguiente forma:
package jcview; /** * @web https://www.jc-mouse.net/ * @author Mouse */ public class Main { static database db = new database(); static Object[][] data; public static void main(String[] args) { //se realiza la consulta a la VISTA como a cualquier otra tabla data = db.select("aprobados_ia", " CU, Nombre, Nota1, Nota2, NotaFinal ", null); System.out.println(" C.U. | Nombre | N1 | N2 | Nota Final "); if( data.length > 0) //Se imprimen los datos devueltos for(int i=0; i<data.length;i++) { System.out.println( data[i][0].toString() + " | " + data[i][1].toString() + " | " + data[i][2].toString() + " | " + data[i][3].toString() + " | " + data[i][4].toString() ); } else System.out.println("No existen datos"); } }
Como puede verse, se llama a la Tabla Virtual, como a cualquier otra tabla, y ademas la consulta que se utiliza es sencilla en comparación a la consulta compleja que se deberia haber implementado de no haber hecho uso de Vistas.
No queda mas que mostrar el resultado en pantalla.
Si deseas bajarte el proyecto completo, dale clic al siguiente enlace «Descargar» 🙂
FIN
Material Design introduce una nueva forma de mostrar notificaciones al usuario, estos son los snackbar, similares a los[...]
SQLite. SQLite es un sistema de gestión de bases de datos relacional compatible con ACID, contenida en una relativamente[...]
SQLite es un sistema de gestión de bases de datos relacional, escrita en C, si se desea hacer uso de encriptación con S[...]
En este tutorial crearemos el botón de Google+ Google Circles para una interfaz de escritorio 🙂 si no sabes lo que son e[...]
En este post construiremos un sencillo sistema Cliente/Servidor en lenguaje Java, el sistema consistirá básicamente en u[...]
En post anteriores vimos lo que son los parámetros IN y los parámetros OUT pero existe otro tipo de parámetro que es la[...]