27套

逐题详细解析


第1题:查询1985年出生的职工

SELECT ename AS 姓名, birthday AS 生日
FROM tb_employee
WHERE YEAR(birthday) = 1985
ORDER BY birthday;

解析

  • WHERE YEAR(birthday) = 1985:筛选1985年出生的职工
  • SELECT ename, birthday:显示姓名和生日字段
  • ORDER BY birthday:按出生日期排序(升序)

其他写法

-- 使用 LIKE
SELECT ename, birthday
FROM tb_employee
WHERE birthday LIKE '1985%'
ORDER BY birthday;

-- 使用 BETWEEN
SELECT ename, birthday
FROM tb_employee
WHERE birthday BETWEEN '1985-01-01' AND '1985-12-31'
ORDER BY birthday;

保存:将语句保存到 sj11.txt 文件


第2题:创建视图统计各部门员工人数

CREATE VIEW v_deptempcount (dname, empcount) AS
SELECT d.dname, COUNT(e.eno) AS empcount
FROM tb_department d
LEFT JOIN tb_employee e ON d.dno = e.dno
GROUP BY d.dno, d.dname;

解析

  • CREATE VIEW v_deptempcount (dname, empcount):创建视图,指定字段名
  • LEFT JOIN:确保没有员工的部门也显示(人数为0)
  • GROUP BY d.dno, d.dname:按部门分组统计
  • COUNT(e.eno):统计每个部门的员工人数

输出字段:部门名称、员工人数


第3题:修改字段类型

ALTER TABLE tb_salary 
MODIFY basepay FLOAT;

解析

  • ALTER TABLE tb_salary:修改工资表
  • MODIFY basepay:修改 basepay 字段
  • FLOAT:将数据类型改为浮点型

注意:如果原字段有约束(如 NOT NULL),需要保留:

ALTER TABLE tb_salary 
MODIFY basepay FLOAT NOT NULL;

第4题:下调岗位津贴

UPDATE tb_salary 
SET allowance = allowance * 0.9
WHERE allowance > 1000;

解析

  • UPDATE tb_salary:更新工资表
  • SET allowance = allowance * 0.9:岗位津贴下调10%(乘以0.9)
  • WHERE allowance > 1000:只更新岗位津贴高于1000的记录

计算说明

  • 下调10% = 原值 × 0.9
  • 例如:1200 × 0.9 = 1080

第5题:创建用户并授权

-- 创建用户
CREATE USER 'abc'@'192.168.1.1' IDENTIFIED BY '54321';

-- 授予权限
GRANT SELECT, UPDATE ON db_salary.tb_employee TO 'abc'@'192.168.1.1';

解析

创建用户部分

  • CREATE USER:创建新用户
  • 'abc'@'192.168.1.1':用户名和主机名(登录IP)
  • IDENTIFIED BY '54321':设置密码

授权部分

  • GRANT SELECT, UPDATE:授予查询和更新权限
  • ON db_salary.tb_employee:指定数据库和表
  • TO 'abc'@'192.168.1.1':指定用户

验证权限

SHOW GRANTS FOR 'abc'@'192.168.1.1';

答案汇总

题号答案
1SELECT ename AS 姓名, birthday AS 生日 FROM tb_employee WHERE YEAR(birthday) = 1985 ORDER BY birthday;
2CREATE VIEW v_deptempcount (dname, empcount) AS SELECT d.dname, COUNT(e.eno) FROM tb_department d LEFT JOIN tb_employee e ON d.dno = e.dno GROUP BY d.dno, d.dname;
3ALTER TABLE tb_salary MODIFY basepay FLOAT;
4UPDATE tb_salary SET allowance = allowance * 0.9 WHERE allowance > 1000;
5CREATE USER 'abc'@'192.168.1.1' IDENTIFIED BY '54321';
GRANT SELECT, UPDATE ON db_salary.tb_employee TO 'abc'@'192.168.1.1';

知识点总结

