【MySQL】多表联合查询、连接查询、子查询
文章目录
- 【1】连接查询
- 内连接查询
- 外连接查询
- 左连接
- 右连接
- 【2】联合查询
- 【3】子查询
- 带in关键字的子查询
- 带比较运算符的子查询
- 带exists的子查询
- 带any关键字的子查询
- 带all关键字的子查询
【1】连接查询
连接查询的意义: 在用户查看数据的时候,需要显示的数据来自多张表.
内连接查询
内连接查询是最常见的连接查询,内连接查询可以查询两张或两张以上的表
内连接:[inner] join:从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.
基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;
on表示连接条件: 条件字段就是代表相同的业务含义(如my_student.c_id和my_class.id)
当两个表中存在相同意义的字段的时候,就可以通过该字段来连接查询这两个表,当该字段的值相同时就可以查出该记录。
内连接可以没有连接条件: 没有on之后的内容,这个时候系统会保留所有结果。
例:
select a.id,a.name,a.sex,b.country,b.city,b.street
from student a
join addr b
on a.addrid=b.addrid;
外连接查询
以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能匹配,正确保留; 不能匹配,其他表的字段都置空NULL。
左连接
left join: 左外连接(左连接), 以左表为主表
基本语法: from 左表 left join 右表 on 左表.字段 = 右表.字段;
左表不管能不能匹配上条件,最终都会保留:能匹配,正确的保留; 若不能匹配,右表的字段都置NULL。
例:
select a.id,a.name,a.addrid,b.country,b.city
from student a left join addr b
on a.addrid=b.addrid;
右连接
right join: 右外连接(右连接), 以右表为主表
基本语法: from 左表 right join 右表 on 左表.字段 = 右表.字段;
右表不管能不能匹配上条件,最终都会保留:能匹配,正确的保留; 若不能匹配,左表的字段都置NULL。
例:
select a.id,a.name,a.addrid,b.country,b.city
from student a right join addr b
on a.addrid=b.addrid;
【2】联合查询
联合查询
联合查询结果是将多个select语句的查询结果合并到一块因为在某种情况下需要将几个select语句查询的结果合并起来显示。比如现在需要查询两个公司的所有员工的信息,这就需要从甲公司查询所有员工信息,再从乙公司查询所有的员工信息,然后将两次的查询结果进行合并。
可以使用union和union all关键字进行操作
语法格式如下:
select 语句1
union[union 选项]
select 语句2
union|[union 选项]
select 语句n
其中union选项有两个选项可选
all:表示无论重复都输出
distinct: 去重(整个重复)(默认的)
select *from addr
union all
select *from addr;
select id,addrid
from addr
union all
select id,addrid
from student;
联合查询只要求字段一样, 跟数据类型和顺序无关
select id,addrid,sex,score
from student
union all
select sex,addrid,id,score
from student;
联合查询的意义:
- 查询同一张表,但是需求不同 如查询学生信息, 男生身高升序, 女生身高降序
- 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的.
联合查询order by的使用
在联合查询中: order by不能直接使用(不能出现两次),需要对查询语句使用括号才行;
select *from student
where sex="woman"
order by score
union
select *from
student where sex="man"
order by score;
这种情况是会报错的。因为语句中不允许出现两个order by。
select *from student where sex="woman"
union
select *from student where sex="man" order by score;
如果是上边这样只出现一次他的意义就是等合并完成之后再进行排序就没有任何意义了,因为又把前边sex分好的类打乱了
(select *from student
where sex="woman"
order by score )
union
(select *from
student where sex="man"
order by score;)
这种方式的目的是为了让两个结果集先分别order by,然后再对两个结果集进行union。但是你会发现这种方式虽然不报错了,但是两个order by并没有产生最后的效果,所以应该改成如下:
select *from
(select *from student
where sex="woman"
order by score)student
union
select *from
(select *from student
where sex="man"
order by score)student ;
也就是说,order by不能直接出现在union的子句中,但是可以出现在子句的子句中。
【3】子查询
通常我们在查询的SQL中嵌套查询,称为子查询。子查询通常会使复杂的查询变得简单,但是相关的子查询要对基础表的每一条数据都进行子查询的动作,所以当表单中数据过大时,一定要慎重选择
带in关键字的子查询
使用in关键字可以将原表中特定列的值与子查询返回的结果集中的值进行比较
如果某行的特定列的值存在,则在select语句的查询结果中就包含这一行。
例:查询成绩大于80的学生的所有信息,
先在子查询中查出成绩大于80的结果集,然后将原成绩表中的成绩与结果集进行比较,如果存在,就输出这条学生的记录。
select *
from student
where score in
(select score from student where score>80);
带比较运算符的子查询
如果可以确认子查询返回的结果只包含一个单值,那么可以直接使用比较运算符连接子查询。
经常使用的比较运算符包括等于(=)、不等于(<>或!=)、小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。
select *
from student
where score>
(select score
from scholarship
where dengji=1);
查询奖学金等级为1的学生信息
带exists的子查询
exists: 是否存在的意思, exists子查询就是用来判断某些条件是否满足(跨表),
exists是接在where之后
exists返回的结果只有0和1.
例:如果存在成绩大于90的人则列出整个表的记录
select *
from student
where exists
(select *from student where score>90);
带any关键字的子查询
any关键字表示满足其中的任意一个条件,使用any关键字时,只要满足内层查询语句结果的的任意一个,就可以通过该条件来执行外层查询语句。
select *
from student
where addrid<any
(select addrid
from addr);
带all关键字的子查询
all和any刚好是相反的,all关键字表示满足所有结果,使用all关键字,要满足内层查询语句的所有结果,才可以通过该条件来执行外层查询语句。
select *
from student
where addrid>all
(select addrid
from addr);
【MySQL】多表联合查询、连接查询、子查询相关推荐
- mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引
一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, ...
- MS sql server 基础知识回顾(二)-表连接和子查询
五.表连接 当数据表中存在许多重复的冗余信息时,就要考虑将这些信息建在另一张新表中,在新表中为原表设置好外键,在进行数据查询的时候,就要使用到连接了,表连接就好像两根线,线的两端分别连接两张表的不同字 ...
- MySQL多表联合查询
阅读目录 部门.员工表数据 内连接 inner join 外连接 outer join 左外连接 右外连接 自连接 联合查询 交叉连接 cross join 笛卡尔积 子查询 标量子查询 列子查询 行 ...
- 数据库学习笔记6--MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- 三、MySQL子查询学习笔记(标量子查询、列子查询、行子查询、表子查询 详解)
三.MySQL子查询学习笔记 7:子查询 含义: 一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询:在外面的查询语句,称为主查询或外查询 分类: 一 ...
- mysql多表联合查询事例_MySQL——多表查询详细介绍以及实例
1.表与表之间的关系 一对一:用户表和身份信息表,用户表是主表 例如:男人表 .女人表create table man( mid int primary key auto_increment, mna ...
- server多笔记录拼接字符串 sql_第四章、SQL Server数据库查询大全(单表查询、多表连接查询、嵌套查询、关联子查询、拼sql字符串的查询、交叉查询)...
4.1.查询的类型 declare @value as int set @value = 50 select 'age:'as age,2008 years,@valueas va --这种查询时跟 ...
- OceanBase SQL 执行计划解读(二)──── 表连接和子查询
前文<OceanBase SQL 执行计划解读(一)>介绍了单表查询中基本的执行计划解读,本文主要介绍简单的表连接和子查询相关的执行计划. 本文假设你对常用的表连接算法已有了解,包括:嵌套 ...
- 第七周 Java语法总结之数据库大全_DDL_DML_DQL_约束_备份与还原_表的关系_三大范式_多表查询(内连接_外连接_子查询)_musql事务_隔离级别
文章目录 数据库 DDL语句:数据库定义语句 1.库的增删查改 1.查询当前mysql下所有的数据库 2.创建数据库 3.查看创建数据库的默认的字符集(了解) 4.修改数据库的字符集(了解) 5.删除 ...
- MySQL 多表联合查询有何讲究?
今天我们来聊聊微信中的多表联合查询,应该是小表驱动大表还是大表驱动小表? 1. in VS exists 在正式分析之前,我们先来看两个关键字 in 和 exists. 假设我现在有两张表:员工表和部 ...
最新文章
- String spilt时转义特殊字符【转】
- strcut结构体和char型数组的相互转化
- UVA10047独轮车
- NSString、NSArray、NSDic常用方法汇总
- asp.net excel导入 wps_4种Excel格式的转换方法,总有一种适合你!赶紧试试看
- 今晚7点见!红魔5G游戏手机联手热门手游打造专属主题
- MySQL 半同步复制+MMM架构
- 【杭电ACM】1.2.6 decimal system
- SqlServer和Oralce保留几位小数以及当末尾小数为0也显示
- 互联网金融一:大额支付系统、小额支付系统介绍
- php搭建聊天室,php聊天室_用PHP MySQL搭建聊天室
- 苏教版四年级下册计算机说课稿,苏教版四年级下册认识多位数说课稿
- 12.4 Borüvka算法
- 操作系统常见面试总结
- 苏州计算机岗前培训,不忘初心 牢记使命——苏州五院2019年新职工岗前培训圆满完成...
- Vue进阶(幺贰叁):v-for 实现一行展示 n 个元素
- 毕业转行,在一家公司零基础开始学习seo,记录贴
- 电商平台订单号生成策略
- 分享90个ASP源码,总有一款适合你
- ES6结构赋值,一篇就够
热门文章
- ffmpeg库 pycharm_python+ffmpeg让字符跳动起来
- 转自菜头 英超,给技术人员一点时间
- 电脑Win10 企业版如何激活
- C语言----- 4/π=1-1/3+1/5-1/7+...,编程计算π的近似值,直到最后一项的值小于10-4次方为止 //输出π的值,并统计累加的项数
- QGIS 1. qgis的下载和安装(Windows和macOS)
- 人工智能两大技术驱动力
- 投CVPR过程中惊险的Rebuttal环节
- python电商数据分析统计服_python爬虫学习:电商数据分析
- 结合深度学习检测心脏 智能戒指体积小又准确
- 华为防火墙SLB算法