sqlzoo-day7

这篇博客探讨了在SQLZOO中的复杂查询问题,包括如何使用子查询和CASE语句来处理百分比数据,以及自连接在解决公共交通路线查询中的应用。作者通过实例解释了如何展示特定城市中机构的计算学生总数,并展示了如何找到不需要转车的公交路线。此外,还讲解了如何找出可以从特定起点直达终点的公交路线组合。

1. 复杂的计算:NSS Tutorial - SQLZOO

由于对nss数据没有详细说明,这部分题目的含义理解上经常出现问题,比如有的值本身就是百分比的形式。

T8: Show the institution, the total sample size and the number of computing students for institutions in Manchester for 'Q01'.

展示Q01且institution包含‘Manchester’的institution, 总的sample,以及subject=计算机的总人数;本来想使用子查询,奈何一直报错,看了书中可以在FROM中加入两个表,那么将另一个子查询作为表p2,两张表通过institution进行匹配,也可以做出来。【关注一下:GROUP BY ,子查询只能一列?,sql的运行顺序】,看答案有人用case语句。

-- case语句
SELECT institution,SUM(sample), 
SUM(
     CASE WHEN subject = '(8) Computer Science' THEN sample
          ELSE 0
     END) FROM nss
WHERE question='Q01'AND (institution LIKE '%Manchester%')
GROUP BY institution
-- 使用子查询
SELECT DISTINCT(p1.institution), SUM(p1.sample), p2.comp 
FROM nss AS p1,
       (SELECT institution,SUM(sample) AS comp FROM nss
               WHERE question='Q01'AND (institution LIKE '%Manchester%')
               AND subject = '(8) Computer Science'
               GROUP BY institution) AS p2
       WHERE p1.question='Q01'AND (p1.institution LIKE '%Manchester%')
       AND p1.institution = p2.institution
       GROUP BY p1.institution, p2.comp

2. 自连接

T5: 執行自我合拼來,留意b.stop代表由Craiglockhart出發不用轉車可前住的地方。 修改它來顯示由Craiglockhart(stop=53)到 London Road(stop=149)的服務資料。

条件语句要重复用到某些内容,而这两次内容的含义是不同的。

-- T5:用站台标号 
SELECT a.company, a.num, a.stop, b.stop
FROM route a JOIN route b ON
    (a.company=b.company AND a.num=b.num)
WHERE a.stop=53 AND b.stop = 149
-- T6: 用站台名
SELECT a.company, a.num, stopa.name, stopb.name
FROM route a JOIN route b ON
  (a.company=b.company AND a.num=b.num)
  JOIN stops stopa ON (a.stop=stopa.id)
  JOIN stops stopb ON (b.stop=stopb.id)
WHERE stopa.name='Craiglockhart' AND stopb.name = 'London Road'

-- T7: 站台115-137之间的公司和路线
SELECT DISTINCT(a.company), a.num FROM route a
JOIN route b ON (a.company = b.company AND a.num = b.num)
WHERE (a.stop = 115 AND b.stop = 137)
OR (a.stop = 137 AND b.stop = 115)

-- T8:車站stops 'Craiglockhart' 到 'Tollcross' 的公司名和路線號碼。
SELECT DISTINCT(a.company), a.num FROM route a
JOIN route b ON (a.company = b.company AND a.num = b.num)
JOIN stops stopa ON (a.stop = stopa.id)
JOIN stops stopb ON (b.stop = stopb.id)
WHERE (stopa.name = 'Craiglockhart' AND stopb.name =  'Tollcross' )
OR (stopa.name =  'Tollcross'  AND stopb.name = 'Craiglockhart')

T9: 不重覆列出可以由 'Craiglockhart' 乘一程車到達的站stops,包括'Craiglockhart'本身。 列出站名,公司名和路線號碼。

以为是写出坐一站站名和公司名,结果是找出不用转车的?

SELECT DISTINCT(stopb.name),b.company,b.num FROM route a
JOIN route b ON (a.company = b.company AND a.num = b.num)
JOIN stops stopa ON (a.stop = stopa.id)
JOIN stops stopb ON (b.stop = stopb.id)
WHERE stopa.name = 'Craiglockhart' 
-- AND b.pos IN(a.pos +1,a.pos, a.pos-1)

T10: Find the routes involving two buses that can go from Craiglockhart to Sighthill.
Show the bus no. and company for the first bus, the name of the stop for the transfer,
and the bus no. and company for the second bus.

这题的思路:

找到起点为Craiglockhart的bus和其可到达的站stop1——bus1

找到终点为Sighthill的bus和其来自的站start2——bus2

