为何用city.Name而非NAME?为何以city.CountryCode关联两张表?
已知CITY和COUNTRY表,查询所有位于'Africa'大洲的城市名称。
CITY.CountryCode与COUNTRY.Code为匹配键列。
解决方案
SELECT city.NAME FROM city INNER JOIN country ON city.CountryCode = country.Code WHERE country.continent = 'Africa';
技术疑问解答
1. 为何查询语句中使用city.Name而非直接写NAME?
City和Country表都包含Name字段,直接写NAME会让数据库无法识别你要调用哪个表的字段,触发列名歧义错误。加上表名前缀(也可以给表设置别名后用别名前缀)能明确指定字段来源,避免混淆。
2. 为何内连接要通过ON city.CountryCode = country.Code执行?
City.CountryCode和Country.Code是两张表的逻辑关联键:City表的CountryCode存储的是对应国家的代码,和Country表的主键Code一一对应。内连接通过这个条件,才能把每个城市和它所属的国家数据关联起来,进而通过国家的Continent字段筛选出非洲的城市。
3. 为何使用ON city.POPULATION = country.POPULATION或ON city.NAME = country.NAME无法生效?
- 用
city.POPULATION = country.POPULATION:城市人口和国家总人口完全相等的情况几乎不存在,这种关联条件找不到匹配数据,会返回空结果。 - 用
city.NAME = country.NAME:城市名称和国家名称完全相同的情况极少(比如城市名是"Paris",对应国家名是"France"),无法建立正确的关联关系,要么返回错误结果,要么没有数据。
这两个字段都不是用来关联城市与国家的合理键,自然无法实现需求中的关联筛选。
表结构
City表:
+-------------+----------+ | Field | Type | +-------------+----------+ | ID | int(11) | | Name | char(35) | | CountryCode | char(3) | | District | char(20) | | Population | int(11) | +-------------+----------+
COUNTRY表:
+----------------+-------------+ | Field | Type | +----------------+-------------+ | Code | char(3) | | Name | char(52) | | Continent | char(50) | | Region | char(26) | | SurfaceArea | float(10,2) | | IndepYear | smallint(6) | | Population | int(11) | | LifeExpectancy | float(3,1) | | GNP | float(10,2) | | GNPOld | float(10,2) | | LocalName | char(45) | | GovernmentForm | char(45) | | HeadOfState | char(60) | | Capital | int(11) | | Code2 | char(2) | +----------------+-------------+
内容的提问来源于stack exchange,提问作者Berk Turgut
相关产品推荐
相关产品推荐

