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中响应 ...
随机推荐
- Springboot 事务注解--- @Transactional
spring boot @Transactional事物处理 spring boot 添加事物使用 @Transactional注解 简单使用 在启动类上方添加 @EnableTransacti ...
- Redis 主从复制机制(集群)与 哨兵机制
1,什么是redis 主从复制 支持多个数据库之间的数据同步.只能一个主数据库(master),可以一个或者多个从数据库(slave) 主数据库,可以读写 从数据库,只可以读 当主数据库,做写的操作的 ...
- Python python 函数参数:参数组合
'''在Python中定义函数,可以用必选参数.默认参数.可变参数和关键字参数, 这4种参数都可以一起使用,或者只用其中某些 参数定义的顺序必须是:必选参数.默认参数.可变参数和关键字参数 ''' d ...
- iOS 第三方库
网络 AFNetworking HTTP网络库 Reachability 网络监测 UI.布局 Masonry AutoLayout SnapKit AutoLayout Swift TOWebVie ...
- CentOS6.10下安装mysql-5.7.24
卸载原有mysql 因为mysql数据库在Linux上实在是太流行了 所以目前下载的主流Linux系统版本基本上都集成了mysql数据库在里面 我们可以通过如下命令来查看我们的操作系统上是否已经安装了 ...
- 《Java基础复习》—常识与入门
突然发现自己Java基础的底子不到位,复习! 所记知识会发布在CSDN与博客网站jirath.cn <Java基础复习>-常识与入门 一.Java语言的知识体系图 分为三部分 编程语言核心 ...
- Light of future-凡事预则立
目录 1.冲刺的时间计划安排 2.针对上一次作业同学.助教提出的问题的回答 3.针对前几次作业的不足的地方进行思考和总结 4.需要改进的团队分工 5.团队的代码规范 6.Github仓库链接 归属班级 ...
- jQuery实现回车键抬起触发事件
$(function(){ //回车键按下触发 $(document).keydown(function(event){ if(event.keyCode==13){ alert("niha ...
- Java8 学习笔记--函数式接口与lambda表达式的关系
在java中,lambda表达式与函数式接口是不可分割的,都是结合起来使用的. 对于函数式接口,我们可以理解为只有一个抽象方法的接口,除此之外它和别的接口相比并没有什么特殊的地方.为了确保函数式接口的 ...
- qW3xT.2,解决挖矿病毒
在阿里云使用redis,开启了6379端口,但是当时并没有对redis的密码进行设置. 在晚上一点左右.阿里云给我发短信,告诉我服务器出现紧急安全事件.建议登录云盾-态势感知控制台查看详情和处理. 于 ...