

逐题详细解析
第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';
答案汇总
| 题号 | 答案 |
|---|---|
| 1 | SELECT ename AS 姓名, birthday AS 生日 FROM tb_employee WHERE YEAR(birthday) = 1985 ORDER BY birthday; |
| 2 | CREATE 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; |
| 3 | ALTER TABLE tb_salary MODIFY basepay FLOAT; |
| 4 | UPDATE tb_salary SET allowance = allowance * 0.9 WHERE allowance > 1000; |
| 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'; |
知识点总结
| 题号 | 考点 | 关键语法 |
|---|---|---|
| 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;
输出示例:
| 职务名称 | 员工人数 | 岗位津贴总数 |
|---|---|---|
| 经理 | 2 | 4000 |
| 主管 | 3 | 3000 |
| 职员 | 5 | 2500 |
答案汇总
| 空位 | 答案 | 含义 |
|---|---|---|
| 第1空 | mysql_connect | 连接数据库函数 |
| 第2空 | jno | 两表连接字段 |
| 第3空 | $conn | 数据库连接资源 |
| 第4空 | mysql_fetch_assoc | 获取关联数组行 |
| 第5空 | $conn | 关闭数据库连接 |
发表回复