欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

清晰讲解SQL语句中的内连接,通用于Mysql和Oracle,全是干货哦

程序员文章站 2022-06-03 10:50:35
本文章目的:力求清晰明了讲解SQL语句的内连接的各种应用,没有深奥的理解! 前奏:这篇文章和下篇文章会将内连接和外连接讲解清楚SQL语句的多表查询常用的有以下几种:两表联合查询(1)内连接(2)外连接(分左外连接、右外连接)(3)全外连接(4)自连接三表查询(1)三表查询本片讲解两表联合查询的内连接 ......

本文章目的:力求清晰明了讲解sql语句的内连接的各种应用,没有深奥的理解!

前奏:这篇文章和下篇文章会将内连接外连接讲解清楚
sql语句的多表查询常用的有以下几种:
两表联合查询
(1)内连接
(2)外连接(分左外连接、右外连接)
(3)全外连接
(4)自连接
三表查询
(1)三表查询
本片讲解两表联合查询的内连接
第一步:准备表,员工表emp,部门表dept
关联关系:员工表的“deptno”字段关联部门表的“deptno”

建表语句如下:

create table dept
(
  deptno int(2) not null,
  dname  varchar(14),
  loc    varchar(13)
);
alter table dept
  add constraint pk_dept primary key (deptno);
create table emp
(
  empno    int(4) primary key,
  ename    varchar(10),
  job      varchar(9),
  mgr      int(4),
  hiredate date,
  sal      double(7,2),
  comm     double(7,2),
  deptno   int(2)
);
alter table emp
  add constraint fk_deptno foreign key (deptno)
  references dept (deptno);

表结构如下:

清晰讲解SQL语句中的内连接,通用于Mysql和Oracle,全是干货哦

插入数据:

insert into dept (deptno, dname, loc)values (10, 'accounting', 'new york');
insert into dept (deptno, dname, loc)values (20, 'research', 'dallas');
insert into dept (deptno, dname, loc)values (30, 'sales', 'chicago');
insert into dept (deptno, dname, loc)values (40, 'operations', 'boston');
insert into dept (deptno, dname, loc)values (10, 'accounting', 'new york');
insert into dept (deptno, dname, loc)values (20, 'research', 'dallas');
insert into dept (deptno, dname, loc)values (30, 'sales', 'chicago');
insert into dept (deptno, dname, loc)values (40, 'operations', 'boston');
commit;
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7369, 'smith', 'clerk', 7902, '1980-12-17', 800, null, 20);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7499, 'allen', 'salesman', 7698, '1981-02-20', 1600, 300, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7521, 'ward', 'salesman', 7698, '1981-02-22', 1250, 500, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7566, 'jones', 'manager', 7839, '1981-04-02', 2975, null, 20);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7654, 'martin', 'salesman', 7698, '1981-09-28', 1250, 1400, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7698, 'blake', 'manager', 7839, '1981-05-01', 2850, null, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7782, 'clark', 'manager', 7839, '1981-06-09', 2450, null, 10);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7788, 'scott', 'analyst', 7566, '1987-04-19', 3000, null, 20);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7839, 'king', 'president', null, '1981-11-17', 5000, null, 10);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7844, 'turner', 'salesman', 7698, '1981-09-08', 1500, 0, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7876, 'adams', 'clerk', 7788, '1987-05-23', 1100, null, 20);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7900, 'james', 'clerk', 7698, '1981-12-03', 950, null, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7902, 'ford', 'analyst', 7566, '1981-12-03', 3000, null, 20);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7934, 'miller', 'clerk', 7782, '1982-01-23', 1300, null, 10);

第二步:讲解内连接

(1)笛卡尔积现象:(什么是笛卡尔积,在此不在讲解,如果有需要,可以留言,我再补充)

通过关键字:cross join

优点:有助于理解多表查询

缺点:交叉连接会产生笛卡尔积,产生多条无用结果

解决方案:(1)使用natural子句,即自然连接

     (2)使用using子句

              (3)使用on 子句

清晰讲解SQL语句中的内连接,通用于Mysql和Oracle,全是干货哦

方案一:使用自然连接

优点:会自动的按照所有的同名列进行匹配,并且同名列只显示一次,简便

缺点:会自动的按照“所有的”同名列进行匹配,如果希望按照某一个同名列进行匹配,自然连接无能为力

解决方案:使用using

清晰讲解SQL语句中的内连接,通用于Mysql和Oracle,全是干货哦

方案(2):使用using子句

优点:只显示指定的同名字段

缺点:如果两张表的关联字段不同名怎么办?

解决方案:使用on

清晰讲解SQL语句中的内连接,通用于Mysql和Oracle,全是干货哦

方案(3):使用on子句

优点:不管是否有同名列,都可以使用;虽然稍显复杂,但是可读性高,很好的解决了自然连接和using子句的缺陷

  因此,在开发中,推荐使用on子句

清晰讲解SQL语句中的内连接,通用于Mysql和Oracle,全是干货哦

至此,多表查询的内连接讲解完毕,总结一下:

交叉连接(cross join):会产生笛卡尔积,产生大量无用数据,无用

自然连接(natural):会自动的按照所有的同名列进行匹配,并且同名列只显示一次,显示繁琐

使用(using):按照某一个同名列进行匹配,指定了同名列,一定程度减少了自然连接的显示量

使用(on):如果两张表的关联字段不同名,自然连接和using无能为力,只有通过on子句。推荐使用on子句

完结!

注:下篇文章,讲解外连接,有问题要交流的欢迎留言,有则改之无则加勉。