Este documento presenta una introducción a las bases de datos relacionales y el lenguaje SQL. Explica conceptos clave como la creación de tablas, tipos de datos, consultas básicas, filtros, funciones integradas y vistas. También incluye instrucciones sobre la instalación y uso del entorno de desarrollo MySQL Workbench.
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Saca partido a tus bases de datos
1. *
Javier Roig Garro
dunbit@hotmail.com
dunbit.blogspot.com
@Dunbit
2. *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
3. *
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
4. *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
6. *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
8. *
* 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
9. * 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
12. *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
13. 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
14. *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
15. *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
16. *
1.1. Sintaxis bá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 el editor
http://dev.mysql.com/doc/workbench/en/wb-table-editor.html
*
21
21. *
2.0 Sintaxis básica
2.1. Alias y campos calculados
2.2. Ordenación de los datos
22
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
23. *select * from libros
*select autor, titulo from libros
*select distinct autor from libros
*
24
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
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
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
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. 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
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
31. *select * from libros where disponible='S‘
*SELECT * FROM socios WHERE cp IN
(23001,23021)
*SELECT * FROM socios WHERE cp >'23008'
*
32
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
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
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
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
36. *SELECT * FROM libros WHERE disponible IS null
*SELECT * FROM libros WHERE disponible IS NOT
null
*
37
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
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 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
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
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 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
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
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();
*
45. *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
46. *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
*
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 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
49. *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
50. *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
51. *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
52. *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;
53. *
5.1Consultas con GROUP BY
5.2Funciones de agrupación
5.3Filtrar datos con WHERE y HAVING
54
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
55. *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
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 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
*
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
*
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
*
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
62. *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
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
*
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
*
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
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
*
67. *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
*
68. * 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
*
69. *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
*
70. *
7.1Añadir nuevos registros
7.2Modificar datos de registros existentes
7.3Eliminar registros
7.4 Integrar consultas en procedimientos
71
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
*
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
*
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);
*
74. *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
*
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
*
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
*
77. *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
78. *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
*
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
*
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
*
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
82. *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
83. *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
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
*
*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
86. *
8.1 Subconsultas
8.2 Consultas con tablas derivadas
8.3 Consultas de Unión
87
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
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
*
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
*
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
*
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
*
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
*