92
* Javier Roig Garro [email protected] dunbit.blogspot.com @Dunbit

Saca partido a tus bases de datos

Embed Size (px)

Citation preview

*

Javier Roig [email protected]

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

*

* 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

*

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 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;

*

5.1Consultas con GROUP BY

5.2Funciones de agrupación

5.3Filtrar datos con WHERE y HAVING

54

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;

*

6.1Utilización de JOIN

6.2Diferentes tipos de relaciones

60

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

*8.1 Subconsultas

8.2 Consultas con tablas derivadas

8.3 Consultas de Unión

87

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;