Sei sulla pagina 1di 61

ADMINISTRACIN D BASE DE DATOS 2013

Prof. Juregui Sotelo Julio

LENGUAJE ESTRUCTURADO DE CONSULTAS ( SQL )


LENGUAJE SQL
Es una herramienta para gestionar, organizar y recuperar datos almacenados en una base de datos
informtica. SQL significa Structured Query Language o Lenguaje Estructurado de Consultas.

Peticin SQL

Sistema de Gestin de Base de Datos


Base de Datos

Datos

Uso de SQL para acceso a Base de Datos


El sistema informtico de la figura anterior tiene una base de datos que almacena
informacin importante. Si el sistema informtico, estuviera en una empresa comercial,
la base de datos almacenara datos de inventario, produccin, ventas, nmina, etc.

El programa informtico que controla base de datos, se denomina Sistema de gestin de Base de
Datos o DBMS.
Cuando se necesita recuperar datos de la base de datos, se utiliza el lenguaje SQL para efectuar la
peticin. El DBMS procesa la peticin SQL, recupera los datos solicitados y los devuelve. Este
proceso de solicitar datos de la base de datos y de recibir los resultados se denomina
consulta(query) a la base de datos; de aqu el nombre Structured Query Language.
El SQL es ms que una herramienta de consulta, tambin incluye las siguientes funciones:
1.

Definicin de datos

2.

Recuperacin de datos

3.

Manipulacin de Datos

4.

Control de acceso

5.

Comparticin de datos

6.

Integridad de datos

Por tanto SQL es un lenguaje completo de control e interaccin con un sistema de gestin de base
de datos.

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
SQL no es un lenguaje de programacin.
SQL no es un sistema, ni un producto. No podemos ir a una tienda y comprar SQL.
La mquina o Motor de la base de datos es el corazn del DBMS, responsable de estructurar,
almacenar y recuperar realmente los datos en el disco.

Actualmente SQL cumple tambin juega los siguientes papeles:


1.

SQL es un lenguaje de consultas interactivas

2.

SQL es un lenguaje de programacin de base de datos

3.

SQL es un lenguaje de administracin de base de datos.

4.

SQL es un lenguaje cliente/servidor

5.

SQL es un lenguaje de bases de datos distribuidas

6.

SQL es un lenguaje de pasarela de base de datos. (pipeline)

CARACTERSTICAS DE SQL
1.

Independencia de los vendedores

2.

Su portabilidad a travs de sistemas informticos

3.

Existen estndares SQL

4.

El apoyo de IBM

5.

Su fundamento relacional

6.

Su estructura de alto nivel semejante al ingls.

7.

Las consultas interactivas ad hoc

8.

Su acceso a la base de datos mediante programas

9.

Las vistas mltiples de datos

10. El ser un lenguaje de bases de datos


11. Su definicin dinmica de datos
12. Arquitectura cliente/servidor

HISTORIA DE SQL
El concepto de base de datos relacional fue desarrollado originalmente por Ted Codd, de IBM en
1970. Este fue el origen del modelo relacional y de SQL. Veamos:
-

1970 Codd define el modelo relacional


1974 Comienza el System R de IBM y apareci la primera publicacin de SEQUEL
1979 Oracle crea el primer RDBMS
1981 IBM anuncia SQL / DS
1982 ANSI forma el comit de estndares SQL
1983 IBM anuncia DB2
1986 Sybase introduce RDBMS para procesar transacciones
1987 Se ratifica el estndar ISO SQL.

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
COMPONENTES DEL LENGUAJE SQL
DDL
El SQL DDL proporciona rdenes para definir esquemas de relacin, eliminar relaciones, crear
ndices y modificar esquemas de relacin.

MDL
El SQL DML incluye un lenguaje de consultas basado en el lgebra relacional y el clculo relacional
de tuplas. Tambin incluye rdenes para insertar, suprimir y modificar tuplas de la base de datos.

TIPOS DE SQL

SQL INCORPORADO O ESTATICO


Permite establecer consultas pre-definidas. Es comn encontrarlas tambin dentro de los
lenguajes de programacin.

SQL DINAMICO
Permite hacer consultas o definir datos en tiempo real, es decir de acuerdo a un contexto
determinado.

LENGUAJES RELACIONALES COMERCIALES


-

SQL

QUERY BY EXAMPLE

QUEL

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio

MYSQL

Dentro del men inicio de Windows seleccionar:


Carpeta MySQL MySQL Workbench 6.0 CE
Una vez clickeado se cargar la IDE de Workbench
(pantalla negra) que mostrar todas las instancias
instaladas en la computadora.
En el ejemplo de abajo aparece una sola instancia

Para conectarse con el servidor de base de datos en


modo grfico dar clic al cono rectangular que dice <<Local Instance MySQL5.6>> que
se halla en la parte superior izquierda del software.
Si la conexin fuera en modo comandos o texto ya sea en entorno DOS o LINUX/UNIX
puede usar la sintaxis de abajo.
shell> mysql -h host -u user -p
Enter password: ********

Ejemplo: mysql h localhost u root p ******


En la ventana de Workbench damos clic en

Esto cargar la ventana de identificacin

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio

Escriba su contrasea y se cargar la ventana de trabajo del workbench. El


men que est dentro de un crculo muestra los botones de ocultar y
mostrar secciones de pantalla

Barra de
herramientas

Ayuda
contextual

Zona de
codificacin

Bases de
datos

Escriba ya sea en la ventana de comandos o en la zona de codificacin


Ya se ha visto SHOW DATABASES, la cual informa las bases de datos gestionadas por el
servidor. Para conocer la base de datos actualmente seleccionada, se utiliza la
funcion DATABASE():

mysql> SELECT DATABASE();


+------------+
| DATABASE() |
+------------+
| menagerie |
+------------+

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
Si an no se hubiese seleccionado ninguna base de datos, el resultado sera NULL.
Para conocer las tablas contenidas en la base de datos actual (por ejemplo, si no se est
seguro del nombre de una tabla) se usa el siguiente comando:
mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| event
|
| pet
|
+---------------------+

Si lo que se desea es ver la estructura de una tabla, el comando DESCRIBE es til;


muestra informacin acerca de cada columna de la tabla:
mysql> DESCRIBE pet;
+---------+-------------+------+-----+---------+-------+
| Field
| Type
| Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name
| varchar(20) | YES |
| NULL
|
|
| owner
| varchar(20) | YES |
| NULL
|
|
| species | varchar(20) | YES |
| NULL
|
|
| sex
| char(1)
| YES |
| NULL
|
|
| birth
| date
| YES |
| NULL
|
|
| death
| date
| YES |
| NULL
|
|
+---------+-------------+------+-----+---------+-------+
Field contiene el nombre de la columna, Type es el tipo de dato, NULL seala si la

columna puede contener valores NULL, Key indica si la columna est indexada,
y Default informa el valor por defecto de la columna.
Si una tabla tiene ndices, SHOW INDEX FROM tbl_name muestra informacin sobre ellos.

CREAR Y SELECCIONAR UNA BASE DE DATOS


Para crear una base de datos utilice el siguiente comando:
mysql> CREATE DATABASE menagerie;

En ambientes Unix/Linux, los nombres de las bases de datos son case sensitive (al
contrario que las palabras clave), de modo que siempre debe referirse a su base de
6

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
datos como menagerie, y no Menagerie, MENAGERIE, o una variante similar. Esto
tambin se aplica a los nombres de tablas y de otros objetos de la base de datos. Esta
restriccin no existe en Windows.
.
Al crear una base de datos, sta no se selecciona para su uso, debe hacerlo
explicitamente. Para convertir a menagerie en la base de datos actual, use este
comando:
mysql> USE menagerie
Database changed

Para crear una tabla utilice el siguiente ejemplo


create table alumnos
(codigo char(8) primary key,
nombres char(30),
ap char(30),
am char(30),
edad numeric);
En este otro ejemplo vea que no se tiene claves
create table alumnos
(codigo char(8),
nombres char(30),
ap char(30),
am char(30),
edad numeric);
Usaremos alter table para modificar alguna caracterstica de la tabla
alter table alumnos add primary key (codigo);
Si queremos eliminar la clave primary que le acabamos de agregar,
podemos usar:
alter table alumnos drop primary key;
Para aadir ms campos a la clave primaria podemos usar:
alter table alumnos add primary key (codigo,nombres);

ACTIVIDAD

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
Para cada uno de los siguientes campos construir una sola tabla para cada
ejercicio. Cada tabla debe tener su clave primaria
1. Construir una tabla de choferes con al menos 8 campos para una
empresa de alquiler de taxi
2. Construir una tabla que almacene informacin (al menos 5 campos)
de los discos (CD,DVD) que vende un negocio
3. Construir una tabla que almacene los datos de todos los productos
que existen en una ferretera. Use al menos una tabla con 6 campos.

CREATE DATABASE PARDO;


USE PARDO;
CREATE TABLE ALUMNOS
(
CODIGO CHAR(8) PRIMARY KEY,
NOMBRES CHAR(25) NOT NULL,
AP CHAR(25) NOT NULL,
AM CHAR(25) NOT NULL
);
INSERT INTO ALUMNOS VALUES('0001','Angie', 'Cepeda','Tagle');
INSERT INTO ALUMNOS VALUES('0002','Mariluz', 'Cepeda','Tagle');
INSERT INTO ALUMNOS VALUES('0003','Alejandra', 'Cepeda','Tagle');
select * from alumnos;
alter table alumnos add column F_NAC date NOT null;

CREATE DATABASE ARTETA;


use arteta;
CREATE table productos
(codigo char (8) primary key,
descrip varchar(30) not null,
cod_cat char(3) not null,
stock integer not null,
precio numeric(6,2) not null,
alta char(1));
insert into productos values('0001','teclado','01',65,234.66,'1');
8

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
select * from productos;
insert into productos
insert into productos
insert into productos
select count(codigo)

values('0002','mouse','01',65,34.65219,'1');
values('0003','Monitor','01',65,3456.659,'1');
values('0004','Memoria','01',165,23,'1');
as total_item from productos;

create table cab_pedidos


(
codigo char(80) primary key,
cliente varchar(30) not null,
fecha datetime not null,
cod_empleado char(8) not null
);
insert into cab_pedidos values('0001','Tay gon','2013/09/09','0008');
insert into cab_pedidos values('0002','Tay Loy','2013/09/09','0001');
insert into cab_pedidos values('0003','Lau Chun','2013/09/09','0002');
insert into cab_pedidos values('0004','Perz Avalos','2013/09/09','0002');
select * from cab_pedidos;
create table det_pedidos
(
cod_ped char(8) primary key,
cod_prod char(8) not null,
cantidad integer not null
);
alter table det_pedidos drop primary key;
alter table det_pedidos add primary key(cod_prod);
alter table det_pedidos add primary key(cod_ped,cod_prod);
select distinct productos.codigo, productos.descrip from productos,
det_pedidos
where productos.codigo=det_pedidos.cod_prod;
insert
insert
insert
insert
insert
insert

into
into
into
into
into
into

det_pedidos
det_pedidos
det_pedidos
det_pedidos
det_pedidos
det_pedidos

values('0001','0002',12);
values('0001','0001',12);
values('0001','0004',12);
values('0002','0002',12);
values('0002','0004',12);
values('0003','0001',12);

select distinct cab_pedidos.codigo as pedidos, productos.codigo, descrip


from productos, det_pedidos, cab_pedidos
where cab_pedidos.codigo=det_pedidos.cod_ped and
det_pedidos.cod_prod=productos.codigo
order by cab_pedidos.codigo;
select * from det_pedidos;

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
select distinct cab_pedidos.codigo as pedidos, productos.codigo, descrip
from productos, det_pedidos, cab_pedidos
where cab_pedidos.codigo=det_pedidos.cod_ped and
det_pedidos.cod_prod=productos.codigo
order by cab_pedidos.codigo into outfile 'lista1.txt' fields terminated by '\t'
LINES TERMINATED BY '\n';

mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet


-> LINES TERMINATED BY '\r\n';

APRENDIENDO MYSQL
Mostrare cmo usar el programa cliente MYSQL para crear y usar una simple base de
datos MYSQL (al que algunas veces nos referimos como "monitor terminal" o
simplemente "monitor") es un programa interactivo que te permite conectarte a un
servidor MYSQL, ejecutar consultas y observar los resultados. MYSQL puede ser
usado tambin en modo batch: escribes tus consultas en un fichero de texto, para
despus pedirle a MYSQL que ejecute el contenido del fichero. Se cubren aqu esas
dos formas de usar de MYSQL.
Para ver una lista de opciones de ayuda proporcionadas por MYSQL, lnzalo con las
opcin help :
MYSQL> help

