内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。
语法:
select 字段 from 表1 inner join 表2 on 表1.id = 表2.id [and 其他筛选条件];
等价写法:WHERE
子句隐式内连接
SELECT 字段 FROM 表1, 表2 WHERE 表1.id = 表2.id [and 其他筛选条件];
查询员工及其部门名称
两者写法不同但是效果一致
方法一:
---隐式内连接写法
select *from emp,dept where emp.deptno=dept.deptno;
方法二:
---标准内连接写法
select *from dept inner join emp on emp.deptno=dept.deptno;
外连接分为左外连接和右外连接
保留规则:左表(第一个表)的所有记录,右表无匹配时用NULL
填充
语法:
select 字段 from 表1 left join 表2 on 链接条件 [and 其他筛选条件];
-- 创建表
CREATE TABLE employees (emp_id INT, emp_name VARCHAR(30));
INSERT INTO employees VALUES (1, 'Alice'),
(2, 'Bob'), (3, 'Charlie'), (4, 'David');
CREATE TABLE salaries (emp_id INT, salary INT);
INSERT INTO salaries VALUES (1, 5000), (2, 6000), (5, 7000);
-- 左外连接查询
select *from employees s1 left join salaries s2 on s1.emp_id=s2.emp_id;
结果:
保留规则:右表(第二个表)的所有记录,左表无匹配时用NULL
填充
语法:
select 字段 from 左表 right join 右表 on 链接条件 [and 其他筛选条件];
select *from employees s1 right join salaries s2
on s1.emp_id=s2.emp_id;
结果:
-- 左外连接(保留左表)
SELECT * FROM A LEFT JOIN B ON A.id = B.id;
-- 等价于右外连接(保留右表)
SELECT * FROM B RIGHT JOIN A ON A.id = B.id;
建议:优先使用左外连接,逻辑更直观。
NULL
值。NULL
表示无匹配记录,需在业务逻辑中处理(如显示“无成绩”)。