Sie sind auf Seite 1von 32

BASICO

SQL es un estandar para accesar y manejar bases de datos


Este tutorial te va a mostrar como manejar bases de datos en MySQL, SQL Server, MS
Access, Oracle, Sybase, DB2 y otras bases de datos
Que es SQL?
SQL es un standar un lenguaje estructurado para consultas
SQL te permite aceder y manejar bases dedatos
SQL es un Estandar (ANSI American National Standards Institute)
Que puede hacer SQL?
SQL puede
SQL puede
SQL puede
SQL puede
SQL puede
SQL puede
SQL puede
SQL puede
datos
SQL puede
SQL puede

ejecutar consultas a una base de datos


obtener datos de una base de datos
insertar registros en una base de datos
actualizar registros de una base de datos
borrar registros de una base de datos
crear nuevas bases de datos
crear nuevas tablas en una base de datos
crear procedimientos almacenados(codigo almacenado) en una base de
crear vistas en una base de datos
configurar permisos a tablas, procedimientos, y vistas

SQL es un estandar pero Apesar de que es un estandar ANSI (American National


Standards Institute) hay diferentes versiones del lenguaje SQL
Y de cualquier modo, siguen cumpliendo el estandar ANSI pues estas versiones
soportan la mayoria de los comandos tales como SELECT, UPDATE, DELETE, INSERT,
WHERE

Que es una RDBMS?


RDBMS (del ingls Relational database management system)
SGBD (Sistema de gestin de base de datos relacional)
es la base para el SQL y para todas las bases de datos modernas
como MS SQL Server, IBM DB2, Oracle, MySQL, and Microsoft Access.
Los datos en un RDBMS se almacenan en objetos llamados tablas
Una tabla es una coleccion relacionada de entradas que consiste en columnas
y filas
Usando SQL en tu Sitio Web

Para construir un sitio web que muestre datos de una base de datos necesitaras lo
siguiente:
*
*
*
*

Un programa de bases de datos RDBMS (MS Access, SQL Server, MySQL)


Un lenguaje del lado del servidor tales como PHP o ASP
SQL
HTML/CSS

Para realizar estos ejemplos descarga e instala SQL SERVER EXPRESS haciendo
clic AQUI

Sintaxis de SQL
Tablas
Una base de datos contienen uno o mas tablas. Cada tabla esta identificada por un
nombre (ejemplo Clientes o Ordenes). Las tablas contienen registros (filas) con datos

Sentencias SQL

Creamos la base de datos


CREATE DATABASE empresa
Creamos la tabla Personas
CREATE TABLE dbo.Personas
(
P_id int PRIMARY KEY IDENTITY,
Nombre nchar(20) NOT NULL,
Apellidos nchar(30) NOT NULL,
Direccion nchar(40) NOT NULL,
Ciudad nchar(10) NOT NULL
)
GO
Insertamos algunos registros:
INSERT INTO Personas
VALUES ('Marco Antonio','Trejo Lemus','Calle E 822','Tampico')
INSERT INTO Personas
VALUES ('Martha Beatriz','Trejo Lemus','Calle E 822','Tampico')
INSERT INTO Personas
VALUES ('Juana Elvira','Trejo Lemus','Calle E 822','Tampico')

INSERT INTO Personas


VALUES ('Nora Zulma','Trejo Lemus','Calle E 822','Tampico')
INSERT INTO Personas
VALUES ('Laura Lucero','Sobrevilla Trejo','Calle E 822','Tampico')
INSERT INTO Personas
VALUES ('Maria de la luz','Trejo Campos','Calle E 822','Tampico')
INSERT INTO Personas
VALUES ('Trinidad','Trejo Bautista','Calle E 822','Tampico')
INSERT INTO Personas
VALUES ('Marcel Abisag','Sobrevilla Trejo','Calle E 822','Tampico')
INSERT INTO Personas
VALUES ('Jose Abraham','Sobrevilla Trejo','Calle E 822','Tampico')
INSERT INTO Personas
VALUES ('Samuel Salomon','Olmeda Trejo','Calle E 822','Tampico')
Muchas de las acciones que necesitas realizar en una base de datos se hacen con
sentencias SQL
Seleccionamos todos los registros de la tabla
Las siguiente sentencia seleccionara todos los registros de la tabla "Personas" :
SELECT * FROM Personas
Abajo esta un ejemplo del resultado de la sentencia a la tabla llamada "Personas":

Este tutorial te enseara acerca de las diferentes declaraciones en SQL


Manten en mente lo siguiente: las sentencias SQL no son sencibles a las mayusculas o
minisculas
Punto y coma despues de las sentencias SQL
Algunos sistemas de bases de datos requieren un punto y coma al final de cada
sentencia SQL

El punto y como es un estandar que se para cada sentencia SQL en sistemas de bases
de datos que habilitan mas de una sentencia SQL ejecutada en la misma llamada al
servidor
SQL DML Y DLL
SQL puede ser dividido en dos partes: El Lenguaje de Manipulacion de Datos (DML) y el
Lenguaje de Definicion de Datos (DDL)

La parte DML del SQL de los comandos de consulta y actualizacion son:


SELECT - extrae datos de una base de datos
UPDATE - actualiza datos en una base de datos
DELETE - borra datos de una base de datos
INSERT INTO - inserta datos dentro de una base de datos

