¿Que es MySQL?

MySQL es un sistema de gestión de base de datos relacional, el cual es desarrollado, distribuido y soportado por Oracle Corporation.

Esta considerado como la base de datos open source mas popular del mundo.

Esta programando en C y C++

Historia de MySQL

MySQL fue creado originalmente por la compañía sueca MySQL AB.

La primera versión de MySQL fue liberada el 23 de mayo de 1995. Esta version fue originalmente desarollado por Michael Widenius y David Axmark.

MySQL AB fue adquirida en 2008 por Sun Microsystems.

Historia de MySQL

Como en 2010 Oracle compro Sun Microsystems, MySql paso a ser propiedad de ellos.

El dia que Oracle anuncio la compra de Sun Microsystems, Michael Widenius creo una bifurcación(fork) de MySQL, creando así MariaDB.

MySQL recibe su nombre de la hija de Widenius, My.

Historia de MySQL

El nombre de la mascota de MySql, el delfín del logo, es "Sakila", este nombre fue elegido en un concurso entre los usuarios de MySql.

Tipos de datos

MySQL soporta un numero de tipos de datos divididos en varias categorías:

  • Tipos numéricos
  • Tipos de fecha y hora
  • Tipos cadena de caracteres
  • Datos multimedia

Tipos numericos

Datos numéricos enteros

Tipo Bytes Valor Minimo Valor Maximo
TINYINT 1 -128 127
0 255
SMALLINT 2 -32768 32767
0 65535
MEDIUMINT 3 -8388608 8388607
0 16777215
INT 4 -2147483648 2147483647
0 ​4294967295
BIGINT 8 -9223372036854775808 9223372036854775807
0 18446744073709551615

Tipos numericos

Los numeros de punto fijos se usan para almacenar numeros donde es importante presenvar una precision exacta.

DECIMAL(M,[D]). Donde "M" representa el numero total de dígitos y "D" la escala o numero total de decimales.

Cuando no se especifica "D" se asume el default 0, lo cual significa que no tiene números decimales.

El numero máximo de dígitos para decimal es 65, en caso de no especificar valor para "M" se toma el default que es 10.

Tipos numericos

El tipo NUMERIC también es un dato de punto fijo, pero este funciona de la misma forma que DECIMAL.

Tipos numericos

Los números de punto flotante representan un aproximado de un valor numérico. MySQL utiliza cuatro bytes para números de presición simple y ocho para presición doble.

FLOAT[(p)]. Numero con coma flotante, donde el parámetro opcional "p" indica la presición de este.

De 0 a 24 para números de presición sencilla y 25 a 53 para numeros con presición doble.

Si no se declaran argumentos, se toma como numero de presición sencilla.

Tipos numericos

FLOAT[(M,D)]. Numero de presición simple donde "M" indica los dígitos totales y "D" cuantos dígitos hay después del punto decimal.

Sus valores permitidos van de  -3.402823466E+38 a -1.175494351E-38, 0, y de 1.175494351E-38 a 3.402823466E+38.

DOUBLE[(M,D)]. Numero de presición doble donde "M" indica los dígitos totales y "D" cuantos dígitos hay después del punto decimal.

Sus valores permitidos van de -1.7976931348623157E+308 a -2.2250738585072014E-308, 0, y 2.2250738585072014E-308 a 1.7976931348623157E+308

Tipos numericos

DOUBLE PRECISION[(M,D)]. Sinónimo de DOUBLE.

 Un número de coma flotante con precisión sencilla tiene una precisión de 7 decimales aproximadamente; un número con coma flotante de doble precisión tiene una precisión aproximada de 15 decimales.

Si definimos una columna como FLOAT(7, 4) esta se vería como "-999.9999". Como MySql realiza redondeos al trabajar con flotantes, si insertáramos el valor "999.00009" en la columna anterior, esta se almacenaría con un valor aproximado a "999.0001".

Tipos numericos

BIT(M). Sirve para almacenar valores como bit. Donde M es la cantidad de valores bit que se quieren almacenar, con rango de 1 a 64. Si se omite M, se toma el default 1. 

Si se guarda un valor en bits con menos valores que el indicado en M, se llena con 0 a la izquierda.

Por ejemplo, si se quiere almacenar el valor b'101'(b indica que es binario) en una columna BIT(6), esta equivaldría a b'000101'.

