【JavaWeb】64:多表查询详解

今天是刘小爱自学Java的第64天。

感谢你的观看,谢谢你。

话不多说,继续开始数据库的学习:

image

昨天学习了多表设计,事实上我们所需要的数据,通常会来自多张表。

那么如何使用sql语句一次性查询多张表的数据?

这是我们应该去考虑的问题,为了解决这个问题,今天继续学习多表查询。

一、笛卡尔积与内连接

万万没有想到,学个数据库竟然还能接触到笛卡尔积?后面不会学着学着还会出现牛顿吧……

牛顿、拉格朗日、泰勒、傅里叶……简直就是大学噩梦般的存在。

现在有两张表:部门表、成员表。

那如何查询出一个结果既显示成员又显示部门呢?

就需要引入笛卡尔积的概念:

[图片上传中...(image-3405d6-1592557550138-9)]

格式:select * from member,department;

查出来的数据就相当于成员表与部门表的乘积。

也就是将成员表里的每一条数据都和部门表中的每一条匹配连接。

  • 成员表一共有7条数据

  • 部门表一共有4条数据

  • 那根据笛卡尔积查询出来的数据一共4*7=28条

那么现在问题来了:这就变成排列组合了,查询到的结果冗余。如何避免结果冗余?

将这两张表相同的地方作为查询条件:

image

①隐式内连接

select * from+表A+表B+where+A与B相交的部分;

②显示内连接

select * from+表A+inner join+表B+on+A与B相交的部分;

  • inner join,也就是内连接的意思。

  • on,在这里就相当于where,后面接查询条件,其中on也可以替换成where。

那这两者有没有区别呢?

基本没区别,就只是语法不一样,个人觉得:

  • 第一种语法更好理解。

  • 第二种语法看上去更加地专业。

二、三种外连接

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

  • 左外连接:显示左表的全部记录以及右边符合连接条件的记录。

  • 右外连接:原理同上,只不过表相反。

[图片上传中...(image-67c635-1592557550138-7)]

①左外连接

select * from+表A+left outer join+表B+on+A与B相交的部分;

  • left,左边

  • outerjoin:外连接

也就是左边表A全部的数据,同时加上表B中与之相交的部分。

②右外连接

select * from+表A+right outer join+表B+on+A与B相交的部分;

  • right ,右边

  • outerjoin:外连接

也就是右边表B全部的数据,同时加上表A中与之相交的部分。

③全外连接

select * from+表A+full outer join+表B+on+A与B相交的部分;

全外连接里的关键单词为full。

但是这个语法在MySQL数据库中不支持,Oracle数据库才支持。那MySQL中是如何办的?

就是将左外连接和右外连接结合起来了。

三、四种连接方式图解

表A与表B,其中它们相互重合的部分为C。

四种连接方式图解如下:
image

①内连接

就相当于C。

将这两张表重合的部分查询出来。

②左外连接

就相当于A+C。

左边的表加上另一张表与之相交的部分。

③右外连接

就相当于C+B。

右边的表加上另一张表与之相交的部分。

④全外连接

就相当于A+B+C。

两张表的数据相结合,其中相关联的部分要结合起来。在MySQL数据库中全外连接是如何表示的?

全外连接=左外连接+右外连接;

所以多了一个C,那么就要去重。

image

语法格式也就是左外连接和右外连接相加。

  • union :去掉重复的数据。

  • union all :不去掉重复的数据。

  • 其中注意第一条查询语句不用加分号。

四、关联子查询

现有一个需求:要查询出年龄最小的部门成员信息。

image

①常规方法

先查询出最小的年龄是多少(通过聚合函数)

再根据查询到的最小年龄查询对应的成员信息

这样做自然是能解决需求的,但是有一个问题:

查询要访问数据库两次,并且第二次查询需要等到第一次的查询结果出来后才能写sql语句。②子查询

等于是将常规方法中的两步结合成一步了。

语法:A查询语句作为B查询语句的条件,那么A查询称之为子查询,B查询称之为主查询。

子查询都要写在 () 里,且执行要先于主查询。

③all的用法

前面的两个方案中都是使用了聚合函数min()来找出最小的年龄是多少。

而all也能达到这样的目的,语法为:

age<=all(select age from member)。

翻译过来就是:年龄小于或等于从member表中查到的所有年龄,也就是最小年龄了。

五、in、any和some的用法

昨天程序员表和项目表的多对多表关系。

image

看中间表

  • 第一行:刘小爱开发微软,money为10000;

  • 第二行:刘小爱开发苹果,money为20000;

  • ……

这样看下来就一目了然。现有一个需求:

查询money大于10000的程序员信息。

分析:

第一步:先从中间表coder_project中查询出money大于10000的coder_id;

第二步:根据查询到的coder_id查询对应的coder信息。

学了子查询,可以将这两步并为一步。
image

子查询查出coder_id,主查询再查出程序员信息。

①In的使用

in就是表示包含子查询查出的数据。

  • 当子查询结果只有一个时,可以用=,也可以用in。

  • 当子查询结果有多个时,不可以用=,只能用in。

所以说in的使用其实包含了=。

②any的使用

虽然子查询结果有多个,我就是要用=,怎么办?

就可以用any,any表示任意的意思,也就是=子查询查出的任意一个数据。

③some的使用

同any一样的道理:也就是=子查询查出的一些数据。some作用和any一样。

六、as的使用

需求 : 查询money大于10000的程序员信息和对应的money。

分析

第一步:我们从中间表coder_project中可以找到满足条件的coder_id和money,结果就是一张新的临时表,取名temp。

第二步:根据code_id(临时表)找出所有对应的程序员信息(coder表)和money(临时表)。

image

①思路分析

第一步:

将查询到的结果作为了一张临时表temp,但是这张表本身是不存在的,我们没法直接在第二步中用,会报错。

temp表其实就是中间表coder_project中的一部分满足条件的数据。

第二步:

  • 我们需要对应程序员的所有信息(也就是coder.*)

  • 我们需要temp表中的money

  • 从temp表、coder表中查询

  • coder表中的id和temp表中的coder_id相同,也就是内连接相等的部分。

②as定义临时表

利用子查询的思路,将第一步的结果作为子查询,然后给它起一个别名,也就是temp表,这样就能直接使用了。

思路捋清晰了,as定义临时表也就很好懂了。

最后

给这两天的学习做一个总结

image

谢谢你的观看。

如果可以的话,麻烦帮忙点个赞,谢谢你。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354