MYSQL TEMA 12: - UPDATE TABLE SQL UPDATE - · PDF fileMYSQL TEMA 12: - UPDATE TABLE SQL UPDATE...

10

Click here to load reader

Transcript of MYSQL TEMA 12: - UPDATE TABLE SQL UPDATE - · PDF fileMYSQL TEMA 12: - UPDATE TABLE SQL UPDATE...

Page 1: MYSQL TEMA 12: - UPDATE TABLE SQL UPDATE - · PDF fileMYSQL TEMA 12: - UPDATE TABLE SQL UPDATE Es uno de los procesos mas comunes con tablas en bases de datos, se le conoce como actualizacion,

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:

Page 2: MYSQL TEMA 12: - UPDATE TABLE SQL UPDATE - · PDF fileMYSQL TEMA 12: - UPDATE TABLE SQL UPDATE Es uno de los procesos mas comunes con tablas en bases de datos, se le conoce como actualizacion,

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] , ...]

Page 3: MYSQL TEMA 12: - UPDATE TABLE SQL UPDATE - · PDF fileMYSQL TEMA 12: - UPDATE TABLE SQL UPDATE Es uno de los procesos mas comunes con tablas en bases de datos, se le conoce como actualizacion,

[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;

Page 4: MYSQL TEMA 12: - UPDATE TABLE SQL UPDATE - · PDF fileMYSQL TEMA 12: - UPDATE TABLE SQL UPDATE Es uno de los procesos mas comunes con tablas en bases de datos, se le conoce como actualizacion,

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.

Page 5: MYSQL TEMA 12: - UPDATE TABLE SQL UPDATE - · PDF fileMYSQL TEMA 12: - UPDATE TABLE SQL UPDATE Es uno de los procesos mas comunes con tablas en bases de datos, se le conoce como actualizacion,

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;

Page 6: MYSQL TEMA 12: - UPDATE TABLE SQL UPDATE - · PDF fileMYSQL TEMA 12: - UPDATE TABLE SQL UPDATE Es uno de los procesos mas comunes con tablas en bases de datos, se le conoce como actualizacion,

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:

Page 7: MYSQL TEMA 12: - UPDATE TABLE SQL UPDATE - · PDF fileMYSQL TEMA 12: - UPDATE TABLE SQL UPDATE Es uno de los procesos mas comunes con tablas en bases de datos, se le conoce como actualizacion,

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.

Page 8: MYSQL TEMA 12: - UPDATE TABLE SQL UPDATE - · PDF fileMYSQL TEMA 12: - UPDATE TABLE SQL UPDATE Es uno de los procesos mas comunes con tablas en bases de datos, se le conoce como actualizacion,

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.

Page 9: MYSQL TEMA 12: - UPDATE TABLE SQL UPDATE - · PDF fileMYSQL TEMA 12: - UPDATE TABLE SQL UPDATE Es uno de los procesos mas comunes con tablas en bases de datos, se le conoce como actualizacion,

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’;

Page 10: MYSQL TEMA 12: - UPDATE TABLE SQL UPDATE - · PDF fileMYSQL TEMA 12: - UPDATE TABLE SQL UPDATE Es uno de los procesos mas comunes con tablas en bases de datos, se le conoce como actualizacion,

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.