Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

Оператор 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 , б)}
Оператор MySQL series-DML для запроса на соединение с несколькими таблицами
Простейшее соединение нескольких таблиц:

select * from teacher,course;

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

Соединение с несколькими таблицами внутреннее соединение


内连接是多表连接中使用最广泛也是最简单的连接查询,内连接及多表的交集部分。

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

select * from teacher join course on teacher.tno=course.tno;

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами
Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

Соединение с несколькими таблицами, внешнее соединение


Левое соединение: все данные в левой таблице + данные, которые соответствуют условиям в правой таблице

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами


select * from course left join teacher on teacher.tno=course.tno;

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами
Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

Правое соединение: все данные в правой таблице + данные, соответствующие условиям в левой таблице
Оператор MySQL series-DML для запроса на соединение с несколькими таблицами


select * from course right join teacher on teacher.tno=course.tno;

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами
Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

Многостоловый бой


①Проверьте, сколько курсов выучил zhang3


select sname,count(sc.sno) from student join sc on student.sno=sc.sno and student.sname='zhang3' group by sc.sno;

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

② Спросите, как называются курсы, которые изучает 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;

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

③ Спросите имя ученика, которого преподает учитель Яньхуэй.


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;

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

④ Запросите средний балл курсов, проводимых янхуэй


 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;

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

⑤Средний балл курсов, проводимых каждым преподавателем, отсортированный по среднему баллу


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);

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

⑥Проверьте неуспевающих учеников, которых учил учитель Яньхуэй


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;

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

⑦ Запрашивайте всю информацию, которую учитель преподает ученикам, которые не смогли


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;

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

⑧ Запросите количество учащихся и среднюю оценку учащихся, средний балл которых превышает 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;

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

⑨ Запросите студенческий билет, имя, количество курсов и общий балл всех студентов


select student.sno,student.sname,count(sc.sno),sum(sc.score) from student join sc on student.sno=sc.sno group by sc.sno;

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

⑩ Запросить самые высокие и самые низкие оценки по каждому предмету: отображать в следующем формате: идентификатор курса, самый высокий балл, самый низкий балл


select sc.cno,min(sc.score),max(sc.score) from sc group by sc.cno;

Оператор MySQL series-DML для запроса на соединение с несколькими таблицами

рекомендация

отblog.51cto.com/15082392/2656034
рекомендация