zoukankan      html  css  js  c++  java
  • 用JOINs进行多表联合查询

    数据库范式(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

  • 相关阅读:
    document.getElementById("mytxt").style.left=""style.left在IE的FF中注意
    asp.net 用户控件中 使用相对路径的解决方法 图片路径问题(用户控件、图片路径) ,ResolveUrl
    探索 Block (一) (手把手讲解Block 底层实现原理)
    iOS 多线程开发 (概念与API简介)
    iOS 性能小点
    iOS runtime (二)(runtime学习之AutoCoding源码分析)
    探索 NSRunLoop (二)(NSRunLoop 自己动手实现SimpleRunLoop)
    iOS NSNotificationCenter (自己实现一个通知中心XMCNotificationCenter)
    iOS runtime (三)(runtime学习之YYModel源码分析)
    iOS runtime(一)(runtime 分析理解)
  • 原文地址:https://www.cnblogs.com/hxlinux/p/12857726.html
Copyright © 2011-2022 走看看