连接查询--交叉连接
将两张表的数据与另外一张表彼此交叉
原理:
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. Git入门操作(一)

    最近真正用到了Git,感觉还是需要好好整理一下最最基础用法,与萌新共享.^_^ 关于Git的基础介绍,这里不再赘述,下面撸代码了(主要是命令行的操作,属于linux操作系统的,可能没听过,但记住就好了 ...

  2. h5 js数组Array方法总结

    重新复习数组方法. 一.首先说一下构建一个数组. 1.直接定义一个数组. var a = [1,2,3]; 2.通过Array 对象new一个数组,但Array对象根据传参的不同会返回不同的数组对象. ...

  3. python 基本知识

    1.windows下Spyder中快捷键 块注释/块反注释 Ctrl + 4/5 断点设置 F12 关闭所有 Ctrl + Shift + W 代码完成 Ctrl +空格键 条件断点 SHIFT + ...

  4. 在线诊断工具arthas (windows)

    介绍: arthas是阿里巴巴开发的一款开源的,Java应用程序排查问题的非常好用的工具 当你遇到以下类似问题而束手无策时 arthas 可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各 ...

  5. markdown中锚链接实现目录跳转以及注意事项

    当文章有分类,需要快速阅读,通常会先在文首部写一个目录,点击可以跳转. 为文章写目录,特别在文章较长的时候,有助于对内容的整体把握,能提高阅读效率. 以下,将写一个基本的锚目录demo,然后特别说明需 ...

  6. Java基础知识3-类和对象(1)

    面向过程和面向对象的区别 面向过程(结构化程序设计) 实际上是一个面向操作过程,首先设计一系列过程(算法)来求解问题(操作数据),然后再考虑存储数据的方式(组织数据).即程序=算法\+数据结构.对应典 ...

  7. C语言中static extern的使用

    10:30:22 2019-08-20 基础不牢 瞬间爆炸 参考资料:https://blog.csdn.net/ts_54eagle/article/details/4418627 https:// ...

  8. Java HashMap源码详解

    Java数据结构-HashMap 目录 Java数据结构-HashMap 1. HashMap 1.1 HashMap介绍 1.1.1 HashMap介绍 1.1.2 HashMap继承图 1.2 H ...

  9. python爬取疫情数据详解

    首先逐步分析每行代码的意思: 这是要引入的东西: from os import path import requests from bs4 import BeautifulSoup import js ...

  10. Android Visibility控件显示和隐藏

    Android控件显示和隐藏 visibility 可见(visible) XML文件:android:visibility="visible" Java代码:view.setVi ...