MySQL(九)之数据表的查询详解(SELECT语法)二
上一篇讲了比较简单的单表查询以及MySQL的组函数,这一篇给大家分享一点比较难得知识了,关于多表查询,子查询,左连接,外连接等等。希望大家能都得到帮助!
在开始之前因为要多表查询,所以搭建好环境:
1)创建数据表suppliers
前面已经有一张表是book表,我们在建立一张suppliers(供应商)表和前面的book表对应。
也就是说 让book中s_id字段值指向suppliers的主键值,创建一个外键约束关系。

其实这里并没有达到真正的外键约束关系,只是模拟,让fruits中的s_id中的值 能匹配到 suppliers 中的主键值,通过手动添加这种数据,来达到这种关系。
反正是死数据,也不在添加别的数据,就不用建立外键约束关系了,这里要搞清楚。
2)插入数据

一、多表查询
1.1、取别名
1)为表取别名
因为是对两张表进行查询了,那么每次写表名的话就有点麻烦,所以用一个简单别名来代表表名
格式:表名 AS 别名
2)为字段取别名
给字段名取别名的原因是有些字段名是为了显示更加清楚
举例:select b_price as '价格' from book;

1.2、普通双表查询
需求:查询书的编号、书的名字、书的批发商编号、书的批发商名字
分析:看下要求,就知道要查询两张表,如果需要查询两张表,那么两张表的关系必定是外键关系,或者类似于外键关系(类似于也就是说两张表并没有真正加外键约束,
但是其特点和外键是一样的,就像上面我们手动创建的两张表一样,虽然没有设置外键关联关系,但是其特性跟外键关系是一样的。)
select b.b_id,b.b_name,s.s_id,s.s_name from book as b,suppliers as s where b.s_id=s.s_id;

注意:第一个执行的是FROM,所以上面为表取别名,在语句的任何地方的可以使用
1.3、内连接查询
了解了上面的两张表基本的连接查询后,内连接查询就很简单了,因为内连接跟上面的作用是一样的,唯一的区别就是语法的不一样。
格式:表名 INNER JOIN 表名 ON 连接条件
需求::查询书的编号、书的名字、书的批发商编号、书的批发商名字(这个和上面的一样,我们看一下语法上有什么不一样的)
select b.b_id,b.b_price,s.s_id,s.s_name from book as b inner join suppliers as s on b.s_id=s.s_id;

其实还有一种自然连接:涉及到的两张表都是同一张表。
举例:查看书id为g2的供应商供应的其他书?
select b2.b_id,b2.b_name from book as b1 inner join book as b2 on b1.s_id=b2.s_id and b1.b_id='g2';

分析:把book表分开看成是两张完全一样的表,在b1表中找到b_id='g2'的s_id,然后到b2这张表中去查找和该s_id相等的记录,也就查询出来了问题所需要的结果。
还有另一种方法,不用内连接查询,通过子查询也可以做到,下面会讲解,这里先给出答案,到时可以回过头来看看这个题。
select b_id,b_name from book where s_id=(select s_id from book where b_id='g2');
结果和上面的一样
1.4、外连接查询
内连接是将符合查询条件(符合连接条件)的行返回,也就是相关联的行就返回。
外连接除了返回相关联的行之外,将没有关联的行也会显示出来。
为什么需要将不没关联的行也显示出来呢?这就要根据不同的业务需求了,就比如,order和customers,顾客可以有订单也可以没订单,现在需要知道所有顾客的下单情况,而我们不能够只查询出有订单的用户,
而把没订单的用户丢在一边不显示,这个就跟我们的业务需求不相符了,有人说,既然知道了有订单的顾客,通过单表查询出来不包含这些有订单顾客,不就能达到我们的要求吗,这样是可以,但是很麻烦,如何能够将其一起显示并且不那么麻烦呢?为了解决这个问题,就有了外连接查询这个东西了。
1.4.1、左外连接
格式: 表名 LEFT JOIN 表名 ON 条件;
返回包括左表中的所有记录和右表中连接字段相等的记录,通俗点讲,就是除了显示相关联的行,还会将左表中的所有记录行度显示出来。
简单的说:连接两张表,查询结果包含左边表的所有数据以及右边表和左边表有关系的数据。
实例:为了演示我们的效果我们给suppliers添加两条数据

select s.s_id,s.s_name,b.b_id,b.b_name
from suppliers as s left join book as b
on s.s_id=b.s_id;

分析:suppliers表是在LEFT JOIN的左边,所以将其中所有记录度显示出来了,有关联项的,也有没有关联项的。这就是左外连接的意思,将左边的表所有记录都显示出来(前提是按照我们所需要的字段,
也就是SELECT 后面所选择的字段)。如果将suppliers表放LEFT JOIN的右边,那么就不会在显示80和90这两条记录了。来看看

