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. CentOS7 yum安装zabbix3.2.6

    前言: 本人小白,在一个多月前通过面试进入公司,在进入公司的第一天,老板把我叫到他办公室,坐下来慢慢喝茶,吹牛,给我吹他们以前做的软件,经营的产品,还装作一副什么都告诉我的样子,其实这都是套路,我早已 ...

  2. 阿里云服务器 通过JavaMail发送邮箱STMP问题( 25端口被禁用 使用SSL协议465端口 )

    我们传统使用的比较简单的是 STMP 25端口收发邮件 今天发现刚购买的阿里云服务器不能作为客户端通过STMP 25端口发送邮件 开始在网上有说发现是JDK1.8的原因,然后自己也把JDK1.8换到了 ...

  3. JS弹出下载对话框以及实现常见文件类型的下载

    写在前面 JS要实现下载功能,一般都是这么几个过程:生成下载的URL,动态创建一个A标签,并将其href指向生成的URL,然后触发A标签的单击事件,这样就会弹出下载对话框,从而实现了一个下载的功能. ...

  4. php利用ob缓存机制实现页面静态化方法全解

    首先介绍一下php中ob缓存常用到的几个常用函数 ob_start():开启缓存机制 ob_get_contents():获取ob缓存中的内容 ob_clean()清除ob缓存中的内容,但不关闭缓存 ...

  5. JavaWeb开发技术基础概念回顾篇

    JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...

  6. EL函数和自定义EL函数

    简介 EL原本是JSTL1.0中的技术(所以EL和JSTL感情如此好就是自然的了),但是从JSP2.0开始,EL就分离出来纳入了JSP的标准了.但是EL函数还是和JSTL技术绑定在一起.下面将介绍如何 ...

  7. APP测试 - android os6,7 新增特性测试

    背景 android os6,7推出后,公司的APP在市场上面反映的一些问题.初始方案在7月份已经整了一份,但是邮件发出大部分同学都看不到,这里在博客里面整理后再在部门内邮件发出来. android ...

  8. 关于线程和junit注入失败的问题

    问题: 在使用spring的时候,通常会使用注释@Autowired或@Resource注入java Bean; 但是在碰到线程类和测试类的时候就不支持注入方式了. 定义: 线程类:继承thread或 ...

  9. Linux,activemq-cpp之消息过滤器

    假设过滤器字符串如下: filt1=aaaa filt2=bbbb filt3=cccc activeMQ-cpp中消息过滤器,在发送消息的producer.cpp中,对message进行属性设置,m ...

  10. GetStdHandle 函数--获取标准设备的句柄

    #GetStdHandle函数 来源:https://msdn.microsoft.com/en-us/library/ms683231.aspx 作用 该函数用于取得指定的标准设备的句柄(标准输入, ...