zoukankan      html  css  js  c++  java
  • 数据库学习---inner join(进行多表联合查询)

    用JOINs进行多表联合查询

    但是在现实数据库中往往包含一组相关的数据表,这些表一般会符合数据库范式(normalization)[1]. 让我们先了解下关系数据库的范式

    数据库范式(normalization)

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

    如果一个实体(比如Dog)的属性数据被分散到多个数据表中,我们就需要学习如何通过 JOIN连表技术来整合这些数据并找到我们想要查询的数据项.

    主键:

    主键(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;

    实战:

    有两个电影表,电影信息表格Movies , BoxOffice 存储着市场相关的信息

    Table: Movies 

    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 

    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

    任务:

    1.找到所有电影的线下Domestic_sales和线上销售额

    SELECT * FROM  Movies inner join Boxoffice on Movies.id=Boxoffice.Movie_id

    2.找到所有线上销售额比线下销售大的电影

    SELECT * FROM  Movies inner join Boxoffice on Movies.id=Boxoffice.Movie_id where  Boxoffice.International_sales>Boxoffice.Domestic_sales

    3.找出所有电影按市场占有率rating倒序排列

    SELECT * FROM  Movies inner join Boxoffice on Movies.id=Boxoffice.Movie_id order by  Boxoffice.rating desc

    4.每部电影按线上销售额比较,排名最靠前的导演是谁,线上销量多少 

    SELECT movies.Director,Boxoffice.International_sales FROM  Movies inner join Boxoffice on Movies.id=Boxoffice.Movie_id order by Boxoffice.International_sales desc limit 1

     
  • 相关阅读:
    Python之数据类型
    Python之变量
    第01组Alpha冲刺总结
    第01组 Alpha冲刺(6/6)
    第01组 Alpha冲刺(5/6)
    第01组 Alpha冲刺(4/6)
    第01组 Alpha冲刺(3/6)
    第01组 Alpha冲刺(2/6)
    第01组 Alpha冲刺 (1/6)
    第01组(17) 需求分析报告
  • 原文地址:https://www.cnblogs.com/zhifeiji822/p/12011586.html
Copyright © 2011-2022 走看看