首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
9.1 基本查询语句
9.2 单表查询
9.2.1 查询所有字段
9.2.2 查询指定字段
9.2.3 查询指定数据
9.2.4 带关键字IN的查询
9.2.5 带关键字BETWEEN AND的范围查询
9.2.6 带LIKE的字符匹配查询
9.2.7 用IS NULL关键字查询空值
9.2.8 带AND的多条件查询
9.2.9 带OR的多条件查询
9.2.10 用DISTINCT关键字去除结果中的重复行
9.2.11 用ORDER BY关键字对查询结果进行排序
9.2.12 用GROUP BY关键字分组查询
9.2.13 用LIMIT限制查询结果的数量
9.3 聚合函数查询
9.3.1 COUNT()统计函数
9.3.2 SUM()求和函数
9.3.3 AVG()平均数函数
9.3.4 MAX()最大值函数
9.3.5 MIN()最小值函数
9.4 连接查询
9.4.1 内连接查询
9.4.2 外连接查询
9.4.3 复合条件连接查询
9.5 子查询
9.5.1 带IN关键字的子查询
9.5.2 带比较运算符的子查询
9.5.3 带EXISTS关键字的子查询
9.5.4 带ANY关键字的子查询
9.5.5 带ALL关键字的子查询
9.6 合并查询结果
9.7 定义表和字段的别名
9.7.1 为表取别名
9.7.2 为字段取别名
9.8 使用正则表达式查询
9.8.1 匹配指定字符中的任意一个
9.8.2 使用“*”和“ ”来匹配多个字符
9.8.3 匹配以指定的字符开头和结束的记录
10.1 MySQL函数
10.2 数学函数
10.2.1 ABS(x)绝对值函数
10.2.2 FLOOR(x)向下取整函数
10.2.3 RAND()随机数函数
10.2.4 PI()圆周率函数
10.2.5 TRUNCATE(x,y)截断函数
10.2.6 ROUND(x)近似值函数和ROUND(x,y)四舍五入函数
10.2.7 SQRT(x)平方函数
10.3 字符串函数
10.3.1 INSERT(s1,x,len,s2)替换函数
10.3.2 UPPER(s)函数和UCASE(s)字母大写函数
10.3.3 LEFT(s,n)取左函数
10.3.4 RTRIM(s)去空格函数
10.3.5 SUBSTRING(s,n,len)截取函数
10.3.6 REVERSE(s)反转函数
10.3.7 FIELD(s,s1,s2,…,sn)位置函数
10.3.8 LOCATE(s1,s)、POSITION(s1 IN s)和INSTR(s,s1)3个位置函数
10.4 日期和时间函数
10.4.1 CURDATE()和CURRENT_DATE()当前日期函数
10.4.2 CURTIME()和CURRENT_TIME()当前时间函数
10.4.3 NOW()当前日期和时间函数
10.4.4 DATEDIFF(d1,d2)间隔天数函数
10.4.5 ADDDATE(d,n)日期计算函数
10.4.6 ADDDATE(d,INTERVAL expr type)日期时间计算函数
10.4.7 SUBDATE(d,n)日期计算函数
10.5 条件判断函数
10.6 系统信息函数
10.6.1 获取MySQL版本号、连接数和数据库名的函数
10.6.2 获取用户名的函数
10.6.3 获取字符串的字符集和排序方式的函数
10.7.1 格式化函数FORMAT(x,n)
10.7.2 改变字符集的函数
10.7.3 改变字段数据类型的函数
当前位置:
首页>>
技术小册>>
MySQL从入门到精通(三)
小册名称:MySQL从入门到精通(三)
### 9.4.2 外连接查询 在数据库查询中,连接(JOIN)操作是极为重要的一环,它允许我们根据两个或多个表中的共同属性(通常是主键和外键关系)来合并这些表的数据。而外连接查询(Outer JOIN)作为连接操作的一种特殊形式,其重要性不言而喻。外连接不仅包括了内连接(INNER JOIN)所能匹配到的行,还包含了那些在连接条件中没有匹配项的行,并通过在结果集中填充NULL值来表示这些缺失的匹配项。本节将深入探讨外连接的两种主要类型:左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN),以及它们在MySQL中的实际应用。 #### 9.4.2.1 左外连接(LEFT OUTER JOIN) 左外连接,顾名思义,是从左表(LEFT JOIN左侧的表)返回所有的行,即使右表中没有匹配的行。如果右表中没有匹配的行,则结果集中这些行的右表部分将包含NULL值。左外连接通常用于需要显示左表所有记录,以及与之相关联的右表记录(如果存在)的场景。 **语法示例**: ```sql SELECT columns FROM table1 LEFT OUTER JOIN table2 ON table1.common_field = table2.common_field; ``` 在实际应用中,`OUTER`关键字是可选的,因此`LEFT OUTER JOIN`可以简写为`LEFT JOIN`。 **案例分析**: 假设我们有两个表,一个是`employees`(员工表),另一个是`departments`(部门表)。`employees`表有一个`department_id`字段作为外键,指向`departments`表的`id`字段。现在,我们想要查询所有员工的信息,以及他们所属的部门名称,即使某些员工没有分配部门(即`department_id`为NULL或在`departments`表中找不到对应项)。 ```sql SELECT e.name AS employee_name, e.department_id, d.name AS department_name FROM employees e LEFT JOIN departments d ON e.department_id = d.id; ``` 在这个查询中,所有员工的信息都会被列出,对于那些没有分配部门的员工,`department_name`将显示为NULL。 #### 9.4.2.2 右外连接(RIGHT OUTER JOIN) 与左外连接相反,右外连接是从右表(RIGHT JOIN右侧的表)返回所有的行,即使左表中没有匹配的行。如果左表中没有匹配的行,则结果集中这些行的左表部分将包含NULL值。右外连接在某些特定场景下非常有用,尽管在日常使用中,左外连接因其直观性而更受欢迎;但了解右外连接对于全面理解SQL查询至关重要。 **语法示例**: ```sql SELECT columns FROM table1 RIGHT OUTER JOIN table2 ON table1.common_field = table2.common_field; ``` 同样,`OUTER`关键字也是可选的,因此`RIGHT OUTER JOIN`可以简写为`RIGHT JOIN`。 **案例分析**: 继续使用上述`employees`和`departments`表的例子,但这次我们的需求有所变化。假设我们想要列出所有部门及其对应的员工数量(即使某些部门没有员工)。这里,右外连接就显得非常合适了。 ```sql SELECT d.name AS department_name, COUNT(e.id) AS employee_count FROM departments d RIGHT JOIN employees e ON d.id = e.department_id GROUP BY d.name; ``` 注意:在这个特定的例子中,实际上使用左外连接加上聚合函数也能达到相同的效果,因为我们的关注点在于包含所有部门。然而,使用右外连接可以让我们从“部门”的角度出发思考问题,这在某些情况下可能更符合逻辑。 #### 9.4.2.3 全外连接(FULL OUTER JOIN) 值得注意的是,虽然MySQL本身不直接支持全外连接(FULL OUTER JOIN),即同时返回左表和右表中所有行的查询(无论是否有匹配项),但我们可以通过结合使用左外连接和右外连接,并使用`UNION`来模拟全外连接的效果。 **模拟全外连接的SQL示例**: ```sql SELECT e.name AS employee_name, e.department_id, d.name AS department_name FROM employees e LEFT JOIN departments d ON e.department_id = d.id UNION SELECT e.name AS employee_name, e.department_id, d.name AS department_name FROM employees e RIGHT JOIN departments d ON e.department_id = d.id WHERE e.name IS NULL; -- 确保右外连接中独有的记录被选中 ``` 注意:上述`UNION`查询的第二个部分(右外连接部分)实际上可能需要根据实际情况调整,因为直接使用`RIGHT JOIN`后接`WHERE`子句来筛选`e.name IS NULL`可能并不总是符合需求(这取决于你具体想要包含哪些数据)。一种更通用的方法是使用`UNION ALL`加上适当的条件筛选来确保不会重复包含数据,然后通过外层查询来合并和去重。 #### 总结 外连接查询是SQL查询中不可或缺的一部分,它们允许我们根据两个或多个表之间的关系来灵活地检索数据。左外连接和右外连接各有其适用场景,分别侧重于从“左表”和“右表”的角度出发来包含所有记录。虽然MySQL不直接支持全外连接,但我们可以通过一些技巧来模拟这一功能。理解和掌握外连接查询对于提升数据库查询的效率和准确性至关重要。
上一篇:
9.4.1 内连接查询
下一篇:
9.4.3 复合条件连接查询
该分类下的相关小册推荐:
MySQL从入门到精通(二)
细说MySQL(零基础到高级应用)
MySQL从入门到精通(四)
MySQL从入门到精通(五)
MySQL8.0入门与实践
MySQL从入门到精通(一)
MySQL必会核心问题
MySQL 实战 45 讲
SQL零基础到熟练应用(增删改查)