Se asume que MYSQL est instalado en tu mquina, y que hay disponible un servidor
al que te puedes conectar. Si esto no es as, contacta con tu administrador MYSQL
Se describe el proceso completo de configurar y usar una base de datos. Si ests
interesado slo en acceder una base de datos ya existente, querrs saltar las
secciones que describen cmo crear la base de datos y las tablas que la contienen.
Conectando y desconectando del servidor
===========================================
Para conectarse al servidor, generalmente necesitars facilitar un nombre de usuario
MYSQL cuando lances el cliente MYSQL y, lo ms probable, tambin un password. Si
el servidor se est ejecutando en una mquina distinta a la que ests conectado,
necesitars especificar tambin un nombre de host. Contacta con tu administrador
para averiguar qu parmetros de conexin necesitas usar para conectar (es decir,
qu host, nombre de usuario y password usar). Una vez que conozcas los parmetros
adecuados, debers ser capaz de conectar de la siguiente forma:
shell> MYSQL -h host -u user -p
Enter password: *******
Welcome to the MYSQL monitor. Commands end with ; or \g.
Your MYSQL connection id is 459 to server version: 3.22.20a-log
10

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
Type 'help' for help.
MYSQL>
El prompt te indica que MYSQL ya est listo para la introduccin de comandos.
Algunas instalaciones MYSQL permiten a los usuarios conectarse como usuarios
"anonymous" (sin nombre) al servidor ejecutndose en el host local. Si este es el caso
en tu mquina, deberas ser capaz de conectar a ese servidor invocando MYSQL sin
ninguna opcin:
shell> MYSQL
Una vez que hayas conectado con xito, puedes desconectarte en cualquier momento
tecleando QUIT en el prompt MYSQL> :
MYSQL> QUIT
Bye
Tambin puedes desconectar tecleando control-D.
La mayor parte de los ejemplos en las siguientes secciones asumen que ests
conectado al servidor. Lo indicarn por el prompt MYSQL>
Haciendo consultas
=======================
Asegrate de que ests conectado al servidor, como se ha discutido en
secciones anteriores. El hacerlo no implica que tengas seleccionada ninguna
base de datos con la que trabajar, pero est bien. En este punto, es ms
importante averiguar un poco sobre cmo lanzar consultas que lanzarse
directamente a la creacin de tablas, cargar datos en ellas y recuperar los datos de las
mismas. Esta seccin describe los principios bsicos de la entrada de comandos,
usando varias consultas que puedes probar para familiarizarte con la forma de trabajo
de MYSQL.
Aqu presento un comando simple que pide al servidor que nos diga su nmero de
versin y fecha actual. Teclalo como se muestra a continuacin siguiendo el prompt
MYSQL> y pulsa la tecla RETURN:
MYSQL> SELECT VERSION(), CURRENT_DATE;
+-----------+--------------+
| version() | CURRENT_DATE |
+-----------+--------------+
| 3.22.23b | 2000-01-05 |
+-----------+--------------+
1 row in set (0.06 sec)
MYSQL>
Esta consulta ilustra muchas cosas sobre MYSQL:
11

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
* Un comando consiste normalmente de una sentencia SQL seguida por un punto y
coma. (Existen algunas excepciones donde no es necesario el punto y coma. QUIT,
mencionado ms adelante, es una de ellas. Conoceremos otras ms adelante.)
* Cuando lanzas un comando, MYSQL lo enva al servidor para su ejecucin y muestra
los resultados,
despus imprime otro MYSQL> para indicar que est listo para otro comando.
* MYSQL muestra la salida de una consulta como una tabla (filas y columnas). La
primera fila contiene etiquetas para las columnas. Las siguientes filas son el resultado
de la consulta. Normalmente, las etiquetas de las columnas son los nombres de las
columnas que has obtenido de la base de datos. Si pides el valor de una expresin en
vez de una columna de una tabla (como en el ejemplo anterior), MYSQL etiqueta la
columna usando la propia expresin.
* MYSQL muestra el nmero de filas que se han dado como resultado, y cunto
tiempo llev la
ejecucin de la consulta, lo que te da una idea aproximada del
rendimiento del servidor. Estos valores son imprecisos porque representan tiempo
real (no tiempo de CPU o mquina), y porque estn afectados por factores como la
carga del servidor y la latencia de la red.
Las palabras clave pueden ser tecleadas en cualquier
mayscula/minscula. Las siguientes consultas son equivalentes:
MYSQL> SELECT VERSION(), CURRENT_DATE;
MYSQL> select version(), current_date;
MYSQL> SeLeCt vErSiOn(), current_DATE;

combinacin

