1 连接查询简介

  • 将多张表(可以大于2)进行记录的连接(按照某个指定的条件进行数据拼接)。
  • 最终结果:记录数可能会有变化,字段书一定会增加(至少两张表的合并)。
  • 连接查询:join,使用方式:左表 join 右表

    • 左表:join关键字左边的表
    • 右表:join关键字右边的表  
  • 连接查询的意义:在用户查看数据的时候,需要显示的数据来自多张表。
  • 连接查询的分类:

    • 交叉连接
    • 内连接
    • 外连接
    • 自然连接  

2 交叉连接

  • 交叉连接:cross join,从一张表中循环取出每一条记录,每条记录都去另外一张表进行匹配,无条件匹配,而连接本身字段就会增加,最终形成的结果叫做笛卡尔积。
  • 基本语法:左表 cross join右表;====from 左表,右表。
select * from 左表,右表;
select * from 左表 cross join 右表;
  • my_class表
CREATE TABLE my_class(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME ),
    room )
);
  • my_student表
 CREATE TABLE my_student(
    id INT PRIMARY KEY AUTO_INCREMENT,
    ),
    sex ),
    NAME ),
    age INT,
    height INT,
    cid INT,
    CONSTRAINT fk_id FOREIGN KEY (cid) REFERENCES my_class(id)
);
  • 插入数据
-- 插入班级
INSERT INTO my_class VALUES (NULL,'java001班','A05');
INSERT INTO my_class VALUES (NULL,'Linux班','B26');
INSERT INTO my_class VALUES (NULL,'C班','D11');

-- 插入学生
,,);
,,);
,,);
,,);
,,);
,,);
  • 交叉连接
SELECT * FROM my_student CROSS JOIN my_class;

  • 笛卡尔积没有意义:应该尽量避免(交叉连接没有用)。
  • 交叉连接存在的价值:保证连接这种结构的完整性。

3 内连接

  • 内连接:[inner] join,从左表中取出每一条记录,去右表中与所有的记录进行匹配,匹配必须在某个条件在左表中和右表中相同最终才会保留结果,否则不保留。
  • 基本语法:
select * from 左表  [inner] join 右表 on 左表.字段 = 右表.字段;
    • on 表示连接条件:条件字段都是代表相同的业务含义(如my_student.cid和my_class.id)  
  • 内连接
SELECT * FROM my_student INNER JOIN my_class ON my_student.`cid` = my_class.`id`;

  • 字段别名以及表别名的使用:在查询数据的时候,不同表有同名字段,这个时候需要加上表名才能区分,而表名太长,通常可以使用别名。
SELECT c.`id` 班级id,c.`name` 班级名字,c.`room` 班级教室,s.`id` 学生id,s.`name` 学生姓名,s.`sex` 学生性别,s.`number` 学号,s.`age` 学生年龄,s.`height` 学生身高 FROM my_student s INNER JOIN my_class c ON s.`cid` = c.`id`;

  • 设置id=5的cid=null
;
SELECT c.`id` 班级id,c.`name` 班级名字,c.`room` 班级教室,s.`id` 学生id,s.`name` 学生姓名,s.`sex` 学生性别,s.`number` 学号,s.`age` 学生年龄,s.`height` 学生身高 FROM my_student s INNER JOIN my_class c ON s.`cid` = c.`id`;

  • 内连接还可以使用where代替on关键字(where没有on的效率高)
SELECT c.`id` 班级id,c.`name` 班级名字,c.`room` 班级教室,s.`id` 学生id,s.`name` 学生姓名,s.`sex` 学生性别,s.`number` 学号,s.`age` 学生年龄,s.`height` 学生身高 FROM my_student s INNER JOIN my_class c WHERE s.`cid` = c.`id`;

4 外连接

  • 外连接:outer join,以某张表为主,取出里面的所有记录,然后每条记录去另外一张表进行连接,不管能不能匹配上条件,最终都会保留,能匹配,正确保留,不能匹配,其他表的字段都置空。
  • 外连接分为两种:是以某张表位置:有主表

    • left outer join:左外连接,以左表为主表。
    • right outer join:右外连接,以右表为主表。  
  • 基本方法:左表 left/right join 右表 on 左表.字段 = 右表.字段;
  • 左外连接--左表为主表:最终记录数至少不小于左表已有的记录数
SELECT s.*,c.name ,c.room FROM my_student s LEFT OUTER JOIN my_class c ON s.`cid` =  c.`id`;

  • 右外连接--与左外连接,相反。

5 自然连接

  • 自然连接:natural join,自然连接,就是自动匹配连接条件:系统以字段名字作为匹配模式(同名字段就作为条件,多个同名字段都作为条件)
  • 自然连接:自然内连接和自然外链接。
  • 自然内连接:自动使用同名字段作为连接条件,连接之后会合并同名字段
