SQL avanzado: qué pasó con la instrucción select, consolidando la base para escribir SQL complejo

1. Preparativos

Se preparan dos mesas para la prueba.

-- ----------------------------
-- Table structure for info
-- ----------------------------
DROP TABLE IF EXISTS `info`;
CREATE TABLE `info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `views` int(255) DEFAULT NULL,
  `info_type_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

-- ----------------------------
-- Table structure for info_type
-- ----------------------------
DROP TABLE IF EXISTS `info_type`;
CREATE TABLE `info_type` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

Importe el sql anterior en navicat

hoja de información

tabla info_type

2. ¿Qué pasó con la instrucción select?

Ahora quiero consultar todos los datos en la tabla de información, es fácil escribir el siguiente sql

SELECT * FROM info;

No sé si lo has pensado, ¿qué pasó cuando seleccionaste?

De hecho, cuando se ejecuta la declaración sql, si ve seleccionar, consultará uno por uno de acuerdo con el nombre de la tabla detrás y finalmente lo fusionará en el conjunto de resultados.

Si añadimos una condición where, entonces se realizará el cribado.

Tenga en cuenta que esta evaluación ocurre en cada estado de cuenta.

Por ejemplo, cuando ejecuta la declaración SELECT * from info where info_type_id = 2;, se necesitan 0,001 ms para consultar estos datos.

Disculpe, ¿cumple con las condiciones de dónde? Si no coincide, este se filtrará y continuará con el siguiente.

Al final, se filtran los que no cumplen las condiciones y se filtran los que cumplen las condiciones.

3. Consultas complejas

Lo siguiente introduce un SQL que prueba el pensamiento, lo cual es muy adecuado para revisar nuestro conocimiento SQL existente.

Para algunos requisitos complejos, aumentará la dificultad de escribir SQL.

Por ejemplo, ahora pido consultar info_type_id=3, y los dos datos con las vistas de página más altas, ¿cómo escribirlo?

Primero mira todos los datos de info_type_id=3

SELECT * from info where info_type_id = 3;

Para los dos datos más vistos, es fácil pensar en ordenar las vistas en orden inverso y luego tomar las dos primeras.

SELECT * from info where info_type_id = 3 ORDER BY views desc;

Entonces, ¿cómo tomar los dos primeros? Solo pagina directamente.

SELECT * from info where info_type_id = 3 ORDER BY views desc LIMIT 0,2;

¿Qué pasa si quiero usar un SQL para obtener las dos páginas principales con la mayor cantidad de páginas vistas en cada categoría?

Creo que la primera reacción de mucha gente es usar grupo por grupo, pero parece ser más difícil.

De hecho, siempre que tengamos en cuenta que el principio de selección es escanear y emparejar uno por uno, no es difícil.

Por ejemplo, escaneamos a la primera entrada:

Pensando, ¿cómo juzgar si las vistas (páginas vistas) de este artículo son las dos primeras de este tipo (info_type_id=3)?

¿Solo necesitamos hacer info_type_id=3 en esta tabla (condición 1) y vistas mayores que las vistas de estos datos (condición 2), y luego requerir que dichos datos sean <= 1 (condición 3)?

Hable acerca de por qué se requieren tales datos <= 1?

Si es igual a 1, significa que solo hay una vista más grande que la vista actual, y sumando esta son las dos vistas más altas, que cumplen las condiciones.

Si es menor a 1, significa que nadie es más grande que la vista actual, entonces la actual es la que tiene las vistas más altas, lo que cumple la condición.

Entonces, para el caso de info_type_id=3, obtenga sql

select t1.* from info t1 where  t1.info_type_id = 3
		and (select count(1) from info t2  where  t2.info_type_id = 3 and t2.views > t1.views ) <= 1

Éxito, y luego reescríbalo para todos los casos:

SELECT t1.* from info t1
where (
	select count(1) from info t2  where  t2.info_type_id = t1.info_type_id 
		and t2.views > t1.views ) <= 1
order by info_type_id;

En definitiva, hay que tener en cuenta que a la hora de seleccionar se ejecuta uno a uno, y la condición where es filtrar cada elemento. Un SQL tan complejo no es difícil de entender.

 Soy el Hermano Conejo, sígueme, no te pierdas aprendiendo programación~~

Supongo que te gusta

Origin blog.csdn.net/weixin_39570751/article/details/124111515
Recomendado
Clasificación