He aqu otra consulta. Demuestra que puedes usar MYSQL como una calculadora
sencilla:
MYSQL> SELECT SIN(PI()/4), (4+1)*5;
+-------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+-------------+---------+
| 0.707107 |
25 |
+-------------+---------+
Los comandos vistos hasta aqu han sido relativamente cortos, sentencias de una sola
lnea. Tambin puedes insertar mltiples sentencias en una sola lnea. Simplemente,
termina cada una con un punto y coma:
MYSQL> SELECT VERSION(); SELECT NOW();
+-----------+
| version() |
+-----------+
| 3.22.23b |
+-----------+
+---------------------+
| NOW()
|
+---------------------+
| 2000-01-05 17:33:16 |
+---------------------+
12

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
Un comando no necesita ser dado todo en una sola lnea, as pues, los comandos
largos que requieran varias lneas no son un problema. MYSQL determina cuando
termina tu sentencia buscando el punto y coma final, no buscando el final de la lnea
de entrada. (En otras palabras, MYSQL acepta entrada de libre formato: recoleta las
lneas de entrada pero no las ejecuta hasta que vea el punto y coma.)
Aqu tenemos un simple ejemplo de mltiples lneas:
MYSQL> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
+----------------+--------------+
| USER()
| CURRENT_DATE |
+----------------+--------------+
| root@localhost | 2000-01-05 |
+----------------+--------------+
En este ejemplo, observa como cambia el prompt de MYSQL> a -> una vez que has
insertado la primera lnea de una consulta multi-lnea. Esta es la forma en que MYSQL
indica que no ha encontrado una sentencia completa y que est esperando por el
resto. El prompt es tu amigo, dado que ofrece una retroalimentacin (feedback)
significativa. Si usas ese feedback, siempre sabrs a qu est esperando MYSQL.
Si decides que no quieres ejecutar un comando que est en proceso de introduccin,
puedes cancelarlo tecleando \c :
MYSQL> SELECT
-> USER
-> \c
MYSQL>
Observa aqu tambin el prompt. Ha vuelto a MYSQL> tras haber tecleado \c,
ofreciendo un feedback
que indica que MYSQL est listo para un nuevo comando.
La siguiente tabla muestra cada uno de los prompts que puedes ver y resume qu es
lo que significan y el estado en el que se encontrar MYSQL:
Prompt
MYSQL>
->
'>
(')
">
(")

Significado
Listo para un nuevo comando
Esperando una nueva lnea de una consulta multi-lnea
Esperando la siguiente lnea, se ha insertado una lnea que comienza con
Esperando la siguiente lnea, se ha insertado una lnea que comienza con

Las sentencias multi-lnea ocurren comnmente "por accidente" cuando intentas lanzar
un comando en una nica lnea, pero olvidas el punto y coma del final. En este caso,
MYSQL espera ms entrada:
MYSQL> SELECT USER()
->

13

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
Si esto es lo que te ocurre (crees que has introducido una sentencia pero la nica
respuesta es un prompt como ->), lo ms probable es que MYSQL est esperando por
el punto y coma. Si no observas qu es lo que te dice el prompt, podras quedarte
esperando un buen rato antes de enterarte de qu es lo que sucede. Introduce un
punto y coma para completar la sentencia, y MYSQL la ejecutar:
MYSQL> SELECT USER()
-> ;
+----------------+
| USER()
|
+----------------+
| root@localhost |
+----------------+
Los prompts '> y "> ocurren durante la recogida de strings. En MYSQL, puedes escribir
strings encerrados por comillas simples (') o dobles (") (por ejemplo, 'hola' o "adios"), y
MYSQL te permite introducir tambin strings que se cortan en mltiples lneas. Cuando
veas un prompt como '> ">, significa que has introducido una lnea que contena un
string que comenzaba por (') o ("), pero que no has introducido an la comilla (simple o
doble) de cierre. Esto est bien si realmente estabas introduciendo un string multilnea, pero no es lo ms normal. Lo que s es ms normal, es que los prompts '> ">
indiquen que te has olvidado del caracter de cierre " '. Por ejemplo:
MYSQL> SELECT * FROM mi_tabla WHERE nombre ="Garca AND edad < 30;
">
Si tecleas esta sentencia SELECT, despus pulsas ENTER y esperas por el resultado,
no suceder nada. En lugar de preocuparte, "?por qu tarda tanto esta consulta?",
observa la pista que te ofrece el prompt "> . Esto te indica que MYSQL espera ver el
resto de un string que an no ha terminado. (?Ves el error en la sentencia? La cadena
"Garca ha perdido las comillas de cierre.)
Llegados a este punto, ?qu puedes hacer?. Lo ms fcil es cancelar el comando. Sin
embargo, no puedes teclear simplemente \c en este ejemplo, dado que MYSQL !lo
interpretar como parte del string que est leyendo! En vez de eso, introduce las
comillas de cierre (para que MYSQL sepa que ya has terminado de introducir el string),
y despus teclea \c :
MYSQL> SELECT * FROM mi_tabla WHERE nombre ="Garca AND edad < 30;
"> "\c
MYSQL>
El prompt vuelve a cambiar a MYSQL>, indicando que MYSQL est listo para un
nuevo comando.
Es importante saber qu significan los prompts '> y ">, dado que si introduces por error
un string sin cerrar, cualquier otra lnea que introduzcas sern ignoradas por MYSQL
- !incluyendo una lnea que contenga QUIT! Esto puede ser bastante confuso,
especialmente si no sabes que debes introducir la comilla de cierre antes de poder
cancelar el comando actual.
CREANDO Y USANDO UNA BASE DE DATOS
=======================================
Ahora que sabes como introducir comandos, es hora de acceder a la base de datos.
14

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
Supn que tienes varias mascotas en tu casa (tu pequeo "zoo") y que te gustara
llevar un control de varios tipos de informacin sobre estos animales. Puedes hacerlo
creando tablas que guarden tus datos y cargandolas con la informacin deseada.
Despus puedes responder a diferentes series de preguntas sobre tus animales
extrayendo los datos de las tablas. Esta seccin explica cmo hacer todo esto:
* Cmo crear una base de datos
* Cmo crear una tabla
* Cmo cargar los datos en la tabla
* Cmo extraer informacin de la tabla de varias maneras
* Cmo usar mltiples tablas
La base de datos del zoo ser simple (deliberadamente), pero no es difcil pensar en
situaciones del
mundo real en las que se pudiera utilizar una base de datos similar. Por ejemplo, se
podra usar una base de datos como sta en una granja para llevar un control del
ganado, o por un veterinario para controlar el historial de sus pacientes.
Usa la sentencia SHOW para averiguar qu bases de datos existen actualmente en el
servidor:
MYSQL> SHOW DATABASES;
+----------+
| Database |
+----------+
| MYSQL |
| test |
+----------+
Probablemente, la lista de las bases de datos ser diferente en tu mquina, pero las
bases de datos
MYSQL y test es probable que se encuentren en esa lista. Se requiere la base de
datos MYSQL pues describe los privilegios de acceso de los usuarios. La base de
datos test se ofrece como campo de pruebas para que los usuarios prueben ah sus
teoras.
Si la base de datos test existe, intenta acceder a ella:
MYSQL> USE test
Database changed
Observa que USE, como QUIT, no requiere un punto y coma. (Puedes
terminar este tipo de sentencias con un punto y coma si quieres, pero no es
necesario.) La sentencia USE es especial en otro sentido, tambin: debe ser
tecleada en una sola lnea.
Puedes usar la base de datos test (si tienes acceso a ella) para los ejemplos que
siguen, pero cualquier cosa que crees en dicha base de datos puede ser eliminada por
cualquiera que tenga acceso a ella. Por esta razn, deberas pedir a tu administrador
MYSQL permisos para usar una base de datos propia. Suponte que le quieres llamar
zoo. El administrador necesitar ejecutar entonces la siguiente orden:
MYSQL> GRANT ALL ON zoo.* TO tu_nombre;
15

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
donde tu_nombre es el nombre de usuario MYSQL que tengas asignado.
ejemplo:
MYSQL> GRANT ALL ON zoo.* TO chessy@localhost;
Query OK, 0 rows affected (0.08 sec)
Creando y seleccionando una base de datos
===========================================
Si el administrador cre la base de datos para t cuando te configur los permisos,
puedes comenzar
a usarla. En otro caso, debers crearla t mismo:
[chessy@bishito chessy]$ MYSQL -u chessy
Welcome to the MYSQL monitor. Commands end with ; or \g.
Your MYSQL connection id is 6 to server version: 3.22.23b
Type 'help' for help.
MYSQL> CREATE DATABASE zoo;
Query OK, 1 row affected (0.02 sec)
Bajo Unix, los nombres de bases de datos son sensibles a las
maysculas/minsculas (a diferencia de los comandos SQL), as que debers
referirte siempre a tu base de datos con el nombre zoo, no como Zoo, ZOO o
cualquier otra variante. Es es as tambin para las tablas. (Bajo Windows,
esta restriccin desaparece, aunque deberas referirte a las bases de datos
y a las tablas usando la misma sintaxis en tus consultas.)
Crear una base de datos no la selecciona para su uso, debes hacerlo explcitamente.
Para hacer que la base de datos zoo sea tu base de datos de trabajo, usa el comando:
MYSQL> USE zoo;
Database changed
Tu base de datos slo necesita ser creada una vez, pero debes seleccionarla para
usarla cada vez que comiences una sesin MYSQL. Puedes hacerlo lanzando un
comando USE como se ha visto en el ejemplo. Alternativamente, puedes seleccionar
la base de datos desde la lnea de comandos cuando lanzas MYSQL. Simplemente
especifica su nombre tras los parmetros de conexin que hayas escrito. Por ejemplo:
shell> MYSQL -h host -u user -p zoo
Enter password: ********
Observa que en la lnea de comandos del ejemplo, zoo no es tu password. Si quieres
introducir tu password como parmetro en la lnea de comandos tras la opcin -p,
debes hacerlo sin teclear un espacio en blanco intermedio (es decir, como
-pmi_password, no como -p mi_password). Sin embargo, no es recomendable poner tu
password en la lnea de comandos, pues hacerlo lo expone a posibles miradas de
otros usuarios conectados a tu mquina.
Creando una tabla
16

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
============================
Crear una tabla es la parte fcil, pero hasta este momento est vaca, como te dice la
orden SHOW
TABLES:
MYSQL> SHOW TABLES;
Empty set (0.00 sec)
La parte ms dura consiste en decidir cual va a ser la estructura de tu base de datos:
qu tablas necesitars, y qu columnas tendr cada una de ellas.
Querrs seguramente una tabla que contenga un registro por cada una de tus
mascotas. Esta tabla
puede llamarse mascotas, y debera contener, como mnimo, el nombre de cada
animal. Dado que el nombre por s solo no es muy interesante, la tabla debera
contener otra informacin. Por ejemplo,
si ms de una persona de tu familia tiene mascotas, probablemente quieras listar el
propietario de cada animal. Tambin querrs guardar informacin descriptiva bsica
como puede ser la especie y el sexo de cada mascota.
?Qu pasa con la edad? Podra ser de inters, pero no es una buena cosa a guardar
en una base de datos. La edad cambia a medida que pasa el tiempo, lo que significa
que tendrs que actualizar tus registros a menudo. En vez de eso, es mejor almacenar
un valor fijo como la edad de nacimiento. Despus, cada vez que necesites saber la
edad, puedes calcularla como la diferencia entre la fecha actual y la fecha de
nacimiento. MYSQL ofrece funciones para realizar clculos aritmticos entre fechas,
por lo que esto no es difcil. Almacenar la fecha de nacimiento en lugar de la edad
tiene tambin otras ventajas:
* Puedes usar la base de datos para generar recordatorios de cumpleaos de
mascotas. (Si crees que este tipo de consulta es algo tonta, observa que es la misma
pregunta que necesitars hacer en el contexto de una base de datos de un negocio
para identificar clientes a los que pronto necesitars
mandar un saludo por su cumpleaos, para ese toque personal asistido por
ordenador :-)
* Puedes calcular la edad en relacin a fechas distintas a la fecha actual. Por ejemplo,
si almacenas la fecha de muerte en la base de datos, puedes calcular fcilmente lo
vieja que era una mascota cuando muri.
Seguramente puedas pensar en otros tipos de informacin que sera til en la tabla
mascota, pero los identificados hasta ahora son suficientes por el momento: nombre,
propietarios, especie, sexo, fecha de nacimiento y muerte.
Usa una sentencia CREATE TABLE para especificar la estructura de tu tabla:
MYSQL> CREATE TABLE mascota (nombre VARCHAR(20), propietario
VARCHAR(20),
-> especie VARCHAR(20), sexo CHAR(1), nacimiento DATE, muerte DATE);
VARCHAR es una buena eleccin para las columnas nombre, propietario y especie
dado que los valores de estas columnas variarn su longitud. Las longitudes de estas
columnas no necesitan ser iguales, y no necesitan ser 20. Puedes elegir cualquier
longitud entre 1 y 255, cualquiera que te parezca razonable. (Si realizar una eleccin
17

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
pobre y resulta que ms adelante necesitas un campo mayor, MYSQL ofrece una
sentencia ALTER TABLE.)
El sexo del animal puede ser representado en una variedad de formas, por ejemplo,
"m" y "f", o quizs "masculino" y "femenino". Es ms simple usar un nico caracter, "m"
"f".
El uso del tipo de datos DATE para las columnas de nacimiento y muerte es una
opcin bastante obvia.
Ahora que ya has creado una tabla, SHOW TABLES debera producir alguna salida:
MYSQL> SHOW TABLES;
+---------------+
| Tables in zoo |
+---------------+
| mascota
|
+---------------+
Para verificar que tu tabla fue creada de la forma que esperabas, usa una sentencia
DESCRIBE:
MYSQL> DESCRIBE mascota;
+-------------+-------------+------+-----+---------+-------+
| Field
| Type
| Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| nombre
| varchar(20) | YES | | NULL |
|
| propietario | varchar(20) | YES | | NULL |
|
| especie | varchar(20) | YES | | NULL |
|
| sexo
| char(1) | YES | | NULL |
|
| nacimiento | date
| YES | | NULL |
|
| muerte
| date
| YES | | NULL |
|
+-------------+-------------+------+-----+---------+-------+
Puedes usar DESCRIBE en cualquier momento, por ejemplo, si olvidas los nombres
de las columnas de tu tabla o a qu tipo de datos pertenecen.

Cargando datos en una tabla


=====================================
Una vez creada tu tabla, necesitas poblarla. Las sentencias LOAD DATA e INSERT
son tiles para esto.
Suponte que tus registros de mascotas pueden ser descritos como se muestra ms
abajo. (Observa que MYSQL espera que las fechas se introduzcan en formato AAAAMM-DD; esto podra ser diferente a lo que ests acostumbrado.)
nombre
Fluffy
Claws
Buffy
Fang
Bowser

propietario
Harold
Gwen
Harold
Benny
Diane

especie
gato
gato
perro
perro
perro

m
f
m
m
18

sexo nacimiento
muerte
f
1993-02-04
1994-03-17
1989-05-13
1990-08-27
1998-08-31
1995-07-29

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
Chirpy
Whistler
Slim

Gwen
Gwen
Benny

pjaro
pjaro
serpiente

1998-09-11
1997-12-09
m
1996-04-29

Dado que ests comenzando con una tabla vaca, una forma sencilla de poblarla
consiste en crear un fichero de texto conteniendo una fila para cada uno de tus
animales, y despus cargar el contenido del fichero en la tabla con una sola sentencia.
Puedes crear un fichero de texto "mascota.txt" conteniendo un registro por lnea, con
valores separados por tabuladores, y dados en el orden en el que las columnas fueron
listadas en la sentencia CREATE TABLE. Para valores perdidos (como sexos
desconocidos, o fechas de muerte de animales que an estn vivos), puedes usar
valores NULL. Para representar estos en tu fichero de texto, use \N. Por ejemplo, el
registro para Whistler el pjaro sera algo como esto (donde el espacio en blanco entre
valores es un simple carcter de tabulacin):
Whistler Gwen

pjaro

\N

1997-12-09

\N

Para cargar el fichero de texto "mascota.txt" en la tabla mascota, usa este comando:
MYSQL> LOAD DATA LOCAL INFILE "mascota.txt" INTO TABLE mascota;
Puedes especificar el valor de separacin de columna y el marcador de final de lnea
explcitamente en la sentencia LOAD DATA si lo deseas, pero por defecto equivalen a
TAB y LF (intro). Estos valores por defecto son suficientes para que la sentencia que
lee el fichero "mascota.txt" funcione
correctamente.
Cuando quieras aadir nuevos registros uno a uno, la sentencia INSERT es muy til.
En su forma ms simple, ofreces valores para cada columna, en el orden en el que las
columnas fueron listadas en la sentencia CREATE TABLE. Supn que Diane consige
un nuevo hamster llamado Puffball. Podras aadir un nuevo registro usando una
sentencia INSERT como esta:
MYSQL> INSERT INTO mascota
-> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
Observa que los valores string y fecha se espefican encerrados entre comillas.
Observa tambin que, con INSERT, puedes insertar NULL directamente para
representar un valor perdido. No usamos \N como hacamos con LOAD DATA.
De este ejemplo, deberas ser capaz de ver que hubiera dido mucho ms costoso
teclear todos los datos necesarios en la tabla mascota con sentencias INSERT que
hacerlo como lo hemos hecho con una nica sentencia LOAD DATA.
Extrayendo informacin de una tabla
===============================================
La sentencia SELECT se usa para recabar informacin de una tabla. La forma general
de la sentencia es:
SELECT qu_seleccionar
FROM de_qu_tabla
WHERE condiciones_a_satisfacer
19

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
qu_seleccionar indica qu es lo que quieres seleccionar. Puede ser una lista de
columnas, o * para indicar "todas las columnas". de_qu_tabla indica la tabla de la que
quieres extraer datos. La clasula WHERE es opcional. Si est presente,
condiciones_a_satisfacer especifica las condiciones que las filas deben cumplir para
estar presentes en el resultado de la seleccin.
Seleccionando todos los datos
=======================================
La forma ms simple de SELECT recoge toda la informacin de una tabla:
MYSQL> SELECT * FROM mascota;
+----------+-------------+-----------+------+------------+------------+
| nombre | propietario | especie | sexo | nacimiento | muerte |
+----------+-------------+-----------+------+------------+------------+
| Bluffy | Harold | gato
| f | 1993-02-04 | NULL
|
| Claws | Gwen
| gato
| m | 1994-03-17 | NULL
|
| Buffy | Harold | perro | f | 1989-05-13 | NULL
|
| Fang | Benny
| perro | m | 1990-08-27 | NULL
|
| Bowser | Diane
| perro | m | 1998-08-31 | 1995-07-29 |
| Chirpy | Gwen
| pjaro | f | 1998-09-11 | NULL
|
| Whistler | Gwen
| pjaro | NULL | 1997-12-09 | NULL
|
| Slim | Benny
| serpiente | m | 1996-04-29 | NULL
|
| Puffball | Diane
| hamster | f | 1999-03-30 | NULL
|
+----------+-------------+-----------+------+------------+------------+
Esta forma de SELECT es til si quieres revisar tu tabla al completo, por ejemplo, tras
haberla cargado con tu conjunto inicial de datos. Como suele suceder, la salida ya
muestra un error en tu fichero de datos: Bowser !parece haber nacido tras su muerte!
Consultando tus papeles originales sobre el pedigree del perro, descubres que la
fecha correcta de nacimiento es 1989, no 1998.
Existen al menos un par de maneras de arreglar esto:
* Edita el fichero "mascota.txt" para corregir el error, despus vaca la tabla y vuelve a
cargarla usando DELETE y LOAD DATA:
MYSQL> DELETE from mascota;
MYSQL> LOAD DATA LOCAL INFILE "mascota.txt" INTO TABLE mascota;
Sin embargo, si haces esto, debes re-escribir el registro para Puffball.
* Arreglar slo el registro errneo con la sentencia UPDATE:
MYSQL>
UPDATE
nombre="Bowser";

mascota

SET

nacimiento="1989-08-31"

WHERE

Como se muestra ms arriba, es fcil recuperar el cuerpo de una data. Pero


tpicamente no querrs hacer eso, en particular cuando la tabla sea muy larga.
Generalmente, estars ms interesado en responder a una pregunta en particular, en
cuyo caso debers especificar algunas restricciones en la informacin que deseas.
Veamos algunas consultas de seleccin en trminos de preguntas sobre tus mascotas
que se deben responder.
Seleccionando filas en particular
20

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
=====================================
Puedes seleccionar slo filas en particular de tu tabla. Por ejemplo, si quieres verificar
el cambio que has realizado a la fecha de nacimiento de Bowser, selecciona el registro
de Bowser de la siguiente forma:
MYSQL> SELECT * FROM mascota WHERE nombre="Bowser";
+--------+-------------+---------+------+------------+------------+
| nombre | propietario | especie | sexo | nacimiento | muerte |
+--------+-------------+---------+------+------------+------------+
| Bowser | Diane
| perro | m | 1989-08-31 | 1995-07-29 |
+--------+-------------+---------+------+------------+------------+
La salida confirma que el ao est correctamente registrado como 1989, no 1998.
Las comparaciones de cadenas de texto son normalmente insensibles a las
maysculas/minsculas, por lo que puedes especificar el nombre como "bowser",
"BOWSER", etc. El resultado de la consulta ser el mismo.
Puedes especificar condiciones en cualquier columna, no slo el nombre. Por ejemplo,
si quisieras saber qu animales nacieron a partir de 1998, examina la columna
nacimiento:
MYSQL> SELECT * FROM mascota WHERE nacimiento >= "1998-1-1";
+----------+-------------+---------+------+------------+--------+
| nombre | propietario | especie | sexo | nacimiento | muerte |
+----------+-------------+---------+------+------------+--------+
| Chirpy | Gwen
| pjaro | f | 1998-09-11 | NULL |
| Puffball | Diane
| hamster | f | 1999-03-30 | NULL |
+----------+-------------+---------+------+------------+--------+
Puedes combinar condiciones, por ejemplo, para localizar los perros hembra:
MYSQL> SELECT * FROM mascota WHERE especie="perro" AND sexo="f";
+--------+-------------+---------+------+------------+--------+
| nombre | propietario | especie | sexo | nacimiento | muerte |
+--------+-------------+---------+------+------------+--------+
| Buffy | Harold | perro | f | 1989-05-13 | NULL |
+--------+-------------+---------+------+------------+--------+
La consulta anterior usa el operador lgico AND. Existe tambin un operador OR:
MYSQL> SELECT * FROM mascota WHERE especie="serpiente"
especie="pjaro";
+----------+-------------+-----------+------+------------+--------+
| nombre | propietario | especie | sexo | nacimiento | muerte |
+----------+-------------+-----------+------+------------+--------+
| Chirpy | Gwen
| pjaro | f | 1998-09-11 | NULL |
| Whistler | Gwen
| pjaro | NULL | 1997-12-09 | NULL |
| Slim | Benny
| serpiente | m | 1996-04-29 | NULL |
+----------+-------------+-----------+------+------------+--------+

OR

AND y OR pueden entremezclarse. Si lo haces, es una buena idea el utilizar


parntesis para indicar cmo deberan agruparse las condiciones:
21

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
MYSQL> SELECT * FROM mascota WHERE (especie="gato" AND sexo="m")
-> OR (especie="perro" AND sexo="f");
+--------+-------------+---------+------+------------+--------+
| nombre | propietario | especie | sexo | nacimiento | muerte |
+--------+-------------+---------+------+------------+--------+
| Claws | Gwen
| gato | m | 1994-03-17 | NULL |
| Buffy | Harold | perro | f | 1989-05-13 | NULL |
+--------+-------------+---------+------+------------+--------+
Seleccionando columnas en particular
===================================================
Si no quieres ver filas completas de tu tabla, simplemente nombra las columnas en las
cuales ests interesado, separadas por comas. Por ejemplo, si quieres saber cundo
nacieron tus animales, selecciona las columnas nombre y nacimiento:
MYSQL> SELECT nombre, nacimiento FROM mascota;
+----------+------------+
| nombre | nacimiento |
+----------+------------+
| Bluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Buffy | 1989-05-13 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+
Para averiguar quin posee mascotas, usa esta consulta:
MYSQL> SELECT propietario FROM mascota;
+-------------+
| propietario |
+-------------+
| Harold |
| Gwen
|
| Harold |
| Benny
|
| Diane
|
| Gwen
|
| Gwen
|
| Benny
|
| Diane
|
+-------------+
Sin embargo, observa que la consulta simplemente obtiene el campo propietario de
cada registro, y algunos de ellos aparecen ms de una vez. Para minimizar la salida,
obtn cada registro de salida nico una sola vez aadiendo la palabra reservada
DISTINCT:
MYSQL> SELECT DISTINCT propietario FROM mascota;
22

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
+-------------+
| propietario |
+-------------+
| Benny
|
| Diane
|
| Gwen
|
| Harold |
+-------------+
Puedes usar una clasula WHERE para combinar la seleccin de filas con la seleccin
de columnas. Por ejemplo, para conseguir slo las fechas de nacimiento de perros y
gatos, usa esta consulta:
MYSQL> SELECT nombre, especie, nacimiento FROM mascota
-> WHERE especie = "perro" OR especie = "gato";
+--------+---------+------------+
| nombre | especie | nacimiento |
+--------+---------+------------+
| Bluffy | gato | 1993-02-04 |
| Claws | gato | 1994-03-17 |
| Buffy | perro | 1989-05-13 |
| Fang | perro | 1990-08-27 |
| Bowser | perro | 1989-08-31 |
+--------+---------+------------+
Ordenando filas
===========================
Tal vez hayas observado que en los ejemplos anteriores las filas del resultado se
muestran sin ningn tipo de orden en particular. Sin embargo, a menudo es ms fcil
de examinar la salida de una consulta cuando las filas estn ordenadas de alguna
manera en particular. Para ordenar un resultado, usa la clasula ORDER BY.
Aqu mostramos las fechas de nacimiento de los animales, ordenadas por fecha:
MYSQL> SELECT nombre, nacimiento FROM mascota ORDER BY nacimiento;
+----------+------------+
| nombre | nacimiento |
+----------+------------+
| Buffy | 1989-05-13 |
| Bowser | 1989-08-31 |
| Fang | 1990-08-27 |
| Bluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Slim | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+
Para ordenar de forma inversa, aade la palabra reservada DESC (descendente) al
nombre de la columna por la que ests ordenando:
MYSQL> SELECT nombre, nacimiento FROM mascota ORDER BY nacimiento DESC;
+----------+------------+
23

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
| nombre | nacimiento |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Claws | 1994-03-17 |
| Bluffy | 1993-02-04 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Buffy | 1989-05-13 |
+----------+------------+
Puedes ordenar por mltiples columnas. Por ejemplo, para ordenar por tipo de animal,
despus por fecha de nacimiento dentro del mismo tipo de animal estando los
animales ms jvenes primero, usa la siguiente consulta:
MYSQL> SELECT nombre, especie, nacimiento FROM mascota ORDER BY
especie, nacimiento DESC;
+----------+-----------+------------+
| nombre | especie | nacimiento |
+----------+-----------+------------+
| Claws | gato
| 1994-03-17 |
| Bluffy | gato
| 1993-02-04 |
| Puffball | hamster | 1999-03-30 |
| Chirpy | pjaro | 1998-09-11 |
| Whistler | pjaro | 1997-12-09 |
| Fang | perro | 1990-08-27 |
| Bowser | perro | 1989-08-31 |
| Buffy | perro | 1989-05-13 |
| Slim | serpiente | 1996-04-29 |
+----------+-----------+------------+
Observa que la palabra reservada DESC se aplica slo al nombre de columna que
preceda a la palabra reservada (nacimiento); los valores especie siguen siendo
ordenados en forma ascendente.
Clculos de fecha
============================
MYSQL ofrece muchas funciones que puedes usar para realizar clculos con fechas,
por ejemplo, para calcular edades o extraer partes de fechas.
Para determinar cuantos aos tiene cada una de tus mascotas, puedes calcular la
edad como la diferencia entre la fecha de nacimiento y la fecha actual. Puedes hacerlo
convirtiendo las dos fechas a dias, coge la diferencia, y divdela por 365 (el nmero de
dias en un ao):
MYSQL> select nombre, (TO_DAYS(NOW())-TO_DAYS(nacimiento))/365 FROM
mascota;
+----------+------------------------------------------+
| nombre | (TO_DAYS(NOW())-TO_DAYS(nacimiento))/365 |
+----------+------------------------------------------+
| Bluffy |
6.94 |
| Claws |
5.83 |
24

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
| Buffy |
10.68 |
| Fang |
9.39 |
| Bowser |
10.38 |
| Chirpy |
1.34 |
| Whistler |
2.10 |
| Slim |
3.71 |
| Puffball |
0.79 |
+----------+------------------------------------------+
Aunque la consulta funcione, existen algunos puntos que podran ser mejorados.
Primero, el resultado podra ser revisado ms fcilmente si las filas se presentaran
ordenadas de alguna manera. Segundo, la cabecera de la columna edad no es muy
significativa.
El primer problema puede ser solucionado aadiendo una clusula ORDER BY
nombre para ordenar la salida por nombre. Para arreglar el tema del encabezamiento
de columna, puedes darle un nombre a dicha columna de tal forma que aparezca una
etiqueta diferente en la salida (esto es lo que se llama un alias de columna):
MYSQL> select nombre, (TO_DAYS(NOW())-TO_DAYS(nacimiento))/365 AS edad
-> FROM mascota ORDER BY nombre;
+----------+-------+
| nombre | edad |
+----------+-------+
| Bluffy | 6.94 |
| Bowser | 10.38 |
| Buffy | 10.68 |
| Chirpy | 1.34 |
| Claws | 5.83 |
| Fang | 9.39 |
| Puffball | 0.79 |
| Slim | 3.71 |
| Whistler | 2.10 |
+----------+-------+
Para ordenar la salida por edad en lugar de por nombre, puedes hacerlo usando
simplemente una clusula ORDER BY diferente:
MYSQL> select nombre, (TO_DAYS(NOW())-TO_DAYS(nacimiento))/365 AS edad
-> FROM mascota ORDER BY edad;
+----------+-------+
| nombre | edad |
+----------+-------+
| Puffball | 0.79 |
| Chirpy | 1.34 |
| Whistler | 2.10 |
| Slim | 3.71 |
| Claws | 5.83 |
| Bluffy | 6.94 |
| Fang | 9.39 |
| Bowser | 10.38 |
| Buffy | 10.68 |
+----------+-------+

25

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
Puede usarse una consulta similar para determinar la edad de la muerte para los
animales que hayan muerto. Puedes determinar qu animales son estos comprobando
si el valor muerte es NULL o no. Despus, para aquellos que no tengan un valor NULL,
calcular la diferencia entre los valores muerte y nacimiento:
MYSQL> select nombre, nacimiento, muerte,
-> (TO_DAYS(NOW())-TO_DAYS(nacimiento))/365 AS edad
-> FROM mascota WHERE muerte IS NOT NULL ORDER BY edad;
+--------+------------+------------+-------+
| nombre | nacimiento | muerte | edad |
+--------+------------+------------+-------+
| Bowser | 1989-08-31 | 1995-07-29 | 10.38 |
+--------+------------+------------+-------+
La consulta usa muerte IS NOT NULL en lugar de muerte != NULL dado que
NULL es un valor especial. Esto se explica ms adelante. [Puedes consultar
la seccin [Working with NULL] del manual de MYSQL.
?Qu haras si quisieras saber qu animales cumplen aos el mes que viene? Para
este tipo de clculos, ao y da son irrelevantes, simplemente querrs extraer la parte
mes de la columna nacimiento. MYSQL ofrece muchas funciones de extraccin de
parte-de-fecha, como YEAR(),MONTH() y DAY(). La funcin apropiada para nuestro
problema es MONTH(). Para ver cmo funciona, ejecuta una consulta rpida que
muestre el valor de la fecha de nacimiento y el mes de nacimiento
(MONTH(nacimiento)):

MYSQL> SELECT nombre, nacimiento, MONTH(nacimiento) FROM mascota;


+----------+------------+-------------------+
| nombre | nacimiento | MONTH(nacimiento) |
+----------+------------+-------------------+
| Bluffy | 1993-02-04 |
2|
| Claws | 1994-03-17 |
3|
| Buffy | 1989-05-13 |
5|
| Fang | 1990-08-27 |
8|
| Bowser | 1989-08-31 |
8|
| Chirpy | 1998-09-11 |
9|
| Whistler | 1997-12-09 |
12 |
| Slim | 1996-04-29 |
4|
| Puffball | 1999-03-30 |
3|
+----------+------------+-------------------+
Buscar animales que hayan nacido en el mes prximo es tambin sencillo de realizar.
Suponte que Abril es el mes actual. Entonces el valor del mes es 4 y lo que buscas
son animales nacidos en Mayo (mes 5):
MYSQL> SELECT nombre, nacimiento FROM mascota WHERE MONTH(nacimiento)
= 5;
+--------+------------+
| nombre | nacimiento |
+--------+------------+
| Buffy | 1989-05-13 |
26

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
+--------+------------+
Existe una pequea complicacin si el mes actual es Diciembre, por supuesto. No
puedes aadir simplemente uno al nmero de mes (12) y buscar animales nacidos en
el mes 13, dado que no existe tal mes. En lugar de eso, debes buscar animales
nacidos en Enero (mes 1).
Puedes escribir la consulta de tal forma que funcione independientemente del mes en
el que estemos. De esa forma no tendrs que usar un nmero de mes en particular en
la consulta. DATE_ADD() te permite aadir un intervalo de tiempo a una fecha dada. Si
aades un mes al valor de NOW(), y despus extraes la parte del mes con MONTH(),
el resultado produce el mes del cumpleaos que buscamos:
MYSQL> select NOW();
+---------------------+
| NOW()
|
+---------------------+
| 2000-01-13 18:13:09 |
+---------------------+
MYSQL> SELECT nombre, nacimiento FROM mascota
-> WHERE MONTH(nacimiento) = MONTH(DATE_ADD(NOW(),INTERVAL 1
MONTH));
+--------+------------+
| nombre | nacimiento |
+--------+------------+
| Bluffy | 1993-02-04 |
+--------+------------+
Una manera diferente de conseguir los mismos resultados es aadir 1 al mes actual
para conseguir el mes siguiente (tras usar la funcin mdulo (MOD) para convertir el
valor de mes actual en 0 si estamos en Diciembre (mes 12)):
MYSQL> SELECT nombre, nacimiento FROM mascota
-> WHERE MONTH(nacimiento) = MOD(MONTH(NOW()),12) +1;
+--------+------------+
| nombre | nacimiento |
+--------+------------+
| Bluffy | 1993-02-04 |
+--------+------------+
TRABAJANDO CON VALORES NULL
=======================================
Los valores NULL pueden sorprenderte hasta que te acostumbras a usarlos.
Conceptualmente, NULL significa "valor perdido" o "valor desconocido" y se trata de
forma diferente que otros valores. Para realizar comparaciones respecto a NULL, no
puedes utilizar los operadores de comparacin aritmticos como =, < o != . Puedes
realizar una demostracin de esto, prueba la siguiente consulta:
MYSQL> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
27

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
+----------+-----------+----------+----------+
| NULL |
NULL | NULL | NULL |
+----------+-----------+----------+----------+
Ciertamente, de estas comparaciones no se pueden extraer resultados significativos.
Para conseguirlo, usa los operadores IS NULL y IS NOT NULL:
MYSQL> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
|
0|
1|
+-----------+---------------+
En MYSQL, 0 significa falso y 1 significa VERDADERO.
Este tratamiento especial de NULL fue la causa de que en la seccin anterior fuera
necesario determinar qu animales ya no vivan usando "muerte IS NOT NULL" en
lugar de "muerte != NULL".
Asociacin/Coincidencia de patrones (PATTERN MATCHING)
==========================================================
MYSQL ofrece las caractersticas de asociacin de patrones estndar as como una
forma de coincidencia de patrones basadas en expresiones regulares extendidas
similares a las usadas por utilidades UNIX como vi, grep y sed.
La asociacin de patrones SQL te permite usar '_' para asociar cualquier caracter
simple, y '%' para asociar un nmero arbitrario de caracteres (incluyendo cero
caracteres). Los patrones SQL no toman en cuenta las diferencias entre maysculas y
minsculas. Se muestran debajo algunos ejemplos. Observa que no se utiliza = o != en
el trabajo con patrones SQL; utiliza en su lugar los operadores de comparacin LIKE o
NOT LIKE.
Para buscar nombres que comienzan por "b":
MYSQL> SELECT * FROM mascota WHERE nombre LIKE "b%";
+--------+-------------+---------+------+------------+------------+
| nombre | propietario | especie | sexo | nacimiento | muerte |
+--------+-------------+---------+------+------------+------------+
| Bluffy | Harold | gato | f | 1993-02-04 | NULL
|
| Buffy | Harold | perro | f | 1989-05-13 | NULL
|
| Bowser | Diane
| perro | m | 1989-08-31 | 1995-07-29 |
+--------+-------------+---------+------+------------+------------+
Para buscar nombres que terminen por "fy":
MYSQL> SELECT * FROM mascota WHERE nombre LIKE "%fy";
+--------+-------------+---------+------+------------+--------+
| nombre | propietario | especie | sexo | nacimiento | muerte |
+--------+-------------+---------+------+------------+--------+
| Bluffy | Harold | gato | f | 1993-02-04 | NULL |
| Buffy | Harold | perro | f | 1989-05-13 | NULL |
+--------+-------------+---------+------+------------+--------+
28

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
Para buscar nombres que contengan una "w":
MYSQL> SELECT * FROM mascota WHERE nombre LIKE "%w%";
+----------+-------------+---------+------+------------+------------+
| nombre | propietario | especie | sexo | nacimiento | muerte |
+----------+-------------+---------+------+------------+------------+
| Claws | Gwen
| gato | m | 1994-03-17 | NULL
|
| Bowser | Diane
| perro | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen
| pjaro | NULL | 1997-12-09 | NULL
|
+----------+-------------+---------+------+------------+------------+
Para buscar nombres de longitud cinco caracteres, usa el patrn "_" :
MYSQL> SELECT * FROM mascota WHERE nombre LIKE "_____";
+--------+-------------+---------+------+------------+--------+
| nombre | propietario | especie | sexo | nacimiento | muerte |
+--------+-------------+---------+------+------------+--------+
| Claws | Gwen
| gato | m | 1994-03-17 | NULL |
| Buffy | Harold | perro | f | 1989-05-13 | NULL |
+--------+-------------+---------+------+------------+--------+
El otro tipo de asociacin de patrones ofrecido por MYSQL utiliza expresiones
regulares extendidas. Cuando se realiza una comprobacin buscando una
coincidencia para este tipo de patrn, se deben usar los operadores REGEXP y NOT
REGEXP (o RLIKE y NOT RLIKE, dado que son sinnimos).
Algunas caractersticas de las expresiones regulares extendidas son:
* `.' se asocia con cualquier carcter (pero slo uno)
* Una clase de caracteres `[...]' se asocia con cualquier carcter contenido dentro de
los corchetes. Por ejemplo, `[abc]' se asocia con 'a', 'b'
* 'c'. Para nombrar un rango de caracteres, usa un guin. `[a-z]' se asocia con
cualquier letra en minscula, donde '[0-9]' se asocia con cualquier dgito.
* '*' se asocia con 0 o ms instancias de lo que preceda al asterisco. Por ejemplo,'a*'
coincide con cualquier nmero de a's,'[0-9]*' se asocia con cualquier nmero de
dgitos, y '.*' se asocia con cualquier cosa.
* Las expresiones regulares son sensibles a las maysculas/minsculas, pero puedes
utilizar una clase caracter para asociar ambos casos si los deseas. Por ejemplo, '[aA]'
coincide tanto con la letra a minscula como con la letra A mayscula y '[a-zA-Z]'
coincide con cualquier letra en cualquier modo mayscula/minscula.
* El patrn se asocia si ocurre en cualquier lugar dentro del valor a ser probado (los
patrones SQL coinciden slo si se asocian con el valor completo).
* Para anclar un patrn de manera que se busque la coincidencia bien al comienzo o
bien al final del valor a ser comprobado, usa '^' al comienzo del patrn o '$' al final del
patrn, respectivamente.
Para demostrar cmo funcionan las expresiones regulares, las consultas LIKE
mostradas antes son reescritas debajo para usar REGEXP:
29

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
Para buscar nombres que comiencen por "b", usa '^' para buscar la coincidencia al
comienzo del nombre y '[bB]' para buscar la asociacin tanto con la b minscula como
con la b mayscula:
MYSQL> SELECT * FROM mascota WHERE nombre REGEXP "^[bB]";
+--------+-------------+---------+------+------------+------------+
| nombre | propietario | especie | sexo | nacimiento | muerte |
+--------+-------------+---------+------+------------+------------+
| Bluffy | Harold | gato | f | 1993-02-04 | NULL
|
| Buffy | Harold | perro | f | 1989-05-13 | NULL
|
| Bowser | Diane
| perro | m | 1989-08-31 | 1995-07-29 |
+--------+-------------+---------+------+------------+------------+
Para buscar nombres que terminen por "fy", usa "$" para buscar la coincidencia al final
del nombre:
MYSQL> SELECT * FROM mascota WHERE nombre REGEXP "fy$";
+--------+-------------+---------+------+------------+--------+
| nombre | propietario | especie | sexo | nacimiento | muerte |
+--------+-------------+---------+------+------------+--------+
| Bluffy | Harold | gato | f | 1993-02-04 | NULL |
| Buffy | Harold | perro | f | 1989-05-13 | NULL |
+--------+-------------+---------+------+------------+--------+
Para buscar nombres que contengan una "w", utiliza "[wW]" para buscar la asociacin
tanto en maysculas como minsculas:

MYSQL> SELECT * FROM mascota WHERE nombre REGEXP "[wW]";


+----------+-------------+---------+------+------------+------------+
| nombre | propietario | especie | sexo | nacimiento | muerte |
+----------+-------------+---------+------+------------+------------+
| Claws | Gwen
| gato | m | 1994-03-17 | NULL
|
| Bowser | Diane
| perro | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen
| pjaro | NULL | 1997-12-09 | NULL
|
+----------+-------------+---------+------+------------+------------+
Dado que un patrn de una expresin regular se asocia si ocurre en cualquier lugar del
valor, no es necesario poner un caracter comodn en ningn lado del patrn para
conseguir que se asocie con el valor completo como haras si usaras un patrn SQL.
Para buscar nombres conteniendo exactamente cinco caracteres, usa "^" y "$" para
asociar el comienzo y el final de un nombre, y cinco instancias de "." entre ellos:
MYSQL> SELECT * FROM mascota WHERE nombre REGEXP "^.....$";
+--------+-------------+---------+------+------------+--------+
| nombre | propietario | especie | sexo | nacimiento | muerte |
+--------+-------------+---------+------+------------+--------+
| Claws | Gwen
| gato | m | 1994-03-17 | NULL |
| Buffy | Harold | perro | f | 1989-05-13 | NULL |
+--------+-------------+---------+------+------------+--------+

30

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
Tambin podras haber escrito la consulta anterior usando el operador '{n}' "repetir n
veces":
MYSQL> SELECT * FROM mascota WHERE nombre REGEXP "^.{5}$";
+--------+-------------+---------+------+------------+--------+
| nombre | propietario | especie | sexo | nacimiento | muerte |
+--------+-------------+---------+------+------------+--------+
| Claws | Gwen
| gato | m | 1994-03-17 | NULL |
| Buffy | Harold | perro | f | 1989-05-13 | NULL |
+--------+-------------+---------+------+------------+--------+
Contando filas
=====================
Las bases de datos son usadas a menudo para responder a la pregunta, "?cuantas
veces aparece un determinado tipo de datos en una tabla?". Por ejemplo, podras
querer saber cuntas mascotas tienes, o cuntas mascotas tiene cada propietario, o
podras querer realizar varios tipos de censos respecto a tus animales.
Contar el nmero total de animales que tienes es lo mismo que preguntar "?cuntas
filas hay en la tabla mascota?", dado que hay slo una fila por mascota. La funcin
COUNT() cuenta el nmero de resultados no-NULL (N.T.: ms adelante se indica una
consulta SQL en la que se cuenta el nmero de animales por sexo, y aparece el
smbolo NULL como parte de esa cuenta... lo cual invalida la afirmacin que precede a
este comentario!), as pues, la consulta a realizar para contar el nmero de animales
tiene la siguiente forma:
MYSQL> SELECT COUNT(*) FROM mascota;
+----------+
| COUNT(*) |
+----------+
|
9|
+----------+
Antes, conseguiste los nombres de las personas que poseen una mascota. Puedes
usar COUNT() para averiguar cuntas mascotas tiene cada propietario:
MYSQL> SELECT propietario, COUNT(*) FROM mascota GROUP BY propietario;
+-------------+----------+
| propietario | COUNT(*) |
+-------------+----------+
| Benny
|
2|
| Diane
|
2|
| Gwen
|
3|
| Harold |
2|
+-------------+----------+
Observa el uso de GROUP BY para agrupar todos los registros de cada propietario. Si
no lo hubiramos puesto, todo lo que conseguiras sera un mensaje de error:
MYSQL> SELECT propietario, COUNT(propietario) FROM mascota;
ERROR 1140: Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP
columns is illegal if there is no GROUP BY clause
31

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
COUNT() y GROUP BY son tiles para la caracterizacin de tus datos de varias
formas. Los siguientes ejemplos muestran difentes maneras para realizar operaciones
de censo animal.
Nmero de animales por especies:
MYSQL> SELECT especie, COUNT(*) FROM mascota GROUP BY especie;
+-----------+----------+
| especie | COUNT(*) |
+-----------+----------+
| gato
|
2|
| hamster |
1|
| pjaro |
2|
| perro |
3|
| serpiente |
1|
+-----------+----------+
Nmero de animales por sexo:
MYSQL> SELECT sexo , COUNT(*) FROM mascota GROUP BY sexo;
+------+----------+
| sexo | COUNT(*) |
+------+----------+
| NULL |
1|
|f |
4|
|m |
4|
+------+----------+
(En este resultado, NULL indica "sexo desconocido")
El nmero de animales por combinacin de especies y sexo:
MYSQL> SELECT especie , sexo, COUNT(*) FROM mascota GROUP BY especie,
sexo;
+-----------+------+----------+
| especie | sexo | COUNT(*) |
+-----------+------+----------+
| gato
|f |
1|
| gato
|m |
1|
| hamster | f |
1|
| pjaro | NULL |
1|
| pjaro | f |
1|
| perro | f |
1|
| perro | m |
2|
| serpiente | m |
1|
+-----------+------+----------+
No necesitas recuperar una tabla completa cuando uses COUNT(). Por ejemplo, la
consulta anterior, cuando se realiza slo sobre perros y gatos, se escribe as:
MYSQL> SELECT especie , sexo, COUNT(*) FROM mascota
-> WHERE especie = "perro" OR especie = "gato"
-> GROUP BY especie, sexo;
+---------+------+----------+
| especie | sexo | COUNT(*) |
32

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
+---------+------+----------+
| gato | f |
1|
| gato | m |
1|
| perro | f |
1|
| perro | m |
2|
+---------+------+----------+
O, si quieres conocer el nmero de animales por sexo slo para animales de sexo
conocido:
MYSQL> SELECT especie , sexo, COUNT(*) FROM mascota
-> WHERE sexo IS NOT NULL
-> GROUP BY especie, sexo;
+-----------+------+----------+
| especie | sexo | COUNT(*) |
+-----------+------+----------+
| gato
|f |
1|
| gato
|m |
1|
| hamster | f |
1|
| pjaro | f |
1|
| perro | f |
1|
| perro | m |
2|
| serpiente | m |
1|
+-----------+------+----------+
Usando ms de una tabla
=============================
La tabla mascota guarda datos sobre las mascotas que posees. Si quieres guardar
otra informacin sobre ellos, como eventos en sus vidas, visitas al veterinario o cundo
han tenido hermanos, necesitas otra tabla. ?Cmo debera ser esta otra tabla?
* Deber contener el nombre de la mascota de tal forma que pudieras saber a qu
animal corresponde cada evento almacenado en la misma.
* Necesitar una fecha para conocer cundo ocurri el evento.
* Necesitar un campo para describir el evento
* Si quieres ser capaz de categorizar los eventos, sera til tener un campo de tipo
evento.
Dadas estas consideraciones, la sentencia CREATE TABLE para la tabla "evento" se
parecera a esto:
MYSQL> CREATE TABLE evento (nombre VARCHAR(20), fecha DATE,
-> tipo VARCHAR(15), anotacin VARCHAR(255));
Como ocurra con la tabla mascota, es ms fcil cargar los registros iniciales creando
un fichero de texto delimitado por tabuladores conteniendo la informacin:
Fluffy
Buffy
Buffy

1995-05-15
1993-06-23
1994-06-19

parto 4 cachorros, 3 hembras, 1 macho


parto 5 cachorros, 2 hembras, 3 machos
parto 3 cachorros, 3 hembras
33

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
Chirpy
Slim
Bowser
Fang
Fang
Claws
Whistler

1999-03-21 veterinario
necesit un enderezamiento de pico
1997-08-03 veterinario
costilla rota
1991-10-12 perrera
__________________
1991-10-12 perrera
__________________
1998-08-28 cumpleaos Se le regala un nuevo juguete de goma
1998-03-17 cumpleaos Se le regala un nuevo collar de pulgas
1998-12-09 cumpleaos Primer cumpleaos

Carga los registros as:


MYSQL> LOAD DATA LOCAL INFILE "evento.txt" INTO TABLE evento;
Basndote en lo que has aprendido de las consultas que has ejecutado en la tabla
mascota, deberas ser capaz de realizar recuperaciones de datos en los registros de la
tabla "evento"; los principios son los mismos. ?Pero qu hacer cuando la tabla evento
no sea suficiente por s sola de responder a cuestiones que podras llegar a realizar?
Supn que quisieras averiguar las edades de cada mascota al tener cachorros. La
tabla evento indica cundo ha ocurrido esto, pero para calcular la edad de la madre,
necesitas su fecha de nacimiento. Dado que eso est almacenado en la tabla
mascota, necesitas ambas tablas para la consulta:

MYSQL> SELECT mascota.nombre , (TO_DAYS(fecha) - TO_DAYS(nacimiento))/365


AS edad, anotacin
-> FROM mascota, evento
-> WHERE mascota.nombre = evento.nombre AND tipo = "parto";
+--------+------+----------------------------------+
| nombre | edad | anotacin
|
+--------+------+----------------------------------+
| Fluffy | 2.27 | 4 cachorros, 3 hembras, 1 macho |
| Buffy | 4.12 | 5 cachorros, 2 hembras, 3 machos |
| Buffy | 5.10 | 3 cachorros, 3 hembras
|
+--------+------+----------------------------------+
Existen varios puntos que anotar sobre esta consulta:
* La clusula FROM lista dos tablas dado que la consulta necesita extraer informacin
de las dos.
* Cuando se combina la informacin de mltiples tablas, necesitas especificar cmo
pueden ser asociados los registros de una tabla con los registros de la otra. Esto es
fcil dado que ambas tienen una columna nombre (N.T.: nombre es una clave
extranjera). La consulta usa la clusula WHERE para combinar los registros de las
dos tablas basndose en los valores de nombre.
* Dado que la columna nombre aparece en ambas tablas, debes ser especfico sobre a
qu tabla te refieres cuando ests hablando de esa columna. Esto se realiza poniendo
el nombre de la tabla como prefijo de la columna.
No necesitas tener dos tablas diferentes para realizar un join (N.T.: operacin del
algebra relacional traducible por enlace). En algunas ocasiones es til realizar un join
de una tabla consigo misma, si quieres comparar registros de una tabla con otros
34

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
registros en la misma tabla. Por ejemplo, para buscar parejas de sexos entre tus
mascotas, puedes enlazar la tabla mascota consigo mismo para emaparejar machos y
hembras de las mismas especies:
MYSQL> SELECT p1.nombre, p1.sexo, p2.nombre, p2.sexo, p1.especie
-> FROM mascota AS p1, mascota AS p2
-> WHERE p1.especie = p2.especie AND p1.sexo = "f" AND p2.sexo = "m";
+--------+------+--------+------+---------+
| nombre | sexo | nombre | sexo | especie |
+--------+------+--------+------+---------+
| Fluffy | f | Claws | m | gato |
| Buffy | f | Fang | m | perro |
| Buffy | f | Bowser | m | perro |
+--------+------+--------+------+---------+
En esta consulta, especificamos un par de alias para el nombre de las tablas y ser
capaces as de referirnos a las columnas y saber en todo momento a qu instancia de
qu tabla se asocia cada referencia de columna.
Consiguiendo informacin sobre bases de datos y tablas
================================================================
?Qu ocurre si olvidas el nombre de una base de datos o de una tabla, o cul es la
estructura de una tabla dada (ejm. : ?cmo se llaman sus columnas?) MYSQL
soluciona este problema a travs de numerosas sentencias que ofrecen informacin
sobre las bases de datos y las tablas que soporta.
Ya hemos visto SHOW DATABASES, que lista las bases de datos gestionadas por el
servidor. Para averiguar qu base de datos est actualmente seleccionada, usa la
funcin DATABASE():
MYSQL> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| zoo
|
+------------+
Si an no has seleccionado ninguna base de datos, el resultado estar en blanco.
Para averiguar qu tablas contiene la base de datos actual (por ejemplo, cuando no
ests seguro sobre el nombre de una tabla), usa este comando:
MYSQL> SHOW TABLES;
+---------------+
| Tables in zoo |
+---------------+
| evento
|
| mascota
|
+---------------+
Si quieres averiguar la estructura de una tabla, el comando DESCRIBE te ser til;
muestra informacin sobre cada columna de una tabla:
35

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
MYSQL> DESCRIBE mascota;
+-------------+-------------+------+-----+---------+-------+
| Field
| Type
| Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| nombre
| varchar(20) | YES | | NULL |
|
| propietario | varchar(20) | YES | | NULL |
|
| especie | varchar(20) | YES | | NULL |
|
| sexo
| char(1) | YES | | NULL |
|
| nacimiento | date
| YES | | NULL |
|
| muerte
| date
| YES | | NULL |
|
+-------------+-------------+------+-----+---------+-------+
Field indica el nombre de la columna, Type es el tipo de datos para la columna, Null
indica si la columna puede contener o no valores NULL, Key indica si la columna est
indexada o no, y Default especifica el valor por defecto para la columna.
Si tienes ndices en una tabla, SHOW INDEX FROM nombre_tabla te mostrar
informacin sobre ellos.
Usando MYSQL en modo batch
=================================
En las secciones previas, hemos usado MYSQL interactivamente para
introducir consultas y observar los resultados. Tambin puedes ejecutar
MYSQL en modo batch. Para realizarlo, escribe los comandos que quieras
ejecutar en un fichero, despus pdele a MYSQL que lea su entrada desde el
fichero:
shell> MYSQL < fichero-batch
(N.T.: en algunos libros viene traducido como fichero por lotes)
Si necesitas especificar parmetros de conexin en la lnea de comandos, el comando
podra parecerse a esto:
shell> MYSQL -h host -u user -p < fichero-batch
Enter password: ********
Cuando usas MYSQL de esta manera, ests creando un fichero script (de guin), y
despus ejecutando el script.
?Por qu usar un script? He aqu algunas razones:
* Si ejecutas una consulta repetidamente (digamos, cada da o cada semana), el
construir un script con esta consulta te permite evitar volver a teclearla cada vez que
la ejecutes.
* Puedes generar nuevas consultas a partir de consultas ya existentes similares
simplemente copiando y editando los ficheros script.
* El modo batch puede ser tambin muy til cuando ests desarrollando una consulta,
particularmente para comandos multi-lnea o mltiples secuencias de comandos de
mltiples sentencias. Si cometes un error, no necesitas reescribir todo.

36

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio

PRACTICA
Conseguir la Base de datos PUBS de SQL Server y desarrollar los siguientes ejercicios
BASE DE DATOS
:
PUBS
TABLAS
:
Articulos, Authors(*), Employee(*), Titles(*), Titleauthor(*)
1. mostrar los campos de la tabla employee:

select * from employee


------------------------------------------------------------------------------------------------------------emp_id fname
minit lname
job_id job_lvl pub_id
hire_date
--------- -------------------- ----- ------------------------------ ------ ------- --------------------------PMA42628M Paolo
M
Accorti
13
35
0877
1992-08-27 00:00:00.000
PSA89086M Pedro
S
Afonso
14
89
1389
1990-12-24 00:00:00.000
VPA30890F Victoria
P
Ashworth
6
140
0877
1990-09-13 00:00:00.000
(43 filas afectadas)
2. Seleccionar las columnas de nombre(fname), apellido (lname) y clave de empleado (emp_id)
para cada uno de los empleados de la tabla employee

select fname, lname, emp_id


from employee
-----------------------------------------------------------fname
lname
emp_id
-------------------- ------------------------------ --------Aria
Cruz
A-C71970F
Ann
Devon
AMD15433F
Annette
Roulet
A-R89858F
(43 filas afectadas)
37

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio

3. Puede cambiar la consulta anterior y cambiar el orden de las columnas, se devuelve la misma
informacin pero se exhibe con un orden diferente.

select emp_id, lname, fname


from employee
-----------------------------------------------------------emp_id lname
fname
--------- ------------------------------ -------------------A-C71970F Cruz
Aria
AMD15433F Devon
Ann
A-R89858F Roulet
Annette
(43 filas afectadas)
4. puedes hacer alias de la columna para el campo emp_id, de la tabla employee

select emp_id as codigo


from employee
--------codigo
--------A-C71970F
AMD15433F
A-R89858F
ARD36773F
(43 filas afectadas)
5. puedes hacer alias de los siguientes campos para los campos emp_id, lname y fname de la tabla
employee

select emp_id as codigo , lname as apellido, fname as nombre


from employee
------------------------------------------------------------codigo apellido
nombre
--------- ------------------------------ -------------------A-C71970F Cruz
Aria
AMD15433F Devon
Ann
A-R89858F Roulet
Annette
6. Puedes usar literales para hacer ms legible su salida

38

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
select fname, lname, 'Clave empleado:', emp_id
from employee
fname
lname
emp_id
-------------------- ------------------------------ --------------- --------Aria
Cruz
Clave empleado: A-C71970F
Ann
Devon
Clave empleado: AMD15433F
Annette
Roulet
Clave empleado: A-R89858F
7. puedes enviar lo siguiente para devolver una columna denominada Nombre, la cual es una
concatenacin del apellido y la primera inicial del nombre; y la clave del empleado

select lname + ',' + substring(fname,1,1) + '.'


as nombre, emp_id as clave
from employee
-----------------------------------------nombre
clave
--------------------------------- --------Cruz,A.
A-C71970F
Devon,A.
AMD15433F
Roulet,A.
A-R89858F
Domingues,A.
ARD36773F
8. Ahora visualice una consulta ms compleja

select emp_id as Clave, lname + ',' + substring(fname,1,1) + '.'


as Nombre, 'antiguedad ', datediff(year, hire_date, getdate()),'aos.'
from employee
Clave
Nombre
--------- --------------------------------- ----------- ----------- ----PMA42628M Accorti,P.
antiguedad 11
PSA89086M Afonso,P.
antiguedad 13
VPA30890F Ashworth,V.
antiguedad 13
H-B39728F Bennett,H.
antiguedad 14

aos.
aos.
aos.
aos.

9. visualice los campos emp_id, lname, fname para la tabla employee con la condicin de
pub_id=0877

select emp_id , lname, fname


from employee
where pub_id='0877'
-----------------------------------------------------------emp_id
lname
fname
--------- ------------------------------ -------------------PMA42628M
Accorti
Paolo
VPA30890F Ashworth
Victoria
39

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
H-B39728F Bennett

Helen

10. Encontrar a los empleados que trabajan para editores con la clave pub_id 0877 o 9999

select emp_id, lname, fname


from employee
where pub_id in ('0877', '9999')
-----------------------------------------------------------emp_id
lname
fname
--------- ------------------------------ -------------------PMA42628M
Accorti
Paolo
VPA30890F Ashworth
Victoria
H-B39728F Bennett
Helen
L-B31947F Brown
Lesley
11. Devolver de la tabla titles lsa columnas title_id y title de todos los libros que contengan
computer en cualquier parte del ttulo.

select title_id, title


from titles
where title like '%computer%'
--------------------------------------------------------------------------------------title_id
title
-------- -------------------------------------------------------------------------------PS1372 Computer Phobic AND Non-Phobic Individuals: Behavior Variations
BU1111 Cooking with Computers: Surreptitious Balance Sheets
BU7832 Straight Talk About Computers
MC3026 The Psychology of Computer Cooking
BU2075 You Can Combat Computer Stress!
(5 filas afectadas)
12. Para devolver de la tabla authors las columnas au_id, au_lname y au_fname de todos los
autores cuyo apellido comience con las letras B o M

select au_id, au_lname, au_fname


from authors
where au_lname like '[BM]%'
-----------------------------------------------------------------------au_id
au_lname
au_fname
----------- ---------------------------------------- -------------------409-56-7008
Bennet
Abraham
648-92-1872
Blotchet-Halls
Reginald
724-80-9391
MacFeather
Stearns
893-72-1158
McBadden
Heather
(4 filas afectadas)
40

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio

13. Encontrar todos lo libros que no tienen ventas

select title_id, title


from titles
where ytd_sales is null
---------------------------------------------------------------------------------------title_id
title
-------- -------------------------------------------------------------------------------MC3026
The Psychology of Computer Cooking
PC9999
Net Etiquette
(2 filas afectadas)
14. En contraste con la consulta anterior, puede usar IS NOT NULL para encontrar todos los libros
que s tienen valores ytd_sales

select title_id, title


from titles
where ytd_sales is not null
----------------------------------------------------------------------------------------title_id
title
-------- -------------------------------------------------------------------------------BU1032
The Busy Executive's Database Guide
BU1111
Cooking with Computers: Surreptitious Balance Sheets
BU2075
You Can Combat Computer Stress!
BU7832
Straight Talk About Computers
MC2222
Silicon Valley Gastronomic Treats
(16 filas afectadas)
15. Recuperar las columnas title_id, title y price de todos los libros que tengan en pub_id 0877 o la
palabra computer en el titulo, y par los cuales el precio sea NOT NULL

select title_id, title, price, pub_id


from titles
where title like '%computer%' or pub_id ='0877' and price is not null
-------------------------------------------------------------------------------------------------------------------title_id
title
price pub_id
-------- ---------------------------------------------------------------------------------------------------- -----BU1111 Cooking with Computers: Surreptitious Balance Sheets
11.9500 1389
BU2075 You Can Combat Computer Stress!
2.9900 0736
41

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
BU7832
1389
MC2222
0877
MC3021
0877
MC3026

Straight Talk About Computers

19.9900

Silicon Valley Gastronomic Treats

19.9900

The Gourmet Microwave

2.9900

The Psychology of Computer Cooking

NULL

CLASIFICACION DE LOS DATOS CON LA CLAUSULA ORDER BY

16. mostrando los campos en forma ascendente

select title_id, au_id


from titleauthor
order by title_id, au_id
--------------------title_id
au_id
-------- ------------------BU1032 213-46-8915
BU1032 409-56-7008
BU1111 267-41-2394
BU1111 724-80-9391
BU2075 213-46-8915
MC2222 712-45-1867
MC3021 722-51-5454

17. Esta consulta devuelve el mismo resultado anterior

select title_id, au_id


from titleauthor
order by 1,2
-------------------title_id
au_id
-------- ----------BU1032 213-46-8915
BU1032 409-56-7008
BU1111 267-41-2394
BU1111 724-80-9391

42

0877

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio

EJERCICIOS PROPUESTOS DE MYSQL


Realizar las siguientes consultas:
1. Crear la base de datos llamada Universidad
2. Crear una tabla llamada Estudiantes:
La tabla tendr los siguienes campos:
-

codigo char (3)


nombres varchar (30)
apellidos varchar(30)
dni
direccin varchar(30)
telefono integer

3. ingrese los siguientes registros a la tabla:


Codigo
E01

Nombres
Ana Maria

E02
E03

Elena Iris
Rita Miriel

Apellidos
Mendez
Torres
Lopez Tunes
Luna Pizarro

Dni
10250623

Direccion
Los Portales

Telefono
4628960

10262392
10245630

Javier Prado
Las Flores

5622360
5602314

4. Crear una tabla llamada Empleados:


La cual tiene los siguientes campos:
Nombre

Tipo

CODIGO(primary key)
NOMBRES
APEPAT
APEMAT
EDAD

CHAR
VARCHAR
VARCHAR
VARCHAR
CHAR
43

Amplitud
3
30
15
15
2

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio

SEXO
ESTCIV

CHAR
CHAR

1
1

Llenando la tablas con los siguientes datos:


CODIG NOMBRE APEPAT
O
S
E01
Marcos
Rodrigue
z
E02
Juan
Moreno
E03
Rossmery Veliz
E04
Marcela
Luza
E05
Teresa
Sosa

APEMAT EDA
D
Torres
20
Manco
Orihuela
Quispe
Navarro

22
23
25
27

SEX
O
M

ESTCI
V
S

M
F
F
M

S
S
S
C

5. Realice las siguientes consultas:


a) Seleccione todos los campos de la tabla estudiantes:
mysql>
b) Seleccione los nombres de la tabla estudiantes:
mysql>
c) Seleccione los nombres y apellidos de la tabla estudiantes:
mysql>
d) Seleccione los nombres y la direccin de la tabla estudiantes que
viven en Javier Prado:
mysql>
e) Seleccione los apellidos paterno, materno y nombres de la tabla
estudiantes con codigo E03:
mysql>
f) Seleccione todos los campos de la tabla Empleados:
mysql>

