Y decían que nunca iba a usar teoría de conjuntos!
SELECT *
FROM platzi.alumnos
WHERE id NOT IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id = 30
)
Introducción a SQL
Breve historia de SQL
Álgebra relacional
Instalación de la BD de ejemplo
Qué es una proyección (SELECT)
Origen (FROM)
Productos cartesianos (JOIN)
Selección (WHERE)
Ordenamiento (ORDER BY)
Agregación y limitantes (GROUP BY y LIMIT)
Ejercitando tu SQL
El primero
El segundo más alto
Seleccionar de un set de opciones
En mis tiempos
Seleccionar por año
Duplicados
Selectores de rango
Eres lo máximo
Egoísta (selfish)
Resolviendo diferencias
Todas las uniones
Triangulando
Generando rangos
Regularizando expresiones
Conceptos de SQL Avanzado
Bases de datos distribuidas
Queries distribuídos
Sharding
Window functions
Particiones y agregación
El futuro de SQL
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Israel Vázquez Morales
Aportes 523
Preguntas 21
Y decían que nunca iba a usar teoría de conjuntos!
SELECT *
FROM platzi.alumnos
WHERE id NOT IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id = 30
)
SELECT *
FROM platzi.alumnos
OFFSET ( SELECT COUNT(*)/2 FROM platzi.alumnos );
Mi solución usando MySQL
SELECT * FROM platzi.alumnos
WHERE (
id > (SELECT COUNT(id)/2 FROM platzi.alumnos)
);
Me pareció tan sencillo colocar un diferente (<>) en vez de un igual (=), aunque creo que exsiste una palabra reservada NOT que cumpliría el cometido, yo lo hice así:
SELECT ROW_NUMBER() OVER() AS row_id, *
FROM platzi.alumnos
WHERE id NOT IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id = 30
);
También pudo ser:
SELECT *
FROM platzi.alumnos
WHERE tutor_id = 30;
Otra forma de hacerlo es decir a lo que son diferentes de tutor 30
es decir tutor_id != 30
SELECT *
FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id != 30
)
<SELECT *
FROM (
SELECT ROW_NUMBER() OVER() AS row_id, *
FROM platzi.alumnos
ORDER BY row_id
) AS alumnos_with_row_num
WHERE row_id >
(SELECT count(*)/2
FROM platzi.alumnos)>
select *
from platzi.alumnos
where id >= (
select count(*)/2 as cuenta
from platzi.alumnos
);
SELECT *
FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id = 30
AND carrera_id = 31
);
-- RETO
SELECT *
FROM platzi.alumnos
WHERE id NOT IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id = 30
);
Mi solución, fue lo primero que pense cuando aun explicaba la clase.
SELECT *
FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id != 30
);
SELECT *
FROM platzi.alumnos
OFFSET 500;
estas son las tres formas que encontre para darle solución al problema del final de la clase:
SELECT *
FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id <> 30
);
SELECT *
FROM platzi.alumnos
WHERE id NOT IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id = 30
);
SELECT *
FROM platzi.alumnos
WHERE tutor_id <> 30;
Dos formas
SELECT *
FROM (
SELECT ROW_NUMBER() OVER() AS row_id, *
FROM platzi.alumnos
) AS alumnos_with_row_num
WHERE row_id NOT IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id = 30
);
Segunda forma
SELECT * FROM platzi.alumnos
except
select * from platzi.alumnos where tutor_id=30;
Comparto mi solución al reto:
SELECT *
FROM platzi.alumnos
WHERE tutor_id <> 30;
select * from platzi.alumnos
where id in(
select id
from platzi.alumnos
where tutor_id != 30
);
SELECT *
FROM platzi.alumnos
EXCEPT
(SELECT *
FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id=30)
);
SELECT *
FROM PLATZI.ALUMNOS
WHERE ID IN
(SELECT ID
FROM PLATZI.ALUMNOS
WHERE TUTOR_ID != 30);
TRAE LA SEGUNDA MITAD
SELECT *
FROM platzi.alumnos
OFFSET ( SELECT COUNT(*)/2 FROM platzi.alumnos );
Este es mi solución al reto:
select *
from (
SELECT count(*) over() as total_filas, *
FROM platzi.alumnos)
as consulta_externa
where id >= (total_filas / 2 )
Aunque entendí rápido cómo resolverlo, tuve problemas con el orden o la forma de colocar el count(*) junto con el * porque estaba poniendo de primero el asterisco… al cambiarlo al final funcionó.
Esta fue mi solucion para el reto
--- Traer la 2da mitad de la tabla Alumnos
SELECT *
FROM alumnos
OFFSET (
SELECT COUNT(id)/2
FROM alumnos);```
select *
from platzi.alumnos
where tutor_id != 30
SELECT *
FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM platzi.alumnos
WHERE NOT tutor_id = 30 AND NOT id IN (1,5,10,12,15,20)
);
SELECT *
FROM platzi.alumnos
WHERE id >= 500
;
SELECT *
FROM platzi.alumnos
LIMIT 500 OFFSET 499
;
Creo que era mas fácil hacer un
top 50 percent con un order by platzi . alumnos . id asc
Consulta ordenada sobre tutor_id
USE platzi
GO
SELECT *
FROM platzi.alumnos
WHERE id not IN(
SELECT id
FROM platzi.alumnos
WHERE
tutor_id = 30
)
ORDER BY tutor_id ASC;
SELECT *
FROM platzi.alumnos
WHERE id NOT IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id = 30
AND carrera_id= 31
);
SELECT *
FROM platzi.alumnos
where tutor_id <> 30
;
SELECT *
FROM platzi.alumnos
WHERE id IN (SELECT id
FROM platzi.alumnos
WHERE tutor_id <>30);
Mi aporte al segundo desafío, que son los select inversos a los mostrados:
SELECT *
FROM platzi.alumnos
WHERE id IN(
SELECT id
from platzi.alumnos
WHERE tutor_id <>30);
SELECT
*
from
(select ROW_NUMBER() over() AS row_id, *
from platzi.alumnos)
as alumnos_with_row_num
where row_id not in (1,5,10,12,15,20);
select *
from platzi.alumnos
where id in (select id
from platzi.alumnos
where tutor_id !=30);
Solución al ejercicio anterior obtener la segunda mitad de registros de la tabla alumnos
select *
from platzi.alumnos
offset (select count(id)/2
from platzi.alumnos)
SELECT *
FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id != 30
);
-- solo le agregué el signo de exclamación
SELECT *
FROM platzi.alumnos
where id in(
SELECT id
FROM platzi.alumnos
WHERE tutor_id !=30);
SELECT *
FROM (
SELECT ROW_NUMBER() OVER() AS row_num, *
FROM platzi.alumnos
) AS data_with_row_num
WHERE row_num NOT IN (1,3,8,12);
SELECT *
FROM platzi.alumnos
WHERE id NOT IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id = 30
);
-- extra: si quiero traer tambien los alumnos que estan en la carrera con id 7 agrego carrera_id != 7
SELECT *
FROM platzi.alumnos
WHERE id NOT IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id = 30
AND carrera_id != 7
);
También se podría realizar con NOT IN
SELECT *
FROM platzi.alumnos
WHERE id in (
SELECT id
FROM platzi.alumnos
WHERE tutor_id <> 30
);
¡Hola! dejo mi solución para el desafío de la clase anterior:
<code>
SELECT *
FROM platzi.alumnos
OFFSET(
SELECT COUNT(*)
FROM platzi.alumnos
)/2;
SELECT *
FROM platzi.alumnos
WHERE tutor_id <> 30 OR tutor_id IS NULL;
Entonces, la condición tutor_id <> 30 OR tutor_id IS NULL seleccionará todas las filas donde el tutor_id no sea 30 o sea nulo, lo que incluirá a los alumnos que no tienen asignado al tutor 30.
SELECT *
FROM platzi.alumnos
ORDER BY id
LIMIT (SELECT COUNT(*) FROM platzi.alumnos) / 2
OFFSET (SELECT COUNT(*) FROM platzi.alumnos) / 2;
SELECT *
FROM (
SELECT ROW_NUMBER() OVER() AS row_id, *,
FROM `data_table`
)
WHERE row_id > (SELECT COUNT(*)/2
FROM `data_table`)
Lo hice de esta forma
select *
from platzi.alumnos
where id in(
select id
from platzi.alumnos
where tutor_id <> 30
);
Acá esta la solución del ejercicio propuesto para la clase
<SELECT *
FROM platzi.alumnos
WHERE tutor_id NOT IN (
SELECT
tutor_id
FROM platzi.alumnos
WHERE tutor_id = 30
)
LIMIT 5;>
Asi resolví yo mi ejercicio del segundo mas alto
<SELECT
*
FROM platzi.alumnos
WHERE id > (
SELECT
(COUNT(id)/2)
FROM platzi.alumnos );>
Aprendi a que los sub querys son como muñecas que se van aramndo de adentro hacia afuera
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?