Upload
javier-roig
View
267
Download
0
Embed Size (px)
Citation preview
*
*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
*
*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
*
* 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
*
* 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
*
*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
*
* 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
Documentación on line:
http://dev.mysql.com/doc/refman/5.7/en/data-types.html
20
*
Documentación sobre el editor
http://dev.mysql.com/doc/workbench/en/wb-table-editor.html
21
*
*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
*
*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 librosorder by 1
* select substring(signatura,1,1) as indice,signatura,titulofrom 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_filtroAND | 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 flujo43
*
*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
45
*
*Dentro de las funciones, las de sistema son las que dan información del entorno
*No suelen tener parámetros
* Fecha y hora actual
* Current_date, Current_time, Current_timestamp
* MS Access: Date, Time, Now
* Información usuario
* Current_user, user
*Ejemplos* select current_date();
* select current_timestamp;
* select user();
46
*
*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á
http://dev.mysql.com/doc/refman/5.6/en/string-functions.html
47
*
*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
48
*
*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 “-”
* Resultado =“casa”
*¿Cómo sería para extraer lo que haya a la
izquierda del “-”?
49
*
*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
http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html
50
*
*Complementan a los operadores de cálculo
* Operaciones
* 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
* Redondeo
* 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
http://dev.mysql.com/doc/refman/5.6/en/numeric-functions.html
51
*
*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
http://dev.mysql.com/doc/refman/5.6/en/type-conversion.html
52
*
*En función del valor de un campo permite
variar la información que muestra
*Case when condicion then expresion end* SELECT CASE
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;
http://dev.mysql.com/doc/refman/5.6/en/control-flow-functions.html
53
*
*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;
equivalente
* SELECT IFNULL(DISPONIBLE, 'NS') AS Disponibilidad
FROM test.libros;
55
*
*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
http://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html
56
*
*Realizan operaciones con las filas agrupadas
*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
57
*
*SELECT autor, COUNT(titulo) AS ntitulosFROM libros GROUP BY autor;
*SELECT disponible, COUNT(disponible), MIN(codigo), MAX(codigo)FROM librosGROUP BY disponible;
(¿qué pasa si utilizamos COUNT (*)?)
*SELECT MIN(alta) as ‘socio más antigüo’FROM socios
58
*
*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;
59
*
*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;
61
*
*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
62
*
*SELECT * FROM tabla1 JOIN|LEFTJOIN |RIGHTJOIN 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;
http://dev.mysql.com/doc/refman/5.6/en/join.html
63
*
*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;
64
*
*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);
65
*
*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);
66
*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);
67
*
*Relaciones 1:1
*Una fila de una tabla coincide con una fila de la tabla relacionada.
*Se utiliza para desdoblar tablas con muchos campos en dos
Ejemplo: Cada socio
tiene sólo una
dirección
68
*
*Relaciones 1:N
*Una fila de una tabla coincide con varias de la
tabla relacionada.
*Es la relación más común
Ejemplo: un socio
puede tener varios
prestamos
69
*
*Relaciones M:N
* 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
70
*
*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
*
7.1Añadir nuevos registros
7.2Modificar datos de registros existentes
7.3Eliminar registros
7.4 Integrar consultas en procedimientos71
72
*
* 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.
73
*
*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');
74
*
*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' ,33,current_date);
(suponemos que el libro de código 33 no existe)
75
*
*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;
76
*
*Para actualizar datos existentes de una tabla utilizamos la clausula UPDATE
*Sintaxis
*UPDATE tablaSET 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
77
*
*Actualizar todos los apellidos a mayúsculas
update socios set apellidos=upper(apellidos);
*Actualiza sólo un registro
update sociosset apellidos=upper(apellidos)where nif='23727319S';
*Actualizar varios registros
update sociosset 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)
78
*
*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
http://dev.mysql.com/doc/refman/5.7/en/commit.html
79
*
*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
80
*
*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
81
*
*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;
82
*
*Procedimiento Almacenado
*Encapsula varias sentencias SQL
*Podemos utilizar parámetros
*Se ejecuta con CALL
*Sintaxis Creación procedimiento
*CREATE PROCEDURE nombre (parámetros) BEGIN
Instrucciones SQLEND
* 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
83
*
*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
http://dev.mysql.com/doc/refman/5.6/en/call.html
84
*
*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;
END
85
*
*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);
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
88
*
*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
89
*
*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);
90
*
*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
91
*
* 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,UltprestamoFROM socios so JOIN (SELECT MAX(prestamo) as Ultprestamo, nif FROM prestamos GROUP BY nif) maxpr ON so.nif=maxpr.nif;
92
*
*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 tablaUNION [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
93
*
*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 prestamosUNIONSELECT nif FROM prestamosexsocios;
* Si un socio tiene más de un préstamo aparece repetido más de una vez
* SELECT nif FROM prestamosUNION ALLSELECT nif FROM prestamosexsocios;