基本语法

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);


点赞(2)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)