44

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio

g) Seleccione los nombres, apellido paterno y apellidos materno de los


empleados:
mysql>
h) Seleccione el cdigo y nombre de los empleados que tienen una
edad de 20 aos:
mysql>
i) Seleccione los cdigos y nombres de los empleados que tiene un
estado civil de soltero:
mysql>
j) Seleccione los nombres de los empleados en forma ordenada:
mysql>
PRACTICA DE FUNCIONES EN MYSQL
PRACTICA DE MYSQL

Complete las siguientes consultas aplicando comandos de MYSQL:

1. mysql>
SELECT ...................................................................................................
Resultado:
+---------------------+
| NOW()
|
+---------------------+
| 2000-01-05 17:33:16 |
+---------------------+
+---------------------+
| CURRENT_DATE
+---------------------+
| 2000-01-05
|
+---------------------+
mysql>
SELECT ..................................................................................................
Resultado:
45

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
+----------------+--------------+
| USER()
| NOW |
+----------------+--------------+
| root@localhost | 2000-01-05 17:33:16 |
+----------------+--------------+
mysql> .. .....................................................................................
Resultado:
+----------------+--------------+
| SQRT(4)
| (2+2) |
+----------------+--------------+
|2
| 4
|
+----------------+--------------+
mysql> ...........................................................................
Resultado:
+----------+
| Database |
+----------+
| mysql |
| test
|
Creando una base de datos llamada Ventas:
mysql> ......................................................................................... ;
Resultado:

Creando una tabla llamada Clientes:


mysql>
CREATE .......................................................................................................... .
.........................................................................................................................
.........................................................................................................................
.............................
Resultado:

Ingrese 10 registros para la tabla CLIENTES. USAR el comando LOAD DATA...


mysql>

Realice una consulta que seleccione los nombres de los clientes.


mysql>

Realice una consulta que seleccione a los clientes con su respectiva


direccin.
mysql>
46

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio

Realice una consulta que presente los clientes cuyos distritos empiecen con
la letra S.
mysql>
Realice una consulta que presente los campos cdigo de artculo, nombre de
artculo y precio de costo ordenando este ltimo en forma ascendente.
mysql>

Realice una subconsulta que seleccione los nombres de los clientes con su
respectivo distrito.
mysql>

Realice una subconsulta que seleccione el nombre de los artculos con su


respectivo nombre de categora.
mysql>

Realice un calculo matemtico utilizando los siguientes comandos :


operador de asignacin: SET, funcin matemtica: PI para calcular el area
de un circulo:
mysql>

Realice un calculo matemtico utilizando los siguientes comandos :


operador de asignacin: SET, funcin matemtica: SIN para calcular el
grado radin de 30 grados sexagesimales:
mysql>

Convierte una cadena de texto a maysculas utiliza: operador de


