Consulta de tabla conjunta de mysql (tabla de estudiantes, tabla de profesores, tabla de puntuaciones, tabla de planes de estudios)

1 Declaración de la biblioteca

create database if not exists studentinfo character set utf8mb4;

2 Declaración de construcción de mesa

Inserte la descripción de la imagen aquí

Un alumno puede elegir varios cursos y un curso corresponde a varios alumnos, por lo que se necesita una tabla de relaciones (student_course). Para mayor comodidad, además de poner la identificación del estudiante y la identificación del curso en student_course, también coloque las calificaciones en la tabla de relaciones. El otro curso corresponde a un profesor.

(1) Mesa de estudiantes (estudiante)

create table student(
 s_id int,
 sname varchar(20),
 sage int,
 sgender varchar(8)
)

(2) Horario del curso

create table course(
  c_id int,
  cname varchar(20),
  t_id int
)

(3) Tabla de relaciones (student_course) -tabla de relaciones entre estudiantes y cursos

create table student_course(
 s_id int, # 学生id
 c_id int, # 课程id
 score int # 成绩
)

(4) Mesa de profesores (profesor)

create table teacher(
	t_id int,  #老师id
	tname varchar(20)  # 老师姓名
)

3 Insertar datos de prueba

(1) Inserte los datos del estudiante

insert into student select 1,N'刘一',18,N'男' union all
 select 2,N'钱二',19,N'女' union all
 select 3,N'张三',17,N'男' union all
 select 4,N'李四',18,N'女' union all
 select 5,N'王五',17,N'男' union all
 select 6,N'赵六',19,N'女' ;

Nota:

  • N indica que la siguiente cadena es un carácter Unicode.
  • Unión: operación de unión de dos conjuntos de resultados, excluyendo filas duplicadas y ordenando por reglas predeterminadas al mismo tiempo;
  • Unir todo: realice la operación de unión en dos conjuntos de resultados, incluidas las filas duplicadas, sin ordenar;
  • Tenga en cuenta que puede usar seleccionar al insertar usando insertar (debe asegurarse de que el campo de consulta sea consistente con el campo insertado)
insert into student values(1,’张三’,1203);
insert into test_user(name, email) select name, qq_mail from student;

(2) Insertar datos del profesor

 insert into teacher select 1,N'叶平' union all
 select 2,N'贺高' union all
 select 3,N'杨艳' union all
 select 4,N'周磊';

(3) Insertar datos del curso

 insert into course select 1,N'语文',1 union all
 select 2,N'数学',2 union all
 select 3,N'英语',3 union all
 select 4,N'物理',4;

(4) Insertar datos de tabla relacional

insert into student_course 
 select 1,1,56 union all 
 select 1,2,78 union all 
 select 1,3,67 union all 
 select 1,4,58 union all 
 select 2,1,79 union all 
 select 2,2,81 union all 
 select 2,3,92 union all 
 select 2,4,68 union all 
 select 3,1,91 union all 
 select 3,2,47 union all 
 select 3,3,88 union all 
 select 3,4,56 union all 
 select 4,2,88 union all 
 select 4,3,90 union all 
 select 4,4,93 union all 
 select 5,1,46 union all 
 select 5,3,78 union all 
 select 5,4,53 union all 
 select 6,1,35 union all 
 select 6,2,68 union all 
 select 6,4,71;

4 Preguntas frecuentes

(1) Consultar la identificación de estudiante de todos los estudiantes cuya identificación sea "001" y cuya puntuación sea superior a "002";

	 select a.s_id FROM
	 (select s_id,score from student_course where c_id = '001') a,(select s_id,score from student_course where c_id = '002') b
	 where a.score > b.score and a.s_id = b.s_id;
| s_id |
+------+
|    3 |

(2) Consultar el número de alumnos y la puntuación media con una puntuación media superior a 60;

select s_id,avg(score)
	  from student_course
    group by s_id
    having avg(score)>60;
| s_id | avg(score) |
+------+------------+
|    1 |    64.7500 |
|    2 |    80.0000 |
|    3 |    70.5000 |
|    4 |    90.3333 |

(3) Consultar la identificación del estudiante, nombre, número de cursos y puntaje total de todos los estudiantes;

select s.s_id,s.sname, count(sc.c_id),sum(sc.score) from 
student s left join student_course sc on s.s_id = sc.s_id 
group by s.s_id, s.sname;
| s_id | sname  | count(student_course.c_id) | sum(score) |
+------+--------+----------------------------+------------+
|    1 | 刘一   |                          4 |        259 |
|    2 | 钱二   |                          4 |        320 |
|    3 | 张三   |                          4 |        282 |
|    4 | 李四   |                          3 |        271 |
|    5 | 王五   |                          3 |        177 |
|    6 | 赵六   |                          3 |        174 |

