MySQL \! clear limpia la pantalla create database nombre; crea una nueva base de datos use nombrebasedatos; pone al uso la base de datos en cuestón show databases; muestra las bases de datos show tables; muestra las todas las tablas describe nombre_tabla; muestra detalles de las tablas create table nombre( col1 tipo primary key, col2 tipo not null, col3 tipo null); crea una nueva tabla drop table nombre; eliminar la tabla truncate table nombre; vacía una tabla alter table nombre [modicacion] >>add campo tipo; >>change campo tipo; >>modify campo tipo; >>drop campo tipo; modificar una tabla inser into nombre_tabla ( columna1, columna2...) values (valor1, valor2...); insertar datos update nombre_tabla modificar datos set col1='valor', col2='valor'... where [condicion/subconsulta]; delete from nombre_tabla eliminar filas where [condicion/subconsulta]; Consulta de inserción de datos: insert into nombre_tabla (columna1, columna2 …) select dato1, dato2 … from tabla_x where … group by … having … ; Consultas de modificación: update nombre_table set columna = 'valor' where dato [= / in] select … ; Consultas de eliminación de filas: delete from nombre_tabla where dato [= / in] select … ; Añadir las claves foráneas: alter table nombre_tabla add constraint f1 foreign key (nombre de la clave foranea) references tabla_referencial (nombre de la clave de donde apunta) on delete [restrict, cascade] on update [restrict, cascade]; Añadir mas de una clave: create table nombre ( campo1 tipo, campo2 tipo, campo3 tipo, primary key(campo1, campo2)); Crear una vista: create view nombre as select [consulta]; Transacciones: start transaction o begin; comenzar la transación rollback; cancela todos los cambios realizados commit; terminar transacción savepoint id; guarda la partida rollback to id; regresa al savepoint y descarta lo demas Inserciones de registros: insert [low_priority | delayed | high_priority] [ignore] [into] nombre_tabla [partition (nombre_particion, … )] [(nombre_columna, … )] {values | value} ({expr | default}, … ), ( … ), … [on duplicate key update nombre_col=expr [, nombre_col=expr] … ] Formato 1: insert into [tabla/vista] (lista de columnas) values (valores o select); Formato 2: insert into [tabla/vista] set col1='valor', col2='valor'; Formato 3: insert into tabla select * from otra_tabla where lo_que_sea; Reemplazos de registros: Funciona como insert excepto si la clave primara ya existe porque se remplazara la fila entera. Formato 1: replace into tabla (lista de columnas) [value/values] (lista de valores); Formato 2: replace into tabla set col1=val, col2=val; Formato 3: replace into tabla (lista de columnas) select … ; Exportacion e Importacion de datos: Para exportar se usa: $ mysql -uroot -p12345 --xml -e 'select * from tabla' > datos.xml Para importar: $ mysql -uroot -p12345 < fichero_comandos load data [low priority | concurrent] [local] infile fichero [replace | ignore] into table nombre_tabla [partition (nombre_particion, ... )] [{fields | colums} [terminate by 'string'] [[optionali] enclosed by 'char'] [escaped by 'char']] [lines [starting by 'string'] [treminated by 'string'] [ignore number lines] Ejemplo: load data infile '/home/usuario/datos.txt' into table nombre_tabla fields terminated by ';' lines terminated by '\n'; Archivos XML: Formato 1: <row columna1="valor columna2="valor" ... /> Ejemplo: Formato 2: <row> <column1>valor1</column1> <column2>valor1</column2> </row> load xml infile '/home/luciano/datos.xml' into table equipo row identified by <row>; Formato 3: <row> <field name="nombre_col">valor</field> <field name="nombre_col">valor</field> </row> Archivos CSV: Aprovechamos la cuadricula de una hoja de calculo para introducir los datos y la guardamos en formato CSV indicando cual es el carecter de seperacion entre campos. Ejemplo: En el caso que la separacion entre campos sea ',' >>> load data infile '/home/luciano/data.csv' into table politica.comunidades fields terminated by ',' lines terminated by '\n'; Exportar la base de datos: $ mysqldump -uroot -p12345 -t nombre_basedatos Tipos de Datos: varchar() int float :cadena de texto :numero entero :numero decimal Motores de la Base de Datos: engine = innoDB; par espicificar el motor al crear una tabla Opciones de las Foreign Keys: CASCADE, RESTRICT, NO ACTION, SET NULL Parametros Cláusula Insert: Low priority: hace que la inserción se retrase mientra haya clientes mirando la tabla. Delayed: permite continuar con otras operaciones mientras la insercion se retrasa hasta que no haya clientes accediendo a la tabla. High priority: mas prioridad para las actualizaciones. Ignore: obia los errores. Into: indica el nombre de la tabla. Partition: especifica las particiones donde se pretenden insertar los datos. Default: sirve para usar el valor del campo por defecto creado cuando se definió la tabla. Parametros Cláusula Load Data: Low priority: hace que la inserción se retrase mientra haya clientes mirando la tabla. Concurrent: permite que otros procesos o clientes accedan a la lectura de datos de la tabla en la que tienen lugar las inserciones. Local: se lee el ficheo en el cliente que se realiza la operación. Infile 'fichero': indica el fichero o ruta. Replace/Ignore: en caso de que exista el valor de la clave se actualice o se descarte. Lines starting by: indica el carácter por el que empieza la linea. Lines terminated by: indica el carácter por el que termina la linea. Fields/Columns terminated by: indica el carácter por el que termina. Optionally enclosed by: indica que los campos pueden estar delimitados por un carácter como comillas dobles. Ignore: sirve para omitir el numero de lineas al principio del fichero. Rutinas Procedimientos y Funciones. Comandos de Gestión de Rutinas: CREATE DROP SHOW → crea la rutina. → borra la rutina. → muestra la rutina. Borrar una rutina: DROP PROCEDURE/FUNCTION [IF EXISTS] nombre; Consulta rutinas: SHOW CREATE PROCEDURE/FUNTION nombre; SHOW PROCEDURE/FUNCTION STATUS [LIKE 'patrón']; Crear la rutina: CREATE PROCEDURE nombre (parametros) BEGIN … END; CREATE FUNCTION nombre (parametros) RETURNS tipo (INT, CHAR, FLOAT, BOOL, …) BEGIN … END; BEGIN y END son necesarios en el caso de que sean necesarias mas de una sentencia. Declarando variables: DECLARE variable tipo; (INT, CHAR, FLOAT, BOOL, …) Se pude añadir un valor por defecto: DECLARE numero INT DEFAULT 5; ó DECLARE texto CHAR DEFAULT 'hola'; Asignar un valor: SET variable = valor; Tipos de parámetros: IN OUT INOUT → Solo de entrada. → El parámetro es la salida. → Ambos a la vez. Alcance de las variables: Las variables solo existen dentro del bloque BEGIN-END. Solo la volveremos a encontrar fuera si son de sesión (@). Instrucciones condicionales: IF (condición) THEN Instrucciones; ELSE Instrucciones; END IF; CASE variable WHEN valor1 THEN Instrucción1; WHEN valor2 THEN Instrucción2; ELSE IsntruccionPorDefecto; END CASE; Bucles: etiqueta:LOOP Instrucciones; IF condición THEN LEAVE etiqueta; END IF; END LOOP etiqueta; etiqueta:REPEAT Instrucciones; UNTIL condición END REPEAT etiqueta; etiqueta:WHILE condición DO Instrucciones; END WHILE etiqueta; Funciones de MySQL conocidas: CURDATE() → AA-MM-DD CURTIME() → HH:MM:SS YEAR(NOW()) → Año actual. SUBSTRING(texto,posición,final) → Coge la subcadena desde la posición hasta el final que especifiquemos. UPPER(texto) → Lo pone todo a mayúsculas. CONCAT(Variable,'cadena',...) → Concatena elementos. POWER(x,y) → x elevado a y. LEFT(texto,longitud) → Los n caracteres de la izquierda. LOWER(texto) → Minúsculas. RIGHT(texto) → Los n caracteres de la derecha. SQRT(x) → Raíz cuadrada de x. SUBSTRING_INDEX(texto,'delimitador', número de elementos tras el delimitador). INSERT(texto, posición[1,2,3...],longitud[1,2,3...], cadena_a_insertar). Especificador Descripción %a Día de semana abreviado (Sun..Sat) %b Mes abreviado (Jan..Dec) %c Mes, numérico (0..12) %D Día del mes con sufijo inglés (0th, 1st, 2nd, 3rd, ...) %d Día del mes numérico (00..31) %e Día del mes numérico (0..31) %f Microsegundos (000000..999999) %H Hora (00..23) %h Hora (01..12) %I Hora (01..12) %i Minutos, numérico (00..59) %j Día del año (001..366) %k Hora (0..23) %l Hora (1..12) %M Nombre mes (January..December) %m Mes, numérico (00..12) %p AM o PM %r Hora, 12 horas (hh:mm:ss seguido de AM o PM) %S Segundos (00..59) %s Segundos (00..59) %T Hora, 24 horas (hh:mm:ss) %U Semana (00..53), donde domingo es el primer día de la semana %u Semana (00..53), donde lunes es el primer día de la semana %V Semana (01..53), donde domingo es el primer día de la semana; usado con %X %v Semana (01..53), donde lunes es el primer día de la semana; usado con %x %W Nombre día semana (Sunday..Saturday) %w Día de la semana (0=Sunday..6=Saturday) %X Año para la semana donde domingo es el primer día de la semana, numérico, cuatro dígitos; usado con %V %x Año para la semana, donde lunes es el primer día de la semana, numérico, cuatro dígitos; usado con %v %Y Año, numérico, cuatro dígitos %y Año, numérico (dos dígitos) %% Carácter '%' literal CURSORES y PUNTEROS Los cursores se han de declarar tras haber declarado todas las variables. Declarar un cursor: DECLARE nombre_cursor CURSOR FOR SELECT […]; Comandos relacionados con cursores: OPEN: inicializa el conjunto de resultados asociados con el cursor. FETCH: extrae la siguiente fila de valores del cursor moviéndolo una posición. CLOSE: cierra el cursor liberando la memoria que ocupa. Controlar cuando el cursor llega al final: DECLARE CONTINUE HANDLER FOR NOT FOUND SET FIN=1; Establece la variable fin a 1 y permite al programa seguir la ejecución. Ejemplo con bucle LOOP: DELIMITER $$ # creamos el procedimiento. CREATE PROCEDURE ejemplo() BEGIN # damos comienzo y a continuación declaramos las variables. DECLARE variable VARCHAR(20); DECLARE fin BOOL; DECLARE numero INT; # tras declarar las variables declaramos el cursor. DECLARE cursor CURSOR FOR SELECT titulo FROM noticias; # seguidamente establecemos la variable fin para el de tabla. DECLARE CONTINUE HANDLER FOR NOT FOUNO SET fin=1; SET fin=0, numero=0; # inicializamos el cursor. OPEN cursor; # a continuación empieza el bucle. bucle:LOOP # el cursor salta a la siguiente posición # y mete el resultado en la variable. FETCH cursor INTO variable; SET numero=numero+1; # si el puntero llega al final entonces la variable fin valdría 1 # entonces entra en la siguiente estructura de control. IF fin=1 THEN # y deja el bucle para poder proseguir con la ejecución. LEAVE bucle; END IF; # cerramos el bucle. END LOOP bucle; # cerramos el cursor. CLOSE cursor; # mostramos con select el valor de la variable numero. SELECT numero; END;$$ Ejemplo con REPEAT UNTIL: DELIMITER $$ # creamos el procedimiento. CREATE PROCEDURE ejemplo() BEGIN # damos comienzo y a continuación declaramos las variables. DECLARE variable VARCHAR(20); DECLARE fin BOOL; DECLARE numero INT; # tras declarar las variables declaramos el cursor. DECLARE cursor CURSOR FOR SELECT titulo FROM noticias; # seguidamente establecemos la variable fin para el de tabla. DECLARE CONTINUE HANDLER FOR NOT FOUNO SET fin=1; SET fin=0, numero=0; # inicializamos el cursor. OPEN cursor; # a continuación empieza el bucle. bucle:REPEAT # el cursor salta a la siguiente posición # y mete el resultado en la variable. FETCH cursor INTO variable; SET numero=numero+1; # si el puntero llega al final entonces la variable fin valdría 1 # entonces entra en la siguiente estructura de control. IF fin=1 THEN # y deja el bucle para poder proseguir con la ejecución. LEAVE bucle; END IF; # condición de salida del bucle. UNTIL fin # cerramos el bucle. END REPEAT bucle; # cerramos el cursor. CLOSE cursor; # mostramos con select el valor de la variable numero. SELECT numero; END;$$ Ejemplo con WHILE DO: DELIMITER $$ # creamos el procedimiento. CREATE PROCEDURE ejemplo() BEGIN # damos comienzo y a continuación declaramos las variables. DECLARE variable VARCHAR(20); DECLARE fin BOOL; DECLARE numero INT; # tras declarar las variables declaramos el cursor. DECLARE cursor CURSOR FOR SELECT titulo FROM noticias; # seguidamente establecemos la variable fin para el de tabla. DECLARE CONTINUE HANDLER FOR NOT FOUNO SET fin=1; SET fin=0, numero=0; # inicializamos el cursor. OPEN cursor; # a continuación empieza el bucle. bucle:WHILE (fin=0) DO # el cursor salta a la siguiente posición # y mete el resultado en la variable. FETCH cursor INTO variable; SET numero=numero+1; # si el puntero llega al final entonces la variable fin valdría 1 # entonces entra en la siguiente estructura de control. IF fin=1 THEN # y deja el bucle para poder proseguir con la ejecución. LEAVE bucle; END IF; # cerramos el bucle. END WHILE bucle; # cerramos el cursor. CLOSE cursor; # mostramos con select el valor de la variable numero. SELECT numero; END;$$ Ejemplo con dos PUNTEROS: DELIMITER $$ # creamos el procedimiento noticias_autor. CREATE PRQCEDURE noticias_autor() READS SQL DATA BEGIN # declaramos las variables u los punteros/cursores. DECLARE varAutor, contador INT; DECLARE fin BOOL; DECLARE autorCur CURSOR FOR SELECT id_autor FROM autor; DECLARE noticiaCur CURSOR FOR SELECT autor FROM noticias WHERE autor=varAutor; # establecemos el control de fin de tabla. DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin=1; SET contador=0; # tras inicializar las variables abrimos el cursor. OPEN autorCur; # aquí comienza el primer bucle autorBucle:LOOP # el cursor mete el id_autor en la variable varAutor. FETCH autorCur INTO varAutor; # si es el final de la tabla entra en el IF y deja el bucle. IF fin=1 THEN LEAVE autorBucle; END IF; # ahora se abre el siguiente bucle. OPEN noticiaCur; # se establece el contador a cero. SET contador=0; # empieza el bucle anidado. noticiasBucle:LOOP # en cada salto del cursor reutilizamos la variable varAutor # para almacenar el resultado de la consulta. FETCH noticiaCur INTO varAutor; # si es el final de la tabla entra en el IF y deja el bucle. IF fin=1 THEN LEAVE autorBucle; END IF; # aquí se va incrementando el contador de noticias SET contador=contador+1; # se cierra el bucle anidado y el segundo cursor. END LOOP autorBucle; CLOSE noticiaCur; # volvemos a poner la variable fin a cero. SET fin=0; # se imprime la cadena con el nombre del autor # y el numero de noticias que tiene. SELECT CONCAT( ' El autor ',varAutor,' tiene ',contador,' noticias.'); # si la tabla autor aun no a llegado al final el bucle sigue iterando. END LOOP autorBucle; CLOSE autorCur; # se cierra el bucle y el primer cursor # y se acaba el procedimiento. END;$$ TRIGGERS Gestión de Disparadores: CREATE, SHOW, DROP. Evento: Momento: INSERT, DELETE, UPDATE. BEFORE(antes), AFTER(despues). Crear un Trigger: CREATE TRIGGER nombre_disparador [AFERT/BEFORE] [INSERT/DELETE/UPDATE] ON tabla FOR EACH ROW sentencias NOTA: No puede haber dos disparadores en una misma tabla que correspondan al mismo momento y evento. Referencia: OLD.nombreCol → hace referencia a una columna de una fila existente, antes de ser actualizada o borrada. NEW.nombreCol → hace referencia a una columna en una nueva fila a punto de ser insertada o en una fila existente después de ser actualizada. Para DELETE solo puede emplearse OLD.nomCol, porque no hay nuevo registro. SET NEW.nombreCol = valor → necesita privilegio UPDATE. SET variable = NEW.nombreCol → necesita privilegio SELECT. Eliminar un Trigger: DROP TRIGER [IF EXIST] baseDatos.nombreTrigger; Consulta de Triggers: SHOW TRIGGERS FROM/IN baseDatos [LIKE 'patron' / WHERE expresión]; SELECT trigger_name, action_statement FROM information_schema.triggers; VISTAS Gestión de Vistas/VIEW: CREATE, ALTER, DROP, SHOW, SELECT. Crear vistas: CREATE [OR REPLACE] VIEW nombreVista AS SELECT … FROM …; Modificar vistas: ALTER VIEW nombreVista AS SELECT … FROM …; Borrar vista: DROP VIEW [IF EXISTS] nombreVista;