mysql之连接查询、联合查询、子查询
本文内容:
- 连接查询
- 联合查询
- 子查询
- from子查询
- where子查询
- exists子查询
首发日期:2018-04-11
连接查询:
- 连接查询就是将多个表联合起来查询,连接查询方式有内连接、外连接、自然连接、交叉连接。连接查询使得可以同时查看多张表中数据。
- 内连接:有条件连接,多个表之间依据指定条件连接,匹配结果是保留符合匹配结果的记录。
- 外连接:与内连接不同的是不管匹配符不符合都保留,根据外连接连接方式来决定保留哪张表,比如保留左表的话,那么左表无法匹配右表时,保留左表数据,然后置右表字段数据为null.
- 自然连接:有条件连接,自动依据“同名字段”连接(多个同名字段就都作为条件)。
- 交叉连接cross join:无条件连接,将每一条记录与另外一个表的每一条记录连接(笛卡尔积),结果是字段数等于原来字段数之和,记录数等于之前各个表记录数之乘积。
-- 实验表结构
create table student(
id int,
name varchar(15),
gender varchar(15),
cid int
);
create table class(
cid int,
cname varchar(15)
);
drop table student,class;
-- 实验表数据:
insert into student values(1,"lilei","male",1),(2,"hanmeimei","male",2),(3,"jack","male",1),(4,"alice","female",4); --这里特意创建了一个class中没有的4
insert into class values(1,"linux"),(2,"python"),(3,"java"),(5,"html5");--这里特意创建了一个student中没有的5
select * from student;
select * from class;


内连接:
- 从左表中取出每一条记录,去右表中与所有的记录进行匹配,保留匹配成功的记录,并将两份记录拼接。
- 语法:select 字段列表 from 左表 [inner] join 右表 on 左表.字段 = 右表.字段;
- 不使用on条件的时候,结果与交叉连接相同
-- 内连接
-- select * from student inner join class; --结果与交叉连接相同
select * from student join class on student.cid = class.cid;
select * from student inner join class on student.cid = class.cid;

外连接:
- 与内连接不同的是主表记录不管匹配符不符合都保留,方式有左外连接、右外连接,左外连接是保留左表,右外连接是保留右表
- 语法:
- 左外连接:select 字段列表 from 左表 left join 右表 on 左表.字段 = 右表.字段;
- 右外连接:select 字段列表 from 左表 right join 右表 on 左表.字段 = 右表.字段;
select * from student left join class on student.cid = class.cid;

select * from student right join class on student.cid = class.cid;

自然连接:
- 自动匹配连接条件,系统以字段名字作为匹配模式(同名字段就作为条件,多个同名字段就都作为条件)
- 自然内连接:类似内连接,但不提供连接条件。
- 自然外连接:类似外连接,但不提供连接条件。
- 语法:
- 自然内连接:select 字段列表 from 表名 natural join 表名;
- 自然外连接:select 字段列表 from 表名 natural left\right join 表名;
select * from student natural join class;

select * from student natural left join class;

交叉连接:
- 将每一条记录与另外一个表的每一条记录连接
- 语法:
- select 字段列表 from 表名 cross join 表名;
- select 字段列表 from 表名 ,表名;
select * from student cross join class;
select * from student,class;

补充:
- 在多个表中,为了区分每个表,以及简便使用,可以使用表别名。
- 可以多重连接。
- 外连接可以模拟自然连接,只需要将连接条件on 左表.字段 = 右表.字段变成"using 字段名"即可。
select * from student inner join class on student.cid = class.cid;-- 原本结果
select id,name,gender,c.cid,cname from student as s inner join class as c on s.cid = c.cid;-- 使用表别名
联合查询:
- 联合查询是将多个查询结果在记录上进行拼接。(相当于将其他表的查询记录结果连接到第一个表的后面)【因为是拼接,所以多个查询结果的字段数必须相同】【拼接不在意数据类型,比如第一个表的第一个字段是int,但后面的表中的varchar依然可以拼接到第一列中】
- 语法:select语句 union select语句…;
select name,gender from student
union
select * from class;
-- 因为class就两个字段,所以第一个只选出两个字段

