Vistas en Mysql

Embed Size (px)

Citation preview

VISTAS EN MySQL.

La manera ms simple de crear una vista usando el MySQL Query Browser es con el uso del boton CREAR VISTA. Ejecute una consulta que represente la vista que desee crear. Una vez que la consulta es ejecutada, click en el botn CREAR VISTA, proporcione el nombre para la vista, y la vista es creada.

CREANDO UNA VISTASe emplea la sentencia CREATE VIEW, que incluye una subconsulta (subquery) para determinar los datos a ser mostrados a travs de la vista.

SINTAXIS:CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW [([, ] )]AS [WITH CHECK OPTION [CONSTRAINT ]][WITH READ ONLY [CONSTRAINT ]];Donde:OR REPLACE:Se utiliza por si la vista ya estuviera creada anteriormente. En ese caso, la sustituye por la nueva definicin.FORCE: Crea la vista sin comprobar si las tablas base existen.NO FORCE: Crea la vista slo si las tablas base de donde se extraen los datos existen realmente (es la opcin por defecto).

Es el nombre de la vista.

Especifica alias para las expresiones/columnas seleccionadas por lasubconsulta. El nmero de alias debe coincidir con el nmero deexpresiones seleccionadas por la vista.

Es una sentencia SELECT completa. Se pueden emplear alias paralas columnas en la lista que sigue al SELECT.

WITH CHECKOPTION Especifica que solo las filas accesibles para la vista pueden ser insertadas o modificadas. Nombre asignado a la restriccin CHECK OPTION o a la restriccinREAD ONLY.

WITH READONLY Asegura que no podrn ejecutarse operaciones de DML a travs de la vista. La vista slo permite consultas.

Ejemplo:Crear una vista que contiene los apellidos y nombre de los empleados del departamento Ventas. Asegurarse que a travs de ella slo pueden modificarse, eliminarse o aadirse los empleados de dicho departamento.

CREATE VIEW EmpDepVentasAS SELECT apellidos, nombreFROM EmpleadosWHERE dep=VentasWITH CHECK OPTION;

VISUALIZAR LA ESTRUCTURA DE UNA VISTA:DESCRIBE ;donde: Es el nombre de la vista.Listar las vistas existentes: SELECT * FROM USER_VIEWS;

MODIFICANDO LA DEFINICIN DE UNA VISTAPara modificar la definicin de una vista, basta con ejecutar una nueva sentencia CREATE VIEW que incluya la opcin OR REPLACE y la subconsulta modificada.

Ejemplo:Cambiar la vista EmpDepVentas creada en el apartado 3 para que incluya tambin el salarioCREATE OR REPLACE VIEW EmpDepVentasAS SELECT apellidos, nombre, salarioFROM EmpleadosWHERE dep=VentasWITH CHECK OPTION;ELIMINANDO UNA VISTACuando ya no se va a emplear ms, una vista puede ser eliminada del esquema de la base de datos mediante la siguiente orden:

DROP VIEW ;donde: Es el nombre de la vista.Ejemplo:

DROP VIEW EmpDepVentas;Restricciones de uso: Solo el creador o un usuario con el privilegio DROP ANY VIEW puede eliminar una vista.

COMANDOS DE MySQL

Hay un conjunto de comandos quemysqlinterpreta por s mismo. Para obtener una lista de estos comandos, se escribehelpo\hen el promptmysql>:

