百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

资深DBA整理MySQL基础知识三:迅速理解MySQL的关联和子查询

wptr33 2024-11-17 16:44 31 浏览

接上篇:

上篇主要介绍select的基本的构成,和一些简单常用条件语句。这篇着重说几种常用的多表关联关系。

前面入门只说了一种表的简单查询。但在实际工作几乎不会出现单表操作的情况,大多数还是多表的连接来实现一些需要问题。那么多有那些连接关系呢?

基本概念:

多表连接就是将二个或二个以上的表,“连接起来”当做一个数据源,并 从中去取得所须要的数据:

分类:1,笛卡尔基连接。2,内连接,3,外连接

第一:笛卡尔基连接

它没有条件, 只是按连接的基本概念,将所有数据行都连接起来的结果。

如上图所示:table1中的每一行都会把table2中的所有的行都关联一次,所以会导致很多无用的数据。

对于表1(n1个字段,n2行),表2,(m1个字段,m2行),他们交叉连接的结 果是: 有n1+m1个列; 有n2*m2个行;

形式有: select * from 表1, 表2;

select * from 表1 join 表2;

select * from 表1 cross join 表2;

第二:内连接:inner join

形式:select * from 表1 [inner] join 表2 on 连接条件

先来研究没有条件的“内连接”(其实就是交叉连接)的结果

这是未连接前的两张表product 和product_type,红色框出的是某些条件相同的数据,下面看运行结果。

select * from product inner join product type on product.protype_id = product_type.protype_id;

inner join 是连接方式表示内连接,on 表示 连接条件分别是product表的protype_id 和product_type表的protype_id进行关联,运行结果如下。

或者是

第三:外连接

外连接和分为左外连接和右外连接

形式一: 表 1(左表) left [outer] join 表2(右表) on 连接条件

含义: 其实就是将两个表的内容连接结果,再加上左边表的不符合连接所设定的条件的那些数据结果

可见,左连接的结果,左边表的数据,一定都会“全部取出”

形式二: 表 1(左表) right [outer] join 表2(右表) on 连接条件

和左连接一样,右连接取的全是右表的数据。这里就不一一列举了。

注意:左右连接可互换 A left join B 等价于B right join A。

子查询

接下来就要说说查询的方法了

基本含义: 简单的说一个select 语句就是一个查询语句 Select 字段或表达式 from 数据源 where 条件判断。如下

可见,所谓子查询,就是在一个查询语句(select语句) 中内部,某些位置,又出现了”查询语句”

子查询分类:

表子查询: 一个子查询返回的结果理论上是“多行多列”的时候。此时可以当做一个 “表”来使用,通常是放在from后面。

行子查询 : 一个子查询返回的结果理论上是“一行多列”的时候。此时可以当做一个 “行”来使用,通常放在“行比较语法”中; 行比较语法类似这样:where row(字段1,字段2) = (select 行子查询)

列子查询 : 一个子查询返回的结果理论上是“多行一列”的时候。此时可以当做“多 个值”使用,类似这种:(5, 17, 8, 22)。

标量子查询: 一个子查询返回的结果理论上是“一行一列”的时候。此时可以当做“一 个单个值”使用,类似这种:select 5 as c1; 或select ...where a = 17,或select ... where b >8;即上述“单个数据值”,可以用标量子查 询来代替;

作为主查询的结果数据: select c1,(select f1 from tab2) as f11 from tab1; #这里子查询应 该只有一个数据(一行一列,标量子查询) 作为主查询的条件数据: select c1 from tab1 where c1 in (select f1 from tab2); #这里子查 询可以是多个数据(多行一列,列子查询) 作为主查询的来源数据:select c1 from (select f1 as c1, f2 from tab2) as t2; #这里子查询可以是任意查询结果(表子查询)。

1.比较运算符中的子查询

形式: 操作数 比较运算符 (标量子查询); 说明: 操作数,其实就是比较运算符的2个数据之一而已,通常就是一个字段名; select .... from XXX where id > 5;

举例: 找出最高价的商品;

select * from product where price = (select max(price) from product );

2.使用in的子查询( 列子查询 )

以前用的in的用法: XX in (值1,值2,值3,....); 则in子查询为: XX in (列子查询) 举例: 找出所有类别名称中带“电”这个字的所有商品;

分析:[1] select protype_id,protype_name from product_type where protype_name like '%电%'

[2] select pro_name,price from product where protype_id in(1,3)

3.使用any的子查询(列子查询):

形式: 操作数 比较运算符 any(列子查询) 含义: 当某个操作数(字段),对于对于该列子查询的其中任意一个值,满足该比较运算符,则就算是满足了条件; 即:只要有一个值满足,就算是满足;

进一步解释:

假设表1(tab1)有数据为:

id, name 1 ‘aa’, 5 ‘bb’ 11 ‘cc’

假设表2(tab2)有数据为:

f1 f2 3 ‘x1’ 6 ‘x2’ 12 ‘x3’

则: select * from tab1 where id > any (select f1 from tab2);

则可以取出的结果数据有: 5 ‘bb’ 11 ‘cc’

4.使用all的子查询(列子查询):

