lunes, 10 de diciembre de 2012

Fundamentos de Bases de Datos

 


# UNIDAD 6: LENGUAJE SQL
# 6.1 INTRUDUCCIÓN
# SQL significa: Lenguaje de consulta estructurado
# Es un lenguaje que se utiliza en los Gestores de BBDD
# Incorpora lenguaje de definición de datos, y lenguaje
# de manipulación de datos.

# 6.2 DEFINICIÓN DE DATOS.
# El DDL (Data Definition Language) lenguaje de
# definición de datos es la parte del SQL que más varía
# de un sistema a otro ya que esa area tiene que ver con
# cómo se organizan internamente los datos y eso, cada
# sistema lo hace de una manera u otra.
# ejemplo:

CREATE TABLE especies (
  Id_especie INTEGER NOT NULL AUTO_INCREMENT,
  nombre_comun VARCHAR(50),
  nombre_cientifico VARCHAR(50),
  id_alimentacion INTEGER,
  INDEX (id_alimentacion),
  PRIMARY KEY (Id_especie)
);
ENGINE=InnoDB DEFAULT CHARSET=utf8;

#6.3 ESTRUCTURA BASICA DE LAS CONSULTAS

Select * from tabla;
Select atributo from tabla;
Select atributo1, atributo2, atriburo n from tabla;
# Select atributox, atributoy from tabla1,tabla2,tablan where ...

select nombre from proveedores,sociedades
where (proveedores.tipo_sociedad=sociedades.id_tipo_sociedad)
and (sociedades.descripcion="camino al exito");

# 6.4 OPERACIONES SOBRE CONJUNTOS

# el primer tipo de operación sobre conjuntos es la union... 
# este trata unir los elementos de dos o mas conjuntos,
# preferentemente los elementos de esos conjuntos deben
# tener algunas caracteristicas en comun
# Ejemplo:

select nombre
from empleados
union
select nombre
from clientes
union
select nombre
from proveedores;

# El segundo tipo de operación sobre conjuntos es la
# Diferencia, Resta o excepcion, se conoce con esos 3 nombres
# EXCEPT devuelve la diferencia (resta) de dos o más conjuntos
# de resultados. El conjunto obtenido como resultado de EXCEPT
# tiene la misma estructura que los conjuntos originales.
# En muchos manejadores de BD se logra con EXCEPT o con MINUS
# En mysql esto se logra con:  NOT IN
# Ejemplo:

select nombre
from clientes
where nombre NOT IN
(select nombre
from proveedores);

# El tercer tipo de operación sobre conjuntos es la intersección.
# Este devuelve la intersección entre dos o más conjuntos de resultados en uno.

select nombre
from clientes
INNER JOIN proveedores
USING
(nombre);


select nombre
from proveedores
where nombre= (select nombre from clientes where nombre = "green_peace");


#6.5 VALORES DE AGREGACIÓN.
# El SQL nos ofrece las siguientes funciones de agregación para efectuar
# varias operaciones sobre los datos de una base de datos:
#Funciones de agregación Función
   

#         Descripción
# COUNT   Nos da el número total de filas seleccionadas
# SUM    Suma los valores de una columna
# MIN     Nos da el valor mínimo de una columna
# MAX     Nos da el valor máximo de una columna
# AVG     Calcula el valor medio de una columna

# En general, las funciones de agregación se aplican a una columna,
# excepto la función de agregación COUNT, que normalmente se aplica
# a todas las columnas de la tabla o tablas seleccionadas. Por lo
# tanto,COUNT (*) contará todas las filas de la tabla o las tablas
# que cumplan las condiciones. Si se utilizase COUNT(distinct #columna),
# sólo contaría los valores que no fuesen nulos ni repetidos, y si se utilizase
# COUNT(columna), sólo contaría los valores que no fuesen nulos.
# Aclarando que hay mas variaciones sobre cada caso
# Veamos algunos ejemplos basicos de cada caso.

# Supongamos que queremos contar cuantos proveedores tenemos

Select count(*)
 as numero_prov
  from proveedores;



# Supongamos que queremos sumar la cantidad de productos que existen en stock

select SUM(stock) as total_prod from productos;

# Supongamos que queremos el producto que tiene
# valor minino de todas las existencias de los productos

select nombre, MIN(stock) as valor_minimo from productos;

# Supongamos que queremos el producto que tiene valor
# maximo de todas las existencias de los productos

select nombre, MAX(stock) as valor_maximo from productos;

# Ahora supongamos que queremos saber en promedio cuantos

select  AVG(stock) as promedio_cantidad from productos;

# Tambien se pueden agrupar algunos datos cuyas caracteristicas o atributos se repitan

select id_proveedor from productos;
select id_proveedor from productos  order by(id_proveedor);
select id_proveedor from productos group by(id_proveedor);


# 6.6 VALORES NULOS
# Los valores nulos representan valores inexistente o desconocido,
# y son tratado de forma diferente a otros valores.
# Veamos algunos ejemplos con otro tipo de valores,
# y a continuacion tratanto de la misma los valores nulos
# ahora veamos el tratamiento correcto de valores nulos.

Select id_proveedor from productos where nombre is  NULL;

Select id_proveedor from productos where nombre is not NULL;


# 6.7 CONSULTAS ANIDADAS
# No son mas que consultas que empotran otras consultas
# Para poder filtrar en forma correcta la información
# que se desea obtener como resultado de estas.
# Generalmente se tulizan cuando se requiere filtrar informacipon
# de distintas tablas.
# Chequemos un ejemplo