bus1和bus2作为两张表,找到bus1的终点stop1=bus2的起点start2的换乘站

刚好用上本文第一部分的T8的子查询的用法。(*^▽^*)

SELECT DISTINCT bus1.num, bus1.company, name, bus2.num, bus2.company FROM 

(SELECT r12.num, r12.company, r12.stop AS stop1 FROM route r11
JOIN route r12 ON (r11.company=r12.company AND r11.num=r12.num)
WHERE r11.stop = (SELECT id FROM stops WHERE name = 'Craiglockhart')) AS bus1

JOIN 

(SELECT r21.num, r21.company, r21.stop AS start2 FROM route r21
JOIN route r22 ON (r21.company=r22.company AND r21.num=r22.num)
WHERE r22.stop = (SELECT id FROM stops WHERE name = 'Sighthill')) AS bus2

ON (bus1.stop1 = bus2.start2)
JOIN stops ON (stops.id = bus1.stop1)

<think>好的,我现在需要帮助用户找到SQL每日练习的第7天相关内容。用户之前提到他们想参与每日SQL练习,现在在寻找Day 7的习题或内容。我需要根据用户提供的引用内容来辅助回答,但看起来引用中的内容可能不直接相关,不过还是需要尽量参考。 首先,查看用户提供的引用内容。引用[1]提到使用SQL Developer进行数据库对象浏览、运行SQL语句和脚本,编辑调试PL/SQL,以及运行报告。这可能与练习中的实际操作有关,比如使用SQL Developer进行练习。引用[2]强调了主键和外键的重要性,以及连接表时的注意事项。这可能提示Day 7的练习可能涉及表连接、主外键的使用,或者数据结构的操作。引用[3]关于算法改进和数据处理,可能间接相关,但可能不是直接针对SQL练习的内容。 接下来,我需要生成Day 7SQL练习题。通常,SQL的学习路径会从基础查询逐渐过渡到更复杂的操作,比如连接、聚函数、子查询等。假设Day 7可能涉及JOIN操作,因为引用[2]提到了主键和外键在连接表时的作用。因此,设计一个涉及多表连接的题目比较理。 题目示例可以是关于订单和客户表,要求用户编写查询来获取特定信息,如每个客户的订单总数。这需要用到INNER JOIN和GROUP BY,还可能涉及聚函数COUNT。这样的练习能帮助用户掌握表连接和分组统计。 然后,相关问题需要围绕这个练习展开。可能的问题包括优化JOIN查询性能的方法,这可能涉及到索引的使用,而引用[2]中提到的主键自动创建索引,因此可以提到主键索引的作用。另一个问题可以是处理没有订单的客户,这需要用到LEFT JOIN,进一步扩展用户的JOIN知识。第三个问题可能涉及性能分析,比如EXPLAIN PLAN的使用,引用[1]提到的SQL Developer工具可以用来运行和调试SQL语句,这里可以建议使用工具分析查询计划。 需要确保回答的结构清晰,分步骤解释题目和解答,同时引用相关引用内容。例如,在讨论主键和索引优化时,引用[2]的内容可以作为支持。在提到使用SQL Developer进行查询分析时,引用[1]的内容适用。 最后,验证回答是否符用户的要求:使用正确的中文,LaTeX格式正确,生成相关问题,并正确引用参考资料。确保没有使用任何markdown格式,行内公式用$...$,独立公式用$$...$$,但在这个回答中可能不需要公式,所以主要注意代码块和引用标识。</think>根据您的要求,以下是SQL每日练习第7天的模拟习题,结数据表连接和主外键应用场景(参考引用[2]中关于主键与表连接的说明): ### SQL Daily Practice Day 7 **题目:订单分析系统** 现有两个数据表: ```sql CREATE TABLE customers ( customer_id INT PRIMARY KEY, -- 主键定义参考[^2] name VARCHAR(50), city VARCHAR(50) ); CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, amount DECIMAL(10,2), FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ); ``` **任务1** 编写查询显示每个客户的订单总数,包含以下列: `客户名称 | 所在城市 | 订单数量` **解答示例**: ```sql SELECT c.name AS 客户名称, c.city AS 所在城市, COUNT(o.order_id) AS 订单数量 FROM customers c LEFT JOIN orders o ON c.customer_id = o.customer_id GROUP BY c.customer_id, c.name, c.city; ``` **知识点说明**: 1. 使用`LEFT JOIN`确保没有订单的客户也会显示 2. 通过主键`customer_id`进行表连接(主外键关系如引用[2]所述) 3.函数与分组配使用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值