Professional Documents
Culture Documents
El ITT almacena los datos de sus alumnos en una tabla denominada "alumnos". Cree la tabla alumnos eligiendo el tipo de dato adecuado para cada campo: control, apellido, nombre, domicilio, fechaingreso, fecha_nacimiento. Ingrese un alumno empleando distintos separadores para las fechas Ingrese otro alumno empleando solamente un dgito para da y mes y 2 para el ao Ingrese un alumnos empleando 2 dgitos para el ao de la fecha de ingreso y "null" en "fechanacimiento Muestre todos los alumnos que ingresaron antes del 2008-2011. Muestre todos los alumnos que tienen "null" en "fechanacimiento": Muestre el ao de nacimiento de todos los alumnos.
Tambin podemos colocar el nmero de orden del campo por el que queremos que se ordene en lugar de su nombre Podemos ordenarlos de mayor a menor, para ello agregamos la palabra clave "desc":
Select *from alumnos order by 3 desc; Select *from alumnos order by 3;
select * from NOMBRETABLA order by CAMPO; select * from alumnos order by nombre;
Tambin podemos ordenar por varios campos, por ejemplo, por apellido" y nombre":
select * from libros order by apelllido,nombre;
Incluso, podemos ordenar en distintos sentidos, por ejemplo, por apellido" en sentido ascendente y nombre" en sentido descendente:
select * from alumnos order by apellidos asc, nombre desc;
Es posible ordenar por un campo que no se lista en la seleccin. Se permite ordenar por valores calculados o expresiones.
Con los siguientes campos: numero, nombre, mail, pais, fecha Ingrese algunos registros: Ordene los registros por fecha, en orden descendente. Muestre el nombre del usuario, pais y el nmero de mes, ordenado por pais (ascendente) y nmero de mes (descendente) Muestre el pais, el mes, el da y la hora y ordene las visitas por numero del mes, del da y la hora. Muestre los mail, pas, ordenado por pas, de todos los que visitaron la pgina en mayo.
Queremos ver los libros cuyo autor sea Luis Joyanes" y/o cuya editorial sea "Prentice":
select * from libros where autor=Luis Joyanes' or editorial='Prentice';
Queremos recuperar los libros que NO cumplan la condicin dada, por ejemplo, aquellos cuya editorial NO sea "Prentice": select * from libros where not editorial= 'Prentice'; El operador "not" invierte el resultado de la condicin a la cual antecede.
Muestre todos los medicamentos cuyo laboratorio sea Pacheco" y cuya cantidad NO sea=100 Elimine todos los registros cuyo laboratorio sea igual a Pacheco" y su precio sea mayor a 100 Cambie la cantidad por 200, a todos los medicamentos de Sigma" cuyo precio sea mayor a 50 Borre los medicamentos cuyo laboratorio sea Pacheco" o cuyo precio sea menor a 200
Has el momento una consulta como select * from libros where precio>=20 and precio<=40; es correcta, se puede usar "between" y as simplificar la consulta:
select * from libros where precio between 20 and 40;
Trabaja con intervalo de valores, se puede emplear con tipos de datos numricos y tipos de datos fecha y hora (incluye slo el valor mnimo).
Para recuperar los registros que estn fuera del intervalo especificado.
select * from libros where precio not between 20 and 35;
Siempre que sea posible, emplee condiciones de bsqueda positivas ("between"), evite las negativas ("not between") porque hace ms lenta la recuperacin de los datos. Se puede usar el operador "between" para reducir las condiciones "where".
Ingrese 10 registros ms en la tabla visitas. Seleccione los usuarios que visitaron la pgina entre el '2010-01-01' y '2012-12-31 Recupere las visitas cuyo nmero se encuentra entre 2 y 5. Una concesionaria de autos vende autos usados y almacena la informacin en una tabla llamada "autos con los campos: patente, marca, modelo, precio. Ingrese 5 registros. Seleccione todos los autos cuyo modelo se encuentre entre '1970' y '1990' usando el operador "between" y ordnelos por dicho campo. Seleccione todos los autos cuyo precio est entre 50000 y 100000.
Operador in
Se utiliza "in" para averiguar si el valor de un campo est incluido en una lista de valores especificada. En la siguiente sentencia usamos "in" para averiguar si el valor del campo autor est incluido en la lista de valores especificada. Hasta ahora, la consulta es:
autor
select * from libros where autor='Borges'; El operador igual ("=") nos permite comparar cadenas de caracteres, pero al realizar la comparacin, busca coincidencias de cadenas completas, realiza una bsqueda exacta.
Si queremos recuperar todos los libros de Joyanes, cuyo registros cuyo autor contenga la cadena Joyanes" debemos escribir:
select * from libros where autor like "%Joyanes%";
El smbolo "%" (porcentaje) reemplaza cualquier cantidad de caracteres (incluyendo ningn caracter). Es un caracter comodn. "like" y "not like" son operadores de comparacin que sealan igualdad o diferencia.
select * from libros where titulo like 'M%'; select * from libros where titulo like '%r'; select * from libros where titulo not like 'M%';
As como "%" reemplaza cualquier cantidad de caracteres, el guin bajo "_" reemplaza un caracter, es otro caracter comodn. Por ejemplo, queremos ver los libros de "Lewis Carroll" pero no recordamos si se escribe "Carroll" o "Carrolt", entonces tipeamos esta condicin: "like" se emplea con tipos de datos char, varchar, date, time, timestamp.
select * from libros where autor like "%Carrol_";
Campos: RFC, nombre, documento domicilio, fecha_ingreso, seccion, sueldo. Ingrese algunos registros Muestre todos los empleados con un apellido especfico empleando el operador "like Muestre todos los empleados cuyo domicilio comience con Mo" y tengan un "8" Muestre todos los nombres y sueldos de los empleados cuyos sueldos incluyen centavos Muestre los empleados que hayan ingresado en 2005.
La funcin count() cuenta la cantidad de registros de una tabla, incluyendo los que tienen valor nulo.
Se puede utilizar esta funcin junto con la clusula "where" para una consulta ms especfica.
select count(*) from libros where editorial=Prentice';
select count(precio) from libros; Note que "count(*)" retorna la cantidad de registros de una tabla (incluyendo los que tienen valor "null") mientras que "count(precio)" retorna la cantidad de registros en los cuales el campo "precio" no es nulo. No es lo mismo. "count(*)" cuenta registros, si en lugar de un asterisco colocamos como argumento el nombre de un campo, se contabilizan los registros cuyo valor en ese campo NO es nulo. Otras funciones: count, sum, min, max, avg, con la sintaxis semejante a la de count.
Sintaxis
select CAMPO, FUNCIONDEAGREGADO from NOMBRETABLA group by CAMPO; select CAMPO1, CAMPO2, FUNCIONDEAGREGADO from NOMBRETABLA group by CAMPO1,CAMPO2;
select editorial, count(*) from libros group by editorial;
Prctica
select editorial, count(precio) from libros group by editorial; select editorial, sum(precio) from libros group by editorial; select editorial, max(precio) as mayor, min(precio) as menor from libros group by editorial; select editorial, avg(precio) from libros group by editorial; select editorial, count(*) from libros where precio<30 group by editorial;
Si queremos saber la cantidad de libros agrupados por editorial pero considerando slo algunos grupos, por ejemplo, los que devuelvan un valor mayor a 2, escribimos:
select editorial, count(*) from libros group by editorial having count(*)>2;
Ejercicio:
select editorial, avg(precio) from libros group by editorial having avg(precio) > 25; select editorial, count(*) from libros where editorial<>'Prentice' group by editorial; select editorial, count(*) from libros group by editorial having editorial<>'Prentice'; select editorial, count(*) from libros where precio is not null group by editorial having editorial<>'Prentice'; select editorial, avg(precio) from libros group by editorial having count(*) > 2; select editorial, max(precio) as mayor from libros group by editorial having min(precio)<100 and min(precio)>30 order by editorial;
Si contamos los autores sin "distinct", no incluir los valores "null" pero si los repetidos:
Restriccin check
La restriccin "check" especifica los valores que acepta un campo, evitando que se ingresen valores inapropiados. La sintaxis bsica es la siguiente:
alter table NOMBRETABLA add constraint NOMBRECONSTRAINT check CONDICION;
EJEMPLO:
alter table libros add constraint CK_libros_precio_positivo check (preciomin>=0 and preciomay>=0);
Restriccin unique
Esta restriccin impide la duplicacin de claves alternas (no primarias), es decir, especifica que dos registros no puedan tener el mismo valor en un campo. Se permiten valores nulos. Se pueden aplicar varias restricciones de este tipo a una misma tabla, y pueden aplicarse a uno o varios campos que no sean clave primaria.
Ejemplo:
alter table profesor add constraint RFC_UQ unique (RFC);
Campos: ID, RFC, CURP, APELLIDO_P, APELLIDO_M, NOMBRE, SEXO Ingrese algunos registros, 2 de ellos con NOMBRE repetido y alguno con patente nulo. Intente agregar una restriccin "unique" para asegurarse que el nombre no tomar valores repetidos. agregar una restriccin "unique" para asegurarse que el RFC y CURP no tomarn valores repetidos. Ingresar un registro con valor nulo para el campo CURP". Muestre la informacin de las restricciones con la siguiente sentencia:
select * from information_schema.table_constraints where table_name = cliente';
Un ndice comn se crea con "create index", los valores no necesariamente son nicos y aceptan valores "null". Puede haber varios por tabla. Creamos la tabla "libros2".
create table libros( codigo int not null, titulo varchar(40), autor varchar(30), editorial varchar(15), precio decimal(6,2),cantidad int2); Creamos un ndice: create index I_libros_editorial on libros(editorial);
create unique index I_libros_tituloeditorial on libros(titulo,editorial); drop index I_libros_editorial; drop index I_libros_tituloeditorial;
Crearemos un ndice nico por los campos titulo y editorial: Para eliminar un ndice usamos "drop index". Ejemplo:
Es conveniente utilizar la clusula order by cuando utilizamos limit y offset, por ejemplo:
select * from libros order by codigo limit 8;
select * from libros limit 4 offset 0; Muestra los primeros 4 registros, 0,1,2 y 3. select * from libros limit 4 offset 5; select * from libros limit 8;
Clave fornea
Un campo que no es clave primaria en una tabla y sirve para enlazar sus valores con otra tabla en la cual es clave primaria se denomina clave fornea, externa o ajena. Las claves forneas y las claves primarias deben ser del mismo tipo para poder enlazarse. Si modificamos una, debemos modificar la otra para que los valores se correspondan. Cuando alteramos una tabla, debemos tener cuidado con las claves forneas. Si modificamos el tipo, longitud o atributos de una clave fornea, sta puede quedar inhabilitada para hacer los enlaces. Entonces, una clave fornea es un campo (o varios) empleados para enlazar datos de 2 tablas, para establecer un "join" con otra tabla en la cual es clave primaria.
controla que si se agrega un cdigo de editorial en la tabla "libros", tal cdigo exista en la tabla "editoriales". Si se agrega una clave de carrera en la tabla alumno, tal clave debe de existir en la tabla carreras.
Tambin controla que no pueda eliminarse un registro de una tabla ni modificar la clave primaria si una clave externa hace referencia al registro. Por ejemplo, que no se pueda eliminar o modificar una clave de carreras" si existen un alumno con dicha clave.
La siguiente es la sintaxis parcial general para agregar una restriccin "foreign key": cuando la tabla ya est creada
alter table NOMBRETABLA1 add constraint NOMBRERESTRICCION foreign key (CAMPOCLAVEFORANEA) references NOMBRETABLA2 (CAMPOCLAVEPRIMARIA);
Esta restriccin (a diferencia de "primary key" y "unique") no crea ndice automticamente. La cantidad y tipo de datos de los campos especificados luego de "foreign key" DEBEN coincidir con la cantidad y tipo de datos de los campos de la clusula "references". Una tabla puede tener varias restricciones "foreign key". No se puede eliminar una tabla referenciada en una restriccin "foreign key", aparece un mensaje de error. Una restriccion "foreign key" no puede modificarse, debe eliminarse y volverse a crear. Acta en inserciones Si se intenta ingresar un registro con un valor de clave fornea que no existe en la tabla referenciada muestra un mensaje de error. Acta en eliminaciones y actualizaciones. Si intentamos eliminar un registro o modificar un valor de clave primaria de una tabla si una clave fornea hace referencia a dicho registro, PostgreSQL no lo permite.
Tabla alumnos con los campos: control, Apellido_P,Apellido_M, Nombre,sexo, ClaveCarrera. Tabla carreras con los campos: Clave_C, nombre_C. Ingresamos 10 registros en ambas tablas: Agregamos una restriccin "foreign key" a la tabla alumnos":
alter table alumnos add constraint FK_alumnos_control foreign key (ClaveCarrera) references carreras(Clave_C);
Ejercicio
Ingresamos un alumno con un cdigo de carrera existente Ingresamos un alumno con una clave carrera inexistente
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tambin tiene una tabla "provincias" donde registra los nombres de las provincias.
Intente agregar una restriccin "foreign key" a la tabla "clientes" que haga referencia al campo "codigo" de "provincias. Ingrese cinco registros para ambas tablas Intente agregar un cliente con un cdigo de provincia inexistente en "provincias". Intente eliminar el registro con cdigo 3, de "provincias. Elimine el registro con cdigo "4" de "provincias". Intente modificar el registro con cdigo 1, de "provincias".
Pueden establecerse al momento de crear una tabla (en la instruccin "create table"). En el siguiente ejemplo creamos la tabla "libros" con la restriccin respectiva:
create table editoriales( codigo serial, nombre varchar(20), primary key (codigo) ); create table libros( codigo serial, titulo varchar(40), autor varchar(30), codigoeditorial smallint references editoriales(codigo), primary key(codigo) );
"cascade": indica que si eliminamos o actualizamos un valor de la clave primaria en la tabla referenciada (TABLA2), los registros coincidentes en la tabla principal (TABLA1), tambin se eliminen o modifiquen; es decir, si eliminamos o modificamos un valor de campo definido con una restriccin "primary key" o "unique", dicho cambio se extiende al valor de clave externa de la otra tabla (integridad referencial en cascada).
"set null": Establece con el valor null en el campo de la clave fornea. "set default": Establece el valor por defecto en el campo de la clave fornea. La sintaxis completa para agregar esta restriccin a una tabla es la siguiente:
alter table TABLA1 add constraint NOMBRERESTRICCION foreign key (CAMPOCLAVEFORANEA) references TABLA2(CAMPOCLAVEPRIMARIA) on delete OPCION on update OPCION;
Ejemplo:
Especificamos la accin en cascada para las actualizaciones y eliminaciones:
alter table alumnos add constraint FK_alumnos_Clave_C foreign key (Clave_C) references editoriales(Clave_C) on update cascade on delete cascade;
Intente eliminar el registro con cdigo 3, de carreras". Modifique el registro con cdigo 3, de carreras". Verifique que el cambio se realiz en cascada, es decir, que se modific en la tabla carreras" y en alumnos": Intente modificar la restriccin "foreign key" para que permita eliminacin en cascada. Intente eliminar la tabla carreras".
Eliminar columna:
ALTER TABLE table_name DROP COLUMN column_name;
Cuando obtenemos informacin de ms de una tabla decimos que hacemos un "join" (combinacin). Por ejemplo:
select * from alumnos join carreras on alumnos.Clavecarrera=carreras.Clave_C;
Investigar:
Tipos de datos complejos. Tipos estructurados y herencia en SQL. Herencia de tablas. Tipos de arreglo multiconjunto en SQL. Identidad de los objetos y tipos de referencia en SQL. Implementacin de las caractersticas OR.
Aspectos a calificar:
Trabajo en equipo (mximo 3 elementos) Estructura del trabajo (cartula, ndice, contenido, conclusin, bibliografa y glosario de trminos) Expresiones y grficos realizados por el alumno (originalidad). Ortografa Mnimo 10 cuartillas de contenido Establecer formato de texto
Interlineado 1.5 Tipo de letra: arial 12 Justificado
Unin
El operador "union" combina el resultado de dos o ms instrucciones "select" en un nico resultado. Es necesario que las tablas referenciadas tengan tipos de datos similares, la misma cantidad de campos y el mismo orden de campos en la lista de seleccin de cada consulta. No se incluyen las filas duplicadas en el resultado, a menos que coloque la opcin "all". Se deben especificar los nombres de los campos en la primera instruccin "select". Puede emplear la clusula "order by". Puede dividir una consulta compleja en varias consultas "select" y luego emplear el operador "union" para combinarlas.
select nombre, domicilio from alumnos union select nombre, domicilio from profesores;
create table clientes( codigo serial, nombre varchar (30), domicilio varchar(30), primary key(codigo) );
create table empleados( documento char(8) not null, nombre varchar(20), apellido varchar(20), domicilio varchar(30), primary key(documento));
Ingrese algunos registros El supermercado quiere enviar una tarjeta de salutacin a todos los proveedores, clientes y empleados y necesita el nombre y domicilio de todos ellos. Emplee el operador "unin" para obtener dicha informacin de las tres tablas. Agregue una columna con una literal para indicar si es un proveedor, un cliente o un empleado y ordene por dicha columna.
Vistas
Una vista es una alternativa para mostrar datos de varias tablas. Una vista es como una tabla virtual que almacena una consulta. Los datos accesibles a travs de la vista no estn almacenados en la base de datos como un objeto. Entonces, una vista almacena una consulta como un objeto para utilizarse posteriormente. Las tablas consultadas en una vista se llaman tablas base. En general, se puede dar un nombre a cualquier consulta y almacenarla como una vista. Una vista suele llamarse tambin tabla virtual porque los resultados que retorna y la manera de referenciarlas es la misma que para una tabla.
Una vista se define usando un "select". La sintaxis bsica parcial para crear una vista es la siguiente:
create view NOMBREVISTA as SENTENCIAS SELECT from TABLA;
En el siguiente ejemplo creamos la vista "vista_empleados", que es resultado de una combinacin en la cual se muestran 4 campos:
create view vista_empleados as select (apellido||' '||e.nombre) as nombre,sexo, s.nombre as seccion, cantidadhijos from empleados as e join secciones as s on codigo=seccion
Creamos otra vista de "empleados" denominada "vista_empleados_ingreso" que almacena la cantidad de empleados por ao: create view vista_empleados_ingreso (fecha,cantidad) as select extract(year from fechaingreso),count(*) from empleados group by extract(year from fechaingreso);
Ingrese 10 registros para todas las tablas. Cree una vista en la que aparezca el nombre y documento del socio, el deporte, el da y el nombre del profesor. Muestre la informacin contenida en la vista. Realice una consulta a la vista donde muestre la cantidad de socios inscriptos en cada deporte ordenados por cantidad. Muestre (consultando la vista) los cursos (deporte y da) para los cuales no hay inscriptos. Muestre los nombres de los socios que no se han inscripto en ningn curso (consultando la vista) Muestre (consultando la vista) los profesores que no tienen asignado ningn deporte an. Muestre (consultando la vista) el nombre y documento de los socios que deben matrculas. Consulte la vista y muestre los nombres de los profesores y los das en que asisten al club para dictar sus clases. Muestre la misma informacin anterior pero ordenada por da. Muestre todos los socios que son compaeros en tenis los lunes.