Select nombre from clientes where tipo_sociedad=(select id_tipo_sociedad from sociedades where

descripcion="camino al exito");


# 6.8 CONSULTA COMPLEJAS

#  En este tipo de consultas se utilizan las uniones de la informacino de diversas tablas.
#  existen righ y left joins, que nos ayudan a buscar informacion en varias tablas ala vez.
#  Veamos ejemplos directamente.


#Supongamos que queremos conocer los empleados que son cuidadores y de que animales estan encargados.

select animales.nombre, empleados.nombre from animales left join empleados on

animales.id_cuidador=id_empleado;


6.9 Vistas.

# De esto ya vimos los ejemplos
# Supongamos que ya hacemos varias veces consultas complejas
# Para evitar errores potenciales de captura del codigo de la consulta
# Podemos anidar esa consulta en una Vista, la sintaxis ya la vimos en clases.
# Chequemos el ejemplo directamente

# para no estar capturando a cada ratos codigos como este:
Select nombre from clientes
 where tipo_sociedad=(select id_tipo_sociedad
from sociedades where descripcion="camino al exito");

# Mejor creemos una vista que contenga esa conulta...

create view miconsulta as
Select nombre from clientes
 where tipo_sociedad=(select id_tipo_sociedad
from sociedades where descripcion="camino al exito");

# Una vez creada la consulta podemos consultar
# los datos de la siguiente manera

Select * from miconsulta;



# 6.10 Modificación de las bases de datos.
# Hay diversas operaciones que se pueden hacer en relaciona la modificación de
# Una base de datos, iremos describiendo las principales, a continuacion.
# Para efectos de no alterar nuestra base de datos, crearemos una nueva tabla
# que sea totalmente independiente.

#La primera operación es crear un a tabla:
#Crear la tabla hotel con la siguiente especificación:
#    - Identificador: entero sin signo, autoincrementable, llave primaria
#   - nombre: longitud variable, 100 carácteres como máxima longitud y no nulo
#   - activo: booleano, no nullo, 1 valor por defecto
#   - url: longitud variable, 255 carácteres como máxima longitud, índice único
# Para lograr esto utilicemos el siguiente código.

CREATE TABLE hotel (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    descripcion TEXT,
    activo TINYINT(1) DEFAULT '1' NOT NULL,
    url VARCHAR(255),
    UNIQUE INDEX url_idx (url)) DEFAULT CHARACTER SET utf8
    COLLATE utf8_general_ci ENGINE = InnoDB;

# De la misma manera creemos una tabla mas:
# con las siguientes características


#    Identificador: entero sin signo, autoincrementable, llave primaria
#    nombre: longitud variable, 100 carácteres como máxima longitud y no nulo
#    activo: booleano, no nullo, 1 valor por defecto
# Para lograr esto utilicemos el siguiente código.

CREATE TABLE trabajador (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    activo TINYINT(1) DEFAULT '1' NOT NULL,
    hotel_id INT UNSIGNED ) DEFAULT CHARACTER SET utf8
    COLLATE utf8_general_ci ENGINE = InnoDB;

# Ver especificación de una tabla
# podemos lograrlo de la siguiente manera:

desc hotel;

# Tambien podemos lograrlo de la siguiente manera:

describe trabajador;



# Ver índices de una tabla

show index from hotel;

# Modificar definición de una columna
# supongamos que queremosRestringir los valores de hotel_id
# a valores no nulos en la tabla trabajador

ALTER TABLE trabajador MODIFY COLUMN hotel_id INT UNSIGNED NOT NULL;


# Agregar columna
# Supongamos que queremos Agregar la columna código a la tabla trabajador

# Primero veamos la estructura de la tabla trabajador

describe trabajador;

# Ahora agreguemos la columna

ALTER TABLE trabajador ADD COLUMN codigo CHAR(11) NOT NULL;

# ahora veamos la estructura de la tabla trabajador de nuevo

describe trabajador;

# Observa los cambios



# Crear índice
# Supongamos que el  código del trabajador debe ser único
# Eso lo logramos con el siguiente codigo

CREATE UNIQUE INDEX trabajador_codigo_idx USING BTREE
on trabajador(codigo);



#Crear relación

# Aquí se establece la relación entre trabajador y hotel
# (Un hotel puede terner muchos trabajadores
# y un trabajador pertenece a un solo hotel).
# Cuando se elemina un hotel se eliminan todos sus trabajadores

ALTER TABLE trabajador ADD CONSTRAINT trabajador_hotel_id_hotel_id
FOREIGN KEY (hotel_id) REFERENCES hotel(id) ON DELETE CASCADE;


#Renombrar columna

# Cambiar el nombre de la columna url a slug de la tabla hotel
# y restringir los valores a no nulos
# y cadena vacía como valor por defecto

ALTER TABLE hotel CHANGE COLUMN url slug varchar(255) NOT
NULL DEFAULT '';



# Renombrar tabla

ALTER table trabajador RENAME TO negros;



# Eliminar tabla

DROP table tabla1[,tabla2, ...]



# Eliminar columna
# Supongamos que queremos eliminar la columna código de la tabla trabajadores

ALTER TABLE negros DROP COLUMN codigo;

No hay comentarios:

Publicar un comentario