连接查询--交叉连接
将两张表的数据与另外一张表彼此交叉
原理:
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链接查询的更多相关文章

  1. mysql数据库优化课程---12、mysql嵌套和链接查询

    mysql数据库优化课程---12.mysql嵌套和链接查询 一.总结 一句话总结:查询user表中存在的所有班级的信息? in distinct mysql> select * from cl ...

  2. MYSQL 查询方法 统计查询 链接查询 子查询

    mysql表格查询方法: 查询: 1.简单查询 select * from Info --查所有数据select Code,Name from Info --查指定列的数据select Code as ...

  3. mysql 处理查询请求过程

    需要搞清楚查询为什么会慢,就要搞清楚mysql处理查询请求的过程: 1.客户端发送SQL请求给服务器 2.服务器检查是否可以在查询缓存中命中该SQL   查询缓存对SQL性能的影响. 1.需要对缓存加 ...

  4. 开启Mysql慢查询来优化mysql

    开启Mysql慢查询来优化mysql 优化sql语句是优化数据库的一个很重要的方面,那么怎么发现那些耗时耗资源的sql语句呢,开启Mysql慢查询! 1.查看是否开启慢查询,默认情况下是关闭的.你的m ...

  5. MySQL 慢查询日志总结

    慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志 ...

  6. 如何在MySQL中查询每个分组的前几名【转】

    问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等. 在orcale等数据库中可以使用partition语句来解决,但在mysql中就比较麻烦了.这次翻译的文章就是专门 ...

  7. MySQL慢查询日志总结 日志分析工具mysqldumpslow

    MySQL慢查询日志总结 - 潇湘隐者 - 博客园 https://www.cnblogs.com/kerrycode/p/5593204.html 2016-06-17 10:32 by 潇湘隐者, ...

  8. mysql 连接查询 join

    本文用到的表 CREATE TABLE `cls` ( `cls_id` ) NOT NULL AUTO_INCREMENT, `name` ) NOT NULL, PRIMARY KEY (`cls ...

  9. (转)MySQL慢查询日志总结

    慢查询日志概念 原文:http://www.cnblogs.com/kerrycode/p/5593204.html MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应 ...

随机推荐

  1. CISP-PTE学习记录-大纲(1)

    大纲内容记录 Linux操作系统安全 Windows操作系统安全 数据库安全 Web安全基础 HHTP协议 注入漏洞 XSS漏洞 请求伪造 文件处理漏洞 访问控制漏洞 会话管理漏洞 实战练习 中间件 ...

  2. mybatis入门二-----增删改查

    一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: <?xml version="1.0&quo ...

  3. [vijos1725&bzoj2875]随机数生成器<矩阵乘法&快速幂&快速乘>

    题目链接:https://vijos.org/p/1725 http://www.lydsy.com/JudgeOnline/problem.php?id=2875 这题是前几年的noi的题,时间比较 ...

  4. 操作系统-IO与显示器

    1. 让外设工作起来 只要给相应的控制器中的寄存器发一个指令 向设备控制器的寄存器写不就可以了吗? 需要查寄存器地址.内容的格式和语义.操作系统需要给用户提供一个简单视图---文件视图,这样方便 总的 ...

  5. NKOJ4238 天天爱跑步(【NOIP2016 DAY1】)

    问题描述 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一棵包 ...

  6. eclipse导入项目乱码问题及快键键收集

    1.eclipse导入的项目出现乱码,选择该项目,右键选择最下方的Properties,第一个出现的Resource页面: 在Text file encoding项中,选择other. 目前中文编码主 ...

  7. sql server 表连接类型

    一.数据库访问操作 1.SCAN(最影响性能点,优化切入点) 根据表的不同,分为Table Scan,Cluster Index Scan,Non-clustered Index Scan Table ...

  8. find的基本查询命令《一》

    一. find的基本查询命令 find命令最常用的是查找某个文件,如: find ./ -name "abc.txt" 则会在当前目录及子目录下查找abc.txt文件 更常用的是查 ...

  9. GitHub 热点速览 Vol.15:Background-Matting 让你秒变专业抠图师

    作者:HelloGitHub-小鱼干 摘要:如果要选一个词来概述上周的热点,春风拂过,应该是一个不错的词.新项目像春天冒出的枝芽,朝气蓬勃,虽然获得的 star 不如之前三维 Vim 抢眼,但胜在多姿 ...

  10. spring官方为什么放弃spring social项目及替代方案

    spring social 1.6之后官方不在维护该项目, spring boot 2.x之后也不在提供spring social的 Autoconfiguration. 原因: https://sp ...