MySQL:连接查询

每个实体,一个表

当一个业务需要多个实体的数据,显然需要多张表在一起使用,即将多张表的记录连接起来。

1. 总体思路:

先将所有数据按照某种条件,连接起来,再进行筛选处理。

2. 分类方式:

根据连接的条件不同,分为一下几类:

① 内连接(Inner):要求连接的多个数据都必须存在,才能进行连接。

【举个栗子】如下三张表,分别记录了老师的信息,班级信息,以及老师们的代课情况。

此时,若想获得所有老师的代课信息,‘韩信’在表3中有与之配对的记录(内连接)

但发现孙武没有带过课,即表1中的‘孙武’在表3中没有与之配对的记录(外连接)。

       

表1. 所有老师的信息                            表2. 所有班级的信息

表3. 老师们的代课情况

【语法】tbl_left inner join tbl_right on 连接条件;

【举个栗子】求表1中的所有老师的开始代课时间、代课天数。

tip : 内连接可以省略连接条件,意味着所有左表的数据都要与右表的记录做一次连接(交叉连接or笛卡尔积连接)。

此时可以使用cross join代替inner join。

实际上,可以使用多表查询的方式,不实用where,做到笛卡尔积。

在MySQL中,inner join是默认的连接方式,可以省略inner。

【写法】1) on(写法如上一个例子)。

2) where(只需把on替换成where即可)。

结果一样,但是逻辑关系不同:where会先形成包含所有连接的笛卡尔积,再在这些数据中进行过滤;

on 会先进行满足条件的数据过滤,在对过滤后的数据进行连接。

【using】当有同名字段时,可以使用 using (字段名),进行条件约束。

【as】给表、字段起别名,可以把比较长的表名改成比较短的别名,保证简洁、清晰。

② 外连接(outer):负责连接的数据有一个或多个不存在

【语法】tbl_name left outer join tbl_name on 连接条件;(也可以使用using,不使用where!!)

tip : 必须要有连接条件!!(内连接没有条件=笛卡尔积,但是外连接必须有)

1) 左外连接;(left outer join)

左连接时,若左表的数据连接不到右表的情况,则左表的数据在最终结果中被保留

(如上图,左表中的‘孙武’没有连接到右表的数据,但是‘孙武’在最终数据中保留了下来);

若右表数据连接不到左表,则最终结果中,右表数据被丢弃(如下图,交换两表的左右顺序,发现右表的‘孙武’被丢弃)。

2) 右外连接;

3) 全外连接(MySQL不支持);

(左连接)union(右连接);

③ 自然连接(natural):通过 MySQL 自己的判断完成连接过程,无需指明连接条件。

MySQL 使用多表内相同的字段,作为连接条件。

【语法】 (表1) natural join (表2);  ----内

natural left join ----- 左外

natural right join --- 右外

3. 多表连接

时间: 2024-10-13 05:02:51

MySQL:连接查询的相关文章

mysql连接查询经典小例题

mysql连接查询: Mysql连接查询支持多表连接 对同一张表可以重复连接多次(别名在多次连接同一张表时很重要) 例题1: 下面有2张表 teams表 比赛结果表:result 问题: 得出一张表: 主队,客队,比赛成绩,比赛时间 方法一:(子查询和连接查询混合) step1: select result.id, t_name as h_name,match_time,result from teams join result on teams.t_id=result.h_id step2:

Mysql连接查询介绍

场景: 从下表中得到一个学生列表.要求是,展示:学生,性别,班级名字 此查询需要不单从学生表获取数据,还需要从班级表获取数据,此时就需要: 连接查询:join     连接:多个表记录之间的连接~! 语法: from 表名1 join 表名2 on 连接条件 select stu_name,gender,class_id,class_name from select_student join select_class  on select_student.class_id=select_clas

mysql连接查询,封装mysql函数

连接查询 交叉连接语法: select  * | 字段列表 from 表1  cross join 表2 内连接: select *|字段列表 from 左表 inner join 右表 on 左表.字段 = 右表.字段; (inner可以省略) 左外连接(左连接)   select *|字段列表 from 左表 left outer join 右表 on 左表.字段 = 右表.字段; (outer可以省略) 右外连接(右连接) select *|字段列表 from 右表 left outer

mysql连接查询和子查询

一.连接查询 1.交叉连接 就是从一张表的一条记录去连接另一张表中的所有记录,并且保存所有的记录,其中包括两个表的所有的字段! 从结果上看,就是对两张表做笛卡尔积! 笛卡尔积也就是两个表中所有可能的连接结果!如果第一张表有n1条记录,第二张表有n2条记录,那么笛卡尔积的结果有n1*n2条记录! 交叉连接语法: select  * | 字段列表 from 表1  cross join 表2 2.内连接 数据在左表中存在,同时在右表中又有对应的匹配的结果才会被保存.匹配得到才显示.如果没有匹配上,我

mysql连接查询,子查询,联合查询

一.连接查询(多表查询) emp表 dept表 1.交叉连接 实际上,交叉连接是将两个表不设定任何条件的连接结果. 交叉连接通常也被叫做"笛卡尔积"--数学上可能比较多. 语法: from  表1  [cross]  join  表2  ; //可见交叉连接只是没有on条件而已. cross这个词也可以省略,还可以使用inner这个词代替 2.内连接: 语法: from  表1  [inner]  join  表2  on  表1.字段1=表2.字段2: 含义:找出(过滤)在交叉连接的

mysql连接查询

一:新建两张表 student表 CREATE TABLE student( idINT PRIMARY KEY AUTO_INCREMENT, snameVARCHAR(20) NOT NULL ); SELECT * FROM student; INSERT INTO student VALUES (1,'张三'),(2,'李四'),(3,'王五'); course表 CREATE TABLE course( idINT PRIMARY KEY, cnameVARCHAR(20) NOT N

MySQL连接查询流程源码分析

初始化 main |-mysqld |-my_init // 初始话线程变量,互斥量 |-load_defaults // 获取配置 |-init_common_variables // 初始化变量 |-init_server_components // 初始化插件 | |-plugin_init | | |-plugin_initialize | |-initialize_storage_engine |-network_init // 监听网络 |-grant_init |-servers_

MySQL 连接查询 学习笔记

#交叉连接(返回笛卡尔交集)AXB={(a,b)|a属于A且b属于B },则AXB所形成的集合就叫笛卡尔集 1 SELECT * from employees cross join depts; 2 SELECT * from employees,depts; #内连接(只返回满足连接条件的记录,不返回不满足连接条件的记录) 1 select * from employees t1 INNER join depts t2 2 on t1.dept_id = t2.dept_id; #右外连接(不

MySQL连接查询(多表查询)

基本含义 连接就是指两个或两个以上的表(数据源) "连接起来成为一个数据源". 连接语法的基本形式:from 表1 [连接方式] join 表2 [on 连接条件]; 连接的结果可以当做一个"表"来使用. 1.内连接: 语法:from 表1 [inner] join 表2 on 表1.字段1=表2.字段2: 含义:找出(过滤)在交叉连接的结果表中的表1的字段1的值等于表2的字段2的值的那些行. 例如:以下是两个相关的表格product_type 和 product