* 
Javier Roig Garro 
dunbit@hotmail.com 
dunbit.blogspot.com 
@Dunbit
*Bases de datos relacionares, conceptos 
*1. Creación de Tablas 
*2. Sintaxis básica de Select 
*3. Filtrar datos con Where 
*4. Funciones integradas 
*5. Agrupar y totalizar columnas 
*6. Consultas de varias tablas 
*7. Consultas de inserción, actualización y eliminación 
*8. Consultas avanzadas 
* 
2
* 
0.1. Que son las bases de datos relacionares 
0.2. Conceptos de creación de tablas 
0.3. Tipos básicos de datos 
0.4. Base de datos 
3
*SQL  Structured Query Language 
*Instrucciones que forman Sentencias 
*Sigue una estructura determinada 
*Facilita comunicación con bases de datos 
*RDBMS  Relational Database Managment System 
*Programa que gestiona la información 
*Local  Escritorio  Ejemplo MS. Access 
*Servidor Equipo independiente  Ejemplo Oracle 
* 
4
LOCAL CLIENTE 
SERVIDOR 
* 
5
*Base de datos simple  almacén de información  
Ej. Excel 
*Base de datos relacionales  almacena 
información en estructuras relacionadas 
lógicamente 
*Catalogo de datos  información de la estructura 
 Tablas de sistema 
