Fundamentos de Base de Datos
Fundamentos de Base de Datos
COMPUTACIÓN E
INFORMÁTICA
MANUAL DE APRENDIZAJE
FUNDAMENTOS DE
BASE DE DATOS
CÓDIGO: 89001826
Profesional Técnico
CONTENIDO
TAREA-DENOMINACIÓN PÁG N°
I. DISEÑA MODELOS DE DATOS, BASES DE DATOS Y TABLAS
5
EN SQL.
1.1. Crear modelos de datos. 5
1.2. Crear modelo E-R y la base de datos. 10
1.3. Crear tablas y su estructura. 19
1.4. Aplicar SQL para crear base de datos y tablas. 32
1.5. Crear taller de modelo de datos y creación de base de datos. 36
Marco Teórico. 39
II. IMPLEMENTA TRANSACT SQL. 44
2.1. Implementar tendencias DDL. 44
2.2. Crear y optimizar con DML. 46
2.3. Crear variables y estructura de control. 51
2.4. Implementar funciones SQL. 53
Marco Teórico. 65
III. IMPLEMENTA BASE DE DATOS Y TABLAS EN MYSQL. 75
3.1. Diseñar modela relacional en MYSQL. 75
3.2. Crear operaciones con la base de datos en MYSQL. 78
3.3. Implementar operaciones utilizando DML. 81
3.4. Crear taller de implementación de base de datos con MYSQL. 88
Marco Teórico. 90
IV. IMPLEMENTA PROGRAMACIÓN CON T-SQL. 103
4.1. Implementar Store Procedure Básico. 103
4.2. Implementar Store Procedure con varias tablas. 107
4.3. Crear disipadores básicos. 113
4.4. Crear disipadores avanzados. 119
V. IMPLEMENTAR OPERACIONES AVANZADAS CON SQL. 128
5.1. Crear operaciones utilizando el agente SQL. 128
5.2. Crear Subquery con SQL. 134
5.3. Crear operación con SQL Azure. 136
Marco Teórico. 140
FUNDAMENTOS DE BASE DE DATOS
Existen diferentes tipos de modelos dentro de los mas utilizados se encuetran los
modelos entidad relación el cual realizaras algunos ejemplos preliminares.
1. Descripción del proceso: Se trata de una base de datos sobre los suministros que
ingresan los proveedores hacia un determinado almacén, para lo cual se debe llevar
un control de los suministros y de sus cuentas contables.
Paso 1.
Paso 2:
Proceder a relacionar.
Paso 1.
1. Descripción del proceso: Se trata de una base de datos que debe almacenar
información sobre el préstamo de libros a los alumnos de una determinada escuela,
los cuales son escritos por varios autores y pertenecen a una determinada editorial,
además se refieren a una determinada especialidad.
Ejemplo 3.
Elaborar el siguiente modelo de datos para un sistema de venta utilizando la herramienta
dbdesigner siguiendo las indicaciones del instructor:
Objeto: TECSUP.
Ejemplo 1:
Ejemplo 2:
Relacionar:
Una relación es una asociación entre dos o más entidades (Clases).
Ejemplo 4
- Para cada cliente: Número de cliente (único), Direcciones de envío (varias por
cliente), Saldo, Límite de Crédito (depende del cliente, pero en ningún caso debe
superar los 3.000.000 soles), Descuento.
- Para cada artículo: Número de artículo (único), Fábricas que lo distribuyen,
Existencias de ese artículo en cada fábrica, Descripción del artículo.
- Para cada pedido: Cada pedido tiene una cabecera y el cuerpo del pedido. La
cabecera está formada por el número de cliente, dirección de envío y fecha del
pedido. El cuerpo del pedido son varias líneas, en cada línea se especifican el
número del artículo pedido y la cantidad. Además, se ha determinado que se debe
almacenar la información de las fábricas. Sin embargo, dado el uso de distribuidores,
se usará: Número de la fábrica (único) y Teléfono de contacto. Y se desean ver
cuántos artículos (en total) provee la fábrica. También, por información estratégica,
se podría incluir Información de fábricas alternativas respecto de las que ya fabrican
artículos para esta empresa.
Nota: Una dirección se entenderá como Nº, Calle, Comuna y Ciudad. Una fecha incluye
hora.
CASO APLICATIVO 2: Sistema de ventas. Le contratan para hacer una Base de Datos
que permita apoyar la gestión de un sistema de ventas. La empresa Necesita llevar un
control de proveedores, clientes, productos y ventas. Un proveedor tiene un RUT,
nombre, dirección, teléfono y página web. Un cliente también tiene RUT, Nombre,
dirección, pero puede tener varios teléfonos de contacto. La dirección se entiende por
calle, Número, comuna y ciudad. Un producto tiene un id único, nombre, precio actual,
stock y nombre del proveedor. Además, se organizan en categorías, y cada producto va
sólo en una categoría. Una categoría tiene id, nombre y descripción. Por razones de
contabilidad, se debe registrar la información de cada venta con un id, fecha, cliente,
descuento y monto final. Además, se debe guardar el precio al momento de la venta, la
cantidad vendida y el monto total por el producto.
¿Qué cambios se producirán en el caso anterior si en las escalas pudiesen bajar o subir
pasajeros?
Caso domiciliario:
Se desea crear un sitio web con información referente a las películas en cartel en las
salas de un dudoso Cine cercano a la plaza mayor del centro de Lima.
De cada película, se almacena una ficha con su título de distribución, su título original,
su género, el idioma origina, si tiene subtítulos en español o no, los paises de origen, el
año de la producción, la url del sitio web de la película, la duración (en horas y minutos),
la calificación (Apta todo público, +9 años, +15 años, +18 años), fecha de estreno en
Santiago, un resumen y un identificador de la película. De cada película interesa conocer
la lista de directores y el reparto, es decir para cada actor que trabaja, el nombre de
todos los personajes que interpreta.
Además, interesa disponer de información sobre los directores y actores que trabajan
en cada película.
tal para la película cual...La función del lunes a las 14:00 para la película tal en la sala
cual, no se cobra a los escolares con túnica...). De cada promoción se conoce una
descripción y el descuento que aplica. Además del resumen de la película que se incluye
en la ficha interesa mostrar la opinión de las personas que vieron la película. De cada
opinión se conoce el nombre de la persona que la realiza, su edad, le fecha en que
registró su opinión, la calificación que le dio a la película (Obra Maestra, Muy Buena,
Buena, Regular, Mala) y el comentario propiamente dicho. A cada opinión se le asigna
un número que la identifica respecto de la película sobre la cual opina.
Distrito Provincia
Calle
No Depatam
IdArticulo Detalle
Direcciones
NoCliente De Envió
Saldo N ARTICULO
Cantidad N Existencias
Límite de CLIENTE
Credito 1
Se Incluye
Fabrica
Descuento Es Hecho
N
N FABRICA
PEDIDO N NoArticulos
Provistos
NoPedido
IdFabrica
Telfonos
Fecha Monto mail
Elaborar el modelo lógico y convertirlo en una base de datos de SQL SERVER con el
nombre: VIDEOS.
Monodroga
N
Presentación
N Contiene
N N
1 N N N
Tiene
Ciudad Pertenece Farmacia Medicamento
Stock
N N
1
Tiene Cantidad
Sirve Provee
Para
N
Esta Personal Acción 1
a cargo
Terapéutica
N
Laboratorio
1
Farmacéutico Propio
Caso domiciliario:
CASO 1. Un Banco desea almacenar información concerniente a todos sus clientes, así
como los productos que puede ofrecer a cada uno de ellos. Del mismo modo, el banco
tiene interés en invertir en empresas, por lo que desea conocer en todo momento la
situación de dicha empresa para poder mejorar su política de inversiones.
Puesto que dicho banco esta constituido como S.A., desea llevar un registro de todos
los miembros de su consejo de administración (actuales y ex-miembros), así como de
todas las reuniones ordinarias y extraordinarias que se realicen. Las decisiones de
inversión saldrán como resultado de dichas reuniones, si como el lanzamiento de
nuevos productos financieros.
- Cuando un cliente llama por teléfono para comprar unas entradas, se comprueba si
el cliente es nuevo, en cuyo caso se almacenará en la Base de Datos el nombre del
cliente, su DNI y su teléfono. Además, se le asignará un código de cliente único.
- Existen diferentes locales de espectáculos que trabajan con esta empresa. La
información de interés de dichos locales es el código de local, el nombre, la
dirección, el teléfono y el aforo de dicho local.
- En los diferentes locales se dan distintos espectáculos. Hay que tener en cuenta que
la empresa quiere tener almacenada la programación de espectáculos de toda la
temporada por lo que un espectáculo podrá estar en varios locales a lo largo de la
temporada y un local podrá tener también diferentes espectáculos durante la
temporada. Es esencial saber las fechas de comienzo y fin de los espectáculos en
cada local.
- De los espectáculos interesa saber el código de espectáculo, su nombre y el precio
por entrada. Hay que tener en cuenta que el precio de un espectáculo puede variar
según el local donde se produzca.
- Cuando el cliente realiza una compra de entradas se tendrá en cuenta lo siguiente:
hay que almacenar la fecha para la que quiere las entradas, en que espectáculo y
en cual local, así como el número de entradas que pide. Si un cliente habitual lleva
compradas más de 20 entradas, se le realizará un descuento del 15 %. Por lo tanto,
hay que almacenar todas las compras realizadas por un cliente. También hay que
comprobar que quedan entradas disponibles. De las compras interesa saber el
código de cliente, el número de entradas compradas, la fecha, el código del local y
el código del espectáculo.
Paso 2.
Paso 2.
1. Exportar.
Paso 1. Crear una nueva base de datos que sirva de repositorio asigne el nombre
suministros2
Paso 2.
Paso 3.
Paso 5. Seleccionar todas las tablas que desea migrar a la nueva base de datos.
Paso 6. Ahora para visualizar las tablas en la nueva base de datos sólo se tendrá que
actualizar.
Paso 1.
Paso 1.
Paso 1.
Paso 3.
Paso 4. Aceptar.
Paso 2.
Paso 1.
Paso 1.
USE [SUMINISTRO2]
GO
/****** Object: Table [dbo].[ARTICULOS] Script Date: 03/01/2017 [Link] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ARTICULOS](
[ARTCOD] [char](4) NOT NULL,
[ARTDESCRI] [varchar](30) NULL,
[ARTSTOCK] [int] NULL,
[ARTPRECIO] [money] NULL,
[ARTFECHA] [smalldatetime] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[CLIENTES] Script Date: 03/01/2017 [Link] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[CLIENTES](
[CLICOD] [char](4) NOT NULL,
[CLIAPE] [varchar](30) NULL,
[CLINOM] [varchar](30) NULL,
[CLIDIR] [varchar](30) NULL,
[CLIDIS] [varchar](25) NULL,
[CLITEL] [char](9) NULL,
[CLIGEN] [char](1) NULL,
[CLIFNAC] [smalldatetime] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[FACTURAS] Script Date: 03/01/2017 [Link] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[FACTURAS](
[FACOD] [char](5) NOT NULL,
[FACFECHA] [smalldatetime] NULL,
[CLICOD] [char](4) NOT NULL,
[VENCOD] [char](4) NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[sysdiagrams] Script Date: 03/01/2017 [Link] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[sysdiagrams](
[name] [nvarchar](128) NOT NULL,
[principal_id] [int] NOT NULL,
[diagram_id] [int] NOT NULL,
[version] [int] NULL,
[definition] [varbinary](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[VENDEDORES] Script Date: 03/01/2017 [Link] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[VENDEDORES](
[VENCOD] [char](4) NOT NULL,
[VENAPE] [varchar](30) NULL,
[VENNOM] [varchar](30) NULL,
RESULTADO FINAL:
En esta operación usted realiza la creación de una base de datos por intermedio de
código SQL tal como vera a continuación.
Nombre_Columna3 tipo_de_dato
)
Ejemplos de creacion de tablas
CREATE TABLE ARTICULOS (
ARTCOD char (4) PRIMARY KEY,
ARTDESCRI varchar (30),
ARTSTOCK int,
ARTPRECIO money,
ARTFECHA smalldatetime,
)
CREATE TABLE CLIENTES(
CLICOD char (4) PRIMARY KEY,
CLIAPE varchar (30),
CLINOM varchar (30),
CLIDIR varchar (30),
CLIDIS varchar (25),
CLITEL char (9),
CLIGEN char (1),
CLIFNAC smalldatetime
)
CREATE TABLE VENDEDORES(
VENCOD char (4) PRIMARY KEY,
VENAPE varchar (30),
VENNOM varchar (30),
VENDIR varchar (30),
VENDIS varchar (25),
VENTEL char (9),
VENFNAC smalldatetime,
VENGEN char (1)
)
CREATE TABLE FACTURAS (
FACOD char (5) NOT NULL PRIMARY KEY ,
FACFECHA smalldatetime,
CLICOD char (4) NOT NULL REFERENCES CLIENTES,
VENCOD char (4) NOT NULL REFERENCES VENDEDORES
)
Nota
El termino REFERENCES es para establecer una relación de tablas directa al momento
de construir la tabla.
Relacion de tablas
--SINTAXIS
ALTER TABLE TABLA_FKAdd foreign key(campo_FK) REFERENCES
TABLA_PK(campo_Pk)
Ejemplo 1.
Relacionando la tabla facturas con la tabla vendedores.
Ejemplo 2.
Relacionando la tabla facturas con la tabla clientes.
ALTER TABLE FACTURAS Add foreign key(clicod) REFERENCES CLIENTES(clicod)
CASO APLICATIVO 2.
Creación de la base de datos personalizada.
Ejemplo 1:
CREATE DATABASE SistFact
ON
(NAME = SistFact_dat,
FILENAME = 'C:\BD\SistFact_dat.mdf', --ruta del archivo logico
SIZE = 10, --tamaño de la base de datos Logica
MAXSIZE = 50, --tamaño maximo
FILEGROWTH = 5 ) --porcentaje de crecimiento
LOG ON
(NAME = 'SistFact_log',--ruta del archivo log
FILENAME = 'C:\BD\SistFact_log.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB)
En esta operación el estudiante pondrá a prueba lo aprendido para lo cual tendrá que
identificar las entidades, atributos asi como también codificar la base de datos, tablas y
relacionar cada una de las tablas, elaborando una estructura adecuada de las tablas el
tamaño total de la base de datos será de 50 Mb con un tamaño máximo de 100 Mb y
una tasa de crecimiento de 10% con la creación de grupo de archivos para la protección
de las tablas que se logren identificar. Una vez terminado comunicar al instructor para
su exposición final. El caso a analizar es:
CASO FINAL 1.
En la Empresa "Educando S.A." lleva el control de sus Bienes y Servicios. El interés
primario es poder hacer que los Bienes se manejen de forma rápida y con el menor
grado de error. Para esto quien maneja la sección de "Bienes y Suministros" plantea las
siguientes condiciones del negocio para la construcción de una base de datos: La
Sección está dividida en tres (3) áreas: COMPRAS, ALMACEN, INVENTARIO.
Cada solicitud es autorizada por el Jefe del Área y posteriormente por el Director
Financiero.
Quien realiza una solicitud puede ser responsable de uno o varios centros de costos,
con la salvedad de que él como empleado solo está adscrito a uno.
Las cotizaciones son realizadas con uno o varios proveedores de los bienes solicitados.
Una vez la cotización definitiva está lista, se crea una orden contractual que maneja la
siguiente información: Número de la orden contractual, nit y nombre del proveedor al
cual se le va a realizar la compra, fecha de la orden, monto total de la orden, fecha de
entrega. Cada orden puede tener asociado uno o varios ítems de la solicitud o
solicitudes que van a ser despachadas. Cada ítem tiene la siguiente información:
nombre del bien, cantidad solicitada, cantidad despachada, unidad de medida del bien,
valor unitario y valor total.
La orden de compra es aprobada por el Director Financiero para que sea enviada al
proveedor elegido.
Cuando llega un proveedor mercancía, este hace una entrega física de los bienes, los
cuales son comparados con la factura que esta entrega y con la orden de compra
correspondiente. Si esta acción es correcta se registra una entrada de almacén por cada
factura relacionada, con la siguiente información: Número de Entrada, Fecha, Número
de factura, Proveedor, Total Bienes, Valor Total (los totales deben coincidir con los de
la factura). Adjunto a esta se discriminan los ítems recibidos con la siguiente
información: nombre del bien, cantidad entregada.
Cuando el almacén decide despachar los bienes a las diferentes áreas solicitantes,
registra cada una de las entregas en Salidas de Almacén con la siguiente información:
Número de Salida, Empleado responsable del bien a entregar, fecha de salida, fecha de
entrega. Por cada entrega se detalla cada uno de los ítems con la siguiente información:
nombre del bien, cantidad entregada.
Una entrada de almacén puede generar muchas salidas de almacén, por ejemplo:
Pueden ingresar 500 pacas de papel higiénico, pero como se debe repartir entre varias
áreas, cada una requiere de una salida de almacén.
La ubicación del bien se identifica por la siguiente información: responsable del bien,
fecha de entrega, dirección del bien (ubicación). Diseñar modelo ER para la base de
datos.
CASO FINAL 2.
Codificar el siguiente diseño de base de datos para un sistema de facturación
MARCO TEÓRICO
Mundo real. Contiene la información tal cual la percibimos como seres humanos.
Introducción. Fue ideado por Peter Chen en los años 1976 y 1977 a través de dos
artículos. Se trata de Un modelo que sirve para crear esquemas conceptuales de bases
de datos. De hecho, es Prácticamente un estándar para crear esta tarea. Se le llama
modelo E/R e incluso EI (Entidad / Interrelación). Sus siglas más populares son las E/R
por que sirven para el inglés y el español. Inicialmente (en la propuesta de Chen) sólo
se incluían los conceptos de entidad, relación y atributos. Después se añadieron otras
propuestas (atributos compuestos, generalizaciones,) que forman el llamado modelo
entidad relación extendido (se conoce con las siglas ERE) entidad/Relacion.
Entidad. Se trata de cualquier objeto u elemento (real o abstracto) acerca del cual se
pueda Almacenar información en la base de datos. Ejemplos de entidades son Alumno,
factura Entidad es un objeto que puede poseer múltiples Propiedades (atributos).
Conjunto de entidades Las entidades que poseen las mismas propiedades forman
conjuntos de entidades. Ejemplos: persona, factura, Auto.
En el modelo entidad relación una entidad se representa con un rectángulo dentro del
cual se escribe el nombre de la entidad:
PERSONA
Persona
Representación de la entidad persona:
Tipos de entidades.
1. Fuertes. Son las entidades normales que tienen existencia
por sí mismas sin depender de otras. Notación:
2. Entidad débil. Es aquella que sí necesita de otra para existir. Por ejemplo, en un
video-club lo que realmente se alquila a los clientes no son películas, sino las copias
de películas que tiene el video-club adquirido:
Ejemplo 1.
Cardinalidad. Indica el número de relaciones en las que una entidad puede aparecer.
Se anota en términos de:
Ejemplo, cada equipo cuanta con varios jugadores. Un jugador juega como mucho en
un equipo y podría no jugar en ninguno. Cada entrenador entrena a un equipo (podría
no entrenar a ninguno), el cual tiene un solo entrenador, Propiedades de las entidades
y las relaciones. En este modelo se representan Con un círculo, dentro del cual se coloca
el nombre del atributo. Ejemplo:
ASISTE CURSO
Nro_Nota, Nro_DNI, Nombre_ALUMNO, Nombre Domicilio Nombre Número
Tipos de atributos
Compuesto: Fecha: Dia/Mes/Año
Atómicos: Son aquellos que no se pueden descomponer. Ejemplo: N° DNI, N° Telefono,
etc.
Complejidad: Los SGBD son conjuntos de programas que pueden llegar a ser complejos
con una gran funcionalidad. Es preciso comprender muy bien esta funcionalidad para
poder realizar un buen uso de ellos. Costo del equipamiento adicional:
Tanto el SGBD, como la propia base de datos, pueden hacer que sea necesario adquirir
más espacio de almacenamiento. Además, para alcanzar las prestaciones deseadas,
es posible que sea necesario adquirir una máquina más grande o una máquina que se
dedique solamente al SGBD. Todo esto hará que la implantación de un sistema de
bases de datos sea más cara. Vulnerable a los fallos:
El hecho de que todo esté centralizado en el SGBD hace que el sistema sea más
vulnerable ante los fallos que puedan producirse. Es por ello que deben tenerse copias
de seguridad (Backup).
Tipos de Campos:
Cada Sistema de BD posee tipos de campos que pueden ser similares o diferentes.
Entre los más comunes se pueden nombrar:
- Numérico: Entre los diferentes tipos de campos numéricos podemos encontrar
enteros “sin decimales” y reales “decimales”.
- Booleanos: Poseen dos estados: Verdadero “Si” y Falso “No”.
- Memos: Son campos alfanuméricos de longitud ilimitada. Presentan el inconveniente
de no poder ser indexados.
- Fechas: Almacenan fechas facilitando posteriormente su explotación. Almacenar
fechas de esta forma posibilita ordenar los registros por fechas o calcular los días
entre una fecha y otra.
- Alfanuméricos: Contienen cifras y letras. Presentan una longitud limitada (255
caracteres).
- Autoincrementables: son campos numéricos enteros que incrementan en una unidad
su valor para cada registro incorporado. Su utilidad resulta: Servir de identificador ya
que resultan exclusivos de un registro.
actualizarla. Aunque SQL es a la vez un ANSI y una norma ISO, muchos productos
de bases de datos soportan SQL con extensiones propietarias al lenguaje estándar.
CUESTIONARIO
Descripción
Vincula una regla a una columna o a un tipo de datos definido por el usuario.
ALTER. Para agregar una columna en una tabla, utilizar la siguiente sintaxis:
TRUNCATE
Ejemplo: TRUNCATE TABLE Articulo
Caso aplicativo:
Paso 1. Crear las siguientes 3 tablas con sus tipos de datos.
Paso 2. Asignar 2 reglas, a su criterio, al menos en cada una de las tablas.
Paso 3. Crear una copia de seguridad de su BD.
INSERT
Ejemplo 1:
Paso 1.
CREATE TABLE Distritos
(
idDistrito VarChar(3) Primary Key,
nom_dis VarChar(30) Not Null,
iniciales Char(3) Not null,
)
Paso 2.
Insertando 3 de registros en la tabla Distritos
Insert Distritos Values ('L10','El Agustino','AGU')
Insert Distritos Values ('L02','Ancon','ANC')
Insert Distritos Values ('L03','Ate Vitarte','ATE')
Ejemplo 2:
CREATE TABLE EncabezadoFactura
(
IdEnFac VarChar(10)Primary Key,
idCliente VarChar(8),
Fech_Fac DateTime,
IGV Decimal(12,2) Not Null,
SubTotal_Fac Decimal(12,2) Not Null,
Anulado Char(1),
Transferido Char(1),
Desc_Fac VarChar(50)
)
Insertando 1 registro
Insert into EncabezadoFactura Values ('F01','C01','05/01/2017',18.6,20.5,'1','0','factura
cancelada')
Ejercicio Práctico.
CREATE TABLE Clientes
(
IdCliente VarChar(8)Primary Key,
nom_cli VarChar(50) Not Null,
ape_cli VarChar(50) Not Null,
dir_cli VarChar(50) Not Null,
tel_cli VarChar(8),
Ruc_cli Varchar(15),
DNI_cli Varchar(8) Not Null,
Email_cli Varchar(50),
iddistrito VarChar(3)
)
SELECT
Utilizado para realizar las
consultas directas a la base de
datos. Aquí algunos ejemplos
de aplicación.
Ejemplos practicos:
Paso 1. Cargar la base de datos Nortwind.
[Link]
PRACTICANDO.
1. Listar una fila por cada tipo de libro que contenga los subtotales agregados para cada
grupo pero solo para la suma de adelantos superiores a 25000 */
USE pubs
SELECT type 'TIPO ', SUM(price)'SUMA PRECIOS ', SUM(advance)'SUMA
ADELANTOS',
SUM(advance * 0.50)as 'SUMA INCREMENTO 50 % ',AVG(price)'PROMEDIO
PRECIOS',
AVG(advance)'PROMEDIO ADELANTOS',
AVG(advance * 0.50)as 'PROMEDIO INCREMENTO 50%' FROM titles
GROUP BY type
HAVING SUM(ADVANCE)> 25000
2. Listar los titulos, tipos y precios solo de los libros de negocios (business), y luego el
precio promedio con el numero de filas, y luego el numero de registros, el maximo
precio, el minimo precio, la suma de precios y el precio incremento en 50 % */
USE PUBS
select title 'titulo ', type 'tipo ', price'precio' FROM titles WHERE type = 'business'
--LISTA PROMEDIO DE PRECIOS Y NUMERO DE FILAS DE LOS LIBROS DE
NEGOCIOS
SELECT AVG (price)as 'precio promedio', count (*)'numero de filas' FROM titles
WHERE type = 'business'
--LISTA EL RESUMEN SIGUIENTE DE TODAS LAS FILAS
select count(*)'[Link]', max(price)'maximo', min (price)'minimo',
sum(price)'suma', sum(price)* 1.5 'incremento 50% 'from titles WHERE type =
'business'
Ejemplo 1.
--devolver si el numero es impar con IF
--IF
declare @n int
set @n = 5
if (@n % 2)= 0
print 'PAR'
else
print 'IMPAR'
Ejemplo 2.
--devolve pares con bucle while
Declare @n int
set @n = 0
while @n < 10
begin
if (@n % 2) = 0
select @n as Numero
set @n = @n + 1
end
Ejemplo 3.
--lista de numeros enteros acompañados de su descripción
DECLARE @N INT
SET @N = 1
WHILE (@N<100)
BEGIN
SELECT @N AS 'NUMERO', CASE
WHEN (@N % 2) = 1 THEN
'IMPAR'
ELSE
'PAR'
END AS 'TIPO'
SET @N = @N + 1
END
Ejemplo 4.
--lista de numeros enteros acompañados de su descripción utilizando Case
DECLARE @N INT,@TIPO CHAR(10),@VALOR CHAR(11)
SET @N = 1
WHILE (@N < 100)
BEGIN
IF (@N < 50)
SET @VALOR = 'MENOR DE 50'
ELSE
SET @VALOR = 'MAYOR DE 50'
SET @TIPO = CASE (@N % 2)
WHEN 1 THEN 'IMPAR'
ELSE 'PAR'
END
SELECT @N AS 'NUMERO', @TIPO AS 'TIPO',@VALOR AS VALOR
SET @N = @N + 1
END
Ejemplo 1.
DECLARE @CADENA VARCHAR(30)
SET @CADENA=' SQL SERVER 2014 - Senati'
SELECT LEFT(@CADENA,5)
SELECT SUBSTRING(LTRIM(@CADENA),5,6)
SELECT SUBSTRING(RTRIM(@CADENA),12,14)
Ejemplo 2.
DECLARE @CADENA varchar(30)
set @cadena=' sql server 2014 - SENATI-ETI'
--quitar los espacios en blanco de la izquierda
SELECT LTRIM(@CADENA)AS 'RESULTADO'
SELECT RESULTADO=ltrim(@cadena)
--EXTRAE X LA DERECHA LOS 4 ULTIMOS CARACTERES DE @CADENA
FUNCIONES DE CADENA.
1. LEFT
2. UPPER
SELECT upper(lastname) Apellido FROM employees
3. SUBSTRING
SELECT substring(lastname,2,5) as Apellido FROM employees
4. LOWER
SELECT Lower(substring(lastname,1,5)) as Apellido FROM employees
5. CONCAT
SELECT Concat(upper(left(firstname,10)), + ' ' + lower(left(lastname,10))) from
employees
6. DISTINCT
SELECT DISTINCT firstname FROM employees
FUNCIONES NUMÉRICAS.
1. ROUND
Select unitprice,round(unitprice,1) from products
2. AVG
Select Avg(unitprice) as Promedio from products
3. COUNT
Select count(*) AS Cantidad from products
4. MIN
Select min(unitprice) as [Precio Mas Economico] from products
5. MAX
Select MAX(unitprice) as [Precio Mas Caro] from products
6. function concatenadas
7. BETWEEN
SELECT * FROM products WHERE unitprice BETWEEN 20 AND 22
AQUÍ ALGUNOS EJEMPLOS ADICIONALES UTILIZANDO FUNCIONES NUMÉRICAS
UTILIZANDO NORTHWIND Y PUBS:
3) El ejemplo siguiente calcula el promedio del adelanto y la suma de las ventas del año
hasta la fecha de todos los libros que tratan temas de negocios (business). Cada una
de estas funciones de agregado produce un valor único para todas las filas recuperadas.
--ANALIZE
SELECT TYPE,ADVANCE,YTD_SALES FROM TITLES WHERE TYPE='BUSINESS'
--Luego:
USE pubs
4)
SELECT AVG(ADVANCE)as 'promedio adelanto', SUM(ytd_sales)as 'suma anual de
ventas'
FROM titles
5)
SELECT productid, quantity from "order details" order by productid
--lista resumen
6)
SELECT sum(quantity)as'suma total de todos los productos' from "order details"
-- lista suma total de cantidad por producto
7)
SELECT productid, sum(quantity) as
cantidad_total_pro_producto
from "order details"
group by productid
9) Utilizando having
SELECT productid, SUM(quantity) AS
Cantidad_total_pro_producto
FROM "ORDER DETAILS"
GROUP BY productid
HAVING SUM(QUANTITY) >1200
--UTILIZANDO LA BASE DE DATOS PUBS
1) Cuando se utiliza con una clausula GORP BY, cada funcion de agregado produce un
valor unico para cada grupo, en vez de para toda la tabla. El ejemplo siguiente crea
valores de resumen para cada tipo de libro que incluyen el anticipo medio de cada tipo
de libro y la suma de las ventas del año hasta la fecha para cada tipo de libro. */
USE pubs
SELECT type 'tipo de libro', AVG(ADVANCE)as 'promedioadelanto por grupo',
SUM(ytd_sales) 'total por tipo'
FROM titles
GROUP BY type
ORDER BY type
CASO APLICATIVO.
Esta consulta usa la fecha 30 de noviembre de 1995 y busca el numero de dias que
hay entre pubdate(fecha de publicacion) y esa fecha. */
USE pubs
SELECT pubdate as 'fecha de publicacion', DATEDIFF(day, pubdate,'Nov 30 1995')
FROM titles
--CON DECLARE Y SET (declaraciones de variables)
DECLARE @AHORA DATETIME
SET @AHORA=GETDATE()
SELECT @AHORA
SELECT DIA=DAY(@AHORA)
SELECT MES=MONTH(@AHORA)
SELECT AÑO=YEAR(@AHORA)
SELECT NOMBRE_MES=DATENAME(MM,@AHORA)
SELECT NOMBRE_DIA=DATENAME(DW,@AHORA)
SELECT HORA=DATEPART(HH,@AHORA)
--FUNCIONES DE CADENAS
DECLARE @CAD1 VARCHAR(40)
SET @CAD1=' SENATI . '
SELECT @CAD1+'-ETI-'
SELECT LTRIM(@CAD1)+ 'SENATI'
SELECT RTRIM(@CAD1)+ 'SENATI-ETI'
--
DECLARE @CAD2 VARCHAR(40)
SET @CAD2='Aprendiendo haciendo'
SELECT LEFT(@CAD2,4)
SELECT RIGHT(@CAD2,4)
SELECT SUBSTRING(@CAD2,2,3)
SELECT LOWER(@CAD2)
SELECT UPPER('senati')
SELECT LEN(@CAD2)
--
DECLARE @CADENA VARCHAR(30)
SET @CADENA=' SQL SERVER 2016'
SELECT LEFT(@CADENA,12)
SELECT SUBSTRING(LTRIM(@CADENA),5,3)
SELECT SUBSTRING(RTRIM(@CADENA),5,3)
--
DECLARE @CADENA varchar(30)
set @cadena=' sql server 2016'
--quitar los espacios en blanco de la izquierda
SELECT LTRIM(@CADENA)AS 'RESULTADO'
SELECT RESULTADO=ltrim(@cadena)
--EXTRAE X LA DERECHA LOS 4 ULTIMOS CARACTERES DE @CADENA
SELECT RIGHT (@CADENA,4) AS 'RESULTADO'
SELECT RESULTADO=RIGHT (@CADENA,4)
--
USE pubs
GO
ENTREGABLE DE LA SEMANA.
En esta tarea el estudiante pondrá a prueba lo aprendido en esta semana. El cual
consiste en crear las tablas que se mencionara en cada uno de los casos aplicando los
comandos DML para resolver las consultas que se requiere obtener de la base de datos
CASO FINAL 1.
1. Utilizando el Transact de SQL crear la base de datos INSTITUTO, cuyas tablas son
las siguiente:
Tabla: ALUMNOS.
Tabla: CURSOS.
f) Alumnos con teléfono fijo, matriculados en cualquier curso menos SQL, y que no
vivan en el distrito de Comas.
k) Relación de alumnos cuya tercera letra del nombre no sea una vocal.
Nombres Apellido Paterno Curso
l) Relación de alumnos con teléfono celular, cuyo apellido comience con cualquiera de
las 7 primeras letras del abecedario.
CASO FINAL 2.
I. Crear una Base de Datos, Utilizando sentencias SQL, con el nombre BDSEMANA2
y una tabla Con la Definición siguiente:
CODIGO (PK, int, not null)
NOMBRE (char(16), null)
APELLIDO (char(16), null)
CIUDAD (char(4), null)EDAD (int, null)
1) Listar las filas con las columnas: CIUDAD, APELLIDO Y NOMBRE. Deben estar
ordenado por ciudad y por apellido.
2) Listar todas las filas únicamente de la ciudad de LIMA. Deben estar ordenado por
apellido y por nombre.
3) Visualizar únicamente las filas de ICA, comprendidos entre las edades de 18 y 35 y
cuyos apellidos se inicien con letra A.
4) Determinar el total de filas que cumplieron con las condiciones del ejercicio 2 y
ADEMAS el promedio de las edades.
5) Determinar el total de filas que cumplieron con las condiciones del ejercicio 3 y
ADEMAS el promedio de las edades.
6) Listar todas las filas con todas sus columnas; y al final obtener un resumen, en una
sola fila, con el número (total) de registros, el promedio de las edades, cual es la edad
mayor y cuál es la edad menor.
7) Listar todas las filas con todas sus columnas; obtener una fila por cada grupo de
ciudades, con el número (total) de registros de dicha ciudad, el promedio de las
edades de dicha ciudad, cual es la edad mayor de dicha ciudad y cuál es la edad
menor de dicha ciudad. AL FINAL obtener un resumen, en una sola fila, con el
número (total) de registros, el promedio de las edades, cual es la edad mayor y cuál
es la edad menor.
8) Listar las filas con cinco columnas: CIUDAD, APELLIDO, NOMBRE, EDAD y el
campo INCREMENTADO. Deben estar ordenado por ciudad y por apellido. La
columna INCREMENTADO debe figurar la edad incrementado en 1.
9) Listar las filas con cinco columnas: CIUDAD, APELLIDO, NOMBRE, EDAD y el
campo CUMPLEAÑOS. Deben estar ordenado por ciudad y por apellido. La columna
CUMPLEAÑOS debe figurar EL AÑO que caerá a partir de la edad actual. Ejemplo:
Si tiene 34 años, a partir del año actual (que debe ser el de la computadora), su
próximo cumpleaños será en el 2042.
10) Listar todos los campos de los empleados que tengan las edades de 21, 25, 31, 32,
38 ó 40 Y sus códigos deben ser impares (no usar AND u OR para buscar las
edades).
11) Determinar SOLO PARA LA CIUDAD DE LIMA: el promedio de edades, el número
de registros, la máxima y la mínima edad y la suma de edades incrementado en un
10%.
12) Listar todos los campos, y además la columna con el nombre de
AUTOGENERADO. Esta columna, deberá tener de manera concatenada: La
primera letra del nombre + la tercera letra del nombre + la primera letra del apellido
+ la tercera letra del apellido + la segunda y tercera letra del nombre (todo en
minúscula) + la segunda y tercera letra del apellido (todo en minúscula) + el texto
SENATI + la edad + el nombre del mes actual de la computadora (en letras y en
minúscula).
13) Listar en UNA SOLA COLUMNA, el nombre y el apellido de aquellas filas cuyos
nombres sean "pablo" o "juan" (entre el nombre y el apellido, deje un espacio vacío).
Se usa funciones de cadena.
14) Listar los campos nombre, apellido y edad, solo si la edad es mayor a 30 y la ultima
letra del nombre sea a y la segunda letra del apellido sea u y debe estar ordenado
descendentemente por edad.
15) De su fecha de nacimiento, con el formato dd/mm/yyyyy debe obtener la frase: “yo
nací el miércoles 23 de octubre de 1984” (saldrá de esta manera si la fecha de
nacimiento fuera 23/10/1984. Se utiliza una sola instrucción select con FUNCIONES
DE CADENA.
MARCO TEÓRICO
Lenguaje de definición de datos (DDL).
Las sentencias DDL se utilizan para crear y modificar la estructura de las tablas, así
como otros objetos de la base de datos.
TRUNCATE - Elimina todos los registros de la tabla, incluyendo todos los espacios
asignados a los registros.
En todas estas consultas, el único dato devuelto por SQL es el número de registros que
se han modificado.
Cláusulas.
Las cláusulas son condiciones de modificación utilizadas para definir los datos que
desea seleccionar o manipular.
Cláusula
FROM: Utilizada para especificar la tabla de la cual se van a seleccionar los registros
WHERE: Utilizada para especificar las condiciones que deben reunir los registros que
se van a seleccionar
GROUP BY: Utilizada para separar los registros seleccionados en grupos específicos.
HAVING: Utilizada para expresar la condición que debe satisfacer cada grupo.
ORDER BY: Utilizada para ordenar los registros seleccionados de acuerdo con un orden
específic.
Inserción de datos.
La adición de datos a una tabla se realiza mediante la instrucción:
INSERT. Su sintaxis fundamental es:
La tabla representa a la que se quiere añadir el registro y los valores que siguen a
VALUES son los valores que se dan a los distintos campos del registro.
El lenguaje SQL especifica la lista de campos, la lista de valores debe seguir el orden
de las columnas según fueron creados (es el orden de columnas según las devuelve el
commando DESCRIBE).
La lista de campos a rellenar se indica si no queremos rellenar todos los campos. Los
campos no rellenados explícitamente con la orden INSERT, se rellenan con su valor por
defecto (DEFAULT) o bien con NULL si no se indicó valor alguno. Si algún campo tiene
restricción de tipo NOT NULL, ocurrirá un error si no rellenamos el campo con algún
valor.
Por ejemplo, supongamos que tenemos una tabla de clientes cuyos campos son: dni,
nombre, apellido1, apellido2, localidad y dirección; supongamos que ese es el orden de
creación de los campos de esa tabla y que la localidad tiene como valor por defecto
Palencia y la dirección no tiene valor por defecto. En ese caso estas dos instrucciones
son equivalentes:
El uso de los distintos tipos de datos debe de cumplir los requisitos ya comentados en
temas anteriores, relleno de registros a partir de filas de una consulta.
Hay un tipo de consulta, llamada de adición de datos, que permite rellenar datos de una
tabla copiando el resultado de una consulta.
Ese relleno se basa en una consulta SELECT que poseerá los datos a añadir.
Lógicamente el orden de esos campos debe de coincidir con la lista de campos indicada
en la instrucción INDEX. Sintaxis:
INSERT INTO tabla (campo1, campo2,...)
SELECT campoCompatibleCampo1, campoCompatibleCampo2,...
FROM tabla(s)
[...otras cláusulas del SELECT...]
Ejemplo:
INSERT INTO clientes2017 (dni, nombre, localidad, direccion)
SELECT dni, nombre, localidad, direccion
FROM clientes
WHERE problemas=0;
Actualización de registros.
La modificación de los datos de los registros lo implementa la instrucción:
UPDATE.
Sintaxis:
UPDATE tabla
SET columna1=valor1 [, columna2=valor2...]
[WHERE condición]
}
Se modifican las columnas indicadas en el apartado SET con los valores indicados. La
cláusula WHERE permite especificar qué registros serán modificados.
Ejemplos:
UPDATE clientes SET provincia='Ourense'
WHERE provincia='Orense';
UPDATE productos SET precio=precio*1.16;
El primer dato actualiza la provincia de los clientes de Orense para que aparezca como
Ourense. El segundo UPDATE incrementa los precios en un 16%. La expresión para el
valor puede ser todo lo compleja que se desee:
Esta consulta coloca a todos los empleados de la sección 23 el mismo puesto de trabajo
que el empleado número 12. Este tipo de actualizaciones sólo son válidas si el subselect
devuelve un único valor, que además debe de ser compatible con la columna que se
actualiza.
Hay que tener en cuenta que las actualizaciones no pueden saltarse las reglas de
integridad que posean las tablas.
Borrado de registros.
Se realiza mediante la instrucción:
DELETE:
DELETE [FROM] tabla
[WHERE condición]
Transacciones.
Como se ha comentado anteriormente, una transacción está formada por una serie de
instrucciones DML. Una transacción comienza con la primera instrucción DML que se
ejecute y finaliza con alguna de estas circunstancias:
Una operación COMMIT o ROLLBACK
Una instrucción DDL (como ALTER TABLE por ejemplo)
Una instrucción DCL (como GRANT)
El usuario abandona la sesión
Caída del sistema
Hay que tener en cuenta que cualquier instrucción DDL o DCL da lugar a un COMMIT
implícito, es decir todas las instrucciones DML ejecutadas hasta ese instante pasan a
ser definitivas.
Commit
La instrucción COMMIT hace que los cambios realizados por la transacción sean
definitivos, irrevocables. Sólo se debe utilizar si estamos de acuerdo con los cambios,
conviene asegurarse mucho antes de realizar el COMMIT ya que las instrucciones
ejecutadas pueden afectar a miles de registros.
Además, el cierre correcto de la sesión da lugar a un COMMIT, aunque siempre
conviene ejecutar explícitamente esta instrucción a fin de asegurar lo que se hace.
Rollback
Esta instrucción regresa a la instrucción anterior al inicio de la transacción, normalmente
el último COMMIT, la última instrucción DDL o DCL o al inicio de sesión. Anula
definitivamente los cambios, por lo que conviene también asegurarse de esta operación.
Un abandono de sesión incorrecto o un problema de comunicación o de caída del
sistema dan lugar a un ROLLBACK implícito.
El resto de usuarios ven los datos tal cual estaban antes de la transacción; de hecho,
los registros afectados por la transacción aparecen bloqueados hasta que la
Transacción finalice. Esos usuarios no podrán modificar los valores de dichos Registros.
Tras la transacción todos los usuarios ven los datos tal cual quedan tras el fin de
Transacción. Los bloqueos son liberados y los puntos de ruptura borrados.
Vistas.
Introducción.
Una vista no es más que una consulta almacenada a fin de utilizarla tantas veces como
se desee. Una vista no contiene datos sino la instrucción SELECT necesaria para crear
la vista, eso asegura que los datos sean coherentes al utilizar los datos almacenados
en las tablas. Por todo ello, las vistas gastan muy poco espacio de disco.
FORCE. Crea la vista, aunque los datos de la consulta SELECT no existan vista.
Nombre que se le da a la vista alias. Lista de alias que se establecen para las columnas
devueltas por la consulta SELECT en la que se basa esta vista. El número de alias debe
coincidir con el número de columnas devueltas por SELECT.
WITH CHECK OPTION. Hace que sólo las filas que se muestran en la vista puedan ser
añadidas (INSERT) o modificadas (UPDATE). La restricción que sigue a esta sección
es el nombre que se le da a esta restricción de tipo CHECK OPTION.
WITH READ ONLY. Hace que la vista sea de sólo lectura. Permite grabar un nombre
para esta restricción.
Lo bueno de las vistas es que tras su creación se utilizan como si fueran una tabla.
Ejemplo:
CREATE VIEW resumen
/* alias */
(id_localidad, localidad, poblacion, n_provincia, provincia,
superficie, capital_provincia,
id_comunidad, comunidad, capital_comunidad)
AS
(SELECT l.id_localidad, [Link], [Link],n_provincia, [Link], [Link],
[Link],id_comunidad, [Link], [Link]
FROM localidades l
JOIN provincias p USING (n_provincia)
JOIN comunidades c USING (id_comunidad)
JOIN localidades l2 ON (p.id_capital=l2.id_localidad)
JOIN localidades l3 ON (c.id_capital=l3.id_localidad)
)
SELECT DISTINCT (comunidad, capital_comunidad) FROM resumen;
La creación de la vista del ejemplo es compleja ya que hay relaciones complicadas, pero
una vez creada la vista, se le pueden hacer consultas como si se tratara de una tabla
normal. Incluso se puede utilizar el comando DESCRIBE sobre la vista para mostrar la
estructura de los campos que forman la vista ejecución de comandos DML sobre vistas.
Las instrucciones DML ejecutadas sobre las vistas permiten añadir o modificar los datos
de las tablas relacionados con las filas de la vista. Ahora bien, no es posible ejecutar
instrucciones DML sobre vistas que:
añadir el dato se tendría que añadir el registro colocando el valor NULL en el campo).
Ejemplo (sobre la vista anterior):
INSERT INTO resumen(id_localidad, localidad, poblacion)
VALUES (10000, 'Sevilla', 750000)
Mostrar la lista de vistas
La vista del diccionario de datos de Oracle USER_VIEWS permite mostrar una lista de
todas las vistas que posee el usuario actual. Es decir, para saber qué vistas hay
disponibles se usa:
SELECT * FROM USER_VIEWS;
La columna TEXT de esa vista contiene la sentencia SQL que se utilizó para crear la
vista (sentencia que es ejecutada cada vez que se invoca a la vista).
Borrar vistas.
Se utiliza el comando DROP VIEW:
DROP VIEW nombreDeVista;
secuencias
Una secuencia sirve para generar automáticamente números distintos. Se utilizan para
generar valores para campos que se utilizan como clave forzada (claves cuyo valor no
interesa, sólo sirven para identificar los registros de una tabla). Es decir, se utilizan en
los identificadores de las tablas (campos que comienzan con la palabra id), siempre y
cuando no importe qué número se asigna a cada fila.
Es una rutina interna de la base de datos la que realiza la función de generar un número
distinto cada vez. Las secuencias se almacenan independientemente de la tabla, por lo
que la misma secuencia se puede utilizar para diversas tablas.
Sistemas Gestores de Bases de Datos
Lenguaje SQL
Creación de secuencias
Sintaxis:
CREATE SEQUENCE secuencia
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n|NOMAXVALUE}]
[{MINVALUE n|NOMINVALUE}]
[{CYCLE|NOCYCLE}]
Donde:
secuencia. Es el nombre que se le da al objeto de secuencia
INCREMENT BY. Indica cuánto se incrementa la secuencia cada vez que se usa.
Por defecto se incrementa de uno en uno
START WITH. Indica el valor inicial de la secuencia (por defecto 1)
MAXVALUE. Máximo valor que puede tomar la secuencia. Si no se toma
Ejemplo:
CREATE SEQUENCE numeroPlanta
INCREMENT 100
STARTS WITH 100
MAXVALUE 2000
Uso de la secuencia.
Los métodos NEXTVAL y CURRVAL se utilizan para obtener el siguiente número y el
valor actual de la secuencia respectivamente. Ejemplo de uso:
Mdificar secuencias.
Se pueden modificar las secuencias, pero la modificación sólo puede afectar a los
futuros valores de la secuencia, no a los ya utilizados. Sintaxis:
ALTER SEQUENCE secuencia
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n|NOMAXVALUE}]
[{MINVALUE n|NOMINVALUE}]
[{CYCLE|NOCYCLE}]
Borrar secuencias.
Lo hace el comando DROP SEQUENCE seguido del nombre de la secuencia a borrar.
Índices.
Los índices son esquemas que hacen que una base de datos acelere las operaciones
de consulta y ordenación sobre los campos a los que el índice hace referencia. Se
almacenan aparte de la tabla a la que hace referencia, lo que permite crearles y borrarles
en cualquier momento.
Lo que realizan es una lista ordenada por la que Oracle puede acceder para facilitar la
búsqueda de los datos. cada vez que se añade un nuevo registro, los índices
involucrados se actualizan a fin de que su información esté al día. De ahí que cuantos
más índices haya, más le cuesta a Oracle añadir registros, pero más rápidas se realizan
las instrucciones de consulta.
Creación de índices.
Aparte de los índices obligatorios comentados anteriormente, se pueden crear índices
de forma explícita. Éstos se crean para aquellos campos sobre los cuales se realizarán
búsquedas e instrucciones de ordenación frecuente.
Sintaxis:
CREATE INDEX nombre
ON tabla (columna1 [,columna2...])
Ejemplo:
CREATE INDEX nombre_completo
ON clientes (apellido1, apellido2, nombre);
El ejemplo crea un índice para los campos apellido1, apellido2 y nombre. Esto no es
lo Mismo que crear un índice para cada campo, este índice es efectivo cuando se buscan
Ordenan clientes usando los tres campos (apellido1, apellido2, nombre) a la vez.
Son parte de listados de consultas de grandes tablas sobre las que casi siempre se
Muestran como mucho un 4% de su contenido.
Se utilizan en expresiones.
Lista de índices.
Para ver la lista de índices se utiliza la vista USER_INDEXES. Mientras que la vista
USER_IND_COLUMNS Muestra la lista de columnas que son utilizadas por índices.
Creacion de la tabla:
Paso 1.
Caso Aplicativo.
Paso 1. Crear las siguientes tablas:
Tabla : Empleado.
Tabla movimiento.
Paso 3.
Ejemplo 2:
2. Eliminación de la BD.
Paso1. Click derecho en la BD/elegir drop database.
3. Generar script.
Paso 1.
Paso 2.
Paso 3. Exportar.
2. Creación de la tabla.
6. Eliminación de registros.
DELETE FROM empleado
DELETE FROM empleado WHERE `vch_emplpaterno` LIKE 'R%' AND
´chr_emplcodigo` > '0003'
7. Modificacion de registro.
UPDATE empleado SET `vch_emplclave` = '123456' WHERE `chr_emplcodigo` = '0001'
8. Eliminacion de un table.
Drop table empleado.
Ejercicio Libre:
Paso 2.
INSERT INTO libros (titulo,autor,editorial,precio)
VALUES('El alehp','Borges','Paidos',33.4);
INSERT INTO libros (titulo,autor,editorial,precio)
VALUES('Alicia en el pais de las maravillas','L. Carroll','Planeta',16);
Ejercicicio:
Utilizando el Script crear la base de datos ALMACEN, cuyas tablas son las siguiente:
ARTÍCULOS:
PROVEEDORES: CATEGORÍAS:
.
h) Relación de artículos que ingresaron a almacén a partir de la segunda quincena de
julio del 2002.
i) Relación artículos cuya antepenúltima letra de la Marca sea cualquiera de las ultimas
6 letras del abecedario.
k) Elaborar una lista de artículos de la marca LG, SONY e INTEL cuyo Stock sea mayor
a 2 unidades.
l) Elaborar una lista de CD, Teclado, Mouse y Memoria que ingresaron en al almacen
a partir del año 2003.
CLIENTES:
CODCLI APECLI NOMCLI DIRCLI DISTCLI RUCCLI TELCLI FNCLI SEXOCLI
001 CARRANZA RAFAEL Av. Venezuela Breña 10141512123 4252623 10/02/78 M
002 RUIZ NANCY 345 Lince 4645223 14/05/73 F
003 OLIVA Jr. Junín 345
. MENDEZ
.
.
010
PRODUCTOS:
FACTURAS:
DETFAC:
CATEGORÍA:
CODCAT NOMCAT
001 ABARROTES
002 PANADERIA
003 LACTEOS
004 LIMPIEZA
MARCO TEÓRICO
TIPO DE DATOS.
MySQL soporta un número de tipos de columnas divididos en varias categorías: tipos
numéricos, tipos de fecha y hora, y tipos de cadenas de caracteres.
Varias descripciones de los tipos de columnas usan estas convenciones:
M ->Indica la máxima anchura al mostrar los datos. El máximo ancho de muestra es 255.
D ->Se aplica a tipos de coma flotante y de coma fija e indica el número de dígitos a
continuación del punto decimal. El valor máximo posible es 30, pero no debe ser mayor que
M-2.
Los corchetes ('[' y ']') indican partes de especificadores de tipos que son opcionales.
TIPOS NUMÉRICOS
BIT[(M)]
En un tipo de datos bit. M indica el número de bits por valor, de 1 a 64. El valor por defecto es
1 si se omite M.
Este tipo de datos se añadió en MySQL 5.0.3 para MyISAM, una extensión en 5.0.5 para
MEMORY, InnoDB, y BDB. Antes de 5.0.3, BIT es un sinónimo de TINYINT(1).
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
Un entero muy pequeño. El rango con signo es de -128 a 127. El rango sin signo es de 0 a
255. BOOL, BOOLEAN Son sinónimos para TINYINT(1). Un valor de cero se considera falso.
Valores distintos a cero se consideran ciertos.
En el futuro, se introducirá tratamiento completo de tipos booleanos según el estándard SQL.
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
Un entero pequeño. El rango con signo es de -32768 a 32767. El rango sin signo es de 0 a
65535.
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
Entero de tamaño medio. El rango con signo es de -8388608 a 8388607. El rango sin singo
es de 0 a 16777215.
INT[(M)] [UNSIGNED] [ZEROFILL]
Toda la aritmética se hace usando valores BIGINT o DOUBLE, así que no debe usar enteros
sin signos mayores que 9223372036854775807 (63 bits) except con funciones bit! Si lo hace,
algunos de los últimos dígitos en el resultado pueden ser erróneos por culpa de errores de
redondeo al convertir valores BIGINT a DOUBLE.
Siempre puede guardar un valor entero exacto en una columna BIGINT almacenándolo
usando una cadena de carácteres. En este caso, MySQL realiza una conversión cadena de
carácteres-número que no implica representación de doble precisión intermedia.
Usar FLOAT puede darle algunos problemas inesperados ya que todos los cálculos se en
MySQL se hacen con doble precisión.
Un número de coma flotante pequeño (de precisión simple). Los valores permitidos son de -
3.402823466E+38 a -1.175494351E-38, 0, y de 1.175494351E-38 a 3.402823466E+38. Si se
especifica UNSIGNED, los valores negativos no se permiten. M es la anchura de muestra y D
es el número de dígitos significativos. FLOAT sin argumentos o FLOAT(p) (donde p está en
el rango de 0 a 24) es un número de coma flotante con precisión simple.
Todos los cálculos básicos (+, -, *, /) con columnas DECIMAL se hacen con precisión de 64
dígitos decimales. Si se omite D, el valor por defecto es 0. Si se omite M, el valor por defecto
es 10.
TIPOS CRONOLÓGICOS.
1.-DATE
Una fecha. El rango soportado es de '1000-01-01' a '9999-12-31'. MySQL muestra valores
DATE en formato 'YYYY-MM-DD', pero permite asignar valores a columnas DATE usando
cadenas de caracteres o números.
2.-DATETIME
Combinación de fecha y hora. El rango soportado es de '1000-01-01 [Link]' a '9999-12-31
[Link]'. MySQL muestra valores DATETIME en formato 'YYYY-MM-DD HH:MM:SS', pero
permite asignar valores a las columnas DATETIME usando cadenas de caracteres o números.
TIMESTAMP[(M)]
Una marca temporal. El rango es de '1970-01-01 [Link]' hasta el año 2037.
Una columna TIMESTAMP es útil para registrar la fecha y hora de una operación INSERT o
UPDATE . La primera columna TIMESTAMP en una tabla se rellena automáticamente con la
fecha y hora de la operación más reciente si no le asigna un valor. Puede asignar a cualquier
columna TIMESTAMP la fecha y hora actual asignándole un valor NULL .
En MySQL 5.0, TIMESTAMP se retorna como una cadena de caracteres en el formato 'YYYY-
MM-DD HH:MM:SS' cuya anchura de muestra son 19 caracteres. Si quiere obtener el valor
como un número, debe añadir +0 a la columna timestamp .
3.-TIME
Una hora. El rango es de '-[Link]' a '[Link]'. MySQL muestra los valores TIME en
formato 'HH:MM:SS', pero permite asignar valores a columnas TIME usando números o
cadenas de caracteres.
4.-YEAR [(2|4)]
Un año en formato de dos o cuatro dígitos. El valor por defecto está en formato de cuatro
dígitos. En formato de cuatro dígitos, los valores permitidos son de 1901 a 2155, y 0000. En
formato de dos dígitos, los valores permitidos son de 70 a 69, representando los años de 1970
a 2069. MySQL muestra los valores YEAR en formato YYYY pero permite asignar valores a
columnas YEAR usando cadenas de caracteres o números.
Nota: Los espacios a la derecha se borran cuando se obtiene los valores CHAR.
Antes de MySQL 5.0.3, una columna CHAR con una longitud especificada mayor que 255 se
convierte al tipo TEXT más pequeño que pueda tener los valores de la longitud dada. Por
ejemplo, CHAR(500) se convierte a TEXT, y CHAR(200000) se convierte en MEDIUMTEXT.
Esta es una característica de compatibilidad. Sin embargo, esta conversión causa que la
columna tenga longitud variable, y también afecta a la eliminación de espacios.
CHAR es una abreviatura para CHARACTER. NATIONAL CHAR (o su forma equivalente de,
NCHAR) es la forma estándard de SQL de definir que una columna CHAR debe usar el
conjunto de caracteres por defecto. Este es el comportamiento por defecto en MySQL.
El atributo BINARY es una abreviatura para especificar la colación binaria del conjunto de
caracteres de la columna. La ordenación y comparación se basa en los valores numéricos de
los caracteres.
El tipo de columna CHAR BYTE es un alias para CHAR BINARY. Esta es una característica
de compatibilidad.
El atributo ASCII puede especificarse para CHAR. Asigna el conjunto de caracteres latin1. El
atributo UNICODE puede especificarse en MySQL 5.0 para CHAR. Asigna el conjunto de
caracteres ucs2 .
MySQL le permite crear un tipo de columna CHAR(0). Esto es útil cuando tiene que cumplir
con las especificaciones de alguna aplicación vieja que dependa de la existencia de una
columna pero que no usa realmente el valor. Esto es también útil cuando necesita una
columna que sólo pueda tener dos valores: Una columna CHAR(0) que no esté definido como
NOT NULL ocupa sólo un bit y sólo puede tener dos valores NULL y '' (la cadena de
caracteres vacía).
CHAR
Es un sinónimo de CHAR(1).
[NATIONAL] VARCHAR(M) [BINARY]
Cadena de carácteres de longitud variable. M representa la longitud de columna máxima. En
MySQL 5.0, el rango de M es de 0 a 255 antes de MySQL 5.0.3, y de 0 a 65,535 en MySQL
5.0.3 y posterior. (La longitud máxima real de un VARCHAR en MySQL 5.0 se determina por
el tamaño de registro máximo y el conjunto de carácteres que use. La longitud máxima efectiva
desde MySQL 5.0.3 es de 65,532 bytes.).
Nota: Antes de 5.0.3, los espacios finales se eliminaban cuando se almacenaban los valores
VARCHAR, lo que difiere de le especificación estándard de SQL.
Previo a MySQL 5.0.3, una columna VARCHAR con una longitud especificada mayor a 255
se convertía al valor de tipo TEXT más pequeño que podía soportar el valor de la longitud
dada. Por ejemplo, VARCHAR(500) se convertía a TEXT, y VARCHAR(200000) se convertía
a MEDIUMTEXT. Esto era una cuestión de compatibilidad. Sin embargo, esta conversión
afectaba la eliminación de espacios finales.
Desde MySQL 5.0.3, VARCHAR se guarda con un prefijo de longitud de uno o dos bytes +
datos. La longitud del prefijo es de dos bytes si la columna VARCHAR se declara con una
longitud mayor a 255.
BINARY(M)
El tipo BINARY es similar al tipo CHAR, pero almacena cadenas de datos binarios en lugar
de cadenas de carácteres no binarias.
VARBINARY(M)
El tipo VARBINARY es similar al tipo VARCHAR, pero almacena cadenas de carácteres
binarias en lugar de cadenas de carácteres no binarias.
TINYBLOB
Una columna BLOB con una longitud máxima de 255 (2^8 - 1) bytes.
TINYTEXT
Una columna TEXT con longitud máxima de 255 (2^8 - 1) carácteres.
BLOB[(M)]
Una columna BLOB con longitud máxima de 65,535 (2^16 - 1) bytes.
Una longitud opcional M puede darse para este tipo en MySQL 5.0. Si se hace, MySQL creará
las columnas como el tipo BLOB de tamaño mínimo para tratar los valores de M bytes.
TEXT[(M)]
Una columna TEXT con longitud máxima de 65,535 (2^16 - 1) carácteres.
En MySQL 5.0, se puede dar una longitud opcional M . En ese caso MySQL creará las
columnas con el tipo TEXT de longitud mínima para almacenar los valores de longitud M.
MEDIUMBLOB
Una columna BLOB con longitud de 16,777,215 (2^24 - 1) bytes.
MEDIUMTEXT
Una columna TEXT con longitud máxima de 16,777,215 (2^24 - 1) carácteres.
LONGBLOB
Una columna BLOB con longitud máxima de 4,294,967,295 o 4GB (2^32 - 1) bytes. La
longitud máxima efectiva (permitida) de las columnas LONGBLOB depende del tamaño
máximo configurado para los paquetes en el protocolo cliente/servidor y la memoria
disponible.
LONGTEXT
Una columna TEXT con longitud máxima de 4,294,967,295 or 4GB (2^32 - 1) carácteres. La
longitud máxima efectiva (permitida) de columnas LONGTEXT depende del tamaño máximo
de paquete configurado en el protocolo cliente/servidor y la memoria disponible.
ENUM('value1','value2',...)
Una enumeración. Un objeto de cadena de carácteres que sólo puede tener un valor, elegido
de una lista de valores 'value1', 'value2', ..., NULL o el valor de error especial '' . Una columna
ENUM puede tener un máximo de 65,535 valores distintos. Los valores ENUM se representan
internamente como enteros.
SET('value1','value2',...)
Un conjunto. Un objeto de cadena de carácteres que puede tener cero o más valores que
deben pertenecer a la lista de valores 'value1', 'value2', ... Una columna SET puede tener un
máximo de 64 miembros. Los valores SET se representan internamente como enteros.
FUNCIONES DE MySQL
Funciones para cadena de caracteres
Las funciones de cadenas de carácteres retornan NULL si la longitud del resultado es mayor
que el valor de la variable de sistema max_allowed_packet .
BIT_LENGTH(str)
Retorna la longitud de la cadena de carácteres str en bits.
mysql> SELECT BIT_LENGTH('text'); -> 32
CHAR(N,...)
CHAR() interpreta los argumentos como enteros y retorna la cadena de carácteres que
consiste en los carácteres dados por los códigos de tales enteros. Los valores NULL no se
tienen en cuenta.
mysql> SELECT CHAR(77,121,83,81,'76'); -> 'MySQL'
mysql> SELECT CHAR(77,77.3,'77.3'); -> 'MMM'
CHAR_LENGTH(str)
Retorna la longitud de la cadena de carácteres str, medida en carácteres. Un carácter de
múltiples bytes cuenta como un sólo carácter. Esto significa que para una cadena de
carácteres que contiene cinco carácteres de dos bytes, LENGTH() retorna 10, mientras
CHAR_LENGTH() returna 5.
CONCAT(str1,str2,...)
Retorna la cadena resultado de concatenar los argumentos. Retorna NULL si algúna
argumento es NULL. Puede tener uno o más argumentos. Si todos los argumentos son
cadenas no binarias, el resultado es una cadena no binaria. Si los argumentos incluyen
cualquier cadena binaria, el resultado es una cadena binaria. Un argumento numérico se
convierte a su forma de cadena binaria equivalente; si quiere evitarlo puede usar conversión
de tipos explícita, como en este ejemplo: SELECT CONCAT(CAST(int_col AS CHAR),
char_col)
mysql> SELECT CONCAT('My', 'S', 'QL'); -> 'MySQL'
mysql> SELECT CONCAT('My', NULL, 'QL'); -> NULL
mysql> SELECT CONCAT(14.3); -> '14.3'
INSTR(str,substr)
Retorna la posición de la primera ocurrencia de la subcadena substr en la cadena str. Es lo
mismo que la forma de dos argumentos de LOCATE(), excepto que el orden de los
argumentos es inverso.
mysql> SELECT INSTR('foobarbar', 'bar'); -> 4
mysql> SELECT INSTR('xbar', 'foobar'); -> 0
Esta función puede trabajar con múltiples bytes. En MySQL 5.0, sólo es sensible a mayúsculas
si uno de los argumentos es una cadena binaria.
LCASE(str)
LEFT(str,len)
Retorna los len carácteres empezando por la izquierda de la cadena str.
mysql> SELECT LEFT('foobarbar', 5); -> 'fooba'
LENGTH(str)
Retorna la longitud de la cadena str, medida en bytes. Un carácter multi-byte cuenta como
múltiples bytes. Esto significa que para cadenas que contengan cinco carácteres de dos bytes,
LENGTH() retorna 10, mientras que CHAR_LENGTH() retorna 5.
mysql> SELECT LENGTH('text'); -> 4
LOWER(str)
Retorna la cadena str con todos los carácteres cambiados a minúsculas según el mapeo del
conjunto de carácteres actual (por defecto es ISO-8859-1 Latin1).
mysql> SELECT LOWER('QUADRATICALLY'); -> 'quadratically'
Esta función funciona con múltiples bytes.
LPAD(str,len,padstr)
Retorna la cadena str, alineado a la izquierda con la cadena padstr a una longitud de len
carácteres. Si str es mayor que len, el valor retornado se acorta a len carácteres.
mysql> SELECT LPAD('hi',4,'??'); -> '??hi'
mysql> SELECT LPAD('hi',1,'??'); -> 'h'
LTRIM(str)
Retorna la cadena str con los carácteres en blanco iniciales eliminados.
mysql> SELECT LTRIM(' barbar'); -> 'barbar'
Esta función trabaja con múltiples bytes.
MAKE_SET(bits,str1,str2,...)
Retorna un conjunto de valores (una cadena conteniendo subcadenas separadas por
carácteres ',' ) consistiendo en cadenas que tienen el bit correspondiente en bits asignado.
str1 se corresponde al bit 0, str2 al bit 1, y así. Los valores NULL en str1, str2, ... no se añaden
al resultado.
mysql> SELECT MAKE_SET(1,'a','b','c'); -> 'a'
mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');-> 'hello,world'
mysql> SELECT MAKE_SET(1 | 4,'hello','nice',NULL,'world');-> 'hello'
mysql> SELECT MAKE_SET(0,'a','b','c'); -> ''
MID(str,pos,len)
MID(str,pos,len) es sinónimo de SUBSTRING(str,pos,len).
OCT(N)
Retorna una representación en cadena del valor octal de N, donde N es un número largo
(BIGINT). Es equivalente a CONV(N,10,8). Retorna NULL si N es NULL.
mysql> SELECT OCT(12); -> '14'
OCTET_LENGTH(str)
OCTET_LENGTH() es sinónimo de LENGTH().
ORD(str)
Si el carácter más a la izquierda de la cadena str es un carácter multi-byte , retorna el código
de ese carácter, calculado a partir del valor numérico de sus bytes usando esta fórmula:
(1st byte code)+ (2nd byte code * 256)+ (3rd byte code * 256^2) ...
Si el caráctar más a la izquierda no es multi-byte , ORD() retorna el mismo valor que la función
ASCII() .
mysql> SELECT ORD('2'); -> 50
POSITION(substr IN str)
POSITION(substr IN str) es sinónimo de LOCATE(substr,str).
QUOTE(str)
Acota una cadena para producir un resultado que puede usarse como un valor con carácteres
de escape en un comando SQL. La cadena se retorna rodeado por comillas sencillas y con
cada instancia de comilla sencilla ('''), antibarra ('\'), ASCII NUL, y Control-Z predecidos por
una antibarra. Si el argumento es NULL, el valor de retorno es la palabra “NULL” sin comillas
alrededor.
mysql> SELECT QUOTE('Don\'t!'); -> 'Don\'t!'
mysql> SELECT QUOTE(NULL); -> NULL
REPEAT(str,count)
Retorna una cadena consistente de la cadena str repetida count veces. Si count <= 0, retorna
una cadena vacía. Retorna NULL si str o count son NULL.
mysql> SELECT REPEAT('MySQL', 3); -> 'MySQLMySQLMySQL'
REPLACE(str,from_str,to_str)
Retorna la cadena str con todas las ocurrencias de la cadena from_str reemplazadas con la
cadena to_str.
mysql> SELECT REPLACE('[Link]', 'w', 'Ww');-> '[Link]'
Esta función trabaja con múltiples bytes.
REVERSE(str)
Retorna la cadena str con el orden de los carácteres invertido.
mysql> SELECT REVERSE('abc'); -> 'cba'
Esta función trabaja con múltiples bytes.
RIGHT(str,len)
Retorna los len carácteres de la derecha de la cadena str.
mysql> SELECT RIGHT('foobarbar', 4); -> 'rbar'
Esta función trabaja con múltiples bytes.
RPAD(str,len,padstr)
Retorna la cadena str, alineada a la derecha con la cadena padstr con una longitud de len
carácteres. Si str es mayor que len, el valor de retorno se corta a len carácteres.
mysql> SELECT RPAD('hi',5,'?'); -> 'hi???'
RTRIM(str)
Retorna la cadena str con los espacios precedentes eliminados.
mysql> SELECT RTRIM('barbar '); -> 'barbar'
Esta función trabaja con múltiples bytes.
SPACE(N)
Retorna la cadena consistente en N carácteres blancos.
mysql> SELECT SPACE(6); -> ' '
Las formas sin el arguemnto len retornan una subcadena de la cadena str comenzando en la
posición pos. Las formas con el argumento len retornan una subcadena de longitud len a partir
de la cadena str, comenzando en la posición [Link] formas que usan FROM son sintaxis
SQL estándard. En MySQL 5.0, es posible usar valores negativos para pos. En este caso, el
inicio de la subcadena son pos carácteres a partir del final de la cadena, en lugar del principio.
Un valor negativo puede usarse para pos en cualquier de las formas de esta función.
mysql> SELECT SUBSTRING('Quadratically',5); -> 'ratically'
mysql> SELECT SUBSTRING('foobarbar' FROM 4); -> 'barbar'
mysql> SELECT SUBSTRING('Quadratically',5,6); -> 'ratica'
mysql> SELECT SUBSTRING('Sakila', -3); -> 'ila'
mysql> SELECT SUBSTRING('Sakila', -5, 3); -> 'aki'
mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2); -> 'ki'
Tener en cuenta que si usa un valor menor a 1 para len, el resultado siempre es una cadena
vacía.
UCASE(str)
UCASE() es sinónimo de UPPER().
UPPER(str)
Retorna la cadena str con todos los carácteres cambiados a mayúsculas según el mapeo del
conjunto de carácteres actual (por defecto es ISO-8859-1 Latin1).
mysql> SELECT UPPER('Hej'); -> 'HEJ'
ABS(X)
Retorna el valor absoluto de X.
mysql> SELECT ABS(2); -> 2
mysql> SELECT ABS(-32); -> 32
Esta función puede usar valores BIGINT.
CEILING(X), CEIL(X)
Retorna el entero más pequeño no menor a X.
mysql> SELECT CEILING(1.23); -> 2
mysql> SELECT CEIL(-1.23); -> -1
Estas dos funciones son sinónimos. Tenga en cuenta que el valor retornado se convierte a
BIGINT.
FLOOR(X)
Retorna el valor entero más grande pero no mayor a X.
mysql> SELECT FLOOR(1.23); -> 1
mysql> SELECT FLOOR(-1.23); -> -2
Tener en cuenta que el valor devuelto se convierte a BIGINT.
LN(X)
Retorna el logaritmo natural de X, esto es, el logaritmo de X base e.
mysql> SELECT LN(2);
-> 0.69314718055995
mysql> SELECT LN(-2);
-> NULL
MOD() también funciona con valores con una parte fraccional y retorna el res-to exacto tras la
división:
mysql> SELECT MOD(34.5,3); -> 1.5
POW(X,Y) , POWER(X,Y)
Retorna el valor de X a la potencia de Y.
mysql> SELECT POW(2,2); -> 4
mysql> SELECT POW(2,-2); -> 0.25
RAND(), RAND(N)
Retorna un valor aleatorio en coma flotante del rango de 0 a 1.0. Si se especifica un argumento
entero N, es usa como semilla, que produce una secuencia repetible.
mysql> SELECT RAND();
-> 0.9233482386203
mysql> SELECT RAND(20);
-> 0.15888261251047
mysql> SELECT RAND();
-> 0.63553050033332
mysql> SELECT RAND();
-> 0.70100469486881
mysql> SELECT RAND(20);
-> 0.15888261251047
Se puede usar esta función para recibir registros de forma aleatoria como se muestra aquí:
mysql> SELECT * FROM tbl_name ORDER BY RAND();
ORDER BY RAND() combinado con LIMIT es útil para seleccionar una muestra aleatoria de
una conjunto de registros:
mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d
-> ORDER BY RAND() LIMIT 1000;
Tener en cuenta que RAND() en una cláusula WHERE se re-evalúa cada vez que se ejecuta
el WHERE.
RAND() no pretende ser un generador de números aleatorios perfecto, pero es una forma
rápida de generar números aleatorios ad hoc portable entre plataformas para la misma versión
de MySQL.
ROUND(X), ROUND(X,D)
Retorna el argumento X, redondeado al entero más cercano. Con dos argumentos, retorna X
redondeado a D decimales. D puede ser negativo para redondear D dígitos a la izquierda del
punto decimal del valor X.
mysql> SELECT ROUND(-1.23); -> -1
mysql> SELECT ROUND(-1.58); -> -2
mysql> SELECT ROUND(1.58); -> 2
mysql> SELECT ROUND(1.298, 1); -> 1.3
mysql> SELECT ROUND(1.298, 0); -> 1
mysql> SELECT ROUND(23.298, -1); -> 20
El tipo de retorno es el mismo tipo que el del primer argumento (asumiendo que sea un entero,
doble o decimal). Esto significa que para un argumento entero, el resultado es un entero (sin
decimales).
Ejemplo 1:
Procedimiento almacenado que
hace un select y realiza grupos por
número de deparamento y cuenta
cuántos empleados hay en cada
departamento.
CLIENTES REGISTRADOS:
Ejemplo 4:
Ejemplo 5:
--Procedimiento de Modificacion(Edición)
select * from clientes
Create Procedure Usp_Update_CLiente
@Cod varchar(8),
@nom_cliente VarChar(50) ,
@ape_cliente VarChar(50) ,
@dir_cliente VarChar(50) ,
@tel_cliente VarChar(8),
@Ruc_cliente Varchar(15),
@DNI_cliente Varchar(8),
@Email_cliente Varchar(50),
@Distrito VarChar(3)
as
Update Clientes set
nom_cli=@nom_cliente,
ape_cli=@ape_cliente,
dir_cli=@dir_cliente,
tel_cli=@tel_cliente,
Ruc_cli=@ruc_cliente,
DNI_cli=@dni_cliente,Email_cli=@email_cliente,iddistrito=@Distrito
where IdCliente=@Cod
Go
Print 'Cliente Modificado'
Primero, verificar los registros que se tienen a disposición:
[Link],[Link],ProductName,UnitPrice
from Categories c inner join products p
on [Link]=[Link]
--Ejecutando
lista_productos 'Beverages'
Creando el procedimiento Lista de Nombres no se tiene que ingresar todo el nombre, sólo
unos cuantos caracteres como muestra el ejemplo:
Ejemplo 3: Procedimiento de consulta que muestra los libros que se encuentran activos; es
decir, cuyo estado sea igual a 1.
Ejemplo 6: Procedimiento almacenado que genera un Nuevo pedido (correlative), ideal para
generar códigos.
Ejecutando el procedimiento:
Ejemplo 7: Procedimiento que graba un nuevo pedido, primero generar un nuevo pedido y
posteriormente proceder a grabar el pedido. Deberá visualizarse como está en la pantalla:
---
select * from DET_PEDIDO
select * from libros
--Ejecucio del procedimiento
GRABAR_DETALLE 10253,16,4,120
Ejemplo 11:
Un Trigger es una rutina especial que se ejecuta automáticamente cuando surgen eventos
DDL, DML; aquí se podrán visualizar algunos ejemplos:
Ejemplo1:
Paso 1.
-- TRIGGERS DDL
-- CREAR UN TRIGGER QUE NO PERMITA ELIMINAR TABLAS EN LA BD ACTIVA
CREATE TRIGGER TR_ELIMINACION_TABLAS
ON DATABASE AFTER DROP_TABLE
AS
PRINT 'NO SE PERMITE LA ELIMINACION'
PRINT 'DE TABLAS EN ESTA BD'
ROLLBACK -- CANCELA A DROP TABLE
GO
Paso 3.
-- DISPARANDO AL TRIGGER
DROP TABLE TABLA1
GO
Ejemplo 2:
Trigger que no permite la eliminación y modificación de la tabla.
Solución:
ALTER TRIGGER TR_ELIMINACION_TABLAS
ON DATABASE AFTER DROP_TABLE,ALTER_TABLE
AS
-- lista los eventos realizados por el usuario
-- en formato XML
select eventdata()
DECLARE @NOMBD VARCHAR(30)
SET @NOMBD=DB_NAME()
PRINT 'NO SE PERMITE LA ELIMINACION'
PRINT 'Y LA MODIFICACION DE TABLAS EN LA BD '+@NOMBD
ROLLBACK -- CANCELA A DROP TABLE
GO
--Eliminacion de la tabla
DROP TABLE TABLA1
GO
---Modificacion de la tabla
ALTER TABLE TABLA1 DROP COLUMN COL2
GO
Ejemplo 3:
Paso 1. Crear la table.
CREATE TABLE GRABA_EVENTOS
( NUMERO INT IDENTITY,
EVENTOS XML
)
GO
--Triggers que muestra el evento realizado en una tabla por ejemplo evento o acción de
inserccion de registro
Nota: Utilizando el mismo trigger creado desde el inicio.
Ejemplo 4:
-- DESACTIVANDO UN TRIGGER DDL
DISABLE TRIGGER
TR_ELIMINACION_TABLAS ON
DATABASE
GO
-- ADICIONANDO UNA NUEVA COLUMNA
ALTER TABLE GRABA_EVENTOS
ADD NOMTABLA VARCHAR(20)
DEFAULT('') WITH VALUES
GO
SP_HELP GRABA_EVENTOS
GO
Ejemplo 5:
-- ACTIVANDO UN TRIGGER DDL
ENABLE TRIGGER TR_ELIMINACION_TABLAS ON DATABASE
GO
--Consultado
SELECT * FROM GRABA_EVENTOS;
--Intentado eliminar la tabla
Drop TABLE TABLA1
Ejemplo 6:
Trigger que no permite crear usuarios
------------------------------------------
-- Sp_grantdbaccess ha sido reemplazado / create user / sp_addlogin ha sido reemplazado
-- create login
CREATE TRIGGER TR_NO_CREA_USUARIOS
ON ALL SERVER AFTER CREATE_LOGIN
AS
DECLARE @NOMSERV VARCHAR(30)
SET @NOMSERV=CONVERT(VARCHAR(30),
SERVERPROPERTY('SERVERNAME'))
PRINT 'NO SE PUEDEN CREAR NUEVOS USUARIOS '
PRINT 'EN EL SERVIDOR '+@NOMSERV
ROLLBACK
GO
-- EJECUTANDO EL TRIGGER
CREATE LOGIN SQL1 WITH PASSWORD='123'
Triggers DML
Paso 1
CREATE DATABASE BDTRIGGERS
GO
USE BDTRIGGERS
GO
CREATE TABLE PRODUCTOS
(
COD_PROD INT IDENTITY,
NOM_PROD VARCHAR(50),
PRE_COM MONEY,
PRE_VTA MONEY,
COD_CAT INT
)
GO CREATE TABLE CATEGORIAS
(
COD_CAT INT IDENTITY,
NOM_CAT VARCHAR(50),
VAL_DSCTO DECIMAL(5,2)
)
INSERT CATEGORIAS VALUES('CATEGORIA
GO 1',0.1)
INSERT CATEGORIAS VALUES('CATEGORIA 2',0.2)
INSERT CATEGORIAS VALUES('CATEGORIA 3',0.3)
GO
INSERT PRODUCTOS VALUES('MOUSE',12,24,2)
INSERT PRODUCTOS VALUES('CD-ROM',28,35,1)
INSERT PRODUCTOS VALUES('TECLADO',15,29,2)
GO
Ejemplo 1:
CREATE TRIGGER TR_PROD_PRE_VTA
ON PRODUCTOS AFTER INSERT,UPDATE
AS
DECLARE @P_COM MONEY
DECLARE @P_VTA MONEY
SELECT @P_COM=PRE_COM,@P_VTA=PRE_VTA
FROM INSERTED
IF @P_VTA<@P_COM
BEGIN
PRINT 'ERROR EL PRECIO DE VTA '+STR(@P_VTA,5)
+' NO PUEDE SER MENOR AL DE COMPRA '+STR(@P_COM,5)
ROLLBACK
END
ELSE
PRINT 'PRECIO DE VENTA OK'
GO
--VISUALIZANDO REGISTROS
SELECT * FROM PRODUCTOS
--Intentando actualizar debera mostrar error porque el precio de venta es 1
UPDATE PRODUCTOS SET PRE_VTA=1 WHERE COD_PROD=1
Ejemplo 2:
-- CREAR UN TRIGGER QUE NO PERMITA ACTUALIZAR EL PRECIO DE VENTA
-- CON UN PORCENTAJE MAYOR DE DESCUENTO AL QUE TUVIERA POR LA
-- CATEGORIA A LA QUE PERTENECE
ALTER TABLE PRODUCTOS
DISABLE TRIGGER ALL
GO
SELECT * FROM PRODUCTOS
SELECT * FROM CATEGORIAS
CREATE TRIGGER TR_UPD_PRECIOS
ON PRODUCTOS AFTER UPDATE
AS
DECLARE @P_VTA_ANT MONEY, @P_VTA_NEW MONEY
SELECT @P_VTA_ANT=PRE_VTA FROM DELETED
SELECT @P_VTA_NEW=PRE_VTA FROM INSERTED
-- OBTENIENDO LA CATEGORIA DEL PRODUCTO ACTUALIZADO
DECLARE @COD_CAT INT
SELECT @COD_CAT=COD_CAT FROM INSERTED
-- OBTENIENDO EL PORCENTAJE DE DESCUENTO X LA CATEGORIA
DECLARE @PORCENTAJE DECIMAL (5,2)
SELECT @PORCENTAJE=VAL_DSCTO FROM CATEGORIAS
WHERE COD_CAT=@COD_CAT
-- P_VTA_ANT=100
-- COD_CAT = 1
-- PORCENTAJE=0.1
EJEMPLO 1:
Paso 1.
USE Northwind
AS
DECLARE @USER VARCHAR(30)
DECLARE @FECHA DATETIME
SELECT @USER=SYSTEM_USER,
@FECHA=GETDATE()
EJEMPLO 2:
CREATE TRIGGER TR_AUDITA_PRECIO
ON TBLPRODUCTOS AFTER UPDATE
AS
DECLARE @USER VARCHAR(30)
DECLARE @FECHA DATETIME
SELECT @USER=SYSTEM_USER,
@FECHA=GETDATE()
-- SI EL PRECIO ESTA SIENDO ACTUALIZADO
IF UPDATE(UNITPRICE)
BEGIN
INSERT AUDITORIA VALUES(
'TBLPRODUCTOS','ACTUALIZANDO PRECIOS',@USER,@FECHA)
END
GO
--ACTUALIZANDO LA TABLA
EJEMPLO 3:
----------------------------------------
-- CREAR UN TRIGGER QUE PERMITA ACTUALIZAR EL
-- STOCK DE PRODUCTOS CADA VEZ QUE SE INSERTE
-- UN NUEVO DETALLE EN LA TABLA TBLDETALLES.
-- SI EL NUEVO STOCK DEL PRODUCTO ES INFERIOR
-- AL STOCK MINIMO (50), SE DEBE AGREGAR UN
-- NUEVO REGISTRO A LA TABLA REQUERIMIENTOS.
--PASO 1.-CREACION DE TABLAS DE EJEMPLO
CREATE TABLE REQUERIMIENTOS
(
NUMERO INT IDENTITY,
COD_PROD INT, FECHA DATETIME
)
GO
--CREACION DEL TRIGGER
CREATE TRIGGER TR_ACT_STOCK
ON TBLDETALLES AFTER INSERT
AS
DECLARE @CODIGO INT,@STOCK INT,@CANT INT
SELECT @CODIGO=PRODUCTID,@CANT=CANTIDAD
FROM INSERTED
ELSE
ROLLBACK
GO
Print 'Descontar Stock de boleta creado'
BEGIN TRANSACTION
Insert Into HistorialProforma
(NumeroProforma,Fecha,SubTotal,IGV,UsuarioSistema,EstacionUsuario)
Values
(@NumeroProforma,@Fecha,@SubTotal,@IGV,System_User,Host_Name())
Commit Transaction
GO
Print 'Historial de proformas creado'
TABLA=[Link]('(EVENT_INSTANCE/ObjectName)[1]','varchar(20)'),
COMANDO=convert(varchar(20),
[Link]('data(EVENT_INSTANCE/EventType)'))
from audita_ddl
go
--Deshabilitando el trigger
disable trigger tr_no_borra_tablas on database
go
--Ahora si se podra eliminar la tabla
drop table tabla1
go
--FINAL
Ejemplo 1:
Paso 3.
Paso 2. Siguiente.
Importante: Si es Gmail será puerto 587 servidor smtp@[Link], si es Hotmail será puerto
25 y servidor smtp@[Link]
Paso 7.
Paso 9.
Paso 10.
Enviado correo:
Paso 12.
Visualizando correos enviados se tiene que esperar para que el mensaje llegue.
Caso 1:
‐‐Listado de productos cuyos cantidadaes sean
superiores a 100
SELECT ProductName
FROM Products
WHERE ProductID IN (SELECT ProductId
FROM [Order Details]
WHERE Quantity > 100)
Caso 2:
‐‐Lista de todos los clientes con su número total
de pedidos
SELECT CompanyName, Address,
OrderCount = (SELECT COUNT([Link]) FROM [Orders] O WHERE [Link] =
[Link]) FROM Customers C
Caso 3:
‐‐¿Qué productos fueron vendidos por unidad (es
decir, la cantidad = 1)
SELECT ProductName
FROM Products
WHERE ProductID = ANY
(SELECT ProductId
FROM [Order Details]
WHERE Quantity = 1)
Caso 4:
-- Lista de clientes que realizaron pedidos Mayores que el promedio de cada orden de
cliente
SELECT DISTINCT CompanyName + ' ' + Address as Direccion
FROM Customers, [Orders]
WHERE [Link] = [Orders].CustomerId
AND freight > ALL
(SELECT AVG(freight)
FROM [Orders]
GROUP BY CustomerId)
Paso 1. Suscripción, tomar en cuenta que una vez suscrito se contará con $200 dolares para
realizar pruebas. Una vez terminado su consumo tendrá la posibilidad de comprar si se cree
necesario. Para ello, deberá contar con una cuenta Hotmail gratuita o coorporativa, ver el
ejemplo:
Paso 2.
Paso 3.
Paso 4. Llenar los datos del formulario generará un código enviado al número telefónico.
Paso 6:
Paso 7:
TAREAS DE INVESTIGACIÓN
1) ¿Qué es Microsoft Azure?
2) ¿Qué son las Tecnologias SaaS, PaaS y IaaS? Exponer en clase sus diferencias con
un ejemplo.
3) Generar un video de creación de tablas en la base de datos creada.
4) Generar un video de subir una base de datos de Sqlserver a azure.
MARCO TEÓRICO
1. Nubes públicas. Los usuarios acceden a los servicios de manera compartida sin que
exista un exhaustivo control sobre la ubicación de la información que reside en los
servidores del proveedor. El hecho de sean públicas no es un sinónimo de sean inseguras.
2. Nubes privadas. Para los clientes que necesiten, por la criticidad de la información que
manejen una infraestructura, plataforma y aplicaciones de su uso exclusivo.
3. Nubes híbridas. Combinan características de las dos anteriores, de manera que parte del
servicio se puede ofrecer de manera privada (por ejemplo, la infraestructura) y otra parte
de manera compartida (por ejemplo, las herramientas de desarrollo).
Características de un servicio ‘cloud’.
Autoservicio bajo demanda. Un usuario debe poder, de forma unilateral, proveerse de
recursos informáticos tales como tiempo de proceso o capacidad de almacenamiento en la
medida de sus necesidades sin que sea necesaria la intervención humana del proveedor
del servicio.
Acceso amplio a la red. Los servicios proporcionados deben poder ser accesibles a través
de mecanismos estándares y desde plataformas heterogéneas (por ejemplo: ordenadores,
teléfonos móviles o tabletas).
Asignación común de recursos. Los recursos son puestos a disposición de los
consumidores siguiendo un modelo de multipropiedad, asignándose y reasignándose
dispositivos físicos o lógicos atendiendo a la demanda de dichos consumidores. En este
sentido el usuario no tiene un estricto control del lugar exacto en el que se encuentra su
información, aunque sí debe poder especificar un ámbito mínimo de actuación (por
ejemplo: un país, un estado o un centro de proceso de datos concreto).
Rápida elasticidad. Las capacidades en los recursos proporcionados a los usuarios deben
poder crecer o decrecer bajo demanda de los mismos con celeridad, incluso mediante
procesos automáticos.
Servicio medible. Los sistemas cloud deben controlar y optimizar sus recursos dotándose
de capacidades para medir su rendimiento en un nivel de abstracción suficiente para la
naturaleza del servicio proporcionado. Además, dicho control debe permitir ser reportado
de manera transparente tanto al proveedor del servicio como al consumidor del mismo.