DLL del SQL que permite a bases de datos y tablas ser creadas o borradas.
Tambien define indices(llaves). especifica enlaces entre tablas, y impone relaciones
entre tablas.
La parte DLL del SQL, las sentencias mas importante DDL en SQL son:
CREATE DATABASE - crea una nueva base de datos
ALTER DATABASE - modifica una base de datos
CREATE TABLE - crea una nueva tabla
ALTER TABLE - modifica una tabla
DROP TABLE - borra una tabla
CREATE INDEX - crea un indice (llave de busqueda)
DROP INDEX - borra un indice
La sentencia SELECT
La sentencia SELECT es usada para seleccionar datos de una base de datos.

El resultado es almacenado en una tabla temporal, llamada tabla-resultado


La sintaxis SQL de la sentencia SELECT es:
1) SELECT nombre_columna(s)
FROM nombre_tabla
y
2) SELECT * FROM nombre_tabla

Ejemplo 1
SELECT nombre_columna(s)
FROM nombre_tabla

SELECT Nombre,Apellidos,Ciudad
FROM Personas

Ejemplo 2

SELECT * FROM nombre_tabla

SELECT * FROM nombre_tabla

Navegacion en una tabla de resultados

Muchos sistemas de bases de datos permiten la navegacion en la tabla de resultados


programando funciones como: Moverse-Al-Primero, Obtener-Contenido-Registro,
Moverse-Al-Siguiente-Registro, etc.
Funciones de programacion como estas no son parte de este tutorial. Para aprender a
accesar a datos con la llamada a funciones espera mi siguiente tutorial ADO y PHP.

La sentencia SELECT DISTINCT

Dentro de una tabla, algunas columnas pueden contener valores duplicados. Esto no es
un problema, algunas veces tu querras listar solo los valores diferentes (distintos) en la
tabla
La palabra DISTINCT puede ser usada como llave para regresar solo los valores
distintos(diferentes).
Sintaxis SQL SELECT DISTINCT
SELECT DISTINCT nombre_columna(s)
FROM nombre_table
Ejemplo:
SELECT DISTINCT Apellidos
FROM Personas
Abajo esta el resultado de la sentencia DISTINCT a la tabla "Personas":

SELECT DISTINCT Ciudad FROM Personas


Abajo esta el resultado de la sentencia DISTINCT a la tabla "Personas":

SQL WHERE
La sentencia where es usada para extraer solo los registros que cumplen con el criterio
especificad
La Sintaxis SQL WHERE
SELECT nombre_columna(s)
FROM nombre_tabla
WHERE nombre_columna operador valor
Ejemplo de la sentecia WHERE
SELECT *
FROM Personas
WHERE Apellidos ='Trejo Lemus'

Comillas en los campos de texto


SQL usa comillas simples en los valores de texto (muchos sitemas manejadores de
bases de datos aceptan comillas dobles).Para SQL los valores de texto deben ser
puestos entre comillas simples
Los valores numericos no deben ser puestos entre comillas
Para valores de texto:
Esta es la forma correcta:
SELECT *
FROM Personas
WHERE Nombre='Lucero'
Esta es la forma equivocada:
SELECT *
FROM Personas
WHERE Nombre=Lucero

Para valores numericos:


Esta es la forma correcta:
SELECT *
FROM Personas
WHERE P_id = 9
Esta es la forma incorrecta:
SELECT *
FROM Personas
WHERE P_id = '9'

Operadores permitidos en la sentencia WHERE


Con la sentencia WHERE, los siguientes operadores pueden ser usados:

Operadores SQL AND y OR


Los operadores AND y OR son usados para filtrar registros basados en mas de una
condicion
Operador AND
El operador AND muestra el registro si la primera condicion y la segunda condicion son
verdaderas
El operador OR muestra el registro si la primera o la segunda condicion es verdadera
Ahora teniendo en cuenta la siguiente tabla:

Para seleccionar solo las personas con el Nombre igual a Marcel Abisag y el apellido
igual a Sobrevilla Trejo,
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas
WHERE Nombre='Marcel Abisag'
AND Apellidos='Sobrevilla Trejo'

El resultado seria:

Operador OR
Ahora seleccionaremos las personas con el campo Nombre igual a "Martha" o el campo
Nombre igual a "Elvira"
Usaremos la siguiente sentencia SELECT
SELECT * FROM Personas
WHERE Nombre='Martha Beatriz'
OR Nombre='Juana Elvira'
El resultado sera el siguiente:

Combinando AND & OR

Puedes combinar el AND y el OR (usando parentesis para formar expresiones


complejas)
Ahora seleccionaremos solo las personas con el campo Apellidos igual a "Sobrevilla
Trejo" AND Nombre igual a "Marcel Abisag" OR igual a "Jose Abraham"
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas WHERE
Apellidos='Sobrevilla Trejo'
AND (Nombre='Marcel Abisag' OR Nombre='Jose Abraham')
El resultado sera el siguiente:

SQL ORDER BY
The ORDER BY keyword is used to sort the result-set.
La sentencia ORDER BY es usada para ordenar un resultado ordenado por una columna
especifica
La sentencia ORDER BY es usada para ordenar los registros en orden ascendente por
default
Si quieres ordenar los registros en orden descendente utiliza la palabra DESC
Sintaxis SQL ORDER BY
SELECT nombre_columna(s)
FROM nombre_tabla
ORDER BY nombre_column(s) ASCDESC
Ahora vamos a seleccionar todas las personas de la tabla, pero mostrando en orden por
el campo Nombre
Usaremos la siguiente sentencia SELECT:

SELECT * FROM Personas


