我是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";
这是我理解的(或我的猜测):
这是我根本无法理解的:
答案 0 :(得分:4)
。它从酒店表中选择了所有内容:
不完全正确,它从酒店表中选择每个列(不一定每个行)
。它从城市表中选择名称?
正确
。它从州表中选择名称
正确
。它从状态表中选择代码
正确
。它加入了城市的名称与酒店的一切 表创建IDCITY? 。它的加盟名称为州名 城市创建IDState字段...
表Hotels
有一个名为IdCity
的列,用于标识该酒店的城市。因此,您正在使用该表中的该列与City
表联接,该表还具有IdCity
列(可能是该表的键)。此联接是INNER JOIN
,因此只返回表Hotels
中与IdCity
表中的现有IdCity
对应的City
的行。然后,该结果以与State
表相同的方式连接(在本例中使用IdState
和City
表中存在的公共列State
。
。这个select语句如何从不同的表中抓取字段, 但它只表示"来自酒店a"
不是,JOIN
正在做什么,使用公共列关联表以从这些表中获取数据。
。什么是a。湾C。在这段代码?我猜他们的团队,但是 那么为什么他们的两个名字作为状态和代码作为州代码?
这些是表别名。您可以将它们用于可读性和清晰度。您是说Hotels
表将被称为a
,City
表将被称为b
,State
表将被称为c
表}。然后,您在使用列时使用这些作为前缀,因此b.name
表示the column name from the City table
。 as 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
返回a
和city
表中所有可能的行组合,并使用b
作为最初位于city
表中的列的简写。然后过滤结果并保持条件on a.IDCity = b.IDCity
为真的行。换句话说,请保留IDCity
列a
列与IDCity
b
列匹配的行。
JOIN state c on b.IDState = c.IDState
对于加入a
和b
而产生的每一行,请返回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),您将不会在结果集中看到它。
从那里你“加入”到City
表State
(再次,c只是一个别名)。联接在字段c
上完成,返回到每个城市的IDState
。
同样,由于它是一个“JOIN”,它只返回两个表都匹配的地方......因此在这个查询中,所有3个表必须具有匹配的引用ID值。
所以这个查询不是“创建”ID,它们是从一个表到另一个表的引用指针。
ID被称为主键(IDState
是IDCity
上的主键)和外键(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本质上是昵称,编写查询的人给表格以使组织和冗余键入更容易。别名在更复杂的查询中用于其他原因,但此概述将用于理解此查询如何执行得相当好。