• 学生信息管理系统


    DDL和DML

    1. -- 创建学生表
    2. CREATE TABLE students (
    3. student_id INT PRIMARY KEY AUTO_INCREMENT,
    4. name VARCHAR(50),
    5. age INT,
    6. gender VARCHAR(10)
    7. );
    8. -- 创建课程表
    9. CREATE TABLE courses (
    10. course_id INT PRIMARY KEY AUTO_INCREMENT,
    11. course_name VARCHAR(50)
    12. );
    13. -- 创建教师表
    14. CREATE TABLE teachers (
    15. teacher_id INT PRIMARY KEY AUTO_INCREMENT,
    16. name VARCHAR(50),
    17. department VARCHAR(50)
    18. );
    19. -- 创建成绩表
    20. CREATE TABLE grades (
    21. grade_id INT PRIMARY KEY AUTO_INCREMENT,
    22. student_id INT,
    23. course_id INT,
    24. grade DECIMAL(5, 2),
    25. FOREIGN KEY (student_id) REFERENCES students(student_id),
    26. FOREIGN KEY (course_id) REFERENCES courses(course_id)
    27. );
    28. -- 创建授课表
    29. CREATE TABLE teachings (
    30. teaching_id INT PRIMARY KEY AUTO_INCREMENT,
    31. teacher_id INT,
    32. course_id INT,
    33. FOREIGN KEY (teacher_id) REFERENCES teachers(teacher_id),
    34. FOREIGN KEY (course_id) REFERENCES courses(course_id)
    35. );
    36. -- 插入学生数据
    37. INSERT INTO students (name, age, gender)
    38. VALUES ('张三', 18, '男'),
    39. ('李四', 19, '女'),
    40. ('王五', 20, '男');
    41. -- 插入课程数据
    42. INSERT INTO courses (course_name)
    43. VALUES ('数学'),
    44. ('英语'),
    45. ('物理');
    46. -- 插入教师数据
    47. INSERT INTO teachers (name, department)
    48. VALUES ('赵老师', '数学系'),
    49. ('钱老师', '英语系'),
    50. ('孙老师', '物理系');
    51. -- 插入成绩数据
    52. INSERT INTO grades (student_id, course_id, grade)
    53. VALUES (1, 1, 85.5),
    54. (1, 2, 78.0),
    55. (2, 1, 90.0),
    56. (2, 2, 88.5),
    57. (3, 1, 75.0),
    58. (3, 3, 80.0);
    59. -- 插入授课数据
    60. INSERT INTO teachings (teacher_id, course_id)
    61. VALUES (1, 1),
    62. (2, 2),
    63. (3, 3);

    触发器

    1.当插入学生记录时,自动将其年龄字段的值限制在19岁至30岁之间

    1. -- 当插入新学生记录时,自动将其年龄字段的值限制在19至30岁之间。
    2. delimiter$$-- 修改分隔符从;改为$$这样在触发器中;就不会阻断程序了
    3. CREATE TRIGGER validate_age_insert-- 创建触发器
    4. BEFORE INSERT ON students
    5. FOR EACH ROW-- 每行都要触发这个触发器
    6. begin-- 开始触发器
    7. if new.age < 19 or new.age > 30 THEN
    8. SIGNAL SQLSTATE '45000' SET message_text='年龄必须在 19 至 30 岁之间';
    9. END IF;
    10. END;-- 由于我已将;改为$$所以这里的分号就不会代表结束
    11. $$-- 结束了
    12. delimiter;-- 最后再讲分隔符改回;

    2. 当删除学生记录时,同时删除其在成绩表中的相关记录

    1. -- 当删除学生记录时,同时删除其在成绩表中的相关记录
    2. delimiter$$
    3. -- 修改分隔符从;改为$$这样在触发器中;就不会阻断程序了
    4. CREATE TRIGGER delete_student_scores -- 创建触发器
    5. BEFORE DELETE ON students
    6. FOR EACH ROW-- 每行都要触发这个触发器
    7. begin-- 开始触发器
    8. DELETE FROM grades WHERE student_id = OLD.student_id;
    9. -- delete from 表名{where 条件}
    10. END;-- 由于我已将;改为$$所以这里的分号就不会代表结束
    11. $$-- 结束了
    12. delimiter;-- 最后再讲分隔符改回;

    3.当教师id发生变更时,显示报错

    1. -- 当教师id发生变更时,显示报错
    2. delimiter$$
    3. CREATE TRIGGER check_teacher_id_change
    4. BEFORE UPDATE ON teachers
    5. FOR EACH ROW
    6. begin
    7. IF (OLD.teacher_id!= NEW.teacher_id) THEN
    8. SIGNAL SQLSTATE '45000' SET message_text='教师 ID 不允许变更!';
    9. END IF;
    10. END;
    11. $$
    12. delimiter;

    简单查询

    1.查询学生信息,仅显示学生的姓名与年龄,用中文显示列名。

    1. #查询学生信息,仅显示学生的姓名与年龄,用中文显示列名。
    2. select studentname as'姓名',age'年龄' from students;

    2.根据课程进行模糊查询,模糊查询需要可以走索引,需要给出explain语句。

    1. # 根据课程进行模糊查询,模糊查询需要可以走索引,需要给出explain语句。
    2. EXPLAIN SELECT * FROM courses WHERE course_name LIKE '数%';

    3.统计学生成绩信息,查询所有学生成绩的科目总分,并将科目总分进行倒序排列。

    1. # 统计学生成绩信息,查询所有学生成绩的科目总分,并将科目总分进行倒序排列。
    2. select student_id as '学生id',sum(grade) as '科目总分'
    3. from grades
    4. group by student_id
    5. order by sum(grade) desc;

    多表联合查询

    1.查询学生的基本信息,成绩信息

    1. #查询学生的基本信息,成绩信息
    2. SELECT u.student_id,u.studentname,u.age, ug.grade_id,ug.grade from students u
    3. join grades ug on u.student_id=ug.student_id;

    2.查询学生成绩中成绩最高的科目

    1. #查询学生成绩中成绩最高的科目
    2. select course_name'成绩最高的科目'from grades g INNER JOIN courses pn on g.course_id=pn.course_id where grade=(
    3. select grade from grades GROUP BY grade ORDER BY max(grade) desc limit 1);

    3.查询成绩总分最高的学生,并查询学生的全部信息与各科成绩。

    1. #查询成绩总分最高的学生,并查询学生的全部信息与各科成绩。
    2. select *
    3. from students
    4. JOIN
    5. grades gs
    6. on students.student_id=gs.student_id
    7. WHERE
    8. gs.student_id=(SELECT student_id from grades GROUP BY student_id ORDER BY sum(grade) desc LIMIT 1);

    存储过程

    1. #一条添加语句的存储过程,要求传入的3个参数分别为studentName,age,gender,其它数据随机,输入的数据不允许为空,且studentName的名称不允许以张李开头。
    2. DELIMITER $$
    3. -- 创建名为 insert_student 的存储过程
    4. CREATE PROCEDURE insert_student(
    5. IN studentName VARCHAR(50),-- 输入参数:学生姓名
    6. IN age INT,-- 输入参数:学生年龄
    7. IN gender ENUM('男', '女')-- 输入参数:学生性别
    8. )
    9. BEGIN
    10. -- 如果 studentName、age、gender为空
    11. IF studentName IS NULL OR age IS NULL OR gender IS NULL THEN
    12. SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '输入的数据不允许为空';-- 则输出的数据
    13. -- 如果学生名字以张李开头
    14. ELSEIF LEFT(studentName, 1) IN ('张', '李') THEN
    15. SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '学生姓名不允许以张李开头';-- 则输出的数据
    16. ELSE
    17. -- 插入学生信息到 students 表中,其他字段随机生成
    18. INSERT INTO students (student_name, age, gender)
    19. VALUES (studentName, age, gender);
    20. END IF;
    21. END $$
    22. DELIMITER ;
    23. call insert_student('张三',18,'男');-- 输入的参数

    ER图

    模型图

  • 相关阅读:
    【威纶通触摸屏 按键保护(元件安全设置)】
    跨站请求伪造
    国民技术 N32G45x 串口踩坑
    文心一言与GPT-4全面对比——人工智能语言模型的新纪元
    【智能算法】回溯搜索算法(BSA)原理及实现
    想用PuTTY远程mininet打开wireshark,一直卡在下图位置,应该如何处理呢?
    上传到服务的jar包怎么使用docker运行部署
    民宿租赁系统全栈开发:Java+SpringBoot+Vue+MySQL
    [PAT练级笔记] 44 Basic Level 1044 火星数字
    springboot~自定义favicon加载问题
  • 原文地址:https://blog.csdn.net/2302_81774764/article/details/140025692