Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso Práctico de SQL

Curso Práctico de SQL

Israel Vázquez Morales

Israel Vázquez Morales

Seleccionar de un set de opciones

12/29
Recursos

Aportes 220

Preguntas 10

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

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 );

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;

Mi solución usando MySQL

SELECT * FROM platzi.alumnos
WHERE (
	id > (SELECT COUNT(id)/2 FROM platzi.alumnos)
);

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

Comparto mi solución al reto:

SELECT *
FROM platzi.alumnos
WHERE tutor_id <> 30;

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);

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;

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);

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
limit 500 offset 500
;


La logica previa fue:
Select *
from platzi.alumnos

vi que era 1000 filas y asi limite 500 filas y salte 500 filas

Bueno, yo encontré 4 formas diferentes: 2 con subqueries y 2 sin subqueries.

SELECT *
FROM platzi.alumnos
WHERE id NOT 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);
 
SELECT *
FROM platzi.alumnos
WHERE tutor_id NOT IN (30);

SELECT *
FROM platzi.alumnos
WHERE tutor_id <> 30;

Dentro del Subquery, utilizé un <> en el WHERE, y funcionó!

SELECT  *
FROM platzi.alumnos
WHERE id IN(
	SELECT id
	FROM platzi.alumnos
	WHERE tutor_id <> 30
)

Soy el unico que piensa que generar el row_id es complicarse la vida?
Al final y al cabo el row_id y el id son el mismo

select *
from platzi.alumnos
where id > (
select avg(id)
from platzi.alumnos
);

select *
from platzi.alumnos
offset (select count(*) from platzi.alumnos)/2;

Hola, estás fueron mis soluciones al reto;

SELECT *
FROM platzi.alumnos
WHERE id IN(
	SELECT id
	FROM platzi.alumnos
	WHERE tutor_id!=30 AND tutor_id!=9
);

SELECT *
FROM platzi.alumnos
WHERE id NOT IN(2,3,4,5);

SELECT *
FROM platzi.alumnos
WHERE id NOT IN(
	SELECT id
	FROM platzi.alumnos
	WHERE tutor_id=30 OR tutor_id=9
);

SELECT *
FROM platzi.alumnos
OFFSET ( SELECT COUNT(*)/2 FROM platzi.alumnos )
Es la mas facil

La mía es similar, pero no igual:

SELECT *
FROM platzi.alumnos
	OFFSET ((
	SELECT COUNT (*)
	FROM platzi.alumnos
	)/2);

Lo único es que quise ordenarlo del 1000 para abajo con ORDER BY y no me dejaba correr el query. Aún me pregunto como obtener ese resultado.

SELECT *
FROM alumnos
WHERE id NOT IN(1,5,10,12,15,20)

Tarea de la clase 😃