形式: 操作数 比较运算符 all (列子查询);

含义: 当某个操作数(字段) 对于该列子查询的所有数据值,都满足该比较运算符,才算满足了条件; 即:要求全部都满足,才算是满足;

进一步解释:

假设表1(tab1)有数据为:

id, name 1 ‘aa’, 5 ‘bb’ 11 ‘cc’

假设表2(tab2)有数据为:

f1 f2 3 ‘x1’ 6 ‘x2’ 12 ‘x3’

则: select * from tab2 where f1 > all ( select id from tab1 );

结果是: 12 ‘x3’

使用exists的查询

形式: where exists( 子查询 ) 含义: 该子查询如果“有数据”,则exists的结果是true,否则就是false

说明: 因为,exists子查询的该含义,造成主查询往往出现这样的情形:要么全都取出,要么都不取出。 如果局限于这个含义(使用情形),其基本就失去了它的现实使用意义。 但: 实际应用中,该子查询,往往都不是独立的子查询,而是会需要跟“主查询”的数据源(表),建立某种关系——通常就是连接 关系。建立的方式是“隐式的”,即没有在代码上体现关系,但却在内部有其连接的“实质”。 此隐式连接方式,通常就体现在子查询中的where条件语句中,使用了主查询表中的数据(字段);

举例: 查询商品表中其类别名称中带“电”这个字的所有商品;

运行结果如下:

下一篇介绍SQL语言中的运行顺序,未完待续

相关推荐

开发者必看的八大Material Design开源项目

MaterialDesign是介于拟物和扁平之间的一种设计风格,自从它发布以来,便引起了很多开发者的关注,在这里小编介绍在Android开发者当中里最受青睐的八个MaterialDesign开源项...

另类插这么可爱,一定是…(另类t恤)

IT之家(www.ithome.com):另类插图:这么可爱,一定是…OSXMavericks和Yosemite打破了苹果对Mac操作系统传统的命名方式,使用加州的某些标志性景点来替换猫...

Android常用ADB命令(安卓adb工具是什么)

杀死应用①根据包名获取APP的PIDadbshellps|grep应用包名②执行kill命令...

微软Mac版PowerPoint测试Reading Order Pane功能

IT之家5月20日消息,微软公司昨日(5月19日)发布博文,邀请Microsoft365Insiders成员,测试macOS新版PowerPoint演示文稿应用,重点引入...

Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍

前言不同于iOS,Xamarin在VisualStudio中针对Android,可以直接设计使用者界面.在本篇教学文章中,笔者会针对Android的专案目录结构以及基本控制项进行介绍,包...

用云存储30分钟快速搭建APP,你信吗?

背景不管你承认与否,移动互联的时代已经到来,这是一个移动互联的时代,手机已经是当今世界上引领潮流的趋势,大型的全球化企业和中小企业都把APP程序开发纳入到他们的企业发展策略当中。但随着手机APP上传的...

谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果

Pine发自凹非寺量子位|公众号QbitAI当你拍照片时,“模特不好好配合”怎么办?...

iOS文本编辑控件UITextField和UITextVie

记录一个菜鸟的IOS学习之旅,如能帮助正在学习的你,亦枫不胜荣幸;如路过的大神如指教几句,亦枫感激涕淋!细心的朋友可能已经注意到了,IOS学习之旅系列教程在本篇公众号的文章中,封面已经换成美女图片了,...

Android入门图文教程集锦(android 入门教程)

Android入门视频教程集锦AndroidStudio错误gradientandroid:endXattributenotfound...

如何使用Android自定义复合视图(如何使用android自定义复合视图)

在最近的一个客户应用中,我遇到了一个需求,根据选定的值来生成指定数量的编辑框字段,这样用户可以输入人物信息。最初我的想法是把这些逻辑放到Fragment中,只是根据选中值的变化来向线性布局容器中增加编...

原生安卓开发app的框架frida常用关键代码定位

前言有时候可能会对APP进行字符串加密等操作,这样的话你的变量名等一些都被混淆了,看代码就可能无从下手...

教程10 | 三分钟搞定一个智能输入法程序

一案例描述1、考核知识点网格布局线性布局样式和主题Toast2、练习目标掌握网格布局的使用掌握Toast的使用掌握线性布局的使用...

(Android 8.1) 功能与新特性(android的功能)

和你一起终身学习,这里是程序员AndroidAndroid8.1(API级别27)为用户和开发人员引入了各种新特性和功能。本文档重点介绍了开发人员的新功能。通过本章阅读,您将获取到以下内容:Andr...

怎样设置EditText内部文字被锁定不可删除和修改

在做项目的时候,我曾经遇到过这样的要求,就是跟百度贴吧客户端上的一样,在回复帖子的时候,在EditText中显示回复人的名字,而且这个名字不可以修改和删除,说白了就是不可操作,只能在后面输入内容。在E...

如何阻止 Android 活动启动时 EditText 获得焦点

技术背景在Android开发中,当活动启动时,EditText有时会自动获得焦点并弹出虚拟键盘,这可能不是用户期望的行为。为了提升用户体验,我们需要阻止...