精华内容
下载资源
问答
  • SQL多表连接总结

    万次阅读 多人点赞 2017-11-29 21:58:40
    了解多表连接查询,就需要先了解多表连接查询的原理,通过实例加深认识。 多表查询原理:将多个表通过笛卡尔积形成一个虚表,再根据查询条件筛选符合条件的数据。 oracle复杂查询参考文档:...

    了解多表连接查询,就需要先了解多表连接查询的原理,通过实例加深认识。

    多表查询原理:将多个表通过笛卡尔积形成一个虚表,再根据查询条件筛选符合条件的数据。

    oracle复杂查询参考文档https://www.2cto.com/database/201805/747393.html

    oracle复杂查询参考文档:https://www.cnblogs.com/mchina/archive/2012/09/09/2653417.html

    1、Union

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。

    当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

    注意:union:用于将不同表中相同的列查询出的数据展示出来,不包括重复数据。(只能查询表中的相同列)

    Union all :用于将不同表中相同的列查询出的数据展示出来,包括重复数据。(只能查询表中的相同列)

    3)查询教师学生全部姓名

     因为UNION只会选择不同的值,如果学生中和教师中有重名的情况,这就需要

    UNION ALL

    SELECT Name FROM Students
    UNION ALL
    SELECT Name FROM Teachers

    2、INNER JOIN(内连接)

    INNER JOIN(内连接:inner可以省略),也称为自然连接

    与select  a.* , b.*   from  表a, 表b where  a.id = b.id  等效,也是内连接(推荐使用join)

    作用:根据两个或多个表中的列之间的关系,从这些表中查询数据。

    注意: 内连接是从结果中删除其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。

    重点:内连接,利用笛卡尔积形成一张虚表,根据条件只保留匹配行。

    语法:SELECT fieldlist   FROM table1 [INNER] join table2   ON table1.column=table2.column  

    学生表信息(Students):

    IDNameAgeCityMajorID
    101Tom20Beijing10
    102Lucy18Shanghai11

    专业信息表(Majors): 

    IDName
    10English
    12Computer

    预置脚本:

    DELETE FROM Students

    INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(101,'Tom',20,'BeiJing',10)

    INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(102,'Lucy',18,'ShangHai',11)

    DELETE FROM Majors

    INSERT INTO Majors(ID,Name) VALUES(10,'English')

    INSERT INTO Majors(ID,Name) VALUES(12,'Computer')

    实例:查询学生信息,包括ID,姓名、专业名称SELECT Students.ID,Students.Name,Majors.Name AS MajorName
    FROM Students INNER JOIN Majors
    ON Students.MajorID = Majors.ID查询结果:

    IDNameMajorName
    101TomEnglish

    根据结果可以清晰看到,确实只有匹配的行。学生Lucy的信息丢失了。

    但是,inner join也会产生重复数据。如果将Majors表的主键约束去掉,可以插入重复的ID,如:DELETE FROM Majors
    INSERT INTO Majors(ID,Name) VALUES(10,'English')
    INSERT INTO Majors(ID,Name) VALUES(10,'Computer')

    继续执行上面的关联语句,结果为:

    IDNameMajorName
    101TomEnglish
    101TomComputer

    如果是LEFT JOIN也会有重复记录,其结果为:

    IDNameMajorName
    101TomEnglish
    101TomComputer
    102LucyNull

    RIGHT JOIN 结果与INNER JOIN一样。

    后续我们会深入研究JOIN的具体原理。

    3、外连接

    与内连接相比,即使没有匹配行,也会返回一个表的全集。

    外连接分为三种:左外连接,右外连接,全外连接。对应SQL:LEFT/RIGHT/FULL OUTER JOIN。通常我们省略outer 这个关键字。写成:LEFT/RIGHT/FULL JOIN。

    重点:至少有一方保留全集,没有匹配行用NULL代替。

    1)LEFT OUTER JOIN,简称LEFT JOIN,左外连接(左连接)

    结果集保留左表的所有行,但只包含第二个表与第一表匹配的行。第二个表相应的空行被放入NULL值。

    依然沿用内链接的例子

    (1)使用左连接查询学生的信息,其中包括学生ID,学生姓名和专业名称。SELECT Students.ID,Students.Name,Majors.Name AS MajorName
    FROM Students LEFT JOIN Majors
    ON Students.MajorID = Majors.ID

    结果:

    IDNameMajorName
    101TomEnglish
    102LucyNull

    结论:

    通过结果,我们可以看到左连接包含了第一张表的所有信息,在第二张表中如果没有匹配项,则用NULL代替。 

    2)RIGHT JOIN(right outer join)右外连接(右连接)

    右外连接保留了第二个表的所有行,但只包含第一个表与第二个表匹配的行。第一个表相应空行被入NULL值。

    右连接与左连接思想类似。只是第二张保留全集,如果第一张表中没有匹配项,用NULL代替

    依然沿用内链接的例子,只是改为右连接

    (1)使用右连接查询学生的信息,其中包括学生ID,学生姓名和专业名称。SELECT Students.ID,Students.Name,Majors.Name AS MajorName
    FROM Students RIGHT JOIN Majors
    ON Students.MajorID = Majors.ID

    查询结果:

    IDNameMajorName
    101TomEnglish
    NullNullComputer

    通过结果可以看到,包含了第二张表Majors的全集,Computer在Students表中没有匹配项,就用NULL代替。 

    3)FULL JOIN (FULL OUTER JOIN,全外连接)

    全外连接,简称:全连接。会把两个表所有的行都显示在结果表中

    1)使用全连接查询学生的信息,其中包括学生ID,学生姓名和专业名称。SELECT Students.ID,Students.Name,Majors.Name AS MajorName
    FROM Students FULL JOIN Majors
    ON Students.MajorID = Majors.ID

    查询结果: 

    IDNameMajorName
    101TomEnglish
    102LucyNull
    NullNullComputer

    包含了两张表的所有记录,没有记录丢失,没有匹配的行用NULL代替。

    4、CROSS JOIN(交叉连接)

    交叉连接。交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接也称作笛卡尔积。 

    简单查询两张表组合,这是求笛卡儿积,效率最低。

    笛卡儿积:笛卡尔乘积,也叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。

    1)交叉连接查询学生的信息,其中包括学生ID,学生姓名和专业名称。SELECT Students.ID,Students.Name,Majors.Name AS MajorName
    FROM Students CROSS JOIN Majors

    查询结果:

    IDNameMajorName
    101TomEnglish
    102LucyEnglish
    101TomComputer
    102LucyComputer

    2)查询多表,其实也是笛卡儿积,与CROSS JOIN等价,以下查询同上述结果一样。

    这个可能很常见,但是大家一定要注意了,这样就查询了两张表中所有组合的全集。SELECT Students.ID,Students.Name,Majors.Name AS MajorName
    FROM Students,Majors

    3)加了查询条件

    注意:在使用CROSS JOIN关键字交叉连接表时,因为生成的是两个表的笛卡尔积,因而不能使用ON关键字,只能在WHERE子句中定义搜索条件。SELECT Students.ID,Students.Name,Majors.Name AS MajorName
    FROM Students CROSS JOIN Majors
    WHERE Students.MajorID = Majors.ID

    查询结果:

    IDNameMajorName
    101TomEnglish

    查询结果与INNER JOIN一样,但是其效率就慢很多了。

    5、全部实例脚本 

    CREATE DATABASE TestDB
    USE TestDB
    ------------------------------------------
    --创建相关表
    IF OBJECT_ID('Students','U') IS NOT NULL
    DROP TABLE Students
    --学生信息表
    CREATE TABLE Students(
    ID int primary key not null,
    Name nvarchar(50),
    Age int,
    City nvarchar(50),
    MajorID int
    )
    --专业信息表
    IF OBJECT_ID('Majors','U') IS NOT NULL
    DROP TABLE Majors

    CREATE TABLE Majors(
    ID int primary key not null,
    Name nvarchar(50)
    )
    --教师信息表
    IF OBJECT_ID('Teachers','U') IS NOT NULL
    DROP TABLE Teachers
    CREATE TABLE Teachers(
    ID int primary key not null,
    Name nvarchar(20) not null
    )
    --预置数据
    DELETE FROM Students
    INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(101,'Tom',20,'BeiJing',10)
    INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(102,'Lucy',18,'ShangHai',11)

    DELETE FROM Majors
    INSERT INTO Majors(ID,Name) VALUES(10,'English')
    INSERT INTO Majors(ID,Name) VALUES(12,'Computer')

    DELETE FROM Teachers
    INSERT INTO Teachers(ID,Name) VALUES(101,'Mrs Lee')
    INSERT INTO Teachers(ID,Name) VALUES(102,'Lucy')

    SELECT ID,Name FROM Students
    UNION
    SELECT ID,Name FROM Teachers

    SELECT ID,Name FROM Students
    UNION ALL
    SELECT ID,Name FROM Teachers
    --内连接
    SELECT Students.ID,Students.Name,Majors.Name AS MajorName
    FROM Students INNER JOIN Majors
    ON Students.MajorID = Majors.ID
    --左连接
    SELECT Students.ID,Students.Name,Majors.Name AS MajorName
    FROM Students LEFT JOIN Majors
    ON Students.MajorID = Majors.ID
    --右连接
    SELECT Students.ID,Students.Name,Majors.Name AS MajorName
    FROM Students LEFT JOIN Majors
    ON Students.MajorID = Majors.ID
    --全连接
    SELECT Students.ID,Students.Name,Majors.Name AS MajorName
    FROM Students FULL JOIN Majors
    ON Students.MajorID = Majors.ID
    --交叉连接
    SELECT Students.ID,Students.Name,Majors.Name AS MajorName
    FROM Students CROSS JOIN Majors
    --交叉连接
    SELECT Students.ID,Students.Name,Majors.Name AS MajorName
    FROM Students CROSS JOIN Majors
    WHERE Students.MajorID = Majors.ID
    --一次查询多表
    SELECT Students.ID,Students.Name,Majors.Name AS MajorName
    FROM Students,Majors

                                                                知识分享不易,望您支持,只为更好!

    知识分享不易,望您支持,只为更好
    知识分享不易,望您支持,只为更好
    展开全文
  • sql多表连接

    万次阅读 2020-07-14 14:29:23
    下面演示一个三表连接查询。 用户表、部门表、用户部门关联表 select a.id as userId,dept_id,c.name as deptName from user as a left join user_dept as b on a.id=b.user_id left join department as c on b....

    下面演示一个三表连接查询。

    用户表、部门表、用户部门关联表

    select a.id as userId,dept_id,c.name as deptName
    from user as a
    left join user_dept as b
    on a.id=b.user_id
    left join department as c
    on b.dept_id=c.id;
    

    在这里插入图片描述

    用户表、角色表、用户角色关联表

    select a.id as userId,c.name as roleName
    from user as a
    left join user_role as b
    on a.id=b.user_id
    left join role as c
    on b.role_id=c.id;
    

    在这里插入图片描述

    展开全文
  • sql中多表连接查询——自连接

    千次阅读 2019-04-25 14:11:42
    多表连接的方法主要有左连接(left join)、右连接(left join)、内连接(inner join)和完全连接(full join),除此之外还有一种在同一个表中连接的方式,自连接。 自连接主要用于表中其他数据和某一数据进行...

    多表连接的方法主要有左连接(left join)、右连接(left join)、内连接(inner join)和完全连接(full join),除此之外还有一种在同一个表中连接的方式,自连接。

    自连接主要用于表中其他数据和某一数据进行比较,这种时候可以将表做两个复本,通过复本之间的比较找到需要的值。

    下面举例说明一下自连接使用场景:

    现在有一张表student,我们需要在student中 查询比“刘明明”年龄更大的同学

    select b.*
    from student a,student b
    where a.Birthdate>b.Birthdate
          and a.SName ='刘明明'

    select  b.*主要用于显示b表的全部内容

    from student a,student b 表示数据来源于student表并起名为a和b。这里可以理解为 有两张和student一模一样的表a,b。我们要查询的数据来源于这两张表。

    where a.Birthdate>b.Birthdate and a.SName ='刘明明'

    表示当a的sname为刘明明时,选择b的Birthdate 小于a的Birthdate 的数据。这里Birthdate 为date型,直接比较是更新的日期更大,也就是2001年1月1日 大于2000年1月 1日。所以要 筛选出比刘明明年龄大的 即为Birthdate 小于刘明明Birthdate 的数据。

    执行结果如下:

    再比如,采用自连接的方法,在student表中查询和“刘明明”一个学院的学生

    where a.Dept=b.Dept and a.SName='刘明明'

    以上都是将a表当做查询的对象,b表当做被查询的对象,在b表中筛选出合适的数据然后显示出来。如果需要显示a表的内容,在select处修改即可。

    展开全文
  • 多表联查(多表连接)(join)

    万次阅读 多人点赞 2018-03-12 17:43:47
    多表联查(多表连接)(join)1、 分类内连接、自然连接、外链接(左外连接、右外连接、全外连接(mysql不支持))2、 内连接 inner join(等值连接,制定对应的等值条件)SELECT * FROM emp,dept;/*得到的数据是...

    多表联查(多表连接)(join

    1、 分类

    内连接、自然连接、外链接(左外连接、右外连接、全外连接(mysql不支持))

    2、 内连接 inner join(等值连接,制定对应的等值条件)

    SELECT * FROM emp,dept;/*得到的数据是不对的*/

    得到的数据叫做笛卡尔积:结果是两个表数据的乘积

    使用内连接去查

    SELECT * FROM emp INNER JOIN dept;

    结果依然是笛卡尔积,是因为我们没有制定对应的等值条件

    SELECT * FROM emp e INNER JOIN dept d WHERE e.deptno = d.deptno;

    /*emp.deptnodept.deptno这样的写法叫做:完全限定名

    两个表中有相同的字段,类似于A村有个老张家,孩子叫张三

    B村也有一个老张家,孩子也叫张三,

    如果没有用到多表联查,就没有必要使用完全限定名,类似于

    A村老张家的爸爸说,张三,吃饭了,指的是自己的孩子

    用到了夺标联查,两家在一起,A村的老张家的爸爸说:张三,吃饭了

    这个张三指的是谁?(不一定)

    */

    提示:一般来讲,我们不使用内连接,因为效率低。用外链接

    标准写法:select * from 1 别名1 inner join 2 别名2 where 别名1.xxx = 别名2.xxx;

    SELECT * FROM emp e INNER JOIN dept d WHERE e.deptno = d.deptno;

     

    方言写法:select * from 1 别名1,表2别名2 where别名1.xxx = 别名2.xxx;

    SELECT * FROM emp e,dept d WHERE e.deptno = d.deptno;

     

    3、 自然连接 natural(不需要指定等值条件)

    select * from 1 别名1 natural join 2 别名2

    4、 外链接(难点)

    左外:select * from 1 别名1 left [ outer ] join 2 别名2 on 等值条件;

    SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptno;

    左外的意思是:左表的记录无论是否满足条件,都会被查出来,而右表的记录只有满足条件的,才会被查出来。(左表中数据在右表中如果不存在,则右表的字段值为null

    理解左外右外:

    先看两个表数据:

     

     

    /*左外*/

    SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id;

     

    左外连接是以左边的表为基准。通俗的讲,先把左表的数据全都显示出来,然后右边的表id与左边表的id的值是一样的,就拼接上去,比如说上面的id=1的数据,就拼接了。

    如果没有匹配的,比如说id=2的数据,右边没有,用null拼接。

     

    /*右外 */

    SELECT * FROM table1 t1 RIGHT JOIN table2 t2 ON t1.id = t2.id;

     

    右外跟左外的机制刚好相反。

    如何去判断主副表?(左外连接:左边的是主表,右外连接:右边的是主表)

    跟讲过的内连接做个简单的比较

    SELECT * FROM table1 t1,table2 t2 WHERE t1.id = t2.id;

     

    区别:内连接显示的是满足等值条件的记录,而外链接主表的记录都显示出来。

    注意:使用多表联查,不一定要有外键。

    例题:/*查询所有工作为文员的员工姓名及部门名称*/

    SELECT e.ename,e.job,d.dname

    FROM emp e LEFT JOIN dept d ON e.deptno = d.deptno

    WHERE e.job = '文员';

     

    例题:/*查询至少有一个员工的部门信息*/


    结果很显然不对,因为40部门没人。

    分析:因为我把dept作为主表,而主表的数据都显示,所以不合适,更改如下:

     

    如下写法也可以

     

    其实可以不用外链接,也可以查询

     

     

     

    子查询

    子查询:查询中还有查询(数select的个数)

    1、 出现的位置

    A from前:作为字段存在的

     

    B where后:作为条件存在的

    /*查询出工资高于在30部门工作的所有员工的工资的员工信息*/

     

    C from后:表(极为罕见)

    展开全文
  • MySQL JOIN 多表连接

    万次阅读 2016-09-06 20:27:57
    ySQL JOIN 多表连接 除了常用的两个表连接之外,SQL(MySQL) JOIN 语法还支持多表连接多表连接基本语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON condition INNER|LEFT|RIGHT JOIN table3 ON ...
  • 多表连接问题

    万次阅读 2017-03-18 15:33:08
    前端时间有同行找到我让我给他看一段sql,说要优化,呢是个多表连接的sql,我看了下,就简单对sql语句进行了优化,对此说下多表连接优化思路: 按照正常的逻辑假如,ABC三个表有关系,一般都是select ... from a left join ...
  • MySQL多表连接查询

    千次阅读 2016-05-13 20:02:53
    多表连接查询是在日常开发中经常需要用到的一个操作。在此对多表连接查询做一个总结,为了便于理解本文以一个实际开发中的案例作为例子来讲解。 表结构首先我们创建三张表:用户表(t_user)、账户表(t_account)...
  • Mysql多表连接查询的执行细节(一)

    万次阅读 多人点赞 2019-02-26 20:54:39
    本篇博客会说明一下问题: 1. 驱动表如何选择; 2. 两表关联查询的内在逻辑是怎样的 3. *多表连接如何执行?是先两表连接的结果集然后关联第三张表,还是一条记录贯穿全局
  • SQL语句多表连接查询语法

    万次阅读 多人点赞 2019-07-28 09:32:13
    总结:内连接就是两个的交集 ,左外连接就是左边加两交集 ,右外连接就是右边加两交集 一、外连接 1.左连接 left join 或 left outer join SQL语句:select * from student left join score on ...
  • MySQL学习16:多表连接

    千次阅读 2016-05-29 22:22:16
    一连接概述  (1)连接  MySQL数据库在SELECT语句,多表更新...多表连接的语法结构为:  table_reference {[INNER | CROSS] JOIN} | {LEFT|RIGHT} [OUTER] JOIN} table_reference ON  condtional_expr;  
  • SQL多表连接查询(详细实例)

    千次阅读 2017-08-07 11:00:05
    本文主要列举两张和三张表来讲述多表连接查询。 新建两张表: 表1:student 截图如下:   表2:course 截图如下:   (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两...
  • MyBatis 多表连接查询

    万次阅读 2018-06-03 16:56:23
    多表连接的两种方式(数据库逻辑模型): 1.一对一关系 2.一对多关系 一、通过 resultMap 和 association 实现一对一关系 在 mapper.xml 文件里面的代码: <resultMap type="...
  • ABP-多表连接查询

    千次阅读 2019-02-18 10:46:23
    前言:什么是多表连接查询   一:编写多表查询语句--内连接 对应SQL语句: select * from Person join Telephone on Person.Id = Telephone.PersonId   第一种方式:LINQ语法 public List<Two...
  • 多表连接查询

    千次阅读 2012-04-21 18:32:00
    本文主要列举两张和三张表来讲述多表连接查询。 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表...
  • hibernate 实现多表连接查询

    千次阅读 2019-01-10 11:34:22
    现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么解决呢? 举个例子: 现在有两个表,一个users用户表, 一个goods商品表,每个用户可以有多个商品,而一个商品只能对应一个用户。 ...
  • mysql delete 多表连接删除功能

    万次阅读 2018-05-08 13:38:53
    mysql delete 多表连接删除功能 转载 2017-03-08 作者:qq_36801966 我要评论 这篇文章主要介绍了mysql delete 多表连接删除功能的相关资料,需要的朋友可以参考下 单个表的删除: DELETE FROM tableName WHERE ...
  • Access数据库多表连接查询

    千次阅读 2017-11-25 23:02:00
    第一次在Access中写多表查询,就按照MS数据库中的写法,结果报语法错,原来Access的多表连接查询是不一样的 表A、B、C,A关联B,B关联C,均用ID键关联 一般写法:select * from A inner join B on A.ID=B.ID inner ...
  • mysql delete 多表连接删除

    千次阅读 2017-03-08 09:32:04
    单个表的删除:DELETE FROM tableName WHERE columnName = value; 删除表内的所有行: 即:保留表的结构、属性、索引 DELETE FROM tablename;...无法报告删除了几行,且只能用于单一表多表连接删除:DELETE o
  • Mysql 多表连接查询

    万次阅读 多人点赞 2018-05-08 19:27:21
    本文部分内容转载至:Mysql 多表查询详解,同时感谢原作者的整理与创作;
  • (四)sql多表连接查询join on的用法

    万次阅读 2019-08-04 18:45:53
    (四)sql多表连接查询join on的用法
  • SQL多表连接查询

    千次阅读 2012-09-18 15:40:12
    本文主要列举两张和三张表来讲述多表连接查询。 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两...
  • mysql多表连接和子查询

    千次阅读 2014-09-20 14:31:32
    # 多表连接建立在有相互关系的父子表上 #交叉连接/笛卡尔交集 SELECT COUNT(*) FROM emp; # 返回14行 SELECT COUNT(*) FROM dept; #返回4行 SELECT COUNT(*) FROM emp,dept; #返回14*4=56行数据 SELECT ...
  • Python数据分析:数据库多表连接(SQLite) 多表连接: 将多个表中的记录连接并返回结果 join方式 交叉连接(cross join) 内连接(inner join) 外连接(outer join) cross join: 生成两张表的笛卡尔积 ...
  • 多表连接查询(内,外,交叉连接) 连接查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系数据库查询最主要的特征. select 表1.字段名1,表2.字段名2,...  from 表1,表2 where 连接条件...
  • 最近记忆力越来越差了,昨天脑袋一抽,居然忘记了怎么用Mybatis进行多表连接查询并在界面取值,好不容易才想起来,写篇博客,以作记录 需求分析 Mybatis多表连接查询 并在界面取值,放在同一表格下 ...
  • Oracle多表连接,提高效率,性能优化

    万次阅读 2018-06-19 14:38:38
    Oracle多表连接,提高效率,性能优化 (转)执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只要0.02秒,但是2张表联合...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,447,946
精华内容 579,178
关键字:

多表连接