Tipos numericos

Existen diversos atributos que se pueden declarar a los tipos numéricos:

  • ZEROFILL: rellena el vacio default con 0, por ejemplo INT(4) ZEROFILL con 5, equivaldria a 0005
  • UNSIGNED: Indica que la columna solo puede tener valores positivos.  Por ejemplo INT UNSIGNED.
  • AUTO_INCREMENT: Le indica a una columna que cuando reciba un valor nulo, agregue un numero secuencial aumentando en 1 por cada inserción.

Tipos de fecha y hora

Se usan para representar valores de tiempo.

DATE Representa una fecha sin horas. Utiliza el formato 'YYYY-MM-DD'.

El rango que soporta va de '1000-01-01' a '9999-12-31'.

DATETIME Contiene tanto fecha como hora. Utiliza el formato 'YYYY-MM-DD HH:MM:SS'. 

El rango que soporta va de '1000-01-01 00:00:00' a '9999-12-31 23:59:59'. MySql permite asignar estos valores como cadenas de caracteres o números.

Tipos de fecha y hora

TIMESTAMP Muy similar a DATETIME

El rango que soporta va de '1970-01-01  00:00:00' UTC a '2038-01-19  03:14:07' UTC.

Es muy útil para registrar horas de operaciones INSERT y UPDATE, ya que si no se envía valor o un nulo, automáticamente asigna la fecha y hora actual.

Tipos de fecha y hora

TIME Registra una hora. Utiliza el formato 'HH:MM:SS'.

El rango que soporta va de '-838:59:59' a '838:59:59'.

También puede utilizar un formato largo de horas 'HHH' para representar intervalos de tiempo o tiempo transcurrido.

Así como con datetime, se pueden asignar valores con números o cadenas de caracteres.

YEAR Representa un año en formato de cuatro dígitos(YYYY).

Su rango es de 1901 a 2155 o 0000.

Tipos de fecha y hora

En los tipos TIME, DATETIME y TIMESTAMP se pueden especificar fracciones de segundos, mas preciso 6 dígitos o micro segundos.

type_name(fsp). Donde type_name es cualquiera de los 3 tipos anteriores y fsp es un numero entero que marca la presición de fracción de segundo.

Tipos de cadenas de caracteres

CHAR(N) Representa una cadena de caracteres de longitud N. Este valor va de 0 a 255.

Cuando se almacena un valor con menos caracteres que los especificados, el espacio a la derecha se rellena con espacios. Cuando se recupera un dato CHAR, los espacios vacíos son removidos.

VARCHAR(N) Representa una cadena de caracteres de longitud variable con una máxima longitud de N. Este valor va de 0 a 65,535.

Tipos de cadenas de caracteres

A diferencia de los CHAR, los VARCHAR almacenan un preijo de 1 o 2 bytes donde almacenan la longitud de la cadena almacenada. 1 byte si la longitud no es mayor a 255 y 2 para cuando se pasa este valor.

Valor CHAR (4) Espacio requerido Varchar (4) Espacio requerido
'' '    ' 4 bytes '' 1 byte
'ab' 'ab  ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

Tipos de cadenas de caracteres

BINARY(N) Similar a CHAR solo que almacena cadenas binarias. Para los valores a rellenar a la derecha utiliza el valor 0x00.

VARBINARY(N) Similar a VARCHAR solo que almacena cadenas binarias.

Tipos de cadenas de caracteres

ENUM('value1','value2',...) Representa un objeto string cuyo valor es elegido de una lista de valores permitidos que son especificados al momento de creación de la tabla. Solo se puede elegir un valor.

Una columna ENUM puede tener un máximo de 65,535 elementos distintos.

SET('value1','value2',...) Similar a ENUM con la peculiaridad que se puede insertar múltiples valores de los especificados en la lista. Estos se agregaran en el registro separados por comas.

Una columna SET puede tener un máximo de 64 elementos distintos.

Datos multimedia

BLOB. Es un objeto binario que puede almacenar una cantidad variable de información. La información de un blob es tratada como strings binarios(byte strings).

Tipo Maximo numero de bytes
Tinyblob 255 bytes
Blob 65535 bytes - ~65kb
Mediumblob 16777215 bytes - ~16 mb
Longblob 4294967295 bytes - ~4gb