题号考点关键语法
1条件查询+排序WHERE YEAR() = + ORDER BY
2创建视图CREATE VIEW ... AS SELECT ... LEFT JOIN ... GROUP BY
3修改字段类型ALTER TABLE ... MODIFY ...
4条件更新UPDATE ... SET ... = ... * 0.9 WHERE ... >
5创建用户+授权CREATE USER + GRANT SELECT, UPDATE
DELIMITER $
CREATE PROCEDURE sp_salaryAnalysis(deptName VARCHAR(50))
BEGIN
    DECLARE deptNo INT;
	DECLARE maxBasePay INT;
	DECLARE minBasePay INT;
	DECLARE avgBasePay FLOAT;

    -- 获取部门编号
    SELECT dno into deptNo FROM tb_department WHERE dname = ____;

    -- 计算最高、最低、平均基本工资
    SELECT  MAX(basepay),MIN(basepay),AVG(basepay) ____ maxBasePay, minBasePay, avgBasePay
    FROM tb_salary s
    INNER JOIN tb_employee e ON s.eno = e.eno
    WHERE e.dno = deptNo ;

    -- 输出计算结果
    SELECT  deptName, maxBasePay, minBasePay,avgBasePay;
END$
DELIMITER ;

-- 调用存储过程
____ sp_salaryAnalysis('工程部');

存储过程 sp_salaryAnalysis 逐空详细解析


第1个空:deptName

SELECT dno into deptNo FROM tb_department WHERE dname = ____;

答案deptName

解析

  • deptName 是存储过程的输入参数
  • 根据传入的部门名称查询对应的部门编号
  • 将查询结果存入 deptNo 变量

第2个空:INTO

SELECT MAX(basepay),MIN(basepay),AVG(basepay) ____ maxBasePay, minBasePay, avgBasePay

答案INTO

解析

  • 将查询结果赋值给变量的关键字
  • 语法:SELECT 值1, 值2 INTO 变量1, 变量2
  • 将最高工资、最低工资、平均工资分别存入三个变量

第3个空:CALL

____ sp_salaryAnalysis('工程部');

答案CALL

解析

  • 调用存储过程的关键字
  • 语法:CALL 存储过程名(参数列表)
  • 传入参数 '工程部' 作为部门名称

完整代码

DELIMITER $
CREATE PROCEDURE sp_salaryAnalysis(deptName VARCHAR(50))
BEGIN
    DECLARE deptNo INT;
    DECLARE maxBasePay INT;
    DECLARE minBasePay INT;
    DECLARE avgBasePay FLOAT;

    -- 获取部门编号
    SELECT dno INTO deptNo FROM tb_department WHERE dname = deptName;

    -- 计算最高、最低、平均基本工资
    SELECT MAX(basepay), MIN(basepay), AVG(basepay) INTO maxBasePay, minBasePay, avgBasePay
    FROM tb_salary s
    INNER JOIN tb_employee e ON s.eno = e.eno
    WHERE e.dno = deptNo;

    -- 输出计算结果
    SELECT deptName, maxBasePay, minBasePay, avgBasePay;
END$
DELIMITER ;

-- 调用存储过程
CALL sp_salaryAnalysis('工程部');

存储过程功能说明

功能:统计指定部门的工资情况(最高、最低、平均工资)

执行逻辑

1. 接收输入参数 deptName(部门名称)
2. 根据部门名称查询部门编号 → deptNo
3. 查询该部门所有员工的工资:
   - MAX(basepay) → 最高工资
   - MIN(basepay) → 最低工资
   - AVG(basepay) → 平均工资
4. 输出:部门名称、最高工资、最低工资、平均工资

调用示例

-- 统计工程部工资情况
CALL sp_salaryAnalysis('工程部');

-- 统计市场部工资情况
CALL sp_salaryAnalysis('市场部');

答案汇总

空位答案含义
第1空deptName输入参数名(部门名称)
第2空INTO赋值关键字
第3空CALL调用存储过程关键字
DELIMITER $
CREATE FUNCTION fn_getmanager (eid INT)
RETURNS VARCHAR(50)
DETERMINISTIC
BEGIN
    ____ manager VARCHAR(50);
    SELECT ename INTO manager FROM tb_employee
    WHERE eno = (SELECT d.eno FROM tb_department d
    	INNER ____ tb_employee e ON d.dno = e.dno WHERE e.eno = eid);
		
    IF manager IS NULL THEN
        SET manager = '没有该职工';
	END IF;
    ____ manager;
