在Linux环境下学习MySQL,多表查询是必须掌握的核心技能。本文将通过详细的SQL案例和实操图,带你彻底搞懂内连接、外连接、自连接等常用多表查询技巧,即使是零基础也能轻松上手!
我们先在MySQL中创建部门表(dept)和员工表(emp),并插入测试数据。
-- 部门表CREATE TABLE dept ( dept_id INT PRIMARY KEY, dept_name VARCHAR(50));-- 员工表CREATE TABLE emp ( emp_id INT PRIMARY KEY, emp_name VARCHAR(50), dept_id INT, salary DECIMAL(10,2));INSERT INTO dept VALUES (1, "技术部"), (2, "市场部"), (3, "财务部");INSERT INTO emp VALUES (101, "张三", 1, 8000),(102, "李四", 2, 9000),(103, "王五", 1, 8500),(104, "赵六", NULL, 7000); -- 赵六暂无部门 内连接返回两个表中满足连接条件的记录,即取交集。例如,查询所有有部门的员工及其部门名称:
SELECT e.emp_name, d.dept_nameFROM emp eINNER JOIN dept d ON e.dept_id = d.dept_id; 结果只会显示部门ID匹配的员工(张三、李四、王五),赵六因为dept_id为NULL,不会被包含。
外连接除了返回满足条件的记录,还会返回左表(LEFT JOIN)或右表(RIGHT JOIN)中不匹配的记录。以左连接为例,查询所有员工及其部门(包括无部门的赵六):
SELECT e.emp_name, d.dept_nameFROM emp eLEFT JOIN dept d ON e.dept_id = d.dept_id; 赵六的部门名称会显示为NULL。右连接则返回右表所有记录,这里不赘述。
自连接是将一个表视为两个副本进行连接,常用于层级关系。例如,假设员工表有经理字段,想查询员工及其经理姓名:
-- 先添加经理ID字段ALTER TABLE emp ADD manager_id INT;UPDATE emp SET manager_id = 101 WHERE emp_id = 103; -- 王五的经理是张三SELECT e1.emp_name AS 员工, e2.emp_name AS 经理FROM emp e1LEFT JOIN emp e2 ON e1.manager_id = e2.emp_id; 交叉连接返回两个表的笛卡尔积,一般用于生成组合数据,实际中较少使用:
SELECT * FROM emp CROSS JOIN dept; 结合内连接和聚合函数,计算每个部门的平均工资:
SELECT d.dept_name, AVG(e.salary) AS avg_salaryFROM dept dLEFT JOIN emp e ON d.dept_id = e.dept_idGROUP BY d.dept_name; 财务部没有员工,平均工资为NULL。通过外连接我们保留了所有部门。
总结:在Linux下学习MySQL多表查询,关键在于理解各种JOIN的语义,并通过实际练习巩固。建议多写SQL,观察结果变化。掌握这些,你就能应对大部分数据查询需求!
本文由主机测评网于2026-03-08发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20260329526.html