精华内容
参与话题
问答
  • mysql多表查询

    千次阅读 2019-06-30 11:50:26
    效果:用1中一个字段的值 在 2中查询 想要的2中一个字段的值,然后将1,2的查询结果 返回 1:admin_user 2:youxi_table 1.youxi = 2.id sql:select a.*,b.youxi from admin_user as a,youxi_...

    效果:用表1中一个字段的值 在 表2中查询 想要的表2中一个字段的值,然后将表1,表2的查询结果 返回
    表1:admin_user
    在这里插入图片描述
    表2:youxi_table
    在这里插入图片描述
    表1.youxi = 表2.id
    sql:select a.*,b.youxi from admin_user as a,youxi_table as b where a.youxi = b.id
    结果:
    在这里插入图片描述

    展开全文
  • MySQL多表查询

    千次阅读 2018-09-03 19:50:55
    多表查询 1.什么是多表查询呢? 就是从多个表中查询数据. 例如 : slect * from A, B; 这时查询出来的结果集会产生一个笛卡尔积. 什么是笛卡尔积呢? 意思是A和B中的所有组合情况. 但是这并不是我们想要的结果,...

    多表查询

    1.什么是多表查询呢?

    就是从多个表中查询数据.
    例如 : slect * from A, B;
    这时查询出来的结果集会产生一个笛卡尔积.
    什么是笛卡尔积呢? 意思是A和B中的所有组合情况.
    但是这并不是我们想要的结果,所以需要我们筛选出有用的数据.

    多表查询的分类

    这里写图片描述

    1. 内连接查询

    在查询前我们应该考虑到以下几点:
    
    1.查询的表有哪些 ?
    2.连接表的条件是什么?
    3.查询的条件是什么,也是就查询结果应该满足什么条件?
    4.确定查询字段,也就是需要显示出哪些信息.
    
    隐式内连接查询  
    语法: select 字段名 from 左表, 右表 where 条件
    满足where条件的数据会被查询出来.
    
    显示内连接查询
    语法: select 字段名 from 左表 [inner] join 右表 on 条件;
    满足on的条件的数据会被查询出来.
    
    

    举例说明—内连接查询

    # 创建部门表
    CREATE TABLE dept(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	NAME VARCHAR(20)
    );
    
    INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');
    
    # 创建员工表
    CREATE TABLE emp (
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	NAME VARCHAR(10),
    	gender CHAR(1), -- 性别
    	salary DOUBLE, -- 工资
    	join_date DATE, -- 入职日期
    	dept_id INT,
    	FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表(部门表的主键)
    );
    
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);
    
    
    首先我们查询一下两个表的所有数据 
    SELECT * FROM emp,dept;
    

    这里写图片描述

    我们发现不是所有的数据组合都是有用的,只有员工表.dept_id = 部门表.id 的数据才是有用的。所以需要通过条件过滤掉没用的数据。

    -- 查询所有员工姓名以及对应的部门名
    select emp.`name`, dept.`name` from emp,dept where emp.`dept_id` = dept.`id`;
    

    这里写图片描述

    查询唐僧的信息, 显示员工 id, 姓名, 性别, 工资和所在的部门名称, 我们发现需要联合 2 张表同时才能查询出需要的数据

    这里写图片描述

    1.首先确定查询的表,部门表,员工信息表.
    2.表之间的连接条件是 员工表.dept_id = 部门表.id.
    3.筛选的条件是 员工姓名为唐僧的.
    4.查询的字段是 员工 id, 姓名, 性别, 工资和所在的部门名称.
    
    SELECT 
    	a.`id`,		-- 员工id	
    	a.`name`,	-- 员工名
    	a.`gender`,	-- 员工性别
    	a.`salary`,	-- 员工工资
    	b.`name`	-- 部门名
    FROM
    	emp a
    INNER JOIN
    	dept b
    ON
    	a.`dept_id` = b.`id`
    WHERE   
    	a.`name` = '唐僧';
    
    

    这里写图片描述

    2.外连接查询

    左外连接查询
    语法:
    SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件
    用左表的记录去匹配右表的记录,如果符合条件的则显示;否则显示 NULL
    可以理解为:在内连接的基础上保证左表的数据全部显示.
    
    右外连接查询
    语法:
    SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 条件
    用右表的记录去匹配左表的记录,如果符合条件的则显示;否则显示 NULL
    可以理解为:在内连接的基础上保证右表的数据全部显示.
    
    

    举例说明—外连接查询

    在上边所建表中修改数据 操作如下:

    -- 在部门表中增加一个销售部
    insert into dept (name) values ('销售部');
    
    -- 左外连接查询
    SELECT * FROM dept d LEFT JOIN emp e ON d.`id` = e.`dept_id`;
    

    这里写图片描述

    -- 在员工表中增加一个员工
    insert into emp values (null, '沙僧','男',6666,'2013-12-05',null);
    
    -- 使用右外连接查询
    SELECT * FROM dept d RIGHT JOIN emp e ON d.`id` = e.`dept_id`;	
    

    这里写图片描述

    3.子查询

    子查询的概念
    1.一个查询的结果用来做为另一个查询的条件.
    2.有查询的嵌套,内部的查询就被称为子查询,并且用括号把子查询括起来.
    

    子查询的结果分为三种:
    1.单行单列
    子查询结果只要是单行单列, 肯定在 WHERE 后面作为条件, 父查询使用: 比较运算符, 如: > 、 <、 <>、 = 等

    语法: SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
    
    eg: 查询最高工资员工的信息
    -- 查询最高工资是多少
    select max(salary)from emp;
    -- 根据最高工资到员工表查询到对应的员工信息
    SELECT * FROM emp WHERE salary = (SELECT MAX(salary)FROM emp);
    
    

    2.多行单列
    子查询结果是多行单列,结果集类似于一个数组,父查询使用 IN 运算符

    语法: SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
    
    eg: 查询开发部与财务部所有的员工信息
    -- 先查询开发部与财务部的 id
    SELECT dept.`id` FROM dept WHERE NAME IN('开发部','财务部');
    -- 再查询这些部门id有哪些员工
    SELECT * FROM emp WHERE emp.`dept_id` IN (SELECT dept.`id` FROM dept WHERE NAME IN('开发部','财务部'));
    

    3.多行多列
    子查询的结果是多行多列,结果可以当做虚拟表使用,

    语法: SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;
    子查询作为表需要取别名,否则这张表没有名称则无法访问表中的字段.
    
    eg: 查询出 2011 年以后入职的员工信息,包括部门名称
    -- 在员工表中查询 2011-1-1 以后入职的员工
    select * from emp where join_date >='2011-1-1';
    -- 查询所有的部门信息,与上面的虚拟表中的信息组合,找出所有部门 id 等于的 dept_id
    select * from dept d, (select * from emp where join_date >='2011-1-1') e where
    d.`id`= e.dept_id ;
    
    

    子查询的结果只要是单列,则在 WHERE 后面作为条件.
    子查询的结果只要是多列,则在 FROM 后面作为表进行二次查询.

    展开全文
  • Mysql多表查询

    千次阅读 2019-09-05 00:03:32
    mysql多表查询

    数据库多表查询

    数据表准备

    1.tb_books表

    在这里插入图片描述

    2.book表

    在这里插入图片描述

    一.内连接

    1.查询方法

    在这里插入图片描述

    2.查询结果

    [外链图片转存失败(img-IIAeSsVO-1567612466474)(.\image\2.png)]

    二.左连接查询

    1.查询方法

    [外链图片转存失败(img-BThWSF8t-1567612466475)(.\image\3.png)]

    2.查询结果

    [外链图片转存失败(img-LgavGFre-1567612466476)(.\image\4.png)]

    三.右连接查询

    1.查询方法

    [外链图片转存失败(img-ICYZnAeT-1567612466477)(.\image\5.png)]

    2.查询结果

    [外链图片转存失败(img-kwNRIuz0-1567612466478)(.\image\6.png)]

    四.总结

    • 1.内联,左联和右连必须在多表查询状态下进行。
      • 1.1.大
        • 1.2.家
          • 1.3.好
    • 2.内连就是抓取两张表共同满足on条件后的数据。
    • 3.左连就是以左表数据为主,再查出满足on条件后的数据。
    • 4.右连就是以右表数据为主,再查出满足on条件后的数据。
    • 5.A表左连B表等同于B表右连A表,A表右连B表等同于B表左连A表。
    展开全文
  • mysql 多表查询

    千次阅读 2017-11-30 14:37:21
    1、多表查询的种类?  在实际查询中,我们会更多的使用多表查询,那么多表查询的种类有哪几种呢?如下:  (1)合并结果集  (2)连接查询  ➤内连接  ➤外连接  ◇左外连接  ◇右...

    1、多表查询的种类?


      在实际查询中,我们会更多的使用多表查询,那么多表查询的种类有哪几种呢?如下:

      (1)合并结果集

      (2)连接查询

         ➤内连接

         外连接

            左外连接

            右外连接

            ◇全外连接(MySQL不支持,可通过union左外和右外实现)

         自然连接

      (3)子查询


    2、合并结果集


      作用:合并结果集就是把两个select语句的查询结果纵向合并到一起。

      要求:被合并的两个结果:列数、列类型必须相同。

      合并结果集有两种方式:

        UNION:去除重复记录,例:SELECT * FROM t1 UNION SELECT * FROM t2;

        UNION ALL:不去除重复记录,例:SELECT * FROM t1 UNION ALL SELECT * FROM t2。



    3、连接查询


      连接查询就是求出多个表的乘积,例如t1连接t2,那么查询出的结果就是t1*t2。



      连接查询会产生笛卡尔积,比如emp表一共14行记录,dept 4行记录,那么连接后查询出的结果是56行记录。但是多表查询产生这样的结果并不是我们想要的,那么去除重复的记录就是通过条件过滤,通常要查询的多个表之间都存在关联关系,那么就通过关联关系去除笛卡尔积。一般我们都使用主外键关系做为条件来去除笛卡尔积。




      例如:

    [sql] view plain copy
    1. <span style="font-size:18px;">SELECT emp.ename,emp.sal,emp.comm,dept.dname   
    2. FROM emp,dept   
    3. WHERE emp.deptno=dept.deptno;/*(deptno是dept的主键,是emp的外键)*/  
    4. </span>  


      (1)内连接


        上面的连接语句就是内连接,但它不是SQL标准中的查询方式,就是前面《结构化查询语言》中所说的方言。SQL标准的内连接为:
    [sql] view plain copy
    1. <span style="font-size:18px;">SELECT *   
    2. FROM emp e   
    3. INNER JOIN dept d   
    4. ON e.deptno=d.deptno;</span>  

        内连接的特点:查询结果必须满足查询所使用的条件。


      (2)外连接


        分为左外连接和右外连接。特点:查询出的结果存在不满足条件的可能,如null。


        ● 左外连接

          左表数据无论是否满足关联条件都会出现!右表显示匹配数据!如果左表不匹配关联条件,右表补null。

    [sql] view plain copy
    1. <span style="font-size:18px;">SELECT * FROM emp e   
    2. LEFT OUTER JOIN dept d   
    3. ON e.deptno=d.deptno;</span>  

          左连接是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL。


        ● 右外连接

          右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。

    [sql] view plain copy
    1. <span style="font-size:18px;">SELECT * FROM emp e   
    2. RIGHT OUTER JOIN dept d   
    3. ON e.deptno=d.deptno;</span>  



        ● 全外连接

          mysql是不支持全外连接的,但是我们通过这样来实现:

    [sql] view plain copy
    1. /* 左右不满足条件的也都显示出来,都补null */  
    2. SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno  
    3. UNION  
    4. SELECT * FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno  


        连接查询心得:

          连接不限与两张表,连接查询也可以是三张、四张,甚至N张表的连接查询。通常连接查询不可能需要整个笛卡尔积,而只是需要其中一部分,那么这时就需要使用条件来去除不需要的记录。这个条件大多数情况下都是使用主外键关系去除。

          两张表的连接查询一定有一个主外键关系,三张表的连接查询就一定有两个主外键关系,所以在大家不是很熟悉连接查询时,首先要学会去除无用笛卡尔积,那么就是用主外键关系作为条件来处理。如果两张表的查询,那么至少有一个主外键条件,三张表连接至少有两个主外键条件。

      (3)自然连接

        大家也都知道,连接查询会产生无用笛卡尔积,我们通常使用主外键关系等式来去除它。而自然连接无需你去给出主外键等式,它会自动找到这一等式:两张连接的表中名称和类型完成一致的列作为条件,例如emp和dept表都存在deptno列,并且类型一致,所以会被自然连接找到!当然自然连接还有其他的查找条件的方式,但其他方式都可能存在问题!

    [sql] view plain copy
    1. <span style="font-size:18px;">SELECT * FROM emp NATURAL JOIN dept;  
    2. SELECT * FROM emp NATURAL LEFT JOIN dept;  
    3. SELECT * FROM emp NATURAL RIGHT JOIN dept;</span>  


    4、子查询


      子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。


      子查询出现的位置:


        where后:作为条件的一部分;

        from后:作为被查询的一条表;

      当子查询出现在where后作为条件时,还可以使用如下关键字:any、all。

    [sql] view plain copy
    1. <span style="font-size:18px;">/*  
    2. 1. 使用all,查询工资大于30部门所有人的员工信息  
    3. */  
    4. SELECT * FROM emp e  
    5. WHERE sal > ALL (SELECT sal FROM emp e WHERE deptno=30)  
    6.   
    7. /*  
    8. 2. 使用any,查询工资小于30部门任意一人的员工信息  
    9. */  
    10. SELECT * FROM emp e  
    11. WHERE sal < ANY (SELECT sal FROM emp e WHERE deptno=30)</span>  

      

      子查询结果集的形式:


        单行单列(用于条件,即where后):

    [sql] view plain copy
    1. <span style="font-size:18px;">/*  
    2. 单行单列 --> 单个值  
    3. 1. 查询与阿飞同一部门的所有员工  
    4. */  
    5. SELECT * FROM emp e WHERE deptno=(SELECT deptno FROM emp WHERE ename='阿飞')</span>  

        单行多列(用于条件):

    [sql] view plain copy
    1. <span style="font-size:18px;">/*  
    2. 单行多列 --> 对象  
    3. 3. 查询工资和部门与小张都相同的员工信息  
    4. */  
    5. SELECT * FROM emp e WHERE (sal,deptno)=(SELECT sal, deptno FROM emp WHERE ename='小张')</span>  

        多行单列(用于条件):

    [sql] view plain copy
    1. <span style="font-size:18px;">/*  
    2. 多行单列 --> 数组  
    3. 2. 查询与小张或阿飞同一部门的所有员工  
    4. */  
    5. SELECT * FROM emp e WHERE deptno IN (SELECT deptno FROM emp WHERE ename IN ('小张''阿飞'))</span>  

        多行多列(作为表的形式,即from后):

    [sql] view plain copy
    1. <span style="font-size:18px;">SELECT * FROM emp e INNER JOIN (SELECT * FROM dept WHERE deptno>10) d</span>  

      小结:多表查询包括合并结果集、连接查询和子查询,连接查询中多表操作一定会用到主外键关系去除笛卡尔积;子查询中要注意子查询所在位置,代表了子查询的作用。

    展开全文
  • MYSQL多表查询

    千次阅读 2014-04-22 09:53:19
    一使用SELECT子句进行多表查询 SELECT 字段名 FROM 表1,表2 … WHERE 表1.字段 = 表2.字段 AND 其它查询条件 SELECT a.id,a.name,a.address,a.date,b.math,b.english,b.chinese FROM tb_demo065_tel AS b,tb_...
  • Mysql 多表查询详解

    万次阅读 多人点赞 2016-04-27 16:33:48
    1)多表连接有哪些分类; 2)针对这些分类有哪些连接方法? 3)这些连接方法分别作用于哪些应用场景? 这篇针对这三个点通过实例来讲述,目的是穷尽所有的场景和所有的方法,并且对每个方法的使用做实例。 2.假设有两张...
  • MySQL多表查询核心优化

    万次阅读 2016-03-22 17:00:33
    在一般的项目开发中,对数据表的多表查询是必不可少的。而对于存在大量数据量的情况时(例如百万级数据量),我们就需要从数据库的各个方面来进行优化,本文就先从多表查询开始。

空空如也

1 2 3 4 5 ... 20
收藏数 20,164
精华内容 8,065
关键字:

mysql多表查询

mysql 订阅