Story Transcript
INNER JOIN, LEFT OUTER JOIN y RIGHT OUTER JOIN en MySQL Explicado Con Diptongos y Hiatos Hola, hoy platicaremos un poco de Joins (Uniones) en MySQL. Y de paso podemos repasar que son los diptongos, hiatos y triptongos. Para los ejemplos, necesitamos crear y llenar tres tablas. La primera es un catálogo de las reglas gramaticales para los acentos: CREATE TABLE regla ( idRegla VARCHAR(1) DEFAULT '' PRIMARY KEY, nombre VARCHAR(20) DEFAULT '' NOT NULL, descripcion VARCHAR(250) DEFAULT '' NOT NULL );
INSERT INTO regla VALUES ('A','aguda','última sílaba'); INSERT INTO regla VALUES ('G','grave','penúltima sílaba'); INSERT INTO regla VALUES ('E','esdrújula','antepenúltima sílaba'); INSERT INTO regla VALUES ('S','sobreesdrújula','trasantepenúltima sílaba');
La segunda tabla es un catálogo de casos especiales, tales como diptongo, hiato y triptongo. CREATE TABLE caso ( idCaso VARCHAR(1) DEFAULT '' PRIMARY KEY, nombre VARCHAR(20) DEFAULT '' NOT NULL, descripcion VARCHAR(250) DEFAULT '' NOT NULL );
INSERT INTO caso VALUES ('H','hiato','dos vocales fuertes están juntas | una vocal fuerte está junto con una vocal débil que suena más fuerte (en este caso siempre se acentúa la vocal débil)'); INSERT INTO caso VALUES ('D','diptongo',''); INSERT INTO caso VALUES ('T','triptongo','');
Y la tercera tabla almacena las palabras que vamos a estudiar. CREATE TABLE palabra ( cadena VARCHAR(20) DEFAULT '' PRIMARY KEY, idRegla VARCHAR(1) NULL, idCaso VARCHAR(1) NULL, FOREIGN KEY (idRegla) REFERENCES regla (idRegla), FOREIGN KEY (idCaso) REFERENCES caso (idCaso) );
INSERT INTO palabra VALUES ('Raúl','A','H');
INSERT INTO palabra VALUES ('baúl','A','H'); INSERT INTO palabra VALUES ('bahía','G','H'); INSERT INTO palabra VALUES ('tía','G','H'); INSERT INTO palabra VALUES ('aéreo','E','H'); INSERT INTO palabra VALUES ('canción','A','D'); INSERT INTO palabra VALUES ('estuvo','G',NULL); INSERT INTO palabra VALUES ('país','A','H'); INSERT INTO palabra VALUES ('maíz','A','H');
INSERT INTO palabra VALUES ('nunca','G',NULL); INSERT INTO palabra VALUES ('jamás','A',NULL);
INSERT INTO palabra VALUES ('quiero','G','T'); INSERT INTO palabra VALUES ('ver',NULL,NULL); INSERT INTO palabra VALUES ('tu',NULL,NULL); INSERT INTO palabra VALUES ('risa','G',NULL); INSERT INTO palabra VALUES ('todo','G',NULL); INSERT INTO palabra VALUES ('el',DEFAULT,DEFAULT); INSERT INTO palabra VALUES ('día','G','H');
Si seleccionamos todas las palabras tenemos 18 filas. SELECT * FROM palabra;
Si seleccionamos todas las palabras que no tiene una regla gramatical tenemos 3 filas. SELECT * FROM palabra WHERE idRegla IS NULL;
[INNER] JOIN
Seleccionamos sólo las palabras que tienen regla gramatical. -- 15 rows (sólo palabras con regla) SELECT p.cadena, r.nombre FROM palabra AS p INNER JOIN regla AS r ON p.idRegla = r.idRegla;
Entonces tenemos 15 filas. cadena
nombre
------- -----baúl
aguda
canción aguda jamás
aguda
maíz
aguda
país
aguda
Raúl
aguda
aéreo
esdrújula
bahía
grave
día
grave
estuvo
grave
nunca
grave
quiero
grave
risa
grave
tía
grave
todo
grave
LEFT [OUTER] JOIN
Ahora seleccionamos todas las palabras aunque no tengan regla gramatical. -- 18 rows (todas las palabras, aunque no tengan regla)
SELECT p.cadena, r.nombre FROM palabra AS p LEFT OUTER JOIN regla AS r ON p.idRegla = r.idRegla;
Entonces tenemos 18 filas. cadena
nombre
------- -----el tu ver baúl
aguda
canción aguda jamás
aguda
maíz
aguda
país
aguda
Raúl
aguda
aéreo
esdrújula
bahía
grave
día
grave
estuvo
grave
nunca
grave
quiero
grave
risa
grave
tía
grave
todo
grave
RIGHT [OUTER] JOIN
Ahora seleccionamos todas las reglas gramaticales aunque no existan palabras asociadas. -- 16 rows (15 palabras con regla + 1 regla sin palabras)
SELECT p.cadena, r.nombre FROM palabra AS p RIGHT OUTER JOIN regla AS r ON p.idRegla = r.idRegla;
Entonces tenemos 16 filas. cadena
nombre
------- -----baúl
aguda
canción aguda jamás
aguda
maíz
aguda
país
aguda
Raúl
aguda
aéreo
esdrújula
bahía
grave
día
grave
estuvo
grave
nunca
grave
quiero
grave
risa
grave
tía
grave
todo
grave sobreesdrújula
NATURAL JOIN
El NATURAL JOIN nos ahorra la fastidiosa tarea de escribir las condiciones ON .. si hemos trabajado correctamente con las llaves primarias (PRIMARY KEY) y las llaves foraneas (FOREIGN KEY).
Así que podemos reescribir las consultas anteriores usando la sintaixs del NATURAL JOIN.
-- 15 rows (sólo palabras con regla) SELECT p.cadena, r.nombre FROM palabra AS p NATURAL JOIN regla AS r;
-- 18 rows (todas las palabras, aunque no tengan regla) SELECT p.cadena, r.nombre FROM palabra AS p NATURAL LEFT OUTER JOIN regla AS r;
-- 16 rows (15 palabras con regla + 1 regla sin palabras) SELECT p.cadena, r.nombre FROM palabra AS p NATURAL RIGHT OUTER JOIN regla AS r;
Conclusiones
La posible salida deseada con estas tres tablas puede ser esta. -- 18 rows (todas la palabras, con su regla y caso si estás aplican) SELECT p.cadena AS cadena, IFNULL(r.nombre,) AS regla, IFNULL(c.nombre,) AS caso FROM palabra p LEFT OUTER JOIN regla r ON p.idRegla = r.idRegla LEFT OUTER JOIN caso c ON p.idCaso = c.idCaso;
Entonces tenenemos 18 filas. cadena
regla
caso
------- ----------- ---aéreo
esdrújula
hiato
bahía
grave
hiato
baúl
aguda
hiato
canción aguda
diptongo
día
hiato
grave
el estuvo
grave
jamás
aguda
maíz
aguda
nunca
grave
país
aguda
hiato
quiero
grave
triptongo
Raúl
aguda
hiato
risa
grave
tía
grave
todo
grave
hiato
hiato
tu
CREATE VIEW
Podemos generar una vista de la consulta anterior.
CREATE VIEW gramatica AS SELECT p.cadena AS cadena, IFNULL(r.nombre,) AS regla, IFNULL(c.nombre,) AS caso FROM palabra p LEFT OUTER JOIN regla r ON p.idRegla = r.idRegla LEFT OUTER JOIN caso c ON p.idCaso = c.idCaso;
Ahora tenemos una consulta más sencilla. SELECT * FROM gramatica;
publicado el 24 de mayo de 2008 a las 12:04
Advertencia La información de esta página no es confiable. El conocimiento se adquirió de forma empírica (o por fuerza bruta) y algunos términos pudieron ser inventados. Los trucos mencionados en este blog difícilmente son la manera más eficiente de resolver algún problema. La información no se actualiza y tampoco proviene de fuentes oficiales. Mejor acérquese a la documentación oficial, compre libros o visite la Wikipedia.