asignacin: SET, funcin de cadena: UPPER o UCASE
mysql>

De una nota igual a 10 obtenga: es verdadero si es menor a 11 sino es falso


utiliza: operador de asignacin: SET, funcin de control de flujo: IF
mysql>

47

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
Calcular la diferencia de das entre dos fechas determinadas(01/01/2005,
01/01/2006): utiliza: operador de asignacin: SET, funcin de fecha:
DATEDIFF
mysql>

Realice una comparacin de cadenas: buenos, das utiliza: operador de


asignacin: SET, funcin de comparacin de cadenas: STRCMP
mysql>

Resultado:
Realice una comparacin de cadenas: hola, hola utiliza: operador de
asignacin: SET, funcin de comparacin de cadenas: STRCMP
mysql>
Resultado:

EJERCICIOS RESUELTOS DE CONSULTAS MULTITABLA DE SQL

TABLAS : OFICINAS Y REPVENTAS


REPVENTAS
nombre
oficina_rep
cuota
-------------------------------- -------------------- -------------------Mary Jones
11
300.00
Bill Adams
13
350.00
Sue Smith
21
350.00
Sam Clark
11
275.00
Bob Smith
12
200.00
Dan Roberts
12
300.00
Tom Snyder
NULL
NULL
75.00
Larry Fitch
21
350.00
Paul Cruz
12
275.00
Nancy Angelli
22
300.00

