mysql关联查询_mysql关联查询sql语句 - CSDN
精华内容
参与话题
  • MySQL关联查询

    2019-08-07 02:45:32
    MySQL关联查询的三种写法: SELECT * FROM film JOIN film_actor ON (film.film_id = film_actor.film_id);SELECT * FROM film JOIN film_actor USING (film_id); --当两个要关联表的字段名是一样时,可以使用USING...

        

    MySQL关联查询的三种写法:

    SELECT * FROM film JOIN film_actor ON (film.film_id = film_actor.film_id);
    SELECT * FROM film JOIN film_actor USING (film_id);  --当两个要关联表的字段名是一样时,可以使用USING()
    SELECT * FROM film, film_actor WHERE film.film_id = film_actor.film_id;

    优化关联查询:

    1.确保ON或者USING子句中的列上有索引。在创建索引的时候就要考虑到关联顺序。一般来说,除非有其他理由,否则只需要在关联顺序中的第二个表的相应列上创建索引。比如当表film和表film_actor用列film_id关联的时候。如果优化器的关联顺序是film_actor、film 那么就不需要在film_actor表的film_id列上加索引了。

    2.确保任何的GROUP BY 和ORDER BY 中的表达式只涉及到一个表中的列,这样MySQL才有可能使用索引来优化这个过程。

    3.当升级MySQL的时候需要注意:关联语法、运算符优先级等其他可能会发生变化的地方。因为以前的是普遍关联的地方可能会变成笛卡尔积,不同类型的关联可能会生成不同的结果等。

    转载于:https://www.cnblogs.com/heyhey/p/7837197.html

    展开全文
  • Mysql中的关联查询(内连接,外连接,自连接)

    万次阅读 多人点赞 2017-12-26 19:14:25
    在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,总结一下mysql中的多表关联查询 一,内连接查询 是指所有查询出的结果都是能够在连接...

    在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,总结一下mysql中的多表关联查询

    一,内连接查询

    是指所有查询出的结果都是能够在连接的表中有对应记录的。

    以t_employee(员工表)和t_dept(部门表)为例:

    t_employee表中的记录如下:dept代表该员工所在的部门


    t_dept表中记录如下:


    可以发现,其中人力资源部里没有员工(这里只是举例,可能与实际不符,但主要在于逻辑关系),而赵七没有对应的部门,现在想要查询出员工姓名以及其对应的部门名称:

    此时,就要使用内连接查询,关键字(inner join)

    在这里说一下关联查询sql编写的思路,1,先确定所连接的表,2,再确定所要查询的字段,3,确定连接条件以及连接方式

    select 
    e.empName,d.deptName
    from t_employee e
    INNER JOIN t_dept d
    ON e.dept = d.id;
    查询的结果如下:


    其中,没有部门的人员和部门没有员工的部门都没有被查询出来,这就是内连接的特点,只查询在连接的表中能够有对应的记录,其中e.dept = d.id是连接条件



    二,左外连接查询

    是指以左边的表的数据为基准,去匹配右边的表的数据,如果匹配到就显示,匹配不到就显示为null。例如:

    查询所有员工姓名以及他所在的部门名称:在内连接中赵七没有被查出来,因为他没有对应的部门,现在想要把赵七也查出来,就要使用左外连接:

    SELECT e.empName,d.deptName
    from t_employee e
    LEFT OUTER JOIN t_dept d 
    on d.id = e.dept;


    在这里,t_employee就是左表,也就是基准表,用基准表的数据去匹配右表的数据,所以左表的记录是全部会查询出来的,如果右表没有记录对应的话就显示null

    查询结果:


    关键字是left outer join,等效于left join,在关联查询中,做外连接查询就是左连接查询,两者是一个概念

    三,右外连接是同理的,只是基准表的位置变化了而已

    比如:查询所有的部门和对应的员工:

    SELECT e.empName,d.deptName
    from t_employee e
    RIGHT OUTER JOIN t_dept d 
    on d.id = e.dept;
    这里只是把left修改成了right,但是基准表变化了,是以右表的数据去匹配左表,所以左外连接能做到的查询,右外连接也能做到
    查询结果:



    四,全外连接

    顾名思义,把两张表的字段都查出来,没有对应的值就显示null,但是注意:mysql是没有全外连接的(mysql中没有full outer join关键字),想要达到全外连接的效果,可以使用union关键字连接左外连接和右外连接。例如:

    select e.empName,d.deptName
         FROM t_employee e 
         left JOIN t_dept d
         ON e.dept = d.id
    UNION
    select e.empName,d.deptName
         FROM t_employee e 
         RIGHT JOIN t_dept d
         ON e.dept = d.id;
    查询结果:


    如果在oracle中,直接就使用full outer join关键字连接两表就行了


    五,自连接查询

    自连接查询就是当前表与自身的连接查询,关键点在于虚拟化出一张表给一个别名

    例如:查询员工以及他的上司的名称,由于上司也是员工,所以这里虚拟化出一张上司表

    SELECT e.empName,b.empName
         from t_employee e
         LEFT JOIN t_employee b
         ON e.bossId = b.id;
    查询结果:

    在这里,b表是虚拟化出的表,我们可以通过查询了解b表的记录:

    SELECT e.empName,b.empName,b.*
         from t_employee e
         LEFT JOIN t_employee b
         ON e.bossId = b.id;
    查询结果:


    后面的四个字段就是虚拟化出的b表的所有记录,但看这四个字段其实就是记录所有是上司的员工的信息

    所以,自连接查询一般用作表中的某个字段的值是引用另一个字段的值,比如权限表中,父权限也属于权限。



    展开全文
  • mysql 关联查询

    千次阅读 2018-08-30 11:59:12
    数据库在通过连接两张或多张表来返回...所有查询出的结果都是能够在连接的表中有对应记录; t_employee表: t_dept表: select e.empName,d.deptName from t_employee e INNER JOIN t_dept d ON e.dept = ...

    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

    1、inner join:

    所有查询出的结果都是能够在连接的表中有对应记录;

    t_employee表:

    t_dept表:

    select 
    e.empName,d.deptName
    from t_employee e
    INNER JOIN t_dept d
    ON e.dept = d.id;
    

    结果

    2、left join:

    以左边的表的数据为基准,去匹配右边的表的数据,如果匹配到就显示,匹配不到就显示为null;

    SELECT e.empName,d.deptName
    from t_employee e
    LEFT OUTER JOIN t_dept d 
    on d.id = e.dept;
    

    3、right join:

    以右边的表的数据为基准,去匹配左边的表的数据,如果匹配到就显示,匹配不到就显示为null;

    SELECT e.empName,d.deptName
    from t_employee e
    RIGHT OUTER JOIN t_dept d 
    on d.id = e.dept;
    

    4、全外连接:

    把两张表的字段都查出来,没有对应的值就显示null,注意:mysql是没有全外连接的(mysql中没有full outer join关键字),想要达到全外连接的效果,可以使用union关键字连接左外连接和右外连接;

    select e.empName,d.deptName
         FROM t_employee e 
         left JOIN t_dept d
         ON e.dept = d.id
    UNION
    select e.empName,d.deptName
         FROM t_employee e 
         RIGHT JOIN t_dept d
         ON e.dept = d.id;
    

    5、自然连接:

    自连接查询就是当前表与自身的连接查询,关键点在于虚拟化出一张表给一个别名;

    SELECT e.empName,b.empName
         from t_employee e
         LEFT JOIN t_employee b
         ON e.bossId = b.id;
    

    在这里,b表是虚拟化出的表,我们可以通过查询了解b表的记录:

    SELECT e.empName,b.empName,b.*
         from t_employee e
         LEFT JOIN t_employee b
         ON e.bossId = b.id;
    

    6、关联查询时,on条件与where条件区别

    在使用left jion时,on和where条件的区别如下:

    1>on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

    2>where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉

    表1:tab1

    id

    size

    1

    10

    2

    20

    3

    30

    表2:tab2 

    size

    name

     

    10

    AAA

    20

    BBB

    20

    CCC

    两条SQL:

    >select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’;            #1
    >select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’);
    #2

    第一条SQL的过程:

    1>中间表 on条件: tab1.size = tab2.size

    tab1.id tab1.size tab2.size tab2.name

    1

    10

    10

    AAA

    2

    20

    20

    BBB

    2

    20

    20

    CCC

    3

    30

    (null)

    (null)

    2>再对中间表过滤 where 条件: tab2.name=’AAA’

    tab1.id tab1.size tab2.size tab2.name

    1

    10

    10

    AAA

    第二条SQL的过程:

    1>中间表 on条件: tab1.size = tab2.size and tab2.name=’AAA’ (条件不为真也会返回左表中的记录)

    tab1.id tab1.size tab2.size tab2.name

    1

    10

    10

    AAA

    2

    20

    (null)

    (null)

    3

    30

    (null)

    (null)

    其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

    可以这样理解:on是在生成连接表的起作用的,where是生成连接表之后对连接表再进行过滤。

    当使用left join时,无论on的条件是否满足,都会返回左表的所有记录,对于满足的条件的记录,两个表对应的记录会连接起来,对于不满足条件的记录,那右表字段全部是null

    当使用right join时,类似,只不过是全部返回右表的所有记录

    当使用inner join时,功能与where完全相同。

    更加深了对on和where的理解,得出以下结论:

    1>on后的条件如果有过滤主表的条件,则结果对于不符合该条件的主表数据也会原条数保留,只是不匹配右表数据而已。对于on后面对右表的过滤条件,连接时会用该条件直接过滤右表数据后再和左边进行左连接。总之,对于不满足on后面的所有条件的数据,左表会在结果数据中原条数保留数据,只是不匹配右表数据而已。不满足条件的右表数据各字段会直接以NULL连接主表。

    2>ON后对左表的筛选条件对于结果行数会被忽略,但会影响结果中的匹配右表数据,因为只有符合左表条件的数据才会去和符合条件的右表数据进行匹配,不符合条件的左表数据会保留在最后结果中,但匹配的右表数据都是NULL.因此,对于需要过滤左表数据的话,需要把过滤条件放到where后面。

    3>ON后的左表条件(单独对左表进行的筛选条件)对于结果行数无影响,还是会返回所有左表的数据,但和右表匹配数据时,系统只会拿左表符合条件(ON后的对左表过滤条件)的数据去和右表符合条件(ON后的对右表过滤条件)的数据进行匹配抓取数据,而不符合条件的左表数据还是会出现在结果列表中,只是对应的右表数据都是NULL。

    4>ON后的右表条件(单独对右表进行的筛选条件)会先对右表进行数据筛选后再和左表做连接查询,对结果行数有影响(当左表对右表是一对多时),但不会影响左表的显示行数,然后拿符合条件的右表数据去和符合条件的左表数据进行匹配。

    5>Where还是对连接后的数据进行过滤筛选,这个无异议。

    6>匹配数据时无论左右表,都是拿符合ON后的过滤条件去做数据匹配,不符合的会保留左表数据,用NULL填充右表数据。

    综上得出,ON后面对于左表的过滤条件,在最后结果行数中会被忽略,并不会先去过滤左表数据再连接查询,但是ON后的右表条件会先过滤右表数据再连接左表进行查询。

    连接查询时,都是用符合ON后的左右表的过滤条件的数据进行连接查询,只有符合左右表过滤条件的数据才能正确匹配,剩下的左表数据会正常出现在结果集中,但匹配的右表数据是NULL。因此对于左表的过滤条件切记要放到Where后,对于右表的过滤条件要看情况了。如果需要先过滤右表数据就把条件放到ON后面即可。

    7、on、where、having区别

    on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后。有时候如果这先后顺序不影响中间结果的话,那最终结果是相同的。但因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的。         

    根据上面的分析,可以知道where也应该比having快点的,因为它过滤数据后才进行sum,所以having是最慢的。但也不是说having没用,因为有时在步骤3还没出来都不知道那个记录才符合要求时,就要用having了。         

    在两个表联接时才用on的,所以在一个表的时候,就剩下where跟having比较了。在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where可以使用rushmore技术,而having就不能,在速度上后者要慢。

    如果要涉及到计算的字段,就表示在没计算之前,这个字段的值是不确定的,根据上篇写的工作流程,where的作用时间是在计算之前就完成的,而having就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。

    在多表联接查询时,on比where更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里

     

    展开全文
  • mysql多条件关联查询

    万次阅读 2018-01-17 14:44:19
    工作中遇到一些mysql问题,有的需要多条件多表查询等,现在整理出来。 问题(一)如下: 查询出今天办公室人员的订餐人员 qsyz_app_user用户表 userid role qsyz_shop_order订单表 user_id status date role...

    工作中遇到一些mysql问题,有的需要多条件多表查询等,现在整理出来。
    问题(一)如下:

    查询出今天办公室人员的订餐人员
    qsyz_app_user用户表
    userid role
    
    
    qsyz_shop_order订单表
    user_id status date
    
    
    role 为“办公室”
    status 为“支付成功”
    日期要求为今天

    实现语句

    select * from qsyz_app_user a,qsyz_shop_order b where a.userid=b.user_id and b.order_status='支付成功' and b.create_date='2017-12-25 16:05:05';
    
    按日期模糊查询出结果
    select a.nickname  from qsyz_app_user a,qsyz_shop_order b
    where a.userid=b.user_id 
    and a.role='办公室' 
    and b.order_status='支付成功' 
    and b.create_date like '%2017-12-25%';

    mysql like的写法

    like concat('%',#{param},'%')  或者 like '%${param}%' ,推荐使用前者,可以避免sql注入。

    这里写图片描述

    问题(二)如下:

    从版本表中按照手机类型,找出版本号最大的版本
    
    
    版本表
    mysql> select * from qsyz_app_version;
    +-----------+--------------+-------------+--------------+-------------+--------------+----------------------------------------------------+------------+
    | id        | version_name | version_num | version_size | create_time | version_text | down_url                                           | phone_type |
    +-----------+--------------+-------------+--------------+-------------+--------------+----------------------------------------------------+------------+
    | 440289813 | 1.1.2        |    20171205 |            0 | 2017-12-05  | 56           | http://192.168.1.101:8080/images/1.JPEG            | android    |
    | 440378169 | 1.1.2        |    20171109 |            0 | 2017-12-05  | 565          | http://192.168.1.101:8080/images/2.JPEG            | android    |
    | 749696543 | 1.1.0        |           1 |            0 | 2017-10-23  | ghkfadjghkl  | http://192.168.2.112:8080/images/app-debug.apk     | android    |
    | 750259190 | 21           |          23 |            0 | 2017-10-23  | 家居空间     | http://192.168.2.112:8080/images/ConstantUtil.java | android    |
    +-----------+--------------+-------------+--------------+-------------+--------------+----------------------------------------------------+------------+
    4 rows in set

    实现语句

    select * from qsyz_app_version where version_num=(select max(version_num)from qsyz_app_version WHERE phone_type='android
    ');

    这里写图片描述

    问题(三)如下:

    从订单详情表中查询出用户的订单详情,按照倒叙排列

    订单详情表:

    这里写图片描述

    实现语句

    SELECT * FROM qsyz_wallet_detail WHERE userId=#{userId} order by tradeDate DESC

    这里写图片描述

    问题(四)如下:

    情景:返回店铺的评论列表里,要求实现分页。
    因为店铺评论列表是个动态的,每时每刻都有可能有人在评论,所以如果安装页数返回的话有可能会使数据重复或数据漏掉。
    方法:传入一个评论id,下次查询的时候,查询这个id后面的十条数据(id要有序,不然很麻烦)

    例子
    这里写图片描述

    实现语句

    mysql> select id,name from user where id>'1' order by id asc limit 2;

    这里写图片描述

    展开全文
  • MySQL-查询关联

    2019-09-03 21:26:17
    关联 设计省信息的表结构provinces id ptitle 设计市信息的表结构citys id ctitle proid citys表的proid表示城市所属的省,对应着provinces表的id值 问题: 能不能将两个表合成一张表呢? 思考: 观察两张表发现,...
  • MySQL】多表联合查询、连接查询、子查询

    万次阅读 多人点赞 2020-09-07 20:17:15
    文章目录
  • 在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,总结一下mysql中的多表关联查询。 一、内连接查询 是指所有查询出的结果都是能...
  • mysql 一对多关联查询 练习

    千次阅读 2019-03-29 16:07:12
    场景:假设一个学生有多门课程,一门课程有多个学生(虽然两者是多对多关系,但本次假设为一对多)。 学生表: SET FOREIGN_KEY_CHECKS=0; ...-- ---------------------------- -- Table structure for `student` ...
  • MySQL中的关联查询

    2019-07-15 08:43:58
    MySQL中的关联查询 (1)Question:关联是什么 关联是SQL语言中使用SELECT操作表的一种操作机制,用来联系两个或者多个表。SELECT是SQL中的查询语句,用于查询数据库中的数据。在SELECT与关联结合,就产生了关联...
  • mysql关联查询语句

    千次阅读 2019-01-04 10:40:54
    今天和mysql相关死磕到底 Baby 我的眼里都是 心里都是全部都是你 哒哒哒哒哒哒 哒哒哒 一、前言 1.1关系表 理解关系表,以一个例子展开: 有一个包含产品目录的数据库表,其中每一类物品占一行。对于每一种...
  • MySQL多表关联查询

    万次阅读 2018-01-27 15:06:31
    SQL 连接(JOIN) 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。连接的结果可以在逻辑上看作是由SELECT语句指定的列组成的新表。左连接与右连接的左右指的是以两张表中的哪一张为基准,它们...
  • mysql联合查询(UNION)

    千次阅读 2018-12-26 17:26:48
    mysql联合查询(UNION) 下面我就直接po截图和代码 #联合查询 /* union 联合 合并:将多条查询语句的结果合并成一个结果 语法: 查询语句1 union 查询语句2 union ... 应用场景: 要查询的结果来自于多个...
  • MySQL联合查询,order by与LIMIT

    千次阅读 2015-03-23 23:32:58
    MySQL联合查询,order by与LIMIT
  • mysql关联查询查询优化

    千次阅读 2019-07-29 18:55:32
    mysql关联查询 参考:https://blog.csdn.net/lu0422/article/details/78892497 mysql查询慢的原因 记录慢查询日志 分析查询日志,不要直接打开慢查询日志进行分析,这样比较浪费时间和经历,可以使用pt-query-...
  • mysql关联查询原理

    千次阅读 2014-04-29 10:00:28
    select tbl1.col1,tbl2.col2 from tbl1 inner join tbl2 using(col3) where tbl1.col1 in(5,6);
  • mysql联合查询关联查询

    千次阅读 2017-11-14 23:53:44
    最近面试中,Java的都会考察数据库,写SQL语句,大多数就问关联查询,索引看看下面三个关联查询的 SQL 语句有何区别?SELECT * FROM score, student WHERE score.id = student.id ... SELECT * FROM score JOIN ...
  • 现在想一次性把跟ol_warehouse_product这张表有关联的数据查出来,出现重复数据,找了好久资料都没办法解决,最开始的时候有很多重复数据,通过group by之后现在就剩下两条了,但是数据库ol_warehouse_product表中...
  • Mysql 关联查询得where条件

    千次阅读 2015-12-24 21:44:17
    通常,关联查询时候,把where放在关联条件on之后。但是数据量比较大的时候,有时候性能很低。 如果可以把where放在内表里,尽量放在内表里,尤其是主表里,大数据量的时候可以提高很多查询时间。
  • mysql联合查询

    万次阅读 2017-05-27 16:05:04
    查询出来为两个表的乘积,一般不使用。 2、内连接INNER JOIN 在MySQL中把INNER JOIN叫做等值连接,即需要指定等值连接条件 3、外连接LEFT JOIN或RIGHT JOIN 分为左外连接和右连接,即除了返回符合连接条件的...
  • MySQL数据高级查询之连接查询、联合查询、子查询

    万次阅读 多人点赞 2017-02-04 15:17:16
    大圣网络 2017-01-31 09:19 ...连接查询 ...连接查询: 将多张表(>=2)进行记录的连接(按照某个指定的条件进行数据拼接)。...连接查询的意义: 在用户查看数据的时候,需要显示的数据...连接查询分类:SQL中将连接查询分成
1 2 3 4 5 ... 20
收藏数 251,729
精华内容 100,691
关键字:

mysql关联查询