mysql> helpMySQL commands:? (\h) Synonym for `help'.ComandoFuncion

clear (\c)Clear command.

connect (\r)Reconnect to the server.

delimiter (\d)Set query delimiter.

edit (\e)Edit command with $EDITOR.

ego (\G)Send command to mysql server, display result vertically.

exit (\q)Exit mysql. Same as quit.

go (\g)Send command to mysql server.

help (\h)Display this help.

nopager (\n)Disable pager, print to stdout.

notee (\t)Don't write into outfile.

pager (\P)Set PAGER [to_pager].Print the query results via PAGER.

print (\p)Print current command.

prompt (\R)Change your mysql prompt.

quit (\q)Quit mysql.

rehash (\#)Rebuild completion hash.

source (\.)Execute an SQL script file. Takes a file name as an argument.

status (\s)Get status information from the server.

use (\u)Use another database.

Algunos comandos tiles para ejecutar en MySQL, estos comandos pueden ser ejecutados desde el shell del sistema operativo ($) y/o desde el shell de MySQL (mysql>). Por una cuestin de orden, los comandos sern clasificados en:

Descripcin del sistema, bases de datos y tablas:

mysql> show databases;

mysql> show tables;

mysql> show columns fromnombre_de_tabla;

mysql> show variables;

mysql> show grants forusuario@host;

mysql> show columns frombase_de_datos.nombre_de_tabla;

mysql> show privileges;

mysql> show character set;

mysql> describenombre_de_tabla

Definicin de datos:

mysql> drop databasenombre_de_base_de_datos;

mysql> drop tablenombre_de_tabla;

mysql> alter tablenombre_de_tabladrop columnnombre_de_columna;

mysql> alter tablenombre_de_tablaadd columnnombre_de_columnatipo_de_dato;

mysql> alter tablenombre_de_tablachangenombre_de_columna_original nombre_de_columna_nuevotipo_de_dato;

mysql> alter tablenombre_de_tablaadd unique (nombre_de_columna);

mysql> alter tablenombre_de_tablamodifynombre_de_columna tipo_de_dato;

Administracin:

$ mysqladmin -u root -hhost-p password nuevo_password

$ mysqladmin extended-status

$ mysqladmin status

$ mysqladmin variables

$ mysqladmin version

$ mysqladmin createbase_de_datos

$ mysqladmin dropbase_de_datos

$ mysqladmin flush-privileges

$ mysqladmin ping

$ mysqladmin reload

$ mysqladmin killid_proceso, id_proceso

$ mysqladmin shutdown

Backups e importacin de datos

$ mysqlbase_de_datosbackup.sql

$ mysqldump no-database_de_datos[tablas] >backup.sql

$ mysqldump add-drop-tablebase_de_datos[tablas] >backup.sql

$ mysqldump compatible=mysql40base_de_datos[tablas] >backup.sql

mysql> LOAD DATA INFILE /tmp/archivo.csv REPLACE INTO TABLE [nombre_de_tabla] FIELDS TERMINATED BY , LINES TERMINATED BY \n (campo1,campo2,)

MANEJO DE BASES DE DATOS MYSQL:

drop table [table]; Elimina la tabla, incluyendo registros y estructura.

drop table if exists [table]; Elimina la tabla de la base de datos, pero antes verifica que exista.

truncate table [table]; Elimina los registros, pero mantiene la esrtuctura de la tabla.

rename table [table] to [nuevo nombre de tabla]; Renombra una tabla de la base de datos.

ALGUNOS COMANDOS UTILES PARA CUNSULTAS MYSQL: select * from [table] limit [numero]; Muestra los registros desde el 1 hasta [numero].Ej. select * from tabla limit 10; Muestra los 10 primeros registros.select * from [table] limit [numero inicio],[numero]; Muestra los registros desde el numero de inicio hasta numero inicio + numero.Ej. select * from tabla limit 11,10; Muestra desde registro 11 hasta el 20.

BASES DE DATOS MYSQL EN CONSOLA:

$ mysqladmin -u -p create crear base de datos.

$ mysqladmin -u -p drop borrar la base de datos.

$ mysqladmin -u root -p proc listar procesos en ejecucion en el servidor de bases de datos Mysql.

$ mysqladmin -u root -p -i 5 status verificar status cada 5 segundos.

$ mysqldump opt -u -h -p > /path/to/file Exportar base de datos a un archivo.

$ mysqldump opt -u -h all-databases -p > /path/to/file Exportar TODAS las bases de datos a un archivo.

$ mysql -h -u -p < /path/to/file Importar un archivo a la base de datos a mysql

$ mysqlcheck -o -u root -p all-databases Optimizar las bases de datos mysql.

VERIFICACION Y REPARACION DE BASES DE DATOS ERRONEAS:check table [table]; Verificar la tabla.repair table [table]; Reparar la tabla

Vistas (views) en MySQLUnavistaes un objecto de la base de datos que se define mediante unaSELECTque agrupa o selecciona un conjunto de datos. Vamos a ver como usarlas.Vamos a suponer la tablavalias:mysql> desc valias;+-------------+----------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------------+----------+------+-----+---------+-------+| alias | char(32) | NO | MUL | NULL | || domain | char(64) | NO | | NULL | || valias_line | text | NO | | NULL | |+-------------+----------+------+-----+---------+-------+3 rows in set (0.01 sec)En esta tabla podemos consultar los alias de correo para todos los dominios del servidor. Para poder dar acceso a un usuario que solo tenga acceso a sus dominios lo podemos hacer mediantevistas. Por ejemplo, podemos crear unavistapara un determinado dominio mediante la siguiente vista:mysql> create view valias_systemadmin_es as select alias, valias_line from valias where domain="systemadmin.es";Query OK, 0 rows affected (0.04 sec)A continuacin mediante la vista podremos acceder solo a los datos que lavistaselecciona:mysql> select * from valias_systemadmin_es;+---------------+-----------------------------+| alias | valias_line |+---------------+-----------------------------+| helpdesk | &[email protected] |(...)Una de las confusiones ms comunes entre los programadores es suponer un aumento del rendimiento por usarvistas. Vamos a ver como funcionan realmente.Mediante la palabra clave ALGORITHM podemos indicar como deseamos que funcione: UNDEFINED: Dejamos que sea MySQL quien decida el algoritmo por si mismo, es el caso por defecto. MERGE: Se refiere a que junte la query que se hace sobre lavistacon la query de la vista y se ejecute la query resultante. De esta manera vemos como la query que se ejecuta sobre una vista estan complicada como la suma de las dos queries. Esto lo tenemos que tener muy en cuenta, ya que estamosocultandola query que realmente ejecuta MySQL. Un ejemplo sera: mysql> create ALGORITHM=MERGE view valias_systemadmin_es as select alias, valias_line from valias where domain="systemadmin.es"; Query OK, 0 rows affected (0.00 sec)ElEXPLAINresultante sera:mysql> explain select * from valias_systemadmin_es;+----+-------------+--------+------+---------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+--------+------+---------------+------+---------+------+------+-------------+| 1 | SIMPLE | valias | ALL | NULL | NULL | NULL | NULL | 27 | Using where |+----+-------------+--------+------+---------------+------+---------+------+------+-------------+1 row in set (0.03 sec) TEMPTABLE: En el momento de hacer una consulta sobre la vista se crea una tabla temporal. Un ejemplo sera: mysql> create ALGORITHM=TEMPTABLE view valias_systemadmin_es as select alias, valias_line from valias where domain="systemadmin.es"; Query OK, 0 rows affected (0.00 sec)Con su correspondienteEXPLAIN:mysql> explain select * from valias_systemadmin_es;+----+-------------+------------+------+---------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+------------+------+---------------+------+---------+------+------+-------------+| 1 | PRIMARY | | ALL | NULL | NULL | NULL | NULL | 15 | || 2 | DERIVED | valias | ALL | NULL | NULL | NULL | NULL | 27 | Using where |+----+-------------+------------+------+---------------+------+---------+------+------+-------------+2 rows in set (0.00 sec)El caso deTEMPTABLEtiene una gran ventaja y una gran desventaja: Desventaja: La vistano es actualizable, por lo que cualquier cambio se deber hacer en la tabla original. Ventaja: Los bloqueos se liberan antes, ya que la consulta de la vista se hace a partir de latabla temporal. Esto permite que otrosthreadsaccedan antes a la tabla que ejecutando una consulta mucho mas pesada usando el algoritmoMERGE.El concepto devistas materializadas no existe en MySQL, a diferencia deOracle. Al usar vistas materializadas si que podramos obtener un mayor rendimiento, pero en ningn de los dos algoritmos deMySQLobtenemos tal beneficio al tener que recurrir a crear el subconjunto de datos de la vista por cada peticin.

Una vista es una tabla virtual cuyo contenido est definido por unaconsulta..

Una vista es sencillamente un objeto de base de datos que presenta datos de tablas. Se trata de una consulta SQL que est permanentemente almacenada en la Base de datos y a la que se le asigna un nombre, de modo que los resultados de la consulta almacenada son visibles atravs de la vista, y SQL permite acceder a estos resultados como si fueran de hecho una tabla real en la base de datos.

Las tablas y las vistas comparten el mismo espacio de nombres en la base de datos, por lo tanto, una base de datos no puede contener una tabla y una vista con el mismo nombre.

Las vistas suelen utilizarse para centrar, simplificar y personalizar la percepcin de la base de datos para cada usuario. Las vistas pueden emplearse como mecanismos de seguridad, que permiten a los usuarios obtener acceso a los datos por medio de la vista, pero no les conceden el permiso de obtener acceso directo a las tablas subyacentes de la vista. Las vistas se pueden utilizar para realizar particiones de datos y para mejorar el rendimiendo cuando se copian, se importan y se exportan datos.

Mediante vistas es posible presentar datos de distintos servidores. Por ejemplo, para combinar datos de distintos servidores remotos o en un servidor de multiples procesadores, cada uno de los cuales almacenan datos para una regin distinta de su organizacin, puede crear consultas distribuidas o paralelas aumentando la eficiencia de las consultas.

Mediante diversas clusulas es factiblecrear,modificadar,eliminaryadministrarvistas. La sintaxis bsica para estas clusulas es generica entre diversos gestores de base de datos. Sin embargo en lo particular cada gestor implementa la administracin de estas de forma diferente. En este documentos se presenta la sintaxis particular dee Oracle 10g, comparando en forma generica con MySQL 5.

La sintaxis bsica de una vista (Oracle y MySQL) es:

CREATE VIEWnombre_vistaASconsulta;

SintaxisCREATE VIEW

CREATE [OR REPLACE] VIEW nombre_vista AS sentencia_select [WITH [CASCADED | LOCAL] CHECK OPTION] WITH READ ONLY

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW nombre_vista [(columnas)] AS sentencia_select [WITH [CASCADED | LOCAL] CHECK OPTION]

Ejemplo: Paises del continente Americano

CREATE OR REPLACE VIEW america ASSELECT P.nombre, P.capitalFROM continente C, pais PWHERE (C.nombreContinente = 'Amrica') AND (C.idContinente = P.idContinente)DescargarEjecutar

Ejemplo: En el futbol se conoce como Caballo de Hierro a los deportistas que jugaron los 90 minutos en todos los partidos de un campeonato. Y Considerando que en el torneo de Apertura 2011 se disputaron 17 fechas en la fase regular. La vista que define a estos futbolistas es la siguiente.

CREATE OR REPLACE VIEW caballoDeHierro ASSELECT e.nombreEquipo, j.nombre, j.JJ FROM equipo e, jugadores jWHERE e.idEquipo = j.idEquipo AND j.JJ >= 17 AND minutos >= (j.JJ * 90) AND (j.JJ % 2 != 0)ORDER BY j.minutos DESC, j.nombre;

Ahora solo tenemos que hacer una consulta para obtener la vista correspondiente.

SELECT * FROM caballoDeHierro;Ejecutar

Ejemplo. El cual modificara la vista caballo de hierro con los jugadores que no recibieron amonestaciones.

CREATE OR REPLACE VIEW caballoDeHierro ASSELECT nombrePosicion, e.nombreEquipo equipo, j.nombre, j.JJ,j.ta FROM equipo e, jugador j, posicion pWHERE e.idEquipo = j.idEquipoAND p.idPosicion = j.idPosicion AND j.JJ >= 17 AND minutos >= (j.JJ * 90) AND (j.JJ % 2 != 0) AND (j.ta = 0 )ORDER BY nombre;

SELECT * FROM caballoDeHierro;Ejecutar

Actualizacin de vistas

Algunas vistas pueden actualizarse mediante sentenciasINSERT, DELETEoUPDATEsobre ellas, considerando las siguientes reglas: No se debe especificarDISTINCTpara que las filas duplicadas no se eliminen de los resultados de las consultas. La clusulaFROMdebe especificar slo una tabla actualizable. Cada elemento de seleccin debe ser una referencia de columna simple ( no puede contener expresiones, columnas calculadas, ni funciones de columna). La clusulaWHEREno debe incluir una subconsulta. La consulta no debe incluir una clusulaGROUP BYoHAVING. La consulta no debe incluir sentencias:UNION,UNION ALL,INTERSECT,MINUS Si una columnaNOT NULLno contiene unDEFAULT, no es posible insertar mediante vistas

Para que la vista sea de solo lectura, usaremos la clusulaWITH READ ONLY(Oracle). Observe que esta opcin no soporta la clsulaORDER BY

La clusulaCHECK OPTIONevita que sean insertados o modificados registro que no sean posteriormente incluidos en la vista mediante la sentenciaWHERE.

Ejemplo: Poblacin por entidad federativa 2010 INEGI (INSTITUTO NACIONAL DE ESTADISTICA, GEOGRAFIA E INFORMATICA). El ejemplo siguiente crea una vista que usa la clusulaCHECK OPTIONdonde seleccionan aquellas entidades federativas que tienen menos de 2 millones de habitantes.

?1234CREATE TABLE entidad (estado CHAR(30) NOT NULL,poblacion NUMBER NOT NULL);

?1234CREATE TABLE entidad (estado CHAR(30) NOT NULL,poblacion INTEGER NOT NULL) ENGINE = InnoDB;

?1234567891011121314151617INSERT INTO entidad values ('Estado de Mxico', 15175862);INSERT INTO entidad values ('Distrito Federal', 8851080);INSERT INTO entidad values ('Veracruz', 7643194);INSERT INTO entidad values ('Jalisco', 7350682);INSERT INTO entidad values ('Puebla', 5779829);INSERT INTO entidad values ('Guanajuato', 5486372);INSERT INTO entidad values ('Chiapas', 4796580);INSERT INTO entidad values ('Nuevo Len', 4653458);INSERT INTO entidad values ('Michoacn de Ocampo',4351037);INSERT INTO entidad values ('Oaxaca', 3801962);INSERT INTO entidad values ('Chihuahua', 3406465);INSERT INTO entidad values ('Guerrero', 3388768);CREATE OR REPLACE VIEW entidades ASSELECT * FROM entidadWHERE poblacion < 2000000WITH CHECK OPTION;

Ahora considere la siguiente informacin. Para insertarla en la vista recien creada.

EntidadPoblacin

Tamaulipas3,268,554

Baja California3,155,070

Sinaloa2,767,761

Coahuila de Zaragoza2,748,391

Hidalgo2,665,018

Sonora2,662,480

San Luis Potos2,585,518

Tabasco2,238,603

Yucatn1,955,577

Quertaro1,827,937

Morelos1,777,227

Durango1,632,934

Zacatecas1,490,668

Quintana Roo1,325,578

Aguascalientes1,213,445

Tlaxcala1,169,936

Nayarit1,084,979

Campeche822,441

Colima650,555

Baja California Sur637,026

Con la clusulaCHECK OPTIONcada vez que se trata de hacer una violacin de la condicin dentro delWHEREobtendremos un errorORA-01402. Que error le regresa MySQL

Borrado de vistas con DROP VIEW

La sentenciaDROP VIEWpermite borrar una vista de la base de datos. Su sintaxis se presenta a continuacin:

DROP VIEW [usuario.] nombre_vista [CASCADE CONSTRAINTS];

DROP VIEW [IF EXISTS] nombre_vista;