ORDER BY Nombre
El resultado sera el siguiente:

ORDER BY DESC
Ahora vamos a seleccionar a todas las personas de la tabla pero mostrandolas en un
orden descendente por el campo Nombre con la palabra DESC
We use the following SELECT statement:
SELECT * FROM Personas
ORDER BY Nombre DESC
El resultado sera el siguiente:

Sentencia SQL INSERT INTO


La sentencia INSERT INTO se usa para insertar un registro o fila en una tabla
Sintaxis SQL INSERT INTO
Es posible escribir la sentencia INSET INTO en dos formas
La primera forma no especifica los nombres de las columnas donde los datos seran
insertados solo los valores:
INSERT INTO nombre_tabla
VALUES (valor1, valor2, valor3,...)

La segunda forma especifica los nombres de las columnas y los valores insertados
INSERT INTO nombre_tabla (columna1, columna2, columna3,...)
VALUES (valor1, valor2, valor3,...)
Ejemplo INSERT INTO
Dado que tenemos la siguiente tabla Personas:

Insertaremos un nuevo registro de la siguiente forma:


INSERT INTO Personas
VALUES ('Martha', 'Lemus Hurtado', 'Canoga Park', 'L.A.')
El resultado lo mostrariamos con la sentencia SELECT * FROM Personas y seria el
siguiente:

Insertar Datos solo en columnas especificadas


Es posible agregar datos en columnas especificas
Las siguientes sentencias SQL agregaran una nueva fila, pero solo agregaran datos en
las columnas Nombre y Apellidos

INSERT INTO Personas (Nombre, Apellidos)


VALUES ('Antonio', 'Trejo Campos')

Para mostrar el resultado con la sentencia: SELECT * FROM Personas


Mostrara lo siguiente:

Sentencia SQL UPDATE Statement


La sentencia UPDATE es usada para actualizar registros en una tabla
Sintaxis SQL UPDATE
UPDATE nombre_tabla
SET columna1=valor, column2=valor,...
WHERE alguna_columna=algun_valor
Nota: La sentencia WEHRE en la sintaxis UPDATE, especifica cual de los registros va a
ser actualizado. Si omites la sentencia WHERE todos los registros seran actualizados.
Ahora vamos a actualizar la persona "Antonio Trejo Campos" en la tabla Personas
Usaremos la siguientes sentencias SQL:
UPDATE Personas
SET Direccion='Canoga Park', Ciudad='L.A.'
WHERE Nombre='Antonio' AND Apellido='Trejo Campos'
El resultado sera el siguiente:

CUIDADO!!! al utilizar la sentencia UPDATE


Si omites la sentencia WHERE se actualizaran todos los registros de esta forma:
UPDATE Personas
SET Direccion='Canoga Park', Ciudad='L.A.'
El resultado seria:

Sentencia SQL DELETE


La sentencia DELETE se usa para borrar registros o filas en una tabla
Sintaxis SQL DELETE
DELETE FROM nombre_tabla
WHERE alguna_columna=algun_valor
Nota: La sentencia WHERE en la sintaxis DELETE especifica el registro o los registros
que seran borrados, si omites la sentencia WHERE, todos los registros seran borrados
de la tabla

Ahora vamos a borrar la persona "Marco Antonio Trejo Lemus" en la tabla Personas con
la siguiente sentencia:
DELETE FROM Personas
WHERE Nombre='Marco Antonio' AND Apellidos='Trejo Lemus'
SELECT * FROM Personas
El resultado sera el siguiente:

Borrar todas las filas


Es posible borrar todas las filas en una table sin borrar la tabla en si. Esto significa que
la estructura de la tabla, atributos e indices quedaran intactos:
DELETE FROM nombre_tabla
or
DELETE * FROM nombre_tabla
Nota: Debes tener cuidado cuando borres registros. Ya que no podras deshacer lo que
hagas con esta sentencia.

APENDICE 1
El siguiente codigo creara la base de datos en el servidor SQL EXPRESS

1.- Hacer clic en Inicio --> Todos los Programas --> Microsoft SQL SERVER 2008 --> SQL
Server Management Studio
2.- Hacer clic en el boton CONECTAR

3.- Hacer clic Nueva Consulta (se encuentra en el margen superior izquierdo)

Seleccionar y Copiar el siguiente "CODIGO GENERADOR


DE BASE DE DATOS" empresa:
______________________________________________________

USE master
if exists (select * from sysdatabases where name='empresa')
begin
raiserror('La base de datos existe; eliminndola....',0,1)
DROP database empresa
end
GO
raiserror('Creando base de datos empresa....',0,1)

