首页 > 其他 > 详细

用JOINs进行多表联合查询

时间:2020-05-09 16:47:42      阅读:173      评论:0      收藏:0      [点我收藏+]
数据库范式(normalization)

数据库范式是数据表设计的规范,在范式规范下,数据库里每个表存储的重复数据降到最少(这有助于数据的一致性维护),同时在数据库范式下,表和表之间不再有很强的数据耦合,可以独立的增长 (ie. 比如汽车引擎的增长和汽车的增长是完全独立的). 范式带来了很多好处,但随着数据表的分离,意味着我们要查询多个数据属性时,需要更复杂的SQL语句,也就是本节开始介绍的多表连接技术。这样SQL的性能也会面临更多的挑战,特别是当大数据量的表很多的情况下.
如果一个实体(比如Dog)的属性数据被分散到多个数据表中,我们就需要学习如何通过 JOIN连表技术来整合这些数据并找到我们想要查询的数据项.

用JOINs进行多表联合查询

主键(primary key), 一般关系数据表中,都会有一个属性列设置为 主键(primary key)。主键是唯一标识一条数据的,不会重复复(想象你的身份证号码)。一个最常见的主键就是auto-incrementing integer(自增ID,每写入一行数据ID+1, 当然字符串,hash值等只要是每条数据是唯一的也可以设为主键.
借助主键(primary key)(当然其他唯一性的属性也可以),我们可以把两个表中具有相同 主键ID的数据连接起来(因为一个ID可以简要的识别一条数据,所以连接之后还是表达的同一条数据)(你可以想象一个左右连线游戏)。具体我们用到 JOIN 关键字。
用INNER JOIN 连接表的语法 SELECT column, another_table_column, …
FROM mytable (主表)
INNER JOIN another_table (要连接的表)
ON mytable.id = another_table.id (想象一下刚才讲的主键连接,两个相同的连成1条)
WHERE condition(s)
ORDER BY column, … ASC/DESC
LIMIT num_limit OFFSET num_offset;
通过ON条件描述的关联关系;INNER JOIN 先将两个表数据连接到一起. 两个表中如果通过ID互相找不到的数据将会舍弃。此时,你可以将连表后的数据看作两个表的合并,SQL中的其他语句会在这个合并基础上 继续执行(想一下和之前的单表操作就一样了).
还有一个理解INNER JOIN的方式,就是把 INNER JOIN 想成两个集合的交集。
技术分享图片

用到一张Movies表,还给数据库加了一张表 BoxOffice 存储着市场相关的信息,比如 收视率和销售数量等,
这张表里有一个字段Movie_id 和Movies表的 Id是1-对-1的关系. 试一下用 INNER JOIN 来解决问题
able: Movies (Read-Only).

Id Title Director Year Length_minutes
1 Toy Story John Lasseter 1995 81
2 A Bug‘s Life John Lasseter 1998 95
3 Toy Story 2 John Lasseter 1999 93
4 Monsters, Inc. Pete Docter 2001 92
5 Finding Nemo Finding Nemo 2003 107
6 The Incredibles Brad Bird 2004 116
7 Cars John Lasseter 2006 117
8 Ratatouille Brad Bird 2007 115
9 WALL-E Andrew Stanton 2008 104
10 Up Pete Docter 2009 101
11 Toy Story 3 Lee Unkrich 2010 103
12 Cars 2 John Lasseter 2011 120
13 Brave Brenda Chapman 2012 102
14 Monsters University Dan Scanlon 2013 110

Table: Boxoffice (Read-Only)

Movie_id Rating Domestic_sales International_sales
5 8.2 380843261 555900000
14 7.4 268492764 475066843
8 8 206445654 417277164
12 6.4 191452396 368400000
3 7.9 245852179 239163000
6 8 261441092 370001000
9 8.5 223808164 297503696
11 8.4 415004880 648167031
1 8.3 191796233 170162503
7 7.2 244082982 217900167
10 8.3 293004164 438338580
4 8.1 289916256 272900000
2 7.2 162798565 200600000
13 7.2 237283207 301700000

第一个问题,查找所有电影国内国外的销量

代码为:
SELECT * FROM movies inner join boxoffice on movies.id=boxoffice.movie_id

技术分享图片

第二个问题,找到所有国际销售额比国内销售大的电影

代码为:

SELECT * FROM movies inner join boxoffice on movies.id=boxoffice.movie_id where International_sales > Domestic_sales
技术分享图片

第三,找出所有电影按市场占有率rating倒序排列

代码为:

SELECT * FROM movies inner join boxoffice on movies.id=boxoffice.movie_id order by rating desc
技术分享图片

第四个问题,每部电影按国际销售额比较,排名最靠前的导演是谁,线上销量多少?

代码为:

SELECT director,International_sales FROM movies inner join boxoffice on movies.id=boxoffice.movie_id order by International_sales desc limit 1
技术分享图片

用JOINs进行多表联合查询

原文:https://www.cnblogs.com/hxlinux/p/12857726.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!