本文共 1874 字,大约阅读时间需要 6 分钟。
原文:
译者:
协议:
自豪地采用
在 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
表请求两列,name
和age
。它将返回所有行。
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.id
和person_pet.id
。
ex6.sql:5
并且我需要以相同的方式,将人person
连接到person_pet
。现在,数据库可以仅仅搜索 id 列全部匹配的行,这些就是连接的行。
ex6.sql:6
我最后仅仅请求自己拥有的宠物,通过为我的名称添加person.first_name
测试。
WHERE
子句中使用多于一个测试,使用AND
来编写它。例如WHERE first_name = "Zed" AND age > 30
。AND
和OR
运算符来搜索行。person.id
而不是person.name
,像我一样。通过阅读,继续深入了解 SQLite3,同时阅读。如果你不知道为什么 SQLite3 做了一些事情,EXPLAIN
是你的答案。
转载地址:http://zhtbx.baihongyu.com/