MySQL50-10-Вопросы 36-40
В этой статье представлены темы 36–40. Задействованными точками знаний являются запросы на соединение с несколькими таблицами, и необходимо указать различные условия. 5 тем:
- Найдите название, название курса и оценку любого курса, набравшего 70 или более баллов.
- Узнать о неудачных курсах
- Запросите номер учащегося и имя учащегося, номер курса которого равен 01 и чья оценка за курс больше или равна 80.
- Количество студентов на курс
- Запросите информацию об учениках с наивысшими оценками и их оценках среди учеников, прошедших курсы, преподаваемые учителем «Чжан Сан».
Тема 36
требования темы
Найдите название, название курса и оценку любого курса, набравшего 70 или более баллов.
Процесс анализа
Оценка за курс: Оценка
Название курса: Курс
Имя: Студент
Реализация SQL
select
s.s_name
,c.c_name
,sc.s_score
from Score sc -- 成绩表
join Student s -- 学生信息表
on sc.s_id = s.s_id
join Course c -- 课程表
on sc.c_id = c.c_id
where sc.s_score > 70
group by s.s_name, c.c_name, sc.s_score;
тема 37
требования темы
Узнать о неудачных курсах
Процесс анализа
- Ошибка: s_score меньше 60 баллов, что соответствует s_score в таблице Score.
- Курс: Таблица курсов
Реализация SQL
select
sc.c_id
,c.c_name
,sc.s_score
from Score sc
join Course c
on sc.c_id = c.c_id
where sc.s_score < 60;
тема 38
требования темы
Запросите номер учащегося и имя учащегося, чей номер курса равен 01 и чья оценка за курс больше или равна 80.
Процесс анализа
- Идентификатор курса: Score, c_id
- Оценки за курс: Score, s_score
- Идентификатор и имя учащегося: Студент, s_id, s_name
Реализация SQL
select
sc.s_id
,s.s_name
,sc.s_score
from Score sc -- 成绩表
join Student s -- 学生信息表
on sc.s_id = s.s_id
join Course c -- 课程表
on sc.c_id = c.c_id
where c.c_id = 01
and sc.s_score >= 80;
тема 39
требования темы
Количество студентов на курс
Процесс анализа
Определить количество студентов на каждом курсе напрямую по c_id в Score
Реализация SQL
select
c_id
,count(s_id)
from Score
group by c_id;
Если вы хотите подключиться к имени класса:
-- 报错!!!
select
sc.c_id
,c.c_name
,count(sc.s_id)
from Score sc
join Course c
group by sc.c_id;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.c.c_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Решение состоит в том, чтобы объединить запрос с нашими предыдущими результатами в виде временной таблицы и таблицы курса:
select
c.c_name 课程名称
,c.c_id 课程编号
,t.num 人数
from Course c
join(select
c_id
,count(s_id) num
from Score
group by c_id)t -- 上面结果的临时表
on c.c_id = t.c_id;
тема 40
требования темы
Запросите информацию об учениках с наивысшими оценками и их оценках среди учеников, прошедших курсы, преподаваемые учителем «Чжан Сан».
Процесс анализа
Учитель Чжан Сан: Учитель
Курс: Курс
Оценка: Оценка
Информация о студенте: Студент
Эта тема включает в себя 4 таблицы, нам нужен запрос на объединение нескольких таблиц
Реализация SQL
1. Давайте узнаем, какие курсы вел г-н Чжан Сан
select
c.c_id
,c.c_name
from Course c
join Teacher t
on c.t_id = t.t_id
where t.t_name = '张三';
2. Узнайте, кто сдавал математику
select
sc.s_id
,sc.s_score
from Score sc
left join Course c
on sc.c_id = c.c_id
left join Teacher t
on c.t_id = t.t_id
where t.t_name = '张三';
3. Найдите наивысший балл оценки с помощью функции max.
select
max(sc.s_score)
from Score sc
left join Course c
on sc.c_id = c.c_id
left join Teacher t
on c.t_id = t.t_id
where t.t_name = '张三';
4. Подключите таблицу Student, чтобы узнать информацию о студенте.
select
s.*
,sc.s_score
,sc.c_id
,c.c_name
from Student s
left join Score sc
on s.s_id = sc.s_id
left join Course c
on sc.c_id = c.c_id
where sc.s_score in (select max(sc.s_score) -- 最大值90分的确定
from Score sc
left join Course c
on sc.c_id = c.c_id
left join Teacher t
on c.t_id = t.t_id
where t.t_name = '张三');