(4) Consultar el número de profesores con el apellido "Ye";

select count(*) from teacher where tname like '叶%';
| count(*) |
+----------+
|        1 |

(5) Consultar el número de alumno y el nombre de los alumnos que no han estudiado el curso del profesor "Ye Ping";

 select s.s_id, s.sname from student s where s.s_id 
 not in (select sc.s_id from student_course sc, course c, teacher t 
 where sc.c_id = c.c_id and c.t_id=t.t_id and  t.tname='叶平');
| s_id | sname  |
+------+--------+
|    4 | 李四   |

(6) Consultar el ID de estudiante y el nombre de los estudiantes que han estudiado "001" y también han estudiado el número de curso "002";

select s.s_id, s.sname from student s,student_course sc where 
sc.s_id = s.s_id and sc.c_id = '001' 
and exists (select * from student s1, student_course sc1
 where s1.s_id=sc1.s_id and sc1.c_id='002' );
| s_id | sname  |
+------+--------+
|    1 | 刘一   |
|    2 | 钱二   |
|    3 | 张三   |
|    6 | 赵六

Nota:
La subconsulta correspondiente a existe en realidad no devuelve ningún dato, sino que devuelve Verdadero o Falso. EXISTS especifica una subconsulta, que se utiliza principalmente para detectar la existencia de filas.

(7) Consultar el número de alumno y el nombre de los alumnos que han cursado todos los cursos impartidos por el profesor "Ye Ping";

 select s.s_id,s.sname from student s 
 where s.s_id in (select sc.s_id from student_course sc,course c, teacher t 
 where sc.c_id = c.c_id and c.t_id = t.t_id and t.tname ='叶平');
| s_id | sname  |
+------+--------+
|    1 | 刘一   |
|    2 | 钱二   |
|    3 | 张三   |
|    5 | 王五   |
|    6 | 赵六   |

(8) Consultar la identificación del estudiante y el nombre de todos los estudiantes cuyas calificaciones del curso número "002" sean inferiores a las del curso número "001";

select a.s_id,a.sname from 
(select sc.s_id,sc.score,s.sname from student_course sc,student s 
where sc.s_id=s.s_id and sc.c_id='001')a, 
(select sc.s_id,sc.score from student_course sc,student s 
where sc.s_id=s.s_id and sc.c_id='002') b 
where a.s_id=b.s_id and a.score>b.score;
| s_id | sname  |
+------+--------+
|    3 | 张三   |
+------+--------+

(9) Consultar la identificación del estudiante y el nombre de todos los estudiantes cuyos puntajes en el curso son menos de 60 puntos;

select s.s_id,s.sname from student s 
where s.s_id in (select sc.s_id from student_course sc 
where sc.score<60);
 s_id | sname  |
+------+--------+
|    1 | 刘一   |
|    3 | 张三   |
|    5 | 王五   |
|    6 | 赵六   |

(10) Consultar la identificación del estudiante y el nombre de los estudiantes que no han estudiado todos los cursos;

 select s.s_id,s.sname from student s, student_course sc 
 where sc.s_id = s.s_id group by s.s_id,s.sname 
 having count(sc.c_id)<(select count(c_id) from course);
| s_id | sname  |
+------+--------+
|    4 | 李四   |
|    5 | 王五   |
|    6 | 赵六   |

Nota:
Las funciones de agregación, como contar, no se pueden utilizar en la cláusula where. La función de la cláusula where es filtrar los datos antes de agrupar y tener que filtrar los datos después de la agrupación. Las condiciones suelen incluir funciones de agregación.

(11) Consultar la identificación del estudiante y el nombre de al menos una clase que sea igual al estudiante cuya identificación de estudiante es "1";

select distinct s.s_id,s.sname from student s,student_course sc 
where s.s_id=sc.s_id and sc.c_id in 
(select c.c_id from student s, course c, student_course sc
 where s.s_id = sc.s_id and s.s_id = '1');
| s_id | sname  |
+------+--------+
|    1 | 刘一   |
|    2 | 钱二   |
|    3 | 张三   |
|    4 | 李四   |
|    5 | 王五   |
|    6 | 赵六   |

(12) Organice las dos últimas letras de sname en la tabla de estudiantes en orden ascendente

select sname from student order by substr(sname,length(sname)-1,2);

Uso de substr:

substr(string string,num start,num length);

string为字符串;

start为起始位置;

length为长度。

Artículo de referencia: http://www.manongjc.com/article/41690.html

Supongo que te gusta

Origin blog.csdn.net/glpghz/article/details/108304216
Recomendado
Clasificación