了解具有Join和Groups的SQL语句

时间:2014-06-06 19:04:36

标签: mysql sql sql-server

我是SQL和PHP编程的新手,所以我需要一些帮助来完全理解来自别人代码的SQL select语句。

$sql = "SELECT a.*, b.name as city, c.name as state, c.code as state_code 
FROM hotel a
JOIN city b on a.IDCity = b.IDCity
JOIN state c on b.IDState = c.IDState";

这是我理解的(或我的猜测):

  • 从酒店表中选择一切。
  • 从市表中选择名字?
  • 从状态表中选择名称
  • 从状态表
  • 中选择代码
  • 从酒店表中加入城市名称以创建IDCITY?
  • 它正在加入州名和城市名称以创建IDState字段。

这是我根本无法理解的:

  • 这个select语句如何从不同的表中获取字段,但它只表示"来自Hotel a"
  • 什么是a。湾C。在这段代码?我猜他们的小组,但那么为什么他们的两个名字作为状态和代码作为州代码呢?
  • 如果是a。湾C。是团体,我猜他们也指出从哪个表中获取信息?这怎么可以工作?

5 个答案:

答案 0 :(得分:4)

  

。它从酒店表中选择了所有内容:

不完全正确,它从酒店表中选择每个(不一定每个

  

。它从城市表中选择名称?

正确

  

。它从州表中选择名称

正确

  

。它从状态表中选择代码

正确

  

。它加入了城市的名称与酒店的一切   表创建IDCITY? 。它的加盟名称为州名   城市创建IDState字段...

Hotels有一个名为IdCity的列,用于标识该酒店的城市。因此,您正在使用该表中的该列与City表联接,该表还具有IdCity列(可能是该表的键)。此联接是INNER JOIN,因此只返回表Hotels中与IdCity表中的现有IdCity对应的City的行。然后,该结果以与State表相同的方式连接(在本例中使用IdStateCity表中存在的公共列State

  

。这个select语句如何从不同的表中抓取字段,   但它只表示"来自酒店a"

不是,JOIN正在做什么,使用公共列关联表以从这些表中获取数据。

  

。什么是a。湾C。在这段代码?我猜他们的团队,但是   那么为什么他们的两个名字作为状态和代码作为州代码?

这些是表别名。您可以将它们用于可读性和清晰度。您是说Hotels表将被称为aCity表将被称为bState表将被称为c表}。然后,您在使用列时使用这些作为前缀,因此b.name表示the column name from the City tableas something正在重命名SELECT中的列,因此c.name as state表示结果集会调用该列state

  

。如果是。湾C。是小组,我猜他们也指出了哪些   从中获取信息的表格?这怎么可以工作?

正如我在上一个要点中所说,它们不是表别名。

答案 1 :(得分:2)

  

这个select语句如何从不同的表中获取字段,但它只显示“From Hotel a”

来自酒店a,意味着从酒店表中提取基本信息,现在别名为“a”,因此名为hotel的表也称为“a”现在

  

什么是a。湾C。在这段代码?我猜他们的团队,但那么为什么他们的两个名字作为状态和代码作为州代码呢?

基表酒店及其数据现在增加了两个表,表格城市名为b,表状态现在名为c

JOIN city b on a.IDCity = b.IDCity
JOIN state c on b.IDState = c.IDState";

c.name实际上是表“c”列名。表状态别名为“c”

  

如果是a。湾C。是团体,我猜他们也指出从哪个表中获取信息?这怎么可以工作?

表中有行,这可以说有1行有5个字段(也就是列)如果你在另一个表中间接知道某些数据,你可以添加第6列。如果我们知道你有车,而且我们知道所有车都有方向盘,我们可以间接说你有车轮

答案 2 :(得分:1)

FROM hotel a

抓取hotel表中的所有行,并使用a作为速记来引用这些行。

JOIN city b on a.IDCity = b.IDCity

返回acity表中所有可能的行组合,并使用b作为最初位于city表中的列的简写。然后过滤结果并保持条件on a.IDCity = b.IDCity为真的行。换句话说,请保留IDCitya列与IDCity b列匹配的行。

JOIN state c on b.IDState = c.IDState

对于加入ab而产生的每一行,请返回state中匹配IDState的所有行,并调用这些行c

作为练习,请将on a.IDCity = b.IDCity替换为on 1=1并解释结果。

答案 3 :(得分:1)

查询正在从Hotels中选择每一列。 a是一个别名,用作代码中代表Hotels的指针。这完全是可选的。如果未使用别名,则联接将为ON HOTELS.IDCITY=CITY.IDCITY等。

酒店表格中的记录将包含一个名为IDCity的字段。该ID与名为City的{​​{1}}表中的相应ID匹配。 IDCity表上的b也是别名。

“JOIN”的使用默认为INNER JOIN(在SQL Server中),这意味着只返回BOTH表匹配的位置。如果酒店记录没有IDCity(其NULL),您将不会在结果集中看到它。

从那里你“加入”到CityState(再次,c只是一个别名)。联接在字段c上完成,返回到每个城市的IDState

同样,由于它是一个“JOIN”,它只返回两个表都匹配的地方......因此在这个查询中,所有3个表必须具有匹配的引用ID值。

所以这个查询不是“创建”ID,它们是从一个表到另一个表的引用指针。

ID被称为主键(IDStateIDCity上的主键)和外键(City中的IDCity是外键)

示例:酒店表中的“希尔顿酒店”的Hotels为7,而IDCity表中City 7的对应名称为“拉斯维加斯”。 7 /拉斯维加斯的IDCity表格的City为12,而在IDState表中,State 12的名称为“内华达”。

这可以让您为每家酒店分配一个城市/州的价值,而无需为200家酒店写“LAS VEGAS”和“NEVADA”,您只需给它一个IDState的7个。城市名称和州名是通过对基础表的引用而知道。

不反复写入相同的值是SQL性能和数据库规范化的必要条件。

答案 4 :(得分:1)

此代码中的a,b和c名称是“别名”。别名是一种引用SQL语句的FROM段中的表的方法。在您的情况下,FROM部分如下所示:

FROM hotel a
JOIN city b on a.IDCity = b.IDCity
JOIN state c on b.IDState = c.IDState

因此,a是分配给酒店的“别名”,b分配给城市,c分配给州。 JOINS显示哪些字段已连接,在这种情况下,IDCity字段连接酒店和城市,IDState字段连接城市和州。

由于SQL语句被解析为一个单元,因此SELECT部分​​知道每个别名使用FROM语句引用哪个表。所以,在你的SELECT语句中:

SELECT a.*, b.name as city, c.name as state, c.code as state_code

由于a指的是酒店,它从酒店选择一切。由于b指的是City,它选择city.name,但该字段在结果集中将被称为“city”。由于c指的是表状态,SELECT也会拉动state.name和state.code,但这些字段在结果集中将被称为“state”和“state_code”。

要理解的主要内容是a,b和c本质上是昵称,编写查询的人给表格以使组织和冗余键入更容易。别名在更复杂的查询中用于其他原因,但此概述将用于理解此查询如何执行得相当好。