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;

MySQL (五)的更多相关文章

  1. MySQL(五) MySQL中的索引详讲

    序言 之前写到MySQL对表的增删改查(查询最为重要)后,就感觉MySQL就差不多学完了,没有想继续学下去的心态了,原因可能是由于别人的影响,觉得对于MySQL来说,知道了一些复杂的查询,就够了,但是 ...

  2. mysql五补充部分:SQL逻辑查询语句执行顺序

    一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...

  3. mysql五:pymysql模块

    一.介绍 之前都是通过MySQ自带的命令行客户端工具Mysql来操作数据库,那如何在Python程序中操作数据库呢?这就需要用到pymysql模块了. 这个模块本质就是一个套接字客户端软件,使用前需要 ...

  4. mysql五补充:SQL逻辑查询语句执行顺序(待完善)

    一.SELECT语句关键字的定义顺序(语法顺序) SELECT DISTINCT <select_list> FROM <left_table> <join_type&g ...

  5. mysql五-2:多表查询

    一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备表 company.employeecompany.department #建表 create table department( id ...

  6. mysql五:数据操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  7. mysql五-1:单表查询

    一 介绍 本节内容: 查询语法 关键字的执行优先级 简单查询 单条件查询:WHERE 分组查询:GROUP BY HAVING 查询排序:ORDER BY 限制查询的记录数:LIMIT 使用聚合函数查 ...

  8. mysql五:索引原理与慢查询优化

    一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...

  9. Mysql(五):索引原理与慢查询优化

    一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...

  10. MySQL(五) —— 子查询

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

随机推荐

  1. javascript 实现 对XML文件 2级/3级联动操作

    js代码 //实现对xml文档的读取:function loadXMLDoc(dname) { try // Internet Explorer { xmlDoc = new ActiveXObjec ...

  2. gtest 操作指南

    首先,下载gtest-17.0,CSDN上就可以免费下载. 然后,打开gtest-17.0下的msvc文件夹,运行gtest.sln,右键解决方案,选择生成解决方案,此时会在gtest-17.0/ms ...

  3. JS - JSON.stringify

  4. 钉钉 机器人接入 自定义webhook

    钉钉出了个webhook机器人接入,自定义的机器人支持随时post消息到群里: 昨天就尝试着用C#写了个: 一开始用python写,但是莫名的提示  {"errmsg":" ...

  5. kail的aircrack-ng 移到linux系统,Ubuntu等系统

    系统: debian (理论上基于debian的操作系统都可以, 如ubuntu, lubuntu, 等等) # apt-get install gcc make rt3070驱动安装: # apt- ...

  6. 【NOIP模拟】Grid(字符串哈希)

    题目背景 SOURCE:NOIP2016-RZZ-1 T3 题目描述 有一个 2×N 的矩阵,矩阵的每个位置上都是一个英文小写字符. 现在需要从某一个位置开始,每次可以移动到一个没有到过的相邻位置,即 ...

  7. oracle分组-神奇的cube和rollup

    先看代码: 表结构如下: emp表 EMPNO                                     NOT NULL NUMBER(4) ENAME                 ...

  8. JavaSE的基础语法之标识符:

    标识符(掌握) (1)就是给类,接口,方法,变量等起名字的字符序列 (2)组成规则: A:英文大小写字母 B:数字 C:$和_ (3)注意事项: A:不能以数字开头 B:不能是java中的关键字 C: ...

  9. 关于ALTERA生成IP核卡住

    最近搞fft,用的quartus13.1版本,发现quartus和modelism存在各种各样的坑啊,fftIP核大家可能也遇到过ip核 生成到一半就卡住的问题,之前我是通过换系统解决的,但是好景不长 ...

  10. C# 接口基础学习

    什么是接口  接口,在表面上是由几个没有主体代码的方法.属性.索引器.事件,或者它们的组合的集合体,有唯一的名称,可以被类或结构或者其他接口所实现(或者也可以说继承).它在形式上可能是如下的样子: i ...