MySql会用到联表查询,对于刚学习的新手来说,可能会理解起来有难度。下面这篇文章就来给大家详细介绍MySQL联表查询的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧

关系型数据库,免不了表之间存在各种引用与关联。这些关联是通过主键与外键搭配来形成的。所以,取数据时,很大情况下单张表无法满足需求,额外的数据则需要将其他表加入到查询中来,这便是 JOIN 关键字完成的操作。 MySQL 中 JOIN, CROSS JOIN 和 INNER JOIN 三者语法功能上相同,可互换,而 SQL 标准中,INNER JOIN 需要搭配 ON 语句。

多表联合查询时,可省略 JOIN 关键字,以逗号分隔多张表,此时默认会当作 INNER JOIN 来处理。比如, SELECT table1.*,

table2.*

FROM table1,

table2;

等效于: SELECT table1.*,

table2.*

FROM table1

INNER JOIN table2; 但这种通过逗号隐式指定的联表形式其优先级要低于直接通过关键字(INNER JOIN, CROSS JOIN, LEFT JOIN)指定的形式。所以 t1, t2 JOIN t3 会被解析成 (t1, (t2 JOIN t3)) 而不是 ((t1, t2) JOIN t3)

需要注意的是,当逗号形式与其他联表关键词结合时,在指定了联表条件,比如通过 ON 条件时,会报错。 ON 指定的联表条件其语法同 WHERE,所有后者可接受的表达式都可用于 ON。两者看起来功能上雷同,ON 一般用于指定联表条件,即表之间怎么被联合,而 WHERE 则用于过滤结果。 LEFT JOIN 时,右边表中不满足 ON 或 USING 指定的条件时,会在结果中以 NULL 呈现。 SELECT left_tbl.*

FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id

WHERE right_tbl.id IS NULL;

通过此方法可方便地过滤出右边表中不符合条件的记录。 联表查询时可为每张参与进来的表指定别名,方便在其他表达式中引用。两种方式,一个是通过 AS 关键字 tbl_name AS alias_name,另一种是直接在表名后面跟上别名,tbl_name alias_name。 SELECT t1.name, t2.salary

FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;

SELECT t1.name, t2.salary

FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name; 一条查询语句中的子查询必需取一个别名,这样才能在其他表达式中引用。 SELECT * FROM (SELECT 1, 2, 3) AS t1; USING(join_column_list) 语句指定两个表中均包含的列,查询时只针对这里指定的列进行比较。 a LEFT JOIN b USING (c1, c2, c3) NATURAL [LEFT] JOIN 与 INNER JOIN 和 LEFT JOIN 配合使用了 USING 指定表中所有列的情况等效。 RIGHT JOIN 与 LEFT JOIN 类似,只是最终结果是依据右边表,将左边表中不符合的在结果中以 NULL 呈现。为了方便在不同数据库间迁移,推荐始终使用 LEFT JOIN。

一些 JOIN 示例: SELECT * FROM table1, table2;

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

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

SELECT * FROM table1 LEFT JOIN table2 USING (id);

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id

LEFT JOIN table3 ON table2.id = table3.id; NATURAL JOIN 的结果中不会有重复的列。因为其与 USING 雷同,所以 USING 时也没有复杂的列。

考察下面的示例: CREATE TABLE t1 (i INT, j INT);

CREATE TABLE t2 (k INT, j INT);

INSERT INTO t1 VALUES(1, 1);

INSERT INTO t2 VALUES(1, 1);

SELECT * FROM t1 NATURAL JOIN t2;

SELECT * FROM t1 JOIN t2 USING (j);

查询结果:

+------+------+------+

| j | i | k |

+------+------+------+

| 1 | 1 | 1 |

+------+------+------+

+------+------+------+

| j | i | k |

+------+------+------+

| 1 | 1 | 1 |

+------+------+------+

结果中同名的列只出现一次,且都是值相同的那些记录。

通过向两表中插入一条新记录,令它们的 j 不相同,再进行测试。 mysql> INSERT INTO t1 VALUES(2, 2);

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO t2 VALUES(2, 3);

Query OK, 1 row affected (0.00 sec)

mysql> select * from t1 natural join t2;

+------+------+------+

| j | i | k |

+------+------+------+

| 2 | 2 | 1 |

+------+------+------+

1 row in set (0.00 sec) USING 和 ON 作为条件时其他限制的联合条件是一样的,可互相转换。但在 SELECT * 返回结果时,还是有差异的。前者只在 USING 中指定的列中返回合并后的结果,后者则针对的是表中所有列。 a LEFT JOIN b USING (c1, c2, c3)

a LEFT JOIN b ON a.c1 = b.c1 AND a.c2 = b.c2 AND a.c3 = b.c3

USING 情况下的返回: COALESCE(a.c1, b.c1), COALESCE(a.c2, b.c2), COALESCE(a.c3, b.c3)

ON 的返回:

a.c1, a.c2, a.c3, b.c1, b.c2, b.c3

ON 语句中只能引用其操作表(operands)中的表。 CREATE TABLE t1 (i1 INT);

CREATE TABLE t2 (i2 INT);

