You are on page 1of 53

1

TEMAS 5 6 7: EL LENGUAJE SQL


1.- INTRODUCCIN
2.- SENTENCIAS
2.1.- TIPOS DE SENTENCIAS
3.- TIPOS DE DATOS Y OPERADORES
4.- CREAR, USAR Y ACCEDER A BBDD CON MySQL.
5.- LENGUAJE DE DEFINICIN DE DATOS
5.1.- TABLAS
5.2.- NDICES
6.- LENGUAJE DE MANIPULACIN DE DATOS
6.1.- INSERT
6.2.- UPDATE
6.3.- DELETE
6.4.- SELECT
6.5.- SELECT DENTRO DE OTRAS INSTRUCCIONES
7.- LENGUAJE DE CONTROL DE DATOS
7.1.- VISTAS
7.2.- SINNIMOS
8.- EJERCICIOS (SQL1 Gestion_ventas)
ANEXO (TABLAS DE TRABAJO)

1.- INTRODUCCIN.
SQL es una herramienta para organizar, gestionar y recuperar datos almacenados en una
base de datos. Es la abreviatura de Structured Query Language (Lenguaje Estructurado de
Consultas) y funciona con un tipo de bases de datos especfico: Las bases de datos relacionales. Es
un lenguaje relacional desarrollado inicialmente por IBM y que actualmente vienen definido por el
estndar ISO/ANSI_SQL, y es utilizado por la mayor parte de los Sistemas de Gestin de Bases de
Datos Relacionales (SGBDR).
SQL, adems de ser una herramienta de consulta y recuperacin de datos, se utiliza para
controlar todas las funciones que suministra un Sistema Gestor de Bases de Datos Relacionales a
sus usuarios, incluyendo:
Definicin de datos.- Permite que el usuario defina la estructura y organizacin de los datos
almacenados, as como las relaciones entre ellos.
Recuperacin de datos.- Permite al usuario o a un programa recuperar y utilizar los datos
almacenados en una base de datos.
Manipulacin de datos.- Permite al usuario o a un programa actualizar la base de datos
aadiendo datos nuevos, borrando los viejos y modificando los almacenados previamente.
Control de acceso.- Puede ser utilizado para restringir la capacidad de un usuario para
recuperar, aadir y modificar datos, protegiendo los datos almacenados contra accesos no
autorizados.
Comparticin de informacin.- Se utiliza para coordinar la comparticin de datos entre
usuarios concurrentes, asegurando que no haya interferencias entre ellos.
Integridad de los datos.- Define restricciones de integridad en la base de datos,
protegindola de alteraciones debidas a actualizaciones inconsistentes o fallos del sistema
SQL se puede utilizar de forma interactiva, mediante alguna de las herramientas del
SGBDR, como mysql.exe, SQL*Plus, ORACLE, DB2I ..., o bien, embebido en un lenguaje de
programacin anfitrin, como COBOL, C, PASCAL, PL/I, FORTRAN, ADA ...

2.- SENTENCIAS.
SQL es el lenguaje que se utiliza para pedir al SGBD que realice las operaciones deseadas
sobre las tablas. Las sentencias de este lenguaje contienen los siguientes componentes:
1.- Palabras predefinidas o claves.- Palabras que tienen un significado predefinido en el
lenguaje SQL (SELECT, WHERE, INTO, etc.) suelen aparecer en maysculas.
2.- Nombres de tablas (Relaciones) y columnas (atributos).
3.- Constantes.- Tambin llamadas literales, son secuencias de caracteres que representan un
valor determinado. Si no es un nmero, debe ir entre apstrofes ().
4.- Signos delimitadores.- Signos especiales que aparecen en las sentencias fuera de otros
elementos. Sirven para delimitar dichos elementos cuando no van entre comillas o apstrofes. El
ms utilizado es el espacio en blanco, pero tambin actan como delimitadores parntesis, comas,
signos de operaciones aritmticas o de comparacin.

3
Las palabras predefinidas o claves y los nombres de tablas y columnas pueden escribirse
tanto en maysculas como en minsculas o en una mezcla de ambas, si bien es costumbre utilizar
siempre maysculas.
Todas las sentencias SQL comienzan con un verbo, es decir, una palabra clave que describe
lo que la sentencia hace (p.e. CREATE, INSERT, DELETE, SELECT, etc.).
La sentencia contina con una o ms clusulas. Una clusula puede especificar los datos
sobre los que debe actuar la sentencia, o proporcionar ms detalles acerca de lo que hace la
sentencia. Todas las clusulas comienzan tambin con una palabra clave (p.e. WHERE, FROM,
etc.). En definitiva, una clusula puede contener nombres de tablas, de columnas, otras palabras
claves, constantes o expresiones.
EJEMPLO:
Verbo

Clusulas

Constante

DELETE FROM INFVENTAS WHERE VENTAS < 2000.00 ;

Palabras clave

Nombre de tabla

Nombre de columna

Las palabras claves no pueden ser utilizadas para designar objetos de la base de datos, tales
como tablas, columnas y usuarios.
La lista completa de palabras reservadas se puede encontrar en:
http://dev.mysql.com en el apartado Reserved_words.html

2.1. TIPOS DE SENTENCIAS.


Segn el tipo de operacin que expresan, las sentencias en SQL pueden clasificarse en:
1.- Sentencias de Definicin de Datos (Data Definition Language - DDL).Permiten definir nuevos objetos (CREATE Tablas, Vistas, ndices) o destruir (DROP)
objetos existentes en una base de datos.
2.- Sentencias de Manipulacin de Datos (Data Manipulation Language - DML).- Permiten
realizar consultas u mantenimiento de datos (insercin, modificacin y borrado). Son:
SELECT.- Permite extraer datos de una o varias tablas. Se utiliza para realizar consultas.
INSERT.- Permite aadir una o varias filas (tuplas) a una tabla (relacin).
UPDATE.- Permite modificar uno o varios valores de una o ms filas de una tabla.
DELETE.- Permite borrar una o varias filas de una tabla.
3.- Sentencias de Control de Datos (Data Control Language - DCL).Permiten definir la seguridad de los datos y garantizar la confidencialidad de acceso a los
datos, mediante la concesin (GRANT) de autorizaciones o denegacin (REVOKE) de stas.

3.- TIPOS DE DATOS Y OPERADORES.


TIPOS DE DATOS
Al asignar, con la sentencia CREATE, el nombre a las columnas de una tabla, se le asigna
tambin un determinado tipo de datos de los predefinidos en SQL, con ello se est definiendo:
El conjunto de los valores posibles que puede tomar el atributo (Dominio).
Las operaciones que pueden realizarse con los valores almacenados en el atributo.
Los tipos de datos permitidos en SQL pueden ser:
a)
b)
c)
d)

Numricos o cantidades susceptibles de participar en clculos aritmticos.


Alfanumricos o de texto que representan combinaciones de caracteres cualesquiera.
Datos lgicos o Booleanos.
Datos de tipo fecha y hora.

Datos Numricos

Tipo

Espacio

TINYINT
SMALL INT
MEDIUM INT
INT
INTEGER
BIGINT
FLOAT(M,D)
DOUBLE(M,D)
DECIMAL(M,D)
NUMERIC(M,D)

1 byte
2 bytes
3 bytes
4 bytes
4 bytes
8 bytes
4 bytes
8 bytes
M bytes
M bytes

Rango

Rango sin signo

-128 a 127
-32.768 a 32.767
-8.388.608 a 8.388.607
-2.147.483.648 a 2.147.483.647
-2.147.483.648 a 2.147.483.647
-9,223 * 1018 a 9,223 * 1018
vara segn los parmetros
vara segn los parmetros
vara segn los parmetros
vara segn los parmetros

0 a 255
0 a 65.535
0 a 16.777.215
0 a 4.294.967.295
0 a 4.294.967.295
0 a 18,446 * 1018

Modificadores numricos:
Los nmeros enteros se pueden colocar sin signo adelantando la palabra UNSIGNED.
Los decimales permiten indicar el nmero total de dgitos (M) y el nmero de decimales
(D), puede ser 0 para nmeros enteros.
A los nmeros enteros se les puede asignar el modificador AUTO_INCREMENT para que
el campo marcado almacene ms rpido los valores.
Se puede declarar una anchura de columna de esta forma: INT(8).
Si adems se define la columna con ZEROFILL, entonces se colocan ceros a la izquierda
hasta llegar a esa anchura.
Datos alfanumricos o de texto
ipo Espacio Tamao mximo

Tipo
CHAR(X)
VARCHAR(X)
TINYTEXT
TINYBLOB
TEXT
BLOB
MEDIUMTEXT
MEDIUMBLOB
LONGTEXT
LONGBLOB

Espacio
X bytes
X + 1 bytes
X + 1 bytes
X + 1 bytes
X + 2 bytes
X + 2 bytes
X + 3 bytes
X + 3 bytes
X + 4 bytes
X + 4 bytes

Tamao mximo
255 bytes
255 bytes
255 bytes
255 bytes
65.535 bytes
65.535 bytes
1,6 MB
1,6 MB
4,2 GB
4,2 GB

5
Los que ms se usan son CHAR y VARCHAR. Ambos almacenan cadenas de caracteres
pero CHAR las almacena de tamao fijo y VARCHAR de tamao variable. Dicho de otra forma: si
definimos un CHAR de tamao 8, CHAR(8), cualquier dato ocupa 8 bytes. Con VARCHAR(8) si
algn dato ocupa 4 caracteres, en disco ocupar 5 bytes, 4 +1 carcter de fin de cadena.
TEXT y BLOB se usan para grandes cantidades de texto variable. La diferencia es que los
tipos BLOB distinguen entre maysculas y minsculas.
Datos lgicos
Son los tipos BIT o BOOL que admiten los valores 0 o 1.
Datos de fechas y horas
tipo Rango Formato

Tipo
DATE
DATETIME
TIMESTAMP

TIME
YEAR

Rango

Formato

Del 1/1/1001 al 31/12/9999


De las 0 horas del 1/1/1001 a las 0
horas del 31/12/9999
De las 0 horas del 1/1/1970 a las 0
horas del 31/12/2037

Hora desde 00:00 a 23:59


Ao desde 1901 a 2037

AAAA-MM-DD
AAAA-MM-DD HH:MM:SS
AAAA-MM-DD HH:MM:SS
Permite estos tamaos:
* 14 (aaaammddhhmmss)
* 12 (aaaammddhhmm)
* 8 (aaaammdd)
* 6 (aammdd)
* 4 (aamm)
* 2 (aa)
HH:MM:SS
AAAA

Modificadores
e aplica a Uso

Modificador

Se aplica a

AUTO_INCREMENT Enteros
BINARY

char y varchar

DEFAULT
NOT NULL
PRIMARY KEY

Todos menos TEXT


y BLOB
Todos
Todos

UNIQUE
UNSIGNED
ZEROFILL

Todos
Enteros
Enteros

Uso
El valor se va incrementando en cada
registro
Convierte las cadenas a forma binaria en
la que se distingue entre maysculas y
minsculas
Coloca un valor por defecto, el valor se
coloca justo despus de la palabra
Impide que un campo sea nulo
Hace que el campo se considere clave
primaria
Evita la repeticin de valores
Solo valen los valores positivos
Rellena con ceros a la izquierda hasta
llegar al ajuste