1.4.2、右外连接
格式: 表名 RIGHT JOIN 表名 ON 条件
返回包括右表中的所有记录和右表中连接字段相等的记录。其实跟左外连接差不多,就是将右边的表给全部显示出来

1.5、复合条件查询
在连接查询(内连接、外连接)的过程中,通过添加过滤条件,限制查询的结果,使查询的结果更加准确,通俗点讲,就是将连接查询时的条件更加细化。
1)在book和suppliers表中使用INNER JOIN语法查询suppliers表中s_id为70的供应商的供货信息?
select s.s_id,s.s_name,b.b_id,b.b_name
from book as b inner join suppliers as s
on s.s_id=b.s_id and s.s_id=70;

2)在fruits表和suppliers表之间,使用INNER JOIN语法进行内连接查询,并对查询结果进行排序
select s.s_id,s.s_name,b.b_id,b.b_name
from book as b inner join suppliers as s
on s.s_id=b.s_id order by b.s_id; //对b.s_id进行升序。默认的是ASC,所以不用写。

二、子查询
子查询,将查询一张表得到的结果来充当另一个查询的条件,这样嵌套的查询就称为子查询。
搭建环境:
表tb1:
表tb2:
2.1、带ANY、SOME、ALL关键字的子查询

1)ANY关键字接在一个比较操作符的后面,表示若与子查询返回的任何值比较为TRUE,则返回TRUE,通俗点讲,只要满足任意一个条件,就返回TRUE。
SOME关键字和ANY关键字的用法一样,作用也相同。
实例:select num1 from tb1 where num1> any(select num2 from tb2); //这里就是将在tb2表中查询的结果放在前一个查询语句中充当条件参数。只要num1大于其结果中的任意一个数,那么就算匹配。

2)ALL关键字表示需要同时满足所有条件
select num1 from tb1 where num1> all(select num2 from tb2); //num1需要大于所有的查询结果才算匹配

2.2、带EXISTS关键字查询
EXISTS关键字后面的参数是任意一个子查询,如果子查询有返回记录行,则为TRUE,外层查询语句将会进行查询,如果子查询没有返回任何记录行,则为FALSE,外层查询语句将不会进行查询。

2.3、带比较运算符的子查询
除了使用关键字ALL、ANY、SOME等之外,还可以使用普通的比较运算符。来进行比较。比如我们上面讲解内连接查询的时候,就用过子查询语句,并且还是用的=这个比较运算符。
三、合并查询
3.1、UNION关键字
合并结果集,将多个结果集拼接在一起。合并的时候只关注列数相同,不关注数据类型。但是在没有特殊需求的情况下最好不要将数据类型不同的列进行合并。
当数据类型不同的情况下进行合并时,合并之后列的数据类型是varchar类型。在合并的时候会消除重复的行,不消除重复的行,可使用union all。
利用UNION关键字,可以将查询出的结果合并到一张结果集中,也就是通过UNION关键字将多条SELECT语句连接起来,注意,合并结果集,只是增加了表中的记录,并不是将表中的字段增加,仅仅是将记录行合并到一起。其显示的字段应该是相同的,不然不能合并。
3.2、UNION[ALL]的使用
UNION:不使用关键字ALL,执行的时候会删除重复的记录,所有返回的行度是唯一的,
UNION ALL:不删除重复航也不对结果进行自动排序。
格式:
SELECT 字段名,... FROM 表名
UNION[ALL]
SELECT 字段名,... FROM 表名
3.3、实例
1)查询书价小于50,查询s_id为50或70的书的信息,使用union

使用UNION,而不用UNION ALL的话,重复的记录就会被删除掉。
四、使用正则表达式查询
使用REGEXP关键字来指定正则表达式,画一张表格,就能将下面所有的度覆盖掉。

1)查询一特定字符开头或字符串开头的记录
select * from book where b_name REGEXP '^j'; //以j开头的记录

