Resumen de los puntos de conocimiento de MySQL
Mientras el valor del campo pueda seguir dividiéndose, no satisface la primera forma normal.
Cuanto más detallado sea el diseño del paradigma, mejor puede ser para algunas operaciones prácticas, pero no todas son beneficiosas y es necesario establecer la situación real del proyecto.
Bajo la premisa de satisfacer la primera forma normal, otras columnas deben depender completamente de la columna de clave principal. Si se produce una dependencia incompleta, solo puede ocurrir en el caso de una clave primaria conjunta:
De hecho, en esta tabla de pedidos, nombre_producto solo depende de id_producto y nombre_cliente solo depende de id_cliente. En otras palabras, nombre_producto y id_cliente son irrelevantes, y nombre_cliente y id_producto son irrelevantes.
Esto no satisface la segunda forma normal: ¡otras columnas deben depender completamente de la columna de clave principal!
Después de la división, product_id y customer_id en la tabla myorder dependen completamente de la clave principal order_id, y otros campos en las tablas de producto y cliente dependen completamente de la clave principal. ¡Diseño que satisface el segundo paradigma!
Bajo la premisa de satisfacer la segunda forma normal, a excepción de la columna de clave principal, no puede haber dependencias transitivas entre otras columnas.
El teléfono_cliente en la tabla puede depender de las columnas order_id y customer_id, lo que no cumple con el tercer diseño de formulario normal: no puede haber dependencias transitivas entre otras columnas.
Después de la modificación, no hay dependencia transitiva entre otras columnas. ¡Otras columnas solo dependen de la columna de clave principal, lo que satisface el diseño del tercer paradigma!
Consulta la nota media de cada curso.
Consulta la puntuación promedio de los cursos que comienzan con 3 y que son tomados por al menos 2 estudiantes en la tabla de puntuación.
La tabla de análisis encontró que al menos 2 estudiantes tomaron los cursos 3-105, 3-245 y 6-166, y los cursos que comenzaron con 3 fueron 3-105 y 3-245. Es decir, queremos consultar las puntuaciones promedio de los grados 3-105 y 3-245.
Consulta el nombre de todos los estudiantes, y el c_no y grado correspondiente del estudiante en la tabla de puntuación.
A través del análisis, podemos encontrar que solo necesitamos reemplazar el valor del campo s_no en la tabla de puntuación con el valor del campo de nombre correspondiente en la tabla de estudiantes.
Consulta las columnas no, nombre del curso (nombre en la tabla del curso) y calificación (título en la tabla de puntuación) de todos los estudiantes.
Solo la puntuación está asociada al no del alumno, por lo que consultando la tabla de puntuación podrás conocer todos los no y títulos relacionados con el alumno:
Luego consulta el tabla de cursos:
Simplemente reemplace c_no en la tabla de puntuación con el valor del campo de nombre correspondiente en la tabla de cursos.
Consulta el nombre, nombre del curso (nombre en la tabla del curso) y título de todos los estudiantes.
Solo la identificación del estudiante y el número de clase están asociados con la tabla de puntuación. Solo necesitamos consultar la tabla de puntuación.
Simplemente reemplace s_no y c_no con los valores de campo de nombre correspondientes en las tablas de estudiantes y srouse.
Primero reemplaza s_no con el campo de nombre en la tabla de estudiantes:
Luego reemplaza c_no con el campo de nombre en la tabla de cursos:
Consulta el número de estudiantes en clase 95031 La calificación promedio del curso.
En la tabla de puntuación, filtre los números de clase y las calificaciones de los estudiantes según los números de estudiantes en la tabla de estudiantes:
En este momento, simplemente agrupe c_no para obtener 95031 estudiantes. cada curso Puntaje promedio:
Consulta todos los registros del estudiante No. 109 cuyo puntaje es mayor que el del No. 109 en el curso 3-105.
Primero filtre los números de clase 3-105 y luego busque todas las filas con calificaciones superiores a las del estudiante número 109.
Consulta los registros de calificaciones de todos los cursos 3-105 cuyas calificaciones sean superiores a las del No. 109.
Consulta todas las columnas de número, nombre y fecha de nacimiento que nacieron en el mismo año que los estudiantes n.° 101 y n.° 108.
Consulta la lista de desempeño de los estudiantes impartida por el maestro 'Zhang Xu'.
Primero busque el número del profesor:
Busque el número de curso del profesor a través de la tabla fuente:
Consulte la tabla de calificaciones a través del número de curso filtrado:
Consultar nombres de profesores con más de 5 alumnos en un curso optativo.
Primero, en la tabla del profesor, utilice el campo no para determinar si el mismo curso del profesor tiene al menos 5 estudiantes como optativas:
Ver la información en la tabla relacionada con el número de profesor:
Hemos descubierto que el campo relacionado con el número de profesor está en la tabla del curso, pero aún no podemos saber qué curso tiene al menos 5 estudiantes tomándolo, por lo que debemos consultarlo en función en la tabla de puntuación:
Según el número de curso filtrado, busque el número de profesor con al menos 5 estudiantes en un curso:
En la tabla de profesores, busque el nombre del profesor según el número de profesor filtrado:
Consulta la lista de calificaciones del curso "Departamento de Informática".
La idea es encontrar primero los números de todos los cursos de informática en la tabla de cursos y luego consultar la tabla de puntuación en función de este número.
Consulta a profesores con diferentes títulos profesionales del Departamento de Informática y del Departamento de Ingeniería Electrónica.
Consulte la tabla de puntuación del curso 3-105 y la puntuación es al menos superior a 3-245.
Consulta la tabla de puntuación de los cursos 3-105 y calificaciones superiores a 3-245.
Consultar la tabla de puntuación de un curso cuya puntuación sea inferior a la puntuación media del curso.
Consulta el nombre y departamento de todos los profesores (hay cursos en la tabla de cursos).
Consulta la clase con al menos 2 chicos en la tabla de estudiantes.
Consulta los registros de estudiantes cuyo apellido no es "Wang" en la tabla de estudiantes.
Consulta el nombre y edad de cada alumno en la tabla de alumnos.
Consulta el valor de cumpleaños más grande y más pequeño en la tabla de estudiantes.
Consulta la tabla de estudiantes en orden ascendente de clase y cumpleaños.
Busca profesores "hombres" y los cursos que toman.
Consulta la tabla de puntuación de los alumnos con mayores puntuaciones.
Consulta el nombre de todos los estudiantes con el mismo género que "Li Jun".
Consulta los nombres de compañeros del mismo género y clase que "Li Jun".
Consulta la lista de puntuaciones de todos los alumnos "varones" que realizaron el curso "Introducción a la Computación".
El número requerido de "Introducción a las Computadoras" y el género "Masculino" se pueden encontrar en las tablas de cursos y estudiantes.
Cree una tabla de calificaciones para representar los niveles de calificaciones de los estudiantes e inserte datos:
Consulte las columnas s_no, c_no y calificaciones de todos los estudiantes.
La idea es utilizar una consulta de intervalo (ENTRE) para determinar si la calificación (título) del estudiante está entre baja y alta en la tabla de calificaciones.
Prepare los datos para probar la consulta de conexión:
Después de analizar las dos tablas, encontramos que la tabla de personas no establece una clave externa de identificación correspondiente en la tabla de tarjetas para cardId campo. Si se establece, la fila con el valor 6 del campo cardId en persona no se puede insertar porque el valor cardId no existe en la tabla de tarjetas.
Para consultar datos relacionados en estas dos tablas, puede usar INNER JOIN (unión interna) para conectarlas.
Muestra la tabla de la izquierda (persona) completamente. Si la tabla de la derecha cumple con las condiciones, se mostrará. Si no cumple con las condiciones, se agregará NULL.
Muestra la tabla de la derecha (tarjeta) por completo. Si la tabla de la izquierda cumple con las condiciones, se mostrará. Si no cumple con las condiciones, se agregará NULL.
Muestra completamente todos los datos de las dos tablas.
En MySQL, una transacción es en realidad la unidad de trabajo indivisible más pequeña. Las transacciones pueden garantizar la integridad de una empresa.
Por ejemplo, nuestra transferencia bancaria:
En un proyecto real, suponiendo que solo una instrucción SQL se ejecuta con éxito y la otra falla, se producirán inconsistencias en los datos.
Por lo tanto, al ejecutar varias declaraciones SQL relacionadas, una transacción puede requerir que estas declaraciones SQL se ejecuten correctamente al mismo tiempo o fallen.
En MySQL, el estado de confirmación automática de las transacciones está activado de forma predeterminada.
La función del envío automático: cuando ejecutamos una declaración SQL, sus efectos se reflejarán inmediatamente y no se pueden revertir.
¿Qué es la reversión? Por ejemplo:
Puede ver que los datos entran en vigor inmediatamente después de ejecutar la declaración de inserción, porque la transacción en MySQL los envía automáticamente a la base de datos. Entonces, la llamada reversión significa deshacer todas las declaraciones SQL ejecutadas y revertirlas al estado en el que se enviaron los datos por última vez.
Utilice ROLLBACK para realizar la reversión en MySQL:
Dado que se han enviado todas las declaraciones SQL ejecutadas, los datos no se han revertido.
Entonces, ¿cómo se pueden revertir los datos?
Después de desactivar el envío automático, los datos de prueba se revierten:
¿Cómo enviar realmente los datos virtuales a la base de datos? Usando COMMIT:
Para la aplicación práctica de transacciones, volvamos al proyecto de transferencia bancaria:
En este momento, suponiendo que ocurra un accidente durante la transferencia, puede usar ROLLBACK para retroceder al estado enviado la última vez:
En este momento volvemos al estado anterior al accidente, es decir, la transacción nos brinda la oportunidad de arrepentirnos. Suponiendo que no haya accidentes en los datos, puede enviar los datos manualmente a la tabla de datos: COMMIT.
Después de activar la confirmación predeterminada de una transacción (@@AUTOCOMMIT = 1), la reversión de la transacción no se puede utilizar en este momento. Pero también podemos abrir manualmente un evento de procesamiento de transacciones para que pueda ocurrir la reversión:
Aún use COMMIT para enviar datos y la reversión de esta transacción no puede ocurrir después del envío.
Las cuatro características principales de las transacciones:
El aislamiento de las transacciones se puede dividir en cuatro tipos (rendimiento de menor a mayor):
Ver el aislamiento predeterminado de la base de datos actual Nivel:
Modificar el nivel de aislamiento:
Probar el aislamiento de LEER NO COMPROMETIDO:
Dado que la transferencia de Xiao Ming se encuentra en una transacción recién abierta. La operación se realiza en la transacción y el resultado de la operación puede ser visto por otras transacciones (la tienda Taobao de la otra parte), por lo que el resultado de la consulta de la tienda Taobao es correcto y la tienda Taobao confirma el pago. Pero en este momento, si Xiao Ming ejecuta el comando ROLLBACK nuevamente en la transacción en la que se encuentra, ¿qué pasará?
Esta es la llamada lectura sucia. Una transacción lee datos que aún no han sido enviados por otra transacción. Esto no está permitido en el desarrollo real.
Establezca el nivel de aislamiento en LEER COMPROMETIDO:
De esta manera, cuando ingresan nuevas transacciones, solo pueden consultar los datos de la transacción que se han enviado. Pero para la transacción actual, todavía ven datos no confirmados, por ejemplo:
Pero todavía hay un problema, es decir, cuando una transacción está operando con datos, otras transacciones interfieren con los datos de esta transacción. Por ejemplo:
Aunque READ COMMITTED nos permite leer solo datos que han sido enviados por otras transacciones, aún habrá problemas, es decir, al leer datos de la misma tabla, pueden ocurrir inconsistencias. * Esto se llama * fenómeno de lectura no repetible (LECTURA COMPROMETIDA).
Establezca el nivel de aislamiento en REPEATABLE READ (se puede leer repetidamente):
Pruebe REPEATABLE READ, asumiendo que START TRANSACTION se ejecuta en dos conexiones diferentes:
Después de abrir la transacción actual y antes de enviarla, no se puede consultar, pero se puede consultar después de enviarla. Sin embargo, si se inician otras transacciones antes del envío, en esta línea de transacción no se consultará la conexión que actualmente opera la transacción. Equivale a abrir un hilo separado.
Independientemente de si Xiao Zhang ha ejecutado COMMIT o no, Xiao Wang no consultará los registros de transacciones de Xiao Zhang, solo consultará los registros de sus propias transacciones:
Esto se debe a que Xiao Wang abrió una nueva transacción (INICIAR TRANSACCIÓN) * antes de esto, por lo que * en la línea de su nueva transacción, no tiene conexión con otras transacciones. Es decir, si en este momento otras transacciones están manipulando datos, lo cual es así. inconsciente de.
Sin embargo, el hecho es que en la tabla de datos reales, Xiao Zhang ya ha insertado un dato. Pero Xiao Wang no lo sabía en este momento e insertó el mismo dato. ¿Qué pasaría?
Se informó un error y se informó a la operación que ya existe un campo con una clave primaria de 6. Este fenómeno también se denomina lectura fantasma. Los datos enviados por una transacción no pueden ser leídos por otras transacciones.
Como su nombre lo indica, todas las operaciones de escritura de transacciones están serializadas. ¿Cuál es el significado? Cambie el nivel de aislamiento a SERIALIZABLE:
O tome a Xiao Zhang y Xiao Wang como ejemplo:
¿Qué pasará en este momento? Dado que el nivel de aislamiento actual es SERIALIZABLE (serialización), serialización significa: suponiendo que todas las transacciones se colocan en una cola en serie, todas las transacciones se ejecutarán en un orden fijo. Después de ejecutar una transacción, continúe ejecutando la operación de escritura de la siguiente. transacción (esto significa que solo se puede ejecutar una operación de escritura de una transacción en la cola al mismo tiempo).
Según esta explicación, cuando Xiao Wang inserta datos, aparecerá un estado de espera hasta que Xiao Zhang ejecute COMMIT para finalizar la transacción en la que se encuentra, o se produzca un tiempo de espera.
Reimpresión: /baa-god/sql_node/blob/master/mysql/