END$
DELIMITER ;

函数 fn_getmanager 逐空详细解析


第1个空:DECLARE

____ manager VARCHAR(50);

答案DECLARE

解析

  • 声明局部变量的关键字
  • 语法:DECLARE 变量名 数据类型
  • 这里声明 manager 变量,用于存储经理姓名

第2个空:JOIN

INNER ____ tb_employee e ON d.dno = e.dno

答案JOIN

解析

  • 表连接关键字
  • INNER JOIN 是内连接,返回两个表中匹配的记录
  • 连接条件:部门表的部门编号 = 员工表的部门编号

第3个空:RETURN

____ manager;

答案RETURN

解析

  • 函数返回值的关键字
  • 语法:RETURN 表达式
  • 返回 manager 变量中存储的经理姓名

完整代码

DELIMITER $
CREATE FUNCTION fn_getmanager (eid INT)
RETURNS VARCHAR(50)
DETERMINISTIC
BEGIN
    DECLARE manager VARCHAR(50);
    SELECT ename INTO manager FROM tb_employee
    WHERE eno = (SELECT d.eno FROM tb_department d
        INNER JOIN tb_employee e ON d.dno = e.dno WHERE e.eno = eid);

    IF manager IS NULL THEN
        SET manager = '没有该职工';
    END IF;
    RETURN manager;
END$
DELIMITER ;

函数功能说明

功能:根据员工编号查询其所在部门的经理姓名

执行逻辑

1. 接收输入参数 eid(员工编号)
2. 声明变量 manager(存储经理姓名)
3. 子查询:根据员工编号 eid 查询其所在部门的经理编号
   - 连接部门表和员工表
   - 找到该员工所在的部门
   - 返回该部门的负责人编号 d.eno
4. 外层查询:根据经理编号查询经理姓名,存入 manager
5. 判断 manager 是否为 NULL
   ├─ 是 → 返回 '没有该职工'
   └─ 否 → 返回 manager(经理姓名)

调用示例

-- 查询员工 101 的经理
SELECT fn_getmanager(101);

-- 查询不存在的员工
SELECT fn_getmanager(999);  -- 返回 '没有该职工'

-- 在查询中使用
SELECT eno, ename, fn_getmanager(eno) AS 经理
FROM tb_employee;

子查询解析

SELECT d.eno FROM tb_department d
INNER JOIN tb_employee e ON d.dno = e.dno 
WHERE e.eno = eid
部分作用
FROM tb_department d部门表
INNER JOIN tb_employee e连接员工表
ON d.dno = e.dno通过部门编号关联
WHERE e.eno = eid筛选指定员工
SELECT d.eno返回该部门的负责人编号

答案汇总

空位答案含义
第1空DECLARE声明变量关键字
第2空JOIN表连接关键字
第3空RETURN函数返回值关键字
<?php
error_reporting(E_ALL ^ E_DEPRECATED);
// 连接到数据库
//*********Found********
$conn= ___("localhost:3306","root","")
   		 or die("no database!<br>");
 		mysql_select_db ("db_salary",$conn) or die( "database fail!<br>");
		mysql_query("SET NAMES utf8");   


// 执行SQL查询
//*********Found********
$sql = "SELECT tb_job.jobtitle, COUNT(*) AS emp_count, 
			COUNT(*)*tb_job.jallowance AS total_jallowance 
		FROM tb_job INNER JOIN tb_employee ON tb_job.jno = tb_employee.___
		GROUP BY tb_job.jobtitle
		ORDER BY total_jallowance DESC";

//*********Found********
$result = mysql_query($sql,___);

// 输出HTML表格
if ($result )
 {
  echo "<table border='1px'><tr><th>职务名称</th><th>员工人数</th><th>岗位津贴总数</th></tr>";
//*********Found********
  while($row = ____($result)) {
    echo "<tr><td>" . $row["jobtitle"] . "</td><td>" . $row["emp_count"] . "</td><td>" . $row["total_jallowance"] . "</td></tr>";
  }
  echo "</table>";
} else {
  echo "没有查询到结果";
}

