Curso de MariaDB Desde la Consola/JOINs
Ir a la navegación
Ir a la búsqueda
JOINs
1 JOINs son manera para consultar datos de dos o más tablas relacionadas.
2
3 CREATE TABLE Cursos ( ID smallint unsigned NOT NULL AUTO_INCREMENT,
4 Nombre varchar(50) NOT NULL,
5 PRIMARY KEY (ID)
6 );
7
8 MariaDB [Prueba1]> INSERT INTO Cursos values ( '', 'HTML5' ),
9 ( '', 'CSS3' ),
10 ( '', 'JavaScript' ),
11 ( '', 'PHP' ),
12 ( '', 'MariaDB' );
13 Query OK, 5 rows affected, 5 warnings (0.03 sec)
14 Records: 5 Duplicates: 0 Warnings: 5
15
16 MariaDB [Prueba1]> insert into Cursos values ( '', 'Python' );
17 Query OK, 1 row affected, 1 warning (0.03 sec)
18
19 MariaDB [Prueba1]> SHOW CREATE TABLE Cursos;
20 +--------+-------------------------------------------------------------------------+
21 | Table | Create Table |
22 +--------+-------------------------------------------------------------------------+
23 | Cursos | CREATE TABLE `Cursos` (
24 `ID` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
25 `Nombre` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
26 PRIMARY KEY (`ID`)
27 ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
28 +--------+-------------------------------------------------------------------------+
29 1 row in set (0.00 sec)
30
31 MariaDB [Prueba1]> DESCRIBE Cursos;
32 +--------+----------------------+------+-----+---------+----------------+
33 | Field | Type | Null | Key | Default | Extra |
34 +--------+----------------------+------+-----+---------+----------------+
35 | ID | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
36 | Nombre | varchar(50) | NO | | NULL | |
37 +--------+----------------------+------+-----+---------+----------------+
38 2 rows in set (0.00 sec)
39
40 MariaDB [Prueba1]> SELECT * FROM Cursos;
41 +----+------------+
42 | ID | Nombre |
43 +----+------------+
44 | 1 | HTML5 |
45 | 2 | CSS3 |
46 | 3 | JavaScript |
47 | 4 | PHP |
48 | 5 | MariaDB |
49 | 6 | Python |
50 +----+------------+
51 5 rows in set (0.00 sec)
52
53 El número del curso se refiere a un tema en la table de Cursos
54
55 CREATE TABLE Usuarios ( ID smallint unsigned NOT NULL AUTO_INCREMENT,
56 Nombre varchar(30) NOT NULL,
57 Curso smallint unsigned,
58 PRIMARY KEY (ID),
59 KEY Curso (Curso),
60 CONSTRAINT Usuarios_ibfk_1
61 FOREIGN KEY (Curso) REFERENCES Cursos (ID) );
62 Query OK, 0 rows affected (0.36 sec)
63
64
65 MariaDB [Prueba1]> SHOW CREATE TABLE Usuarios;
66 +----------+-------------------------------------------------------------------------+
67 | Table | Create Table |
68 +----------+-------------------------------------------------------------------------+
69 | Usuarios | CREATE TABLE `Usuarios` (
70 `ID` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
71 `Nombre` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
72 `Curso` smallint(5) unsigned,
73 PRIMARY KEY (`ID`),
74 KEY `Curso` (`Curso`),
75 CONSTRAINT `Usuarios_ibfk_1` FOREIGN KEY (`Curso`) REFERENCES `Cursos` (`ID`)
76 ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
77 +----------+-------------------------------------------------------------------------+
78 1 row in set (0.00 sec)
79
80 MariaDB [Prueba1]> DESCRIBE Usuarios;
81 +--------+----------------------+------+-----+---------+----------------+
82 | Field | Type | Null | Key | Default | Extra |
83 +--------+----------------------+------+-----+---------+----------------+
84 | ID | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
85 | Nombre | varchar(30) | NO | | NULL | |
86 | Curso | smallint(5) unsigned | YES | UNI | NULL | |
87 +--------+----------------------+------+-----+---------+----------------+
88 3 rows in set (0.00 sec)
89
90 MariaDB [Prueba1]> INSERT INTO Usuarios values ( '', 'Ana', 2 ),
91 ( '', 'Roberto', 1 ), ( '', 'Angel', 5 ),
92 ( '', 'Laura', 3 ), ( '', 'Ricardo', 4 );
93 Query OK, 5 rows affected, 5 warnings (0.04 sec)
94 Records: 5 Duplicates: 0 Warnings: 5
95
96 MariaDB [Prueba1]> show warnings;
97 +---------+------+------------------------------------------------------+
98 | Level | Code | Message |
99 +---------+------+------------------------------------------------------+
100 | Warning | 1366 | Incorrect integer value: '' for column 'ID' at row 1 |
101 | Warning | 1366 | Incorrect integer value: '' for column 'ID' at row 2 |
102 | Warning | 1366 | Incorrect integer value: '' for column 'ID' at row 3 |
103 | Warning | 1366 | Incorrect integer value: '' for column 'ID' at row 4 |
104 | Warning | 1366 | Incorrect integer value: '' for column 'ID' at row 5 |
105 +---------+------+------------------------------------------------------+
106 5 rows in set (0.00 sec)
107
108 MariaDB [Prueba1]> INSERT INTO Usuarios values ( '', 'Mia', 2 );
109 Query OK, 1 row affected, 1 warning (0.08 sec)
110
111 MariaDB [Prueba1]> INSERT INTO Usuarios values ( '', 'Leo', 4 );
112 Query OK, 1 row affected, 1 warning (0.08 sec)
113
114 MariaDB [Prueba1]> INSERT INTO Usuarios ( ID, Nombre ) values ( '', 'Mauricio');
115 Query OK, 1 row affected, 1 warning (0.08 sec)
116
117
118 MariaDB [Prueba1]> SELECT * FROM Usuarios;
119 +----+---------+--------+
120 | ID | Nombre | Curso |
121 +----+---------+--------+
122 | 1 | Ana | 2 |
123 | 1 | Roberto | 1 |
124 | 3 | Angel | 5 |
125 | 4 | Laura | 3 |
126 | 5 | Ricardo | 4 |
127 | 6 | Mia | 2 |
128 | 7 | Leo | 4 |
129 | 8 | Mauricio | NULL |
130 +----+---------+--------+
131 7 rows in set (0.00 sec)
132
133 JOINs nos permite consultar estos datos en varios maneras.
134
135 INNER JOIN
136
137 La cláusula más frecuente es INNER JOIN. Esto produce
138 un conjunto de registros que coinciden con los usuarios
139 y tables de Cursos, es decir, todos los Usuarios que están
140 inscritos en un curso:
141
142 MariaDB [Prueba1]> SELECT Usuarios.Nombre, Cursos.Nombre FROM `Usuarios`
143 INNER JOIN `Cursos` on
144 Usuarios.Curso = Cursos.ID;
145 +---------+------------+
146 | Nombre | Nombre |
147 +---------+------------+
148 | Ana | CSS3 |
149 | Roberto | HTML5 |
150 | Angel | MariaDB |
151 | Laura | JavaScript |
152 | Ricardo | PHP |
153 | Mia | CSS3 |
154 | Leo | PHP |
155 +---------+------------+
156 7 rows in set (0.00 sec)
157
158 ¿Qué pasa si necesitamos una lista de todos los estudiantes y sus
159 cursos incluso si no estás inscrito en uno? Un LEFT JOIN produce el
160 conjunto de registros que coincide con cada entrada en la tabla
161 izquierda (Usuarios) sin importar ninguna entrada coincidente en la
162 tabla derecha (Cursos):
163
164 MariaDB [Prueba1]> SELECT Usuarios.Nombre, Cursos.Nombre
165 FROM `Usuarios`
166 LEFT JOIN `Cursos` on Usuarios.Curso = Cursos.ID;
167 +----------+------------+
168 | Nombre | Nombre |
169 +----------+------------+
170 | Ana | CSS3 |
171 | Roberto | HTML5 |
172 | Angel | MariaDB |
173 | Laura | JavaScript |
174 | Ricardo | PHP |
175 | Mia | CSS3 |
176 | Leo | PHP |
177 | Mauricio | NULL |
178 +----------+------------+
179 8 rows in set (0.00 sec)
180
181 RIGHT JOIN
182
183 Tal vez necesitamos una lista de todos los cursos y estudiantes
184 incluso si nadie se ha inscrito? Un RIGHT JOIN produce un conjunto
185 de registros que coincide con cada entrada en la tabla de la
186 derecha (Cursos) independientemente de cualquier entrada
187 coincidente en la tabla de la izquierda (Usuarios):
188
189 MariaDB [Prueba1]> SELECT Usuarios.Nombre, Cursos.Nombre
190 FROM `Usuarios`
191 RIGHT JOIN `Cursos` on Usuarios.Curso = Cursos.ID;
192 +---------+------------+
193 | Nombre | Nombre |
194 +---------+------------+
195 | Roberto | HTML5 |
196 | Ana | CSS3 |
197 | Mia | CSS3 |
198 | Laura | JavaScript |
199 | Ricardo | PHP |
200 | Leo | PHP |
201 | Angel | MariaDB |
202 | NULL | Python |
203 +---------+------------+
204 7 rows in set (0.00 sec)
205
206 RGHT JOINs are rarely used since you can express the same result using a LEFT JOIN. This can be more efficient and quicker for the database to parse:
207 RGHT JOINs rara vez se utiliza ya que se puede expresar
208 el mismo resultado utilizando un LEFT JOIN. Esto puede
209 ser más eficiente y más rápido para la base de datos para
210 analizar:
211
212 MariaDB [Prueba1]> SELECT Usuarios.Nombre, Cursos.Nombre
213 FROM Cursos
214 LEFT JOIN Usuarios on Usuarios.Curso = Cursos.ID;
215 +---------+------------+
216 | Nombre | Nombre |
217 +---------+------------+
218 | Roberto | HTML5 |
219 | Ana | CSS3 |
220 | Mia | CSS3 |
221 | Laura | JavaScript |
222 | Ricardo | PHP |
223 | Leo | PHP |
224 | Angel | MariaDB |
225 | NULL | Python |
226 +---------+------------+
227 7 rows in set (0.00 sec)
228
229 Podríamos contar el número de alumnos inscribiendos en cada curso:
230
231 MariaDB [Prueba1]> SELECT Cursos.Nombre, COUNT(Usuarios.Nombre)
232 FROM Cursos
233 LEFT JOIN Usuarios ON Usuarios.Curso = Cursos.ID
234 GROUP BY Cursos.ID;
235 +------------+------------------------+
236 | Nombre | COUNT(Usuarios.Nombre) |
237 +------------+------------------------+
238 | HTML5 | 1 |
239 | CSS3 | 2 |
240 | JavaScript | 1 |
241 | PHP | 2 |
242 | MariaDB | 1 |
243 | Python | 0 |
244 +------------+------------------------+
245 6 rows in set (0.00 sec)
246
247 OUTER JOIN (or FULL OUTER JOIN)
248
249 Nuestra última opción es la OUTER JOIN que devuelve todos
250 los registros en ambas tablas, independientemente de cualquier
251 partido. Cuando no existe coincidencia, el lado que falta
252 contendrá NULL.
253
254 OUTER JOIN es menos útil que INNER LEFT o RIGHT y no se implementó en MySQL.
255 Sin embargo, puede evitar esta restricción mediante la unión de
256 un LEFT y RIGHT JOIN, por ejemplo,
257
258 SELECT Usuarios.Nombre, Cursos.Nombre
259 FROM Usuarios
260 LEFT JOIN Cursos
261 ON Usuarios.Curso = Cursos.ID
262 UNION SELECT Usuarios.Nombre, Cursos.Nombre
263 FROM Usuarios
264 RIGHT JOIN Cursos
265 ON Usuarios.Curso = Cursos.ID;
266 +----------+------------+
267 | Nombre | Nombre |
268 +----------+------------+
269 | Ana | CSS3 |
270 | Roberto | HTML5 |
271 | Angel | MariaDB |
272 | Laura | JavaScript |
273 | Ricardo | PHP |
274 | Mia | CSS3 |
275 | Leo | PHP |
276 | Mauricio | NULL |
277 | NULL | Python |
278 +----------+------------+
279 9 rows in set (0.00 sec)