*Componentes básicos 
*Tablas, filas, columnas 
*Relaciones, identificadores, índices 
* 
6
* 
©Manual Imprescindible SQL 
7
* 
* Tablas formadas por 
* Filas (tuplas) y Columnas (campos) 
* Contiene información coherente 
* Todas las filas tienen la misma estructura pero distinta información 
* Relaciones 
* Sólo entre campos comunes de las tablas 
* Identificadores 
* Cada campo se tiene que poder identificar de forma única 
* Tabla + clave primaria + campo 
* Clave primaria (PK, Primary Key) identifica una fila 
* Clave Externa (FK, Foreing Key)  identifica una fila de otra tabla 
8
* Reglas para unificar estructura base de datos 
* Reducir redundancia de datos 
* Simplificar dependencias 
*Primera forma normal 
* Cada campo contiene información indivisible 
* No tiene que haber grupos de valores repetidos 
*Segunda forma normal 
* Tiene que tener una clave primaria única que identifique a 
toda la fila 
*Tercera forma normal 
* No tiene que haber dependencias transitivas entre tablas 
* 
9
* 
Cada campo contiene 
información indivisible 
©Manual Imprescindible SQL 
10
* 
No tiene que haber grupos 
de valores repetidos 
©Manual Imprescindible SQL 
11
*Integridad de la información 
* Definir tipo, longitud, campo obligatorio, rango de 
valores… 
*Tipos básicos 
* Boolean (TinyInt): si o no 
* Char: texto de longitud fija 
* Varchar: texto de longitud variable 
* Int: número entero 
* Float: número con decimales 
* Date: fecha 
* Binary: números binarios 
* 
12
Tenemos clientes que disponen de varios 
almacenes y necesitamos guardar los datos 
generales, la dirección principal, la dirección 
de facturación si es distinta y la dirección de los 
diferentes almacenes. 
*Crear en papel la estructura básica de las 
tablas con sus campos y relaciones. 
*Identificar los tipos básicos de los datos 
* 
13
*Configuración en modo desarrollador 
*Recursos instalación 
*Instalador de la Base de datos 
* http://dev.mysql.com/downloads/windows/installer/ 
*Entorno de trabajo mySQL WorkBench 
* http://dev.mysql.com/downloads/workbench 
*Prerrequisitos 
* Microsoft .NET Framework 4 Client Profile 
* Visual C++ Redistributable for Visual Studio 2013 
* 
14
*Funciones 
*Administración del servidor 
*Editor SQL 
*Editor de diagramas de base de datos 
*Análisis de rendimiento 
*Entorno 
*Dividido en paneles y fichas 
*Archivo, Edición, Vista, Consulta, base de 
* 
datos, servidor, herramientas, código 
15
* 
1.1. Sintaxis básica 
1.2. Tipos de datos MySQL 
1.3. Crear tablas en WorkBench 
17
*CREATE [ TEMPORARY ] TABLE [ IF NOT EXISTS ] 
nombre_tbl (definición_campos,...) 
*Temporary  crea tabla temporal 
*If not exist  evita el error si existe la tabla 
*Constraint  clave primaria 
CREATE TABLE libros ( codigo INTEGER NOT NULL, 
signatura CHAR(10) NOT NULL, titulo VARCHAR(40), 
autor VARCHAR(40), disponible CHAR(1), 
CONSTRAINT PK_libros PRIMARY KEY (codigo)); 
* 
18
*Sintaxis definición campo 
Nombre_campo Tipo_Datos [ NOT NULL | 
NULL ] [ DEFAULT default_value] [ AUTO _ 
INCREMENT ] [ UNIQUE [ KEY ] | [ PRIMARY ] 
KEY ] [ COMMENT 'string'] 
*Not Null, Null: acepta nulos 
*Default: valor por defecto 
*Auto_increment: autonuméricos 
*Unique: valor único, clave primaria 
*Comment: comentarios 
* 
19
Documentación on line: 
http://dev.mysql.com/doc/refman/5.7/en/data-types.html 
* 
* Tipos Numéricos Enteros 
* BIT 
* TINYINT 
* SMALLINT 
* MEDIUMINT 
* INT 
* INTEGER 
* BIGINT 
* Tipos Numéricos Decimales 
* DECIMAL 
* NUMERIC 
* Tipos Numéricos Coma flotante 
* REAL 
* DOUBLE 
* FLOAT 
* Tipos Fecha y Hora 
* DATE 
* TIME 
* TIMESTAMP 
* DATETIME 
* YEAR 
* Tipos de datos de Texto 
* CHAR 
* VARCHAR 
* BINARY 
* VARBINARY 
* TINYBLOB 
* BLOB 
* MEDIUMBLOB 
* LONGBLOB 
* TINYTEXT 
* TEXT 
* MEDIUMTEXT 
* LONGTEXT 
20
Documentación sobre el editor 
http://dev.mysql.com/doc/workbench/en/wb-table-editor.html 
* 
21
* 
2.0 Sintaxis básica 
2.1. Alias y campos calculados 
2.2. Ordenación de los datos 
22
*Instrucción básica 
*SELECT expr_select FROM tabla 
* Expr_select: información que se pueden seleccionar 
* From tabla: tabla de dónde mostrar los datos 
*Expresiones 
** :Todos los campos de la tabla 
*Nom_col1, nom_col2: sólo las columnas 
especificadas y en la posición que se indiquen 
*Distinct, sólo valores distintos 
* 
23
*select * from libros 
*select autor, titulo from libros 
*select distinct autor from libros 
* 
24
*Alias permite identificar mejor una columna 
*Cada columna puede tener un alias 
*No se puede utilizar con el * 
*Si el alias tiene espacios en blanco tiene que ir 
entre comillas simples ‘alias con blancos’ 
*Sintaxis 
*SELECT nom_col AS alias FROM tabla 
* 
25
*Campos calculados son los que no están en la 
tabla 
*Añadir columnas 
*Con valor fijo 
*Con una función independiente 
*Con operaciones aritméticas de otros campos 
*Con operaciones de texto de otros campos 
*Cálculos de fechas 
* 
26
* SELECT prestamo as 'F. Prestamo' FROM test.prestamos; 
* SELECT titulo, autor , 'Consultar Disponibilidad' as Disponible from libros 
* SELECT *, current_date() as 'fecha actual' FROM test.prestamos; 
* SELECT codigo, codigo + 100, codigo / 2, codigo *3 FROM test.prestamos; 
* SELECT substring(titulo,1,3) as Comienzo , titulo from libros; 
* SELECT alta, current_date(), (to_days(current_date())-to_days(alta))/365 
* 
as Antiguedad FROM test.socios; 
27
* 
* Sintaxis 
* SELECT expr_selec FROM tabla ORDER BY expr_orden 
[ASC|DESC] 
* Expr_orden: uno o más campos por los que queremos ordenar el 
resultado. 
* ASC o DESC: orden ascendente o descendente. Por defecto es 
ascendente 
* Los campos de ordenación pueden no estar presentes en la 
selección 
* Si hay varias columnas, se organiza la información en función 
de la posición de los campos de izquierda a derecha 
* Si tenemos columnas calculadas en el select también 
podemos usarlas en el 
28
* select * from libros order by autor 
* select * from libros order by autor, titulo 
* select * from libros order by disponible desc, autor, titulo 
* select substring(signatura,1,1),signatura,titulo from libros 
order by 1 
* select substring(signatura,1,1) as indice,signatura,titulo 
from libros order by indice 
* 
29
* 
3.1. Filtros simples 
3.2. Otros filtros con el operador LIKE 
3.3. Filtrar datos NULL 
3.4. Usar operadores AND y OR 
3.5 Almacenar consultas en Vistas 
30
* 
*Sintáxis 
*select expr_select from tabla where expr_filtro 
* Expr_filtro: condición que se tiene que cumplir para 
seleccionar la fila (TRUE) 
* Esta expresión puede devolver TRUE/FALSE/NULL 
*Operadores 
*=, <>, >, <, >=, =< 
*Tener en cuenta los tipos de datos 
*Los textos van entre comillas simples ‘’ 
*IN se utiliza para listas 
31
*select * from libros where disponible='S‘ 
*SELECT * FROM socios WHERE cp IN 
(23001,23021) 
*SELECT * FROM socios WHERE cp >'23008' 
* 
32
*Buscar por patrones y no por coincidencias exactas 
*Sintaxis 
*SELECT expr_select FROM tabla where campo like 
patrón 
* Patrón, contiene la información que se busca junto con 
caracteres comodín ‘%’ o ‘_’ 
* % identifica a un número indeterminado de caracteres 
* _ identifica a un único caracter. 
* MS Access utiliza ‘*’ y ‘?’ 
* Se pueden usar con NOT 
* 
33
*SELECT * FROM test.libros WHERE titulo LIKE 'El%'; 
*SELECT * FROM test.libros WHERE titulo LIKE '%del%‘ 
*SELECT * FROM test.libros WHERE titulo LIKE '%s‘ 
*SELECT * FROM test.socios WHERE cp LIKE '230_1'; 
*SELECT * FROM test.socios WHERE cp NOT LIKE '230_1'; 
* 
34
*Libros que el título empiecen por ‘El’ 
*SELECT * FROM libros WHERE titulo LIKE 'El%'; 
*Libros que el título contenga ‘del’ 
*SELECT * FROM libros WHERE titulo LIKE '%del%‘ 
*Libros que el título acaba en ‘s’ 
*SELECT * FROM libros WHERE titulo LIKE '%s‘ 
*Socios con el código postal que empiece por 230 y acabe 
en 1 
*SELECT * FROM socios WHERE cp LIKE '230_1'; 
*Socios con el código postal que no empiece por 230 ni 
acabe por 1 
*SELECT * FROM socios WHERE cp NOT LIKE '230_1'; 
* 
35
*Null no tiene ningún valor 
*Sintaxis 
*SELECT expr_selec FROM tabla WHERE campo IS 
NULL 
* IS NULL, cuando el campo no tiene valor asignado 
* IS NOT NULL, cuando el campo tiene algún valor 
asignado 
* 
36
*SELECT * FROM libros WHERE disponible IS null 
*SELECT * FROM libros WHERE disponible IS NOT 
null 
* 
37
*Utilizan para filtros compuestos por varias 
expresiones 
*Sintaxis 
*SELECT expr_select FROM tabla WHERE expr_filtro 
AND | OR expr_filtro 
* 
* AND: se tienen que cumplir las dos expresiones 
* OR: se tiene que cumplir una de las dos 
*Operador NOT 
*Invierte el resultado de la expresión 
*Uso de paréntesis 
*Agrupa expresiones a evaluar 
38
* select * from libros where disponible='S' and autor='Charte, Francisco’ 
* 
vs 
* select * from libros where disponible='S' or autor='Charte, Francisco’ 
* select * from libros where disponible='S' and not(autor='Charte, 
Francisco') 
* select * from libros where disponible='N' and autor='Charte, Francisco' 
or autor='Li‘ 
vs 
* select * from libros where disponible='N' and (autor='Charte, 
Francisco' or autor='Li') 
39
*Consulta SQL almacenada que se puede 
llamara desde otra consulta. 
*No almacena datos, sólo la consulta 
*Se puede tratar como una tabla para otras 
consultas 
*Se crea el objeto en el schema seleccionado 
*Sintaxis 
*CREATE OR REPLACE VIEW nombre AS 
sentencia sql 
* Nombre: es el nombre de la vista 
* Sentencia sql: consulta sql que queremos 
* 
almacenar 
40
*Utilización 
*Se pueden utilizar en cualquier SELECT 
*Devuelve la información en formato tabla 
*La información está actualizada 
*Modificar una vista 
*ALTER VIEW nombre AS consulta 
*Desde WorkBench  llave inglesa 
*Eliminar vista 
*DROP VIEW nombre 
*Desde WorkBench  botón derecho 
* 
41
* 
42 
* Opciones avanzadas: 
* Algoritmo: Como procesa MySQL la vista 
* Merge (sustituye los campos), Temptable (tabla temporal), 
undefined(automático) 
http://dev.mysql.com/doc/refman/5.7/en/view-algorithms.html 
* Definer, SQL Security: Cuenta que se va a utilizar para crear y para 
consultar. 
* Recomendable utilizar INVOKER (solo los usuarios con permisos) 
http://dev.mysql.com/doc/refman/5.0/en/stored-programs-security.html 
CREATE 
ALGORITHM = UNDEFINED 
DEFINER = `root`@`localhost` 
SQL SECURITY invoker 
VIEW `listasocios` AS 
SELECT `socios`.`apellidos` AS `apellidos`, 
`socios`.`nombre` AS `nombre`, 
`socios`.`alta` AS `alta` 
FROM `socios`
* 
4.1 Que son las funciones 
4.2 Principales funciones de texto 
4.3 Principales funciones de fecha 
4.4 Funciones numéricas 
4.5 Funciones de conversión 
4.6 Funciones de flujo 
43
*Expresiones integradas en el SQL 
*Pueden utilizar parámetros 
*Devuelven un resultado 
*Se pueden utilizar en el Select, Where, Order By… 
*Pueden variar en función del RDBMS 
*Anidar funciones unas como parámetros de otras 
*Ejemplo 
*Select * from socios where YEAR(ALTA)<2005 
*Siendo alta un campo que almacena una fecha, 
Year(alta), devuelve el año de esa fecha 
* 
44
*Dentro de las funciones, las de sistema son las que dan 
información del entorno 
*No suelen tener parámetros 
* Current_date, Current_time, Current_timestamp 
* MS Access: Date, Time, Now 
45 
* Fecha y hora actual 
* Información usuario 
* Current_user, user 
*Ejemplos 
* select current_date(); 
* select current_timestamp; 
* select user(); 
*
*Utilizan un texto o un campo texto cómo 
parámetro de la función 
* Número de caracteres de un texto 
* Char_length (‘texto’) 
* Quitar espacios en blanco de un texto 
* Trim (‘ texto ’)  delante y detrás 
* Trim (leading from ‘ texto ’)  delante 
* Trim (trainling from ‘ texto ‘)  detrás 
* Trim (‘*’ from ‘ **texto**’)  quita el carácter indicado 
* Posición de una cadena en otra 
* Instr(‘texto’, ‘subcadena’)  devuelve cero si no está 
46 
* 
http://dev.mysql.com/doc/refman/5.6/en/string-functions.html
*Extraer parte de un texto 
* Substring(texto, posición inicio, nº carac)  a partir 
de una posición, devuelve el número de caracteres 
que se indique 
* Left (texto, nº)  devuelve el número de 
caracteres de la parte izquierda del texto 
* Right (texto, nº)  devuelve el número de 
caracteres de la parte derecha del texto 
* Mid (texto, pos, nº) hace lo mismo que substring 
47 
*
*SELECT TRIM(RIGHT('1 - casa', LENGTH('1 - casa')- 
INSTR('1 - casa','-'))); 
* quitamos los espacios delante y detrás del texto 
que se devuelve al extraer la parte derecha del 
texto que hay a partir del “-” 
* Para saber cuantos caracteres hay que extraer 
buscamos la posición del “-” 
*¿Cómo sería para extraer lo que haya a la 
izquierda del “-”? 
48 
* Resultado =“casa” 
*
*Permiten obtener y trabajar con partes de una 
fecha 
*Current_date, current_time, current_timestamp 
*Day(fecha), month(fecha), year(fecha), 
hour(fecha), minute(fecha)  devuelven el día, el 
mes y el año de una fecha 
*Date_add(date,INTERVAL expr unit), 
Date_sub(date,INTERVAL expr unit)  suman o 
restan a una fecha días, horas, años …. 
*Datediff(fecha1, fecha2)  número de días que han 
pasado desde las dos fechas 
* SELECT DATEDIFF(CURRENT_DATE(), '2001-09-11')/365 
49 
* 
http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html
*Complementan a los operadores de cálculo 
* Power(número, potencia)  eleva un número a una potencia 
* Sqrt(número)  raíz cuadrada del número 
* Mod(dividendo,divisor)  resto de una división 
* Floor(número)  quita la parte decimal del número 
* Ceil(número) obtiene el número entero superior 
* Truncate(número,pos) quita el número de decimales 
* Round(número)  redondea a partir de 5 en el decimal al 
número superior y sino al inferior 
* SELECT FLOOR(DATEDIFF(CURRENT_DATE(), '2001-09- 
11')/365) as Edad 
50 
* Operaciones 
* Redondeo 
* 
http://dev.mysql.com/doc/refman/5.6/en/numeric-functions.html
*Permiten tratar un valor con un tipo de datos 
distinto 
*En muchos casos la conversión es implícita 
*Cast ( valor AS tipo)  convierte tipos de datos 
* SELECT SUBSTRING('120 cajas de melon',1,3)*10 As 
precio 
*Funciones de formato, no modifican el valor 
*Lower (texto) ,Upper (texto)  Muestra el texto en 
minúsculas o mayúsculas 
*Concat( texto1, texto2,…)  crea una cadena de 
texto con todos los textos 
51 
* 
http://dev.mysql.com/doc/refman/5.6/en/type-conversion.html
*En función del valor de un campo permite 
variar la información que muestra 
*Case when condicion then expresion end 
WHEN floor(datediff(current_date(), fnac)/365) >65 then 'jubilado' 
WHEN floor(datediff(current_date(), fnac)/365) >18 then ' mayor de 
edad' 
ELSE 'menor de edad' end as Situación 
FROM Socios 
* SELECT titulo, CASE disponible 
when 'S' then 'Disponible' 
when 'N' then 'No disponible' 
else 'Consultar' end as disponibilidad 
FROM test.libros; 
52 
* SELECT CASE 
* 
http://dev.mysql.com/doc/refman/5.6/en/control-flow-functions.html
*Para casos más simples se puede utilizar IF 
* IF(expresion, si se cumple, si no se cumple) 
* IFNULL(expresión, valor si es nulo) 
* SELECT IF( disponible IS NULL, 'NS', disponible) AS 
Disponibilidad FROM test.libros; 
53 
* 
equivalente 
* SELECT IFNULL(DISPONIBLE, 'NS') AS Disponibilidad 
FROM test.libros;
* 
5.1Consultas con GROUP BY 
5.2Funciones de agrupación 
5.3Filtrar datos con WHERE y HAVING 
54
*Agrupar filas de una tabla por uno o varios 
campos 
*Se utiliza para obtener datos cuantitativos de 
los datos 
*Puede ser equivalente a “distinct” 
*Sintaxis 
*SELECT campos FROM tabla GROUP BY campos 
*Ejemplo equivalente 
SELECT autor FROM libros GROUP BY autor 
SELECT DISTINCT autor FROM libros 
55 
* 
http://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html
*Realizan operaciones con las filas agrupadas 
56 
* 
*COUNT (campo): cuenta el número de filas que 
tienen valor en el campo especificado dentro del 
grupo (los nulos no los cuenta) 
* Si utilizamos COUNT * , cuenta el número de filas que 
devuelve cada grupo 
*AVG (campo): devuelve la media aritmética para el 
campo de las filas agrupadas 
*MAX (campo),MIN (campo): devuelve el valor 
máximo y mínimo del campo indicado para el grupo 
de filas 
* SUM (campo): devuelve la suma del campo 
indicado en el grupo de filas 
*Se pueden utilizar sin Group By para calcular sobre 
toda la tabla
*SELECT autor, COUNT(titulo) AS ntitulos 
FROM libros 
GROUP BY autor; 
*SELECT disponible, COUNT(disponible), MIN(codigo), 
MAX(codigo) 
FROM libros 
GROUP BY disponible; 
57 
* 
(¿qué pasa si utilizamos COUNT (*)?) 
*SELECT MIN(alta) as ‘socio más antigüo’ 
FROM socios
*Utilizamos WHERE para filtrar las filas antes de 
que se agrupen 
*Ejemplo: 
*Quita primero las filas que no tienen valor en el 
campo disponible y después las agrupa 
SELECT disponible, COUNT(disponible), MIN(codigo), 
MAX(codigo) 
FROM libros 
WHERE disponible IS NOT null 
GROUP BY disponible; 
58 
*
*Utilizar HAVING para filtrar según el resultado 
de la agrupación 
*Ejemplo 
*Mostrar los autores de los que tenemos más de 
un libro en la biblioteca 
*SELECT autor, COUNT(titulo) AS ntitulos 
FROM libros 
GROUP BY autor 
HAVING COUNT(titulo)>1; 
59 
*
* 
6.1Utilización de JOIN 
6.2Diferentes tipos de relaciones 
60
*Es la base del modelo relacional 
*Las tablas tienen que tener uno o más campos con 
datos comunes 
*Los nombres de los campos pueden ser distintos 
*La clave primaria de una tabla (Primary Key) se 
convierte en clave ajena (Foreign Key) en la tabla 
relacionada 
*Se crean índices en la FK para agilizar las consultas. 
*Permiten mantener la integridad referencial de dos 
tablas 
*Se definen en la clausula FROM los campos de unión 
61 
*
*SELECT * FROM tabla1 JOIN|LEFTJOIN |RIGHT 
JOIN tabla2 ON tabla1.campo=tabla2.campo; 
*JOIN, tipo de unión entre tablas 
*ON, los campos que están vinculados 
*Con alias para las tablas favorece la redacción del 
join 
*SELECT * FROM tabla1 alias1 JOIN|LEFTJOIN 
|RIGHT JOIN tabla2 alias2 ON 
alias1.campo=alias2.campo; 
62 
* 
http://dev.mysql.com/doc/refman/5.6/en/join.html
*SELECT * 
FROM test.libros li JOIN test.prestamos pr ON 
li.codigo=pr.codigo; 
*SELECT * 
FROM test.libros li JOIN test.prestamos pr ON 
li.codigo=pr.codigo 
WHERE left(signatura,1)='T' 
ORDER BY titulo; 
* 
63
*Es el tipo de relación por defecto 
*Muestra sólo los registros que estén 
relacionados en las dos tablas 
*Sintaxis. Se puede especificar con la palabra 
INNER JOIN o se puede dejar por defecto sólo 
con JOIN 
SELECT * 
From socios so INNER JOIN prestamos pr ON 
(so.nif=pr.nif); 
64 
*
*Muestra todos los registros de la tabla primera y 
sólo los relacionados de la segunda 
*Los campos que no tengan valor los rellena con 
nulos 
*Sintaxis. Utilizamos la palabra LEFT JOIN 
*Ejemplo. 
*Muestra todos los socios y los prestamos que 
tengan. 
SELECT * 
FROM socios so LEFT JOIN prestamos pr ON 
(so.nif=pr.nif); 
65 
*
*Muestra todos los registros de la segunda tabla 
del Join 
*Los campos que vengan de la primera tabla y 
que no tengan valor los rellena con nulos 
*Sintaxis. Utiliza la palabra RIGHT JOIN 
*Ejemplo. Muestra los prestamos y todos los 
libros, aunque no tengan prestamos 
SELECT * 
FROM prestamos pr RIGHT JOIN libros li ON 
(pr.codigo=li.codigo); 
66
*Una fila de una tabla coincide con una fila de la 
tabla relacionada. 
*Se utiliza para desdoblar tablas con muchos campos 
en dos 
67 
*Relaciones 1:1 
Ejemplo: Cada socio 
tiene sólo una 
dirección 
*
*Relaciones 1:N 
*Una fila de una tabla coincide con varias de la 
tabla relacionada. 
*Es la relación más común 
68 
Ejemplo: un socio 
puede tener varios 
prestamos 
*
* Varias filas de una tabla se relacionan con varias filas de 
la tabla relacionada 
* Hay que crear una tamba intermedia para conseguir 
relaciones 1:N 
Ejemplo: un actor participa en varias películas y en una 
película intervienen varios actores 
69 
*Relaciones M:N 
*
*Crea un diagrama EER básico con las tablas, claves 
primarias, claves ajenas y sus relaciones 
* Vamos a crear una pequeña base de datos para guardar 
las películas que nos gustan. 
* Tenemos la películas almacenadas en diferentes soportes, 
por ejemplo DVD, CD pero quiero tener la posibilidad de 
crear nuevos tipos de soportes 
* Por otro lado quiero tener catalogadas las películas por 
género. 
* Los actores tienen su propia ficha y en una película 
participan varios actores y un mismo actor interviene en 
varias películas 
* Las películas también pueden tener varios directores y 
por supuesto, los directores pueden dirigir varias películas 
70 
*
* 
7.1Añadir nuevos registros 
7.2Modificar datos de registros existentes 
7.3Eliminar registros 
7.4 Integrar consultas en procedimientos 
71
*Introducir nuevos datos en una tabla 
*Sintaxis 
*INSERT INTO tabla [(lista campos)] VALUES (lista de 
valores) 
* Tabla, es el nombre de la tabla a la que queremos 
añadir valores 
* Lista de campos, entre paréntesis y separados por 
comas, los nombres de los campos donde queremos 
insertar información. Si queremos insertar información 
en todos los campos no hace falta especificarlos 
* Lista de valores, entre paréntesis y separados por 
comas, los valores que queremos insertar en el mismo 
orden que la lista de campos. 
72 
*
*Crear un registro sin especificar los campos 
* INSERT INTO libros VALUES( 12, ‘G SHA inc', ‘La incógnita de 
Newton', ‘Shaw, Catherine', 'S'); 
*Crear un registro especificando todos los campos 
* INSERT INTO libros (codigo,signatura, titulo, autor, 
disponible)VALUES( 12, 'G SHA inc', 'La incógnita de Newton', 
'Shaw, Catherine', 'S'); 
*Crear un registro introduciendo parte de los campso  los 
no especificados asigna Null 
* INSERT INTO libros (codigo,signatura, titulo, autor)VALUES( 12, 
'G SHA inc', 'La incógnita de Newton', 'Shaw, Catherine'); 
73 
*
*Hay que tener en cuenta las claves primarias y 
las claves ajenas. 
*Se genera error si intentamos introducir un 
registro con la misma clave 
*También se genera si intentamos introducir un 
registro con un valor en la clave ajena que no 
existe 
*INSERT INTO prestamos VALUES(5,'62877137F' 
(suponemos que el libro de código 33 no existe) 
74 
,33,current_date); 
*
*Podemos insertar en una tabla valores resultantes 
de una consulta siempre que sean del tipo de datos 
adecuado 
*Para hacer una copia de datos 
INSERT INTO disponibles 
SELECT codigo, signatura FROM libros WHERE 
disponible='S'; 
*Para introducir un cálculo 
INSERT INTO libros 
SELECT max(codigo) +1, 'T CHA exec', 'Excel 2013', 
'Charte, Francisco','S‘ FROM libros; 
75 
*
*Para actualizar datos existentes de una tabla 
utilizamos la clausula UPDATE 
*Sintaxis 
*UPDATE tabla 
SET campo=valor, campo=valor 
[WHERE condición] 
*Update Tabla, es de la que queremos cambiar 
información 
*Campo=valor, hay que especificar para cada campo 
que valor queremos actualizar. Si no se especifica 
el campo, este queda sin modificar 
*Where Condición, si no se especifica condición se 
actualiza toda la tabla 
76 
*
*Actualizar todos los apellidos a mayúsculas 
update socios 
set apellidos=upper(apellidos); 
update socios 
set apellidos=upper(apellidos) 
where nif='23727319S'; 
update socios 
set apellidos=upper(apellidos) 
where cp like '2302%'; 
(pueden dar aviso del motor de bases de datos por ser muy insegura una 
actualización múltiple) 
77 
*Actualiza sólo un registro 
*Actualizar varios registros 
*
*Permite especificar una o más instrucciones dentro 
de una transacción 
*Una transacción se puede deshacer después de 
realizarse 
*Comandos 
*Start Transaction, comienzan las instrucciones de la 
transacción 
*Commit, almacena permanentemente los cambios 
*Rollback, vuelve los datos a como estaban en la 
base antes de la instrucción Start Transaction 
*Set, establece el comportamiento por defecto 
78 
* 
http://dev.mysql.com/doc/refman/5.7/en/commit.html
*Ejecuta las instrucciones hasta el rollback o commit 
* START TRANSACTION; Inicia la transacción 
* UPDATE socios  Actualiza los datos 
SET apellidos=Upper(apellidos) 
WHERE cp LIKE '2302%‘; 
* SELECT * FROM socios;  Muestra los nuevos datos 
* ROLLBACK;  Deshace los cambios 
* SELECT * FROM socios;  Muestra los datos anteriores 
79 
*
*Borramos todos los datos de una fila, no sólo unos 
campos. 
*Si eliminamos todas las filas de una tabla, sigue 
quedando la estructura para insertar nuevos registros 
*Para borrar una tabla y sus datos tenemos que utilizar 
DROP Table 
*Sintaxis 
*DELETE FROM tabla WHERE condición 
* Tabla, es de la que se quiera eliminar el registro 
* Where, todas las filas que cumplan la condición son 
eliminadas 
* Si no se utiliza Where elimina todos los datos de la tabla 
80 
*
*Eliminar los socios que se han dado de alta en 
un mes 
DELETE FROM socios 
WHERE MONTH(alta)=7; 
*Eliminar todos los prestamos 
DELETE FROM prestamos; 
81 
*
*Encapsula varias sentencias SQL 
*Podemos utilizar parámetros 
*Se ejecuta con CALL 
*Sintaxis Creación procedimiento 
*CREATE PROCEDURE nombre (parámetros) 
82 
*Procedimiento Almacenado 
BEGIN 
* 
Instrucciones SQL 
END 
* Nombre: como se va a guardar en la base de datos 
* Parámetros: lista de campos con tipo, ejemplo (p_id int) 
* Instrucciones: código SQL válido 
http://dev.mysql.com/doc/refman/5.6/en/create-procedure.html
*Utilizar CALL para ejecutar un procedimiento 
almacenado creado con CREATE PROCEDURE 
*Sintaxis 
*CALL nombre-proc (valores); 
* Nombre-proc, es el nombre con el que se creó el 
procedimiento 
* Valores, si el procedimiento tiene parámetros hay 
que indicar entre paréntesis los valores 
83 
* 
http://dev.mysql.com/doc/refman/5.6/en/call.html
*Inserta una nueva reserva y actualiza la 
disponibilidad 
CREATE PROCEDURE `AltaPrestamo`(p_id int , p_nif 
char(9), p_codigo int) 
BEGIN 
INSERT INTO prestamos 
values (p_id,p_nif,p_codigo, current_date); 
UPDATE libros 
SET disponible = 'N' 
WHERE codigo = p_codigo; 
84 
* 
END
*Llama al procedimiento ‘AltaPrestamo’ 
*CALL test.AltaPrestamo(17, '62877137F', 13); 
*Llama al procedimiento, utilizando variables 
*SET @p_id = 17; 
SET @p_nif = '62877137F'; 
SET @p_codigo = 13; 
CALL test.AltaPrestamo(@p_id, @p_nif, 
@p_codigo); 
85 
*
86 
* 
*Insertar con transacciones 
* Utilizar función integrada Row_count() para saber cuantas 
filas se han actualizado 
* Utilizar IF… Then.. End para decidir el ROLLBACK 
…. 
START TRANSACTION; 
INSERT INTO prestamos 
VALUES (p_id,p_nif,p_codigo, current_date); 
UPDATE libros SET disponible = 'N' WHERE codigo 
= p_codigo AND disponible='S'; 
IF (select row_count() ) =0 THEN ROLLBACK; 
end if; 
COMMIT; 
…. 
http://dev.mysql.com/doc/refman/5.6/en/if.html 
http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_row-count
* 
8.1 Subconsultas 
8.2 Consultas con tablas derivadas 
8.3 Consultas de Unión 
87
*Ejecutamos un Select dentro de otro Select 
*Suelen ejecutarse para seleccionar o para filtrar 
información 
*Múltiples operadores 
* = si la subconsulta devuelve un valor 
* IN si la subconsulta devuelve varias filas 
*Ejemplo “=“ 
*Muestra los datos del último socio que se ha dado 
de alta 
*SELECT Nif, nombre, apellidos 
FROM socios 
WHERE alta = (SELECT max(alta) FROM socios); 
* 
http://dev.mysql.com/doc/refman/5.6/en/subqueries.html 
88
*Si la subconsulta puede devolver varios 
resultados 
*Muestra el nombre de los socios que tienen 
prestamos o que vivan cerca de los que tienen 
prestamos (tienen el mismo CP). 
*SELECT Nombre, apellidos 
FROM socios 
WHERE cp IN (SELECT cp FROM prestamos pr JOIN 
socios so ON pr.nif=so.nif); 
89 
*
*Son tablas virtuales que se utilizan en consultas 
con tablas reales 
*No se definen en la estructura de la base de 
datos. 
*Se crean de forma automática a partir de un 
Select 
*Se utilizan para cruzar datos agrupados con 
datos sin agrupar. 
*Se definen en el FROM 
*Utilizar un alias para el JOIN 
90 
*
*Importante el alias de la subconsulta (maxpr) para 
definir el JOIN. 
*Si no se define en el ON, hace un producto 
cartesiano de las dos tablas 
*Mostrar la fecha del último préstamo de cada socio 
*SELECT nombre,apellidos,Ultprestamo 
FROM socios so JOIN (SELECT MAX(prestamo) as 
Ultprestamo, nif FROM prestamos GROUP BY nif) 
maxpr ON so.nif=maxpr.nif; 
91 
*
*Muestra “select” de datos independientes con la 
palabra UNION en medio. 
*Tienen que tener el mismo número y tipo de 
columnas 
*Se pueden unir varios “select” 
*Sintaxis 
*SELECT campos FROM tabla 
UNION [ALL] 
SELECT campos FROM tabla 
* UNION muestra sólo las filas que no se repitan 
* UNION ALL muestra todos los datos de las dos consultas 
92 
*
*Muestra los NIF de los socios actuales que tienen 
prestamos ahora y el NIF de los que ya están de baja. 
* Si un socio tiene más de un préstamo sólo aparece una vez 
* SELECT nif FROM prestamos 
UNION 
SELECT nif FROM prestamosexsocios; 
* Si un socio tiene más de un préstamo aparece repetido más 
de una vez 
* SELECT nif FROM prestamos 
UNION ALL 
SELECT nif FROM prestamosexsocios; 
93 
*

Saca partido a tus bases de datos

  • 1.
    * Javier RoigGarro dunbit@hotmail.com dunbit.blogspot.com @Dunbit
  • 2.
    *Bases de datosrelacionares, conceptos *1. Creación de Tablas *2. Sintaxis básica de Select *3. Filtrar datos con Where *4. Funciones integradas *5. Agrupar y totalizar columnas *6. Consultas de varias tablas *7. Consultas de inserción, actualización y eliminación *8. Consultas avanzadas * 2
  • 3.
    * 0.1. Queson las bases de datos relacionares 0.2. Conceptos de creación de tablas 0.3. Tipos básicos de datos 0.4. Base de datos 3
  • 4.
    *SQL  StructuredQuery Language *Instrucciones que forman Sentencias *Sigue una estructura determinada *Facilita comunicación con bases de datos *RDBMS  Relational Database Managment System *Programa que gestiona la información *Local  Escritorio  Ejemplo MS. Access *Servidor Equipo independiente  Ejemplo Oracle * 4
  • 5.
  • 6.
    *Base de datossimple  almacén de información  Ej. Excel *Base de datos relacionales  almacena información en estructuras relacionadas lógicamente *Catalogo de datos  información de la estructura  Tablas de sistema *Componentes básicos *Tablas, filas, columnas *Relaciones, identificadores, índices * 6
  • 7.
  • 8.
    * * Tablasformadas por * Filas (tuplas) y Columnas (campos) * Contiene información coherente * Todas las filas tienen la misma estructura pero distinta información * Relaciones * Sólo entre campos comunes de las tablas * Identificadores * Cada campo se tiene que poder identificar de forma única * Tabla + clave primaria + campo * Clave primaria (PK, Primary Key) identifica una fila * Clave Externa (FK, Foreing Key)  identifica una fila de otra tabla 8
  • 9.
    * Reglas paraunificar estructura base de datos * Reducir redundancia de datos * Simplificar dependencias *Primera forma normal * Cada campo contiene información indivisible * No tiene que haber grupos de valores repetidos *Segunda forma normal * Tiene que tener una clave primaria única que identifique a toda la fila *Tercera forma normal * No tiene que haber dependencias transitivas entre tablas * 9
  • 10.
    * Cada campocontiene información indivisible ©Manual Imprescindible SQL 10
  • 11.
    * No tieneque haber grupos de valores repetidos ©Manual Imprescindible SQL 11
  • 12.
    *Integridad de lainformación * Definir tipo, longitud, campo obligatorio, rango de valores… *Tipos básicos * Boolean (TinyInt): si o no * Char: texto de longitud fija * Varchar: texto de longitud variable * Int: número entero * Float: número con decimales * Date: fecha * Binary: números binarios * 12
  • 13.
    Tenemos clientes quedisponen de varios almacenes y necesitamos guardar los datos generales, la dirección principal, la dirección de facturación si es distinta y la dirección de los diferentes almacenes. *Crear en papel la estructura básica de las tablas con sus campos y relaciones. *Identificar los tipos básicos de los datos * 13
  • 14.
    *Configuración en mododesarrollador *Recursos instalación *Instalador de la Base de datos * http://dev.mysql.com/downloads/windows/installer/ *Entorno de trabajo mySQL WorkBench * http://dev.mysql.com/downloads/workbench *Prerrequisitos * Microsoft .NET Framework 4 Client Profile * Visual C++ Redistributable for Visual Studio 2013 * 14
  • 15.
    *Funciones *Administración delservidor *Editor SQL *Editor de diagramas de base de datos *Análisis de rendimiento *Entorno *Dividido en paneles y fichas *Archivo, Edición, Vista, Consulta, base de * datos, servidor, herramientas, código 15
  • 16.
    * 1.1. Sintaxisbásica 1.2. Tipos de datos MySQL 1.3. Crear tablas en WorkBench 17
  • 17.
    *CREATE [ TEMPORARY] TABLE [ IF NOT EXISTS ] nombre_tbl (definición_campos,...) *Temporary  crea tabla temporal *If not exist  evita el error si existe la tabla *Constraint  clave primaria CREATE TABLE libros ( codigo INTEGER NOT NULL, signatura CHAR(10) NOT NULL, titulo VARCHAR(40), autor VARCHAR(40), disponible CHAR(1), CONSTRAINT PK_libros PRIMARY KEY (codigo)); * 18
  • 18.
    *Sintaxis definición campo Nombre_campo Tipo_Datos [ NOT NULL | NULL ] [ DEFAULT default_value] [ AUTO _ INCREMENT ] [ UNIQUE [ KEY ] | [ PRIMARY ] KEY ] [ COMMENT 'string'] *Not Null, Null: acepta nulos *Default: valor por defecto *Auto_increment: autonuméricos *Unique: valor único, clave primaria *Comment: comentarios * 19
  • 19.
    Documentación on line: http://dev.mysql.com/doc/refman/5.7/en/data-types.html * * Tipos Numéricos Enteros * BIT * TINYINT * SMALLINT * MEDIUMINT * INT * INTEGER * BIGINT * Tipos Numéricos Decimales * DECIMAL * NUMERIC * Tipos Numéricos Coma flotante * REAL * DOUBLE * FLOAT * Tipos Fecha y Hora * DATE * TIME * TIMESTAMP * DATETIME * YEAR * Tipos de datos de Texto * CHAR * VARCHAR * BINARY * VARBINARY * TINYBLOB * BLOB * MEDIUMBLOB * LONGBLOB * TINYTEXT * TEXT * MEDIUMTEXT * LONGTEXT 20
  • 20.
    Documentación sobre eleditor http://dev.mysql.com/doc/workbench/en/wb-table-editor.html * 21
  • 21.
    * 2.0 Sintaxisbásica 2.1. Alias y campos calculados 2.2. Ordenación de los datos 22
  • 22.
    *Instrucción básica *SELECTexpr_select FROM tabla * Expr_select: información que se pueden seleccionar * From tabla: tabla de dónde mostrar los datos *Expresiones ** :Todos los campos de la tabla *Nom_col1, nom_col2: sólo las columnas especificadas y en la posición que se indiquen *Distinct, sólo valores distintos * 23
  • 23.
    *select * fromlibros *select autor, titulo from libros *select distinct autor from libros * 24
  • 24.
    *Alias permite identificarmejor una columna *Cada columna puede tener un alias *No se puede utilizar con el * *Si el alias tiene espacios en blanco tiene que ir entre comillas simples ‘alias con blancos’ *Sintaxis *SELECT nom_col AS alias FROM tabla * 25
  • 25.
    *Campos calculados sonlos que no están en la tabla *Añadir columnas *Con valor fijo *Con una función independiente *Con operaciones aritméticas de otros campos *Con operaciones de texto de otros campos *Cálculos de fechas * 26
  • 26.
    * SELECT prestamoas 'F. Prestamo' FROM test.prestamos; * SELECT titulo, autor , 'Consultar Disponibilidad' as Disponible from libros * SELECT *, current_date() as 'fecha actual' FROM test.prestamos; * SELECT codigo, codigo + 100, codigo / 2, codigo *3 FROM test.prestamos; * SELECT substring(titulo,1,3) as Comienzo , titulo from libros; * SELECT alta, current_date(), (to_days(current_date())-to_days(alta))/365 * as Antiguedad FROM test.socios; 27
  • 27.
    * * Sintaxis * SELECT expr_selec FROM tabla ORDER BY expr_orden [ASC|DESC] * Expr_orden: uno o más campos por los que queremos ordenar el resultado. * ASC o DESC: orden ascendente o descendente. Por defecto es ascendente * Los campos de ordenación pueden no estar presentes en la selección * Si hay varias columnas, se organiza la información en función de la posición de los campos de izquierda a derecha * Si tenemos columnas calculadas en el select también podemos usarlas en el 28
  • 28.
    * select *from libros order by autor * select * from libros order by autor, titulo * select * from libros order by disponible desc, autor, titulo * select substring(signatura,1,1),signatura,titulo from libros order by 1 * select substring(signatura,1,1) as indice,signatura,titulo from libros order by indice * 29
  • 29.
    * 3.1. Filtrossimples 3.2. Otros filtros con el operador LIKE 3.3. Filtrar datos NULL 3.4. Usar operadores AND y OR 3.5 Almacenar consultas en Vistas 30
  • 30.
    * *Sintáxis *selectexpr_select from tabla where expr_filtro * Expr_filtro: condición que se tiene que cumplir para seleccionar la fila (TRUE) * Esta expresión puede devolver TRUE/FALSE/NULL *Operadores *=, <>, >, <, >=, =< *Tener en cuenta los tipos de datos *Los textos van entre comillas simples ‘’ *IN se utiliza para listas 31
  • 31.
    *select * fromlibros where disponible='S‘ *SELECT * FROM socios WHERE cp IN (23001,23021) *SELECT * FROM socios WHERE cp >'23008' * 32
  • 32.
    *Buscar por patronesy no por coincidencias exactas *Sintaxis *SELECT expr_select FROM tabla where campo like patrón * Patrón, contiene la información que se busca junto con caracteres comodín ‘%’ o ‘_’ * % identifica a un número indeterminado de caracteres * _ identifica a un único caracter. * MS Access utiliza ‘*’ y ‘?’ * Se pueden usar con NOT * 33
  • 33.
    *SELECT * FROMtest.libros WHERE titulo LIKE 'El%'; *SELECT * FROM test.libros WHERE titulo LIKE '%del%‘ *SELECT * FROM test.libros WHERE titulo LIKE '%s‘ *SELECT * FROM test.socios WHERE cp LIKE '230_1'; *SELECT * FROM test.socios WHERE cp NOT LIKE '230_1'; * 34
  • 34.
    *Libros que eltítulo empiecen por ‘El’ *SELECT * FROM libros WHERE titulo LIKE 'El%'; *Libros que el título contenga ‘del’ *SELECT * FROM libros WHERE titulo LIKE '%del%‘ *Libros que el título acaba en ‘s’ *SELECT * FROM libros WHERE titulo LIKE '%s‘ *Socios con el código postal que empiece por 230 y acabe en 1 *SELECT * FROM socios WHERE cp LIKE '230_1'; *Socios con el código postal que no empiece por 230 ni acabe por 1 *SELECT * FROM socios WHERE cp NOT LIKE '230_1'; * 35
  • 35.
    *Null no tieneningún valor *Sintaxis *SELECT expr_selec FROM tabla WHERE campo IS NULL * IS NULL, cuando el campo no tiene valor asignado * IS NOT NULL, cuando el campo tiene algún valor asignado * 36
  • 36.
    *SELECT * FROMlibros WHERE disponible IS null *SELECT * FROM libros WHERE disponible IS NOT null * 37
  • 37.
    *Utilizan para filtroscompuestos por varias expresiones *Sintaxis *SELECT expr_select FROM tabla WHERE expr_filtro AND | OR expr_filtro * * AND: se tienen que cumplir las dos expresiones * OR: se tiene que cumplir una de las dos *Operador NOT *Invierte el resultado de la expresión *Uso de paréntesis *Agrupa expresiones a evaluar 38
  • 38.
    * select *from libros where disponible='S' and autor='Charte, Francisco’ * vs * select * from libros where disponible='S' or autor='Charte, Francisco’ * select * from libros where disponible='S' and not(autor='Charte, Francisco') * select * from libros where disponible='N' and autor='Charte, Francisco' or autor='Li‘ vs * select * from libros where disponible='N' and (autor='Charte, Francisco' or autor='Li') 39
  • 39.
    *Consulta SQL almacenadaque se puede llamara desde otra consulta. *No almacena datos, sólo la consulta *Se puede tratar como una tabla para otras consultas *Se crea el objeto en el schema seleccionado *Sintaxis *CREATE OR REPLACE VIEW nombre AS sentencia sql * Nombre: es el nombre de la vista * Sentencia sql: consulta sql que queremos * almacenar 40
  • 40.
    *Utilización *Se puedenutilizar en cualquier SELECT *Devuelve la información en formato tabla *La información está actualizada *Modificar una vista *ALTER VIEW nombre AS consulta *Desde WorkBench  llave inglesa *Eliminar vista *DROP VIEW nombre *Desde WorkBench  botón derecho * 41
  • 41.
    * 42 *Opciones avanzadas: * Algoritmo: Como procesa MySQL la vista * Merge (sustituye los campos), Temptable (tabla temporal), undefined(automático) http://dev.mysql.com/doc/refman/5.7/en/view-algorithms.html * Definer, SQL Security: Cuenta que se va a utilizar para crear y para consultar. * Recomendable utilizar INVOKER (solo los usuarios con permisos) http://dev.mysql.com/doc/refman/5.0/en/stored-programs-security.html CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY invoker VIEW `listasocios` AS SELECT `socios`.`apellidos` AS `apellidos`, `socios`.`nombre` AS `nombre`, `socios`.`alta` AS `alta` FROM `socios`
  • 42.
    * 4.1 Queson las funciones 4.2 Principales funciones de texto 4.3 Principales funciones de fecha 4.4 Funciones numéricas 4.5 Funciones de conversión 4.6 Funciones de flujo 43
  • 43.
    *Expresiones integradas enel SQL *Pueden utilizar parámetros *Devuelven un resultado *Se pueden utilizar en el Select, Where, Order By… *Pueden variar en función del RDBMS *Anidar funciones unas como parámetros de otras *Ejemplo *Select * from socios where YEAR(ALTA)<2005 *Siendo alta un campo que almacena una fecha, Year(alta), devuelve el año de esa fecha * 44
  • 44.
    *Dentro de lasfunciones, las de sistema son las que dan información del entorno *No suelen tener parámetros * Current_date, Current_time, Current_timestamp * MS Access: Date, Time, Now 45 * Fecha y hora actual * Información usuario * Current_user, user *Ejemplos * select current_date(); * select current_timestamp; * select user(); *
  • 45.
    *Utilizan un textoo un campo texto cómo parámetro de la función * Número de caracteres de un texto * Char_length (‘texto’) * Quitar espacios en blanco de un texto * Trim (‘ texto ’)  delante y detrás * Trim (leading from ‘ texto ’)  delante * Trim (trainling from ‘ texto ‘)  detrás * Trim (‘*’ from ‘ **texto**’)  quita el carácter indicado * Posición de una cadena en otra * Instr(‘texto’, ‘subcadena’)  devuelve cero si no está 46 * http://dev.mysql.com/doc/refman/5.6/en/string-functions.html
  • 46.
    *Extraer parte deun texto * Substring(texto, posición inicio, nº carac)  a partir de una posición, devuelve el número de caracteres que se indique * Left (texto, nº)  devuelve el número de caracteres de la parte izquierda del texto * Right (texto, nº)  devuelve el número de caracteres de la parte derecha del texto * Mid (texto, pos, nº) hace lo mismo que substring 47 *
  • 47.
    *SELECT TRIM(RIGHT('1 -casa', LENGTH('1 - casa')- INSTR('1 - casa','-'))); * quitamos los espacios delante y detrás del texto que se devuelve al extraer la parte derecha del texto que hay a partir del “-” * Para saber cuantos caracteres hay que extraer buscamos la posición del “-” *¿Cómo sería para extraer lo que haya a la izquierda del “-”? 48 * Resultado =“casa” *
  • 48.
    *Permiten obtener ytrabajar con partes de una fecha *Current_date, current_time, current_timestamp *Day(fecha), month(fecha), year(fecha), hour(fecha), minute(fecha)  devuelven el día, el mes y el año de una fecha *Date_add(date,INTERVAL expr unit), Date_sub(date,INTERVAL expr unit)  suman o restan a una fecha días, horas, años …. *Datediff(fecha1, fecha2)  número de días que han pasado desde las dos fechas * SELECT DATEDIFF(CURRENT_DATE(), '2001-09-11')/365 49 * http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html
  • 49.
    *Complementan a losoperadores de cálculo * Power(número, potencia)  eleva un número a una potencia * Sqrt(número)  raíz cuadrada del número * Mod(dividendo,divisor)  resto de una división * Floor(número)  quita la parte decimal del número * Ceil(número) obtiene el número entero superior * Truncate(número,pos) quita el número de decimales * Round(número)  redondea a partir de 5 en el decimal al número superior y sino al inferior * SELECT FLOOR(DATEDIFF(CURRENT_DATE(), '2001-09- 11')/365) as Edad 50 * Operaciones * Redondeo * http://dev.mysql.com/doc/refman/5.6/en/numeric-functions.html
  • 50.
    *Permiten tratar unvalor con un tipo de datos distinto *En muchos casos la conversión es implícita *Cast ( valor AS tipo)  convierte tipos de datos * SELECT SUBSTRING('120 cajas de melon',1,3)*10 As precio *Funciones de formato, no modifican el valor *Lower (texto) ,Upper (texto)  Muestra el texto en minúsculas o mayúsculas *Concat( texto1, texto2,…)  crea una cadena de texto con todos los textos 51 * http://dev.mysql.com/doc/refman/5.6/en/type-conversion.html
  • 51.
    *En función delvalor de un campo permite variar la información que muestra *Case when condicion then expresion end WHEN floor(datediff(current_date(), fnac)/365) >65 then 'jubilado' WHEN floor(datediff(current_date(), fnac)/365) >18 then ' mayor de edad' ELSE 'menor de edad' end as Situación FROM Socios * SELECT titulo, CASE disponible when 'S' then 'Disponible' when 'N' then 'No disponible' else 'Consultar' end as disponibilidad FROM test.libros; 52 * SELECT CASE * http://dev.mysql.com/doc/refman/5.6/en/control-flow-functions.html
  • 52.
    *Para casos mássimples se puede utilizar IF * IF(expresion, si se cumple, si no se cumple) * IFNULL(expresión, valor si es nulo) * SELECT IF( disponible IS NULL, 'NS', disponible) AS Disponibilidad FROM test.libros; 53 * equivalente * SELECT IFNULL(DISPONIBLE, 'NS') AS Disponibilidad FROM test.libros;
  • 53.
    * 5.1Consultas conGROUP BY 5.2Funciones de agrupación 5.3Filtrar datos con WHERE y HAVING 54
  • 54.
    *Agrupar filas deuna tabla por uno o varios campos *Se utiliza para obtener datos cuantitativos de los datos *Puede ser equivalente a “distinct” *Sintaxis *SELECT campos FROM tabla GROUP BY campos *Ejemplo equivalente SELECT autor FROM libros GROUP BY autor SELECT DISTINCT autor FROM libros 55 * http://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html
  • 55.
    *Realizan operaciones conlas filas agrupadas 56 * *COUNT (campo): cuenta el número de filas que tienen valor en el campo especificado dentro del grupo (los nulos no los cuenta) * Si utilizamos COUNT * , cuenta el número de filas que devuelve cada grupo *AVG (campo): devuelve la media aritmética para el campo de las filas agrupadas *MAX (campo),MIN (campo): devuelve el valor máximo y mínimo del campo indicado para el grupo de filas * SUM (campo): devuelve la suma del campo indicado en el grupo de filas *Se pueden utilizar sin Group By para calcular sobre toda la tabla
  • 56.
    *SELECT autor, COUNT(titulo)AS ntitulos FROM libros GROUP BY autor; *SELECT disponible, COUNT(disponible), MIN(codigo), MAX(codigo) FROM libros GROUP BY disponible; 57 * (¿qué pasa si utilizamos COUNT (*)?) *SELECT MIN(alta) as ‘socio más antigüo’ FROM socios
  • 57.
    *Utilizamos WHERE parafiltrar las filas antes de que se agrupen *Ejemplo: *Quita primero las filas que no tienen valor en el campo disponible y después las agrupa SELECT disponible, COUNT(disponible), MIN(codigo), MAX(codigo) FROM libros WHERE disponible IS NOT null GROUP BY disponible; 58 *
  • 58.
    *Utilizar HAVING parafiltrar según el resultado de la agrupación *Ejemplo *Mostrar los autores de los que tenemos más de un libro en la biblioteca *SELECT autor, COUNT(titulo) AS ntitulos FROM libros GROUP BY autor HAVING COUNT(titulo)>1; 59 *
  • 59.
    * 6.1Utilización deJOIN 6.2Diferentes tipos de relaciones 60
  • 60.
    *Es la basedel modelo relacional *Las tablas tienen que tener uno o más campos con datos comunes *Los nombres de los campos pueden ser distintos *La clave primaria de una tabla (Primary Key) se convierte en clave ajena (Foreign Key) en la tabla relacionada *Se crean índices en la FK para agilizar las consultas. *Permiten mantener la integridad referencial de dos tablas *Se definen en la clausula FROM los campos de unión 61 *
  • 61.
    *SELECT * FROMtabla1 JOIN|LEFTJOIN |RIGHT JOIN tabla2 ON tabla1.campo=tabla2.campo; *JOIN, tipo de unión entre tablas *ON, los campos que están vinculados *Con alias para las tablas favorece la redacción del join *SELECT * FROM tabla1 alias1 JOIN|LEFTJOIN |RIGHT JOIN tabla2 alias2 ON alias1.campo=alias2.campo; 62 * http://dev.mysql.com/doc/refman/5.6/en/join.html
  • 62.
    *SELECT * FROMtest.libros li JOIN test.prestamos pr ON li.codigo=pr.codigo; *SELECT * FROM test.libros li JOIN test.prestamos pr ON li.codigo=pr.codigo WHERE left(signatura,1)='T' ORDER BY titulo; * 63
  • 63.
    *Es el tipode relación por defecto *Muestra sólo los registros que estén relacionados en las dos tablas *Sintaxis. Se puede especificar con la palabra INNER JOIN o se puede dejar por defecto sólo con JOIN SELECT * From socios so INNER JOIN prestamos pr ON (so.nif=pr.nif); 64 *
  • 64.
    *Muestra todos losregistros de la tabla primera y sólo los relacionados de la segunda *Los campos que no tengan valor los rellena con nulos *Sintaxis. Utilizamos la palabra LEFT JOIN *Ejemplo. *Muestra todos los socios y los prestamos que tengan. SELECT * FROM socios so LEFT JOIN prestamos pr ON (so.nif=pr.nif); 65 *
  • 65.
    *Muestra todos losregistros de la segunda tabla del Join *Los campos que vengan de la primera tabla y que no tengan valor los rellena con nulos *Sintaxis. Utiliza la palabra RIGHT JOIN *Ejemplo. Muestra los prestamos y todos los libros, aunque no tengan prestamos SELECT * FROM prestamos pr RIGHT JOIN libros li ON (pr.codigo=li.codigo); 66
  • 66.
    *Una fila deuna tabla coincide con una fila de la tabla relacionada. *Se utiliza para desdoblar tablas con muchos campos en dos 67 *Relaciones 1:1 Ejemplo: Cada socio tiene sólo una dirección *
  • 67.
    *Relaciones 1:N *Unafila de una tabla coincide con varias de la tabla relacionada. *Es la relación más común 68 Ejemplo: un socio puede tener varios prestamos *
  • 68.
    * Varias filasde una tabla se relacionan con varias filas de la tabla relacionada * Hay que crear una tamba intermedia para conseguir relaciones 1:N Ejemplo: un actor participa en varias películas y en una película intervienen varios actores 69 *Relaciones M:N *
  • 69.
    *Crea un diagramaEER básico con las tablas, claves primarias, claves ajenas y sus relaciones * Vamos a crear una pequeña base de datos para guardar las películas que nos gustan. * Tenemos la películas almacenadas en diferentes soportes, por ejemplo DVD, CD pero quiero tener la posibilidad de crear nuevos tipos de soportes * Por otro lado quiero tener catalogadas las películas por género. * Los actores tienen su propia ficha y en una película participan varios actores y un mismo actor interviene en varias películas * Las películas también pueden tener varios directores y por supuesto, los directores pueden dirigir varias películas 70 *
  • 70.
    * 7.1Añadir nuevosregistros 7.2Modificar datos de registros existentes 7.3Eliminar registros 7.4 Integrar consultas en procedimientos 71
  • 71.
    *Introducir nuevos datosen una tabla *Sintaxis *INSERT INTO tabla [(lista campos)] VALUES (lista de valores) * Tabla, es el nombre de la tabla a la que queremos añadir valores * Lista de campos, entre paréntesis y separados por comas, los nombres de los campos donde queremos insertar información. Si queremos insertar información en todos los campos no hace falta especificarlos * Lista de valores, entre paréntesis y separados por comas, los valores que queremos insertar en el mismo orden que la lista de campos. 72 *
  • 72.
    *Crear un registrosin especificar los campos * INSERT INTO libros VALUES( 12, ‘G SHA inc', ‘La incógnita de Newton', ‘Shaw, Catherine', 'S'); *Crear un registro especificando todos los campos * INSERT INTO libros (codigo,signatura, titulo, autor, disponible)VALUES( 12, 'G SHA inc', 'La incógnita de Newton', 'Shaw, Catherine', 'S'); *Crear un registro introduciendo parte de los campso  los no especificados asigna Null * INSERT INTO libros (codigo,signatura, titulo, autor)VALUES( 12, 'G SHA inc', 'La incógnita de Newton', 'Shaw, Catherine'); 73 *
  • 73.
    *Hay que teneren cuenta las claves primarias y las claves ajenas. *Se genera error si intentamos introducir un registro con la misma clave *También se genera si intentamos introducir un registro con un valor en la clave ajena que no existe *INSERT INTO prestamos VALUES(5,'62877137F' (suponemos que el libro de código 33 no existe) 74 ,33,current_date); *
  • 74.
    *Podemos insertar enuna tabla valores resultantes de una consulta siempre que sean del tipo de datos adecuado *Para hacer una copia de datos INSERT INTO disponibles SELECT codigo, signatura FROM libros WHERE disponible='S'; *Para introducir un cálculo INSERT INTO libros SELECT max(codigo) +1, 'T CHA exec', 'Excel 2013', 'Charte, Francisco','S‘ FROM libros; 75 *
  • 75.
    *Para actualizar datosexistentes de una tabla utilizamos la clausula UPDATE *Sintaxis *UPDATE tabla SET campo=valor, campo=valor [WHERE condición] *Update Tabla, es de la que queremos cambiar información *Campo=valor, hay que especificar para cada campo que valor queremos actualizar. Si no se especifica el campo, este queda sin modificar *Where Condición, si no se especifica condición se actualiza toda la tabla 76 *
  • 76.
    *Actualizar todos losapellidos a mayúsculas update socios set apellidos=upper(apellidos); update socios set apellidos=upper(apellidos) where nif='23727319S'; update socios set apellidos=upper(apellidos) where cp like '2302%'; (pueden dar aviso del motor de bases de datos por ser muy insegura una actualización múltiple) 77 *Actualiza sólo un registro *Actualizar varios registros *
  • 77.
    *Permite especificar unao más instrucciones dentro de una transacción *Una transacción se puede deshacer después de realizarse *Comandos *Start Transaction, comienzan las instrucciones de la transacción *Commit, almacena permanentemente los cambios *Rollback, vuelve los datos a como estaban en la base antes de la instrucción Start Transaction *Set, establece el comportamiento por defecto 78 * http://dev.mysql.com/doc/refman/5.7/en/commit.html
  • 78.
    *Ejecuta las instruccioneshasta el rollback o commit * START TRANSACTION; Inicia la transacción * UPDATE socios  Actualiza los datos SET apellidos=Upper(apellidos) WHERE cp LIKE '2302%‘; * SELECT * FROM socios;  Muestra los nuevos datos * ROLLBACK;  Deshace los cambios * SELECT * FROM socios;  Muestra los datos anteriores 79 *
  • 79.
    *Borramos todos losdatos de una fila, no sólo unos campos. *Si eliminamos todas las filas de una tabla, sigue quedando la estructura para insertar nuevos registros *Para borrar una tabla y sus datos tenemos que utilizar DROP Table *Sintaxis *DELETE FROM tabla WHERE condición * Tabla, es de la que se quiera eliminar el registro * Where, todas las filas que cumplan la condición son eliminadas * Si no se utiliza Where elimina todos los datos de la tabla 80 *
  • 80.
    *Eliminar los sociosque se han dado de alta en un mes DELETE FROM socios WHERE MONTH(alta)=7; *Eliminar todos los prestamos DELETE FROM prestamos; 81 *
  • 81.
    *Encapsula varias sentenciasSQL *Podemos utilizar parámetros *Se ejecuta con CALL *Sintaxis Creación procedimiento *CREATE PROCEDURE nombre (parámetros) 82 *Procedimiento Almacenado BEGIN * Instrucciones SQL END * Nombre: como se va a guardar en la base de datos * Parámetros: lista de campos con tipo, ejemplo (p_id int) * Instrucciones: código SQL válido http://dev.mysql.com/doc/refman/5.6/en/create-procedure.html
  • 82.
    *Utilizar CALL paraejecutar un procedimiento almacenado creado con CREATE PROCEDURE *Sintaxis *CALL nombre-proc (valores); * Nombre-proc, es el nombre con el que se creó el procedimiento * Valores, si el procedimiento tiene parámetros hay que indicar entre paréntesis los valores 83 * http://dev.mysql.com/doc/refman/5.6/en/call.html
  • 83.
    *Inserta una nuevareserva y actualiza la disponibilidad CREATE PROCEDURE `AltaPrestamo`(p_id int , p_nif char(9), p_codigo int) BEGIN INSERT INTO prestamos values (p_id,p_nif,p_codigo, current_date); UPDATE libros SET disponible = 'N' WHERE codigo = p_codigo; 84 * END
  • 84.
    *Llama al procedimiento‘AltaPrestamo’ *CALL test.AltaPrestamo(17, '62877137F', 13); *Llama al procedimiento, utilizando variables *SET @p_id = 17; SET @p_nif = '62877137F'; SET @p_codigo = 13; CALL test.AltaPrestamo(@p_id, @p_nif, @p_codigo); 85 *
  • 85.
    86 * *Insertarcon transacciones * Utilizar función integrada Row_count() para saber cuantas filas se han actualizado * Utilizar IF… Then.. End para decidir el ROLLBACK …. START TRANSACTION; INSERT INTO prestamos VALUES (p_id,p_nif,p_codigo, current_date); UPDATE libros SET disponible = 'N' WHERE codigo = p_codigo AND disponible='S'; IF (select row_count() ) =0 THEN ROLLBACK; end if; COMMIT; …. http://dev.mysql.com/doc/refman/5.6/en/if.html http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_row-count
  • 86.
    * 8.1 Subconsultas 8.2 Consultas con tablas derivadas 8.3 Consultas de Unión 87
  • 87.
    *Ejecutamos un Selectdentro de otro Select *Suelen ejecutarse para seleccionar o para filtrar información *Múltiples operadores * = si la subconsulta devuelve un valor * IN si la subconsulta devuelve varias filas *Ejemplo “=“ *Muestra los datos del último socio que se ha dado de alta *SELECT Nif, nombre, apellidos FROM socios WHERE alta = (SELECT max(alta) FROM socios); * http://dev.mysql.com/doc/refman/5.6/en/subqueries.html 88
  • 88.
    *Si la subconsultapuede devolver varios resultados *Muestra el nombre de los socios que tienen prestamos o que vivan cerca de los que tienen prestamos (tienen el mismo CP). *SELECT Nombre, apellidos FROM socios WHERE cp IN (SELECT cp FROM prestamos pr JOIN socios so ON pr.nif=so.nif); 89 *
  • 89.
    *Son tablas virtualesque se utilizan en consultas con tablas reales *No se definen en la estructura de la base de datos. *Se crean de forma automática a partir de un Select *Se utilizan para cruzar datos agrupados con datos sin agrupar. *Se definen en el FROM *Utilizar un alias para el JOIN 90 *
  • 90.
    *Importante el aliasde la subconsulta (maxpr) para definir el JOIN. *Si no se define en el ON, hace un producto cartesiano de las dos tablas *Mostrar la fecha del último préstamo de cada socio *SELECT nombre,apellidos,Ultprestamo FROM socios so JOIN (SELECT MAX(prestamo) as Ultprestamo, nif FROM prestamos GROUP BY nif) maxpr ON so.nif=maxpr.nif; 91 *
  • 91.
    *Muestra “select” dedatos independientes con la palabra UNION en medio. *Tienen que tener el mismo número y tipo de columnas *Se pueden unir varios “select” *Sintaxis *SELECT campos FROM tabla UNION [ALL] SELECT campos FROM tabla * UNION muestra sólo las filas que no se repitan * UNION ALL muestra todos los datos de las dos consultas 92 *
  • 92.
    *Muestra los NIFde los socios actuales que tienen prestamos ahora y el NIF de los que ya están de baja. * Si un socio tiene más de un préstamo sólo aparece una vez * SELECT nif FROM prestamos UNION SELECT nif FROM prestamosexsocios; * Si un socio tiene más de un préstamo aparece repetido más de una vez * SELECT nif FROM prestamos UNION ALL SELECT nif FROM prestamosexsocios; 93 *