Datos multimedia

TEXT. Similar al blob, solo que almacena los datos como cadenas de caracteres.

Tipo Maximo numero de bytes
Tinytext 255 caracteres
Text 65535 caracteres
Mediumtext 16777215 caracteres
Longtext 4294967295 caracteres

SQL

SQL o Structured Query Language es un lenguaje declarativo de acceso a bases de datos relacionales que permite especificar diversos tipos de operaciones en ellas.

El SQL consiste de 3 elementos:

  • DDL: Data Definition Language
  • DML: Data Manipulation Language
  • DCL: Data Control Language

DDL

El lenguaje de definicion de datos se encarga de la modificacion de la estructura de los objetos en la base de datos. Esto incluye modificar, borrar o crear tablas.

Sus cuatro operaciones básicas son:

  • CREATE
  • ALTER
  • DROP
  • TRUNCATE

CREATE

Permite crear objetos de datos, como nuevas bases de datos, tablas, vistas y procedimientos almacenados(SP).

Crear base de datos:

  • CREATE DATABASE nombre_base_de_datos

Crear tabla:

  • CREATE [TEMPORARY] TABLE [IF NOT EXISTS] nombre_tabla(
    nombre_campo Tipo Opciones Clausulas,
    "" "" "" "",
    [ultimo_campo],

    [Constraints]);

CREATE

Temporary => La tabla existe mientras exista la conexion con el cliente actual o hasta que se borre manualmente la tabla.

If not exists => Se crea la tabla si no existe otra con el mismo nombre.

'Opciones' puede tener los siguientes valores:
Generales:

  • null => Admite valores nulos
  • not null => Rechaza datos en blanco(nulos)
  • default => Permite un valor por defecto

CREATE

Columnas númericas:

  • auto_increment => Genera identificadores únicos en serie
  • unsigned=> Rechaza valores negativos

'Claúsulas' puede tener los siguientes valores:

  • primary key => Columna indexada para busqueda rapida. Llave primaria, solo debe haber una
  • unique => Crea un indice con valores unicos
  • index, key => Crean indices que pueden tener valores repetidos

CREATE

'Constraints':

  • primary key
  • unique
  • not null
  • default
  • foreign key => Mantiene una referencia integral del dato de una tabla para igualar
  • check => Revisa que la columna cumpla con una condición especifica

CREATE

Ejemplo de creación de tabla con llave foránea

CREATE TABLE tabla (
    lista de campos e indices,
    PRIMARY KEY(campos_de_la_clave),
    FOREIGN KEY (campo_de_la_clave)
    REFERENCES otra_tabla (campo_clave)
);

Con columna simple

CREATE TABLE tabla (
    lista de campos e indices,
    PRIMARY KEY(campos_de_la_clave),
    CONSTRAINT nombre_fk FOREIGN KEY (campos_de_clave)
    REFERENCES otra_tabla (campos_clave)
);

Con columnas multiples

ALTER

Este comando nos permite modificar la estructura de una tabla u objeto, por ejemplo, agregar o quitar campos, modificar tipos, modificar stored procedures, etc.

Modificar tabla:

  • alter [ignore] table nombre_tabla acción*

Ignore se utiliza cuando existen datos duplicados en las claves los indices, y no se desea que estos sean eliminados.

ALTER

Lista de acción:

  • ADD INDEX [nombre_indice][tipo_indice] (columnas,...): Añade un indice basado en las columnas especificadas
  • ADD PRIMARY KEY (columnas,...)
  • ALTER [COLUMN] columna {SET DEFAULT valor | DROP DEFAULT}: Modifica el valor default de la columna o lo remueve
  • CHANGE [COLUMN] nombre_viejo nuevo_nombre definicion_columna: Cambia el nombre de una columna así como también su definición original.
  • RENAME [TO|AS] nuevo_nombre: Cambia el nombre de la tabla
  • DROP [COLUMN] nombre_columna: Elimina la columna especificada

ALTER

Ejemplos de uso

CREATE TABLE t1 (a INTEGER,b CHAR(10));
ALTER TABLE t1 RENAME t2;
ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
ALTER TABLE t2 DROP COLUMN c;

DROP

Este comando elimina un objeto de la base de datos, pueden ser tablas, vistas, stored procedures, etc.