补充:
- union可以有选项,加在union 后面,all选项是不对相同去重,distinct是去重。
- 联合查询一般用来处理同一表中以不同方法显示不同数据。(比如,想将学生各科成绩表中的两科(这里假设为python 跟linux)同时查询出来)
- union和order by同时使用报错时
- 如果你想针对联合查询中的某个查询结果排序,需要将这个select语句用括号括起来。【另外,由于联合查询的拼接机制,需要在order by 后面加上limit子句才行,limit的数量可以是一个很大的值。】
- 如果是针对最终的联合查询结果,就在最后一个select语句中使用order by 【建议给最后一个字段加上括号,再加ordery by,使用情况是有同名字段】
子查询:
- 子查询是嵌套在查询语句中的查询。
- 子查询按照出现的位置可以分为三类:
- from子查询:子查询跟在from之后的;一般用在“先查出二维表,再处理”的情况。
- 比如:
-- 这是一个无意义的例子。仅为举例使用
select cid,cname from (select * from class where cname="python") as c; - where子查询:子查询跟在where条件中;一般用在“先查询出指定条件再查询”的情况
- 比如:
select * from student where cid=(select cid from class where cname="python");
- exist子查询:子查询在exist语句里面;一般用作“存在才做”的情况
- 比如:
-- 这是一个如果学生没有选择cid=1的课,那么不输出对应课程信息的例子
select * from class where exists(select * from student where cid=1) and cid=1; - 事实上,有些人认为union之后跟着的也是子查询,不过这里不把这些当作子查询,只把上面几个与“查询”非常紧密相关的当作子查询。
补充:
- 事实上,还可以根据结果来分类子查询:
- 标量子查询,子查询得到的结果是一行一列,情况一般发生于where子查询只查询出一行一列的情况。
- 列子查询,子查询得到的结果是一列多行,情况一般发生于where子查询查询出一列多行的情况。
- 行子查询,子查询得到的结果是多列一行(或者多行多列) ,情况一般发生在where子查询查询出多列一行的情况。
- 表子查询,子查询得到的结果是多行多列 ,情况一般发生在from子查询中
- where子查询中有时候还使用一些其他关键字,如any,all,some,但对=来说,=基本可以实现他们的功能了。
mysql之连接查询、联合查询、子查询的更多相关文章
- SQL连接、合并、子查询
连接:连接分为内连接.外连接.交叉连接 内连接和外连接都是在笛卡尔积的基础做一些修改. 合并查询:把两个相似的结果可以用union联合起来. mysql> select id,time from ...
- 在MySQL中使用子查询和标量子查询的基本用法
一.MySQL 子查询 子查询是将一个 SELECT 语句的查询结果作为中间结果,供另一个 SQL 语句调用.MySQL 支持 SQL 标准要求的所有子查询格式和操作,也扩展了特有的几种特性.子查询没 ...
- mysql优化---in型子查询,exists子查询,from 型子查询
in型子查询引出的陷阱:(扫更少的行,不要临时表,不要文件排序就快) 题: 在ecshop商城表中,查询6号栏目的商品, (注,6号是一个大栏目) 最直观的: mysql); 误区: 给我们的感觉是, ...
- MySQL学习之路8-关联子查询
参考文章https://zhuanlan.zhihu.com/p/41844742 成绩表如下Score: 问题:查询科目中成绩大于平均成绩的记录? SELECT * FROM Score WHERE ...
- in型子查询陷阱,exists子查询
in 型子查询引出的陷阱 select goods_id from goods where cat_id in (1,2,3) 直接用id,不包含子查询,不会中陷阱 题: 在ecshop商城表中,查询 ...
- ylb:子查询(嵌套子查询)和子查询(相关子查询)
ylbtech-SQL Server:SQL Server-子查询(嵌套子查询)和子查询(相关子查询) SQL Server 子查询(嵌套子查询)和子查询(相关子查询). 1,ylb:1,子查询(嵌套 ...
- 013.子查询和分页子查询(sql实例)
--1 子查询 如果子查询和表连接都实现的时候,推荐用表连接实现( 一般:能用表连接实现的就用表连接,有些情况用表连接不能 或者不易实现的再选择子查询) 系统:缓存,执行计划技术手段 --1 wher ...
- mysql---where子查询、form子查询、exists子查询
1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询. 2.子查询有什么好处? 子查询可以使用几个简单命令构造功能强大的复合命令. 那么,现在让我们一起来学习子查询. 3.where型的子 ...
- 相关子查询和嵌套子查询 [SQL Server]
SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类.前提,假设Books表如下: 类编号 图书名 出版社 价格-------------- ...
- oracle基本查询入门(二) 子查询
一.子查询语法 SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table); 子查询在主查询之前 ...
随机推荐
- tensorflow 1.0 学习:卷积层
在tf1.0中,对卷积层重新进行了封装,比原来版本的卷积层有了很大的简化. 一.旧版本(1.0以下)的卷积函数:tf.nn.conv2d conv2d( input, filter, strides, ...
- sql server 日志文件结构及误操作数据找回
一. 概述 在sql server 里有数据文件.mdf和日志文件.ldf,日志文件是sqlserver数据库的另一个重要组成部分,日志文件记录了所有事务以及每个事务对数据库所做的修改.为了提高数据库 ...
- Android--UI之TextView
前言 开门见山,这一篇博客主要讲一下在Android开发中,UI控件TextView的一些使用方式,并且通过四个例子实现一般项目中需要的效果来讲解TextView的使用.并且在之后的一段时间之内,都会 ...
- Core2.0知识整理
概述 Commond-Line ASP.NET结构文件 Startup 配置文件 中间件和依赖注入 依赖注入原理 框架自带的依赖注入(IServiceCollection) 依赖注入生命周期 依赖注入 ...
- 将Long类型字节大小数据转换成标准的视频大小格式
很多时候针对视频信息,数据库中存储的视频大小是字节类型,然后我们在页面中显示则需要使用的是标准的视频大小显示格式,我这里工具类最多显示的是Mb,如果需求要显示G的话可自行参照修改. 直接上工具类和测试 ...
- 深度解读阿里巴巴云原生镜像分发系统 Dragonfly
Dragonfly 是一个由阿里巴巴开源的云原生镜像分发系统,主要解决以 Kubernetes 为核心的分布式应用编排系统的镜像分发难题.随着企业数字化大潮的席卷,行业应用纷纷朝微服务架构演进,并通过 ...
- 3分钟看完Java 8——史上最强Java 8新特性总结之第二篇 Stream API
目录 · 概况 · 切片(Slicing) · 映射(Mapping) · 匹配(Matching) · 查找(Finding) · 归约(Reducing) · 排序(Sorting) · 数值流( ...
- HTTP协议学习(一)
一.HTTP报文的组成 请求报文由 请求行.请求头.请求空行.请求实体四部分组成.其中,请求行和请求头共同组成 请求报文头部 请求行:一行,依次由 请求方法.URI(或者应该说是域名?).HTTP协议 ...
- Perl一行式:字段处理和计算
perl一行式程序系列文章:Perl一行式 获取每行最后一个字段 $ perl -alne 'print $F[$#F]' file.log 这里涉及到了选项"-a".数组@F.这 ...
- 解读经典《C#高级编程》第七版 Page32-38.核心C#.Chapter2
前言 接下来讲讲预定义数据类型.关于数据类型,其实是非常值得透彻研究的. 01 预定义数据类型 值类型和引用类型 C#将把数据类型分为两种,值类型和引用类型,值类型存储在堆栈上,引用类型存储在托管堆上 ...