当前位置:首页 > 系统教程 > 正文

Linux下学MySQL多表查询(从入门到实践,小白也能看懂的多表查询教程)

Linux下学MySQL多表查询(从入门到实践,小白也能看懂的多表查询教程)

Linux下学MySQL多表查询(从入门到实践,小白也能看懂的多表查询教程) MySQL多表查询 内连接 外连接 自连接 第1张

在Linux环境下学习MySQL,多表查询是必须掌握的核心技能。本文将通过详细的SQL案例和实操图,带你彻底搞懂内连接外连接自连接等常用多表查询技巧,即使是零基础也能轻松上手!

1. 准备数据:两张测试表

我们先在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);  -- 赵六暂无部门  

2. 内连接(INNER JOIN)

内连接返回两个表中满足连接条件的记录,即取交集。例如,查询所有有部门的员工及其部门名称:

SELECT e.emp_name, d.dept_nameFROM emp eINNER JOIN dept d ON e.dept_id = d.dept_id;  

结果只会显示部门ID匹配的员工(张三、李四、王五),赵六因为dept_id为NULL,不会被包含。

3. 外连接(LEFT / RIGHT JOIN)

外连接除了返回满足条件的记录,还会返回左表(LEFT JOIN)或右表(RIGHT JOIN)中不匹配的记录。以左连接为例,查询所有员工及其部门(包括无部门的赵六):

SELECT e.emp_name, d.dept_nameFROM emp eLEFT JOIN dept d ON e.dept_id = d.dept_id;  

赵六的部门名称会显示为NULL。右连接则返回右表所有记录,这里不赘述。

4. 自连接(SELF JOIN)

自连接是将一个表视为两个副本进行连接,常用于层级关系。例如,假设员工表有经理字段,想查询员工及其经理姓名:

-- 先添加经理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;  

5. 交叉连接(CROSS JOIN)

交叉连接返回两个表的笛卡尔积,一般用于生成组合数据,实际中较少使用:

SELECT * FROM emp CROSS JOIN dept;  

6. 综合案例:查询部门平均工资

结合内连接和聚合函数,计算每个部门的平均工资:

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,观察结果变化。掌握这些,你就能应对大部分数据查询需求!