Eliminar tabla:

  • DROP [TEMPORARY] TABLE [IF EXISTS] nombre_tabla [,nombre_tabla] ...

TRUNCATE

Este comando borra todo el contenido de una tabla.

Truncar tabla:

  • TRUNCATE [TABLE] nombre_tabla

Referencias

DML

El lenguaje de manipulación de datos se encarga de las tareas de consulta o modificación de datos.

Sus cuatro operaciones básicas son:

  • INSERT
  • DELETE
  • UPDATE
  • SELECT

Insert

INSERT [low_priority | delayed][ignore] INTO nombre_tabla forma_valores

low_priority | delayed: La primera posterga la inserción hasta que se deje de utilizar la tabla y la segunda genera una cola de inserción a la tabla.

forma_valores: Las formas para insertar valores son:

  • (lista de columnas) VALUE (lista de valores)
  • (lista de columnas) SELECT ...
  • SET (columna=valor, ..., columna_N=valor_N)

Insert

INSERT INTO estudiante VALUES('Nombre 1','Apellido 1','m','1990-01-01');

LOAD DATA: Es una forma de insertar datos de forma masiva a partir de un archivo de texto(.txt). Se crean los campos en el mismo orden que las columnas de la tabla y se separan con tabuladores(tabs).

Si no se sabe que valor usar, se debe colocar \N

 

LOAD DATA LOCAL INFILE 'path/file.txt' INTO TABLE tabla;

Delete

DELETE [low_priority] FROM nombre_tabla [where expresion] [limit n]

where: Especifica una condición que se debe cumplir los registros a borrar, si se omite se eliminan todos los registros de la tabla.

limit: Indica numero máximo de registros a borrar.

Si se desea borrar todo el contenido de la tabla es preferible utilizar TRUNCATE, ya que es una operación mucho mas rápida.

DELETE FROM estudiante where apellido = 'Lucio';

Update

UPDATE [low_priority] [ignore] nombre_tabla
SET columna1=valor1, [columna2=valor2,...]

[where expresion] [order by ...] [limit n]

order by: Actualiza los datos en el orden especificado por una o varias columnas.

Para múltiples tablas:

UPDATE [low_priority] [ignore] referencias_tablas
SET columna1=valor1, [columna2=valor2,...]

[where expresion]

Update

UPDATE [low_priority] [ignore] nombre_tabla
SET columna1=valor1, [columna2=valor2,...]

[where expresion] [order by ...] [limit n]

order by: Actualiza los datos en el orden especificado por una o varias columnas.

Para múltiples tablas:

UPDATE [low_priority] [ignore] referencias_tablas
SET columna1=valor1, [columna2=valor2,...]

[where expresion]

Update

UPDATE alumno
set edad = '20'
WHERE nacimiento > '1996-01-01';
UPDATE country a, sakila.country b
SET a.country = b.country
where a.country_id = b.country_id;

Replace

La sentencia REPLACE funciona de manera similar al INSERT, con la excepción de que si una columna tiene el mismo valor que uno nueva en su llave primaria o en un indice único, entonces la columna vieja es eliminada antes de insertar la nueva.

REPLACE [low_priority]

   [into] nombre_tabla

   [(nombre_columna,...)]

   (VALORES | VALOR)

Select

La sentencia SELECT se utiliza para traer información de una tabla. La sintaxis general es:

  • SELECT expresiones
    FROM desde_tabla
    WHERE condiciones;

Las expresiones al lado de SELECT representa lo que se quiere obtener, lo cual puede ser una lista de columnas o el simbolo * para indicar todas las columnas.

El FROM indica la tabla donde están los datos a recuperar.

Select

En las expresiones del SELECT, ademas de los nombres de los campos también pueden ser:

  • NULL
  • Funciones
    • Sistema
    • Usuario
  • Cálculos, operaciones aritméticas
  • Constantes, variables, literales, parámetros
  • Subqueries

Select

WHERE es opcional e indica la condición que deben cumplir los registros para que aparezcan en la consulta.

Se pueden utilizar los operadores de comparación:

<, <=, >, >=, != o <>, =

También se pueden usar los operadores lógicos: AND, OR, NOT.

El comparador especial para nulos es IS NULL y IS NOT NULL

