Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: Kanine25 en 13 Mayo 2020, 18:22 pm



Título: Join SQL
Publicado por: Kanine25 en 13 Mayo 2020, 18:22 pm
Hola a todos me ha surgido un problema con una sentencia en SQL.

El problema es que no entiendo muy bien que tipo de join debo usar. Si alguien pudiese explicarme los join se lo agradecería.

Espero que alguien pueda echarme una mano.
Muchas gracias y un saludo.


Título: Re: Join SQL
Publicado por: EdePC en 13 Mayo 2020, 19:41 pm
No lo he probado, pero por ahí debe andar la cosa. Lo importante para resolver estos ejercicios es leer el enunciado poco a poco e ir armando consultas que satisfagan ese poco a poco para al final juntar todo:

Código
  1. -- Tengo que hacer un select para obtener todas las ciudades del continente Africa.
  2.  
  3. -- Primero dice que quiere obtener todas las ciudades:
  4. SELECT * FROM city
  5.  
  6. -- Luego agrega que tienen que ser solamente los del continente Africa,
  7. -- Primero haces un select de africa para obtener todos los paises de Africa
  8. SELECT * FROM country
  9. WHERE continent = 'africa'
  10.  
  11. -- Entonces se combinan ambas sentencias con un JOIN simple
  12. SELECT * FROM city
  13. INNER JOIN country ON city.countrycode = country.code
  14. WHERE continent = 'africa'
  15.  
  16. -- Al final afinas los campos que de verdad necesitas
  17. SELECT city.name
  18. FROM city INNER JOIN country ON city.countrycode = country.code
  19. WHERE continent = 'africa'
  20.  

- El INNER JOIN es el más utilizado normalmente, este solo muestra los campos que de verdad tienen relación y no estén vacíos, LEFT JOIN mostraría todos los capos de la tabla de la izquierda del LEFT JOIN donde podrían haber campos vacíos o NULL en la tabla de derecha. RIGTH JOIN hace lo mismo pero viceversa.

- Acá te dejo un ejemplo de un LEFT JOIN

Código
  1. CREATE DATABASE banco_2;
  2. USE banco_2;
  3.  
  4. CREATE TABLE directores (
  5.  id        INTEGER      PRIMARY KEY,
  6.  nombre    VARCHAR(50),
  7.  apellidos VARCHAR(50),
  8.  sueldo    FLOAT
  9. );
  10.  
  11. CREATE TABLE sucursales (
  12.  nsucursal INTEGER,
  13.  nombre    VARCHAR(50),
  14.  director  INTEGER      REFERENCES directores(id),
  15.  dirección VARCHAR(100)
  16. );
  17.  
  18. INSERT INTO directores VALUES
  19.  ( 1, 'Alberto', 'Péres Martín' , 2500 ),
  20.  ( 2, 'Antonio', 'López López'  , 3000 ),
  21.  ( 3, 'Silvia' , 'Martín Martín', 2570 ),
  22.  ( 4, 'Pedro'  , 'García Martín', 3500 );
  23.  
  24. INSERT INTO sucursales VALUES
  25.  ( 1, 'Sucursal Centro', 1, 'Avd. del Estilo, 45' ),
  26.  ( 2, 'Sucursal Oeste' , 2, 'Avd. Mandrágora, 4'  ),
  27.  ( 3, 'Sucursal Este'  , 3, 'Calle Arús, 30'      );
  28.  
  29. SELECT directores.nombre
  30.     , directores.apellidos
  31.     , sucursales.nombre AS NOMBRE_SUCURSAL
  32. FROM directores LEFT JOIN sucursales
  33. ON directores.id = sucursales.director;
  34.  
  35. ## RESULTADO ESPERADO ##
  36.  
  37. #+---------+---------------+-----------------+
  38. #| nombre  | apellidos     | NOMBRE_SUCURSAL |
  39. #+---------+---------------+-----------------+
  40. #| Alberto | Péres Martín  | Sucursal Centro |
  41. #| Antonio | López López   | Sucursal Oeste  |
  42. #| Silvia  | Martín Martín | Sucursal Este   |
  43. #| Pedro   | García Martín | NULL            |
  44. #+---------+---------------+-----------------+