Оператор MySQL series-DML для запроса на соединение с несколькими таблицами
Эксплуатация и обслуживание YouthO & M Youth
Описание серии статей
Статьи серии MySQL включают установку программного обеспечения, конкретное использование, резервное копирование и восстановление и т. Д., Которые в основном используются для записи личных заметок об исследованиях.Основная используемая версия MySQL - 5.7.28, а версия серверной системы - CentOS 7.5. Эта глава предназначена для выбора содержимого запроса на соединение нескольких таблиц, в этой главе используется школьная база данных.
Подготовка окружающей среды:
①Создайте базу данных
CREATE DATABASE school CHARSET utf8mb4;
USE school;
②Новый студенческий стол
CREATE TABLE student(
sno INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
sname VARCHAR(20) NOT NULL COMMENT '姓名',
sage TINYINT UNSIGNED NOT NULL COMMENT '年龄',
ssex ENUM('f','m') NOT NULL DEFAULT 'm' COMMENT '性别'
)ENGINE=INNODB CHARSET utf8mb4;
③Новый список учителей
CREATE TABLE teacher(
tno INT NOT NULL PRIMARY KEY COMMENT '教师编号',
tname VARCHAR(20) NOT NULL COMMENT '教师名字'
)ENGINE=INNODB CHARSET utf8mb4;
④Новая учебная программа
CREATE TABLE course(
cno INT NOT NULL PRIMARY KEY COMMENT '课程编号',
cname VARCHAR(20) NOT NULL COMMENT '课程名称',
tno INT NOT NULL COMMENT '教师编号'
)ENGINE=INNODB CHARSET utf8mb4;
⑤Создайте новый протокол
CREATE TABLE sc(
sno INT NOT NULL COMMENT '学号',
cno INT NOT NULL COMMENT '课程标号',
score INT NOT NULL DEFAULT 0 COMMENT '成绩'
)ENGINE=INNODB CHARSET utf8mb4;
⑥ Вставить данные
INSERT INTO student(sno,sname,sage,ssex) VALUES(1,'zhang3',18,'m'),
(2,'zhang4',18,'m'),
(3,'li4',18,'m'),
(4,'wang5',19,'f'),
(5,'zh4',18,'m'),
(6,'zhao4',18,'m'),
(7,'ma6',19,'f'),
(8,'yunwei',20,'m'),
(9,'arp',20,'f'),
(10,'oldp',25,'m');
INSERT INTO teacher(tno,tname) VALUES(101,'hansir'),(102,'yanhui'),(103,'hongca');
INSERT INTO course(cno,cname,tno) VALUES(1001,'linux',101),(1002,'python',102),(1003,'mysql',103);
INSERT INTO sc(sno,cno,score) VALUES
(1,1001,80),
(1,1002,59),
(2,1002,90),
(2,1003,100),
(3,1001,99),
(3,1003,40),
(4,1001,79),
(4,1002,61),
(4,1003,99),
(5,1003,40),
(6,1001,89),
(6,1003,77),
(7,1001,67),
(7,1003,82),
(8,1001,70),
(9,1003,80),
(10,1003,96);
Запрос соединения нескольких таблиц
Почему для подключения нескольких таблиц требуется подключение нескольких таблиц?
Потребности нашего запроса, данные, которые нам нужны, могут поступать из нескольких таблиц, одна таблица не может удовлетворить
формат:
select 列1,列2... from 表1 join 表2... on 条件;
Соединить несколько таблиц декартово произведение
Что такое декартово произведение?
Например, A = {a, b}, B = {0,1,2}, тогда
A × B = {(a, 0), (a, 1), (a, 2), (b, 0) , (b, 1), (b, 2))
B × A = {(0, a), (0, b), (1, a), (1, b), (2, a), (2 , б)}
Простейшее соединение нескольких таблиц:
select * from teacher,course;
Соединение с несколькими таблицами внутреннее соединение
内连接是多表连接中使用最广泛也是最简单的连接查询,内连接及多表的交集部分。
select * from teacher join course on teacher.tno=course.tno;
Соединение с несколькими таблицами, внешнее соединение
Левое соединение: все данные в левой таблице + данные, которые соответствуют условиям в правой таблице
select * from course left join teacher on teacher.tno=course.tno;
Правое соединение: все данные в правой таблице + данные, соответствующие условиям в левой таблице
select * from course right join teacher on teacher.tno=course.tno;
Многостоловый бой
①Проверьте, сколько курсов выучил zhang3
select sname,count(sc.sno) from student join sc on student.sno=sc.sno and student.sname='zhang3' group by sc.sno;
② Спросите, как называются курсы, которые изучает zhang3
select student.sno,student.sname,group_concat(course.cname) from student join sc on student.sno=sc.sno join course on sc.cno=course.cno and student.sname='zhang3' group by student.sno;
③ Спросите имя ученика, которого преподает учитель Яньхуэй.
select teacher.tname,group_concat(student.sname) from student join sc on student.sno=sc.sno join course on sc.cno=course.cno join teacher on teacher.tno=course.tno where teacher.tname='yanhui' group by teacher.tno;
④ Запросите средний балл курсов, проводимых янхуэй
select teacher.tname,avg(sc.score) from teacher join course on teacher.tno=course.tno join sc on sc.cno=course.cno where teacher.tname='yanhui' group by teacher.tno,course.cno;
⑤Средний балл курсов, проводимых каждым преподавателем, отсортированный по среднему баллу
select teacher.tname,avg(sc.score) from teacher join course on teacher.tno=course.tno join sc on sc.cno=course.cno group by teacher.tno order by avg(sc.score);
⑥Проверьте неуспевающих учеников, которых учил учитель Яньхуэй
select teacher.tname,student.sname from teacher join course on teacher.tno=course.tno and teacher.tname='yanhui' join sc on sc.cno=course.cno and sc.score<60 join student on student.sno=sc.sno;
⑦ Запрашивайте всю информацию, которую учитель преподает ученикам, которые не смогли
select teacher.tname,group_concat(student.sname) from teacher join course on teacher.tno=course.tno join sc on sc.cno=course.cno and sc.score<60 join student on student.sno=sc.sno group by teacher.tno;
⑧ Запросите количество учащихся и среднюю оценку учащихся, средний балл которых превышает 60 баллов.
select student.sname,avg(sc.score) from student join sc on student.sno=sc.sno group by sc.sno having avg(sc.score)>60;
⑨ Запросите студенческий билет, имя, количество курсов и общий балл всех студентов
select student.sno,student.sname,count(sc.sno),sum(sc.score) from student join sc on student.sno=sc.sno group by sc.sno;
⑩ Запросить самые высокие и самые низкие оценки по каждому предмету: отображать в следующем формате: идентификатор курса, самый высокий балл, самый низкий балл
select sc.cno,min(sc.score),max(sc.score) from sc group by sc.cno;