Select

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 
        [ASC | DESC], ... [WITH ROLLUP]]
      [HAVING where_definition]
      [ORDER BY
        [ASC | DESC] ,...]
      [LIMIT ]

 

Select

group by lista_columnas: Agrupa las filas del resultado de acuerdo a la columnas especificadas.

​having expresión: Especifica una expresión secundaria para limitar filas después de que se cumplieran las condiciones del where (despues de un group by).

order by entero|nombreculumnas|formula: Indica como se van a ordenar los resultados, las posibilidades son:

  • asc => ascendente(default)
  • desc => descendente

Select

La clausula limit es utilizada para limitar el numero de filas devuelto por la sentencia SELECT.

Si se especifica solo un numero solo limita, si se especifican dos enteros entonces el primero indica en desplazamiento inicial del primer resultado a devolver y el segundo el numero máximo de filas a devolver.

SELECT * FROM table LIMIT 5; 
#recupera las primeras 5 filas

SELECT * FROM table LIMIT 5,10; 
#recupera de las filas 6 a 15

Select

La clausula limit es utilizada para limitar el numero de filas devuelto por la sentencia SELECT.

Si se especifica solo un numero solo limita, si se especifican dos enteros entonces el primero indica en desplazamiento inicial del primer resultado a devolver y el segundo el numero máximo de filas a devolver.

SELECT * FROM table LIMIT 5; 
#recupera las primeras 5 filas

SELECT * FROM table LIMIT 5,10; 
#recupera de las filas 6 a 15

Select

El operador LIKE se usa para hacer comparaciones entre cadenas y patrones.

Su sintaxis es:

<expresión> LIKE <patrón> [ESCAPE 'caracter_escape']

Los patrones son cadenas de caracteres que pueden aparecer en cualquier posición. Estos son:

  • % : Coincidencia con cualquier numero de caracteres, incluso cero
  • _ : Coincide con un único carácter

Select

Expresion Significado
'c%' Obtiene los elementos que comiencen con 'c'
'%c' Obtiene los elementos que terminen con 'c'
'%c%' Obtiene los elementos que contengan 'c'
'___' Obtiene los elementos que contengan la misma cantidad de caracteres como los del patron '_'

Select

Si se quieren utilizar los elementos _ y % se tiene que anteponer el símbolo default de escape '\', siendo de este modo '\%' y '\_'.

Si se quiere utilizar otro se define en la sección ESCAPE.

SELECT "%_%" LIKE "_!_!%" ESCAPE '!';

Ejemplos select

SELECT college, region, seed FROM tournament ORDER BY region;

SELECT college, region AS r, seed AS s FROM tournament ORDER BY r, s;

SELECT a, COUNT(b) FROM test_table GROUP BY a DESC

SELECT COUNT(*) FROM t GROUP BY col1 HAVING col1 = 2;
SELECT col_name FROM tbl_name 
HAVING col_name > 0;
SELECT col_name FROM tbl_name
WHERE col_name > 0; 

Subquery

Los subquery son consultas dentro de otras consultas.

Se utilizan para relacionar información de distintas tablas.

El uso mas comun es mediante comparadores, como lo son: =, >, <, >=, <=, !=, <>

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

Subquery

También se pueden utilizar los operadores ANY, IN y SOME. Su sintaxis es la siguiente:

operando comparador ANY (subquery)

operando IN (subquery)

operando comparador SOME (subquery)

Estos operadores regresan true cuando la comparación resulta verdadera para cualquier valor que retorna el subquery.

Estos operadores se consideran sinónimos.

Subquery

SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2);

SELECT s1 FROM t1 WHERE s1 <> ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2);

Indices

Un index o índice es una estructura de un dato que aumenta la velocidad de las operaciones en una tabla.

Estos indices solo deben ser considerados en columnas que van a ser utilizadas para crear querys.

Entre mas indices se tengan en una tabla es mas probable que los SELECT sean mas rápidos, pero hacen mas lentos los INSERT y UPDATE así que deben utilizarse a conciencia.

Indices

Los primary key se consideran indices, pero los foreign keys no.

Si se quiere que un indice tenga un valor unico debe declararse como UNIQUE.

CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...);

De otra forma entonces si permitiría tener valores duplicados, sin perder las características de indice.

MySql

By Alan

MySql

  • 173