SELECT * FROM my_student NATURAL JOIN my_class;

  • 自然外连接:左表 natural left/right join 右表;
SELECT * FROM my_student NATURAL LEFT JOIN my_class;

6 温馨小提示

  • 平常中,我们使用最多的还是内连接和外链接哦,交叉连接和自然连接没什么卵用。

MySQL (五)--连接查询简介、 交叉连接、 内连接、外连接、自然连接、温馨小提示的更多相关文章

  1. 转 SQL连接查询语句(内、外、交叉和合并查询)

    转 http://blog.csdn.net/u010011371/article/details/50596535 1.内连接 (INNER JOIN) 内连接也称自然连接,它是根据两个或多个表中的 ...

  2. MySQL(五) —— 子查询

    子查询(SubQuery)是指出现在其他SQL语句内的SELECT语句. 如: SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中 SELE ...

  3. mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化

    先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...

  4. 细说MySQL连接查询:内连、左连和右连

    转: 细说MySQL连接查询:内连.左连和右连 简介: MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接.首先,要确定一个主表作为结果集,然后将 ...

  5. Linq连接查询之左连接、右连接、内连接、全连接、交叉连接、Union合并、Concat连接、Intersect相交、Except与非查询

    内连接查询 内连接与SqL中inner join一样,即找出两个序列的交集 Model1Container model = new Model1Container(); //内连接 var query ...

  6. MYSQL初级学习笔记五:连接查询!(视频序号:初级_37-41)

    知识点七:连接查询(37-41) 什么是连接查询: 连接查询是将两个或两个以上的表按某个条件连接起来,从中选取需要的数据.连接查询是同时查询两个或两个以上的表时使用的.当不同的表中存在相同意义的字段时 ...

  7. Mysql表连接查询

    原文地址: https://www.cnblogs.com/qiuqiuqiu/p/6442791.html 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等 ...

  8. Mysql的查询语句(联合查询、连接查询、子查询等)

    Mysql的各个查询语句(联合查询.连接查询.子查询等) 一.联合查询 关键字:union 语法形式 select语句1 union[union选项] select 语句2 union[union选项 ...

  9. mysql 连接查询 join

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

随机推荐

  1. Bear and Three Balls

    链接:http://codeforces.com/problemset/problem/653/A                                                   ...

  2. python学习===复制list

    """将一个列表的数据复制到另一个列表中.""" """ 使用[:] """ a ...

  3. Gitlab CI 自动部署 asp.net core web api 到Docker容器

    为什么要写这个? 在一个系统长大的过程中会经历不断重构升级来满足商业的需求,而一个严谨的商业系统需要高效.稳定.可扩展,有时候还不得不考虑成本的问题.我希望能找到比较完整的开源解决方案来解决持续集成. ...

  4. 升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署

    概述 容器,顾名思义是用来存放并容纳东西的器皿: 而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共 ...

  5. phoenix常用命令

    1.登录命令 ./sqlline.py localhost:2181:/hbase-unsecure span { font-family: "Courier New"; font ...

  6. IPV4/IPV6网络地址相关知识

    IPv4地址:连接在Internet的每台主机(或路由器)都被分配了一个32bit的全球唯一的标识符,就是IP地址. IPv4地址的组成:网络号 + 主机号 IPv4地址的分类: A类地址:网络地址( ...

  7. 原来,负载均衡可以这样用,多核CPU可以这样用

    负载均衡作为一个处理高并发,大流量的访问的业务场景,已经几乎是常识性的知识了. 而本文的意义在于需求:由于大流量请求,导致服务无法正常响应,在不增加购买机器成本的场景下,如何提高服务器的业务处理能力? ...

  8. 如何在GitHub上生成ssh公钥并用NetBeans克隆项目

    一.生成ssh公钥. 1.首先判断本机是否创建了公有密钥: $ ls ~/.ssh 这个命令用于检查是否已经存在 id_rsa.pub 或 id_dsa.pub 文件,如果文件已经存在,下面步骤可省略 ...

  9. 使用Servlet实现上传文件功能

    1.servlet只需加上一个注释和用request.getPart来获取文件的值,这是servlet3.0的API 2.表单需要加上一个属性enctype="multipart/form- ...

  10. .Net高级进阶,WebApi和MVC进行模型验证的时候,教你如何自由控制需要进行验证的字段?

    现在,你有一个MVC架构的web项目,你要完成一个注册功能. 前台传了3个值到你的控制器,分别是账号.密码.邮箱. 如图:现在你要在控制器里面判断,账号名称.密码.邮箱不能为空,并且名称和密码不超过1 ...