第三次作业

1. 存储过程 avg_sal_a:按部门名称查询平均工资,结果存入变量 @a

sql

复制代码
DELIMITER // -- 临时修改语句结束符(避免存储过程中 ; 冲突)

CREATE PROCEDURE avg_sal_a(
    IN dept_name VARCHAR(20) -- 输入参数:部门名称
)
BEGIN
    -- 计算指定部门的平均工资,存入变量 @a
    SELECT AVG(e.salary) INTO @a -- INTO @a:将查询结果赋值给用户变量 @a
    FROM employees e
    INNER JOIN departments d 
      ON e.dept_id = d.dept_id -- 关联部门表和员工表
    WHERE d.dept_name = dept_name; -- 按输入的部门名称过滤
    
    -- 处理部门无员工的情况(平均工资为 NULL 时,设为 0)
    IF @a IS NULL THEN
        SET @a = 0;
    END IF;
END //

DELIMITER ; -- 恢复默认语句结束符
测试执行(部门名称测试参数为 "上海中心")

sql

复制代码
-- 1. 调用存储过程,传入部门名称"上海中心"
CALL avg_sal_a('上海中心');

-- 2. 查看变量 @a 中的平均工资结果
SELECT @a AS 上海中心平均工资;

2. 存储过程:按员工姓名查询其所在部门的最高工资,结果存入 @a

需求分析
  • 输入参数:员工姓名(emp_name
  • 输出参数:该员工所在部门的最高工资(存入变量 @a
  • 逻辑:先通过员工姓名找到其所属部门编号,再查询该部门的最高工资,赋值给 @a
存储过程创建语句(命名为 get_dept_max_sal

sql

复制代码
DELIMITER //

CREATE PROCEDURE get_dept_max_sal(
    IN emp_name VARCHAR(20) -- 输入参数:员工姓名
)
BEGIN
    -- 步骤1:通过员工姓名获取其部门编号;步骤2:查询该部门的最高工资,存入 @a
    SELECT MAX(e2.salary) INTO @a
    FROM employees e1 -- e1:用于查询输入员工的部门编号
    INNER JOIN employees e2 -- e2:用于查询该部门所有员工的工资
      ON e1.dept_id = e2.dept_id -- 关联同一部门的所有员工
    WHERE e1.emp_name = emp_name; -- 按输入的员工姓名过滤
    
    -- 处理员工不存在或部门无工资的情况
    IF @a IS NULL THEN
        SET @a = 0;
    END IF;
END //

DELIMITER ;
测试执行(示例:查询 "张三" 所在部门的最高工资)

sql

复制代码
-- 1. 调用存储过程,传入员工姓名(如"张三")
CALL get_dept_max_sal('张三');

-- 2. 查看变量 @a 中的最高工资结果
SELECT @a AS 张三所在部门最高工资;
  1. 查看已创建的存储过程: sql

    复制代码
    SHOW PROCEDURE STATUS LIKE 'avg_sal_a'; -- 查看第一个存储过程
    SHOW PROCEDURE STATUS LIKE 'get_dept_max_sal'; -- 查看第二个存储过程
  2. 删除存储过程(若需修改): sql

    复制代码
    DROP PROCEDURE IF EXISTS avg_sal_a;
    DROP PROCEDURE IF EXISTS get_dept_max_sal;
  3. 变量 @a 是用户全局变量,调用存储后可直接查询,若需多次测试,建议先重置变量:SET @a = NULL;

1. 创建学生表 student(含约束条件)

sql

复制代码
CREATE TABLE Student (
    Sno CHAR(10) PRIMARY KEY, -- 学号为主键(假设学号为10位字符,可根据实际调整长度)
    Sname VARCHAR(20) NOT NULL UNIQUE, -- 姓名非空且不能重名(UNIQUE约束)
    Ssex CHAR(2) NOT NULL CHECK (Ssex IN ('男', '女')), -- 性别只能是男/女(CHECK约束)
    Sage INT, -- 年龄(后续需修改为smallint)
    Sdept VARCHAR(20) DEFAULT '计算机' -- 所在系默认值为"计算机"
);

2. 修改 student 表中 Sage 字段的数据类型(int → smallint)

sql

复制代码
ALTER TABLE Student
MODIFY COLUMN Sage SMALLINT; -- MODIFY COLUMN 用于修改字段数据类型

3. 为 SC 表建立组合主键索引(Sno 升序 + Cno 升序,索引名 SC_INDEX)

sql

复制代码
-- 先确保SC表已创建(若未创建,需先执行创建表语句)
CREATE TABLE SC (
    Sno CHAR(10),
    Cno CHAR(4),
    Score DECIMAL(5,2), -- 成绩(假设保留2位小数,总长度5,如99.99)
    -- 组合主键(同时作为索引)
    PRIMARY KEY (Sno ASC, Cno ASC) -- 按Sno升序、Cno升序排序
);

-- 若SC表已存在,单独创建组合主键索引(题目要求索引名为SC_INDEX)
ALTER TABLE SC
ADD CONSTRAINT SC_INDEX PRIMARY KEY (Sno ASC, Cno ASC);

4. 创建视图 stu_info(查询姓名、性别、课程名、成绩)

sql

复制代码
CREATE VIEW stu_info AS
SELECT 
    s.Sname AS 姓名,
    s.Ssex AS 性别,
    c.Cname AS 课程名,
    sc.Score AS 成绩
FROM Student s
INNER JOIN SC sc ON s.Sno = sc.Sno -- 学生表与选课表通过学号关联
INNER JOIN Course c ON sc.Cno = c.Cno; -- 选课表与课程表通过课程号关联
相关推荐
2601_9495936532 分钟前
深入解析CANN-acl应用层接口:构建高效的AI应用开发框架
数据库·人工智能
javachen__32 分钟前
mysql新老项目版本选择
数据库·mysql
Dxy12393102161 小时前
MySQL如何高效查询表数据量:从基础到进阶的优化指南
数据库·mysql
Dying.Light1 小时前
MySQL相关问题
数据库·mysql
蜡笔小炘1 小时前
LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误
服务器·数据库·lvs
韩立学长2 小时前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
Re.不晚2 小时前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构
老邓计算机毕设2 小时前
SSM智慧社区信息化服务平台4v5hv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·智慧社区、·信息化平台
麦聪聊数据3 小时前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构
2301_790300963 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python