MySQL数据库第九课--------join连接四件套------不错的哦哦哦

作者前言

欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com


目录

SQL查询语句

限定输出 limit

连接查询 join

内连接

左连接

右连接

外连接


插播小知识

!.我们在写group by分组时候,select后面写的字段只能是排序的字段

SQL****查询语句

限定输出****limit

在前面的几篇博客中小可爱应该发现了有些代码我是加了limit 10等一些代码,这样可以防止太多数据输出出来**,**

理论上,重复SQL查询语句,查询的结果(包括数据的顺序)都是一样的,所以才可以使用 limit限制数据条数,实现分页功能。一般limit更多用于数据的初步查询或者最值的查询。

select * from dept_emp_latest_date limit 10;
select * from dept_emp_latest_date limit 0,10;

可以看出这两个的效果是一样的 ( limit 开始的位置, 读取几条数据),limit 10 就是limit 0,10的简写, 如果我们想从第几条数据开始读取也可以写出了

还有一个效果,在排序后取第一个就可以找到最大值或者最小值

-- 取最大年龄的数据
select * from table_name order by age desc limit 1;
-- 取最小年龄的数据
select * from table_name order by age limit 1;

同理升序也是一样的

连接查询****join

当需要通过关联,在不同的表中获取不同的字段时,就需要连接查询。

在前面我们也讲了union的连接,union的连接是要字段数相同,并且拼接出来的表的字段数是不改变的,相当于是增加了多条数据,而join的拼接的表恰恰相反,就是会增加字段,给每一条数据再加数据

简单的说就是union就是纵向拼接,join就是横向拼接

sql 复制代码
select * from table1 (inner|left|right) join table2 on table1.column =
table2.column

我来简单的讲解一下,我们可以理解一下,select 字段名 from 表名 而 table1 join table2 no table1.column =table2.column 相当于一个表,只是我们没有给他们命名而已,

on相当于where,是在join里面的条件

内连接简单的说就是连接两个表相同的部分,不相同的部分就不要了,下面还有一张抽象一点的图

这个简单明了

代码如下:

sql 复制代码
select 
* 
from 
(select * from dept_emp  limit 10) as a
join 
(select * from employees limit 10) as b
on  a.`emp_no`= b.`emp_no`;

结果:

还有一个点就是当a表的同一个值有多个,b表的这个值也有多个就会像多对多的形式

一般我们使用join连接的时候一般会这样写

sql 复制代码
select 
a.`emp_no`,
a.`dept_no`,
a.`from_date`,
a.`to_date`,
b.`birth_date`,
b.`first_name`,
b.`last_name`,
b.`gender`,
b.`hire_date`
from 
(select * from dept_emp  limit 10) as a
join 
(select * from employees limit 10) as b
on  a.`emp_no`= b.`emp_no`;

这样可以简单明了的知道哪个字段来自哪个表,后面排除可以很快

小知识:

1.有相同字段要用表名作区分

2.在内连接可以取任意一张表的关联字段

进行三张表连接

sql 复制代码
select 
a.`emp_no`,
a.`dept_no`,
a.`from_date`,
a.`to_date`,
b.`birth_date`,
b.`first_name`,
b.`last_name`,
b.`gender`,
b.`hire_date`,
c.`dept_no`,
c.`dept_name`
from 
(select * from dept_emp  limit 10) as a
join 
(select * from employees limit 10) as b
on  a.`emp_no`= b.`emp_no`
join
departments as c 
on  a.`dept_no`= c.`dept_no`;     

右连接

right join :以右表为主表,在保证右表数据的前提下,关联左表数据,没有数据的位置用 null 补充。即 使左表中没有匹配,也从右表返回所有的数据

sql 复制代码
select 
a.`emp_no`,
a.`dept_no`,
a.`from_date`,
a.`to_date`,
b.`birth_date`,
b.`first_name`,
b.`last_name`,
b.`gender`,
b.`hire_date`
from 
(select * from dept_emp  limit 10) as a
right join 
(select * from employees limit 20) as b
on  a.`emp_no`= b.`emp_no`;

这次我的右连接写法是有误的,应该把a.`emp_no`,换成b.`emp_no`,

但为了让大家更好的和下面作对比

左连接

left join :以左表为主表,在保证左表数据的前提下,关联右表数据,没有数据的位置用 null 补充。即使 右表中没有匹配,也从左表返回所有的数据

sql 复制代码
select 
a.`emp_no`,
a.`dept_no`,
a.`from_date`,
a.`to_date`,
b.`birth_date`,
b.`first_name`,
b.`last_name`,
b.`gender`,
b.`hire_date`
from 
(select * from dept_emp  limit 20) as a
left join 
(select * from employees limit 10) as b
on  a.`emp_no`= b.`emp_no`;

从上面左右连接的截图看到如果我们以哪个表为主体就写哪个的字段,不要乱写,会造成数据的无法区分,

可能有一些小可爱也会有一些小错误,会把一些条件写在where里面就会造成意想不到的结果

sql 复制代码
select 
b.`emp_no`,
a.`dept_no`,
a.`from_date`,
a.`to_date`,
b.`birth_date`,
b.`first_name`,
b.`last_name`,
b.`gender`,
b.`hire_date`
from 
(select * from dept_emp  limit 10) as a
right join 
(select * from employees limit 20) as b
on  a.`emp_no`= b.`emp_no` 
where   a.`emp_no` > 10005;

可以看出差别很大,所以我们使用join 连接的时候写条件一般都是要写在on那里

外连接

outer join:将两张表关联,没有数据的位置用null补充。只要其中一个表中存在匹配,则返回数据

外连接在一些数据库并不兼容,但是我们可以利用别的方法来获取和外连接一样的效果

外连接就是相同部分加两表不同部分

select 
a.`emp_no`,
a.`dept_no`,
a.`from_date`,
a.`to_date`,
b.`birth_date`,
b.`first_name`,
b.`last_name`,
b.`gender`,
b.`hire_date`
from 
(select * from dept_emp  limit 20) as a
left join 
(select * from employees limit 10) as b
on  a.`emp_no`= b.`emp_no`
union 
select 
b.`emp_no`,
a.`dept_no`,
a.`from_date`,
a.`to_date`,
b.`birth_date`,
b.`first_name`,
b.`last_name`,
b.`gender`,
b.`hire_date`
from 
(select * from dept_emp  limit 10) as a
right join 
(select * from employees limit 20) as b
on  a.`emp_no`= b.`emp_no`;

总结:

这里主要介绍了MySQL数据库的join的连接,有不懂的可以来私聊

相关推荐
PGCCC17 分钟前
【PGCCC】Postgresql 存储设计
数据库·postgresql
PcVue China2 小时前
PcVue + SQL Grid : 释放数据的无限潜力
大数据·服务器·数据库·sql·科技·安全·oracle
魔道不误砍柴功4 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
锐策4 小时前
〔 MySQL 〕数据库基础
数据库·mysql
远歌已逝5 小时前
管理Oracle实例(二)
数据库·oracle
日月星宿~5 小时前
【MySQL】summary
数据库·mysql
爱吃土豆的程序员5 小时前
在oracle官网下载资源显示400 Bad Request Request Header Or Cookie Too Large 解决办法
java·数据库·oracle·cookie
睿思达DBA_WGX6 小时前
Oracle 11g rac 集群节点的修复过程
数据库·oracle
尘浮生6 小时前
Java项目实战II基于微信小程序的移动学习平台的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·学习·微信小程序·小程序
希忘auto6 小时前
详解MySQL安装
java·mysql