3. JOINS
• El propósito del JOIN es unir información de diferentes tablas, para no tener que
repetir datos en diferentes tablas.
4. INNER JOIN
SELECT * FROM tabla1 INNER JOIN tabla2 WHERE
tabla1.columna1 = tabla2.columna1
5. EJEMPLO INNER JOIN
SELECT nombre AS Nom, apellido1 AS AP1, departamento AS DEP FROM personas P INNER
JOIN departamentos D WHERE P.dep = D.dep
PERSONAS DEPARTAMENTOS
6. LEFT JOIN
SELECT * FROM tabla1 LEFT JOIN tabla2 ON
tabla1.columna1 = tabla2.columna1
7. EJEMPLO LEFT JOIN
SELECT pers.presonas.nombre, apellido1, departamento FROM personas LEFT JOIN departamentos ON
personas.dep = departamentos.dep
PERSONAS DEPARTAMENTOS
8. RIGHT JOIN
SELECT * FROM tabla1 RIGHT JOIN tabla2 ON
tabla1.columna1 = tabla2.columna1
9. EJEMPLO RIGHT JOIN
SELECT pers.personas.nombre, pers.personas.apellido1, deps.departamentos.departamento FROM
personas RIGHT JOIN departamentos ON personas.dep = departamentos.dep
PERSONAS DEPARTAMENTOS
10. FULL JOIN
SELECT * FROM tabla1 FULL JOIN tabla2 ON
tabla1.columna1 = tabla2.columna1
11. EJEMPLO FULL JOIN
SELECT nombre, apellido1, departamento FROM personas FULL JOIN departamentos
PERSONAS DEPARTAMENTOS
12. EJERCICIO EN CLASE
• Teniendo en cuenta las tablas anteriores:
1. Sacar Una relación completa de los científicos asignados a cada proyecto.
Mostrar DNI, Nombre del científico, Identificador del proyecto y nombre del
proyecto
2. Obtener el número de proyectos al que está asignado cada científico (mostrar
el DNI y el nombre)
3. Obtener el número de científicos asignados a cada proyecto (mostrar el
identificador de proyecto y el nombre del proyecto)
4. Obtener el número de horas de dedicación de cada científico
5. Obtener el DNI y nombre de los científicos que se dedican a más de un
proyecto y cuya dedicación media a cada proyecto sea superior a las 80hrs
CIENTÍFICOS
PK DNI varchar(10)
Nomcmp varchar(200)
ASIGNADO_A
FKC Cientifico varchar(10)
FKP Proyecto varchar(5)
PROYECTO
PK Id varchar(5)
Nombre
Horas
varchar(200)
int
13. Sacar Una relación completa de los científicos asignados a cada proyecto. Mostrar DNI, Nombre del
científico, Identificador del proyecto y nombre del proyecto.
SELECT DNI, nombrec, idp, nombrep FROM (CIENTIFICOS C INNER JOIN ASIGNADO_A A INNER
JOIN PROYECTOS P ON A.proyecto = p.idp) WHERE C.DNI = A.cientifico
14. Obtener el número de proyectos al que está asignado cada científico (mostrar el DNI y el nombre)
SELECT DNI, nombrec, COUNT(proyecto) FROM CIENTIFICOS LEFT JOIN ASIGNADO_A ON
CIENTIFICOS.DNI = ASIGNADO_A.cientifico GROUP BY DNI
15. Obtener el número de científicos asignados a cada proyecto (mostrar el identificador de
proyecto y el nombre del proyecto)
SELECT idp, nombrep, COUNT(proyecto) FROM PROYECTOS LEFT JOIN ASIGNADO_A
ON PROYECTOS.idp = ASIGNADO_A.Proyecto GROUP BY idp
16. Obtener el número de horas de dedicación de cada científico
SELECT DNI, nombrec, SUM(Horas) FROM CIENTIFICOS C LEFT JOIN (ASIGNADO_A A
INNER JOIN PROYECTOS P ON A.proyecto = P.idp) ON C.DNI = A.cientifico GROUP BY DNI
17. Obtener el DNI y nombre de los científicos que se dedican a más de un proyecto y cuya dedicación
media a cada proyecto sea superior a las 80hrs
SELECT DNI, nombrec FROM CIENTIFICOS C WHERE 1 <(SELECT COUNT(*) FROM ASIGNADO_A
A WHERE A.cientifico = C.DNI)AND 80 <(SELECT AVG(horas)FROM PROYECTOS INNER JOIN
ASIGNADO_A ON PROYECTOS.idp = ASIGNADO_A.proyecto WHERE cientifico = C.DNI)
18. TAREA • Teniendo en cuenta las tablas anteriores:
1. Obtener los nombres de los productos de la tienda.
2. Obtener los nombres y los precios de los productos de la tienda.
3. Obtener el nombre de los productos cuyo precio sea mayor a $200.
4. Obtener todos los datos de los artículos cuyo precio esté entre los $60 y $120
(ambas cantidades incluidas).
5. Obtener el nombre y el precio en dólares (es decir, el precio en pesos
multiplicado por 18.60).
6. Seleccionar el precio medio de todos los productos.
7. Obtener el precio medio de los artículos cuyo código de fabricante sea 2.
8. Obtener el número de artículos cuyo código de fabricante sea 2.
9. Obtener el nombre y precio de los artículos cuyo precio sea mayor o igual a
$180.
10. Obtener un listado completo de artículos, incluyendo por cada artículo los
datos del artículo y de su fabricante.
FABRICANTES
PK Codigo Int
Nombre_fab varchar(100)
ARTICULOS
PK Id Int
FKP
Nombre
Precio
Fabricante
varchar(100)
decimal(12,2)
Int
19. TAREA
• Teniendo en cuenta las tablas anteriores:
11. Obtener un listado de artículos, incluyendo el nombre del artículo, su
precio y el nombre de su fabricante.
12. Obtener el precio medio d ellos productos de cada fabricante, mostrando el
nombre del fabricante.
13. Obtener el precio medio d ellos productos de cada fabricante, mostrando el
código del fabricante.
14. Obtener los nombres de los fabricantes que ofrezcan productos cuyo precio
medio sea mayor o igual a $150.
15. Obtener el nombre y precio de los artículos más caros de cada proveedor.
16. Obtener una lista con el nombre y precio de los artículos más caros de cada
proveedor (incluyendo el nombre del proveedor).
17. Añadir un nuevo producto: Bocinad de $120 del fabricante 5.
18. Cambiar el nombre del producto 8 a “Toshiba 2012”.
19. Aplicar el 15% de descuento a todos los productos.
20. Aplicar un descuento del 5% a los productos que estén entre los $50 y $100.
FABRICANTES
PK Codigo Int
Nombre_fab varchar(100)
ARTICULOS
PK Id Int
FKP
Nombre
Precio
Fabricante
varchar(100)
decimal(12,2)
Int
20. Obtener un listado de artículos, incluyendo el nombre del artículo, su precio y el nombre de su
fabricante.
SELECT * FROM ARTICULOS, FABRICANTES WHERE ARTICULOS. Fabricante =
FABRICANTES. Codigo
SELECT * FROM ARTICULOS INNER JOIN FABRICANTES ON ARTICULOS.Fabricante =
FABRICANTES.Codigo
Obtener el precio medio de los productos de cada fabricante, mostrando el nombre del
fabricante.
SELECT AVG(Precio),FABRICANTES.Nombre FROM ARTICULOS INNER JOIN
FABRICANTE ON ARTICULOS.Fabricante = FABRICANTES.Codigo GROUP BY
FABRICANTES.Nombre
Obtener el precio medio de los productos de cada fabricante, mostrando el código del
fabricante.
SELECT AVG(Precio), Fabricante FROM ARTICULOS GROUP BY Fabricante
Obtener los nombres de los fabricantes que ofrezcan productos cuyo precio medio sea mayor o
igual a $150.
SELECT AVG(Precio), FABRICANTES.Nombre FROM ARTICULOS INNER JOIN
FABRICANTES ON ARTICULOS.Fabricante = FABRICANTES.Codigo GROUP BY
FABRICANTES.Nombre HAVING AVG(Precio) >=150
Obtener el nombre y precio de los artículos más caros de cada proveedor.
SELECT A.Nombre, A.Precio, F.Nombre FROM ARTICULOS A INNER JOIN FABRICANTES F
ON A.Fabricante = F.Codigo AND A.Precio = (SELECT MAX(A.Precio) FROM ARTICULOS A
WHERE A.Fabricante = F.Codigo)
21. Obtener una lista con el nombre y precio de los artículos más caros de cada
proveedor (incluyendo el nombre del proveedor).
SELECT A.Nombre, A.Precio, F. Nombre FROM ARTICULOS A INNER
JOIN FABRICANTES F ON A.Fabricante = F.Codigo AND A.Precio = (
SELECT MAX(A.Precio) FROM ARTICULOS A WHERE A.Fabricante =
F.Codigo)
Añadir un nuevo producto: Bocinad de $120 del fabricante 5.
INSERT INTO ARTICULOS (Nombre, Precio, Fabricante) VALUES
(‘ALTAVOCES’, 70, 2)
Cambiar el nombre del producto 8 a “Toshiba 2012”.
UPDATE ARTICULOS SET Nombre= ‘Toshiba 2012’ WHERE Codigo = 8
Aplicar el 15% de descuento a todos los productos.
UPDATE ARTICULOS SET Precio = Precio – (Precio * .15)
Aplicar un descuento del 5% a los productos que estén entre los $50 y $100.
UPDATE ARTICULOS SET Precio = Precio – (Precio * .05) WHERE Precio
BETWEEN 50 AND 100
22.
23. 27
Estructura básica de la sentencia SELECT
• Consta de tres cláusulas:
• SELECT
• La lista de los atributos que se incluirán en el resultado de una consulta.
• FROM
• Especifica las relaciones que se van a usar como origen en el proceso de la
consulta.
• WHERE
• Especifica la condición de filtro sobre las tuplas en términos de los atributos de
las relaciones de la cláusula FROM.
24. 28
Estructura básica de la sentencia SELECT
• Una consulta SQL tiene la forma:
SELECT A1, ..., An /* Lista de atributos */
FROM R1, ..., Rm /* Lista de relaciones. A veces opcional */
WHERE P; /* Condición. Cláusula opcional */
• Es posible que exista el mismo nombre de atributo en dos relaciones
distintas.
• Se añade "NOMBRE_RELACION." antes del nombre para desambiguar.
25. 29
Estructura de la sentencia SELECT
- Nombres de las tablas / vistas
- Condiciones de selección de filas
- Nombre de las columnas
- Condiciones de selección de grupo
- Nombres de columnas
SELECT A1, …, An
FROM T1, …, Tn
WHERE P
GROUP BY Ai1, …, Ain
HAVING Q
ORDER BY Aj1, …, Ajn
-Describe la salida deseada con:
•Nombres de columnas
•Expresiones aritméticas
•Literales
•Funciones escalares
•Funciones de columna
26. SQL
Sintaxis
• Verbo + cláusulas (obligatorias y opcionales)
• DIAGRAMA SINTÁCTICO
Ejemplos válidos
SELECT ALL col1,col2,col3 FROM mitabla;
SELECT col1,col2,col3 FROM mitabla;
SELECT DISTINCT col1 FROM mitabla;
SELECT col1,col2 FROM mitabla WHERE col2=0
27. SQL
select
• La orden select se usa para consultar la base de datos y recuperar datos que
cumplan el criterio que se especifique
• Formato:
• Select “column1”[,”column2”,etc] from “tablename” [where “condition”]
• Condiciones que se pueden usar:
• =, >, <, >=, <=, <>
• LIKE
• Ejemplo: select nombre, apellido, ciudad from listado where nombre LIKE ‘Je%’;
• % es un comodín que significa “cualquier carácter”
• Más ejemplos:
• select nombre, apellido from listado where apellido LIKE ‘%s’;
• select * from listado where nombre=‘Jesús’;
Columnas que se devolverán en los resultados
“*” implica Todas
28. SQL
Ejercicios
• Escribir órdenes select para:
1. Mostrar el nombre y la edad de todos los de la tabla
2. Mostrar el nombre, apellido y ciudad de todos los que no son de Palencia
3. Mostrar todas las columnas para todos los que son mayores de 40 años
4. Mostrar el nombre y apellido de todos cuyo apellido termina en “a”
5. Mostrar todas las columnas para todos los que su nombre es igual a “María”
6. Mostrar todas las columnas para todos los que su nombre contiene “María”
nombre apellido id edad ciudad pais
Juan Juárez 99980 45 Palencia España
María Juárez 99982 25 Palencia España
Enrique Esteban 88232 32 Oporto Portugal
María Antonia Esteban 88233 32 Pontevedra España
Beatriz Hernández 98002 42 Córdoba España
Sebastián Suárez 92001 23 Guadalajara España
Gustavo García 22322 35 Badajoz España
María Antonia Martínez 32326 52 Toledo España
Erica Zamora 32327 60 Santander España
Leandro Boada 32380 22 Peñafiel España
Ernesto Clavel 32382 22 Gandía España
PERSONAS
29. SQL
Ejercicio
• Tabla empinfo
• Primero averiguar el resultado y luego ejecutarlo
• select nombre, apellido, ciudad from empinfo;
• select apellido, ciudad, edad from empinfo where edad > 30;
• select nombre, apellido, ciudad, pais from empinfo where nombre LIKE 'J%';
• select * from empinfo;
• select nombre, apellido from empinfo where apellido LIKE '%z';
• select nombre, apellido, edad from empinfo where apellido LIKE '%áre%';
• select * from empinfo where nombre = 'Enrique';
nombre apellido id edad ciudad pais
Juan Juárez 99980 45 Palencia España
María Juárez 99982 25 Palencia España
Enrique Esteban 88232 32 Oporto Portugal
María Antonia Esteban 88233 32 Pontevedra España
Beatriz Hernández 98002 42 Córdoba España
Sebastián Suárez 92001 23 Guadalajara España
Gustavo García 22322 35 Badajoz España
María Antonia Martínez 32326 52 Toledo España
Erica Zamora 32327 60 Santander España
Leandro Boada 32380 22 Peñafiel España
Ernesto Clavel 32382 22 Gandía España
Notas del editor
La sentencia SQL JOIN permite consultar datos de 2 o más tablas.
La sentencia LEFT JOIN combina los valores de la primera tabla con los valores de la segunda tabla. Siempre devolverá las filas de la primera tabla, incluso aunque no cumplan la condición.
La sentencia LEFT JOIN combina los valores de la primera tabla con los valores de la segunda tabla. Siempre devolverá las filas de la primera tabla, incluso aunque no cumplan la condición.
La sentencia RIGHT JOIN combina los valores de la primera tabla con los valores de la segunda tabla. Siempre devolverá las filas de la segunda tabla, incluso aunque no cumplan la condición.
La sentencia RIGHT JOIN combina los valores de la primera tabla con los valores de la segunda tabla. Siempre devolverá las filas de la segunda tabla, incluso aunque no cumplan la condición.
La sentencia SQL UNION es utilizada para acumular los resultados de dos sentencias SELECT.