No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

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 523

Preguntas 21

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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

);

12. Seleccionar de un set de opciones

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;
\-- Traer segunda mitad de una tabla SELECT count (ID) FROM platzi.alumnos WHERE ID > (SELECT COUNT (T.ID)/2 FROM (SELECT ID FROM platzi.alumnos LIMIT 1000) AS T); \---- Otra forma select \* from platzi.alumnos offset ( select count(id)/2 from platzi.alumnos );
Aqui mi desafio: ![](https://static.platzi.com/media/user_upload/Screenshot%202024-04-18%2011.24.54-de965ea1-f719-42d9-b292-9e68a0541d84.jpg)
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)
```js select * from (select row_number() over() as row_id, * from alumnos )as alumnosfila where row_id in (1,5,10,15) ```
select \* from platzi.alumnos where id not in( select id from platzi.alumnos where tutor\_id = 30)
Me gusta este modelo práctico del curso, donde se plantean retos en una lección y en la siguiente se revisan posibles respuestas. Esto es mucho mejor que el usual estribillo al final de cada lección: " Ahora, te invito a que...", con el que se propone cualquier cosa que el estudiante quiera hacer, pero sin seguimiento alguno.
Respuestas al segundo reto: segunda mitad de la tabla: ```js SELECT * FROM platzi.alumnos LIMIT 500 OFFSET 500; ```Y otra: ```js SELECT * FROM platzi.alumnos ORDER BY id DESC LIMIT 500; ```
```js SELECT * FROM ( SELECT ROW_NUMBER() OVER() AS row_id, * FROM alumnos ) AS alumnos_with_row_num WHERE row_id NOT IN (1 , 2 , 4 , 8, 16 , 32) ```SELECT \* FROM ( SELECT ROW\_NUMBER() OVER() AS row\_id, \* FROM alumnos ) AS alumnos\_with\_row\_num WHERE row\_id NOT IN (1 , 2 , 4 , 8, 16 , 32)
```js select * from alumnos a where id not in (select id from alumnos a2 where tutor_id = 30) ```
```java SELECT * FROM platzi.alumnos WHERE id NOT IN (1,2,3,4,5,6) ORDER BY id ASC; ```
```python SELECT * FROM platzi.alumnos WHERE id NOT IN (1,2,3,4,5,6) ORDER BY id ASC; ```
```css SELECT * FROM platzi.alumnos WHERE id NOT IN (1,2,3,4,5,6) ORDER BY id ASC; ```
```txt SELECT * FROM platzi.alumnos WHERE id NOT IN (1,2,3,4,5,6) ORDER BY id ASC; ```
SELECT \* FROM platzi.alumnos where id not in( 1,5,10,12,15,20 )
```js SELECT * FROM platzi.alumnos WHERE id NOT IN ( SELECT id FROM platzi.alumnos WHERE tutor_id = 30 ) ORDER BY tutor_id; ```
![]()![](https://static.platzi.com/media/user_upload/CodeMitadSQL-fbfe5f70-c2ad-4068-9315-040990a26773.jpg)
```txt SELECT * FROM platzi.alumnos LIMIT (SELECT COUNT(*) / 2 FROM platzi.alumnos); ```SELECT \* FROM platzi.alumnos LIMIT (SELECT COUNT(\*) / 2 FROM platzi.alumnos);
select \* from platzi.alumnos where id IN ( SELECT id from platzi.alumnos where tutor\_id !=30 );
Una alternativa de solución de las muchas que pueden ser: ![](https://static.platzi.com/media/user_upload/image-c3a4da95-c513-4e7e-b8ca-edd1945e6d28.jpg)
!=
select \* from *otratabla* where *otroserial* <=(SELECT round(count(\*)/2) FROM *otratabla* );
select \* from *otratabla* where *otroserial* <=(SELECT round(count(\*)/2)FROM *otratabla* );
select \* from *otratabla* where *otratabla* <=(SELECT round(count(\*)/2)FROM *otratabla*);
```txt SELECT * FROM platzi.alumnos as a1 WHERE a1.id > ( SELECT count ( a2.id) FROM platzi.alumnos as a2 ) / 2; ```select count ( colegiatura) from platzi.alumnos as a2
select \* from platzi.alumnos where id in ( select id from platzi.alumnos where tutor\_id != 30 );
Para hacer lo solo agrege la consulta not al where de adentro `SELECT * FROM platzi.alumnos WHERE id IN(` `SELECT id from platzi.alumnos ` `WHERE not tutor_id = 30 ` `)`
**SELECT** \* **FROM** ( **SELECT** **ROW\_NUMBER**() **OVER**() **AS** *row\_id*, \* **FROM** usuarios ) *subquery* **WHERE** *row\_id* >= ( **SELECT** **CEIL**(**COUNT**(\*) / 2.0) **FROM** usuarios );
`SELECT * FROM platzi.alumnos` `WHERE id IN (` `SELECT * FROM platzi.alumnos ` `WHERE tutor_id != 30 ` `)`
SELECT *
FROM platzi.alumnos
WHERE id IN (
	SELECT id
	FROM platzi.alumnos
	WHERE tutor_id != 30
);
-- solo le agregué el signo de exclamación
No es la solución al reto, pero si es otra forma de utilizar la clausula `IN` y su contra parte `NOT IN` Lista de alumnos que pagan una de las tres colegiaturas más altas: ```js SELECT * FROM platzi.alumnos WHERE colegiatura IN ( SELECT DISTINCT al.colegiatura FROM platzi.alumnos AS al ORDER BY al.colegiatura DESC LIMIT 3 ); ``` Lista de alumnos que su colegiatura no esta dentro de las 3 más altas(costosas) ```js SELECT * FROM platzi.alumnos WHERE colegiatura NOT IN ( SELECT DISTINCT al.colegiatura FROM platzi.alumnos AS al ORDER BY al.colegiatura DESC LIMIT 3 ); ```
Yo lo hice así: SELECT \* FROM platzi.alumnos WHERE tutor\_id NOT IN (30);
Hola, es un poco tarde respecto a la salida del curso, pero... ¿alguien puede ayudarme con este error? Es la solución del reto 2 tal cuál como el tutor lo indica... (sandbox.data\_champions.alumnos) `SELECT ROW_NUMBER() OVER() AS row_id, *` `FROM platzi.alumnos` `OFFSET( ` `SELECT COUNT(*)/2 ` `FROM platzi.alumnos` `);` ![](https://static.platzi.com/media/user_upload/image-82baa47e-6d1c-4ff8-ac7e-05b8326aeed8.jpg)
A lo sencillo SELECT \* FROM platzi.alumnos OFFSET 501 Sirve.

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

**RETO:**  Crear una query el cual visualiza a los alumnos que no están dentro del rango de colegiatura entre  2000 y 2500. ```js select * from platzi.alumnos as alum left join ( select * from platzi.alumnos where id in ( select id from platzi.alumnos where colegiatura > 2000 and colegiatura <2500 ) ) as alumno_filtro on alum.id = alumno_filtro.id where alumno_filtro.id is null ```select \*  from platzi.alumnos as alum left join ( select \*  from platzi.alumnos where id in ( select id from platzi.alumnos where colegiatura > 2000 and colegiatura <2500 ) ) as alumno\_filtro on alum.id = alumno\_filtro.id   where alumno\_filtro.id is null
Mi solucion: ```js SELECT * FROM platzi.alumnos LIMIT ( SELECT COUNT(*) / 2 FROM platzi.alumnos ); ```SELECT \*  FROM platzi.alumnos  LIMIT ( SELECT COUNT(\*) / 2 FROM platzi.alumnos );
![](https://static.platzi.com/media/user_upload/image-3b91925b-a7db-47a4-bf74-c740725e2a15.jpg)
'Reto: Seleccionar los resultados que no se encuentren en el set anterior' 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 OFFSET (SELECT MAX(id)/2 FROM platzi.alumnos) ;
Para el reto de la 2n clase: Sacar la segunda mitad de la tabla en **SQL Server** seria: ```js SELECT TOP 50 PERCENT * FROM platzi.alumnos ORDER BY id DESC; ```SELECT TOP 50 PERCENT \* FROM platzi.alumnos ORDER BY id DESC;
Para el reto de la 2n clase: Sacar la segunda mitad de la tabla en **SQL Server** he utilizado la siguiente instrucción: ```js SELECT * FROM platzi.alumnos ORDER BY id ASC OFFSET (((SELECT COUNT (id) FROM platzi.alumnos) / 2)-1) ROWS FETCH NEXT ((SELECT COUNT (id) FROM platzi.alumnos) / 2) ROWS ONLY; ```
```js 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` `);`

Reto + plus:

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
);
`select *` `from platzi.alumnos where tutor_id IN(` `select tutor_id` `from platzi.alumnos` `where tutor_id!=30)` `select * from platzi.alumnos ` `where tutor_id!=30`
Mi Query ```js 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);

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 as datos\_alumnos limit ( select count(\*) from platzi.alumnos ) offset ( select count(\*)/2 from platzi.alumnos )
SELECT \* FROM platzi.alumnos WHERE id IN ( SELECT id FROM platzi.alumnos WHERE tutor\_id != 30 );
Mi propuesta al reto sería usar NOT IN ```js SELECT * FROM platzi.alumnos where tutor_id not in (30) and carrera_id not in (31) ```
\---- traer estudiantes que no tienen el id\_tutor 30 select \* from alumnos where id in( select id from alumnos where tutor\_id !=30 );
Buscando diferentes manera de hacerlo 😎 ✨ `SELECT * ` `FROM platzi.alumnos` `WHERE tutor_id != 30;` ```js ```
Primero saqué el total de filas con esta función: SELECT COUNT (\*) FROM platzi.alumnos; y ya luego solucioné el ejercicio así: SELECT \* FROM platzi.alumnos LIMIT 500 OFFSET 500 ;

3er reto solucionado

SELECT *
FROM platzi.alumnos
WHERE tutor_id <> 30 OR tutor_id IS NULL;
  • <> significa “no es igual a”.
  • IS NULL verifica si el valor de tutor_id es nulo.

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.

Mi solución

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`)
![](https://static.platzi.com/media/user_upload/image-6957691e-61a5-4e9d-b8a4-4cb074e6f913.jpg)Mis dos formas de resolver

Lo hice de esta forma

select *
from platzi.alumnos
where id in(
	select id
	from platzi.alumnos
	where tutor_id <> 30
);
```txt SELECT * FROM platzi.alumnos WHERE id > (SELECT COUNT(*)/2 AS row_id FROM platzi.alumnos) AND email LIKE '%com' AND apellido IS NOT NULL AND colegiatura NOT IN (SELECT MAX(colegiatura) as avg_colegiatura FROM platzi.alumnos) AND fecha_incorporacion <= '2019-12-31 08:30:00'; ``` Esta es mi respuesta.
`SELECT` `*` `FROM(` ` SELECT ROW_NUMBER() OVER() AS row_id,*` ` FROM platzi.alumnos` `) as students_with_row_id` `WHERE row_id NOT IN (` ` SELECT ID FROM PLATZI.alumnos` ` WHERE tutor_id=30` ```js SELECT * FROM( SELECT ROW_NUMBER() OVER() AS row_id,* FROM platzi.alumnos ) as students_with_row_id WHERE row_id NOT IN ( SELECT ID FROM PLATZI.alumnos WHERE tutor_id=30 ```
Planteo dos soluciones: ```js -- Opcion 1 SELECT * FROM platzi.alumnos ORDER BY id DESC LIMIT 1000 OFFSET 500; ``````js -- Opcion 2 SELECT * FROM( SELECT * FROM platzi.alumnos ORDER BY id DESC ) AS subquery LIMIT 500; ```-- Opcion 2 SELECT \* FROM( SELECT \* FROM platzi.alumnos ORDER BY id DESC ) AS subquery LIMIT 500;

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

La solucion al reto es tan sencilla como pornerle un NOT antes del IN en la sentencia. ```js SELECT * FROM platzi.alumnos WHERE id NOT IN ( SELECT id FROM platzi.alumnos WHERE tutor_id = 30 ); ```
Mi solucion: ```js SELECT id, * FROM platzi.alumnos WHERE id > ( SELECT COUNT(id) / 2 FROM platzi.alumnos ); ```
```js SELECT * FROM platzi.alumnos WHERE tutor_id <> 30; ```No entiendo por qué hacer una sub query si se puede hacer más sencillo.
Mi query: SELECT \* FROM platzi.alumnos WHERE id not IN (SELECT id FROM platzi.alumnos WHERE tutor\_id = 30 ) Con este resultado obtengo 970 filas