Chuleta SQL - apt-web

Anuncio
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;
Descargar