CREATE TABLE t3 (i3 INT);

针对上面的表,以下查询会报错: mysql> SELECT * FROM t1 JOIN t2 ON (i1 = i3) JOIN t3;

ERROR 1054 (42S22): Unknown column 'i3' in 'on clause'

而以下查询则可以: mysql> SELECT * FROM t1 JOIN t2 JOIN t3 ON (i1 = i3);

Empty set (0.00 sec)

因为此时 t3 在 ON 语句的操作范围内了。

相关资源 MySQL 8.0 Reference Manual - 13.2.10.2 JOIN Syntax MySQL 8.0 Reference Manual - 13.2.10.3 UNION Syntax

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对聚米学院的支持。

mysql带账号联查表_MySQL联表查询的简单示例相关推荐

  1. mysql数据库select语句用法_mysql数据库select查询语句简单用法

    mysql select简单用法 1.select语句可以用回车分隔$sql="select * from article where id=1"和$sql="selec ...

  2. mysql left join 查询_MySQL联表查询基本操作之left-join常见的坑

    概述 对于中小体量的项目而言,联表查询是再常见不过的操作了,尤其是在做报表的时候.然而校对数据的时候,您发现坑了吗?本篇文章就 mysql 常用联表查询复现常见的坑. 基础环境 建表语句 DROP T ...

  3. mysql 伪表查询语句_mysql联表批处理操作

    1 概述 mysql中的单表增删改查操作,可以说是基本中的基本. 实际工作中,常常会遇到一些基本用法难以处理的数据操作,譬如遇到主从表甚至多级关联表的情况(如一些历史问题数据的批量处理),考虑到效率问 ...

  4. mysql左驱动表_MySQL多表联表查询驱动表选择

    联表查询做开发的小伙伴会经常使用,但是可以大家都比较少去深入了解MySQL是怎么执行多表联表查询的,比如怎么选择驱动表(第一个被处理的表),是先联表还是说先根据where条件(前提是有where条件) ...

  5. mysql 用户管理表_Mysql—用户表详解(mysql.user)

    MySQL 数据库 Mysql-用户表详解(mysql.user) MySQL是一个多用户管理的数据库,可以为不同用户分配不同的权限,分为root用户和普通用户,root用户为超级管理员,拥有所有权限 ...

  6. mysql list转表_mysql系统表【转】

    MySQL5.7 默认的模式有:information_schema, 具有 61个表: mysqL, 具有31个表: performance_schema,具有87个表; sys, 具有1个表, 1 ...

  7. mysql分表_mysql分表详解

    经常听到有人说"数据表太大了,需要分表","xxxx了,要分表"的言论,那么,到底为什么要分表? 难道数据量大就要分表? mysql数据量对索引的影响 本人my ...

  8. mysql锁表_MYSQL锁表问题的解决方法

    本文实例讲述了MYSQL锁表问题的解决方法.分享给大家供大家参考,具体如下: 很多时候!一不小心就锁表!这里讲解决锁表终极方法! 案例一 mysql>show processlist; 参看sq ...

  9. mysql是自动表锁定吗_MySQL数据库表怎么锁定

    如果你同时运行表的检查/修复程序时,你或许不想让MySQL服务器和实用程序同时访问一个表.如果两个程序都向表中写数据显然会造成很大的麻烦,甚至会有意外情况发生.如果表正由一个程序写入,同时进行读取的另 ...

最新文章

  1. Sizeof与Strlen的区别与联系(转)
  2. 数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
  3. 前滴滴出行产品经理刘飞:写给产品经理的说明书(下)
  4. 20201014 《计算感知》第2节课 笔记
  5. 除了专业的代码书籍,这8本书,或许对你也有用!
  6. 电机的入门之路系列4--PWM控制直流电机
  7. STM32工作笔记0072---UCOSIII在STM32F103上的移植
  8. SAP License:最近收到的信(审计人员关于成本问题的请教)
  9. 避免jQuery名字冲突--noConflict()方法
  10. 记一次复杂的正则匹配——匹配但不包含
  11. 分享两款在线教育教学管理系统源码
  12. android汉字转拼音
  13. win11系统安装vmware虚拟机win10 汇总
  14. Window10 C盘清理经验
  15. 第二模块 商务电子邮件写作技巧
  16. Python概念-Item系列(林海峰教的)
  17. 文件拒绝访问且无法显示当前所有者
  18. Tableau:树状图
  19. 华三交换机怎么样?H3C交换机产品系列介绍!
  20. PHP开发api接口安全验证

热门文章

  1. JavaScript 引擎和 Just-in-Time 编译概念,Hot Function 的简单介绍
  2. SAP ABAP SM50事务码和Hybris Commerce的线程管理器
  3. SAP CRM中间件下载出错的错误排查
  4. D3 dataset - what is usage of key function in data
  5. how does UI Framework get url of detail page - _router
  6. CRM呼叫中心里interaction record的设计逻辑
  7. 给特殊类型的Note设置default值
  8. why the SalesOrder header note is read only
  9. IBASE read buffer
  10. 关于SAP Commerce product API对description字段的处理