ventas
392.00
367.00
474.00
299.00
142.00
305.00
361.00
286.00
186.00

OFICINAS
oficina
ciudad
region
dir objetivo ventas
--------------- -------------------- ---------- ---- -------------------- --------48

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
11
12
13
21
22

New York
Chicago
Atlanta
Los Angeles
Denver

Este
Este
Este
Oeste
Oeste

106 575
104
NULL
108
108

692
800
350
725
300

735
367
835
186

1. Lista cada uno de los vendedores y la ciudad y regin en donde trabaja.


select nombre, ciudad, region
from repventas, oficina
where oficina_rep=oficina
2. Lista la ciudad y nombre de los vendedores con un objetivo superior a
600.
select nombre, ciudad, objetivo
from repventas, oficina
where oficina_rep=oficina
and objetivo>600
3. Lista la ciudad con sus cuotas inferiores inferiores a 300.
select ciudad
from repventas, oficina
where oficina_rep=oficina
and cuota<300
group by ciudad
4. Lista al vendedor con codigo de oficina igual 11 y sus objetivos
incrementados en 3%.
select nombre, (objetivo + (.03*objetivo))
from repventas, oficina
where oficina_rep=oficina
and oficina=11
5. Lista el nombre, las ventas y la oficina de cada vendedor.
select nombre,repventas.ventas
from repventas, oficina
where oficina_rep=oficina
6. Lista el importe total de ventas para los vendedores que viven en la
ciudad de Los Angeles.
select avg(repventas.ventas)
from repventas, oficina
where oficina_rep=oficina
and ciudad='Los Angeles'
7. Informa sobre todo los vendedores y todas las oficinas en las que trabajan
select *
from repventas, oficina
where oficina_rep=oficina
8.Halle el importe medio de ventas de oficinas, el importe total de cuotas
para todos los vendedores.
select avg(oficina.ventas), sum(cuota)
from repventas, oficina
49

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
where oficina_rep=oficina
9.Calcule las cuotas totales para cada oficina, agrupadas por oficina
select sum(cuota)
from repventas, oficina
where oficina_rep=oficina
group by oficina
10. Lista los vendedores que trabajan en oficinas que superan su objetivo
select nombre
from repventas, oficina
where oficina_rep=oficina
and repventas.ventas>objetivo