ENUM
Permite declarar campos cuyo contenido puede ser una de entre varias opciones.
Ejemplo:
CREATE TABLE personas (Sexo ENUM(M, H), .....

6
Valores nulos (NULL)
Sea cual sea el tipo de dato especificado para una columna puede permitirse o no que entre
sus posibles valores figure un valor especial, el valor nulo (NULL) que indica la carencia de datos o
falta de informacin sobre dichos datos. Es decir, la interpretacin que se hace del valor nulo es la
de valor Desconocido.
Al definir una columna en una tabla mediante la sentencia CREATE, puede permitirse la
inclusin de valores nulos, indicando en su dominio correspondiente la palabra NULL o excluir
dicho valor del dominio mediante la palabra NOT NULL.
Debe tenerse en cuenta que en una columna de tipo numrico el valor NULL no significa el
valor 0. Su significado real es nmero desconocido.
En una columna de tipo alfanumrico NULL no significa campo en blanco ni cadena de
longitud cero. Su significado real es literal desconocido.
Constantes
Las constantes o literales son secuencias de caracteres que representan un valor
determinado, numrico o alfanumrico. Se especifican de la forma siguiente:
Numricas:
Enteras y Decimales: mediante el valor de la constante con su signo caso de ser negativo: 10 , 20 , 3.14 , -5.72 etc.
Exponenciales: mediante una secuencia de caracteres formada por una constante entera o
decimal de hasta 17 dgitos seguida de la letra E y de una constante entera de hasta 2 dgitos:
1.23E45 , 314E-2 , -11.2E17 , etc.
Alfanumricas
Se especifican como secuencias de caracteres cualesquiera dentro del juego de caracteres
disponibles, que empiezan y terminan con una comilla simple (): Informtica, S, 10-11-2000 ,
Harrolds, etc.
Como se ve en el ltimo ejemplo se utilizan dos apstrofes consecutivos para indicar al
SGBD que se utiliza el carcter como literal y no como fin de la constante.
El SGBD trata las constantes alfanumricas como datos de tipo VARCHAR.
OPERADORES
Operadores aritmticos
Operan entre valores numricos y devuelven un valor numrico como resultado de realizar
los clculos indicados. Se emplean para realizar clculos numricos:
+
*
/
Div
Mod

Suma
Resta
Multiplicacin
Divisin
Divisin entera ( parte entera de la divisin, sin decimales)
Resto de la divisin

7
Operadores de comparacin
Las expresiones formadas con operadores de comparacin dan como resultado un valor de
tipo Verdadero/Falso/Nulo (True/False/Null).
=
Igual
!=
Distinto
<>
Distinto
<
Menor
<=
Menor o igual
>
Mayor
>=
Mayor o igual
BETWEEN / NOT BETWEEN
IN / NOT IN
IS NULL / IS NOT NULL
LIKE
Los primeros son los operadores relaciones ya conocidos. Los segundos son pares de un
operador y su negacin con la siguiente forma de actuar:
BETWEEN valor1 AND valor2
Es VERDADERO si el valor comparado es >= que valor1 y <= que valor2 y FALSO en el caso
contrario.
IN (lista de valores separados por comas)
Es VERDADERO si el valor comparado est dentro de la lista de valores especificado y FALSO en
el caso contrario.
IS NULL
Es VERDADERO si el valor del dato comparado es nulo y FALSO en el caso contrario.
LIKE
Permite comparar dos cadenas de caracteres con la peculiaridad de que admite caracteres
comodines. Los caracteres comodines son '%' y '_'. Estos caracteres permiten utilizar patrones en la
comparacin. El '%' puede ser sustituido por un grupo de caracteres (de 0 a cualquier nmero) y el
'_' por un carcter cualquiera en esa posicin.
Operadores lgicos
Operan entre datos con valores lgicos Verdadero/Falso/Nulo y devuelven el valor lgico
Verdadero/Falso/Nulo. Los operadores lgicos son:
!
&&
||

NOT
AND
OR
XOR (devuelve verdadero si uno de los operadores es verdadero y el otro falso, devuelve
falso si ambos son verdaderos o ambos falsos).

4.- CREAR, USAR Y ACCEDER A BASES DE DATOS EN MySQL.


Primeramente usaremos la sentencia SHOW DATABASES para ver cules son las bases de
datos existentes en el servidor al que estamos conectados:
mysql> SHOW DATABASES;
+-----------+
| Database |

8
+-----------+
| mysql
|
| test
|
+-----------+
2 rows in set (0.00 sec)
mysql>
Es probable que la lista de bases de datos que veamos sea diferente en nuestro caso, pero
seguramente las bases de datos "mysql" y "test " estarn entre ellas. En particular, la base de datos
"mysql" es necesaria, ya que sta tiene la informacin de los privilegios de los usuarios de MySQL.
La base de datos "test " se crea durante la instalacin de MySQL con el propsito de servir como
rea de trabajo para los usuarios que inician en el aprendizaje de MySQL.
Para acceder a la base de datos "test " se usa el comando USE:
mysql> USE test
Database changed
mysql>
Observar que USE, al igual que QUIT, no requieren el uso del punto y coma, aunque si se
usa ste, no hay ningn problema. El comando USE es especial tambin de otra manera, debe ser
usado en una sola lnea.
mysql> USE prueba
ERROR 1049: Unknown database 'prueba'
mysql>
El mensaje anterior indica que la base de datos no ha sido creada, por lo tanto necesitamos
crearla.
mysql> CREATE DATABASE prueba;
Query OK, 1 row affected (0.00 sec)
mysql> USE prueba
Database changed
mysql>
Ahora ya se pueden lanzar sentencias CREATE TABLE para crear tablas sobre la base de
datos prueba que hemos creado y hemos accedido.
Bajo el sistema operativo WINDOWS, los nombres de las bases de datos no diferencian
entre maysculas y minsculas.
Al crear una base de datos no se selecciona sta de manera automtica; debemos hacerlo de
manera explcita, por ello usamos el comando USE en el ejemplo anterior.
La base de datos se crea slo una vez, pero nosotros debemos seleccionarla cada vez que
iniciamos una sesin con mysql. Por ello es recomendable que se indique la base de datos sobre la
que vamos a trabajar al momento de invocar al monitor de MySQL. Por ejemplo:
shell>mysql -h 192.168.1.2 -u root p prueba
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17 to server version: 4.1.8-nt-max-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer
mysql>
Nota: Observar que "prueba" no es la contrasea que se est indicando desde la lnea de comandos,
sino el nombre de la BD a la que deseamos acceder.

9
Si deseamos proporcionar la contrasea en la lnea de comandos despus de la opcin "-p",
debemos de hacerlo sin dejar espacios (por ejemplo, -phola123, no como -p hola123). Sin embargo,
escribir nuestra contrasea desde la lnea de comandos no es recomendado, ya que es bastante
inseguro.
Para ver en un momento dado en que base de datos nos encontramos situados:
mysql> select database( );
+-------------+
| database( ) |
+-------------+
| prueba
|
+-------------+
1 row in set (0.00 sec)
mysql>
Para acceder a una tabla de una base de datos cuando nos encontramos situados en otra base
de datos es necesario anteponer en la sentencia el nombre de la base de datos seguido de un punto.
Por ejemplo accedo mediante el comando USE a la base de datos test y a continuacin hago un
select de la tabla departamentos de la base de datos prueba.
mysql> use test
Database changed
mysql> select * from prueba.departamentos;
+-----------+------------------------+-------------------+
| DEP_NO | DNOMBRE
| LOCALIDAD |
+-----------+------------------------+-------------------+
| 10
| CONTABILIDAD | BARCELONA |
| 20
| INVESTIGACION | VALENCIA |
| 30
| VENTAS
| MADRID
|
| 40
| PRODUCCION
| SEVILLA
|
+-----------+------------------------+-------------------+
4 rows in set (0.10 sec)
mysql>
Esto se podr hacer siempre que el usuario tenga privilegios suficientes como para acceder a
ambas bases de datos (en este ejemplo a prueba y a test).
Algunas consultas bsicas de inters para el administrador
- Consulta para conocer la versin del servidor y la fecha actual:
mysql> SELECT VERSION( ), CURRENT_DATE;
+------------------+------------------------+
| VERSION( ) | CURRENT_DATE |
+------------------+------------------------+
| 5.5.8
| 2012-01-08
|
+------------------+------------------------+
1 row in set (0.09 sec)
mysql>
Nota: Tambin tenemos:

CURRENT_TIME

NOW( )

10
Un comando normalmente consiste de una sentencia SQL seguida por un punto y coma.
Cuando emitimos un comando, mysql lo manda al servidor para que lo ejecute, nos muestra los
resultados y regresa el prompt indicando que est listo para recibir ms consultas. mysql muestra los
resultados de la consulta como una tabla (filas y columnas). La primera fila contiene etiquetas para
las columnas. Las filas siguientes muestran los resultados de la consulta. Normalmente las etiquetas
de las columnas son los nombres de los campos de las tablas que estamos usando en alguna
consulta. Si lo que estamos recuperando es el valor de una expresin (como en el ejemplo anterior)
las etiquetas en las columnas son la expresin en s.
mysql muestra cuntas filas se han obtenido y cuanto tiempo tard en ejecutarse la consulta,
lo que puede darnos una idea de la eficiencia del servidor, aunque estos valores pueden ser un tanto
imprecisos ya que pueden verse afectados por otros factores, tales como la carga del servidor y la
velocidad de comunicacin en una red.
Las palabras clave pueden ser escritas usando maysculas y minsculas.
-Consulta para conocer el nombre del usuario que ha efectuado la conexin:
mysql> SELECT
-> USER( );
+------------------+
| user( )
|
+------------------+
| root@localhost |
+------------------+
1 row in set (0.00 sec)
mysql>
En este ejemplo vemos como cambia el prompt (de mysql> a ->) cuando se escribe una
consulta en varias lneas, as se indica que est esperando a que finalice la consulta. Sin embargo si
queremos no terminar de escribir la consulta, podemos hacerlo al escribir \c como se muestra en el
siguiente ejemplo:
mysql> SELECT
-> USER( ),
-> \c
mysql>
As aparece el prompt mysql> que nos indica que mysql est listo para una nueva consulta.
En la siguiente tabla se muestran cada uno de los prompts que podemos obtener y una breve
descripcin de su significado para mysql:
Prompt
mysql>
->
'>
">

Significado
Listo para una nueva consulta.
Esperando la lnea siguiente de una consulta multi- lnea.
Esperando la siguiente lnea para completar una cadena que comienza con una
comilla sencilla (').
Esperando la siguiente lnea para completar una cadena que comienza con una
comilla doble (").

Los prompts '> y "> ocurren durante la escritura de cadenas.


En mysql podemos escribir cadenas utilizando comillas sencillas o comillas dobles (por
ejemplo, 'hola' y "hola"), y mysql nos permite escribir cadenas que ocupen mltiples lneas. De
manera que cuando veamos el prompt '> o "> , mysql nos indica que hemos empezado a escribir una
cadena, pero no la hemos finalizado con la comilla correspondiente.

11

5.- LENGUAJE DE DEFINICIN DE DATOS.


Los cambios en la estructura de una BD son manejados por un conjunto diferente de
sentencias SQL, denominadas conjuntamente Lenguaje de Definicin de Datos o DDL. Utilizando
sentencias DDL, se pueden realizar las siguientes operaciones entre otras:

Definir y crear una nueva tabla.


Suprimir una tabla que ya no se necesita.
Cambiar la definicin de una tabla existente.
Definir una tabla virtual o vista de datos.
Construir un ndice para hacer ms rpido el acceso a la tabla.
Etc.

5.1. TABLAS.
Reglas para los nombres de tablas:

Comenzar por una letra.


Longitud mxima de 64 caracteres.
No utilizar espacios en blancos ni caracteres de puntuacin especiales NI GUIONES (en
cambio _ si se puede usar).
Que el nombre no est duplicado.
Que no sea una palabra reservada.
No diferencia entre maysculas y minsculas.

CREAR TABLAS
El usuario debe tener este privilegio y un rea de almacenamiento para crear objetos.
Cuando un usuario crea una tabla, se convierte en su propietario. El Administrador de la BD (ADB
o DBA) utiliza comandos del Lenguaje de Control de Datos (DCL) para dar privilegios a los
usuarios.
Para definir una tabla hay que tener unas consideraciones bsicas:
o El nombre de la tabla.
o El nombre de cada columna (no admite guiones).
o El tipo de dato almacenado en cada columna.
o El tamao de cada columna.
o La clave primaria y las claves ajenas.
Formato bsico para la creacin de la estructura de las tablas
CREATE TABLE [IF NOT EXISTS] nombre_tabla
(
nombre_columna tipo_datos
[, nombre_columna tipo_datos , ]
);
El nombre de la tabla debe ser nico en la BD. Los nombres de columnas deben ser nicos
dentro de la tabla.
La clusula IF NOT EXISTS previene el posible error generado si ya existiese una tabla con
ese nombre.
Nota: Los corchetes en estos apuntes indican que lo que est en su interior es opcional, NUNCA se
ponen:
CREATE TABLE ejemplo

12
CREATE TABLE IF NOT EXISTS ejemplo
CREATE TABLE [IF NOT EXISTS] ejemplo
EJERCICIOS:
CREATE DATABASE PRUEBA;
USE PRUEBA;
1.- Crear la tabla PRU con las columnas:
- COD
nmero entero de 4 bytes.
- DATO
cadena de 10 caracteres de longitud fija.
2.- Crear la tabla ALUMNOS con las columnas:
- N_MATRICULA nmero entero de 4 bytes.
- NOMBRE
cadena de 40 caracteres mximo.
- DNI
campo numrico de 8 dgitos.
La sintaxis completa utilizada en MySQL para crear tablas es la siguiente:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] nombre_tabla
(
definicin_columna [, definicin_columna, ]
[, especificaciones_tabla]
);
Definicin_columna:
nombre_columna tipo_datos [NULL | NOT NULL] [DEFAULT default_value]
[AUTO_INCREMENT] [UNIQUE | [PRIMARY] KEY]
[COMMENT 'string'] [CHECK (restriccin) ]
Especificaciones_tabla:
[CONSTRAINT [nombre_restriccin]]
PRIMARY KEY (nombre_columna [, nombre_columna, ])
| KEY [nombre_ndice] [tipo_ndice] (nombre_columna [, nombre_columna, ])
| INDEX [nombre_ndice] [tipo_ndice] (nombre_columna [, nombre_columna, ])
| [CONSTRAINT [nombre_restriccin]] UNIQUE [INDEX]
[nombre_ndice] [tipo_ndice] (nombre_columna [, nombre_columna, ])
| [CONSTRAINT [nombre_restriccin]] FOREIGN KEY
(nombre_columna [, nombre_columna, ]) REFERENCES tb_referenciada
(nombre_columna [, nombre_columna, ])
[ON DELETE accin_realizar]
[ON UPDATE accin_realizar]
| [CHECK (restriccin)]
Accin_realizar:
RESTRICT | CASCADE | SET NULL | SET DEFAULT | NO ACTION
NULL / NOT NULL.- La columna puede ser NULL / no puede ser NULL (campo obligatorio).
DEFAULT.- Permite dar valor por defecto a una columna, puede ser un literal, una expresin o una
funcin SQL como CURRENT_DATE. No puede ser el nombre de otra columna. La expresin por
defecto debe ser del mismo tipo que el de la columna.
AUTO_INCREMENT.- Solo para tipo de datos numricos enteros y tomar valores
automticamente desde el valor 1, incrementndose de 1 en 1.

13
UNIQUE.- Esa columna no puede tomar valores repetidos.
PRIMARY KEY.- Identifica de forma nica a cada fila de la tabla, es decir, indica la clave
principal. Asume que es NOT NULL.
COMMENT.- Podemos poner un comentario.
KEY.- Define una clave.
INDEX.- Define un ndice.
FOREIGN KEY.- Establece una relacin de clave ajena entre dicha columna y la columna de la
tabla referenciada. La clave ajena puede ser una columna o conjunto de columnas. Las claves ajenas
pueden tomar el valor NULL. Siempre hay que poner el nombre del campo de la clave primaria
entre parntesis:
REFERENCES tb_referenciada (nombre_columna [, nombre_columna, ])
La accin a realizar puede ser:
RESTRICT: Impide suprimir una fila de la tabla padre si la fila tiene algn hijo. Esta es la
opcin que se toma por defecto.
CASCADE: Si se borra o actualiza una fila de la tabla padre, automticamente se borrarn o
actualizarn todas las filas de la tabla hija.
SET NULL: Pone a nulos los valores de las claves ajenas de la relacin que
referencia, es decir de la hija.
SET DEFAULT: Pone el valor por defecto a los valores de las claves ajenas de la relacin
que referencia.
NO ACTION.
CHECK.- Comprueba si la columna o columnas especificadas cumplen una determinada
restriccin. La versin actual de MySQL lo acepta dentro del formato (no da error al crear la tabla)
pero no lo tiene implementado, es decir, no funciona.

EJERCICIOS (es ms cmodo trabajar en Word o en el bloc de notas y luego copiar y


pegar sobre la lnea de comandos):
1.- Crear la tabla ALUMNOS1 con las columnas:
- N_MATRICULA campo numrico de 5 dgitos.
- NOMBRE
cadena de 40 caracteres mximo.
- DNI
campo numrico de 8 dgitos nico y obligatorio.
2.- Crear otra tabla ALUMNOS2 igual a la anterior pero con clave primaria el nmero de matrcula
(N_MATRICULA).
3.- Crear otra tabla ALUMNOS3 igual a la anterior pero aadindole un campo para el cdigo
postal (CP) y obligando a que sea de Madrid, es decir que est comprendido entre 28000 y 28999
(veremos que no da error al crearla pero no funciona).
4.- Crear la tabla USUARIOS con:
- N_USUARIO
campo numrico de 4 dgitos y clave primaria.
- NOM_USUARIO cadena de 15 caracteres y obligatorio.
- ID_USUARIO
cadena de 5 caracteres y clave candidata (nico).
- TIPO
que sea A B.
5.- Crear la tabla DOCUMENTO con los siguientes campos:

14
TIPO: A si es un artculo y L si es un libro.
COD_DOC: 4 caracteres.
TITULO: 25 caracteres. Obligatorio.
IDIOMA: 20 caracteres.
NUM_EDI: nmero entero de 4 bytes.
ANNO: tipo YEAR.
ISBN: numrico (10).
Clave primaria: TIPO + COD_DOC
ISBN: es nico para cada fila.
Clave ajena: NUM_EDI de la tabla EDITORIAL (COD-EDI INT(1), NOM-EDI CHAR(9))
6.- Crear la tabla SOCIOS con:
- SOCIO_NO
nmero entero de 4 bytes y clave primaria.
- APELLIDOS
cadena de 14 caracteres mximo y clave candidata.
- TELEFONO
cadena de 9 caracteres y obligatorio.
- FECHA_ALTA
fecha y valor por defecto 2012-01-01.
- DIRECCION
cadena de 20 caracteres mximo.
- CODIGO_POSTAL campo numrico de 5 dgitos.
7.- Crear la tabla PRESTAMOS con:
- NUM_PRESTAMO nmero entero de 2 bytes y clave primaria.
- SOCIO_NO
nmero entero de 4 bytes y clave ajena de la tabla SOCIOS.
8.- Crear la tabla PEDIDOS con las siguientes caractersticas:
Atributos: NUM_PEDIDO, FECHA_PEDIDO, CLIENTE, COD_VEND, FABRICA,
PRODUCTO, IMPORTE. Poner los tipos de datos adecuados para la naturaleza de los atributos.
Clave primaria: NUM_PEDIDO, que se asigne automticamente.
9.- Crear la tabla PEDIDOS1 igual a PEDIDOS pero aadiendo lo siguiente:
Claves ajenas: CLIENTE, COD_VEND y FABRICA + PRODUCTO.
Tablas referenciadas:
CLIENTES ( COD_CLI, ... )
VENDEDORES ( ID_VEND, ... )
PRODUCTOS ( ID_FAB, ID_PROD, ... )
Nota: Para ver la estructura de una tabla creada podemos usar: DESC o DESCRIBE o EXPLAIN:
DESC SOCIOS;
DESCRIBE SOCIOS;
EXPLAIN SOCIOS;
Y si queremos saber las tablas que tenemos definidas:
SHOW TABLES;
Tambin podemos crear una tabla a partir de la definicin de otra (solo la estructura):
CREATE TABLE [IF NOT EXISTS] nombre_tabla_nueva LIKE nombre_tabla_antigua;
Y tambin a partir de los datos de una tabla ya existente (la estructura y el contenido
resultante de la seleccin):
CREATE TABLE [IF NOT EXISTS] nombre_tabla_nueva
[(definicin_columna1, ..., definicin_columnaN) ] [ IGNORE | REPLACE ]

15
[AS] ( SELECT columna1, ..., columnaN
FROM nombre_tabla_antigua [WHERE condicin] );
Los nombres de las columnas de la nueva tabla son opcionales. En caso de que no se
especifiquen tomarn los valores de la otra tabla o de los alias correspondientes. Pero debe tenerse
cuidado con ello pues si hay expresiones o funciones en la lista de la SELECT y no tienen alias ni
nuevo nombre, luego estas columnas no pueden referenciarse.
Las opciones de duplicados en campos nicos (claves primarias o unique) permiten indicar
que hacer si hay un valor repetido en ese campo. Si no se indica nada se producir un error. Para
evitar estos errores podemos especificar una de las dos opciones IGNORE que ignora la fila y no la
graba y REPLACE que reemplaza la fila por la anterior.
La nueva tabla creada no hereda las CONSTRAINTS que tenga asignada la tabla origen, hay
que definirlos posteriormente con ALTER TABLE.
EJEMPLO:
CREATE TABLE MOROSOS AS
( SELECT Nombre, Direccin, Cantidad, Fecha_Vencimiento
FROM CLIENTES WHERE Cantidad > 1000 );
EJERCICIOS:
1.- Crear una tabla llamada SOCIOS_MOD a partir de la tabla SOCIOS.
CREAR LAS TABLAS DE TRABAJO DEL ANEXO FINAL: DEPARTAMENTOS,
EMPLEADOS, CLIENTES, PRODUCTOS Y PEDIDOS (script: DB_Ventas.sql)
USE VENTAS;
2.- Crear una tabla llamada PRU1 a partir de la tabla EMPLEADOS, con las columnas:
EMP_NO y APELLIDO.
3.- Crear una tabla llamada PRU2 a partir de la tabla EMPLEADOS, con todos los
empleados cuyo sueldo es mayor que 2000.

MODIFICAR TABLAS
La modificacin de la definicin de una tabla conllevara alguna de las siguientes
posibilidades:

Aadir o eliminar una columna a una tabla


Aadir o eliminar una restriccin (clave primaria, ajena, unicidad, )
Modificar una columna (sin cambiar su nombre o cambindolo)
Renombrar la tabla

Con la orden ALTER TABLE se permite cambiar la estructura de una tabla ya creada
aadiendo columnas o modificndolas. Para ello tiene dos formas:
ALTER TABLE ..... ADD/DROP y ALTER TABLE ..... MODIFY.
La sintaxis es la siguiente:

16
ALTER TABLE nombre-de-tabla
[ ADD [COLUMN] nombre-de-columna tipo-de-dato [FIRST | AFTER nombre-de-columna ]
[NOT NULL] [DEFAULT expr] , .... ]
[ DROP [COLUMN] nombre-de-columna]
[ ADD PRIMARY KEY (atributo) ]
[ DROP PRIMARY KEY ]
[ ADD CONSTRAINT [nom-restriccin] restriccin ]
[ DROP CONSTRAINT nom-restriccin ]
[ ADD FOREIGN KEY (atributo) REFERENCES nombre-de-tabla (nom_columna) ]
[ DROP FOREIGN KEY nom-constraint ];
ALTER TABLE nombre-de-tabla
[ MODIFY [COLUMN] nombre-de-columna tipo-de-dato [restricciones] , .... ]
ALTER TABLE nombre-de-tabla
[ CHANGE [COLUMN] nombre-columna-antiguo
nombre-columna-nuevo tipo-de- dato [restricciones] , .... ]
ALTER TABLE nombre-de-tabla
[ RENAME [ TO ] nombre-de-tabla-nuevo ]
A la hora de modificar la estructura de una tabla, hay que tener en cuenta las siguientes
consideraciones:
La columna que se aade siempre ser la ltima, a no ser que usemos AFTER para
indicar que va despus de una columna determinada o FIRST para ponerla en primera
posicin.
Los valores de la nueva columna se inicializarn con valores nulos, por esa razn no
podemos indicar NOT NULL al aadirla.
Se puede modificar tipo de dato, tamao y valor por defecto de una columna con la
misma sentencia de ALTER TABLE.
Cuando se disminuye el tamao o se cambia el tipo de datos de una columna de una
tabla sus valores debern estar a nulos.
No existe el comando ALTER VIEW.
EJEMPLOS.
ALTER TABLE PEDIDOS ADD COL1 CHAR (2) ADD COL2 CHAR (2);

ALTER TABLE PEDIDOS ADD ( COL1 CHAR (2), COL2 CHAR (2) );
ALTER TABLE PEDIDOS ADD COL3 CHAR (3) MODIFY COL2 CHAR (4);
ALTER TABLE DOCUMENTO ADD CODIGO NUMERIC (10);
ALTER TABLE DOCUMENTO DROP PRIMARY KEY,
ADD PRIMARY KEY (CODIGO);
Nota: no se puede poner como clave el ISBN porque est definido como UNIQUE, habra que
borrar antes esa restriccin.
EJERCICIOS:
USE PRUEBA;

17
1.- Modificar la tabla PEDIDOS en la siguiente forma
Poner la fecha de pedidos a NOT NULL.
Aadir un nuevo atributo para guardar un telfono de contacto con el cliente.
Aumentar el tamao del campo cdigo de vendedor en 2.
2.- Aadir en la tabla SOCIOS_MOD la restriccin UNIQUE para la columna TELEFONO.
3.- Borrar la columna FECHA_ALTA de la tabla SOCIOS_MOD
4.- Borrar la clave primaria de la tabla SOCIOS_MOD
5.- Modificar la tabla SOCIOS_MOD para poner NOT NULL en la columna APELLIDOS.
6.- Modificar la tabla SOCIOS_MOD cambindole el nombre a la columna APELLIDOS
por APELLIDOS_A e incrementar de 14 a 20 caracteres el tamao.
7.- Cambiar el nombre de la tabla SOCIOS_MOD por SOCIOS_FIN.

BORRAR TABLAS
El comando para borrar una tabla junto con su contenido e ndices y vistas definidos sobre
dicha tabla es:
DROP TABLE [IF EXISTS] nombre-de-la-tabla;
EJERCICIOS:
USE PRUEBA;
1.- Crea una tabla nueva con 2 columnas y a continuacin borrarla.
2.- Borrar una tabla que no exista con IF EXISTS (la anterior) y ver que no da error. Y si
no aadimos IF EXISTS?
3.- Borrar la tabla SOCIOS y analizar lo que ocurre.

TRUNCATE TABLE nombre-de-la-tabla;


Es otra forma de borrar tablas, suprime todas las filas de una tabla y libera el espacio sin que
desaparezca la definicin de la tabla.
Nota: no se puede truncar una tabla cuya clave primaria sea referenciada por la clave ajena
de otra tabla.

RENOMBRAR TABLAS
Permite cambiar el nombre de una tabla.
RENAME TABLE nombre-de-la-tabla-antiguo TO nombre-de-la-tabla-nuevo ;
Tambin se pueden renombrar varias a la vez:

18
RENAME TABLE nombre-de-la-tabla-antiguo TO nombre-de-la-tabla-nuevo;
[, nombre-de-la-tabla-antiguo TO nombre-de-la-tabla-nuevo] ;
EJEMPLO:
RENAME TABLE SOCIOS_FIN TO SOCIOS2;
Tambin:
ALTER TABLE SOCIOS RENAME [TO] SOCIOS2;

5.2. NDICES.
Un ndice es una estructura que proporciona un acceso rpido a las filas de una tabla en
funcin de los valores de una o ms columnas.
El SGBD utiliza el ndice de la misma manera que se usa el ndice de un libro: El ndice
almacena los valores y punteros a las filas en las que los valores se producen. En el ndice los
valores de datos estn ordenados de forma ascendente o descendente para que el SGBD pueda
buscar rpidamente el ndice para encontrar un valor particular; posteriormente puede seguir el
puntero para localizar la fila que tiene el valor.
La presencia o ausencia de ndice es completamente transparente al usuario de SQL que
acceda a una tabla. El funcionamiento de los ndices es el siguiente:
Si el usuario realiza una consulta a la base de datos como:
SELECT campo1, campo2 FROM tabla WHERE campo3 = Condicin de Bsqueda;
Si no existe un ndice asociado a la columna campo3, el SGBD realizar la consulta exista o
no exista informacin en ella. Procesar la consulta recorriendo secuencialmente la tabla fila a fila,
verificando si se cumple Condicin de Bsqueda en campo3. Si la tabla es muy grande la
exploracin puede llevar minutos, incluso horas.
Si existiera un ndice asociado a la columna campo3, el SGBD examina el ndice para
encontrar el valor solicitado (Condicin de Bsqueda) y luego sigue el puntero para encontrar la
fila o filas solicitadas de la tabla. La bsqueda en ndices es mucho ms rpida ya que el ndice est
ordenado y sus filas son muy pequeas. Pasar del ndice a la fila correspondiente es tambin muy
rpido ya que el ndice informa al SGBD el lugar del disco en el que est localizada la fila.
La gran ventaja de la utilizacin de ndices se centra en que se acelera enormemente la
ejecucin de sentencias SQL con condiciones de bsqueda que se refieren a columnas indexadas.
Los inconvenientes se refieren a que consumen un espacio de disco adicional y a que deben
ser actualizados cada vez que se aada a la tabla una fila nueva o se actualice el contenido de una
fila existente.
Para establecer un ndice a una columna deben tenerse en cuenta lo siguiente:
La indexacin es apropiada en columnas que se utilizan frecuentemente en condiciones
de bsqueda.
La indexacin es aconsejable cuando las consultas de una tabla son ms frecuentes que las
inserciones y las actualizaciones.
El SGBD siempre establece un ndice para la clave primaria ya que presupone que el
acceso a la tabla se efectuar ms frecuentemente a travs de dicha clave.
Cuando indexamos una columna, el SGBD crea una estructura de datos para almacenar
datos extra sobre los valores de esa columna indexada. Tenemos 4 tipos de ndices:

19

De clave primaria.
Ordinarios.
nicos.
De texto completo.

De clave primaria (PRIMARY KEY)


Son los ndices relacionados con la clave primaria de la tabla. Identifica unvocamente a
cada fila de la tabla y no puede contener NULL. Se crean automticamente al definir PRIMARY
KEY.
Ordinarios
Son ndices que no son primarios y que permiten valores duplicados. Se crean con el
comando CREATE INDEX.
CREATE INDEX nom-ndice ON nom-tabla ( campo1 [,campo2, ] ..;
nicos
Son bsicamente como los ordinarios pero no se permiten valores duplicados. Sirven para
definir las claves candidatas.
CREATE UNIQUE INDEX nom-ndice ON nom-tabla ( campo1 [,campo2, ] ..;
De texto completo
Su utilizan para buscar palabras clave en grandes cantidades de texto y se definen en campos
de tipo CHAR, VARCHAR o TEXT.
CREATE FULLTEXT INDEX nom-ndice ON nom-tabla ( campo1 [,campo2, ] ..;

CREAR NDICES
El comando utilizado en SQL para crear ndices es el siguiente:
CREATE [UNIQUE | FULLTEXT] INDEX nombre-del-ndice ON nombre-de-tabla
( nombre-de-columna [ORDEN], nombre-de-columna [ORDEN], ... ) [CLUSTER] ;
ORDEN: ASC DESC (ASC por defecto).
CLUSTER: Indica al sistema que las filas de las tablas deben estar almacenadas fsicamente
segn el orden de las columnas que impone el ndice.
Una tabla puede tener varios ndices asociados a ella pero slo uno de ellos podr ser
CLUSTER.
Cada ndice se actualiza de forma automtica con cada modificacin, insercin o borrado de
tuplas en la tabla, por lo que siempre ser consistente respecto a los datos de la misma.
La creacin de ndices permite al SGBDR utilizarlos a la hora de acceder a los datos, aunque
es importante resaltar que el usuario no puede influir en el SGBD para indicarle que utilice un
determinado ndice en una consulta.
EJEMPLO:
CREATE UNIQUE INDEX I_Isbn ON DOCUMENTO (Isbn ASC);
CREATE UNIQUE INDEX I_Tip_Cod ON DOCUMENTO (Tipo DESC, Cod_Doc ASC);

20
EJERCICIOS:
USE PRUEBA;
1.- Crear un ndice en la tabla PEDIDOS para acceder a ella por cliente (en orden
ascendente) y por fecha de pedido (descendente).
2.- Crear un ndice nico en la tabla DOCUMENTO para acceder a ella por ttulo.
CONSULTAR NDICES DEFINIDOS.
SHOW KEYS FROM nombre-de-tabla;
BORRAR UN NDICE.
Cuando un ndice que ya no es necesario se puede eliminar con:
DROP INDEX nombre-de- ndice ON nombre-de-tabla;
EJERCICIO:
1.- Borrar el ndice de la tabla PEDIDOS creado anteriormente.

6. LENGUAJE DE MANIPULACIN DE DATOS.


6.1. INSERT.
El comando INSERT es utilizado en SQL para insertar registros en la Base de Datos. Su
sintaxis tiene el siguiente formato:
INSERT INTO nombre-de-tabla [ ( nombre-de-columna [ , nombre-de-columna ] ... ) ]
VALUES ( literal [, literal ] ... ) ;
bien
INSERT INTO nombre-de-tabla [ ( nombre-de-columna [ , nombre-de-columna ] ... ) ]
subconsulta ;
Insertara en las columnas especificadas de la tabla con nombre nombre-de-tabla los valores
indicados en los literales correspondientes.
Este formato de insercin tiene, adems, las siguientes caractersticas:

En la lista de columnas se pueden indicar todas o algunas de las columnas de la tabla. En


este ltimo caso, aquellas columnas que no se incluyan en la lista quedarn sin ningn valor
en la fila insertada, es decir, se asumir el valor NULL o el valor por defecto para las
columnas que no figuren en la lista. En caso de una columna definida como NOT NULL
dar error si no se introduce un valor.
Los valores incluidos en la lista de valores debern corresponderse posicionalmente con las
columnas indicadas en la lista de columnas, de forma que el primer valor de la lista de
valores se incluir en la columna indicada en primer lugar, el segundo en la segunda
columna, y as sucesivamente.
Se puede utilizar cualquier expresin para indicar un valor siempre que el resultado de la
expresin sea compatible con el tipo de dato de la columna correspondiente.

21
EJEMPLOS:
Insertar el departamento 50 de nombre MARKETING y localidad BILBAO.
INSERT INTO DEPARTAMENTOS (DEP_NO, DNOMBRE, LOCALIDAD)
VALUES (50, 'MARKETING','BILBAO');
Si no se especifican nombres de columnas, los literales se almacenarn en las columnas
correspondientes, segn el orden de las columnas en la instruccin CREATE TABLE.
INSERT INTO DEPARTAMENTOS VALUES (50, 'MARKETING','BILBAO');
Conceptualmente, la sentencia INSERT construye una fila de datos que se corresponde con
la estructura en columnas de la tabla. La nueva fila insertada no tiene por que ser la primera ni la
ltima de la tabla. Es simplemente una fila ms de la tabla que el SGBD situar donde proceda.
Cuando SQL inserta una nueva fila en una tabla, automticamente asigna el valor NULL a
cualquier campo que no haya sido especificado en la lista de columnas de la sentencia INSERT. As
mismo, puede hacerse ms explcita esta asignacin de NULL a un campo incluyendo la columna
correspondiente en la lista y especificando la palabra clave NULL en el valor correspondiente:
INSERT INTO Tabla (Campo1, Campo2, Campo3, ... , CampoN)
VALUES (Valor1, Valor2, NULL, ... , ValorN) ;
La sentencia anterior asigna el valor NULL al Campo3 en la nueva fila insertada
Debe tenerse en consideracin que, si en la definicin de un campo especfico en una tabla
se ha especificado que ste debe tener un valor NOT NULL, debe actualizarse explcitamente en la
sentencia INSERT, ya que, de no hacerlo, el sistema producira un error.
As mismo, pueden utilizarse en la insercin constantes del sistema si el SQL utilizado lo
permite:
INSERT INTO Tabla (Campo1, Campo2, Fecha3, ... , CampoN)
VALUES (Valor1, Valor2, CURRENT_DATE, ... , ValorN) ;
La sentencia anterior introduce el valor de la fecha actual en el Campo Fecha3.
En el caso de la insercin multifila, los valores de datos para las nuevas filas se obtienen de
una consulta SELECT:
INSERT INTO Tabla1 (Campo1, Campo2, Campo3, ... , CampoN)
SELECT Campo1, Campo2, Campo3, ... , CampoN
FROM Tabla2
WHERE Condicin-de-Bsqueda ;
EJEMPLO:
INSERT INTO GERENTES (ID, NOMBRE, SALARIO )
SELECT EMP_NO, APELLIDO, SALARIO
FROM EMPLEADOS
WHERE OFICIO=DIRECTOR ;

22
Insertara en la tabla GERENTES el identificativo, el nombre y el salario de los empleados
que son directores en la tabla empleados.
Nota: La fechas se capturan: 2012/01/15 o 2012/01/15 o 2012-01-15 o 2012-01-15
EJEMPLOS:
(hacerlos en el ordenador porque luego vamos a utilizar la tabla SOCIOS)
INSERT INTO socios (socio_no,apellidos,telefono,fecha_alta,direccion,codigo_postal)
VALUES ( 1000,'LOPEZ SANTOS','916543267', '2005-01-08', 'C. REAL 5',28400);
INSERT INTO socios (socio_no,apellidos,telefono,fecha_alta,direccion,codigo_postal)
VALUES ( 1001,'PEREZ CERRO','918451256', '2005-01-12', 'C. MAYOR 31',28400),
( 1002,'LOPEZ PEREZ','916543267', '2005-01-18', 'C. REAL 5',28400),
( 1003,'ROMA LEIVA', '914747474', '2005-01-21', 'C. PANADEROS 9 ',28431);
INSERT INTO socios
VALUES ( 1004,'GOMEZ DURUELO','918654329', '2005-01-31', 'C. REAL 15',28400);
Insercin de un socio con socio_no=1005, con una instruccin INSERT sin valor en el campo
fecha que tiene un valor por defecto (pondr ese valor 2012-01-01)
INSERT INTO socios (socio_no,apellidos,telefono,direccion,codigo_postal)
VALUES ( 1005,'PEA MAYOR','918515256','C. LARGA 31', 28431);
INSERT INTO prestamos (num_prestamo, socio_no) VALUES ( 1,1000), ( 2,1002);
INSERT INTO prestamos VALUES ( 4,1004);
EJERCICIOS:
USE PRUEBA;
1.- Crear una tabla INVENTARIO con 2 columnas: NUM INT(2) clave primaria y
auto_increment, DESCRIPCION VARCHAR(15).
2.- Insertar 2 filas para ARMARIO BLANCO y MESA MADERA sin enumerar la
columna autonumrica.
3.- Insertar 2 filas para ORDENADOR y SILLA GIRATORIA sin poner el nombre de
las columnas (debemos poner NULL o 0 en el valor auto_increment).

6.2. UPDATE.
El comando UPDATE se utiliza en SQL para modificar datos de la Base de Datos. Su
sintaxis tiene el siguiente formato:
UPDATE nombre-de-tabla
SET nombre-de-columna = expresin
[, nombre-de-columna = expresin] ...
[ WHERE condicin ] ;

23
Las columnas especificadas en la clusula SET de las filas de la tabla nombre-de-tabla que
cumplan la condicin, se modifican con los valores indicados en la expresin.
El comando UPDATE permite modificar varios registros a la vez en una sola operacin.
Si se omite WHERE se modifican todos los registros de la tabla.
El comando UPDATE se puede usar con subconsultas multicolumna.
UPDATE nombre_tabla
SET (nombre_columna, nombre_columna, ...) =
( SELECT nombre_columna, nombre_columna, ....
FROM nombre_tabla
[WHERE condicin] )
[ WHERE condicin ];
NOTA IMPORTANTE: La subconsultas no puede afectar a la misma tabla que la UPDATE.
EJERCICIOS:
USE PRUEBA;
Partimos de la tabla socios: SELECT * FROM socios;
1.- Cambiar la direccin del socio de nmero 1000 a 'C.CUESTA 2'.
2.- Cambiar el telfono del socio de nmero 1000 a 918455431.
3.- Cambiar todos los cdigos postales 28400 a 28401.
4.- Modificar la fecha de alta de todos los empleados al valor 1 de enero de 2005.
Podemos comprobar las modificaciones: SELECT * FROM socios;
USE VENTAS;
5.- Modificar el oficio del empleado 7698 con el valor correspondiente al empleado 7499
(NO FUNCIONA).

6.3. DELETE.
El comando DELETE se utiliza en SQL para eliminar registros de la Base de Datos. Su
sintaxis tiene el siguiente formato:
DELETE FROM nombre-de-tabla
[ WHERE condicin ];
Borrara las filas de la tabla nombre-de-tabla que cumplan la condicin.
Tambin se pueden usar las subconsultas en la condicin del WHERE.
EJERCICIOS:
USE PRUEBA;

24
1.- Borrar el socio 1001.
Nota: Hay que tener cuidado con las claves ajenas. Como prestamos tiene una clave ajena que
referencia a socios si pretendemos borrar un socio que tiene prstamos nos dar error.
2.- Borrar el socio 1002, es posible?.
USE VENTAS;
3.- Borrar en departamentos todas las filas cuyo nombre sea INVESTIGACION.
4.- Aadir un nuevo departamento (50, RRHH, MADRID) y luego borrarlo.
Ejemplo de borrado en cascada
Creamos las tablas departamentos2 y empleados2 con una clave ajena con borrado en
cascada e insertamos los valores desde las tablas departamentos y empleados
CREATE TABLE departamentos2
(
dep_no INT(4),
dnombre VARCHAR(14),
localidad VARCHAR(10),
CONSTRAINT PK2_DEP PRIMARY KEY (DEP_NO)
);
INSERT INTO departamentos2
SELECT dep_no, dnombre, localidad FROM departamentos;
CREATE TABLE empleados2
(
emp_no INT(4),
apellido VARCHAR(8),
oficio VARCHAR(15),
director INT(4),
fecha_alta DATE,
dep_no INT(2),
CONSTRAINT PK_EMPLEADOS_EMP_NO2 PRIMARY KEY (emp_no),
CONSTRAINT FK_EMP_DEP_NO2 FOREIGN KEY (dep_no)
REFERENCES departamentos2(dep_no) ON DELETE CASCADE
);
INSERT INTO empleados2
SELECT emp_no, apellido, oficio, director, fecha_alta, dep_no FROM empleados;
SELECT * FROM departamentos2;
SELECT * FROM empleados2;
Vamos a borrar una fila en la tabla departamentos. Si no existiese borrado en cascada,
debido a la integridad referencial, no podramos borrar ningn departamento que tuviese empleados.
De esta forma al borrar un departamento se borrarn todos los empleados de ese departamento.
DELETE FROM departamentos2 WHERE dep_no=10;
SELECT * FROM departamentos2;
SELECT * FROM empleados2;

25

6.4. SELECT.
El comando SELECT es utilizado en SQL para realizar consultas en una Base de Datos. Su
sintaxis bsica es la siguiente:
SELECT { * | [DISTINCT | ALL] | columna [ , columna, ] } FROM nombre-de-tabla ;
Nota: Las llaves en estos apuntes indican que alguna de las opciones separadas por | es obligatorio
ponerla, pero las llaves (ni los corchetes) NUNCA se ponen.
Es necesario tener presente que:
1.- SQL recupera filas repetidas [ALL] a no ser que se especifique explcitamente con la
opcin DISTINCT.
2.- Si queremos todos los elementos/columnas de una tabla, utilizamos *
EJERCICIOS:
USE VENTAS;
1.- Seleccionar todos los datos de la tabla empleados.
2.- Obtener los nmeros de empleados, los apellidos y el nmero de departamento de todos
los empleados de la tabla empleados.
3.- Obtener los departamentos diferentes que hay en la tabla empleados.
4.- Obtener los diferentes oficios que hay en cada departamento de la tabla empleados.
La sintaxis completa tiene el siguiente aspecto:
SELECT { * | [DISTINCT | ALL] columna [ , columna, ] } [ [AS] aliascolumnas ]
FROM nombre_de_tabla(s) [ [AS] aliastabla(s) ]
[ WHERE condicin ]
[ GROUP BY { campo(s) | funciones de columna | posicin } ]
[ HAVING condicin ]
[ ORDER BY {columna | posicin [ ASC | DESC ] }
[ , {columna | posicin [ ASC | DESC ] }] ]
[ LIMIT [ m, ] n ] ;

Podemos cambiar el nombre de las columnas utilizando los alias:


SELECT nom-col AS nombre FROM tabla;
SELECT nom-col nombre FROM tabla;
SELECT nom-col nombre FROM tabla;
EJEMPLOS:
SELECT EMP_NO AS Num_empleado FROM EMPLEADOS;
SELECT EMP_NO Num-empleado FROM EMPLEADOS;

26
SELECT EMP_NO Num-empleados, APELLIDO Nombre FROM EMPLEADOS;
SELECT EMP_NO Num_empleado, APELLIDO Nombre FROM EMPLEADOS;
3.- Podemos realizar la consulta de valores calculados:
SELECT apellido, Salario en pesetas =, salario * 166.386 FROM EMPLEADOS ;
Podemos usar la tabla DUAL que est disponible para todos los usuarios de la BD. Tiene
una fila y una columna y se usa para seleccionar variables del sistema, para evaluar expresiones o
probar funciones:
Nota: Para obtener la fecha del sistema tenemos:
CURRENT_DATE / CURDATE( )
Para obtener la fecha y la hora:
CURRENT_TIMESTAMP / NOW( )
SELECT CURRENT_DATE [ FROM DUAL ] ;
SELECT USER( ) [ FROM DUAL ] ;
SELECT 5 + 3 [ FROM DUAL ] ;
4.- En la condicin de una clusula WHERE se pueden utilizar los siguientes operadores:
4.1.- EXPRESIONES ARITMTICAS:
Ejemplo:

DIV (divisin entera) MOD (resto)

SELECT 25 / 2, 25 DIV 2, 25 MOD 2 ; /* FROM DUAL */

EJERCICIOS:
1.- Seleccionar los empleados cuyo salario sea mayor que el triple de su comisin.
2.- Seleccionar los clientes de Madrid y su lmite de crdito en unidades de 1000.
4.2.- Comparacin: <

<=

>

>=

y para distinto: <>

!=

EJERCICIOS:
1.- Seleccionar los empleados que son analistas.
2.- Obtener los clientes que no son de Sevilla.
3.- Obtener los oficios de los empleados que cobran ms de 2000.
4.3.- Booleanos: AND (&&), OR (||), NOT (!) y XOR (devuelve verdadero si uno de los
operadores es verdadero y el otro falso, devuelve falso si ambos son verdaderos o ambos falsos).
EJERCICIOS:
1.- Seleccionar los empleados existentes en los departamentos 10 y 30.
2.- Obtener los apellidos de los empleados vendedores con comisin mayor de 300.
3.- Obtener los empleados que no son vendedores o que ganan ms de 2000.

27
4.- Obtener los empleados que no son vendedores sin usar el distinto (!= ni <>).
5.- Obtener los empleados que no son vendedores o no ganan ms de 1500.
4.4.- BETWEEN AND

NOT BETWEEN AND

EJERCICIOS:
1.- Obtener los empleados que cobran entre 2000 y 3500 (inclusive).
2.- Obtener los productos cuyo precio no est comprendido entre 300 y 500.
4.5.- IN ( , , , )

NOT IN ( , , , )

EJERCICIOS:
1.- Obtener los departamentos de Madrid y Valencia.
2.- Obtener los empleados cuyo departamento est en Madrid o Valencia.
3.- Obtener los pedidos cuyos productos tengan un precio mayor de 500.
4.6.- LIKE

NOT LIKE

Especifica una comparacin con algn literal del que no conocemos la informacin
completa, para ello usamos comodines que se ponen en el literal a la derecha del LIKE. Estos
comodines se interpretan de la siguiente manera:

El carcter _ (subrayado) representa cualquier carcter individual en la posicin en la


que se encuentra.
El carcter % (tanto por ciento) representa cualquier secuencia de n caracteres (donde
n puede ser 0).
Todos los dems caracteres se representan a s mismos, es decir no hay ms comodines.

EJERCICIOS:
1.- Obtener los departamentos cuya localidad no contenga la letra e.
2.- Obtener los departamentos cuya localidad tenga una a en la segunda posicin.
3.- Seleccionar aquellos empleados cuyo apellido empiece por 'M' y tengan un salario entre
1000 y 2000 euros.
4.- Seleccionar aquellos empleados cuyo apellido termine en z.
Precedencia o prioridad en los operadores
Hay que tener en cuenta la prioridad de los operadores ya que puede afectar al resultado de
una operacin. Nos indica que operacin se realizar primero en una expresin cuando hay varios
operadores.
La evaluacin de las operaciones en las expresiones se realiza de izquierda a derecha, pero
respetando las reglas de prioridad. Por ejemplo: 8 + 4 * 5 = 28. Aunque la suma est antes (ms a

28
la izquierda) que la multiplicacin, primero se realiza la multiplicacin y luego la suma. Esto es
debido a que el operador * tiene mayor prioridad que el operador +.
El orden de precedencia o prioridad de los operadores determina, por tanto, el orden de
evaluacin de las operaciones de una expresin. La tabla siguiente muestra los operadores
disponibles agrupados y ordenados de mayor a menor por su orden de precedencia.
Prioridad
1
2
3
4
5
6

Operador
*, /, DIV
+, = , != , < , > , <= , >= ,
IS, LIKE , BETWEEN, IN
NOT
AND
OR, XOR

4.7.- ALL /

Operacin
Multiplicacin, divisin
Suma, resta
Comparacin
Negacin
Conjuncin
Inclusin, exclusin

ANY SOME

Se aplican a la hora de comparar una columna o literal con una lista de valores, la cul
puede ser un conjunto de valores encerrados entre parntesis o bien el resultado de una consulta a la
base de datos. El resultado de comparar con ALL es cierto si la comparacin se cumple para cada
uno de los valores de la lista, mientras que el resultado de comparar con ANY o SOME se cumple si
la comparacin es cierta para algn elemento de la lista. Siempre se pueden sustituir utilizando la
funcin MIN o MAX respectivamente, como puede verse en los siguientes ejemplos:
ALL

MIN

ANY SOME

MAX

Ej.: Seleccionar los nombres de los clientes con lmite de crdito menor o igual al lmite de
crdito de los clientes de Madrid.
SELECT nombre FROM clientes WHERE lim_credito <= ALL
(SELECT lim_credito FROM clientes WHERE localidad = MADRID);
Igual que:
SELECT nombre FROM clientes WHERE lim_credito <=
( SELECT MIN(lim_credito) FROM clientes WHERE localidad = MADRID);
Los cuantificadores ANY y SOME se utilizan indistintamente
Ej.: La consulta siguiente selecciona los nombres de los clientes con lmite de crdito menor
o igual al lmite de crdito de alguno de los clientes de Madrid.
SELECT nombre FROM clientes WHERE lim_credito <= ANY
(SELECT lim_credito FROM clientes WHERE localidad = MADRID);
Igual que:
SELECT nombre FROM clientes WHERE lim_credito <=
( SELECT MAX(lim_credito) FROM clientes WHERE localidad = MADRID);
4.8.- IS NULL

IS NOT NULL

Sirve para recuperar filas con valores desconocidos en una determinada columna. Si
realizamos operaciones aritmticas sobre valores y hay alguno con valor NULL, el resultado ser
NULL.

29
La sintaxis columna = NULL no est permitida, porque nada, ni siquiera un nulo, se
considera igual a nulo.
EJERCICIOS:
1.- Obtener los empleados cuya comisin sea nula.
2.- Obtener los apellidos, el salario, la comisin y el salario + la comisin de los empleados.
Como acabamos de ver, los valores nulos en muchas ocasiones pueden representar un
problema, especialmente en columnas que contienen valores numricos.
Para evitar estos problemas y asegurarnos de la ausencia de valores nulos en una columna ya
vimos que existe una restriccin NOT NULL (es una orden de definicin de datos) que impide que
se incluyan valores nulos en una columna.
En caso de que permitamos la existencia de valores nulos hay que evitar estos problemas y
utilizar la funcin IFNULL, que se utiliza para devolver un valor determinado en el caso de que el
valor del argumento sea nulo. As nos aseguramos en las operaciones aritmticas que no hay nulos
con los que operar.
Por ejemplo, IFNULL (comision,0) retornar 0 cuando el valor de la comisin sea nulo.
SELECT apellido, salario, comision, salario + IFNULL(comision, 0) FROM empleados;
4.9.- EXISTS

NOT EXISTS

La expresin WHERE EXISTS ( SELECT ... FROM ... ) resulta verdadera si y solo si el
resultado de evaluar la subconsulta a la derecha del cuantificador EXISTS no es el conjunto vaco,
es decir, si existe un registro que satisfaga la condicin. Se utiliza en aquellas consultas tipo para
todos.
EJERCICIOS:
1.- Hacer una lista de los clientes para los que hay un departamento en su misma localidad.
2.- Obtener los nombres y los cdigos de los clientes que han hecho pedidos.
3.- Obtener los nombres de los clientes que han pedido el producto 20.
4.- Obtener los nombres de los clientes que no han hecho pedidos.

5.- En la sintaxis de la SELECT vimos que se puede consultar sobre una columna o conjunto
de columnas de una o ms tablas. Si intervienen ms de una tabla, para recuperar todas las
columnas de una de las tablas se indica con nombre_de_tabla.*
EJERCICIO:
1.- Seleccionar todos los datos de EMPLEADOS y DEPARTAMENTOS donde el
DEPARTAMENTO sea el mismo (EQUIJOIN).

30
SELECCIN CON ORDENACIN
6.- [ ORDER BY {columna | posicin [ ASC | DESC ] } ]
Si no se especifica la clusula ORDER BY, SQL no garantiza ningn orden en la tabla
resultado. Sin embargo con ORDER BY podemos ordenar por uno o varios campos separados por
comas. En columna o posicin se puede indicar un nombre de columna o posicin seguido por el
tipo de ordenamiento ASC o DESC. (Por defecto asume ASC). Posicin corresponde al nmero de
orden que ocupa en la lista de expresiones visualizadas en la SELECT.
Se puede ordenar el resultado de una SELECT por ms de una columna, incluso ordenar por
algn campo que no se haya seleccionado.
EJERCICIOS:
1.- Obtener la relacin alfabtica de todos los empleados con todos sus datos.
2.- Obtener la clasificacin alfabtica de empleados por departamentos.
3.- Obtener los datos de los empleados clasificados por oficios y en orden descendente de
salarios.
4.- Obtener los apellidos de los empleados junto con su salario anual (salario + comision en
14 pagas) ordenado de mayor a menor por este salario total.
Podemos especificar un lmite en el nmero de filas de salida:
SELECT * ------------- [ LIMIT [m,] n ];
Donde m es el nmero de fila por el que comienza la visualizacin (por defecto es 0, 1 fila)
y n cuantas filas va a mostrar.
EJERCICIOS:
1.- Obtener los datos de los 5 empleados con mayores salarios.
2.- Obtener la clasificacin alfabtica de empleados segn su apellido y mostrar desde el 5
hasta el 7 de la lista.
Nota: Si observamos la salida producida al ordenar por apellido comprobamos que se han
visualizado 3 filas desde la 5 (Fila 4 empezando por 0)
SELECT emp_no, apellido, salario, dep_no FROM empleados ORDER BY apellido ;
7.- SQL ofrece una serie de funciones de agregados especiales para ampliar su capacidad
bsica de recuperacin de informacin. Estas funciones operan sobre conjuntos de filas para dar un
resultado por cada uno de ellos. Los grupos pueden ser una tabla entera o parte de la misma. Estas
funciones pueden aparecer en SELECT y HAVING. Se pueden dividir en dos categoras:
Funciones de columna, en las que se opera sobre un grupo de filas para obtener como
resultado un nico valor.
Funciones escalares, que operan sobre una nica fila. Se pueden dividir en funciones
numricas, de tratamiento de caracteres, de tratamiento de datos de tipo fecha y hora, etc.

31
7.1.- FUNCIONES DE COLUMNA:
AVG(expr)
COUNT( { * | expr } )
MAX(expr)
MIN(expr)
STDDEV(expr)
SUM(expr)
VARIANCE(expr)

Valor medio de expr ignorando los valores nulos


Nmero de veces que expr tiene un valor no nulo. La opcin *
cuenta el nmero de filas seleccionadas
Valor mximo de expr
Valor mnimo de expr
Desviacin tpica de expr sin tener en cuenta los valores nulos
Suma de expr
Varianza de expr sin tener en cuenta los valores nulos.

Con COUNT se devuelve el nmero total de filas, sean o no distintas y contengan o no


nulos. Si slo queremos los valores distintos es necesario especificar DISTINCT. En las dems
funciones los valores nulos se eliminan antes de aplicarse la funcin.
Por ejemplo, COUNT(DISTICT(Nombre_Columna)) cuenta cuantos valores diferentes hay
en esa columna.
Por lo general, las funciones de grupos se utilizan sobre ms de un grupo de filas. La
clusula GROUP BY establece el criterio o columnas de agrupacin y se calcular el valor de la
funcin para cada grupo. Pero tambin pueden utilizarse sin la clusula GROUP BY y en ese caso
estas funciones actan sobre un nico grupo formado por todas las filas seleccionadas.
EJERCICIOS:
1.- Obtener la masa salarial mensual de todos los empleados.
2.- Obtener los salarios mximo, mnimo y la diferencia existente entre ambos.
3.- Obtener la fecha de alta ms reciente.
4.- Calcular el salario medio de los empleados.
A veces hacer la media con la funcin AVG no da el mismo resultado que hacer la suma y
dividirla por el nmero de filas, SUM/COUNT. COUNT(*) cuenta todas las filas de la tabla, sin
considerar que en algunas columnas existan valores NULL. Sin embargo la funcin AVG si tiene en
cuenta las filas con valores NULL y no las considera.
Veamos un ejemplo:
SELECT AVG(comision) FROM empleados;
SELECT SUM(comision)/COUNT(comision) FROM empleados;
SELECT SUM(comision)/COUNT(*) FROM empleados;
5.- Calcular el salario medio de los empleados que sean ANALISTAS.
6.- Calcular el salario medio de los empleados del departamento 10 (EMPLEADOS)
7.- Calcular el del nmero de filas de la tabla EMPLEADOS
8.- Calcular del nmero de filas de la tabla EMPLEADOS sin comisin.
Y si quiero saber cuantos hay con comisin?

32
9.- Calcular la varianza y la desviacin tpica de salario de la tabla EMPLEADOS.
10.- Obtener la media, el salario mximo, el mnimo y la suma de los salarios de los
empleados que son vendedores.
7.2.- FUNCIONES ESCALARES:
7.2.1.- Funciones numricas o aritmticas:
ABS(num)
CEIL( num)
FLOOR(num)
EXP(num)
LN(num)
LOG(num)
MOD(num1, num2).
PI( )
POWER(num1, num2).
RAND( )
ROUND(num1, num2)

SIGN(num).

SQRT(num).
TRUNCATE(num1, num2).

Valor absoluto.
Valor absoluto de num.
Funcin Techo
Devuelve el entero mas pequeo mayor que num
Funcin Suelo
Devuelve el entero mas grande menor que num
Potencia del nmero e
Devuelve el nmero e elevado a num
Logaritmo neperiano
Devuelve el logaritmo en base e de num
Logaritmo
Devuelve el logaritmo en base 10 de num
Mdulo
Resto de la divisin entera de num1 por num2
Pi
Devuelve el valor de la constante PI
Potencia
Devuelve num1 elevado a num2.
Nmero aleatorio
Genera un nmero aleatorio entre 0 y 1
Redondeo
Devuelve num1 redondeado a num2 decimales.
Si se omite num2 redondea a 0 decimales.
Signo
Si num < 0 devuelve -1,
Si num = 0 devuelve 0
Si num > 0 devuelve 1.
Raz cuadrada
Devuelve la raz cuadrada de num
Truncado
Devuelve num1 truncado a num2 decimales.
Si se omite num2 trunca a 0 decimales.

EJERCICIOS:
1.- Obtener el apellido, el salario y el valor absoluto del salario 10000, para todos los
empleados.
2.- Hacer algunas pruebas con nmeros positivos y negativos
3.- Visualizar los salarios de los empleados redondeados sin decimales
4.- Mostrar los datos de los empleados en los que su comisin es mltiplo de 100 y no sea
cero.

33
7.2.2.- Funciones de caracteres:
ASCII
Cdigo ASCII del carcter cad1.
Carcter ASCII
CHAR(num)
Devuelve el carcter cuyo cdigo ASCII es num
CONCAT(cad1,cad2[,cad3]) Concatenar
Concatena cad1 con cad2.
Si hay ms, cad3, las concatena a continuacin
Insertar
INSERT(cad1, pos,len,cad2)
Devuelve cad1 con len caracteres desde pos en adelante
sustituidos en cad2
Longitud
LENGTH(cad1)
Devuelve la longitud de cad1
Localizar
LOCATE(cad1,cad2,pos)
Devuelve la posicin de la primera ocurrencia de cad1
en cad2 empezando desde pos
Minsculas
LOWER(cad1)
La cadena cad1 en minsculas
Rellenar (Izquierda)
LPAD(cad1,n,cad2)
Aade a cad1 por la izquierda cad2, hasta que tenga n
caracteres.
Si se omite cad2, aade blancos.
Suprimir (Izquierda)
LTRIM(cad1)
Suprime blancos a la izquierda de cad1
Reemplazar
REPLACE(cad1,cad2,cad3)
Devuelve cad1 con todas las ocurrencias de cad2
reemplazadas por cad3
Rellenar (Derecha)
RPAD(cad1,n,cad2)
Igual que LPAD pero por la derecha
Suprimir (Derecha)
RTRIM(c1)
Suprime blancos a la derecha de c1.
Igual que LTRIM pero por la izquierda
Subcadena
SUBSTR(c1,n,m)
Devuelve una subcadena a partir de c1 comenzando en
la posicin n tomando m caracteres
Maysculas
UPPER(cad1)
La cadena cad1 en maysculas
ASCII(cad1)

En ORACLE: OPERACIN DE CONCATENACIN ( || )

Conector de Springs

EJERCICIOS:
1.- Obtener la longitud de APELLIDO en EMPLEADOS.
2.- Obtener el valor ASCII de las letras A y a.
3.- Visualizar los tres primeros caracteres de los apellidos de los empleados seguidos de un
punto.
4.- Visualizar los nombres de los departamentos cuyo nombre tenga de ms de 6 caracteres
reemplazando las letras A por *

34
7.2.3.- Funciones de fecha y hora:
ADDDATE(Fecha, Num)
SUBDATE(Fecha, Num)
DATE_ADD
(Fecha, INTERVAL N Formato)

DATE_SUB
(Fecha, INTERVAL N Formato)

DATEDIFF(Fecha1,Fecha2)

DAYNAME(Fecha)
DAYOFMONTH(Fecha)
DAYOFWEEK(Fecha)

DAYOFYEAR(Fecha)
WEEKOFYEAR(Fecha)
MONTH(Fecha)
YEAR(Fecha)

HOUR(Tiempo)
MINUTE(Tiempo)
SECOND(Tiempo)
CURDATE( )
CURTIME( )
SYSDATE( )

Incremento de das
Devuelve Fecha incrementada en Num das
Decremento de das
Devuelve Fecha decrementada en Num das
Incremento
Devuelve Fecha incrementada en N veces lo
indicado en Formato
Formato puede ser entre otros: DAY, WEEK,
MONTH, YEAR, HOUR, MINUTE, SECOND
Decremento
Devuelve Fecha decrementada en N veces lo
indicado en Formato
Formato puede ser entre otros: DAY, WEEK,
MONTH, YEAR, HOUR, MINUTE, SECOND
Diferencia de fechas
Devuelve el nmero de das entre Fecha1 y
Fecha2
Nombre del da de la semana
Devuelve el nombre del da de la semana de Fecha
Da del mes
Devuelve el nmero del da del mes de Fecha
Da de la semana
Devuelve el nmero del da de la semana de Fecha
(1-Domingo, 2-Lunes.....7-Sbado)
Da del ao
Devuelve el nmero de da del ao (de 1 a 366)
Semana
Devuelve el nmero de semana (de 1 a 53)
Mes
Devuelve el nmero de mes de Fecha (de 1 a 12)
Ao
Devuelve el nmero de ao con 4 dgitos de Fecha
(de 0000 a 9999)
Hora
Devuelve la hora de Tiempo (de 0 a 23)
Minutos
Devuelve los minutos de Tiempo (de 0 a 59)
Segundos
Devuelve los segundos de Tiempo (de 0 a 59)
Devuelve la fecha actual con el formato
YYYY-MM-DD
Devuelve la hora actual con el formato HH:MM:SS
Devuelve la fecha y la hora actual con el formato
YYYY-MM-DD HH:MM:SS

Para la conversin de fechas a otro tipo de datos:


DATE_FORMAT
(Fecha,Formato)

Devuelve una cadena de caracteres con la fecha con el formato


especificado.
Formato es una cadena de caracteres (ir entre comillas) con las
siguientes mscaras:

35
%a
%b
%c
%e
%H
%h
%i
%j
%M
%m
%p
%r
%s
%T
%u
%W
%w
%Y
%y

Abreviatura (3 letras) del nombre del da de la semana


Abreviatura (3 letra ) del nombre mes
Nmero del mes (1 a 12)
Nmero del da del mes (0 a 31)
Nmero de la hora en formato 24 horas (00 a 23)
Nmero de la hora en formato 12 horas (01 a 12)
Nmero de minutos (00 a 59)
Nmero del da del ao (001 a 366)
Nombre del mes
Nmero de mes (01 a 12)
Am o PM
Hora en formato 12 horas (hh:mm seguido de AM o PM)
Nmero de segundos (00 a 59)
Hora en formato 24 horas (hh:mm:ss)
Nmero de semana en el ao (00 a 53)
Nombre del da de la semana
Nmero del da de la semana (0:domingo a 6:Sbado)
Nmero de ao con cuatro dgitos
Nmero de ao con dos dgitos

Nota: estas funciones de fechas varan bastante de un sistema gestor a otro.


EJERCICIOS:
1.- Obtener la fecha y la hora del sistema.
2.- Visualiza la suma de 12 meses a la fecha_alta de los empleados del departamento 10.
3.- Obtener el ltimo da del mes de cada una de las fechas de alta de los empleados del
departamento 30 (usar LAST_DAY(fecha) ).
4.- Obtener los das transcurridos desde vuestra fecha de nacimiento.
Y si quiero saber cuantos aos son?
5.- Si hoy es jueves XXXX/XX/XX (fecha del sistema) Qu fecha ser el prximo jueves?
6.- Visualizar la fecha que ser dentro de dos semanas.
7.- Visualizar el nombre y la fecha de alta de los empleados con el formato <da de la
semana> - <dia> de <mes> de <ao>.
8.- Mostrar los datos de los empleados que entraron en la empresa en martes.
9.- Mostrar para cada empleado su apellido junto con el nmero de trienos que tiene (se
tiene un trienio por cada tres aos en la empresa).
10.- Mostrar los empleados que llevan ms de 30 aos en la empresa.
11.- Visualizar la fecha de 4/10/1997 con el formato <da de la semana>, <nmero de da>
de <nombre del mes> de <ao>.

36
7.2.4.- Funciones de comparacin:
GREATEST(lista de valores)

LEAST(lista de valores)

IFNULL(exp1, exp2)
ISNULL(exp)

STRCMP(cad1,cad2)

Mayor de la lista
Devuelve el valor ms grande de una lista de columnas
o expresiones de columna
Menor de la lista
Devuelve el valor ms pequeo de una lista de columnas
o expresiones de columna
Conversin de nulos
Si exp1 es nulo devuelve exp2, sino devuelve exp1
Comprobacin de nulo
Devuelve 1(True) si exp es NULL y 0 (False) en caso
contrario
Comparacin de cadenas
Devuelve 1(True) si cad1 y cad2 son iguales, 0(False)
si no lo son y NULL si alguna de ellas es nula

EJERCICIOS:
1.- Obtener el ltimo nombre (orden alfabtico) de una lista de nombres.
Y si quiero el ltimo nombre de los empleados?
2.- Visualizar para cada empleado el valor que sea mayor entre su salario y su comisin.
3.- Mostar los empleados en los que la suma de su salario ms su comisin es menor de
2.000 euros.
7.2.5.- Otras funciones:
DATABASE( )
USER( )
VERSION( )

Base de datos
Nombre de la base de datos actual
Usuario
Devuelve el usuario y el host de la sesin: usuario@host
Versin
Devuelve una cadena indicando la versin que estamos utilizando

EJERCICIOS:
1.- Obtener la base de datos, el usuario y la versin en uso.
SELECCIN CON AGRUPAMIENTOS
8.- Mediante la clusula GROUP BY podemos agrupar los datos de una tabla o conjunto de
tablas formando grupos. Se pueden usar las funciones de grupo para devolver informacin para
cada grupo.
Sirve para calcular propiedades de uno o ms conjuntos de filas (un grupo).
Podemos utilizar la posicin que ocupa la expresin por la que queremos agrupar en la lista
de expresiones visualizadas.

El funcionamiento de la sentencia SELECT con clusulas de agrupamiento es el siguiente:


primero realiza una seleccin de filas segn la clusula WHERE
forma grupos segn la clusula GROUP BY
hace una seleccin de grupos segn la clusula HAVING.

37
Es importante tener en cuenta que, en caso de seleccin con clusula de agrupacin, solo
tiene sentido mostrar expresiones que contengan columnas de agrupacin y/o funciones de
grupo. As mimo, si se utilizan funciones de agrupacin sin la clusula GROUP BY no pueden
mostrarse el resto de las filas de la tabla.
La clusula HAVING acta como un filtro sobre el resultado de agrupar las filas en
grupos, a diferencia de la clusula WHERE que acta sobre las filas antes de la agrupacin.
Todas las columnas de la SELECT que no son funciones de grupo deben aparecer en
GROUP BY.
Con WHERE se pueden excluir filas antes de agrupar.
Se pueden realizar GROUP BY sobre mltiples columnas, es decir, se pueden devolver
resultados resumen para grupos y subgrupos indicando ms de una columna en GROUP BY
(separndolas por comas).
EJERCICIOS:
1.- Obtener los salarios medios por departamento.
2.- Obtener cuntos empleados hay en cada oficio.
3.- Agrupar las filas por departamento, y luego, dentro de los departamentos, agrupar por
oficio, indicando la suma de los salarios.
Probar que pasa si cambiamos el orden dentro del GROUP BY.
9.- La clusula HAVING es a los grupos lo que WHERE es a las filas, es decir sirve para
eliminar grupos de la misma manera que WHERE sirve para eliminar filas.
El proceso sera agrupar registros, aplicar alguna funcin de grupo en ellos y por ltimo
visualizar los que cumplan la condicin de grupo de la clusula HAVING.
EJERCICIOS:
1.- El ejemplo anterior para aquellos que la suma de los salarios sea > 2000.
2.- Seleccionar los oficios que tengan dos o ms empleados:
3.- Seleccionar los oficios que tengan dos o ms empleados, cuyo salario supere los 1400.
Ejemplo: de una SELECT con todo completo.
SELECT OFICIO, SUM(SALARIO) FROM EMPLEADOS
WHERE OFICIO <> VENDEDOR
GROUP BY OFICIO
HAVING SUM(SALARIO) > 5000
ORDER BY SUM(SALARIO)
LIMIT 2;
Too:
SELECT OFICIO, SUM(SALARIO) FROM EMPLEADOS
GROUP BY OFICIO
HAVING SUM(SALARIO) > 5000 AND OFICIO <> VENDEDOR
ORDER BY SUM(SALARIO)

38
LIMIT 2;
EJERCICIOS:
1.- Seleccionar el n de departamento con menor salario medio.
2.- Seleccionar el n de departamento con mayor nmero de empleados.
CONSULTAS MULTITABLAS
10.- Mediante el operador UNION podemos unir dos o ms tablas.
Ej.: Obtener las localidades de los departamentos o de los clientes con lmite de crdito
mayor que 6.000 o ambas.
SELECT LOCALIDAD FROM DEPARTAMENTOS
UNION
SELECT LOCALIDAD FROM CLIENTES WHERE LIM_CREDITO > 6000 ;
11.- Mediante la clusula SELECT se pueden reunir cualquier nmero de tablas. Cuando se
necesitan datos de ms de una tabla, se utiliza una condicin JOIN. Esta combinacin normalmente
se hace a travs de los atributos comunes, es decir, de las claves ajenas.
La sintaxis es la siguiente:
SELECT [ALL/DISTINCT] ExpresionColumna [,ExpresionColumna .....]
FROM NombreTabla [AliasTabla] [ , NombreTabla [AliasTabla].....]
[WHERE Condicion_Composicion ]
donde:
Condicion_Composicion es una condicin que selecciona las filas de la composicin de las tablas.
La forma ms habitual suele ser:
SELECT TABLA1.COLUMN1, TABLA2.COLUMN2, ...
FROM TABLA1, TABLA2
WHERE TABLA1.COLUMN1 = TABLA2.COLUMN2 ;
Si hay columnas con el mismo nombre en las distintas tablas de la FROM, para poder
diferenciarlas deben identificarse con Nombre_tabla.Nombre_columna.
Para evitar que los nombres de los atributos sean tan largos, al tener que poner el nombre de
la tabla a la que pertenece, se pueden utilizar los alias de las tablas, que se definen en la clusula
FROM. Estos alias slo se pueden utilizar en la consulta en la que se definen.
EJERCICIOS:
1.- Obtener el n del empleado, su nombre de la tabla empleados y el n de departamento, su
nombre y localidad de la tabla departamentos cuando los departamentos coinciden.
2.- Obtener los distintos departamentos existentes (n y nombre) en la tabla de empleados.
3.- Mostrar el producto, su descripcin y precio de todos los pedidos almacenados.

39
4.- Y si solo quiero la informacin para los pedidos del cliente nmero 106?.
5.- Y si piden la informacin del cliente llamado SIGNOLOGIC S.A.?
Combinaciones basadas en desigualdad
6.- Listar los empleados de los departamentos diferentes al de VENTAS.
7.- Listar los empleados de departamentos con cdigos mayores que el cdigo del
departamento de contabilidad.
8.- Listar los empleados de departamentos con cdigos menores que el cdigo del
departamento de Valencia.
12.- Combinacin externa (OUTER JOIN)
Hay una variedad de combinacin de tablas que se llama OUTER JOIN y que nos permite
seleccionar algunas filas de una tabla aunque stas no tengas correspondencia con las filas de la otra
tabla con la que se combina.
Su formato es el siguiente:
SELECT [ALL | DISTINCT] ExpresionColumna [, ExpresionColumna .....]
FROM NombreTabla [AliasTabla]
{ LEFT | RIGHT [OUTER] JOIN NombreTabla [AliasTabla].....}
ON CondicionComposicion ;
donde:
LEFT | RIGHT [OUTER] JOIN indica que es un join externo y si la extensin del producto
de las tablas se quiere realizar por la izquierda o por la derecha.
Condicion_Composicion es la misma condicin de composicin anterior, pero escrita aqu
en lugar de en la clusula WHERE.
El funcionamiento de un join externo es el siguiente:
LEFT JOIN: join donde se obtienen todas las filas de la tabla de la izquierda, aunque no
tenga correspondencia en la tabla de la derecha.
Realiza el producto cartesiano de las tablas que se indican, aplica la condicin de
composicin (expresada en la clusula ON) al resultado de este producto y aade, por cada fila de la
tabla de la izquierda que no tenga correspondencia en la tabla de la derecha, una fila con los valores
de la tabla de la izquierda y en la tabla de la derecha valores NULL en todas las columnas.
RIGHT JOIN: join donde se obtienen todas las filas de la tabla de la derecha, aunque no
tengan correspondencia en la tabla de la izquierda.
Realiza el producto cartesiano de las tablas que se indican, aplica la condicin de
composicin (expresada en la clusula ON) al resultado de este producto y aade, por cada fila de la
tabla de la derecha que no tenga correspondencia en la tabla de la izquierda, una fila con los valores
de la tabla de la derecha y en la tabla de la izquierda valores NULL en todas las columnas.
Por ejemplo si queremos visualizar los datos de los departamentos y de sus empleados,
visualizando tambin los departamentos que no tengan empleados.
SELECT dnombre Departamento, localidad, emp_no "N empleado", apellido
FROM departamentos d LEFT JOIN empleados e ON d.dep_no=e.dep_no;

40
Aparecern todas las filas de la tabla DEPARTAMENTOS, tanto si tienen correspondencia
en la tabla EMPLEADOS como si no la tienen. Los departamentos que no tengan empleados
tambin apareceran. El departamento de PRODUCCIN no tiene ningn empleado asignado y se
aade una fila en la tabla empleados con todos los campo con valor NULL en correspondencia.
Obtendremos el mismo resultado si cambiamos LEFT por RIGHT y el orden de las tablas:
SELECT dnombre Departamento, localidad, emp_no "N empleado", apellido
FROM empleados e RIGHT JOIN departamentos d ON d.dep_no=e.dep_no;
Hay casos en los que hacer el OUTER JOIN obtendremos el mismo resultado con una
combinacin natural, ya que no hay filas sin correspondencia en la tabla de la correspondencia.
SELECT emp_no "Nempleado", apellido, dnombre "Departamento", localidad
FROM departamentos d RIGHT JOIN empleados e ON d.dep_no=e.dep_no;
Aparecern todas las filas de la tabla EMPLEADOS, tanto si tienen correspondencia en la
tabla DEPARTAMENTOS como si no. Los empleados que no tuviesen departamento asignado
tambin apareceran. En este ejemplo como todos los empleados tienen departamento asignado el
resultado es el mismo.
EJERCICIOS:
1.- Obtener los departamentos con su nombre y localidad y el nmero de empleados
trabajando en ellos, incluyendo los que no tienen empleados.
2.- Obtener los productos, su descripcin y la suma de las unidades pedidas pero incluyendo
los que no han sido pedidos.
13.- Adems es posible reunir una tabla consigo misma:
EJERCICIOS:
1.- Obtener la lista de los empleados con los nombres de sus directores.
Cada empleado de la tabla tiene una columna para su nmero de empleado (emp_no) y otra
para el nmero de empleado de su director (director). A partir del dato de la columna director de un
empleado se puede acceder a otro empleado que contenga el mismo dato en su columna emp_no.
Las dos filas de la tabla se estn relacionando a travs de las columnas director y emp_no.
El uso de alias es obligado por tratarse de la misma tabla y coincidir los nombres de las columnas.
2.- Obtener la lista de empleados con los nombres de sus directores, incluyendo al
PRESIDENTE. (Ejemplo con OUTER JOIN) .
3.- Obtener los jefes de los empleados cuyo oficio sea el de VENDEDOR.
14.- SUBCONSULTAS.
Una subconsulta es una sentencia SELECT incluida en otra clusula SQL. Se utilizan
cuando se necesitan seleccionar filas de una tabla con una condicin que depende de los datos de la
misma tabla o de otra u otras tablas. Es decir, una subconsulta consiste en utilizar los resultados de
una consulta dentro de otra, que se considera la principal. Esta posibilidad fue la razn original para
la palabra estructurada que da el nombre al SQL de Lenguaje de Consultas Estructuradas
(Structured Query Language).

41
Ejemplo: Supongamos que se quiere localizar los empleados cuyo sueldo es superior al de
Martn. Sera necesario dos consultas:

Primero averiguar el salario de Martn.


Luego buscar sueldos superiores al resultado de la consulta anterior.

Este problema se soluciona combinando las dos consultas e incluyendo una dentro de la
otra. La consulta ms interna o subconsulta devuelve un valor que ser usado por la consulta
principal.
La subconsulta puede incluirse en una de las siguientes clusulas:

WHERE
HAVING
FROM de SELECT o DELETE.

La sintaxis con WHERE es la siguiente:


SELECT lista_atributos FROM tabla
WHERE expr_operador
[ > <
( SELECT expresin FROM tabla ) ;

= ....

IN

NOT IN .... ]

Una subconsulta tiene que ir entre parntesis y no debe contener ORDER BY. ste slo
puede aparecer en la consulta principal.
Existen dos tipos de subconsulta:
1.- MONO-REGISTRO. Son las que devuelven un solo registro.
Dentro de stas tenemos:
Las que utilizan un operador de comparacin: =, <, >, <>, ....
Las que utilizan funciones de grupo: AVG, SUM, COUNT, MAX y MIN.
2.- MULTIREGISTRO. Devuelven ms de un registro. Estas subconsultas suelen utilizar el
operador IN.
EJEMPLOS:
- Subconsulta que devuelve una sola expresin. Obtener el nombre del departamento donde
trabaja GARRIDO.
SELECT dnombre FROM departamentos WHERE dep_no =
(SELECT dep_no FROM empleados WHERE apellido = 'GARRIDO') ;
La subconsulta devuelve una sola expresin dep_no, que en este caso el valor del
departamento de GARRIDO que la consulta compara con el correspondiente en la tabla
departamentos.
- Subconsulta que devuelven ms de una expresin. Obtener los empleados que tengan el
mismo oficio y departamento que ALONSO.
SELECT emp_no, apellido, oficio, dep_no FROM empleados WHERE (dep_no, oficio) =
(SELECT dep_no, oficio FROM empleados WHERE apellido = 'ALONSO') ;

42
La subconsulta devuelve dos expresiones, dep_no y oficio (en este caso formadas por una
columna cada una) correspondientes al departamento y oficio de ALONSO y la consulta lo compara
con dos columnas dep_no y oficio, de cada una de las filas de la tabla.
- Subconsulta multiregistro. Obtener los empleados que pertenezcan a departamentos que no
estn en Madrid.
SELECT * FROM empleados WHERE dep_no IN
(SELECT dep_no FROM departamentos WHERE localidad <> MADRID) ;
La subconsulta devuelve varios valores por lo que tenemos que usar IN y no = para
consultar por el resultado de una lista de valores.
EJERCICIOS:
1.- Obtener todos los empleados que tienen el mismo oficio que GARRIDO.
2.- Obtener informacin de los empleados que ganan ms que cualquier empleado del
departamento 30.
3.- Visualizar el nmero de VENDEDORES del departamento VENTAS.
4.- Visualizar la suma de los salarios para cada oficio de los empleados del departamento
VENTAS.
5.- Listar, en orden alfabtico, aquellos empleados que no trabajen ni en Madrid ni en
Barcelona.
6.- Listar los nombres de los departamentos que tengan algn empleado con fecha de alta
anterior a 1982.
7.- Obtener los departamentos y sus nombres, siempre que haya ms de dos empleados
trabajando en ellos.
8.- Visualizar los nombres de los departamentos que tengan empleados trabajando en ellos.
9.- Seleccionar aquellos departamentos en los que al menos exista un empleado con
comisin nula.
10.- Listar los empleados con mayor salario que todos los empleados del departamento 20.
11.- Listar los departamentos que no tienen empleados.
12.- Obtener los empleados que pertenecen al mismo departamento y entraron en la empresa
en la misma fecha que GARRIDO.
13.- Listar el empleado que tiene el mayor salario de cada departamento.
14.- Visualizar los empleados que tienen el mismo director y departamento que ALONSO
excluido el mismo.
15.- Visualizar los departamentos en los que el salario medio de sus empleados sea mayor o
igual que la media de todos los salarios de la empresa.

43
16.- Visualizar los departamentos que tengan mayor media salarial total (salario + comision)
que la mitad de la media salarial total de la empresa.
17.- Visualizar los departamentos con presupuesto mayor que el mnimo presupuesto por
departamentos. El presupuesto de cada departamento es la suma de los salarios de sus empleados.
Subconsultas anidadas
18.- Obtener el nombre y el lmite de crdito de los clientes que han hecho pedidos de
productos que valen ms de 600.
19.- Listar el nombre y la localidad de los clientes que han hecho pedidos de algn tipo de
mesa.
20.- Obtener el empleado que pertenece al mismo departamento que LOPEZ y tiene el
mximo salario.
21.- Visualizar el nmero y el nombre del departamento con ms personal de oficio
VENDEDOR.
22.- Visualizar los datos, nmero, nombre y localidad, del departamento donde trabaja el
empleado ms antiguo con el mismo oficio que GIL.
Subconsultas correlacionadas
En una subconsulta podemos hacer referencias a las columnas de la tabla de la consulta.
Cuando los nombres de columnas que aparecen en una subconsulta son nombres de columnas de la
consulta principal o de otra subconsulta ms externa, caso de las anidadas, se dice que son
referencias externas y la subconsulta que es correlacionada.
Las subconsultas correlacionadas funcionan de la siguiente forma: cada vez que se procesa
una nueva fila en la consulta principal para decir si esa fila se selecciona o no, se ejecuta la
subconsulta. En esa subconsulta podemos hacer referencia a las columnas de la consulta y los
valores sern los de la fila con la que estamos trabajando en ese momento
Por ejemplo: Visualizar los empleados que ganan ms salario que la media de la empresa.
SELECT dep_no "N Departamento", oficio, salario FROM empleados
WHERE salario>(SELECT AVG(salario) FROM empleados);
La tabla empleados se utiliza en la subconsulta para hallar el salario medio de la empresa y
en la consulta para comprobar las filas que cumplen que el salario de ese empleado sea mayor que
el salario medio calculado en la subconsulta.
Ahora supongamos que lo queremos modificar para que se visualicen los empleados que
ganan ms que la media de su departamento. En la subconsulta queremos hallar la media del
departamento de cada empleado, es decir del departamento correspondiente al valor del campo
dep_no en esa fila en la consulta. Por ejemplo si el primer empleado es del departamento 20
debemos calcular la media del dep_no=20 para saber si el empleado gana mas que esa media, y si el
siguiente empleado es del departamento 10 ahora deberemos calcular la media del dep_no=10.
Debemos referirnos a los valores de las columnas de la consulta dentro de la subconsulta y
como son sobre la misma tabla tenemos que poner un alias para diferenciarlas.

44
En una subconsulta correlacionada si coincide el nombre de una columna de una referencia
externa con el nombre de alguna columna de la tabla que est siendo seleccionada en la
subconsulta, se deber anteponer el nombre de la tabla externa para diferenciarlas. Si las tablas son
la misma se deber asignar un alias para diferenciarlas.
Hay dos posibilidades:
a) Poner un alias en ambas
SELECT e1.dep_no "N Departamento", e1.oficio, e1.salario FROM empleados e1
WHERE e1.salario >
( SELECT AVG(e2.salario) FROM empleados e2 WHERE e2.dep_no = e1.dep_no );
b) Poner un alias en la tabla de la consulta
SELECT dep_no "N Departamento", oficio, salario FROM empleados e1
WHERE salario >
( SELECT AVG(salario) FROM empleados WHERE dep_no = e1.dep_no);
Esta segunda opcin es posible porque dentro de una subconsulta, si no se le indica nada,
supone que los nombres de las columnas corresponden a esa subconsulta. Para referenciar nombres
externos es necesario anteponer el nombre de la tabla de la consulta. Si ambas, la consulta y la
subconsulta son sobre la misma tabla, es imprescindible utilizar los alias.
23.- Visualizar el nmero de departamento, el oficio y el salario de los empleados con mayor
salario de cada departamento.
24.- Visualizar el empleado ms antiguo de cada oficio.
25.- Visualizar los empleados que tienen el menor salario de cada departamento.
26.- Visualizar los departamentos en los que hay ms de un trabajador.
27.- Listar las localidades donde existan departamentos con empleados cuya comisin
supere el 10% del salario.
Composiciones y subconsultas
Hay ocasiones en que una consulta puede resolverse con una composicin o combinacin
(join) de tablas o con una subconsulta.
Si puede solucionarse de ambas formas ser preferible hacerlo con una subconsulta. El
producto cartesiano es muy costoso pues hay que multiplicar todas las filas de una tabla por todas
las de la otra tabla para despus seleccionar solo algunas.
En general, si no se necesita visualizar columnas de ms de una tabla, se debe utilizar una
subconsulta. Solamente si se necesita visualizar columnas de ms de una tabla, se usar una
composicin o combinacin.
EJEMPLO
1.- Con subconsulta:
Obtener apellido y oficio de los empleados que tienen el mismo oficio y mismo nmero de
departamento que el de INVESTIGACIN:
SELECT apellido, oficio FROM empleados WHERE oficio IN

45
( SELECT oficio FROM empleados WHERE dep_no IN
(SELECT dep_no FROM departamentos WHERE dnombre='INVESTIGACION') );
Puede solucionarse con una subconsulta porque solo nos piden visualizar campos de la tabla
empleados. Esta solucin es ms conveniente.
2- Con composicin de las tablas:
Obtener apellido, el oficio y la localidad del departamento de los empleados que tienen el
mismo oficio y mismo nmero de departamento que el de INVESTIGACIN:
SELECT apellido, oficio, localidad FROM empleados e, departamentos d WHERE oficio IN
( SELECT oficio FROM empleados WHERE e.dep_no = d.dep_no AND
d.dnombre = 'INVESTIGACION' );
Es el mismo ejercicio pero, en este ejemplo, nos piden visualizar campos de la tabla
empleados y de la tabla departamentos. No puede solucionarse con una subconsulta y debe, por
tanto, solucionarse con un producto de ambas tablas.

EJERCICIOS SELECT:
1.- Visualizar el apellido de los empleados que cobran ms que el empleado n 7844.
2.- Visualizar los empleados con igual oficio que el empleado 7698 y cuyo salario sea
superior al del empleado 7876.
3.- Visualizar el nombre, oficio y salario de todos los empleados cuyo salario sea igual al
mnimo salario de la empresa.
4.- Obtener la fecha del sistema.
5.- Seleccionar los departamentos que tienen un salario mnimo mayor que el mnimo del
departamento 10.
6.- Indicar el oficio con la media ms baja de salarios.
7.- Averiguar qu empleados ganan un salario igual a cualquiera de los mnimos por
departamentos.
Antes: INSERT INTO EMPLEADOS
VALUES (7899, 'MARCOS', 'VENDEDOR', 7698, '1981-03-17', 1400.00, 400.00, 10);
8.- Averiguar qu empleados ganan un salario igual al mnimo de SU departamento.
9.- Visualizar nombre y fecha de alta de todos los empleados que trabajan en el mismo
departamento que el empleado 7521.
10.- Igual que el anterior pero sin contar al empleado 7521.
11.- Visualizar el nmero, nombre y salario de todos los empleados que ganan ms que la
media de salarios. Ordenar el resultado descendentemente por salario.
12.- Visualizar el n y nombre de todos los empleados que trabajan en un departamento que
tenga algn empleado cuyo apellido contenga un T.

46
13.- Nombre, n de departamento y oficio de todos los empleados cuyo departamento se
encuentre en MADRID (Tabla DEPARTAMENTOS).
14.- Visualizar n, nombre y salario de todos los empleados que ganen ms que la media de
salarios y que trabajen en un departamento que tenga algn empleado que tenga una T en su
apellido.

6.5. SELECT DENTRO DE OTRAS INSTRUCCIONES.


Creacin de una tabla a partir de una seleccin de otra tabla.
CREATE TABLE [ IF NOT EXISTS ] NombreTabla
[ ( DefinicionColumna [, DefinicionColumna ...] ) ] [ IGNORE | REPLACE ]
SentenciaSelect ;
IGNORE | REPLACE, opciones de duplicados en campos nicos.
Los nombres de las columnas de la nueva tabla son opcionales. En caso de que no se
especifique tomarn los valores de la otra tabla o de los alias correspondientes. Hay que tener
cuidado con esto porque si hay expresiones o funciones en la lista de la SELECT y no tienen alias
ni nuevo nombre, luego estas columnas no podrn referenciarse.
Las opciones de duplicados en campos nicos (claves primarias o unique) permiten indicar
que hacer si hay un valor repetido en ese campo. Si no se indica nada se producir un error. Para
evitar esto errores podemos especificar una de las dos opciones IGNORE que ignora la fila y no la
graba y REPLACE que reemplaza la fila por la anterior.
La nueva tabla creada no hereda las CONSTRAINTS que tenan asignadas la tabla origen.
Esto es para dar ms flexibilidad al sistema. Si se desea que la nueva tabla tenga CONSTRAINTS
deben indicarse en la creacin o aadirse posteriormente con ALTER TABLE. Es importante
recordarlo para que la nueva tabla quede con la definicin completa.
Al crear la nueva tabla adems se insertan las filas correspondientes de la tabla resultado de
la sentencia SELECT en la instruccin de creacin.
EJERCICIOS:
1.- Crear una tabla de vendedores seleccionando stos de la tabla de empleados.
2.- Crear una nueva tabla (nombres_dep) slo con los nombres y nmeros de departamentos
a partir de la tabla departamentos ya creada.
Inserciones con subconsultas
INSERT INTO NombreTabla [ ( NombreColumna [, NombreColumna...] ) ]
SentenciaSelect ;
EJERCICIOS:
1.- Insertar en departamentos2 los departamentos (con todos sus datos) cuyo nombre tenga
ms de 8 caracteres (antes borrar el contenido previo de departamentos2).

47
Si la tabla destino tuviese una estructura diferente deberemos forzar la correspondencia, bien
al especificar la lista de seleccin, bien especificando la lista de columnas, o bien utilizando ambos
recursos.
2.- Igual que el 1.- pero en la tabla nombres_dep.
Modificaciones con subconsultas
Si la condicin que deben cumplir las filas que deseamos modificar implica realizar una
subconsulta a otras tablas. En estos casos se incluir la subconsulta en la condicin de la clusula
WHERE.

Esta subconsulta tiene las siguientes limitaciones:


La tabla destino no puede aparecer en la consulta.
No se puede incluir una clusula ORDER BY en la consulta.
EJEMPLO:
Elevar en 500 el salario de todos los empleados cuyo departamento no est en MADRID.

UPDATE empleados SET salario = salario + 500


( SELECT dep_no FROM departamentos
Too:
UPDATE empleados SET salario = salario + 500
( SELECT dep_no FROM departamentos

WHERE dep_no IN
WHERE localidad <> 'MADRID' );
WHERE dep_no NOT IN
WHERE localidad = 'MADRID' );

Eliminaciones con subconsultas


Se trabaja igual que con las modificaciones (UPDATE).
EJERCICIOS:
1.- Eliminar de la tabla departamentos aquellos que no tienen ningn empleado.
2.- Eliminar los departamentos que tienen menos de tres empleados.
Nota: esta orden la ejecutamos con las tablas departamentos2 y empleados2 que tiene borrado en
cascada (con empleados y departamentos no sera posible por la restriccin de integridad)
NOTA: Se pueden utilizar subconsultas anidadas a varios niveles, pero respetando la siguiente
restriccin: la tabla destino no puede aparecer en la clusula FROM de ninguna de las
subconsultas que intervienen en la seleccin.
En cambio SI se permiten referencias externas, como en el siguiente ejemplo:
DELETE FROM departamentos WHERE NOT EXISTS (SELECT * FROM empleados
WHERE empleados.dep_no = departamentos.dep_no ) ;
En estos casos la subconsultas con la referencia externa realiza la seleccin sobre la tabla
destino antes de que se elimine ninguna fila.

48

7.- LENGUAJE DE CONTROL DE DATOS.


En SQL la seguridad de los datos se controla por medio de dos mecanismos:

La definicin de vistas permite ocultar datos confidenciales a usuarios no autorizados.


El subsistema de autorizacin, mediante el cual usuarios con derechos especficos pueden
conceder de manera selectiva y dinmica esos derechos a otros usuarios, y despus revocar
esos derechos, si lo desean.

7.1.- VISTAS.
Una vista es una tabla virtual, en el sentido de que no se almacenan datos propios de la vista,
sino que nicamente se guarda la definicin de la vista. Podemos definir una vista como una
consulta almacenada en la base de datos que se utiliza como una tabla virtual. Se define asociadas a
una o varias tablas y no almacena los datos sino que trabaja sobre los datos de las tablas sobre las
que est definida, estando as en todo momento actualizada.
Se trata de una perspectiva de la base de datos o ventana que permite a uno o varios usuarios
ver solamente las filas y columnas necesarias para su trabajo.
Entre las ventajas que ofrece la utilizacin de vistas cabe destacar:

Seguridad y confidencialidad: ya que la vista ocultar los datos confidenciales o aquellos


para los que el usuario no tenga permiso.
Comodidad: ya que solamente muestra los datos relevantes, permitiendo, incluso trabajar
con agrupaciones de filas como si se tratase de una nica fila o con composiciones de varias
tablas como si se tratase de una nica tabla.
Independencia respecto a posibles cambios en los nombres de columnas, tablas, etc.

Desde el punto de vista del usuario una vista es como una tabla ms de la Base de Datos. La
sintaxis general para definir una vista es la siguiente:
CREATE [OR REPLACE] VIEW nombre-de-la-vista [ (columna [, columna, ] ) ]
AS expression_de_consulta
[WITH READ ONLY]
[WITH CHECK OPTION] ;
La clusula WITH READ ONLY indica que solo se pueden hacer SELECT de las filas de la
vista ( nunca INSERT, UPDATE o DELETE ).
La clusula WITH CHECK OPTION indica que nicamente se permiten operaciones de
insercin o modificacin que afecten a la expresin de consulta que define la vista.
Slo son actualizables las vistas que proceden de una nica tabla y en cuya definicin no
aparezcan las clusulas GROUP BY o HAVING.
No se puede usar la clusula ORDER BY en la creacin de una vista ya que las filas de una
tabla no estn ordenadas (la vista es una tabla virtual). No obstante, si se puede utilizar dicha
clusula a la hora de recuperar datos de la vista.
Es obligatorio especificar la lista de nombres de columnas de la vista o un alias cuando la
consulta devuelve funciones de agrupamiento como SUM, COUNT, etc si posteriormente quiere
hacerse referencia a ellas.

49
Tambin se puede dar nombres a las columnas de las vista a travs de los alias de las
subconsultas. Por ejemplo, las 2 instrucciones siguientes son equivalentes:
CREATE VIEW emple10A Empleado, Nombre AS
SELECT emp_no, apellido FROM empleados WHERE dep_no=10;
CREATE VIEW emple10B AS SELECT emp_no Empleado, apellido Nombre
FROM empleados WHERE dep_no=10;
Pueden utilizarse funciones de agrupacin sobre columnas de vistas que se basan a su vez en
funciones de agrupacin, lo que permite resolver los casos en los que haya un doble agrupamiento
que no est permitido por el estndar. As creamos una vista con una primera funcin de agrupacin
y sobre ella aplicamos la segunda funcin de agrupacin, obteniendo el resultado deseado.
EJEMPLOS
Crear la vista emple_dep30 para la gestin de los empleados del departamento 30.
CREATE VIEW emple_dep30 AS SELECT * FROM EMPLEADOS WHERE DEP_NO = 30;
Crear la vista datos_emple que contiene informacin de todos los empleados ocultando la
informacin confidencial.
CREATE VIEW datos_emple AS
SELECT emp_no, apellido, oficio, director, fecha_alta, dep_no FROM empleados;
Las vistas pueden a su vez definirse sobre otras vistas.
CREATE VIEW datos_emple10 AS SELECT * FROM datos_emple WHERE dep_no=10;
Una vez definida puede ser utilizada para consultas de igual forma que una tabla base.
SELECT * FROM datos_emple;
EJERCICIOS:
1.- Crear la vista datos_vendedores que muestra solamente las columnas emp_no,apellido,
director, fecha_alta, dep_no, de aquellos empleados cuyo oficio es VENDEDOR.
2.- Crear la vista resumen_dep1 con cada departamento, el n de empleados, la suma de
salarios y la suma de comisiones.
3.- Obtener el departamento con mayor suma de salarios para sus empleados.
4.- Mostrar los nombres de los departamentos que tengan ms de 2 empleados.

Borrar VISTAS:
DROP VIEW [ IF EXISTS ] nombre_ de_la_vista ;
La clusula IF EXISTS previene los errores que puedan producirse si no existe la tabla que
queremos borrar.

50
EJEMPLOS
DROP VIEW IF EXISTS resumen_emp_dep ;
Borrado de las tablas o vistas asociadas a una vista:
Si se borran las tablas o las vistas sobre las que estn definidas las vistas, la vista se queda
invalidada (no se borra su definicin pero no se puede utilizar).
SELECT * FROM datos_emple10;
Si borramos datos_emple sobre la que est definida datos_emple10 esta pasar a estar
invalidada.
DROP VIEW IF EXISTS datos_emple ;
SELECT * FROM datos_emple10 ;
ERROR 1356 (HY000): View 'Ventas.datos_emple10' references invalid table(s) or column(s)
Operaciones sobre VISTAS:
Igual que sobre las tablas, aunque hay que tener en cuenta lo siguiente:
- Consulta: igual.
- Actualizacin: si una vista est basada en una sola tabla, entonces se pueden modificar las
filas de la vista. En realidad se actualizan las filas de la tabla origen.
- Insercin: se pueden insertar filas (y lo har en la tabla origen) si se cumplen todas las
restricciones de la definicin de la tabla origen (obligatoriedad, unicidad,)
- Borrado: igual que la insercin.
En las vistas definidas sobre ms de una tabla, no se puede hacer ni actualizacin, ni
insercin ni borrado, slo SELECT.
El manejo de expresiones y de funciones en las vistas, se pueden usar pero solo podremos
consultar estas vistas (SELECT).

7.2.- SINNIMOS.
Creacin de SINNIMOS:
CREATE [PUBLIC] SYNONYM nombre-del-sinnimo FOR [usuario.]nom-tabla ;
PUBLIC, hace que el sinnimo est disponible para todos los usuarios. Pero solo lo pueden
usar el administrador y los usuarios con privilegio CREATE PUBLIC SYNONYM.
Borrado de SINNIMOS:
DROP [PUBLIC] SYNONYM nombre-del-sinnimo ;
PUBLIC, hace que el sinnimo est disponible para todos los usuarios. Pero solo lo pueden
usar el administrador y los usuarios con privilegio CREATE PUBLIC SYNONYM.

51
CAMBIOS DE NOMBRES:
Se puede cambiar el nombre de una tabla, vista o sinnimo:
RENAME nombre-anterior TO nombre-nuevo ;
Las restricciones de integridad, los ndices y los permisos dados al objeto se transfieren
automticamente al nuevo objeto.

8. EJERCICIOS (SQL1 Gestion_ventas).


CREATE DATABASE GESTION_ENVIOS;
USE GESTION_ENVIOS;

52

ANEXO: TABLAS DE TRABAJO


BASE DE DATOS: Ventas
Tabla de DEPARTAMENTOS:
DEP_NO
10
20
30
40

DNOMBRE
CONTABILIDAD
INVESTIGACION
VENTAS
PRODUCCION

LOCALIDAD
BARCELONA
VALENCIA
MADRID
SEVILLA

Clave primaria: DEP_NO

Tabla de EMPLEADOS:
EMP_NO

7499
7521
7654
7698
7782
7839
7844
7876
7900

APELLIDO

OFICIO

ALONSO
LOPEZ
MARTIN
GARRIDO
MARTINEZ
REY
CALVO
GIL
JIMENEZ

VENDEDOR
EMPLEADO
VENDEDOR
DIRECTOR
DIRECTOR
PRESIDENTE
VENDEDOR
ANALISTA
EMPLEADO

DIRECTOR

FECHA_ALTA

SALARIO

COMISION

DEP_NO

7698
7782
7698
7839
7839
NULL
7698
7782
7782

20/02/81
08/05/81
28/09/81
01/05/81
09/06/81
17/11/81
08/09/81
06/05/82
24/03/82

1400.00
1350.00
1500.00
3850.00
2450.00
6000.00
1800.00
3350.00
1400.00

400.00
NULL
1600.00
NULL
NULL
NULL
0.00
NULL
NULL

30
10
30
30
10
10
30
20
20

Clave primaria: EMP_NO


Clave ajena: DIRECTOR de EMPLEADOS
Clave ajena: DEP_NO de DEPARTAMENTOS

Tabla de CLIENTES:
CLI_NO

101
102
103
104
105
106
107
108

NOMBRE

DISTRIBUCIONES
GOMEZ
LOGITRONICA
S.L.
INDUSTRIAS
LACTEAS S.A.
TALLERES
ESTESO S.A.
EDICIONES SANZ
SIGNOLOGIC S.A.
MARTIN Y
ASOCIADOS S.L.
MANUFACTURAS
ALI S.A.

LOCALIDAD VENDEDOR_NO DEBE HABER LIM_CREDITO

MADRID

7499

0.00

0.00

5000.00

CADIZ

7654

0.00

0.00

5000.00

LAS ROZAS

7844

0.00

0.00

10000.00

SEVILLA

7654

0.00

0.00

5000.00

CADIZ
MADRID
ARAVACA

7499
7654
7844

0.00
0.00
0.00

0.00
0.00
0.00

5000.00
5000.00
10000.00

SEVILLA

7654

0.00

0.00

5000.00

Clave primaria: CLI_NO


Clave ajena: VENDEDOR_NO de EMPLEADOS

53

Tabla de PRODUCTOS:
PRODUCTO_NO
10
20
30
40
50
60
70
80

DESCRIPCION
MESA DESPACHO MOD.GAVIOTA
SILLA DIRECTOR MOD.BUFALO
ARMARIO NOGAL 2 PUERTAS
MESA MOD.UNION
ARCHIVADOR CEREZO
CAJA SEGURIDAD MOD.B222
DESTRUCTORA DE PAPEL A3
MODULO ORDENADOR MOD.ERGOS

PRECIO
550.00
670.00
460.00
340.00
1050.00
252.00
450.00
495.00

STOCK
50
25
20
15
20
15
25
25

Clave primaria: PRODUCTO_NO

Tabla de PEDIDOS:
PEDIDO_NO
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015

PRODUCTO_NO
20
50
10
20
40
30
70
50
10
20
40
30
10
30
20
70

CLI_NO
103
106
101
105
106
105
103
101
106
105
102
106
105
106
101
105

Clave primaria: PEDIDO_NO


Clave ajena: PRODUCTO_NO de PRODUCTOS
Clave ajena: CLI_NO de CLIENTES

UNIDADES
3
2
4
4
8
2
3
2
6
2
3
2
3
2
4
4

FECHA
2009-10-06
2009-10-06
2009-10-07
2009-10-16
2009-10-20
2009-10-20
2009-11-03
2009-11-06
2009-11-16
2009-11-26
2009-12-08
2009-12-15
2009-12-06
2009-12-06
2010-01-07
2010-01-16

You might also like