SELECT *
FROM platzi.alumnos
WHERE id NOT IN (
	SELECT id
	FROM platzi.alumnos
	where tutor_id = 30
);```

Así hice el desafio 😃

SELECT *
FROM alumnos
WHERE id <= (
	SELECT  count(distinct id)/2
	FROM alumnos
);

Dos equivalentes.

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
);

Saludos

SELECT TOP 50 PERCENT *
FROM platzi.alumnos

En SQL Server es la forma más facil de obtener la segunda mitad de los registros de la tabla en un orden por default ascendente (ASC)

Para el reto, podemos usar el mismo query, solamente agregándole un NOT antes del IN, esto para descartar todos esos valores de la lista

SELECT * FROM platzi.alumnos
WHERE id NOT IN (
	SELECT id FROM platzi.alumnos
	WHERE tutor_id = 30
);

Les comparto el reto como lo obtuve
select*from platzi.alumnos
where id in (select id from platzi.alumnos where tutor_id != 30);

SELECT *
FROM platzi.alumnos
OFFSET 500

El query del reto:

SELECT *
FROM platzi.alumnos
WHERE id NOT IN (5,10,12,15,20)
AND tutor_id != 30;

Listo. Solamente usé la vieja confiable hice “distinto a”(!)

SELECT *
FROM platzi.alumnos
WHERE id IN (
	SELECT id
	FROM platzi.alumnos
	WHERE tutor_id != 10

)
;

Esta es la manera mas sencilla que consegui de revolser el reto

SELECT *
FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id <> 30
);

Y

SELECT *
FROM (
SELECT ROW_NUMBER() OVER() AS row_id, *
FROM platzi.alumnos
) AS alumnos_with_row_num
EXCEPT
SELECT *
FROM (
SELECT ROW_NUMBER() OVER() AS row_id, *
FROM platzi.alumnos
) AS alumnos_with_row_num
WHERE row_id in (22,38,118,148);

no estoy de acuerdo que anide select, cuando no es lo mas optimo, y mas aun si solo lo puede hacer con un solo query, en todo caso se deberia hacer la consulta con otras tablas, donde si sea necesario realizar esos select anidados.

Creo que es importante decir que, tal vez, deberíamos primar siempre la solución más sencilla:

SELECT *
FROM platzi.alumnos
WHERE id > 500;
SELECT *
FROM platzi.alumnos
WHERE id>=(
SELECT COUNT(id)/2
FROM platzi.alumnos
	);

SELECT *
FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id !=30 );

Yo lo hice solo agregando el signo de admiración !

SELECT *
FROM platzi.alumnos
WHERE tutor_id <> 30;

Just agregar el NOT

My solution

select * from alumnos
where id not in (
	SELECT id from alumnos
  	WHERE tutor_id = 30
);

Les comparto mi ejercicio para filtrar los registros de la tabla, solo para las carreras que mas alumnos registrados tienen

select *
from platzi.alumnos
where carrera_id in (
select carrera_id
from (
	select carrera_id, count (0) as conteo
	from platzi.alumnos
	group by carrera_id
	order by conteo desc
	limit 3
	) as filtro
);

Les comparto mi ejercicio para extraer toda la tabla menos la segunda colegiatura mas alta

select * 
from platzi.alumnos
where id not in (
	select id
	from platzi.alumnos
	where colegiatura = 
	(
	select distinct colegiatura
	from platzi.alumnos
	order by colegiatura desc
	offset 1
	limit 1));

SELECT ROW_NUMBER() OVER() AS row_id, *
FROM platzi.alumnos
OFFSET 500 LIMIT 500

Desafio:

-- Traer todos los alumnos que NO se encuentren en los sets
-- estudiados arriba

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,15);

SELECT * 
FROM platzi.alumnos
WHERE id NOT IN (
	SELECT id
	FROM platzi.alumnos
	WHERE tutor_id = 30
);

El query del reto:

SELECT *
FROM platzi.alumnos AS alumnos
LEFT JOIN (
SELECT *
FROM platzi.alumnos
WHERE id IN (
	SELECT id
	FROM platzi.alumnos
	WHERE tutor_id = 30
)) AS alumnos_tutor_30
ON alumnos.id = alumnos_tutor_30.id
WHERE alumnos_tutor_30.id IS NULL;

Les paso mi solucion:

SELECT *
FROM platzi.alumnos
WHERE id IN(
	SELECT id
	FROM platzi.alumnos
	WHERE tutor_id != 30
);

SELECT id, tutor_id FROM platzi.alumnos
WHERE tutor_id <> 30;

Se que el punto es usar subquery pero lo logre usando esto:

 SELECT * FROM platzi.alumnos WHERE  tutor_id NOT IN (30);

SELECT * FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id <> 30
);

Select id, *
from platzi.alumnos
where tutor_id <> 30
Order by tutor_id;

La verdad no use in porque no había necesidad, con in toca es hacer una window function y pos orale que hay que hacer las cosas más simples

SELECT *
FROM platzi.alumnos
WHERE id NOT 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 id not in (select id
from platzi.alumnos
where tutor_id=30);

Mi solución compañeros, exitos

SELECT *
FROM platzi.alumnos
WHERE id IN (
	SELECT id
	FROM platzi.alumnos
	WHERE tutor_id <> 30
)

Select * from
(Select row_number() over() as contador, *
from platzi.alumnos) as cont
where contador > (select count(id)/2 from platzi.alumnos);

<h5>Usando Snowflake?</h5>

Hola chicos, en la empresa donde trabajo utilizan snowflake entonces estoy practicando todo lo de este curso allí (los que quieran pueden probar snowflake gratis)
Vi esta forma como alternativa, se debe usar la variable ‘my_variable’:

set my_variable = (select count(*) from alumnos)/2;
select *
from alumnos
limit null offset $my_variable;

SELECT
FROM platzi.alumnos
WHERE id NOT IN(
SELECT ID
FROM platzi.alumnos
WHERE tutor_id=30
);

Aquí tengo una solución un poquito diferente
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 not 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
and carrera_id = 31
);

SELECT * FROM platzi.alumnos
WHERE id IN (
    SELECT id
    FROM platzi.alumnos
    WHERE tutor_id NOT IN (30)
);

Lo que yo entendí es que eran dos ejercicios. Igual aquí queda mi aporte.

--
--Ejercicio Tercer Video
--Forma 1
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);

--forma 2
select * 
from platzi.alumnos
where id not in (
	select id
	from platzi.alumnos
	where tutor_id = 30);

Código que sirve para encontrar todos los alumnos cuyo email no esté en los emails con terminación ‘.com’.

SELECT *
FROM alumnos 
WHERE email NOT IN(
	SELECT email
	FROM alumnos
	WHERE email LIKE '%.com'
);

Mi solución del reto de la clase anterior:

SELECT * FROM (
SELECT ROW_NUMBER () OVER() AS row_id, *
FROM platzi.alumnos
) AS alumnos_with_rows_numbers
WHERE row_id >= (SELECT COUNT(*) total_registros FROM platzi.alumnos)/2

SELECT *
FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id != 30
);

SELECT *
FROM platzi.alumnos
ORDER BY id ASC
LIMIT 500 OFFSET 500

Este utiloice para la tarea

select *
from platzi.alumnos
where id in(
					select id
					from platzi.alumnos
					where tutor_id <> 30
)

También sirve 😃

SELECT * FROM platzi.alumnos
WHERE id IN (
	SELECT id
	FROM platzi.alumnos
	WHERE tutor_id !=30);```

