连接查询--交叉连接
将两张表的数据与另外一张表彼此交叉
原理:
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. Serpent.AI - 游戏代理框架(Python)

    Serpent.AI - 游戏代理框架(Python) Serpent.AI是一个简单而强大的新颖框架,可帮助开发人员创建游戏代理.将您拥有的任何视频游戏变成一个成熟的实验的沙箱环境,所有这些都是熟悉 ...

  2. 用Arcgis缓存文件发布服务

    切片文件类型为: 其中_alllayers中为各等级的切片文件,xml文件为切片信息(级别).发布服务的步骤如下: 1.将文件拷贝到服务器上: 2.将gdb和xml文件拷贝出来,放到桌面上: 3.打开 ...

  3. coding++:java-Date日期转换工具类

    Code: package com.tree.ztree_demo.utils; import org.springframework.util.ObjectUtils; import java.te ...

  4. ElasticSearch 9200 9300 端口

    9300端口: ES节点之间通讯使用 9200端口: ES节点 和 外部 通讯使用 9300是TCP协议端口号,ES集群之间通讯端口号 9200端口号,暴露ES RESTful接口端口号

  5. Python学习笔记:String类型所有方法汇总

    # 按字母表熟悉下string中的方法# A B C D E F G H I J K L M N O P Q R S T U V W X Y Z# 标红的为常用重点的方法!! str = " ...

  6. POJ2182 Lost Cows 题解

    POJ2182 Lost Cows 题解 描述 有\(N\)(\(2 <= N <= 8,000\))头母牛,每头母牛有自己的独一无二编号(\(1..N\)). 现在\(N\)头母牛站成一 ...

  7. 2019NYIST计科第四次周赛

    YZJ的牛肉干 Description 今年的ACM暑期集训队一共有18人,分为6支队伍.其中有一个叫做 YZJ的大佬,在共同的集训生活中,大家建立了深厚的友谊, YZJ准备做点什么来纪念这段激情燃烧 ...

  8. 3.26java作业

    1.编写程序, 输入变量x的值,如果是1,输出x=1,如果是5,输出x=5,如果是 10,输出 x=10,除了以上几个值,都输出x=none.(知识点:if条件语句) package fda; imp ...

  9. 1034 Head of a Gang (30分)(dfs 利用map)

    One way that the police finds the head of a gang is to check people's phone calls. If there is a pho ...

  10. PTA数据结构与算法题目集(中文) 7-14

    PTA数据结构与算法题目集(中文)  7-14 7-14 电话聊天狂人 (25 分)   给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤),为通话记录 ...