zoukankan      html  css  js  c++  java
  • 清晰讲解SQL语句中的内连接,通用于Mysql和Oracle,全是干货哦

    本文章目的:力求清晰明了讲解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);

    表结构如下:

    插入数据:

    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 子句

    方案一:使用自然连接

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

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

    解决方案:使用using

    方案(2):使用using子句

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

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

    解决方案:使用on

    方案(3):使用on子句

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

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

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

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

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

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

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

    完结!

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

  • 相关阅读:
    java 数组的基本概念
    java 简单类
    python3 爬虫教学之爬取链家二手房(最下面源码) //以更新源码
    python3 爬虫之爬取安居客二手房资讯(第一版)
    python3 怎么统计英文文档常用词?(附解释)
    python3 怎么爬取新闻网站?
    ASP.NET 线程详解
    EF6 对于实体字段类型转换扩展
    mysql之调优概论
    mysql8之与标准sql的区别
  • 原文地址:https://www.cnblogs.com/ncl-960301-success/p/10753389.html
Copyright © 2011-2022 走看看