笨办法学 Python · 续 练习 40:SQL 读取

练习 40:SQL 读取

原文:Exercise 40: Reading with SQL

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

在 CRUD 矩阵中,你只知道“创建”。你可以创建表,你可以在这些表中创建行。现在我将告诉你如何“读取”,或者在 SQL 中是SELECT

SELECT * FROM person;

SELECT name, age FROM pet;

SELECT name, age FROM pet WHERE dead = 0;

SELECT * FROM person WHERE first_name != "Zed";

这里是每一行做的事情:

ex5.sql:1

这表示“从person中选择所有列并返回所有行”。SELECT的格式是SELECT what FROM tables(s) WHERE (tests)WHERE子句是可选的。*(星号)字符是你想要的所有列。

ex5.sql:3

这里我只要从pet表请求两列,nameage。它将返回所有行。

ex5.sql:5

现在我正在从pet寻找相同的列,但是我只请求dead = 0的行。这会给我所有的活着的宠物。

ex5.sql:7

最后,我从person选择所有列,就像在第一行,但我现在指明,它们不等于"Zed"WHERE子句决定哪一行返回,哪一行不返回。

选择多表

希望你现在专注于选择数据。永远记住这一点:SQL 只知道表。SQL 喜欢表。SQL 仅返回表。表,表,表,表! 我以这种非常疯狂的方式重复一遍,以便你将开始意识到,你在编程中知道的东西不会有帮助。你在编程中处理图,在 SQL 中处理表。他们是相关的概念,但心智模型是不同的。

这里是一个例子,它们哪里不一样。假设你想知道 Zed 拥有什么宠物。你需要写一个SELECT,在person中查找,然后“以某种方式”找到我的宠物。为此,你必须查询person_pet表来获取所需的id列。以下是我的做事方式:

SELECT pet.id, pet.name, pet.age, pet.dead
    FROM pet, person_pet, person
    WHERE
    pet.id = person_pet.pet_id AND
    person_pet.person_id = person.id AND
    person.first_name = "Zed";

现在它看起来很庞大,但我会把它拆解,所以你可以看到,他只是简单构造新的表,基于三个表中的数据,和WHERE子句。

ex6.sql:1

我仅仅想要pet中的一些列,所以我在选择中指定它们。在上一个练习中,你使用*来表示“每一列”,但它在这里是一个坏主意。相反,你想要明确地指定你想要的每个表中的哪个列,你可以使用table.column实现它,就像pet.name

ex6.sql:2

为了将pet连接到person,我需要遍历person_pet关系表。在 SQL 中,这意味着我需要在FROM之后列出所有三个表。

ex6.sql:3

WHERE子句的开始。

ex6.sql:4

首先,我将pet连接到person_pet,通过相关 ID 列pet.idperson_pet.id

ex6.sql:5

并且我需要以相同的方式,将人person连接到person_pet。现在,数据库可以仅仅搜索 id 列全部匹配的行,这些就是连接的行。

ex6.sql:6

我最后仅仅请求自己拥有的宠物,通过为我的名称添加person.first_name测试。

挑战练习

  • 写一个查询,查找所有超过 10 年的宠物。
  • 写一个查询,查找所有比你年轻的人。然后查找比你年长的人。
  • 编写一个查询,WHERE子句中使用多于一个测试,使用AND来编写它。例如WHERE first_name = "Zed" AND age > 30
  • 执行另一个查询,使用三个条件,并使用ANDOR运算符来搜索行。
  • 如果你已经知道像 Python 或 Ruby 这样的语言,这可能是一个查看数据的令人惊奇的方式。花时间使用类和对象来构建相同的关系,然后将其映射到此配置。
  • 执行一个查询,查找你到目前为止添加的宠物。
  • 更改查询来使用你的person.id而不是person.name,像我一样。
  • 浏览运行的输出,并确保你知道哪些 SQL 命令生成了哪个表,以及如何生成该输出。

深入学习

通过阅读SELECT命令的文档,继续深入了解 SQLite3,同时阅读EXPLAIN QUERY PLAN功能的文档。如果你不知道为什么 SQLite3 做了一些事情,EXPLAIN是你的答案。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容