Curso de MariaDB Desde la Consola/JOINs

De WikiCabal
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)