go
CREATE DATABASE empresa
GO
USE empresa
GO
CREATE TABLE Personas(
P_id int PRIMARY KEY IDENTITY,
Nombre nchar(20) NOT NULL,
Apellidos nchar(30) NOT NULL,
Direccion nchar(40) NOT NULL,
Ciudad nchar(10) NOT NULL)
GO
GO
INSERT INTO Personas VALUES ('Marco Antonio','Trejo Lemus','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Martha Beatriz','Trejo Lemus','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Juana Elvira','Trejo Lemus','Calle E
822','Tampico')
INSERT INTO Personas VALUES ('Nora Zulma','Trejo Lemus','Calle E 822','Tampico')
INSERT INTO Personas VALUES ('Laura Lucero','Sobrevilla Trejo','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Maria de la luz','Trejo Campos','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Trinidad','Trejo Bautista','Calle E
822','Tampico')
INSERT INTO Personas VALUES ('Marcel Abisag','Sobrevilla Trejo','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Jose Abraham','Sobrevilla Trejo','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Samuel Salomon','Olmeda Trejo','Calle E
822','Tampico')
GO
select * from Personas
quit
______________________________________________________

4.- Pegar el codigo

5.- Ejecutar el codigo SQL haciendo clic sobre la opcion !Ejecutar que se muestra a
continuacion:

Publicado por Marco Antonio Trejo Lemus en 19:18 6 comentarios:

lunes, 18 de mayo de 2009


AVANZADO
Clausula SQL TOP
La clausula TOP se usa para especificar el numer de registros que existen
puede verificar la longitud de las tablas con miles de registros, regresando el numero
de registros
Nota: No todas las bases de datos soportan la clausula TOP
Sintaxis SQL Server
SELECT TOP numeroporciento nombre_columna(s)
FROM nombre_tabla

Ahora seleccionaremos solo los dos primeros registros de la tabla que se muestra
abajo:

Utilizaremos las siguientes sentencias SELECT:


SELECT TOP 2 * FROM Personas
El resultado sera el siguiente:

Sentencia SQL TOP PERCENT


Ahora seleccionaremos solo el 50% de los registros en la tabla
Usaremos las siguientes sentencias SELECT:
SELECT TOP 50 PERCENT * FROM Personas
El resultado se muestra abajo en la tabla:

Operador SQL LIKE


Operador SQL LIKE
El operador LIKE se usa en una sentencia WHERE para buscar un patron en una

columna
Sintaxis LIKE
SELECT nombre_columna(s)
FROM nombre_tabla
WHERE nombre_columna LIKE patron

Ejemplo de operador LIKE


En la tabla "Personas" :
Vamos a buscar las personas que viven en la ciudad de Tampico que empiecen con "Ta"
de la tabla en cuestion
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas
WHERE Ciudad LIKE 'Ta%'
El signo "%" puede ser usado para definir comodines (letras que faltan en el patron de
busqueda) ambas antes o despues del patron de busqueda
El resultado seria el siguiente:

Ahora vamos a seleccionar las personas que viven en la ciudad que comienza con una
"T" de la tabla personas
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas
WHERE Ciudad LIKE '%T'
El resultado seria el siguiente:

Ahora vamos a seleccionar las personas que viven en la ciudad que contiene el patron
"tam" de la tabla personas
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas
WHERE Ciudad LIKE '%tam%'
El resultado seria el siguiente:

Tambien es posible seleccionar las personas que viven en la ciudad que no contienen el
patron "tamp" de la tabla personas, usando la palabra clave NOT
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas
WHERE Ciudad NOT LIKE '%tamp%'
El resultado seria el siguiente:

Comodines SQL
Los comodines SQL pueden ser usados en la busqueda de datos en una base de datos
pueden sustituir a uno o mas caracteres cuando se busquen los datos
Los comodines deben usarse con el operador LIKE
Se pueden usar con SQL los siguientes comodines:

Usando el comodn %
Ahora seleccionaremos las personas que viven en la ciudad de Tampico que empiecen
con "Ta" de la tabla Personas

Usaremos la siguiente sentencia SELECT:


SELECT * FROM Personas
WHERE Ciudad LIKE 'Ta%'
Ahora buscaremos las personas que viven en la ciudad que contenga el patron "ico" de
la tabla Personas
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas
WHERE Ciudad LIKE '%ico%'
Usando el _ Comodn

Ahora selectionaremos las personas que el primer nombre comience con algun caracter
seguido de "Ma" de la tabla Personas
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas
WHERE Nombre LIKE '_ar'
Publicado por Marco Antonio Trejo Lemus en 22:07 23 comentarios:
Etiquetas: SQL Basico, SQL paso a paso, Tutorial SQL
Pgina principal

Prctica 1: SQL
Fecha: 6 Oct 2009
Conceptos: SQL (DDL y DML)

OBJETIVOS

El objetivo de esta prctica es aprender a utilizar el lenguaje para bases de datos SQL. Este
lenguaje es el ms ampliamente extendido entre los principales productos comerciales de
bases de datos. Proporciona la funcionalidades de los tipos de lenguajes vistos en teora:

DDL (Lenguaje de Definicin de Datos) para definir la estructura de la base de datos


y controlar el acceso a los datos

DML (Lenguaje de Manipulacin de Datos) para consultar y actualizar datos

La prctica de hoy consistir en crear y utilizar la base de datos de empleados de una


empresa segn el ejemplo visto en las clases de teora. Para ello, haremos uso de la
aplicacin comercial de bases de datos Oracle 10 instalada en las aulas informticas. Aunque
la mayor parte de los ejercicios estn escritos en SQL estndar, lo que posibilitara su
ejecucin en cualquier otra aplicacin diferente de Oracle que siga el estndar, existen
algunas partes en que se utilizan caractersticas concretas del SQL de Oracle. Los pasos en
que esto se produzca se ver indicado con el texto NO ESTNDAR sobre el recuadro del
ejercicio.

SQL Plus

Oracle 10 incorpora una herramienta en modo texto para manejar la base de datos usando el
lenguaje SQL llamada SQL Plus. Para arrancar la consola de la herramienta desde los
ordenadores de Windows se debe ejecutar:
Start > Programs > Oracle 9 >

SQL * Plus

Para arrancar, la herramienta nos solicitar nuestros datos de conexin a la base de datos.
Para poder conectar necesitaremos conocer lo siguiente:

Nombre de usuario: En Oracle cada usuario tiene un nico esquema de bases de


datos relacional propio asociado, el cual ya est creado con la cuenta. Todas las
acciones realizadas por los usuarios se producirn sobre las tablas de su propio
esquema; por ello, este nombre de usuario nos permite identificar el esquema que
vamos a utilizar.

Contrasea: Nos ser proporcionada durante la prctica.

Cadena de conexin: Identifica la instancia de Oracle a la que nos queremos


conectar. Una instancia de Oracle es una aplicacin de bases de datos en ejecucin
en una mquina.

CREACIN DE UNA TABLA

La base de datos de empresas que vimos en teora constaba de las siguientes tablas:
EMPLEADO, DEPARTAMENTO, LOCALIZACIONES_DEPT, PROYECTO, TRABAJA_EN y
DEPENDIENTE. Comenzaremos con un ejemplo de creacin de tabla. Escribid en la consola
de SQL Plus la siguiente definicin de tabla:
CREATE TABLE EMPLEADO (
NOMBRE VARCHAR(15) NOT NULL,
INC CHAR,
APELLIDO VARCHAR(15) NOT NULL,
NSS CHAR(9) NOT NULL,
FECHA_NCTO DATE,
DIRECCION VARCHAR(30),
SALARIO DECIMAL(10,2),
NSS_SUPERV CHAR(9),
ND INT);
Si todo ha ido bin, aparecer el mensaje:
Tabla creada.
SQL>
La tabla Empleado ha sido creada en el sistema y ya podramos introducir datos en ella.
Podemos consultar la descripcin de la tabla con el comando DESC. Comprueba que todo
cumple con lo descrito en la sentencia de CREATE TABLE anterior.
SQL> DESC EMPLEADO;
Ejercicios:
1. Borra la tabla Empleado (puedes hacerlo con el comando DROP TABLE ) y crea una
nueva tabla Empleado a la que adems de los campos de la tabla original se le haya

aadido un CP que guarde el cdigo postal de la residencia del empleado. Qu tipo


de dato has utilizado?
2. Introduce la informacin siguiente en tu tabla (puedes mirar en esta parte del
enunciado como se construye un insert). Si existe algn dato no descrito aqu para el
que tengas que dar algn valor al insertar, asignale un valor que sea consecuente
con la informacin actual en la base de datos.
3. Nombre: Jun
4. Inc: J
5. Apellidos: Garca
6. Nmero de Seguridad Social: 1223
7. Fecha de Nacimiento: 7 de Enero de 1957
8. Direccin: C/ Barco, 3
9. Cdigo postal: 1123
10. Salario: 30000
11. Nmero de dependientes (ND): 0
12. Qu sucede si insertas varias veces la misma informacin en la tabla? Prubalo
ejecutando varias veces la sentencia SQL que utilizaste en el ejercicio anterior. Por
qu la base de datos no ha evitado la aparicin de tuplas repetidas en la relacin?

CARGA DE SCRIPTS

Tener que teclear las sentencias de manipulacin de la base de datos de forma interactiva
tiene como inconveniente que cualquier error invalida toda la sentencia, y tendramos que
volver a escribirla. Para evitar esto, a partir de ahora escribiremos en un fichero de texto las
sentencias SQL a utilizar para poder crear la base de datos.

Crea un archivo de texto de nombre "creatablas.sql" y pega en l las siguientes


sentencias:

CREATE TABLE EMPLEADO (


NOMBRE VARCHAR(15) NOT NULL,
INC CHAR,
APELLIDO VARCHAR(15) NOT NULL,
NSS CHAR(9) NOT NULL,
FECHA_NCTO DATE,
DIRECCION VARCHAR(30),
SALARIO DECIMAL(10,2),
NSS_SUPERV CHAR(9),
ND INT);
CREATE TABLE DEPARTAMENTO(
NOMBRED VARCHAR(15) NOT NULL,
NUMEROD INT NOT NULL,
NSS_JEFE CHAR(9) NOT NULL,
FECHA_INICIO_JEFE DATE);
CREATE TABLE LOCALIZACIONES_DEPT(
NUMEROD INT NOT NULL,
LOCALIZACIOND VARCHAR(15) NOT NULL);

CREATE TABLE PROYECTO(


NOMBREP VARCHAR(15) NOT NULL,
NUMEROP INT NOT NULL,
LOCALIZACIONP VARCHAR(15),
NUMD INT NOT NULL);
CREATE TABLE TRABAJA_EN(
NSSE CHAR(9) NOT NULL,
NP INT NOT NULL,
HORAS DECIMAL(3,1) NOT NULL);
CREATE TABLE DEPENDIENTE(
NSSE CHAR(9) NOT NULL,
NOMBRE_DEPENDIENTE VARCHAR(15) NOT NULL,
SEXO CHAR,
FECHA_NCTO DATE,
PARENTESCO VARCHAR(8));

Borra la tabla empleado y ejecuta el script en SQL Plus:

NO ESTNDAR
SQL> START "creatablas.sql"

Verifica que se han creado todas las tablas. Para consultar las tablas que hay
actualmente definidas en el esquema escribe:

NO ESTNDAR
SQL> SELECT TABLE_NAME FROM USER_TABLES;
La relacin user_tables es una vista que mantiene informacin sobre todas las
tablas creadas por el usuario.

Ejercicio:
1. El comando anterior realiza una consulta que lista todos los campos table_name de
la tabla user_tables. Modifica la consulta para que devuelva un nico valor con el
nmero de tablas creado actualmente utilizando la funcin count().

INSERCIN DE DATOS. TRANSACCIONES

Antes de definir las claves de las tablas vamos a insertar la informacin para no tener
problemas con las restricciones que imponen las claves sobre las tablas. La razn de esto es
que la definicin de las claves definen adems Restricciones de Integridad Referencial que
impondran problemas del estilo de "la pescadilla que se muerde la cola" ya que todas las
relaciones tienen claves externas, con lo que para poder insertar una tupla, se exige
previamente tener antes tuplas a las cuales se hace referencia (por esta razn, nunca
podramos aadir ninguna tupla a nuestras tablas). Tambin introduciremos el concepto de

Transaccin en SQL.

Ejecuta el script datosEmpleado.sql para insertar la informacin de los empleados en


la tabla Empleado. Comprueba que no se produce ningn error al cargar el script.

Todas las actualizaciones que hemos realizado, todava no se han realizado en la


propia base de datos, a pesar de que podamos ver su resultado. Esto es debido a
que la escritura en la base de datos slo se realiza al finalizar una transaccin. Para
finalizar la transaccin actual, ejecuta:

SQL> COMMIT;
Commit complete.
Una transaccin es un conjunto de sentencias en SQL que se ejecutan de
forma atmica; esto quiere decir, que se considera que la actualizacin que producen
todas las sentencias de una transaccin se realiza a la vez y sin ningn proceso
externo que interrumpa dicha actualizacin. En Oracle por defecto se considera una
misma transaccin todas las sentencias ejecutadas entre dos COMMIT. Puedes
volver al estado que posea la base de datos al finalizar la ltima transaccin
con ROLLBACK. Para comprobarlo:
o

Inserta de nuevo la tupla que referenciaba al empleado Juan Garca que


contena esta informacin

Consulta la lista de empleados de la base de datos:


SQL> SELECT * FROM EMPLEADO;

Ejecuta:
SQL> ROLLBACK;

Comprueba que la tupla que acababas de insertar ha desaparecido de la


consulta de la lista de empleados

Por todo esto, cada vez que quieras dejar guardados los datos de forma definitiva,
debes ejecutar la sentencia COMMIT para finalizar la transaccin actual.
FORMATOS DE FECHA

La introduccin de fechas en Oracle permite el uso de mltiples formatos. En este caso


vamos a ver la funcin TO_DATE que permite formater la fecha segn sea necesario. La
forma de usar la funcin TO_DATE es la siguiente:
TO_DATE( fecha , formato , nls_language );
Ejemplos:

TO_DATE( '01-ene-2001', 'DD-MON-YYYY', 'nls_date_language =


spanish' );
INSERT INTO DEPENDIENTE VALUES('333445555','Alice','M',TO_DATE( '05APR-86', 'DD-MON-YY', 'nls_date_language = spanish' ),'HIJA');
En caso de no indicar el idioma de la fecha se supone el que est configurado por defecto en
el sistema. Para cambiar el idioma por defecto se puede utilizar ALTER SESSION:
ALTER SESSION SET NLS_DATE_LANGUAGE = 'Spanish';
De esta manera tanto las fechas introducidas como las fechas mostradas por Oracle sern en
formato espaol. Esto permite acortar la lnea de insercin anterior:
INSERT INTO DEPENDIENTE VALUES('333445555','Alice','M',TO_DATE( '05APR-86', 'DD-MON-YY'),'HIJA');
El segundo argumento indicando el formato exacto de la fecha tambin es opcional, por lo
que se puede eliminar si no se desea usar un formato de fecha extrao
DEFINICIN DE RESTRICCIONES DE CLAVE
PRIMARIA Y AJENA

Antes de insertar los datos del resto de tablas, vamos a definir las claves primarias y ajenas
para las tablas creadas anteriormente. Un recordatorio informal de lo visto en teora para
comprender las sentencias que aparecen a continuacin:

Clave primaria (PRIMARY KEY) es un campo o un conjunto de campos de la tabla


que identifican unvocamente una tupla (fila) y por tanto ser utilizado su valor para
referenciar a esta tupla.

Clave alternativa es muy similar a la clave primaria ya que tambin identifica


unvocamente una tupla. Puede haber tantas claves alternativas definidas como se
quiera, pero slo puede haber una clave primaria en una tabla. Se puede definir con
el identificador UNIQUE.

Clave ajena o tambin llamada clave externa (FOREIGN KEY) es un campo o


conjunto de campos de una tabla que referencia unvocamente a otra tupla. Por ello,
para definir una clave ajena dentro de una tabla tenemos que indicar la tabla a la que
pertenece la tupla referida y el campo o conjunto de campos de la tabla a que se
refiere. Este campo o conjunto de campos debera ser una clave primaria de la tabla
referenciada.

Sigue los siguientes pasos:

Ejecuta las siguientes sentencias para definir las claves en las tablas anteriormente
creadas:

ALTER TABLE EMPLEADO ADD PRIMARY KEY(NSS);

ALTER TABLE DEPARTAMENTO ADD PRIMARY KEY (NUMEROD);


ALTER TABLE DEPARTAMENTO ADD UNIQUE (NOMBRED);
ALTER TABLE DEPARTAMENTO ADD FOREIGN KEY (NSS_JEFE) REFERENCES
EMPLEADO(NSS);
ALTER TABLE LOCALIZACIONES_DEPT ADD PRIMARY
KEY(NUMEROD,LOCALIZACIOND) ;
ALTER TABLE LOCALIZACIONES_DEPT ADD FOREIGN KEY(NUMEROD)
REFERENCES DEPARTAMENTO(NUMEROD) ;
ALTER TABLE PROYECTO ADD PRIMARY KEY(NUMEROP);
ALTER TABLE PROYECTO ADD UNIQUE(NOMBREP);
ALTER TABLE PROYECTO ADD FOREIGN KEY(NUMD) REFERENCES
DEPARTAMENTO(NUMEROD);
ALTER TABLE TRABAJA_EN ADD PRIMARY KEY(NSSE, NP);
ALTER TABLE TRABAJA_EN ADD FOREIGN KEY(NSSE) REFERENCES
EMPLEADO(NSS);
ALTER TABLE TRABAJA_EN ADD FOREIGN KEY(NP) REFERENCES
PROYECTO(NUMEROP);
ALTER TABLE DEPENDIENTE ADD PRIMARY KEY(NSSE,
NOMBRE_DEPENDIENTE);
ALTER TABLE DEPENDIENTE ADD FOREIGN KEY(NSSE) REFERENCES
EMPLEADO(NSS);

Carga los siguientes datos. Ten en cuenta que algunas lneas poseen informacin
inconsistente con las restricciones impuestas por las claves anteriormente definidas.
Cul es el problema que se produce? A qu crees que es debido? Por el momento
inserta todos los datos menos la tupla que te haya dado problemas.

INSERT INTO DEPARTAMENTO


VALUES('Investigacin',5,'333445555','22-MAY-88');
INSERT INTO DEPARTAMENTO
VALUES('Administracin',4,'987654321','01-JAN-95');
INSERT INTO DEPARTAMENTO VALUES('Direccin',1,'888775555','19JUN-81');
INSERT
INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO
INTO

LOCALIZACIONES_DEPT
LOCALIZACIONES_DEPT
LOCALIZACIONES_DEPT
LOCALIZACIONES_DEPT
LOCALIZACIONES_DEPT

INSERT
INSERT
INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO
INTO
INTO

PROYECTO
PROYECTO
PROYECTO
PROYECTO
PROYECTO
PROYECTO

INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO

TRABAJA_EN
TRABAJA_EN
TRABAJA_EN
TRABAJA_EN

VALUES(1,'Houston');
VALUES(4,'Stafford');
VALUES(5,'Bellaire');
VALUES(5,'Sugarland');
VALUES(5,'Houston');

VALUES('ProductoX',1,'Bellaire',5);
VALUES('ProductoY',2,'Sugarland',5);
VALUES('ProductoZ',3,'Houston',5);
VALUES('Automatizacin',10,'Stafford',4);
VALUES ('Reorganizacin',20,'Houston',1);
VALUES('Nuevos valores',30,'Stafford',4);
VALUES('123456789',1,32.5);
VALUES('123456789',2,7.5);
VALUES('666884444',3,40.0);
VALUES('453453453',1,20.0);

INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO

TRABAJA_EN
TRABAJA_EN
TRABAJA_EN
TRABAJA_EN
TRABAJA_EN
TRABAJA_EN
TRABAJA_EN
TRABAJA_EN
TRABAJA_EN
TRABAJA_EN
TRABAJA_EN
TRABAJA_EN

INSERT INTO DEPENDIENTE


86','HIJA');
INSERT INTO DEPENDIENTE
OCT-83','HIJO');
INSERT INTO DEPENDIENTE
58','ESPOSA');
INSERT INTO DEPENDIENTE
42','ESPOSO');
INSERT INTO DEPENDIENTE
JAN-88','HIJO');
INSERT INTO DEPENDIENTE
88','HIJA');
INSERT INTO DEPENDIENTE
MAY-67','ESPOSA');

VALUES('453453453',2,20.0);
VALUES('333445555',2,10.0);
VALUES('333445555',3,10.0);
VALUES('333445555',10,10.0);
VALUES('333445555',20,10.0);
VALUES('999887777',30,30.0);
VALUES('999887777',10,10.0);
VALUES('987987987',10,35.0);
VALUES('987987987',30,5.0);
VALUES('987654321',30,20.0);
VALUES('987654321',20,15.0);
VALUES('888775555',20,null);
VALUES('333445555','Alice','M','05-APRVALUES('333445555','Theodore','H','25VALUES('333445555','Joy','M','03-MAYVALUES('987654321','Abner','H','28-FEBVALUES('123456789','Michael','H','04VALUES('123456789','Alice','M','30-DECVALUES('123456789','Elizabeth','M','05-

COMMIT

Cada vez que definimos un tipo de clave (primaria, externa, alternativa), o


imponemos condiciones sobre los tipos de valores que pueden tomar los campos de
una tabla (como la restriccin de valores nulos cuando hemos definido las
tablas anteriormente), estamos creando restricciones (constraints). Dependiendo de
la base de datos que utilicemos, las restricciones se gestionan de forma diferente. En
Oracle, por ejemplo, podemos ver las restricciones definidas sobre la
tabla Empleado con la siguiente sentencia:

NO ESTNDAR
SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE FROM
USER_CONSTRAINTS WHERE TABLE_NAME='EMPLEADO';

CONSTRAINT_NAME
-----------------------------SYS_C003685682
SYS_C003685683
SYS_C003685684
SYS_C003685699

C
C
C
C
P

Como podemos ver, ya hay unas restricciones definidas en la tabla Empleado. Estas
restricciones vigilan las imposiciones de NOT NULL en algunos atributos de la tabla
(tipo C) y la definicin de clave primaria (tipo P). Veremos que si definimos las claves

ajenas de la tabla, las restricciones definidas aumentan con las dos nuevas para
claves ajenas (tipo R). En Oracle, los tipos de restricciones vienen dados por un
carcter contenido en el atributo CONSTRAINT_TYPE; puedes ver los tipos
diferentes de restricciones que pueden estar definidos en CONSTRAINT_TYPE aqu.
SQL> ALTER TABLE EMPLEADO ADD FOREIGN KEY (NSS_SUPERV)
REFERENCES EMPLEADO(NSS);
Table altered.
SQL> ALTER TABLE EMPLEADO ADD FOREIGN KEY(ND) REFERENCES
DEPARTAMENTO(NUMEROD);
Table altered.
SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE FROM
USER_CONSTRAINTS WHERE TABLE_NAME='EMPLEADO';
CONSTRAINT_NAME
-----------------------------SYS_C003685682
SYS_C003685683
SYS_C003685684
SYS_C003685703
SYS_C003685699
SYS_C003685718

C
C
C
C
R
P
R

Estas restricciones se chequearn antes de insertar datos en la tabla, impidiendo su


actualizacin si no cumple sus requisitos. Si nos hemos equivocado, para eliminar
una restriccin podemos ejecutar:

ALTER TABLE <table_name> DROP CONSTRAINT <constraint_name>;


Donde <table_name> es el nombre de la tabla y <constraint_name> el nombre de la
restriccin que queremos eliminar (en la consulta anterior, la de clave primaria
SYS_C003685699, por ejemplo).
Ejercicios
1. En Oracle la relacin USER_CONSTRAINTS nos permite conocer el nombre de una
restriccin (CONSTRAINT_NAME), el tipo de restriccin (CONSTRAINT_TYPE) y el
nombre de la tabla sobre la que se ha definido (TABLE_NAME). Usando la
relacin USER_CONS_COLUMNS podemos conocer el nombre de una restriccin
(CONSTRAINT_NAME), el nombre de la tabla en la que se ha definido
(TABLE_NAME) y el nombre del atributo de la tabla en que se aplica
(COLUMN_NAME). Crea una consulta que, utilizando ambas tablas, genere un
listado con nombre de restriccin, tipo de restriccin, nombre de tabla y nombre de
columna.
2. Elimina la restriccin que impeda insertar la tupla anterior y insrtarla.

EJERCICIOS DE CONSULTAS

Realiza las siguientes consultas:


1. Enumere los nombres de los jefes que tienen ms de un familiar dependiente. Se
considera que un empleado es jefe si aparece su NSS como NSS_SUPERV de otro
empleado al menos. NOTA: Resultado corregido Resultado de la consulta:
2. NOMBRE
3. --------------4. Franklin
5.
6. Recupere los nombres de todos los empleados que no tienen supervisores.
Resultado de la consulta:
7. NOMBRE APELLIDO
8. --------------- --------------9. James
Borg
10.
11. De cada proyecto ubicado en 'Stafford', haga una lista con el nmero de proyecto, el
nmero de departamento controlador y el apellido, direccin y fecha de nacimiento
del jefe de departamento, utilizando JOIN... ON. Resultado de la consulta:
12. NUMEROP
NUMD APELLIDO
DIRECCION
FECHA_NC
13. --------- --------- -------------------------------------------- -------14.
10
4 Wallace
291 Berry, Bellaire, TX
20/06/41
15.
30
4 Wallace
291 Berry, Bellaire, TX
20/06/41
16.
17. Halle la suma de los salarios de todos los empleados del departamento de
'Investigacin', as como el salario mximo, el salario mnimo y el salario medio en
dicho departamento. Debe incluirse en el cmputo el responsable del departamento.
Resultado de la consulta:
18. SUM(SALARIO) MAX(SALARIO) MIN(SALARIO) AVG(SALARIO)
19. ------------ ------------ ------------ -----------20.
133000
40000
25000
33250
21.
22. Recupere el nmero de empleados del departamento 'Investigacin'. Debe incluirse
en el cmputo el responsable del departamento. Resultado de la consulta:
23. COUNT(*)
24. -------25.
4
26.

27. De cada proyecto, recupere su nmero, su nombre y el nmero de empleados del


departamento 5 que trabajen en l CONTANDO AL RESPONSABLE Resultado de la
consulta:
28. NUMEROP NOMBREP
COUNT(*)
29. ------- --------------- --------30.
1 ProductoX
2
31.
2 ProductoY
3
32.
3 ProductoZ
2
33.
10 Automatizacin
1
34.
20 Reorganizacin
1
35.
36. Contar el nmero total de empleados en cada departamento cuyos salarios rebasen
los 10.000 DOLARES , pero slo en el caso de departamentos en los que trabajen
ms de DOS EMPLEADOS SIN CONTAR AL RESPONSABLE Resultado de la
consulta:
37.
38.
39.
40.
41.
42.

NOMBRED
COUNT(*)
--------------- --------Administracin
3
Investigacin
4
Direccin
3

43. De cada departamento que tenga ms de DOS empleados (ya que no hay ninguno
de ms de 5 empleados), recupere el nmero de departamento y el nmero de
empleados que ganan ms de 40.000 dlares Resultado de la consulta:
44. NUMEROD COUNT(*)
45. -------- --------46.
4
1

Das könnte Ihnen auch gefallen