RESULTADOS
nombre
-----------------------------Mary Jones
Bill Adams
Sue Smith
Sam Clark
Bob Smith
Dan Roberts
Larry Fitch
Paul Cruz
Nancy Angelli
(9 filas afectadas)

ciudad
region
-------------------- ---------New York
Este
Atlanta
Este
Los Angeles
Oeste
New York
Este
Chicago
Este
Chicago
Este
Los Angeles
Oeste
Chicago
Este
Denver
Oeste

nombre
-----------------------------Sue Smith
Bob Smith
Dan Roberts
Larry Fitch
Paul Cruz
(5 filas afectadas)

ciudad
objetivo
-------------------- -------------------Los Angeles
725
Chicago
800
Chicago
800
Los Angeles
725
Chicago
800

ciudad
-------------------Chicago
New York
(2 filas afectadas)
nombre
------------------------------ -----------------------Mary Jones
592.25
Sam Clark
592.25
(2 filas afectadas)

50

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
nombre
-----------------------------Mary Jones
Bill Adams
Sue Smith
Sam Clark
Bob Smith
Dan Roberts
Larry Fitch
Paul Cruz
Nancy Angelli
(9 filas afectadas)

ventas
-------------------392.00
367.00
474.00
299.00
142.00
305.00
361.00
286.00
186.00

---------------------------------------417.500000
(1 filas afectadas)
nombre
oficina_rep cuota ventas
oficina ciudad
region dir
objetivo ventas
------------------------------ -------------------- -------------- ---- --------------------------------------Mary Jones
11
300.00 392.00 11
New York Este 106
575
692
Bill Adams
13
350.00 367.00 13
Atlanta
Este NULL
350
367
Sue Smith
21
350.00 474.00 21
Los Angeles Oeste 108
725
835
Sam Clark
11
275.00 299.00 11
New York Este
106
575
692
Bob Smith
12
200.00 142.00 12
Chicago
Este
104 800
735
Dan Roberts
12
300.00 305.00 12
Chicago
Este
104 800 735
Larry Fitch
21
350.00 361.00 21
Los Angeles Oeste 108
725
835
Paul Cruz
12
275.00 286.00 12
Chicago
Este
104 800 735
Nancy Angelli
22
300.00 186.00 22
Denver
Oeste 108
300 186
(9 filas afectadas)
---------------------------------------- ---------------------------------------645.777777
2700.00
(1 filas afectadas)
---------------------------------------575.00
775.00
350.00
700.00
300.00
(5 filas afectadas)
Advertencia: valor NULL eliminado por el agregado u otra operacin SET.
51

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
nombre
-----------------------------Bill Adams
(1 filas afectadas)

CONSULTAS SUMARIAS
PRACTICA DE SQL
/****PUBS********/
1. /*seleccione el codigo y el nombre de los editores usando un alias para la tabla use pubs
SELECT p.pub_id, p.pub_name
FROM publishers AS p */

2. /*seleccione el codigo y nombre de los editores ordenados por su nombre


SELECT pub_id, pub_name
FROM publishers
ORDER BY pub_name*/

3. /*Hallar todas las combinaciones posibles entre autores y editores Mostrar el apellido del autor y
el nombre del publicista odernados ascendentemente
SELECT au_lname, pub_name
FROM authors CROSS JOIN publishers
ORDER BY au_lname ASC, pub_name ASC*/

4. /*Mostrar todos los autores con su respectivo ttulo eincluir en el resultado los autores que no
tuvieran titulo publicados
SELECT authors.au_lname AS Apellido, authors.au_fname AS Nombre, titleauthor.title_id
FROM authors LEFT OUTER JOIN titleauthor
ON authors.au_id = titleauthor.au_id*/

5. /*Mostrar todos los titulos con su respectivo editor


SELECT titles.title AS Title, publishers.pub_name
FROM publishers INNER JOIN titles ON titles.pub_id = publishers.pub_id

52

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
ORDER BY publishers.pub_name*/

6. /*Mostrar todos los titulos con sus editores e incluir en la consulta los editores aun no tengan
titulos publicados
SELECT titles.title AS 'Title', publishers.pub_name
FROM titles RIGHT OUTER JOIN publishers
ON titles.pub_id = publishers.pub_id
ORDER BY publishers.pub_name*/

7. /*Mostrar todos los autores con sus respectivos titulos donde el titulo empiece con la letra B
usando uyna tabla derivada
SELECT RTRIM(a.au_fname) + ' ' + LTRIM(a.au_lname) AS Name, d1.title_id
FROM authors a, (SELECT title_id, au_id FROM titleauthor where title_id like 'B%') AS d1
WHERE a.au_id = d1.au_id
ORDER BY a.au_lname, a.au_fname*/

8. /* Mostrar todos los autores con susrespectivos titulos


SELECT a.au_fname + ' ' + a.au_lname AS Name, d1.title_id
FROM authors a, titleauthor AS d1
WHERE a.au_id = d1.au_id
ORDER BY a.au_lname, a.au_fname*/

/******NORTHWIND****/
9. /*Mostrar todos los productos con su respectivo stock, donde su stock este entre 15 y 25
unidades
SELECT ProductID, ProductName,UnitsInStock
FROM Northwind.dbo.Products
WHERE UnitsInStock BETWEEN 15 AND 25
ORDER BY productid*/

10. /*Mostrar todos los productos con su respectivo stock, donde su stock sea 15 o 25 unidades

53

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
SELECT ProductID, ProductName,UnitsInStock
FROM Northwind.dbo.Products
WHERE UnitsInStock = 15 OR UnitsInStock = 25
ORDER BY UnitsInStock*/

11. /*Mostrar todos los productos con su respectivo stock, donde su stock este entre 15 y 25
unidades sin usar between y ordenado por stock
SELECT UnitsInStock, ProductID, ProductName
FROM Northwind.dbo.Products
WHERE UnitsInStock >= 15 AND UnitsInStock <= 25
ORDER BY UnitsInStock*/

12. /*buscar todos los productos cuyo nmero de unidades en el almacn no se encuentre en el
intervalo 15 a 25:
SELECT ProductID, ProductName,UnitsInStock
FROM Products
WHERE (UnitsInStock NOT BETWEEN 15 AND 25) and (UnitsInStock NOT BETWEEN 30 AND
40)
ORDER BY UnitsInStock*/

13. /*buscar todos los productos cuyo nmero de unidades en el almacn no se encuentre en el
intervalo 15 a 25:
SELECT ProductID, ProductName,UnitsInStock
FROM Products
WHERE UnitsInStock < 15 or UnitsInStock > 25
ORDER BY UnitsInStock*/

14. /*buscar todos los productos cuyo nmero de unidades en el almacn no se encuentre en el
intervalo 15 a 25 y tampoco entre 30 y 40
SELECT ProductID, ProductName,UnitsInStock
FROM Products
WHERE (UnitsInStock NOT BETWEEN 15 AND 25) and (UnitsInStock NOT BETWEEN 30 AND
40)

54

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio

15. Seleccionar todos los editores con titulo publicados de tipo "business" usando EXISTS
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')*/

16. /*Seleccionar todos los editores con titulo publicados de tipo "business" usando IN
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHERE type = 'business')*/

17. /*Mostrar autores que vivan en la misma ciudad que algun editor usando exists SELECT
au_lname, au_fname
FROM authors
WHERE exists
(SELECT *
FROM publishers
WHERE authors.city = publishers.city)*/

18. /*Mostrar autores que vivan en la misma ciudad que algun editor usando ANY
SELECT au_lname, au_fname
FROM authors
WHERE city = ANY
(SELECT city

55

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
FROM publishers)*/

19. /*buscar ttulos de libros publicados por algn editor ubicado en una ciudad que comience
con la letra B usando IN
SELECT title
FROM titles
WHERE pub_id IN
(SELECT pub_id
FROM publishers
WHERE city LIKE 'B%')*/

20. /*buscar ttulos de libros publicados por algn editor ubicado en una ciudad que comience
con la letra B usando EXIST
SELECT title
FROM titles
WHERE EXISTS
(SELECT *
FROM publishers
WHERE pub_id = titles.pub_id
AND city LIKE 'B%')*/

21. /*busca nombres de editores que no publiquen libros de tipo business. SELECT pub_name
FROM publishers
WHERE NOT EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')
ORDER BY pub_name*/

22. /*Seleccione el codigo y el advance de los titulos cuyo advance(anticipo) sea menor a 5000

56

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
ordenado por el codigo
USE pubs
SELECT title_id, advance
FROM titles
WHERE advance < $5000
ORDER BY title_id*/

23. /*Seleccione el codigo y el advance de los titulos cuyo advance(anticipo) sea menor a 5000
o sea NULL, ordenado por el codigo
USE pubs
SELECT title_id, advance
FROM titles
WHERE advance < $5000 OR advance IS NULL
ORDER BY title_id */

24. /*Mostrar el nmero de unidades vendidas de cada producto de la categora 2:


SELECT OrdD.ProductID AS 'codigo de producto', SUM(OrdD.Quantity) AS 'cantidad vendida'
FROM [Order Details] AS OrdD INNER JOIN Products as Prd
ON OrdD.ProductID = Prd.ProductID
AND Prd.CategoryID = 2
GROUP BY OrdD.ProductID*/

25. /*Mostrar los tipos(type) de titulos con su promedio de precios siempre que el anticipo por
cada titulo sea mayor a 5000
USE pubs
SELECT type, AVG(price)
FROM titles
WHERE advance > $500
GROUP BY type*/

26. /*Mostrar los tipos(type) de titulos con su promedio de precios

57

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
USE pubs
SELECT type, AVG(price)
FROM titles
GROUP BY type*/

27. /*Obtener el precio promedio y la suma de las ventas del ao hasta la


agrupados por tipo e Id. de publicador.

fecha actual,

SELECT type, pub_id, 'avg' = AVG(price), 'sum' = sum(ytd_sales)


FROM titles
GROUP BY type, pub_id*/

28. /*En esta consulta se buscan publicadores cuyas ventas anuales hasta la fecha hayan sido
superiores a 40.000 dlares.
SELECT pub_id, total = SUM(ytd_sales)
FROM titles
GROUP BY pub_id
HAVING SUM(ytd_sales) > 40000*/

29. Seleccionar el codigo de editor o publicador que tengan como mnimo seis libros publicados
SELECT pub_id
FROM titles
GROUP BY pub_id
HAVING COUNT(*) > 5

30. Seleccionar el codigo de editor y el importe vendido hasta ahora (ytd_sales) de los
publicadores o editores que tengan como mnimo seis libros publicados
SELECT pub_id, total = SUM(ytd_sales)
FROM titles
GROUP BY pub_id
HAVING COUNT(*) > 5

58

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio
31. Seleccione los tipos de titulo de los tipos que tengan mas de un titulo SELECT type
FROM titles
GROUP BY type
HAVING COUNT(*) > 1

32. Seleccione los tipos de titulo de los tipos que empiecen con "p"
SELECT type
FROM titles
GROUP BY type
HAVING type LIKE 'p%'

33. Seleccionar el codigo de los editores incluyendo slo aquellos cuyo nmero de
identificacin sea superior a 0800, hayan pagado ms de 15.000 dlares en adelantos totales y
vendan libros por un promedio de menos de 20 dlares.
SELECT pub_id, SUM(advance) AS AmountAdvanced,
AVG(price) AS AveragePrice
FROM pubs.dbo.titles
WHERE pub_id > '0800'
GROUP BY pub_id
HAVING SUM(advance) > $15000
AND AVG(price) < $20

59

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio

60

ADMINISTRACIN D BASE DE DATOS 2013


Prof. Juregui Sotelo Julio

61

Potrebbero piacerti anche