存储过程的新手
New to Stored Procedures
手头的任务创建一个名为 MentoringCount() 的存储过程,它显示教授姓名和接受指导的学生人数输出需要按教授姓名排序,然后我需要创建第二个不需要的过程计算并需要显示没有指导的教授,我认为我可以导入大部分第一个程序并将 mentor =1 编辑为 mentor = 0
我目前坚持创建第一个程序,这是我在下面编写的代码我在包含“Order by professor.professorName”的行中收到错误我认为我是正确的轨道但是不完全确定我是不是或者我的代码是否一团糟
DELIMITER //
CREATE PROCEDURE MentoringCount()
BEGIN
SELECT
professor.ProfessorName,
(COUNT(student_professor.student_professor_id)) AS 'StudentNo'
FROM professor
LEFT JOIN student_professor
ON student_professor.ProfessorId = professor.ProfessorId
AND student_professor.Mentor =1;
ORDER BY professor.professorName
END //
DELIMITER;
下面是包含任务相关信息的表格
StudentProfessor Table
student_professor_id
ProfessorID
StudentNo
Mentor
professor Table
ProfessorID
ProfessorName
student Table
studentno
你的代码中有一个简单的语法错误,分号在语句的中间。
此外,您的查询可能只有 return 一行,因为您在未定义的聚合上使用了 COUNT()
聚合函数。使用此类函数时,应始终包含 GROUP BY
语句。 Mysql 有一个奇怪的默认行为,假设您想要对所有行进行分组而不是抛出错误消息。
DELIMITER //
CREATE PROCEDURE MentoringCount()
BEGIN
SELECT
professor.ProfessorName,
COUNT(student_professor.student_professor_id) AS 'StudentNo'
FROM professor
LEFT JOIN student_professor
ON student_professor.ProfessorId = professor.ProfessorId
AND student_professor.Mentor = 1
GROUP BY professor.professorName;
END //
DELIMITER;
关于 DELIMITER
的注释:
由于您需要在过程中存储完整的语句(以 ;
结尾),DELIMITER
将过程创建期间的字符序列更改为 //
,因此 ;
在 中,过程作为文本处理,而不是 CREATE PROCEDURE
语句的一部分。
这就是语法错误仅在执行过程时出现而不是在创建过程时出现的原因。在创建期间,CREATE
语句的内部只是作为过程存储的一些(几乎)纯文本。它没有被解析。
编辑
你 select ALL 教授然后 LEFT JOIN
师徒关系。如果您只想查看匹配 Mentor = 1
的行,您可以将 ON
条件移动到 WHERE
子句,或者将 LEFT JOIN
切换到 INNER JOIN
.
即
SELECT .. FROM professor
LEFT JOIN student_professor
ON student_professor.ProfessorId = professor.ProfessorId
WHERE student_professor.Mentor = 1
GROUP BY professor.professorName;
或
SELECT .. FROM professor
INNER JOIN student_professor
ON student_professor.ProfessorId = professor.ProfessorId
AND student_professor.Mentor = 1
GROUP BY professor.professorName;
如果您想了解原因,请查看文档中 INNER
和 LEFT
JOIN 之间的区别,以及 ON
和 WHERE
子句之间的区别.
手头的任务创建一个名为 MentoringCount() 的存储过程,它显示教授姓名和接受指导的学生人数输出需要按教授姓名排序,然后我需要创建第二个不需要的过程计算并需要显示没有指导的教授,我认为我可以导入大部分第一个程序并将 mentor =1 编辑为 mentor = 0
我目前坚持创建第一个程序,这是我在下面编写的代码我在包含“Order by professor.professorName”的行中收到错误我认为我是正确的轨道但是不完全确定我是不是或者我的代码是否一团糟
DELIMITER //
CREATE PROCEDURE MentoringCount()
BEGIN
SELECT
professor.ProfessorName,
(COUNT(student_professor.student_professor_id)) AS 'StudentNo'
FROM professor
LEFT JOIN student_professor
ON student_professor.ProfessorId = professor.ProfessorId
AND student_professor.Mentor =1;
ORDER BY professor.professorName
END //
DELIMITER;
下面是包含任务相关信息的表格
StudentProfessor Table
student_professor_id
ProfessorID
StudentNo
Mentor
professor Table
ProfessorID
ProfessorName
student Table
studentno
你的代码中有一个简单的语法错误,分号在语句的中间。
此外,您的查询可能只有 return 一行,因为您在未定义的聚合上使用了 COUNT()
聚合函数。使用此类函数时,应始终包含 GROUP BY
语句。 Mysql 有一个奇怪的默认行为,假设您想要对所有行进行分组而不是抛出错误消息。
DELIMITER //
CREATE PROCEDURE MentoringCount()
BEGIN
SELECT
professor.ProfessorName,
COUNT(student_professor.student_professor_id) AS 'StudentNo'
FROM professor
LEFT JOIN student_professor
ON student_professor.ProfessorId = professor.ProfessorId
AND student_professor.Mentor = 1
GROUP BY professor.professorName;
END //
DELIMITER;
关于 DELIMITER
的注释:
由于您需要在过程中存储完整的语句(以 ;
结尾),DELIMITER
将过程创建期间的字符序列更改为 //
,因此 ;
在 中,过程作为文本处理,而不是 CREATE PROCEDURE
语句的一部分。
这就是语法错误仅在执行过程时出现而不是在创建过程时出现的原因。在创建期间,CREATE
语句的内部只是作为过程存储的一些(几乎)纯文本。它没有被解析。
编辑
你 select ALL 教授然后 LEFT JOIN
师徒关系。如果您只想查看匹配 Mentor = 1
的行,您可以将 ON
条件移动到 WHERE
子句,或者将 LEFT JOIN
切换到 INNER JOIN
.
即
SELECT .. FROM professor
LEFT JOIN student_professor
ON student_professor.ProfessorId = professor.ProfessorId
WHERE student_professor.Mentor = 1
GROUP BY professor.professorName;
或
SELECT .. FROM professor
INNER JOIN student_professor
ON student_professor.ProfessorId = professor.ProfessorId
AND student_professor.Mentor = 1
GROUP BY professor.professorName;
如果您想了解原因,请查看文档中 INNER
和 LEFT
JOIN 之间的区别,以及 ON
和 WHERE
子句之间的区别.