Professional Documents
Culture Documents
Sesin 2
I. OBJETIVOS
Introducir y conocer el manejo de las sentencias SQL. Integrar las sentencias SQL al Gestor de Base de Datos MySQL. Examinar la sintaxis de las sentencias SQL en MySQL. II. TEMAS A TRATAR III. 1. Introduccin al SQL Creacin de Bases de Datos Creacin de Tablas Eliminar Bases de Datos Insercin de Registros Cambiar la estructura de la Tabla Modificar Registros Claves Forneas Eliminar Registros
El Lenguaje de consulta estructurado (SQL, Structured Query Language) es un lenguaje declarativo de acceso a bases de datos relacionales que permite especificar diversos tipos de operaciones sobre las mismas. Una de sus caractersticas es el manejo del lgebra y el clculo relacional permitiendo lanzar consultas con el fin de recuperar, de una forma sencilla, informacin de inters de una base de datos, as como tambin hacer cambios sobre la misma. SQL engloba dos lenguajes: DDL (Data Definition Language) Lenguaje de Definicin de Datos, es el lenguaje que se usa para crear bases de datos y tablas, y para modificar sus estructuras, as como los permisos y privilegios. (CREATE, ALTER, DROP Y TRUNCATE). DML (Data Manipulation Language) Lenguaje de Manipulacin de Datos, es el que se usa para modificar y obtener datos desde las bases de datos. (INSERT, UPDATE, DELETE, SELECT).
Sesin 2
Debido a esto, crear una base de datos es una tarea muy simple. Claro que, en el momento de crearla, la base de datos estar vaca, es decir, no contendr ninguna tabla. Vamos a crear y manipular nuestra propia base de datos, al mismo tiempo que nos familiarizamos con la forma de trabajar de MySQL. Para empezar, crearemos una base de datos para nosotros solos, y la llamaremos "prueba". Para crear una base de datos se usa una sentencia CREATE DATABASE:
mysql> CREATE DATABASE prueba; Query OK, 1 row affected (0.03 sec)
Podemos averiguar cuntas bases de datos existen en nuestro sistema usando la sentencia SHOW DATABASES. Para seleccionar una base de datos se usa el comando USE, que no es exactamente una sentencia SQL, sino ms bien de una opcin de MySQL.
mysql> USE prueba; Database changed
2. CREACIN DE TABLAS
La parte un tanto complicada es decidir la estructura que debe tener nuestra base de datos: qu tablas se necesitan y qu columnas estarn en cada tabla CREATE TABLE crea una tabla con el nombre dado. A continuacin veremos varios ejemplos para el comando CREATE TABLE para lo cual trabajaremos con nuestra base de datos prueba.
Crear una tabla con la sintaxis ms sencilla
CREATE TABLE CLIENTES (codcli int, nomcli varchar(40), feccli date);
Una vez que visualizamos la estructura debemos fijarnos que aparte de definir el nombre del campo (Field) y el tipo de dato del campo (Type) podemos especificar si el campo creado permite valores Nulos si no los permite (NULL), si es algn campo con clave (KEY), si posee valores por defecto o no (DEFAULT) y algn valor EXTRA que analizaremos ms adelante. La sintaxis para definir columnas es la siguiente:
nombre_col tipo [NOT NULL | NULL] [DEFAULT valor_por_defecto] [AUTO_INCREMENT] [[PRIMARY] KEY] [COMMENT 'string'] [definicin_referencia]
Sesin 2
VALORES NULOS Al definir cada columna podemos indicar si contendrn o no valores nulos. La opcin por defecto es que se permitan valores nulos, NULL, y para que no se permitan debemos usar NOT NULL. Hay que tener en cuenta que una clave primaria no debe permitir valores nulos.
CREATE TABLE CLIENTE1 (codcli INT NOT NULL, nomcli VARCHAR(40), feccli DATE); DESCRIBE CLIENTE1;
VALORES POR DEFECTO Cuando se le asigna un valor por defecto a una columna, automticamente este se asignar este valor cuando no se especifique un valor determinado al aadir filas. Si una columna puede tener un valor nulo, y no se especifica un valor por defecto, se usar NULL como valor por defecto. Por ejemplo, si queremos que el valor por defecto del campo nomcli sea cliente:
CREATE TABLE CLIENTE2 (codcli INT NOT NULL, nomcli VARCHAR(40) DEFAULT cliente, feccli DATE); DESCRIBE CLIENTE2;
CLAVES PRIMARIAS Para definir una clave primaria sobre una columna se usa la palabra KEY o PRIMARY KEY. Solo puede haber una clave primaria por tabla y la columna sobre la que se defina una clave primaria no puede tener valores NULL. Si no se especifica de forma explcita, mysql lo har automticamente.
CREATE TABLE CLIENTE3 (codcli INT PRIMARY VARCHAR(40) DEFAULT cliente, feccli DATE); DESCRIBE CLIENTE3; KEY, nomcli
Usar NOT NULL PRIMARY KEY equivale a PRIMARY KEY, NOT NULL KEY o sencillamente KEY. Tambin se pueden crear claves primarias usando otra sintaxis que mostramos a continuacin. Para usar la misma tabla primero la eliminamos y la volveremos a crear usando una sintaxis diferente.
DROP TABLE CLIENTE3; CREATE TABLE CLIENTE3 (codcli INT, nomcli VARCHAR(40) DEFAULT cliente, feccli DATE NOT NULL, CONSTRAINT PRIMARY KEY (codcli)); DROP TABLE CLIENTE3: CREATE TABLE CLIENTE3 (codcli INT, nomcli VARCHAR(40) DEFAULT cliente, feccli DATE NOT NULL, PRIMARY KEY(codcli));
Pero esta forma tiene ms opciones, entre los parntesis podemos especificar varios nombres de columnas, para construir claves primarias compuestas por varias columnas:
CREATE TABLE CLIENTE4 (codcli INT, nrocli CHAR(2), VARCHAR(40) NOT NULL, PRIMARY KEY(codcli, nrocli)); DESCRIBE CLIENTE4; nomcli
Sesin 2
COLUMNAS AUTOINCREMENTADAS En una tabla se puede creer una columna autoincrementada que sea de tipo entero. El valor que se insertara para esa columna, ser calculado automticamente tomando el valor ms alto y sumndole una unidad.
CREATE TABLE CLIENTE5 (codcli INT AUTO_INCREMENT PRIMARY KEY, nomcli VARCHAR(40) DEFAULT cliente, feccli DATE NOT NULL); DESCRIBE CLIENTE5;
COMENTARIOS Adicionalmente, al crear la tabla, podemos aadir un comentario a cada columna. Este comentario sirve como informacin adicional sobre alguna caracterstica especial de la columna, y entra en la documentacin de la base de datos.
CREATE TABLE CLIENTE6 (codcli INT AUTO_INCREMENT PRIMARY KEY COMMENT clave principal, nomcli VARCHAR(40) DEFAULT cliente, feccli DATE NOT NULL); DESCRIBE CLIENTE6;
ELIMINAR UNA TABLA Como ya vimos en unos ejemplos anteriores el comando utilizado para eliminar una tabla es DROP TABLE.
DROP TABLE nombre_tabla
Se pueden aadir las palabras IF EXISTS para evitar errores si la tabla a eliminar no existe.
mysql> DROP TABLE IF EXISTS ciudad;
Tambin se puede utilizar las palabras IF EXISTS. Hay que tener cuidado, ya que al borrar cualquier base de datos se elimina tambin cualquier tabla que contenga.
4. INSERCIN DE REGISTROS
La forma ms directa de insertar una fila nueva en una tabla es mediante una sentencia INSERT. En la forma ms simple de esta sentencia debemos indicar la tabla a la que queremos aadir filas, y los valores de cada columna. Las columnas de tipo cadena o fechas deben estar entre comillas sencillas o dobles, para las columnas nmericas esto no es imprescindible, aunque tambin pueden estar entrecomilladas.
INSERT INSERT INSERT INSERT INTO INTO INTO INTO CLIENTE1 CLIENTE1 CLIENTE1 CLIENTE1 VALUES(1, VALUES(2, VALUES(3, VALUES(4, Juan Perez, CURRENT_DATE); Jos Daz, CURRENT_DATE); Julia Gmez, CURRENT_DATE); Andrea Solari, 2008-08-01);
Sesin 2
Una vez insertados los registros podemos mostrarlos con el commando SELECT.
SELECT * FROM CLIENTE1;
Si no necesitamos asignar un valor concreto para alguna columna, podemos asignarle el valor por defecto indicado para esa columna cuando se cre la tabla, usando la palabra DEFAULT:
INSERT INTO CLIENTE2 VALUES (1, DEFAULT, 2008-03-09);
Otra opcin consiste en indicar una lista de columnas para las que se van a suministrar valores. A las columnas que no se nombren en esa lista se les asigna el valor por defecto. Este sistema, adems, permite usar cualquier orden en las columnas, con la ventaja, con respecto a la anterior forma, de que no necesitamos conocer el orden de las columnas en la tabla para poder insertar datos:
INSERT INTO CLIENTE2 (codcli, feccli) VALUES (2, CURRENT_DATE), (3, CURRENT_DATE), (4, CURRENT_DATE), (5, CURRENT_DATE);
Otra opcin consiste es utilizar una sentencia de tipo SELECT para indicarle que valores sern insertados en la tabla.
INSERT INTO CLIENTE3 SELECT * FROM CLIENTE1;
En la tabla creada anteriormente CLIENTE5 se creo una primary key de tipo auto_increment por lo que el siguiente ejemplo lo utilizamos para verificar como funciona el auto_increment. El valor del campo clave codcli se clcula automticamente sin necesidad de asignarle un valor.
INSERT INTO CLIENTE5 (feccli) VALUES (2009-05-21); INSERT INTO CLIENTE5 VALUES (3, Roxana, CURRENT_DATE); INSERT INTO CLIENTE5 (nomcli, feccli) VALUES (Pedro, CURRENT_DATE);
Existe otra sintaxis alternativa, que consiste en indicar el valor para cada columna como se ve en la siguiente sentencia:
INSERT INTO CLIENTE5 SET nomcli=Juan, feccli=2006-05-21;
Sesin 2
Esto se hace para realizar que todas las actualizaciones se dirijan a la nueva tabla sin ningn fallo de actualizacin. Mientras ALTER TABLE se ejecuta, la tabla original permanece accesible en lectura para otros clientes. Las actualizaciones y escrituras en la tabla se retrasan hasta que la nueva tabla est preparada. La sintaxis de ALTER TABLE es la siguiente:
ALTER [IGNORE] TABLE tbl_name alter_specification[,alter_specification ...]
CHANGE
Se puede renombrar una columna usando una clusula CHANGE old_col_name create_definition. Para hacerlo, hay que especificar los nombres antiguo y nuevo de la columna y el tipo que la columna tiene. Por ejemplo:
CREATE TABLE t1 (codigo INT, nombre VARCHAR(20)); INSERT INTO t1 VALUES (1, Jaime Luna); ALTER TABLE t1 CHANGE codigo codtip char(2);
Si se quiere cambiar el tipo de una columna, pero no su nombre, la sintaxis de CHANGE sigue necesitando un nombre de columna antiguo y nuevo, aunque mantenga en mismo nombre.
Para modificar que un campo no permita permita valores nulos:
ALTER TABLE t1 CHANGE nombre nombre VARCHAR(30) NOT NULL;
Sesin 2
MODIFY
RENAME
ADD Y DROP
En el siguiente ejemplo se quiere modificar la estructura de la tabla t2 de forma que el campo codtip deje de ser clave primaria, que el campo codtip se le cambie el nombre por tipo y que se agrege un campo ms cuyo nombre sea codigo y sea la nueva clave primaria de la tabla.
ALTER TABLE t2 DROP PRIMARY KEY; ALTER TABLE t2 CHANGE codtip tipo CHAR(4); ALTER TABLE t2 ADD codigo INT AUTO_INCREMENT PRIMARY KEY; DESCRIBE t2;
6. MODIFICAR REGISTROS
Podemos modificar valores de las filas de una tabla usando la sentencia UPDATE. En su forma ms simple, los cambios se aplican a todas las filas, y a las columnas que especifiquemos.
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]
Vamos a crear la tabla poblacin que contiene la informacin de ciertas ciudades indicando su poblacin.
CREATE TABLE POBLACION (codigo INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(20), poblacion double);
Sesin 2
Y ahora, actualizaremos la tabla poblacin aumentando en un 10% la poblacin de todas las ciudades de la tabla poblacin usando esta sentencia:
UPDATE POBLACION SET poblacion=poblacion*1.10;
Podemos, del mismo modo, actualizar el valor de ms de una columna, separandolas en la seccin SET mediante comas:
UPDATE poblacion SET codigo=codigo+10, poblacion=poblacion*0.97; SELECT * FROM POBLACION;
En este ejemplo hemos incrementado el valor de la columna 'clave' en 10 y disminuido el de la columna 'poblacion' en un 3%, para todas las filas. Pero no tenemos por qu actualizar todas las filas de la tabla. Podemos limitar el nmero de filas afectadas de varias formas. La primera es mediante la clusula WHERE. Usando esta clusula podemos establecer una condicin. Slo las filas que cumplan esa condicin sern actualizadas:
UPDATE poblacion nombre=Pars; SET POBLACION=POBLACION*1.03 WHERE
En este caso slo hemos aumentado la poblacin de las ciudades cuyo nombre sea 'Pars'. Las condiciones pueden ser ms complejas. Existen muchas funciones y operadores que se pueden aplicar sobre cualquier tipo de columna, y tambin podemos usar operadores booleanos como AND u OR. Otra forma de limitar el nmero de filas afectadas es usar la clusula LIMIT. Esta clusula permite especificar el nmero de filas a modificar:
UPDATE poblacion SET codigo=codigo-10 LIMIT 2;
En este ejemplo hemos decrementado en 10 unidades la columna clave de las dos primeras filas. Esta clusula se puede combinar con WHERE, de modo que slo las 'n' primeras filas que cumplan una determinada condicin se modifiquen.
7. CLAVES FORNEAS
En MySQL slo existe soporte para claves forneas en tablas de tipo InnoDB. Sin embargo, esto no impide usarlas en otros tipos de tablas. La diferencia consiste en que en esas tablas no se verifica si una clave fornea existe realmente en la tabla referenciada, y que no se eliminan filas de una tabla con una definicin de clave fornea. Para hacer esto hay que usar tablas InnoDB.
8 Ing. Oscar Ramrez Valdez
Sesin 2
CREATE TABLE nombre definicin_de_columnas [CONSTRAINT [smbolo]] FOREIGN KEY [nombre_index] (nombre_col_index,...) [REFERENCES nombre_tabla [(nombre_col,...)] [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] [ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT] [ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT]]
Es imprescindible que la columna que contiene una definicin de clave fornea est indexada. Pero esto no debe preocuparnos demasiado, ya que si no lo hacemos de forma explcita, MySQL lo har por nosotros de forma implcita. Debido a que cuando se crea una clave fornea, se hace referencia a registros de la tabla principal, debe definirse que accin se tomar cuando se borren o actualicen registros de la tabla que posee la clave fornea. Por lo que se maneja las siguientes opciones:
ON DELETE <opcin>,
indica que acciones se deben realizar en la tabla actual si se borra una fila en la tabla referenciada.
ON UPDATE <opcin>,
Existen cinco acciones diferentes que se pueden considerar. Veamos lo que hace cada una de ellas:
RESTRICT: esta opcin impide eliminar o modificar filas en la tabla referenciada si existen filas con el mismo valor de clave fornea. CASCADE: borrar o modificar una clave en una fila en la tabla referenciada con un valor determinado de clave, implica borrar las filas con el mismo valor de clave fornea o modificar los valores de esas claves forneas. SET NULL: borrar o modificar una clave en una fila en la tabla referenciada con un valor determinado de clave, implica asignar el valor NULL a las claves forneas con el mismo valor. NO ACTION: las claves forneas no se modifican, ni se eliminan filas en la tabla que las contiene. SET DEFAULT: borrar o modificar una clave en una fila en la tabla referenciada con un valor determinado implica asignar el valor por defecto a las claves forneas con el mismo valor.
El siguiente ejemplo define una clave fornea en la columna 'id' de la tabla telefonos, que hace referencia a la columna 'id' de la tabla 'personas'. La definicin incluye las tareas a realizar en el caso de que se elimine y se actualice una fila en la tabla 'personas'.
Create table personas (id int auto_increment primary key, nombre varchar(40), fecha date); Create table telefonos(numero char(12), id int not null, constraint foreign key(id) references personas (id) on delete cascade on update cascade);
Si se intenta borrar una fila de 'personas' con un determinado valor de 'id', tambin se eliminaran las filas de la tabla telfonos que tengan el mismo valor en id.
Sesin 2
Si se modifica el valor de la columna 'id' en la tabla 'personas', se modificarn los valores de la columna 'id' para mantener la relacin.
8. ELIMINAR REGISTROS
Para eliminar filas se usa la sentencia DELETE. La sintaxis es muy parecida a la de UPDATE:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]
Es ms frecuente que slo queramos eliminar ciertas filas que cumplan determinadas condiciones. La forma ms normal de hacer esto es usar la clusula WHERE:
DELETE FROM poblacion WHERE codigo=2;
Sin embargo, existe una sentencia alternativa, TRUNCATE, que realiza la misma tarea de una forma mucho ms rpida. La diferencia es que DELETE hace un borrado secuencial de la tabla, fila a fila. Pero TRUNCATE borra la tabla y la vuelve a crear vaca, lo que es mucho ms eficiente.
TRUNCATE poblacion;
10
Sesin 2
IV. ACTIVIDADES
1. Realice cada uno de los ejemplos y ejercicios vistos en el marco terico y los indicados por el Docente.
V. EJERCICIOS 1. Utilizando las sentencias del lenguaje SQL, realice los siguientes ejercicios. 2. Tenemos la siguiente base de datos: CAPACITACION EMPRESAS codemp (PK) int Autoincrement nomemp Varchar(30) NOT NULL diremp Varchar(50) NOT NULL fonemp Varchar(12) NOT NULL estemp enum(A,X) NOT NULL PERSONAL codper (PK) int NOT NULL codemp (PK, FK) int NOT NULL nomper Varchar(30) NOT NULL MATRICULAS nrodoc (PK) Varchar(15) NOT NULL codalu (FK) int NOT NULL codcur (FK) int NOT NULL fecmat Date monto Decimal(12,2) NOT NULL estmat ENUM(A,X) NOT NULL ALUMNOS codalu (PK) int Autoincrement nomalu Varchar(30) NOT NULL diralu Varchar(30) NOT NULL estalu ENUM(A,X) NOT NULL codemp (FK) int NOT NULL codper (FK) int NOT NULL
CURSOS codcur (PK) nombre Varchar(30) NOT NULL costo Decimal(10,2) NOT NULL fecini Date fecfin Date estcur ENUM(A,X) NOT NULL
3. Escriba las sentencias de creacin de BD y creacin de tablas respectivas. 4. Adicione los siguientes campos en las tablas indicadas.
ALUMNOS
sexalu ENUM(M,F) NOT NULL; fecnac Date fonalu Varchar (12)
PERSONAL
claper Varchar(15) NOT NULL estper ENUM(A,X) NOT NULL
CURSOS
nrohor int NOT NULL nrovac int NOT NULL
MATRICULAS
n1 n2 n3 pr 11 int int int int Ing. Oscar Ramrez Valdez
Sesin 2
5. Inserte por lo menos 6 registros en cada una de las tablas, teniendo en cuenta la relacin que tiene las mismas y la integridad de los datos. 6. Actualice la tabla alumno de modo que todos los alumnos que pertenezcan a la empresa cuyo cdigo es 3, tengan estado A. 7. Actualice la tabla alumno de modo que todos los alumnos que pertenezcan a la empresa cuyo cdigo es 1, tengan estado X. 8. Actualice la tabla cursos de modo que todos los cursos tengan un costo de S/.120. 9. Actualice la tabla personal de modo que todos los trabajadores que pertenecen a la empresa cuyo cdigo es 2, tengan la clase Contratado y el estado A. 10. Actualice la tabla cursos de modo que todos los cursos tengan un nmero de vacantes de 25 alumnos. 11. Elimine las matriculas que tengan estado X. 12. Se desea eliminar los alumnos que pertenecen a la empresa 2. Qu debera suceder con los registros de la tabla matriculas para esos alumnos? 13. Cmo se podra cargar los datos a la tabla clientes desde un archivo TXT? Pruebe su respuesta. 14. Cmo se podra enviar los datos de una tabla hacia un archivo texto TXT? Pruebe su respuesta.
12