Vous êtes sur la page 1sur 5

3.2.4.

Consultas sobre mltiples tablas


Todos los ejemplos ejecutados hasta ahora tienen una limitacin significativa, es decir todas las columnas incluidas en la tabla resultados provienen de una misma tabla. La verdadera potencia del SQL se alcanza cuando combinamos el contenido de ms de una tabla. Suponga que desea conseguir una lista con los empleados y los departamentos para los que trabajan. Esta informacin est repartida en las dos tablas empleado y departamento. Si necesitamos obtener informacin de ms de una tabla, tendremos la opcin de utilizar subconsultas o combinaciones. Si la tabla de resultados final debe contener columnas de tablas diferentes, entonces deberemos utilizar obligatoriamente una combinacin. Para realizar una combinacin, basta incluir ms de un nombre en la clusula FROM, utilizando una coma como separador y, normalmente, incluyendo una clusula WHERE para especificar la columna o columnas con las que hay que realizar la combinacin. As, podramos intentar una consulta que seleccionara el campo nombre de la tabla empleado y el nombre del departamento. Y aqu surge el primer problema, cmo distinguimos entre dos columnas que llamndose igual, pertenecen a tablas distintas? El uso de alias para las tablas incluidas en el FROM o en las columnas del evitar la ambigedad, el alias se separa por un espacio.

SELECT permite

Considere el siguiente modelo fsico relacional y su correspondiente cdigo SQL en MySQL y Oracle

La traduccin a SQL es

CREATE TABLE artista ( idArtista NUMBER, nombreArtista CHAR(35) NOT NULL, CONSTRAINT pk_Artista PRIMARY KEY (idArtista), CONSTRAINT ak_nombreArtista UNIQUE ( nombreArtista )
);

CREATE TABLE disco ( asin CHAR(12), idArtista NUMBER NOT NULL, nombreAlbum CHAR(20) NOT NULL, yearLanzamiento NUMBER(4), marca CHAR(20), CONSTRAINT pk_disco PRIMARY KEY (asin),

CONSTRAINT fk_artistaDisco FOREIGN KEY (idArtista) REFERENCES artista


(idArtista) ); CREATE TABLE canciones ( idCancion NUMBER, posicion NUMBER NOT NULL, asin CHAR(12) NOT NULL, nombreCancion CHAR(30) NOT NULL, duracion CHAR(6), estilo CHAR(15), CONSTRAINT pk_canciones PRIMARY KEY (idCancion), CONSTRAINT fk_DiscoCanciones FOREIGN KEY (asin) REFERENCES disco (asin) ); DROP TABLE IF EXISTS canciones, disco, artista; CREATE TABLE artista ( idArtista INTEGER, nombreArtista CHAR(35) NOT NULL, CONSTRAINT pk_Artista PRIMARY KEY (idArtista), CONSTRAINT ak_nombreArtista UNIQUE ( nombreArtista ) ) ENGINE = innoDB;

CREATE TABLE disco ( asin CHAR(12), idArtista INTEGER NOT NULL, nombreAlbum CHAR(20) NOT NULL, yearLanzamiento INTEGER(4), marca CHAR(20), CONSTRAINT pk_disco PRIMARY KEY (asin), CONSTRAINT fk_artistaDisco FOREIGN KEY (idArtista) REFERENCES artista
(idArtista) ) ENGINE = innoDB;

CREATE TABLE canciones ( idCancion INTEGER AUTO_INCREMENT, posicion INTEGER NOT NULL, asin CHAR(12) NOT NULL, nombreCancion CHAR(30) NOT NULL, duracion CHAR(6), estilo CHAR(15), CONSTRAINT pk_canciones PRIMARY KEY (idCancion), CONSTRAINT fk_DiscoCanciones FOREIGN KEY (asin) REFERENCES disco (asin) ) ENGINE = innoDB;

SELECT * FROM artista, disco


Descargar Ejecutar El resultado es incorrecto, ya que obtenemos es el producto cartesiano de todos los artistas por todos los discos. SQL tomo cada fila de la tabla disco y le ha asociado todos los idArtista de la tabla artista.

Reglas de Combinacin:
Pueden combinarse tantas tablas como se desee. El criterio de combinacin puede estar formado por ms de una pareja de columnas. En la clusula

SELECT

pueden citarse columnas de ambas

