ENTRADA DE COMANDOS EN EL MONITOR
Para salir se usa QUIT
SQL engloba ambos lenguajes DDL+DML, y los estudiaremos juntos, ya que ambos
forman parte del conjunto de sentencias de SQL.
BASES DE DATOS
comando show databases
utilizar una base de datos
El comando USE nos permite utilizar una base de datos. Es (junto a quit) el único comando que
no requiere punto y coma.
crear una base de datos
mysql>create database prueba;
borrar bases de datos
mysql>drop database prueba;
TABLAS
mostrar tablas
El comando show tables;
Se puede utilizar la sintaxis show tables from bd,
crear tablas
create table nombreTabla (nombrecampo1 tipodatos(tamaño), nombrecampo2
tipodatos(tamaño),....);
indicar opciones en los campos en la creación
not null y unique
establecimiento de la clave durante la creación
Se puede añadir la palabra primary key tras el tipo de datos del campo que se desea sea
la clave de la tabla.
->primary key (codigo1, codigo2);
estructura de las tablas
El comando DESCRIBE seguido del nombre de una tabla
ejemplos:
mysql> CREATE TABLE ciudad1 (nombre CHAR(20) NOT NULL, poblacion INT
NULL);
mysql> CREATE TABLE ciudad2 (nombre CHAR(20) NOT NULL,
-> poblacion INT NULL DEFAULT 5000);
mysql> CREATE TABLE ciudad5 (clave INT AUTO_INCREMENT PRIMARY KEY,
-> nombre CHAR(20) NOT NULL,
-> poblacion INT NULL DEFAULT 5000);
TIPOS DE DATOS
Numéricos: int, tinyint, smallint, float. Doublé. Decimal
Texto: char, varchar
Lógicos: bit, bol
Fechas: date, datetime
ENUM
CREATE TABLE personas (Sexo ENUM(‘M’, ‘H’),.....
Modificadores
AUTO_INCREMENT (enteros)
BINARY (char y varchar)
DEFAULT (todos menos TEXT)
NOT NULL (todos)
PRIMARY KEY (todos)
UNIQUE (todos)
UNSIGNED (enteros)
ZEROFILL (enteros)
mysql>create table vehiculos (Modelo VARCHAR(20) NOT NULL DEFAULT “AR”);
OPERACIONES CON TABLAS
modificar tablas
Es el comando alter table el encargado. Con el atributo change modifica un campo.
Con el atributo rename cambia de nombre una tabla
mysql>alter table personas change nombre nombre varchar(20);
mysql>alter table personas rename clientes;
borrar columnas
alter table tabla drop columnaABorrar;
añadir columnas
alter table tabla add nuevaColumna Tipo...;
varias operaciones a la vez
alter table ejemplo drop campo1, add campo2, change campo3 campo4 int(8);
Verificaciones
Podemos ver la estructura de una tabla usando la sentencia SHOW COLUMNS FROM
También podemos ver la instrucción usada para crear una tabla, mediante la sentencia
SHOW CREATE TABLE
borrar tablas
Se usa la sintaxis: drop table seguida del nombre de la tabla.
INTRODUCIR DATOS EN UNA TABLA
el comando insert
mysql> insert into personas values('Pedro',
->'Hernández','Crespo','979898989');
mysql> insert into personas (nombre,apellido1,apellido2)
-> values ('Pedro','Hernández',"crespo");
insertar datos en una tabla desde un archivo externo
load data local infile "ruta" into table tabla;
Reemplazar filas
mysql> REPLACE INTO ciudad3 (nombre, poblacion) VALUES
-> ('Madrid', 7200000),
-> ('París', 9200000),
-> ('Berlín', 6000000);
Actualizar filas
Por ejemplo, podemos aumentar en un 10% la población de todas las ciudades de la
tabla ciudad3 usando esta sentencia:
mysql> UPDATE ciudad3 SET poblacion=poblacion*1.10;
Podemos, del mismo modo, actualizar el valor de más de una columna, separandolas
en la sección SET mediante comas:
mysql> UPDATE ciudad5 SET clave=clave+10, poblacion=poblacion*0.97;
Se puede incluir where
Se puede incluir la clausula LIMIT
mysql> UPDATE ciudad5 SET clave=clave-10 LIMIT 2;
Eliminar filas
mysql> DELETE FROM ciudad5 WHERE clave=2;
ÍNDICES
Tenemos tres tipos de índices.
creación
create index nombreÍndice ON tabla (lista_campos);
alter table tabla add index (lista_campos)
claves principales
mysql> CREATE TABLE ciudad4 (nombre CHAR(20) NOT NULL,
-> poblacion INT NULL DEFAULT 5000,
-> PRIMARY KEY (nombre));
create table personas (
dni char(10), nombre varchar(25) not null,
apellidos varchar(50) not null,
dirección varchar(50),
primary key (dni),
index datosCompletos (apellidos,nombre));
índice sobre columnas
mysql> CREATE TABLE mitabla2 (
-> id INT,
-> nombre CHAR(19),
-> INDEX (nombre));
mysql> CREATE TABLE mitabla4 (
-> id INT,
-> nombre CHAR(19),
-> INDEX (nombre(4)));
Este ejemplo usará sólo los cuatro primeros caracteres de la columna 'nombre' para
crear el índice.
claves únicas
El tercero permite definir índices con claves únicas, también sobre una columna, sobre
varias o sobre partes de columnas. Para definir índices con claves únicas se usa la
opción UNIQUE.
mysql> CREATE TABLE mitabla5 (
-> id INT,
-> nombre CHAR(19),
-> UNIQUE (nombre));
CONSULTAS
obtener registros. Select
select ListaDecampos from tablas where condición;
seleccionar todos los datos
select * from personas;
mysql> SELECT VERSION(), CURRENT_DATE;
Las expresiones_select no se limitan a nombres de columnas de tablas, pueden ser
otras expresiones, incluso aunque no correspondan a ninguna tabla:
mysql> SELECT SIN(3.1416/2), 3+5, 7*4;
mostrar filas repetidas
mysql> SELECT DISTINCT fecha FROM gente;
seleccionar campos concretos
select nombre, apellido1, apellido2 from personas;
También se puede realizar consultas con el operador OR o AND
También se pueden usar patrones mediante la cláusula like.
ordenar
La cláusula order by sirve para ordenar en base a una o más columnas.
limitar
mysql> SELECT * FROM gente LIMIT 3;
mysql> Select * from gente limit 0,2;
verificación de NULL
Los operadores IS NULL e IS NOT NULL sirven para verificar si una expresión
determinada es o no nula.
mysql> SELECT NULL IS NULL;
mysql> SELECT "NULL" IS NOT NULL;
mysql> SELECT 1/0 IS NULL, ISNULL(1/0);
Elección de no nulos
El operador COALESCE sirve para seleccionar el primer valor no nulo de una lista o
conjunto de expresiones.
mysql> SET @a=23, @b="abc", @d="1998-11-12";
Query OK, 0 rows affected (0.03 sec)
mysql> SELECT COALESCE(@c, @a, @b, @d);
Encontrar intervalo
Se puede usar el operador INTERVAL para calcular el intervalo al que pertenece un
valor determinado.
mysql> SET @x = 19;
Query OK, 0 rows affected (0.02 sec)
mysql> SELECT INTERVAL(@x, 0, 10, 20, 30, 40);
condiciones
El apartado where de la instrucción select nos permite poner una condición de modo
que sólo aparezcan en la consulta los registros que cumplan la condición.
operadores lógicos
mysql> SELECT 1 AND 0, 1 AND NULL, 0 AND NULL, 1 AND 0 AND 1;
mysql> SELECT 1 OR 0, 1 OR NULL, 0 OR NULL, 1 OR 0 OR 1;
mysql> SELECT 1 XOR 0, 1 XOR NULL, 0 XOR NULL, 1 XOR 0 XOR 1;
mysql> SELECT NOT 0, NOT 1, NOT NULL;
verificar pertenencia a un rango
mysql> SELECT 23 BETWEEN 1 AND 100;
verificar conjuntos
mysql> SELECT 10 IN(2, 4, 6, 8, 10);
valores máximo y mínimo de una lista
Los operadores GREATEST y LEAST devuelven el valor máximo y mínimo,
respectivamente, de la lista de expresiones dada.
mysql> SELECT LEAST(2,5,7,1,23,12);
mysql> SELECT GREATEST(2,5,7,1,23,12);
mysql> SELECT GREATEST(2,5,"7",1,"a",12);
consultas de campos calculados
Esto permite realizar cálculos con las columnas de consulta. Incluye +,-,*,/,DIV
Agrupar filas
mysql> SELECT fecha FROM gente GROUP BY fecha;
Existen otras funciones de resumen o reunión, como MAX(), MIN(), SUM(),
AVG(), STD(), VARIANCE()...
Cláusula HAVING
Consultas multitabla
Producto
mysql> SELECT * FROM personas2,telefonos2;
Composición (Join)
Recordemos que se trata de un producto cartesiano restringido, las tuplas que se
emparejan deben cumplir una determinada condición.
mysql> SELECT * FROM personas2, telefonos2
-> WHERE personas2.id=telefonos2.id;
Esta consulta es equivalente a estas otras:
mysql> SELECT * FROM personas2 JOIN telefonos2
-> ON (personas2.id = telefonos2.id);
mysql> SELECT * FROM personas2 JOIN telefonos2
-> WHERE (personas2.id = telefonos2.id);
mysql> SELECT * FROM personas2 INNER JOIN telefonos2
-> ON (personas2.id = telefonos2.id);
mysql> SELECT * FROM personas2 CROSS JOIN telefonos2
-> ON (personas2.id = telefonos2.id);
mysql> SELECT * FROM personas2 JOIN telefonos2 USING(id);
UNION (uniones)
Podemos crear una unión de las tres tablas, a pesar de que los nombres y tamaños de
algunas columnas sean diferentes:
mysql> SELECT * FROM stock1 UNION
-> SELECT * FROM stock2 UNION
-> SELECT * FROM stock3
Operador de asignación
En MySQL podemos crear variables y usarlas porteriormente en expresiones.
Para crear una variable hay dos posibilidades. La primera consiste en usar la
sentencia
SET de este modo:
mysql> SET @hoy = CURRENT_DATE();
mysql> SELECT @hoy;
La otra alternativa permite definir variables de usuario dentro de una sentencia
SELECT:
mysql> SELECT @x:=10;
mysql> SELECT @x;
Operadores de control de flujo: CASE
mysql> SET @x=1;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT CASE @x WHEN 1 THEN "uno"
-> WHEN 2 THEN "varios"
-> ELSE "muchos" END\G
*************************** 1. row ***************************
CASE @x WHEN 1 THEN "uno"
WHEN 2 THEN "varios"
ELSE "muchos" END: uno
1 row in set (0.02 sec)
mysql> SET @x=2;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT CASE WHEN @x=1 THEN "uno"
-> WHEN @x=2 THEN "varios"
-> ELSE "muchos" END\G
*************************** 1. row ***************************
CASE WHEN @x=1 THEN "uno"
WHEN @x=2 THEN "varios"
ELSE "muchos" END: varios
1 row in set (0.00 sec)
mysql>
Funciones
Funciones de control de flujo
Las funciones de esta categoría son:
IF Elección en función de una expresión booleana
IFNULL Elección en función de si el valor de una expresión es NULL
NULLIF Devuelve NULL en función del valor de una expresión
Funciones matemáticas
Las funciones de la categoría de matemáticas son:
ABS Devuelve el valor absoluto
ACOS Devuelve el arcocoseno
ASIN Devuelve el arcoseno
ATAN y ATAN2 Devuelven el arcotangente
CEILING y CEIL Redondeo hacia arriba
COS Coseno de un ángulo
COT Cotangente de un ángulo
CRC32 Cálculo de comprobación de redundancia cíclica
DEGREES Conversión de grados a radianes
EXP Cálculo de potencias de e
FLOOR Redondeo hacia abajo
LN Logaritmo natural
LOG Logaritmo en base arbitraria
LOG10 Logaritmo en base 10
LOG2 Logaritmo en base dos
MOD o % Resto de una división entera
PI Valor del número π
POW o POWER Valor de potencias
RADIANS Conversión de radianes a grados
RAND Valores aleatorios
ROUND Cálculo de redondeos
SIGN Devuelve el signo
SIN Cálculo del seno de un ángulo
SQRT Cálculo de la raíz cuadrada
TAN Cálculo de la tangente de un ángulo
TRUNCATE Elimina decimales
Funciones de cadenas
Las funciones para tratamiento de cadenas de caracteres son:
ASCII Valor de código ASCII de un carácter
BIN Converión a binario
BIT_LENGTH Cálculo de longitud de cadena en bits
CHAR Convierte de ASCII a carácter
CHAR_LENGTH o
CHARACTER_LENGTH Cálculo de longitud de cadena en caracteres
COMPRESS Comprime una cadena de caracteres
CONCAT Concatena dos cadenas de caracteres
CONCAT_WS Concatena cadenas con separadores
CONV Convierte números entre distintas bases
ELT Elección entre varias cadenas
EXPORT_SET Expresiones binarias como conjuntos
FIELD Busca el índice en listas de cadenas
FIND_IN_SET Búsqueda en listas de cadenas
HEX Conversión de números a hexadecimal
INSERT Inserta una cadena en otra
INSTR Busca una cadena en otra
LEFT Extraer parte izquierda de una cadena
LENGTH u OCTET_LENGTH Calcula la longitud de una cadena en bytes
LOAD_FILE Lee un fichero en una cadena
LOCATE o POSITION Encontrar la posición de una cadena dentro de otra
LOWER o LCASE Convierte una cadena a minúsculas
LPAD Añade caracteres a la izquierda de una cadena
LTRIM Elimina espacios a la izquierda de una cadena
MAKE_SET Crea un conjunto a partir de una expresión binaria
OCT Convierte un número a octal
ORD Obtiene el código ASCII, incluso con caracteres multibyte
QUOTE Entrecomilla una cadena
REPEAT Construye una cadena como una repetición de otra
REPLACE Busca una secuencia en una cadena y la sustituye por otra
REVERSE Invierte el orden de los caracteres de una cadena
RIGHT Devuelve la parte derecha de una cadena
RPAD Inserta caracteres al final de una cadena
RTRIM Elimina caracteres blancos a la derecha de una cadena
SOUNDEX Devuelve la cadena "soundex" para una cadena concreta
SOUNDS LIKE Compara cadenas según su pronunciación
SPACE Devuelve cadenas consistentes en espacios
SUBSTRING o MID Extraer subcadenas de una cadena
SUBSTRING_INDEX Extraer subcadenas en función de delimitadores
TRIM Elimina sufijos y/o prefijos de una cadena.
UCASE o UPPER Convierte una cadena a mayúsculas
UNCOMPRESS Descomprime una cadena comprimida mediante COMPRESS
UNCOMPRESSED_LENGTH Calcula la longitud original de una cadena comprimida
UNHEX Convierte una cadena que representa un número hexadecimal a cadena de
caracteres
Funciones de comparación de cadenas
Además de los operadores que vimos para la comparación de cadenas, existe una
función:
STRCMP Compara cadenas
Funciones de fecha
Funciones para trabajar con fechas:
ADDDATE Suma un intervalo de tiempo a una fecha
ADDTIME Suma tiempos
CONVERT_TZ Convierte tiempos entre distintas zonas horarias
CURDATE o CURRENTDATE Obtener la fecha actual
CURTIME o CURRENT_TIME Obtener la hora actual
DATE Extraer la parte correspondiente a la fecha
DATEDIFF Calcula la diferencia en días entre dos fechas
DATE_ADD Aritmética de fechas, suma un intervalo de tiempo
DATE_SUB Aritmética de fechas, resta un intervalo de tiempo
DATE_FORMAT Formatea el valor de una fecha
DAY o DAYOFMONTH Obtiene el día del mes a partir de una fecha
DAYNAME Devuelve el nombre del día de la semana
DAYOFWEEK Devuelve el índice del día de la semana
DAYOFYEAR Devuelve el día del año para una fecha
EXTRACT Extrae parte de una fecha
FROM_DAYS Obtener una fecha a partir de un número de días
FROM_UNIXTIME Representación de fechas UNIX en formato de cadena
GET_FORMAT Devuelve una cadena de formato
HOUR Extrae la hora de un valor time
LAST_DAY Devuelve la fecha para el último día del mes de una fecha
MAKEDATE Calcula una fecha a partir de un año y un día del año
MAKETIME Calcula un valor de tiempo a partir de una hora, minuto y segundo
MICROSECOND Extrae los microsegundos de una expresión de fecha/hora o de hora
MINUTE Extrae el valor de minutos de una expresión time
MONTH Devuelve el mes de una fecha
MONTHNAME Devuelve el nombre de un mes para una fecha
NOW o CURRENT_TIMESTAMP o
LOCALTIME o LOCALTIMESTAMP o
SYSDATE Devuelve la fecha y hora actual
PERIOD_ADD Añade meses a un periodo (año/mes)
PERIOD_DIFF Calcula la diferencia de meses entre dos periodos (año/mes)
QUARTER Devuelve el cuarto del año para una fecha
SECOND Extrae el valor de segundos de una expresión time
SEC_TO_TIME Convierte una cantidad de segundos a horas, minutos y segundos
STR_TO_DATE Obtiene un valor DATETIME a partir de una cadena con una fecha y una
cadena de formato
SUBDATE Resta un intervalo de tiempo de una fecha
SUBTIME Resta dos expresiones time
TIME Extrae la parte de la hora de una expresión fecha/hora
TIMEDIFF Devuelve en tiempo entre dos expresiones de tiempo
TIMESTAMP Convierte una expresión de fecha en fecha/hora o suma un tiempo a una
fecha
TIMESTAMPADD Suma un intervalo de tiempo a una expresión de fecha/hora
TIMESTAMPDIFF Devuelve la diferencia entre dos expresiones de fecha/hora
TIME_FORMAT Formatea un tiempo
TIME_TO_SEC Convierte un tiempo a segundos
TO_DAYS Calcula el número de días desde el año cero
UNIX_TIMESTAMP Devuelve un timestamp o una fecha en formato UNIX, segundos
desde 1070
UTC_DATE Devuelve la fecha UTC actual
UTC_TIME Devuelve la hora UTC actual
UTC_TIMESTAMP Devuelve la fecha y hora UTC actual
WEEK Calcula el número de semana para una fecha
WEEKDAY Devuelve el número de día de la semana para una fecha
WEEKOFYEAR Devuelve el número de la semana del año para una fecha
YEAR Extrae el año de una fecha
YEARWEEK Devuelve el año y semana de una fecha
De grupos
Funciones de grupos:
AVG Devuelve el valor medio
BIT_AND Devuelve la operación de bits AND para todos los bits de una expresión
BIT_OR Devuelve la operación de bits OR para todos los bits de una expresión
BIT_XOR Devuelve la operación de bits XOR para todos los bits de una expresión
COUNT Devuelve el número de valores distintos de NULL en las filas recuperadas por una
sentencia SELECT
COUNT
DISTINCT Devuelve el número de valores diferentes, distintos de NULL
GROUP_CONCAT Devuelve una cadena con la concatenación de los valores de un grupo
MIN Devuelve el valor mínimo de una expresión
MAX Devuelve el valor máximo de una expresión
STD o STDDEV Devuelve la desviación estándar de una expresión
SUM Devuelve la suma de una expresión
VARIANCE Devuelve la varianza estándar de una expresión
Usuarios y privilegios
Niveles de privilegios
En MySQL existen cinco niveles distintos de privilegios:
Globales: se aplican al conjunto de todas las bases de datos en un servidor. Es el
nivel
más alto de privilegio, en el sentido de que su ámbito es el más general.
De base de datos: se refieren a bases de datos individuales, y por extensión, a todos
los
objetos que contiene cada base de datos.
De tabla: se aplican a tablas individuales, y por lo tanto, a todas las columnas de
esas
tabla.
De columna: se aplican a una columna en una tabla concreta.
De rutina: se aplican a los procedimientos almacenados. Aún no hemos visto nada
sobre este tema, pero en MySQL se pueden almacenar procedimietos consistentes
en
varias consultas SQL.
Crear usuarios
Aunque en la versión 5.0.2 de MySQL existe una sentencia para crear usuarios,
CREATE USER, en versiones anteriores se usa exclusivamente la sentencia
GRANT para crearlos.
mysql> GRANT USAGE ON *.* TO anonimo IDENTIFIED BY 'clave';
Conceder privilegios
mysql> GRANT SELECT ON prueba.gente TO anonimo;
Esta sentencia concede al usuario 'anonimo' el privilegio de ejecutar sentencias
SELECT sobre la tabla 'gente' de la base de datos 'prueba'.
mysql> GRANT SELECT, UPDATE ON prueba.gente TO anonimo IDENTIFIED BY
'clave';
Revocar privilegios
mysql> REVOKE SELECT ON prueba.gente FROM anonimo;
Mostrar los privilegios de un usuario
mysql> SHOW GRANTS FOR anonimo;
Borrar usuarios
mysql> DROP USER anonimo;
Vistas (views)
mysql> create view valias_systemadmin_es as select alias, valias_line from valias
where domain="systemadmin.es";
Procedimientos Almacenados
Un ejemplo sencillo de un procedimiento que calcule el cuadrado de un número
sería:
CREATE PROCEDURE cuadrado (IN numero INTEGER)
SELECT numero*numero;
Ahora que ya tenemos nuestro procedimiento creado lo invocamos usando la
palabra reservada CALL, por ejemplo:
CALL cuadrado(5);
Otro:
CREATE PROCEDURE cuadrado (IN numero INTEGER, OUT resultado
INTEGER)
SELECT numero*numero INTO resultado;
CALL cuadrado(5, @r);
mysql> delimiter //
mysql> create procedure p02 (num1 INTEGER, num2 INTEGER)
-> BEGIN
-> select * from productos
-> where stock between num1 and num2;
-> END
-> //
mysql> call p02(20,30)//
create procedure p03(val BIT)
BEGIN
If val=0 then
Select * from productos where stock<20;
ELSE
Select * from productos where stock>=20;
End if;
END
create procedure p04(var SMALLINT)
BEGIN
case var
when 1 then INSERT INTO fabricante VALUES (‘A007’,’Miray’);
when 2 then INSERT INTO fabricante VALUES (‘A008’,’Recco’);
when 3 then INSERT INTO fabricante VALUES (‘A009’,’REW’);
else INSERT INTO fabricante VALUES (‘A010’,’XYZ’);
end case;
END
//
CREATE procedure p05(repi SMALLINT)
begin
while (repi>0) do
INSERT INTO valores VALUES (repi);
SET repi = repi - 1 ;
end while;
end;
//
CREATE procedure p06(iter SMALLINT)
begin
repeat
INSERT INTO valores VALUES(iter*10);
SET iter = iter - 1;
until (iter<=1)
end repeat;
end;
//
FUNCIONES
CREATE FUNCTION Mensajito(texto VARCHAR(20)) RETURNS VARCHAR(20)
BEGIN
DECLARE salida VARCHAR(20);
SET salida = texto;
RETURN salida;
END
CREATE FUNCTION divide(dividendo int,divisor int) returns int
begin
declare aux int;
declare contador int;
declare resto int;
SET contador = 0;
SET aux = 0;
while ((aux + divisor) <= dividendo) do
SET aux = aux + divisor ;
SET contador = contador + 1;
end while;
SET resto = dividendo - aux ;
RETURN contador;
end
//
Disparadores (triggers)
Create trigger t01 after insert on fabricante
For each row
set @mensaje1="Registro Insertado Exitosamente";
Create trigger t02 after delete on fabricante
For each row
set @Eliminados=FOUND_ROWS();
Create trigger t03 after update on fabricante
For each row
BEGIN
set @valor=FOUND_ROWS();
if @valor=0 then
set @mensaje2="No se ha podido actualizar";
else
set @mensaje2="Si se ha podido actualizar";
end if;
end
//
Importar y exportar datos
Exportar a otros ficheros
mysql> SELECT * FROM gente
-> INTO OUTFILE "gente.txt"
-> FIELDS TERMINATED BY ';'
-> OPTIONALLY ENCLOSED BY '\"'
-> LINES TERMINATED BY '\n\r';
Importar a partir de ficheros externos
mysql> LOAD DATA INFILE "gente.txt"
-> INTO TABLE gente
-> FIELDS TERMINATED BY ','