注意:唯一的差别就在正则表达式不一样,一般使用这种模糊查询,使用MySQL中的'_'和'%'就已经足够了。
2)查询以特定字符或字符串结尾的记录
3)用符号"."来替代字符串中的任意一个字符
4)使用"*"和"+"来匹配多个字符
5)匹配指定字符串
6)匹配指定字符中的任意一个
7)匹配指定字符以外的字符
8)使用{n,}或者{n,m}来指定字符串连续出现的次数
觉得不错的大佬点个“”推荐“”哦!
MySQL(九)之数据表的查询详解(SELECT语法)二的更多相关文章
- MySQL(九)之数据表的查询详解(SELECT语法)一
这一篇是MySQL中的重点也是相对于MySQL中比较难得地方,个人觉得要好好的去归类,并多去练一下题目.MySQL的查询也是在笔试中必有的题目.希望我的这篇博客能帮助到大家! 重感冒下的我,很难受!k ...
- mysql 数据表读锁机制详解
为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制.一.概述MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(tab ...
- SQL Server时间粒度系列----第8节位运算以及设置日历数据表节假日标志详解
本文目录列表: 1.位运算 2.设置日历数据表节假日标志 3.总结语 4.参考清单列表 位运算 SQL Server支持的按位运算符有三个,分别为:按位与(&).按位或(|).按位异或 ...
- Mysql权限速查表以及权限详解
一.前言 很多文章中会说,数据库的权限按最小权限为原则,这句话本身没有错,但是却是一句空话.因为最小权限,这个东西太抽象,很多时候你并弄不清楚具体他需要哪 些权限. 现在很多mysql用着root账户 ...
- (转)Mysql 多表查询详解
MySQL 多表查询详解 一.前言 二.示例 三.注意事项 一.前言 上篇讲到mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...
- MySQL简单查询详解-单表查询
MySQL简单查询详解-单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询的执行路径 一条SQL查询语句的执行过程大致如下图所示: 1>.客户端和服务端通过my ...
- Mysql高手系列 - 第9篇:详解分组查询,mysql分组有大坑!
这是Mysql系列第9篇. 环境:mysql5.7.25,cmd命令中进行演示. 本篇内容 分组查询语法 聚合函数 单字段分组 多字段分组 分组前筛选数据 分组后筛选数据 where和having的区 ...
- Mysql高手系列 - 第12篇:子查询详解
这是Mysql系列第12篇. 环境:mysql5.7.25,cmd命令中进行演示. 本章节非常重要. 子查询 出现在select语句中的select语句,称为子查询或内查询. 外部的select查询语 ...
- MySQL在创建数据表的时候创建索引
转载:http://www.baike369.com/content/?id=5478 MySQL在创建数据表的时候创建索引 在MySQL中创建表的时候,可以直接创建索引.基本的语法格式如下: CRE ...
随机推荐
- IBM Websphere 集群会话共享问题解决办法
遇到一应用部署环境如下图: 两台HTTP SERVER(以下简称IHS)负责转发数据包,其中F5采用粘性模式,即一个用户在会话周期内的数据包一定会被转发到IHS中的一台, 但IHS 到Web Serv ...
- Nlpir Parser敏感词搜索灵玖语义技术应用
近年来随着网络技术的飞速发展和用户的剧烈增长,网络传输数据量越来越大,网络用语越来越趋于多样化.如何快速的屏蔽用户的不当言论.过滤用户发表内容中的非法词汇已成为关键词匹配领域的一项重大难题. 目前主要 ...
- [补档]暑假集训D3总结
考试 集训第一次考试,然而- - 总共四道题,两道打了DFS,一道暴力,一道~~输出样例~~乱搞,都是泪啊- - 目前只改了三道,回头改完那道题再上题解吧- - T2 [Poi2010]Monot ...
- factorOne cannot be&nb…
factorOne cannot be resolved or is not a field 现象描述: Eclipse的使用时会在代码处出现警告factorOne cannot be resolve ...
- 64位linux系统通过编译安装apache+…
二.安装php 上传php压缩包 例如:php-5.2.3.tar.gz 移动 mv php-5.2.3.tar.gz /usr/local/src 进入 cd /usr/local/src 解压 t ...
- 微信开发中遇到的问题,关于cdnmidimgurl 图片获取
访问了微信服务器 返回的数据: [{MsgId=3349810483943419227, FromUserName=@@855c3ada0e9c387cfbcff93e9a1a639f024bcfd1 ...
- Mybatis 调用存储过程,使用Map进行输入输出参数的传递
做个记录,以备后用 java代码: public String texuChange() throws Exception { try { ...
- 【技术干货】听阿里云CDN安防技术专家金九讲tengine+lua开发
一.介绍 二.安装 三.运行 四.开发 1.介绍 Tengine:轻量级.高性能.高并发.配置化.模块化.可扩展.可移植的Web和反向代理 服务器,Tengine是nginx超集,但做了很多优化,包含 ...
- LinkStack
//Node.h template<typename ElemType> struct Node { ElemType data; Node<ElemType> *next; ...
- Markdown公式编辑
一.公式使用参考 1.如何插入公式 行中公式(放在文中与其它文字混编)可以用如下方法表示:$ 数学公式 $ 独立公式可以用如下方法表示:$$ 数学公式 $$ 自动编号的公式可以用如下方法表示: 若需要 ...