MySQL データベース - マルチテーブルクエリ (2) - 内部接続、外部接続

目次 

内部結合

クエリ構文

内部結合のデモ

外部結合

クエリ構文

外部接続デモ


内部結合

内部結合は、2 つのテーブルの交差部分をクエリし、テーブル A とテーブル B の交差部分からデータを返します。内部結合は、暗黙的内部結合と明示的内部結合の 2 つの形式に分けられます。

クエリ構文

暗黙的な内部結合

SELECT 字段列表 FROM 表1,表2 WHERE 条件...;

明示的な内部結合

SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件 ...;

内部結合のデモ

データの準備

create table dept(
    id   int auto_increment comment 'ID' primary key,
    name varchar(50) not null comment '部门名称'
)comment '部门表';

create table emp(
    id  int auto_increment comment 'ID' primary key,
    name varchar(50) not null comment '姓名',
    age  int comment '年龄',
    job varchar(20) comment '职位',
    salary int comment '薪资',
    entrydate date comment '入职时间',
    managerid int comment '直属领导ID',
    dept_id int comment '部门ID'
)comment '员工表';

-- 添加外键
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);

INSERT INTO dept (id, name)
    VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4, '销售部'), (5, '总经办'), (6, '人事部');
INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id) VALUES
            (1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),
            (2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),
            (3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),
            (4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),
            (5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),
            (6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1),
            (7, '灭绝', 60, '财务总监',8500, '2002-09-12', 1,3),
            (8, '周芷若', 19, '会计',48000, '2006-06-02', 7,3),
            (9, '丁敏君', 23, '出纳',5250, '2009-05-13', 7,3),
            (10, '赵敏', 20, '市场部总监',12500, '2004-10-12', 1,2),
            (11, '鹿杖客', 56, '职员',3750, '2006-10-03', 10,2),
            (12, '鹤笔翁', 19, '职员',3750, '2007-05-09', 10,2),
            (13, '方东白', 19, '职员',5500, '2009-02-12', 10,2),
            (14, '张三丰', 88, '销售总监',14000, '2004-10-12', 1,4),
            (15, '俞莲舟', 38, '销售',4600, '2004-10-12', 14,4),
            (16, '宋远桥', 40, '销售',4600, '2004-10-12', 14,4),
            (17, '陈友谅', 42, null,2000, '2011-10-12', 1,null);

 1. 各従業員の名前と関連する部門の名前をクエリします (暗黙的な内部接続の実装)。

  • テーブル構造: emp、dept
  • 接続条件:emp.dept_id = dept.id
select e.name '姓名', d.name '部门' from emp e,dept d where e.dept_id = d.id;

操作結果:

(社員1名は当面無所属)

2. 各従業員の名前と関連する部門の名前を照会します (明示的な内部接続メソッド)

  • テーブル構造: emp、dept
  • 接続条件:emp.dept_id = dept.id
select e.name '姓名',d.name '部门' from emp e inner join dept d where e.dept_id = d.id;
-- inner可以省略

操作結果:

外部結合

クエリ構文

左外部結合

SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件 ...;

表 1 と表 2 の交差部分のデータを含む、表 1 (左側の表) のすべてのデータをクエリすることと同等です。

右外部結合

SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件...;

表 1 と表 2 の交差部分のデータを含む、表 2 (右側の表) のすべてのデータをクエリすることと同等です。

外部接続デモ

1. emp テーブル内のすべてのデータと、対応する部門情報をクエリします (左外部結合)。

  • テーブル構造: emp、dept
  • 接続条件:emp.dept_id = dept.id
select e.*,d.name from emp e left outer join dept d on e.dept_id = d.id;
-- outer可省略

検索結果: 

構文的には、表 1 (emp) と表 2 (dept)、つまり表 1 のデータ + 表 1 と表 2 の交差部分のデータに対して左外部結合クエリを実行します。したがって、表 1 の内容に属する従業員番号 17 を照会できますが、2 つの表の共通部分には属しません。

2. dept テーブル内のすべてのデータと対応する従業員情報をクエリします (右外部結合)

select d.*,e.* from emp e right outer join dept d on e.dept_id = d.id;

検索結果:

同様に、ここでの右外部結合は、テーブル 2 のデータ + テーブル 1 とテーブル 2 の交差部分にあるすべてのデータをクエリするため、空の人事部をクエリできます。

同時に、左外部結合を使用して右外部結合を実装することもできます。

select d.*,e.* from dept d left outer join emp e on e.dept_id = d.id;

2 つのテーブルの位置を交換するだけで済みます。ここでのテーブル 1 (dept) とテーブル 2 (emp) の左外部結合は、次のテーブル 1 (emp) とテーブル 2 (dept) の右外部結合と同等です。前の場所。

おすすめ

転載: blog.csdn.net/li13437542099/article/details/132460975