MYSQL TEMA 12: - UPDATE TABLE SQL UPDATE - · PDF fileMYSQL TEMA 12: - UPDATE TABLE SQL UPDATE...
Click here to load reader
Transcript of MYSQL TEMA 12: - UPDATE TABLE SQL UPDATE - · PDF fileMYSQL TEMA 12: - UPDATE TABLE SQL UPDATE...
MYSQL TEMA 12: - UPDATE TABLE
SQL UPDATE
Es uno de los procesos mas comunes con tablas en bases de datos, se le conoce como
actualizacion, edicion o modificacion de los datos o registros o renglones contenidos en
la tabla.
Por ejemplo al inicio o arranque de un sisMYSQL TEMA de informacion construido
alrederor de una base de datos, es comun que la primera carga de datos contenga mucha
informacion erronea y se ocupa mecanismos o instrucciones en SQL para corregir o
editar esta informacion.
UPDATE es la instruccion SQL especializada en esta area de procesos comunes con
tablas, su formato es:
UPDATE nombretabla SET nomcolumna=expresion WHERE condicion ;
La instruccion update actualiza o modifica los renglones de una tabla, SET le indica a
MYSQL cuales son las columnas a modificar y WHERE se usa para seleccionar un
renglon determinado o un conjunto de renglones, los casos mas comunes son:
1.- Actualizar una columna o varias columnas a todos los renglones de la tabla ejemplo:
UPDATE peliculas SET preciopelicula = 150.00;
Corrida:
2.- Recordar que tambien se pueden usar expresiones algebraicas ejemplo:
UPDATE peliculas SET preciopelicula = 19.99 * 11.28 ;
Corrida:
13.2.7. Sintaxis de SELECT
13.2.7.1. Sintaxis de JOIN
13.2.7.2. Sintaxis de UNION
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr, ...
[INTO OUTFILE 'file_name' export_options
| INTO DUMPFILE 'file_name']
[FROM table_references
[WHERE where_definition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_definition]
[ORDER BY {col_name | expr | position}
[ASC | DESC] , ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[FOR UPDATE | LOCK IN SHARE MODE]]
SELECT se usa para recibir registros seleccionados desde una o más tablas. MySQL
5.0 incluye soporte para comandos UNION y subconsultas. Consulte Sección 13.2.7.2,
“Sintaxis de UNION” y Sección 13.2.8, “Sintaxis de subconsultas”.
Cada select_expr indicata una columna que quiere recibir.
table_references indicata la tabla o tablas desde la que recibir registros.
Su sintaxis se describe en Sección 13.2.7.1, “Sintaxis de JOIN”.
where_definition consiste en la palabra clave WHERE seguida por una
expresión que indica la condición o condiciones que deben satisfacer los registros para ser seleccionados.
SELECT también puede usarse para recuperar registros computados sin referencia a
ninguna tabla.
Por ejemplo:
mysql> SELECT 1 + 1;
-> 2
Todas las cláusulas usadas deben darse exactamente en el orden mostrado en la
descripción de la sintaxis. Por ejemplo, una cláusula HAVING debe ir tras cualquier
cláusula GROUP BY y antes de cualquier cláusula ORDER BY .
Una select_expr puede tener un alias usando AS alias_name. El alias
se usa como el nombre de columna de la expresión y puede usarse en cláusulas GROUP BY, ORDER BY, o HAVING . Por ejemplo:
mysql> SELECT CONCAT(last_name,', ',first_name) AS
full_name
-> FROM mytable ORDER BY full_name;
La palabra clave AS es opcional cuando se usa un alias para select_expr.
El ejemplo precedente podría haberse escrito como:
mysql> SELECT CONCAT(last_name,', ',first_name) full_name
-> FROM mytable ORDER BY full_name;
Como AS es opcional, puede ocurrir un sutil problema si olvida la coma entre
dos expresiones select_expr : MySQL interpreta el segundo como un
nombre de alias. Por ejemplo, en el siguiente comando, columnb se tata como
un nombre de alias:
mysql> SELECT columna columnb FROM mytable;
Por esta razón, es una buena práctica poner los alias de columnas usando AS.
No se permite usar un alias de columna en una cláusula WHERE, ya que el valor
de columna puede no estar determinado cuando se ejecuta la cláusula WHERE .
Consulte Sección A.5.4, “Problemas con alias de columnas”. La cláusula FROM table_references indica la tabla desde la que recibir
registros. Si nombra más de una tabla, está realizando un join, Para información sobre la sintaxis de join, consulte Sección 13.2.7.1, “Sintaxis de JOIN”. Para cada tabla especificada, puede opcionalmente especificar un
alias. tbl_name [[AS] alias]
[[USE INDEX (key_list)]
| [IGNORE INDEX (key_list)]
| [FORCE INDEX (key_list)]]
El uso de USE INDEX, IGNORE INDEX, FORCE INDEX para dar al
optimizador pistas acerca de cómo escoger los indices se describe en
Sección 13.2.7.1, “Sintaxis de JOIN”.
En MySQL 5.0, puede usar SET max_seeks_for_key=value como
alternativa para forzar a MySQL a que realice escaneos de claves en lugar de
escaneos de tabla.
Puede referirse a una tabla dentro de la base de datos actual como tbl_name
(dentro de la base de datos actual) , o como db_name.tbl_name para
referirse a una base de datos explícitamente. Puede referirse a una columna
como col_name, tbl_name.col_name, o
db_name.tbl_name.col_name. No necesita especificar un prefijo
tbl_name o db_name.tbl_name para una referencia de columna a no ser
que la referencia fuese ambígua. Consulte Sección 9.2, “Nombres de bases de datos, tablas, índices, columnas y alias” para ejemplos de ambigüedad que requieran las formas de referencia de columna más explícitas.
En MySQL 5.0, puede especificar DUAL como nombre de tabla falso en
siguaciones donde no se referencian tablas: mysql> SELECT 1 + 1 FROM DUAL;
-> 2
DUAL es una característica puramente de compatibilidad. Otros servidores
requieren esta sintaxis.
Una referencia de tabla puede tener un alias usando tbl_name AS
alias_name o tbl_name alias_name:
mysql> SELECT t1.name, t2.salary FROM employee AS t1, info
AS t2
-> WHERE t1.name = t2.name;
mysql> SELECT t1.name, t2.salary FROM employee t1, info t2
-> WHERE t1.name = t2.name;
En la cláusula WHERE , puede usar cualquiera de las funciones que soporta
MySQL, escepto para funciones agregadas (resumen). Consulte Capítulo 12, Funciones y operadores.
Las columnas seleccionadas para la salida pueden ser referidas en cláusulas ORDER BY y GROUP BY usando nombres de columnas, alias, o posiciones.
Las posiciones de columnas son enteros y comienzan con 1: mysql> SELECT college, region, seed FROM tournament
-> ORDER BY region, seed;
mysql> SELECT college, region AS r, seed AS s FROM
tournament
-> ORDER BY r, s;
mysql> SELECT college, region, seed FROM tournament
-> ORDER BY 2, 3;
Para ordenar en orden inverso, añada la palabra clave DESC (descendiente) al
nombre de la columna en la cláusula ORDER BY por la que está ordenando.
Por defecto es orden ascendente; puede especificarse explícitamente usando
la palabra clave ASC.
El uso de posiciones de columna está obsoleto ya que la sintaxis se ha
eliminado del estándar SQL.
Si usa GROUP BY, los registros de salida se ordenan según las columnas
GROUP BY como si tuviera un ORDER BY para las mismas columnas. MySQL
5.0 extiende la cláusula GROUP BY para que pueda especificar ASC y DESC
tras las columnas nombradas en la cláusula: SELECT a, COUNT(b) FROM test_table GROUP BY a DESC
MySQL extiende el uso de GROUP BY para permitir seleccionar campos que no
se mencionan en la cláusula GROUP BY . Si no obtiene los resultados que
espera de la consulta, por favor lea la descripción de GROUP BY en
Sección 12.10, “Funciones y modificadores para cláusulas GROUP BY”.
En MySQL 5.0, GROUP BY permite un modificador WITH ROLLUP . Consulte
Sección 12.10.2, “Modificadores de GROUP BY”.
La cláusula HAVING se aplica casi al final, justo antes de que los elementos se
envíen al cliente, sin optimización. (LIMIT se aplica tras HAVING.)
Antes de MySQL 5.0.2, una cláusula HAVING podía referirse a cualquier
columna o alias nombrado en una select_expr en la lista SELECT o en
subconsultas externas, y para funciones agregadas. Sin embargo, el estándar
SQL requiere que HAVING debe referirse sólo a columnas en la cláusula
GROUP BY o columnas usadas en funciones agregadas. Para acomodar
ambos estándars SQL y el comportamiento específico de MySQL en que es
capaz de referirse a columnas en la lista SELECT , MySQL 5.0.2 y posteior
permite a HAVING referirse a columnas en la lista SELECT , en la cláusula
GROUP BY , en subconsultas externas y en funciones agregadas.
Por ejemplo, el siguiente comando funciona en MySQL 5.0.2 pero produce un
error en versiones aneriores:
mysql> SELECT COUNT(*) FROM t GROUP BY col1 HAVING col1 =
2;
Si la cláusula HAVING se refiere a una columna ambígua, se muestra una
advertencia. En el siguiente comando, col2 es ambíguo porque se usa tanto
para un alias como para un nombre de columna:
mysql> SELECT COUNT(col1) AS col2 FROM t GROUP BY col2
HAVING col2 = 2;
Se da preferencia al comportamiento SQL estándar, así que si un nombre de
columna HAVING se usa en un GROUP BY y como alias de columna en la lista
de columnas de salida, se da preferencia a la columna en GROUP BY .
No use HAVING para elementos que deban estar en la cláusula WHERE . Por
ejemplo, no escriba lo siguiente: mysql> SELECT col_name FROM tbl_name HAVING col_name > 0;
Escriba esto en su lugar:
mysql> SELECT col_name FROM tbl_name WHERE col_name > 0;
La cláusula HAVING puede referirse a funciones de agregación, algo que no
puede hacer la cláusula WHERE:
mysql> SELECT user, MAX(salary) FROM users
-> GROUP BY user HAVING MAX(salary)>10;
(Esto no funciona en versiones antiguas de MySQL.)
La cláusula LIMIT puede usarse para restringir el número de registros
retornados por el comando SELECT. LIMIT tiene uno o dos argumentos
numéricos, que deben ser enteros positivos (incluyendo cero).
Con dos argumentos, el primer argumento especifica el desplazamiento del
primer registro a retornar. El desplazamiento del registro inicial es 0 (no 1):
mysql> SELECT * FROM table LIMIT 5,10; # Retrieve rows 6-
15
Por compatibilidad con PostgreSQL, MySQL también soporta la sintaxis LIMIT
row_count OFFSET offset.
Para recibir todos los registros de un desplazamiento hasta el final del conjunto
de resultados, puede usar algún número grande para el segundo parámetro.
Ete comando recibe todos los registros desde el 96th hasta el último:
mysql> SELECT * FROM table LIMIT 95,18446744073709551615;
Con un argumento, el valor especifica el número de registros a retornar desde
el comienzo del conjunto de resultados:
mysql> SELECT * FROM table LIMIT 5; # Retrieve first 5
rows
En otras palabras, LIMIT n es equivalente a LIMIT 0,n.
La forma SELECT ... INTO OUTFILE 'file_name' de SELECT escribe
los registros seleccionados en un fichero. El fichero se crea en el equipo servidor, así que debe tener el permiso FILE para usar esta sintaxis. El fichero
no puede existir, que entre otras cosas evita destruir ficheros cruciales tales
como /etc/passwd y tablas de la base de datos.
El comando SELECT ... INTO OUTFILE existe principalmente para dejarle
volcar una tabla rápidamente en la máquina servidor. Si quiere crear el fichero
resultante en un equipo cliente distinto al equipo servidor, no puede usar
SELECT ... INTO OUTFILE. En tal caso, debería usar algún comando
como mysql -e "SELECT ..." > file_name en el equipo cliente para
generar el fichero.
SELECT ... INTO OUTFILE es el complemento de LOAD DATA INFILE;
la sintaxis para la parte export_options del comando consiste en las
mismas cláusulas FIELDS y LINES usadas con el comando LOAD DATA
INFILE . Consulte Sección 13.2.5, “Sintaxis de LOAD DATA INFILE”.
FIELDS ESCAPED BY controla cómo escribir carácteres especiales. Si el
carácter FIELDS ESCAPED BY no está vacío, se usa como prefijo para los
siguientes carácteres en la salida:
o El carácter FIELDS ESCAPED BY
o El carácter FIELDS [OPTIONALLY] ENCLOSED BY
o El primer carácter de FIELDS TERMINATED BY y LINES TERMINATED BY
o ASCII 0 (que se escribe siguiendo el carácter de escape ASCII '0',
no un byte con valor cero)
Si el carácter FIELDS ESCAPED BY está vacío, no hay ningún carácter de
escape y NULL se muestra por salida como NULL, no \N. Probablemente no
es buena idea especificar un carácter de escape vacío, particularmente si los
valores de los campos de sus datos contienen cualqiuera de los carácteres en
la lista dada.
La razón de lo anterior es que debe escapar cualquier carácter FIELDS
TERMINATED BY, ENCLOSED BY, ESCAPED BY, o LINES TERMINATED
BY para ser capaz de volver a leer el fichero correctamente. ASCII NUL se
escapa para hacer más fácil visualizarlo con algunos visores.
El fichero resultante no tiene que estar conforme a la sintaxis SQL, así que
nada más debe escaparse.
Este es un ejemplo que produce un fichero en formato de valores separados
por comas usado por varios programas:
SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;
Si usa INTO DUMPFILE en lugar de INTO OUTFILE, MySQL escribe sólo un
registro en el fichero, sin ninguna terminación de línea o columna y sin realizar ningún proceso de escape. Esto es útil si quiere almacenar un valor BLOB en
un fichero. Nota: Cualquier fichero creado por INTO OUTFILE o INTO DUMPFILE es
modificable por todos los usuarios en el equipo servidor. La razón es que el servidor MySQL no puede crear un fichero con un propietario distinto al usuario que está en ejecución (nunca debe ejecutar mysqld como root por esta y
otras razones). El fichero debe ser modificable por todo el mundo para que pueda maminpular sus contenidos.
Una cláusula PROCEDURE nombra a un procedimiento que debe procesar los
datos en el conjunto de resultados. Para un ejemplo, consulte Sección 27.3.1, “Procedimiento Analyse”.
Si usa FOR UPDATE en un motor de almacenamiento que usa bloqueo de
páginas o registros, los registros examinados por la consulta se bloquean para escritura hasta el final de la transacción actual. Usar LOCK IN SHARE MODE
crea un bloqueo compartido que evita a otras transacciones actualizar o borrar los registros examinados. Consulte Sección 15.10.5, “Bloquear lecturas SELECT ... FOR UPDATE y SELECT ... LOCK IN SHARE MODE”.
Tras la palabra clave SELECT , puede usar un número de opciones que afectan la
operación del comando.
Las opciones ALL, DISTINCT, and DISTINCTROW especifican si deben retornarse
los registros duplicados. Si no se da ninguna de estas opciones, por defecto es ALL
(se retornan todos los registros coincidentes). DISTINCT y DISTINCTROW son
sinónimos y especifican que los registros duplicados en el conjunto de resultados
deben borrarse.
HIGH_PRIORITY, STRAIGHT_JOIN, y opciones que comiencen con SQL_ son
extensiones de MySQL al estándar SQL.
HIGH_PRIORITY da a SELECT prioridad más alta que un comando que
actualice una tabla. Debe usar esto sólo para consultas que son muy rápidas y deben realizarse una vez. Una consulta SELECT HIGH_PRIORITY que se
realiza mientras la tabla está bloqueada para lectura se ejectua incluso si hay un comando de actualización esperando a que se libere la tabla.
HIGH_PRIORITY no puede usarse con comandos SELECT que sean parte de
una UNION.
STRAIGHT_JOIN fuerza al optimizador a hacer un join de las tablas en el
orden en que se listan en la cláusula FROM . Puede usarlo para acelerar una
consulta si el optimizador hace un join con las tablas en orden no óptimo. Consulte Sección 7.2.1, “Sintaxis de EXPLAIN (Obtener información acerca de
un SELECT)”. STRAIGHT_JOIN también puede usarse en la lista
table_references . Consulte Sección 13.2.7.1, “Sintaxis de JOIN”.
SQL_BIG_RESULT puede usarse con GROUP BY o DISTINCT para decir al
optimizador que el conjunto de resultados tiene muchos registros. En este caso, MySQL usa directamente tablas temporales en disco si son necesarias con una clave en los elementos GROUP BY .
SQL_BUFFER_RESULT fuerza a que el resultado se ponga en una tabla
temporal . Esto ayuda a MySQL a liberar los bloqueos de tabla rápidamente y ayuda en casos en que tarda mucho tiempo en enviar el resultado al cliente.
SQL_SMALL_RESULT puede usarse con GROUP BY o DISTINCT para decir
al optimizador que el conjunto de resultados es pequeño. En este caso, MySQL usa tablas temporales rápidas para almacenar la tabla resultante en lugar de usar ordenación. En MySQL 5.0, esto no hará falta normalmente.
SQL_CALC_FOUND_ROWS le dice a MySQL que calcule cuántos registros
habrán en el conjunto de resultados, sin tener en cuenta ninguna cláusula LIMIT. El número de registros pueden encontrarse con SELECT
FOUND_ROWS(). Consulte Sección 12.9.3, “Funciones de información”.
SQL_CACHE le dice a MySQL que almacene el resultado de la consulta en la
caché de consultas si está usando un valor de query_cache_type de 2 o
DEMAND. Para una consulta que use UNION o subconsultas, esta opción afecta
a cualquier SELECT en la consulta. Consulte Sección 5.12, “La caché de
consultas de MySQL”. SQL_NO_CACHE le dice a MySQL que no almacene los resultados de consulta
en la caché de consultas. Consulte Sección 5.12, “La caché de consultas de MySQL”. Para una consulta que use UNION o subconsultas esta opción afecta
a cualquier SELECT en la consulta.
MYSQL TEMA 12: - UPDATE TABLE 3.- El caso mas comun es solo actualizar un renglon o registro, para esta
situacion solo usar la clausula WHERE como lo muestra el siguiente ejemplo:
Update peliculas set preciopelicula = 500 where nombrepelicula = ‘becool’; Corrida:
4.- SQL UPDATE en MYSQL tambien puede actualizar un subconjunto de
renglones de la tabla, como lo muestra el siguiente ejemplo:
Update peliculas set preciopelicula = 333 where tipopelicula = ‘accion’;
Corrida:
Bueno como se observa de los ejemplos demostrados en este MYSQL TEMA
MYSQL UPDATE es una instruccion poderosa y a la vez muy sencilla para
todos los problemas de edicion o modificacion de tablas en las diversas bases de
datos que vayan construyendo a lo largo de este tutorial.