tablas, condicionen o no la combinacin. Si hay columnas con el mismo nombre en las distintas tablas, deben identificarse especificando la tabla de procedencia o utilizando un alias de tabla. Es necesario incluir una clasula WHERE que asocie las tablas mediante las correspondientes llaves

Para lograr el resultado correcto necesitamos asociar un disco con el nombre del artista que lo interpreta. Y esto se puede hacer si aadimos la condicin en la cual idArtista el mismo valor en la fila de la tabla disco que en la fila correspondiente de la tabla artista.

SELECT * FROM artista A, disco D WHERE A.idArtista = D.idArtista


Ejecutar

Ejemplo: Considere el siguiente Modelo fsico relacional. Que descibe las relaciones existentes para el torneo apertura 2009 del futbol Mexicano de 1era divisin.

Para crear la estructura y los datos, es necesario realizar el siguiente Procedimiento

Ejemplo:

Generar un listado con los nombres de todos los jugadores del Amrica que jugaron como porteros durante el torneo Apertura 2009.

SELECT E.nombreEquipo,

J.nombre Nombre, P.nombrePosicion Posicion FROM equipo E, posicion P, jugador J WHERE (J.idEquipo = E.idEquipo) AND ( J.idEquipo = 1) AND (J.idPosicion = 1) AND (P.idPosicion = J.idPosicion) AND (J.jj >0 ) ORDER BY J.nombre

3.2.5. Subconsultas
Una subconsulta es una instruccin SELECT anidada dentro de una sentencia SELECT, SELECT...INTO, INSERT...INTO, DELETE, o UPDATE o dentro de otra subconsulta. Una subconsulta, a su vez, puede contener otra subconsulta y as hasta un mximo de 16 niveles. Las particularidades de las subconsultas son:

1. Su resultado no se visualiza, sino que se pasa a la consulta principal para su comprobacin. 2. Puede devolver un valor nico o una lista de valores y en dependencia de esto se debe usar el operador del tipo correspondiente. 3. No puede usar el operador BETWEEN, ni contener la setencia ORDER BY. 4. Puede contener una sola columna, que es lo ms comn, o varias columnas.Este ltimo caso se llama subconsulta con columnas mltiples. Cuando dos o ms columnas sern comprobadas al mismo tiempo, deben encerrarse entre parntesis.
Ejemplo: Nombres de los jugadores que han participado ms que el promedio, equipo y posicin durante un torneo

SELECT equipo, nombreJugador, posicion, minutos FROM femexfut WHERE minutos > ( SELECT AVG(minutos) FROM femexfut WHERE torneo = 'Bicentenario 2010' AND jj > 0) AND torneo = 'Bicentenario 2010' ORDER BY equipo, posicion, nombreJugador
Descargar Ejecutar

La consulta ms interna calcula el promedio de minutos jugados, y la consulta ms externa lo utiliza para seleccionar los nombres de los jugadores que participan ms del promedio. El valor de comparacin puede ser un valor simple, como en el ejemplo anterior, o un conjunto de valores. Hay que tener en cuenta este detalle ya que el tipo de operador a utilizar vara. En el primer caso se puede utilizar un operador de comparacin de carcter aritmtico (<, >, etc.). Y en el segundo uno de tipo lgico (IN).

Las subconsultas pueden devolver ms de una columna, y se habrn de comparar de manera consecuente:
Las columnas de la clausula WHERE de la consulta principal deben estar agrupadas por parntesis. Las columnas encerradas entre parntesis deben coincidir en nmero y tipo de datos con los datos que devuelve la subconsulta.

Se puede utilizar una subconsulta para insertar valores en una tabla en el momento de la creacin de la misma. Ejemplo: Crear una tabla con los datos de los jugadores que participan ms que el promedio y su desviacin:

CREATE TABLE borrame SELECT minutos, nombreJugador FROM femexfut WHERE minutos > ( SELECT AVG(minutos) + STDDEV(minutos) FROM femexfut WHERE jj > 0 AND torneo = 'Bicentenario 2010') AND torneo = 'Bicentenario 2010' ORDER BY minutos DESC, nombreJugador
Ejecutar No es necesario especificar tipos ni tamaos de las columnas, ya que vienen determinados por los tipos y tamaos de las columnas recuperadas en la subconsulta.

Ejemplo: Valor ms reciente del dlar en la base de datos

SELECT fecha, precio FROM dolar WHERE fecha = ( SELECT MAX(fecha) FROM dolar)

Vous aimerez peut-être aussi