1.写一个视图,列出每个国家人口最多的城市的人口数量,字段列表为(国名,人口)
create view v_max_population
as
select 国家.国名,max(城市.人口) from 国家
inner join 城市 on 国家.首都名=城市.首都名
group by 国家.国名
思路:
这里要使用 inner join ,内联结,否则结果虽似正确,但某些情况下就可能出错。按 国名 进行分组,再用max取出最大值。另外,这数据库的建模本身就不符合3NF,之间的外键联系居然是首都名,这样不仅造成冗余,也不方便修改。
2.在国家表中增加一列:城市数量(int)
alter table 国家 add 城市数量 int
3.在国家表新增的城市数量字段中,填写表中每个国家的城市数量
update 国家 N set N.城市数量=
(
select count(城市.城市名) from 城市 C
where N.首都名=C.首都名
)
思路:子查询,从外边的国家N表中传数据进去里边的查询使用,从而得出该国家城市数量
4.列出每个国家中人口数最少的城市名称和人口数量
select 城市.城市名,min(城市.人口) from 城市
inner join 国家 on 国家.首都名=城市.首都名
group by 国家.国名
思路:同1。inner join是进行笛卡尔积的运算,也就是说,将两张表合为一张。
如合成后的新表为:
国名,首都名,面积,城市名,首都名,人口
1. CREATE VIEW YouViewName /*创建视图*/
AS
SELECT 国名,MAX(人口) AS 人口,
FROM 国家 INNER JOIN 城市
ON 国家.首都名=城市.首都名
GROUP BY 国名
GO
2. ALTER TABLE 国家
ADD (城市数量,INT)
3. UPDATE 国家 AS COUNTRY
SET 城市数量=
(SELECT COUNT(城市名) FROM
城市 WHERE COUNTRY.首都名=城市.首都名)
4. SELECT 国名,城市名,人口 FROM
国家 AS COUNTRY INNER JOIN 城市 ON 国家.首都名=城市.首都名
WHERE 人口=
(SELECT MIN(人口) FROM
城市 WHERE 城市.首都名=COUNTRY.首都名 )
修正了一下,楼主试试看.
--问题一:
create view 视图名
as
select 国家.国名,max(城市.人口) as 人口
from 国家,城市
where 国家.首都名=城市.首都名
group by 国家.国名
go
--问题二:
alter table 国家 add 城市数量 int
--问题三:
update 国家 set 城市数量=(select count(城市名) from 城市 where 国家.首都名=城市.首都名)
--问题四:
select b.国名,c.城市名,a.人口
from
(select 首都名,min(人口) 人口 from 城市 group by 首都名) a
inner join 国家 b on a.首都名=b.首都名
inner join 城市 c on a.首都名=c.首都名 and a.人口=c.人口
1.
create view v1 as
select 国名,人口
from 国家 a,
(
select 首都名,sum(人口) 人口
from 城市
group by 首都名
) b
where a.首都名=b.首都名;
2.alter table 国家 add 城市数量 int;
3.
update 国家 a
set 城市数量=(select count(城市名) from 城市 b where a.首都名=b.首都名)
4.
select 国名,城市名,人口数量
from 国家 a,城市 b,
(
select 首都名,min(人口) 人口数量
from 城市
group by 首都名
) c
where a.首都名=b.首都名 and
b.人口=c.人口数量;