基本语法
SELECT 字段列表
FROM 表1 [AS 别名1]
[INNER] JOIN 表2 [AS 别名2]
ON 连接条件
[WHERE 筛选条件];
`INNER` 关键字可以省略
`ON` 子句指定连接条件
可以使用 `WHERE` 进行结果过滤
核心特点
1. 只返回匹配行:仅当连接条件为真时才返回记录
2. 消除笛卡尔积:通过连接条件减少不必要的数据组合
3. 性能优化:比交叉连接高效,特别是大表查询时
实际应用示例
示例1:基本内连接
查询学生及其所选课程
SELECT s.name, c.course_name FROM students s JOIN courses c ON s.course_id = c.id;
示例2:多表内连接
查询学生、课程及教师信息
SELECT s.name, c.course_name, t.teacher_name FROM students s JOIN courses c ON s.course_id = c.id JOIN teachers t ON c.teacher_id = t.id;
示例3:带WHERE条件的内连接
查询选修Java课程的女生
SELECT s.name, s.age FROM students s JOIN courses c ON s.course_id = c.id WHERE c.course_name = 'Java' AND s.sex = 'F';
表别名最佳实践
1. 简化长表名:
SELECT ord.order_date, cust.customer_name FROM sales_orders AS ord JOIN customers AS cust ON ord.customer_id = cust.id;
2. 自连接查询:
SELECT e.name AS employee, m.name AS manager FROM employees e JOIN employees m ON e.manager_id = m.id;
性能优化建议
1. 索引连接字段:确保连接条件中的字段有索引
2. 小表驱动大表:将小表放在JOIN前面
3. 避免复杂表达式:连接条件中避免使用函数
4. 限制结果集:只查询必要的字段
与WHERE子句连接的区别
特性 | INNER JOIN (显式连接) | WHERE 连接 (隐式连接) |
---|---|---|
可读性 | 更清晰,连接条件与过滤条件分离 | 连接条件和过滤条件混合在一起 |
执行计划 | 优化器更容易理解和优化 | 可能影响优化器的判断 |
复杂查询 | 更易于编写和维护 | 难以维护和调试 |
标准符合性 | SQL标准推荐写法 | 较老的语法风格 |
推荐写法:
推荐
SELECT s.name, c.course_name FROM students s JOIN courses c ON s.course_id = c.id;
不推荐
SELECT s.name, c.course_name FROM students s, courses c WHERE s.course_id = c.id;
特殊应用场景
1. 非等值连接
查询成绩在某个区间的学生
SELECT s.name, g.grade FROM students s JOIN grade_ranges g ON s.score BETWEEN g.min_score AND g.max_score;
2. 复合条件连接
多条件连接
SELECT o.order_id, c.customer_name FROM orders o JOIN customers c ON o.customer_id = c.id AND o.region = c.region;
3. 使用USING简化
当连接字段名相同时
SELECT s.name, d.department_name FROM students s JOIN departments d USING (dept_id);
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程