Tarea

select *
from platzi.alumnos
where id in (
select id
	from platzi.alumnos
	where tutor_id !=30
);

SELECT ROW_NUMBER() OVER() AS ROW_ID, *
FROM PLATZI.ALUMNOS
OFFSET(
SELECT COUNT (*)/2
FROM PLATZI.ALUMNOS
);

SELECT *
FROM(
	SELECT ROW_NUMBER() OVER()  AS row_id, *
	FROM platzi.alumnos
	)AS alumnos
	where row_id >= (
		SELECT COUNT(*)/2
		FROM platzi.alumnos
	);

Reto 3:

SELECT *
FROM platzi.alumnos
WHERE id NOT IN(
	SELECT id
	FROM platzi.alumnos
	WHERE tutor_id = 30
);

Mi aporte, sé que no es como el ejemplo pero funciona

SELECT ROW_NUMBER() OVER() AS Number, *
FROM platzi.alumnos
WHERE tutor_id != 30

RETO
Así quedó

SELECT  *
FROM platzi.alumnos
WHERE NOT id IN (
    SELECT id
    FROM platzi.alumnos
    WHERE tutor_id = 30
);

SELECT *
FROM platzi.alumnos
ORDER BY id DESC
LIMIT (SELECT COUNT(id)/2 FROM platzi.alumnos)

Mi solución

La respues al reto de mi parte:

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 >= 500
;

select *
from platzi.alumnos
where id >=500;

Este seria mi solucióm para la mitad despues del registro 500

select * 
from platzi.alumnos
limit 500 offset 500;

Comparto la solución del anterior reto! en mi caso trae los registros desde el 1000 hasta el 501, es decir de manera descendiente

select *
from platzi.alumnos a1
order by a1.id desc
limit (
	select count(id)
	from platzi.alumnos
)/2
;

Yo hice un query que no contemplara a los registros (1,5,10,15,20) y que el tutor_id no fuera 30.

SELECT *
FROM (
SELECT ROW_NUMBER() OVER() AS row_id,*
FROM platzi.alumnos
) AS registros
WHERE row_id NOT IN (1,5,10,15,20) AND tutor_id <> 30;

Los id que no tengan como tutor_id = 10

SELECT * FROM platzi.alumnos
WHERE id NOT IN (
	SELECT id FROM platzi.alumnos WHERE tutor_id = 10
)

select * from platzi.alumnos
where id in (
	select id 
	from platzi.alumnos
	where tutor_id=30 
)

Mi solucion:

select * from alumnos where id > (select count(*)/2 from alumnos)

SELECT *
FROM (
SELECT ROW_NUMBER() OVER() AS row_id, *
FROM platzi.alumnos
) AS alumnos_with_number
WHERE row_id > (
SELECT COUNT (nombre)
FROM platzi.alumnos AS count ) /2

SELECT *
FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM platzi.alumnos
WHERE tutor_id != 30
);

  • Mi solución del reto Clase 11:

-- La mitad de la tabla - Primera mitad.
SELECT *
FROM
(	SELECT ROW_NUMBER() OVER() AS row_id, *
	FROM PLATZI.ALUMNOS
)AS alumnos_row_num
WHERE row_id < (
	SELECT COUNT (*) / 2
	FROM platzi.alumnos
);

-- La mitad de la tabla - Segunda mitad.
SELECT *
FROM
(	SELECT ROW_NUMBER() OVER() AS row_id, *
	FROM PLATZI.ALUMNOS
)AS alumnos_row_num
WHERE row_id >= (
	SELECT COUNT (*) / 2
	FROM platzi.alumn

3 maneras distintas.

SELECT *  
FROM (
	SELECT *
	from platzi.alumnos
	where tutor_id != 30
) as new_table

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
)

SOLUTION
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, 20)

;

SELECT *
FROM platzi.alumnos
WHERE id IN (
	SELECT id
	FROM platzi.alumnos
	WHERE tutor_id != 30
); 

Ejercicio propuesto en clase:

SELECT *
FROM platzi.alumnos
WHERE id IN (
	SELECT id
	FROM platzi.alumnos
	WHERE tutor_id != 30
);

Otra solución que encontré fue la siguiente, aquí se utiliza la palabra NOT:

SELECT *
FROM platzi.alumnos
WHERE id NOT IN (
	SELECT id
	FROM platzi.alumnos
	WHERE tutor_id = 30
);

Otra solución sería la siguiente:

SELECT id, *
FROM platzi.alumnos
WHERE tutor_id != 30;

Para llamar el inverso de lo que sea (array, subquery) sería solamente agregar el NOT antes del IN:

“”“
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 id IN (
	SELECT id FROM platzi.alumnos WHERE tutor_id != 30
	);

En caso usen sql server managment
SELECT *
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY id) AS row_id,*
FROM platzi.alumnos
)AS alumnos_with_row_num