Mysql链接查询
连接查询--交叉连接
将两张表的数据与另外一张表彼此交叉
原理:
1. 从第一张表一次取出每一条记录
2. 取出每一条记录之后,与另外一张表的全部记录挨个匹配
3. 没有任何匹配条件,所有的结果都会进行保留
4. 记录数 = 第一张表记录数 * 第二张表记录数; 字段数 = 第一张表字段数 + 第二张表字段数 (笛卡尔积)
语法: 表1 cross join 表2
交叉连接:
eg:select * from my_student cross join my_int;
应用:结果是笛卡尔积,没什么实际应用 其实和 from 表1,表2;产生结果一样
连接查询:将多张表连到一起进行查询(会导致记录数行和字段数列都会发生改变)
连接查询的意义:在关系型数据库设计过程中,实体(表)与实体之间是存在很多联系的,在关系型数据库表的设计过程中,遵循着关系来设计:一对一,
一对多和多对多,通常在实际操作的过程中,需要利用这层关系来保证数据的完整性
连接查询一共有一下几类:
1. 交叉连接:
2. 内连接: inner join,从一张表中取出所有的记录去另外一张表中匹配,利用匹配条件进行匹配,成功了则保留,失败了放弃
原理:
1.从第一张表中取出一条记录,然后去另外一张表中进行匹配
2.利用匹配条件进行匹配
2.1:匹配到:保留,继续向下匹配
2.2:匹配失败:向下匹配,如果全表匹配失败,结束
语法: 表1 [inner] join 表2 on 匹配条件;
1. 如果内连接没有条件,那么其实就是交叉连接(笛卡尔积 避免出现)
2. 使用匹配条件进行匹配
eg:--查询出来学生对应的班级信息 两张表 my_student,my_class
mysql> select * from my_student inner join my_class on class_id=id;
+---------+----------+----------+---------+------------+--------+----+------+
| stu_id | stu_name | class_id | stu_age | stu_height | gender | id | name |
+---------+----------+----------+---------+------------+--------+----+------+
| stu0001 | 夏洛 | 1 | 18 | 185 | 男 | 1 | 1班 |
| stu0002 | 张四 | 1 | 28 | 165 | 女 | 1 | 1班 |
| stu0003 | 张五 | 2 | 22 | 187 | 男 | 2 | 2班 |
| stu0004 | 小婷 | 2 | 25 | 189 | 女 | 2 | 2班 |
| stu0005 | 小猪 | 1 | 30 | 173 | 女 | 1 | 1班 |
| stu0006 | 小狗 | 2 | 18 | 170 | 男 | 2 | 2班 |
| stu0007 | 小江 | 1 | 25 | 178 | 女 | 1 | 1班 |
+---------+----------+----------+---------+------------+--------+----+------+
3. 因为表的设计通常容易产生同名字段,尤其是ID,所以为了避免崇明出现错误,通常使用表名.字段名
mysql> select * from my_student inner join my_class on my_student.class_id=my_class.id;
4. 通常如果条件中使用到对应的表名,而表名通常比较长则使用表别名简化
mysql> select * from my_student as s inner join my_class c on s.class_id=c.id;
5. 内连接匹配的时候,必须保证匹配到才会保存(显示)
6. 内连接因为不强制必须使用匹配条件(on)因此可以在数据匹配完成之后,使用where条件来限制,效果和on一样,推荐用on
应用:内连接通常是在对数据有精确要求的地方使用,必须保证两张表中都能进行数据匹配
3. 外连接: outer join,按照某一张表作为主表(表中所有记录在最后都会保留),根据条件去连接另外一张表,从而得到目标数据
1. (左[外]连接):left join 左表是主表
原理:
1. 确定连接主表:左连接就是left join左边的表为主表:right join 就是右边为主表
2. 拿主表的每一条记录,去匹配另外一张表(从表)的每一条记录
3. 如果满足匹配条件:保留,不满足不保留
4. 入股哦主表记录在从表中一条记录都没有匹配成功,那么也要保留该记录:从表对应的字段值都为NULL
语法:
左连接:主表 left join 从表 on 连接条件;
右连接:从表 right join 主表 on 连接条件;
mysql> select * from my_student as s left join my_class c on s.class_id=c.id;
+---------+----------+----------+---------+------------+--------+------+------+
| stu_id | stu_name | class_id | stu_age | stu_height | gender | id | name |
+---------+----------+----------+---------+------------+--------+------+------+
| stu0001 | 夏洛 | 1 | 18 | 185 | 男 | 1 | 1班 |
| stu0002 | 张四 | 1 | 28 | 165 | 女 | 1 | 1班 |
| stu0003 | 张五 | 2 | 22 | 187 | 男 | 2 | 2班 |
| stu0004 | 小婷 | 2 | 25 | 189 | 女 | 2 | 2班 |
| stu0005 | 小猪 | 1 | 30 | 173 | 女 | 1 | 1班 |
| stu0006 | 小狗 | 2 | 18 | 170 | 男 | 2 | 2班 |
| stu0007 | 小江 | 1 | 25 | 178 | 女 | 1 | 1班 |
+---------+----------+----------+---------+------------+--------+------+------+
左连接对应的主表数据在左边,右连接对应的主表数据在右边
mysql> select * from my_student as s right join my_class as c on s.class_id=c.id;
+---------+----------+----------+---------+------------+--------+----+------+
| stu_id | stu_name | class_id | stu_age | stu_height | gender | id | name |
+---------+----------+----------+---------+------------+--------+----+------+
| stu0001 | 夏洛 | 1 | 18 | 185 | 男 | 1 | 1班 |
| stu0002 | 张四 | 1 | 28 | 165 | 女 | 1 | 1班 |
| stu0003 | 张五 | 2 | 22 | 187 | 男 | 2 | 2班 |
| stu0004 | 小婷 | 2 | 25 | 189 | 女 | 2 | 2班 |
| stu0005 | 小猪 | 1 | 30 | 173 | 女 | 1 | 1班 |
| stu0006 | 小狗 | 2 | 18 | 170 | 男 | 2 | 2班 |
| stu0007 | 小江 | 1 | 25 | 178 | 女 | 1 | 1班 |
| NULL | NULL | NULL | NULL | NULL | NULL | 3 | 3班 |
+---------+----------+----------+---------+------------+--------+----+------+
右表是主表,主表记录一定保存,从表没有数据匹配就是NULL
特点:
1. 外连接中主表数据记录一定会保存,连接之后不会出现记录数少于主表(内连接可能)
2. 左连接和右连接可以互相转换,但是数据对应的位置会改变
mysql> select * from my_student as s right join my_class as c on s.class_id=c.id;
mysql> select * from my_class as c left join my_student as s on s.class_id=c.id;
应用:
非常常用,作为数据获取对应主表以及其他数据(关联)
Using关键字
是在连接查询中用来代替对应的on关键字,进行条件匹配的
原理:
1. 在连接查询是,使用on的地方用using代替
2. 使用using的前提是对应的两张表连接的字段是同名的(类似自然连接的自动匹配)
3. 如果使用using关键字,那么对应的同名字段,最终在结果中只会保留一个
基本语法: 表1 [inner,left,right] join 表2 using(同名字段列表);//连接字段
-- using关键字
select * from my_student left join my_class on my_student.class_id=my_class.class_id;
select * from my_student left join my_class using(class_id);
Mysql链接查询的更多相关文章
- mysql数据库优化课程---12、mysql嵌套和链接查询
mysql数据库优化课程---12.mysql嵌套和链接查询 一.总结 一句话总结:查询user表中存在的所有班级的信息? in distinct mysql> select * from cl ...
- MYSQL 查询方法 统计查询 链接查询 子查询
mysql表格查询方法: 查询: 1.简单查询 select * from Info --查所有数据select Code,Name from Info --查指定列的数据select Code as ...
- mysql 处理查询请求过程
需要搞清楚查询为什么会慢,就要搞清楚mysql处理查询请求的过程: 1.客户端发送SQL请求给服务器 2.服务器检查是否可以在查询缓存中命中该SQL 查询缓存对SQL性能的影响. 1.需要对缓存加 ...
- 开启Mysql慢查询来优化mysql
开启Mysql慢查询来优化mysql 优化sql语句是优化数据库的一个很重要的方面,那么怎么发现那些耗时耗资源的sql语句呢,开启Mysql慢查询! 1.查看是否开启慢查询,默认情况下是关闭的.你的m ...
- MySQL 慢查询日志总结
慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志 ...
- 如何在MySQL中查询每个分组的前几名【转】
问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等. 在orcale等数据库中可以使用partition语句来解决,但在mysql中就比较麻烦了.这次翻译的文章就是专门 ...
- MySQL慢查询日志总结 日志分析工具mysqldumpslow
MySQL慢查询日志总结 - 潇湘隐者 - 博客园 https://www.cnblogs.com/kerrycode/p/5593204.html 2016-06-17 10:32 by 潇湘隐者, ...
- mysql 连接查询 join
本文用到的表 CREATE TABLE `cls` ( `cls_id` ) NOT NULL AUTO_INCREMENT, `name` ) NOT NULL, PRIMARY KEY (`cls ...
- (转)MySQL慢查询日志总结
慢查询日志概念 原文:http://www.cnblogs.com/kerrycode/p/5593204.html MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应 ...
随机推荐
- PyTorch大更新!谷歌出手帮助开发,正式支持TensorBoard | 附5大开源项目
大家又少了一个用TensorFlow的理由. 在一年一度的开发者大会F8上,Facebook放出PyTorch的1.1版本,直指TensorFlow"腹地". 不仅宣布支持Tens ...
- .NET 5.0 Preview 2发布
2020年4月2日微软.NET 团队的项目经理 Richard 在博客上 发布了.NET 5 Preview 2:https://devblogs.microsoft.com/dotnet/annou ...
- Sql Server数据库性能优化之索引
最近在做SQL Server数据库性能优化,因此复习下一索引.视图.存储过程等知识点.本篇为索引篇,知识整理来源于互联网. 索引加快检索表中数据的方法,它对数据表中一个或者多个列的值进行结构排序,是数 ...
- LVS 负载均衡 三种工作模式 十种调度算法
原文链接:https://blog.csdn.net/weixin_40470303/article/details/80541639 一.LVS简介 LVS(Linux Virtual Server ...
- JS获取HTML DOM元素的方法
JS获取HTML DOM元素有八种方法: 1.根据id获取标签元素: document.getElementById("id名"); 2.根据标签名获取标签列表: document ...
- vue实现选项卡切换--不用ui库
vue的ui库中基本都有选项卡切换的组件,但是在项目开发过程中却不一定能很好的为我们所用,因为里面的样式和 一些状态并不能很好的根据我们的项目需求进行定制.最近项目中使用的是vant-ui中的标签页, ...
- A - 你能数的清吗 51Nod - 1770(找规律)
A - 你能数的清吗 51Nod - 1770(找规律) 演演是个厉害的数学家,他最近又迷上了数字谜.... 他很好奇 xxx...xxx(n个x)*y 的答案中 有多少个z,x,y,z均为位数只有一 ...
- 接口测试彻底弄懂Session、Cookie、Token的区别及联系hold住面试官--hold住了开3万,hold不住开3K!
一.前言:接口测试之伤:cookie,session,token本是一家! cookie,session,token的区别早就已经成为测试同行的心病,各大论坛,各大博客,各大视频网站无不充斥着各种疑问 ...
- SpringBoot系列之学习教程汇总
对应SpringBoot系列博客专栏,例子代码,本博客不定时更新 一.配置篇 SpringBoot系列之@PropertySource读取yaml文件 >> source down ...
- xmind转为markdown
先将xmind导出为.opml 将opml导入Typora (需要安装pandoc)