Вы находитесь на странице: 1из 13

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 VISTA
Se 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 <vista>
[(<alias>[, <alias>] )]
AS <subconsulta>
[WITH CHECK OPTION [CONSTRAINT <restriccin>]]
[WITH READ ONLY [CONSTRAINT <restriccin>]];
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).

<vista> Es el nombre de la vista.

<alias> Especifica alias para las expresiones/columnas seleccionadas por la
subconsulta. El nmero de alias debe coincidir con el nmero de
expresiones seleccionadas por la vista.

<subconsulta> Es una sentencia SELECT completa. Se pueden emplear alias para
las columnas en la lista que sigue al SELECT.

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

WITH READ
ONLY 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 EmpDepVentas
AS SELECT apellidos, nombre
FROM Empleados
WHERE dep=Ventas
WITH CHECK OPTION;

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

MODIFICANDO LA DEFINICIN DE UNA VISTA
Para 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
salario
CREATE OR REPLACE VIEW EmpDepVentas
AS SELECT apellidos, nombre, salario
FROM Empleados
WHERE dep=Ventas
WITH CHECK OPTION;
ELIMINANDO UNA VISTA
Cuando 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 <vista>;
donde: <vista> 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 que mysql interpreta por s mismo. Para obtener una
lista de estos comandos, se escribe help o \h en el prompt mysql>:

mysql> help
MySQL commands:
? (\h) Synonym for `help'.
Comando Funcion
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 from nombre_de_tabla;
mysql> show variables;
mysql> show grants for usuario@host;
mysql> show columns from base_de_datos.nombre_de_tabla;
mysql> show privileges;
mysql> show character set;
mysql> describe nombre_de_tabla

Definicin de datos:

mysql> drop database nombre_de_base_de_datos;
mysql> drop table nombre_de_tabla;
mysql> alter table nombre_de_tabla drop column nombre_de_columna;
mysql> alter table nombre_de_tabla add column nombre_de_columna tipo_de_dato;
mysql> alter table nombre_de_tabla change nombre_de_columna_original
nombre_de_columna_nuevo tipo_de_dato;
mysql> alter table nombre_de_tabla add unique (nombre_de_columna);
mysql> alter table nombre_de_tabla modify nombre_de_columna tipo_de_dato;

Administracin:

$ mysqladmin -u root -h host -p password nuevo_password
$ mysqladmin extended-status
$ mysqladmin status
$ mysqladmin variables
$ mysqladmin version
$ mysqladmin create base_de_datos
$ mysqladmin drop base_de_datos
$ mysqladmin flush-privileges
$ mysqladmin ping
$ mysqladmin reload
$ mysqladmin kill id_proceso, id_proceso
$ mysqladmin shutdown
Backups e importacin de datos
$ mysql base_de_datos< backup.sql
$ mysqldump base_de_datos [tablas] > backup.sql
$ mysqldump no-data base_de_datos [tablas] > backup.sql
$ mysqldump add-drop-table base_de_datos [tablas] > backup.sql
$ mysqldump compatible=mysql40 base_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 MySQL
Una vista es un objecto de la base de datos que se define mediante una SELECTque
agrupa o selecciona un conjunto de datos. Vamos a ver como usarlas.
Vamos a suponer la tabla valias:
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 mediante vistas. Por ejemplo, podemos crear una vista para 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
la vistaselecciona:
mysql> select * from valias_systemadmin_es;
+---------------+-----------------------------+
| alias | valias_line |
+---------------+-----------------------------+
| helpdesk | &diwit@systemadmin.es |
(...)
Una de las confusiones ms comunes entre los programadores es suponer un aumento del
rendimiento por usar vistas. 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 la vista con la query de la
vista y se ejecute la query resultante. De esta manera vemos como la query que se
ejecuta sobre una vista es tan complicada como la suma de las dos queries. Esto lo
tenemos que tener muy en cuenta, ya que estamosocultando la 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)
El EXPLAIN resultante 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 correspondiente EXPLAIN:
mysql> explain select * from valias_systemadmin_es;
+----+-------------+------------+------+---------------+------+------
---+------+------+-------------+
| id | select_type | table | type | possible_keys | key |
key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+------+------
---+------+------+-------------+
| 1 | PRIMARY | <derived2> | 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 de TEMPTABLE tiene una gran ventaja y una gran desventaja:
o Desventaja: La vista no es actualizable, por lo que cualquier cambio se deber hacer
en la tabla original.
o Ventaja: Los bloqueos se liberan antes, ya que la consulta de la vista se hace a partir
de la tabla temporal. Esto permite que otros threads accedan antes a la tabla que
ejecutando una consulta mucho mas pesada usando el algoritmo MERGE.
El concepto de vistas materializadas no existe en MySQL, a diferencia de Oracle.
Al usar vistas materializadas si que podramos obtener un mayor rendimiento, pero en
ningn de los dos algoritmos de MySQL obtenemos 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 una consulta..


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
factible crear, modificadar, eliminar y administrar vistas. 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 VIEW nombre_vista AS consulta;


Sintaxis CREATE 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 AS
SELECT P.nombre, P.capital
FROM continente C, pais P
WHERE (C.nombreContinente = 'Amrica')
AND (C.idContinente = P.idContinente)
Descargar
Ejecutar




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 AS
SELECT e.nombreEquipo, j.nombre, j.JJ
FROM equipo e, jugadores j
WHERE 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 AS
SELECT nombrePosicion, e.nombreEquipo equipo, j.nombre,
j.JJ,j.ta
FROM equipo e, jugador j, posicion p
WHERE e.idEquipo = j.idEquipo
AND 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 sentencias INSERT,
DELETE o UPDATE sobre ellas, considerando las siguientes reglas:
No se debe especificar DISTINCT para que las filas duplicadas no se
eliminen de los resultados de las consultas.
La clusula FROM debe 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 clusula WHERE no debe incluir una subconsulta.
La consulta no debe incluir una clusula GROUP BY o HAVING.
La consulta no debe incluir sentencias: UNION, UNION
ALL, INTERSECT, MINUS
Si una columna NOT NULL no contiene un DEFAULT, no es posible
insertar mediante vistas


Para que la vista sea de solo lectura, usaremos la clusula WITH READ
ONLY (Oracle). Observe que esta opcin no soporta la clsula ORDER BY


La clusula CHECK OPTION evita que sean insertados o modificados
registro que no sean posteriormente incluidos en la vista mediante la
sentencia WHERE.


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

?
1
2
3
4
CREATE TABLE entidad (
estado CHAR(30) NOT NULL,
poblacion NUMBER NOT NULL
);

?
1
2
3
4
CREATE TABLE entidad (
estado CHAR(30) NOT NULL,
poblacion INTEGER NOT NULL
) ENGINE = InnoDB;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
INSERT 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 AS
SELECT * FROM entidad
WHERE poblacion < 2000000
WITH CHECK OPTION;
17




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

Entidad Poblacin
Tamaulipas 3,268,554
Baja California 3,155,070
Sinaloa 2,767,761
Coahuila de Zaragoza 2,748,391
Hidalgo 2,665,018
Sonora 2,662,480
San Luis Potos 2,585,518
Tabasco 2,238,603
Yucatn 1,955,577
Quertaro 1,827,937
Morelos 1,777,227
Durango 1,632,934
Zacatecas 1,490,668
Quintana Roo 1,325,578
Aguascalientes 1,213,445
Tlaxcala 1,169,936
Nayarit 1,084,979
Campeche 822,441
Colima 650,555
Baja California Sur 637,026



Con la clusula CHECK OPTION cada vez que se trata de hacer una violacin
de la condicin dentro del WHERE obtendremos un error ORA-01402. Que
error le regresa MySQL



Borrado de vistas con DROP VIEW


La sentencia DROP VIEW permite 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;