// 关闭连接
//*********Found********
  mysql_close(___);
?>

PHP程序逐空详细解析


第1个空:mysql_connect

$conn= ___("localhost:3306","root","")

答案mysql_connect

解析

  • PHP连接MySQL数据库的函数
  • 语法:mysql_connect(服务器地址, 用户名, 密码)
  • 返回数据库连接资源,存储在 $conn 变量中

第2个空:jno

FROM tb_job INNER JOIN tb_employee ON tb_job.jno = tb_employee.___

答案jno

解析

  • 两表连接的条件字段
  • tb_job 表有 jno(职务编号)
  • tb_employee 表也有 jno(职务编号)
  • 通过 jno 关联职务表和员工表

第3个空:$conn

$result = mysql_query($sql,___);

答案$conn

解析

  • mysql_query() 的第二个参数是数据库连接资源
  • 需要传入之前建立的连接变量 $conn
  • 确保在正确的数据库连接上执行查询

第4个空:mysql_fetch_assoc

while($row = ____($result)) {
    echo ... $row["jobtitle"] ... $row["emp_count"] ... $row["total_jallowance"] ...

答案mysql_fetch_assoc

解析

  • 后面代码使用 $row["jobtitle"]字段名访问数据
  • 这是关联数组的访问方式
  • 所以必须用返回关联数组的函数 mysql_fetch_assoc()

对比

函数返回类型访问方式
mysql_fetch_assoc()关联数组$row['字段名']
mysql_fetch_row()索引数组$row[0]$row[1]
mysql_fetch_array()两者都支持两种方式均可

第5个空:$conn

mysql_close(___);

答案$conn

解析

  • mysql_close() 用于关闭数据库连接
  • 参数是之前建立的连接资源 $conn
  • 释放服务器资源

完整代码

<?php
error_reporting(E_ALL ^ E_DEPRECATED);
// 连接到数据库
//*********Found********
$conn= mysql_connect("localhost:3306","root","")
            or die("no database!<br>");
         mysql_select_db ("db_salary",$conn) or die( "database fail!<br>");
        mysql_query("SET NAMES utf8");   


// 执行SQL查询
//*********Found********
$sql = "SELECT tb_job.jobtitle, COUNT(*) AS emp_count, 
            COUNT(*)*tb_job.jallowance AS total_jallowance 
        FROM tb_job INNER JOIN tb_employee ON tb_job.jno = tb_employee.jno
        GROUP BY tb_job.jobtitle
        ORDER BY total_jallowance DESC";

//*********Found********
$result = mysql_query($sql,$conn);

// 输出HTML表格
if ($result )
 {
  echo "<table border='1px'> <tr><th>职务名称</th><th>员工人数</th><th>岗位津贴总数</th> </table>";
//*********Found********
  while($row = mysql_fetch_assoc($result)) {
    echo "  <tr><td>" . $row["jobtitle"] . "</td><td>" . $row["emp_count"] . "</td><td>" . $row["total_jallowance"] . "</td></tr>";
  }
  echo "</table>";
} else {
  echo "没有查询到结果";
}

// 关闭连接
//*********Found********
  mysql_close($conn);
?>

程序功能说明

功能:统计每个职务的员工人数和岗位津贴总数

SQL逻辑

SELECT tb_job.jobtitle,           -- 职务名称
       COUNT(*) AS emp_count,      -- 员工人数
       COUNT(*) * tb_job.jallowance AS total_jallowance  -- 岗位津贴总数
FROM tb_job 
INNER JOIN tb_employee ON tb_job.jno = tb_employee.jno
GROUP BY tb_job.jobtitle
ORDER BY total_jallowance DESC;

输出示例

职务名称员工人数岗位津贴总数
经理24000
主管33000
职员52500

答案汇总

空位答案含义
第1空mysql_connect连接数据库函数
第2空jno两表连接字段
第3空$conn数据库连接资源
第4空mysql_fetch_assoc获取关联数组行
第5空$conn关闭数据库连接

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注