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_class.id;

过程是,先执行 from 子句,需要连接join

两个特殊的地方:

join,连接

on,连接条件

join连接:

除了默认的连接外,有其他形式的连接方式:

内连接

外连接,左外连接,右外连接,[全外连接,也是外连接,但不是mysql所支持的]

交叉连接

自然连接

  • 内连接:inner join

记录与真实的记录连接,称之为内连接!(两条真实存在的记录的连接)

mysql默认的连接就是 inner join

select stu_name,gender,class_id,class_name from select_student join select_class on 
select_student.class_id=select_class.id;
select stu_name,gender,class_id,class_name from select_student inner join select_class 
on select_student.class_id=select_class.id;

上面两条语法执行结果完成一样!

内连接可以省略条件:

on可以省略:相当于连接条件永远成立!返回值是一个笛卡尔积!

  • 外连接:left join , right join

分为:左外连接,右外连接!

连接的记录可能是一方不存在的!(两条记录中,可能某条不存在)

注意左外与右外的区别:

区别在于,哪个表的记录(指的是连接失败的记录),会最终出现在连接结果内!

什么是左表和右表? join关键字前面的(左边的)左表,join关键字后边的(右边的)右表!

左外:如果出现左表记录连接不上右表记录的,左表记录会出现在最终的连接结果内!而右表记录相应设置成NULL

右外:如果出现右表记录连接不上左表记录的,右表记录会出现在最终的连接结果内!而左表记录相应设置成NULL

因此,可以交换表的位置,达到使用 left 与 right 混用的目的!

问题:

统计每个班级内,学生的数量!,在班级列表内:班级名,教室号,学生数量

总结:内连接,外连接差别不大,只是外连接会将没有连接成功的记录,也出现最终的连接的结果内,而内连接,连接结果只有连接成功的(两条记录都存在的)

  • 交叉连接:cross join

结果与内连接一致!有时,在获得笛卡尔积时,显示的使用交叉连接

交叉连接相当于没有条件的内连接!

  • 自然连接:natural join

mysql自动判断连接条件,帮助我们完成连接!

典型的条件就是表中的同名字段!

而自然连接也分内连接与外连接

自然内连接: natural join

自然左外:natural letf join

自然右外:natural right join

总结:

最终的效果只有:内,左外,右外!

交叉,特殊的内

自然,相当于自动判断连接条件,完成内,左外,右外!

时间: 2024-12-25 21:39:00

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连接查询,封装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:连接查询

每个实体,一个表 当一个业务需要多个实体的数据,显然需要多张表在一起使用,即将多张表的记录连接起来. 1. 总体思路: 先将所有数据按照某种条件,连接起来,再进行筛选处理. 2. 分类方式: 根据连接的条件不同,分为一下几类: ① 内连接(Inner):要求连接的多个数据都必须存在,才能进行连接. [举个栗子]如下三张表,分别记录了老师的信息,班级信息,以及老师们的代课情况. 此时,若想获得所有老师的代课信息,'韩信'在表3中有与之配对的记录(内连接) 但发现孙武没有带过课,即表1中的'孙武'在

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