前言: 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,
前言:
多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。
前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联。
从多个表中获取数据:
案例:查询员工的姓名及其部门名称
SELECT last_name, department_name
FROM employees, departments;
查询结果:
分析错误情况:
我们把上述多表查询中出现的问题称为:笛卡尔积的错误。
3、案例分析与问题解决
笛卡尔积的错误会在下面条件下产生:
为了避免笛卡尔积, 可以在 WHERE
加入有效的连接条件。
加入连接条件后,查询语法:
正常写法:
拓展1:多个连接条件与 AND 操作符
拓展2:区分重复的列名
拓展3:表的别名
使用别名可以简化查询。
阿里开发规范:
【强制】对于数据库中表记录的查询和变更,只要涉及多个表,都需要在列名前加表的别名(或 表名)进行限定。
说明:对多表进行查询记录、更新记录、删除记录时,如果对操作列没有限定表的别名(或表名),并且操作列在多个表中存在时,就会抛异常。
正例:select t1.name from table_first as t1 , table_second as t2 where t1.id=t2.id;
反例:在某业务中,由于多表关联查询语句没有加表的别名(或表名)的限制,正常运行两年后,最近在 某个表中增加一个同名字段,在预发布环境做数据库变更后,线上查询语句出现出 1052 异常:Column 'name' in field list is ambiguous
拓展4:连接多个表
总结:连接 n个表,至少需要n-1个连接条件。比如,连接三个表,至少需要两个连接条件。
当table1
和table2
本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询。
题目:查询employees表,返回“Xxx works for Xxx”
内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
2.外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。
3.如果是左外连接,则连接条件中左边的表也称为主表,右边的表称为从表。
4.如果是右外连接,则连接条件中右边的表也称为主表,左边的表称为从表。
SQL92:使用(+)创建连接(了解即可)。
三、SQL99语法实现多表查询
它的嵌套逻辑类似我们使用的 FOR 循环:
SQL99 采用的这种嵌套结构非常清爽、层次性更强、可读性更强,即使再多的表进行连接也都清晰可见。如果你采用 SQL92,可读性就会大打折扣。
题目1:
语法:
语法:
需要注意的是,LEFT JOIN 和 RIGHT JOIN 只存在于 SQL99 及以后的标准中,在 SQL92 中不存在,只能用 (+) 表示。
3.3 满外连接(FULL OUTER JOIN)
满外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据。
SQL99是支持满外连接的。使用FULL JOIN 或 FULL OUTER JOIN来实现。
需要注意的是,mysql不支持FULL JOIN,但是可以用 LEFT JOIN UNION RIGHT join代替。
来源地址:https://blog.csdn.net/Java_lookmi/article/details/131547981
--结束END--
本文标题: MYSQL多表连查
本文链接: https://lsjlt.com/news/431450.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0