数据库基础:SELECT
SELECT 语句允许你向数据库提出一个问题(查询它),并指定它返回什么数据。我们可能想问一些类似于“告诉我所有罪犯的姓名和年龄”的问题。当然,这不会起作用,所以我们需要用计算机可以理解的语言来表达:结构化查询语言,简称 SQL
SELECT name, DoB --what to return
FROM crooks --where are you returning it from
这将返回以下内容
姓名 | 出生日期 |
---|---|
Geoff | 12/05/1982 |
Jane | 05/08/1956 |
Keith | 07/02/1999 |
Oliver | 22/08/1976 |
Kelly | 11/11/1911 |
Marea | 14/07/1940 |
但假设我们想要筛选这些结果,例如:“告诉我所有来自 Snape 的男性罪犯的 ID、姓名和年龄”。我们需要使用另一个语句,即 WHERE 子句,它允许我们为查询提供一些标准(或选项)
SELECT ID, name, DoB
FROM crooks
WHERE town = 'Snape' AND gender = 'male' --Criteria
这将返回以下内容
ID | 姓名 | 出生日期 |
---|---|---|
3 | Keith | 07/02/1999 |
假设警方知道有一名伤痕累累的女性(4 个以上伤痕)犯了罪,他们想要一份所有有伤痕的女性的名单
SELECT name, town, scars
FROM crooks
WHERE numScars >= 4 AND gender = 'female' --Criteria
这将返回
姓名 | 城镇 | 伤痕数量 |
---|---|---|
Kelly | 东汉姆 | 10 |
Marea | 怀森肖 | 6 |
但是,警方想要快速地筛选并查看谁的伤痕最重。我们将使用一个 **ORDER** 命令
SELECT name, town
FROM crooks
WHERE numScars >= 4 AND gender = 'female' --Criteria
ORDER BY numScars DESC --sorts the numScars values in big to small order
ORDER BY numScars 将你的返回数据排序为 **DESC** 降序(大到小)或 **ASC** 升序(小到大)
扩展 | ||||||||||||||
警告:在考试中,他们可能会要求你返回特定的字段,因此使用 *(通配符)会扣分! 有时你想要返回有关记录的所有详细信息,如果你必须列出它们,这有点麻烦 SELECT name, DoB, gender, town ....
相反,我们可以使用 ** * ** 。这意味着返回所选记录的所有字段 SELECT * --return all fields from crooks
FROM crooks
WHERE name = 'Jane'
这将返回 |
|
练习:SELECT 语句 使用罪犯数据集,编写 SQL 查询以查找 1993 年之前出生的女性的姓名和地址 答案 SELECT name, town
FROM crooks
WHERE DoB < 1993 AND gender = 'female'
使用上述数据集,编写一个查询以查找所有名为 Noel 的人的城镇和性别 答案 SELECT town, gender FROM crooks --you don't have to have a separate line for each SQL statement
WHERE name = 'Noel'
警方非常确定罪犯要么是女性 **OR** 来自纽卡斯尔的人。找到他们的姓名和出生日期 答案 SELECT name, DoB FROM crooks
WHERE gender = 'female' OR town = 'Newcastle'
你可以通过组合 AND 和 OR 来构建更复杂的 SQL WHERE 语句。也许警方应该说罪犯要么是女性,**OR** 是男性 **AND** 来自纽卡斯尔。 SELECT name, DoB FROM crooks
WHERE gender = 'female' OR (gender = 'male' AND town = 'Newcastle')
使用上述数据集,编写一个查询以查找罪犯的年龄,从最年轻到最年长 答案 SELECT name, town, DoB FROM crooks
ORDER BY DoB DESC
|
INNER JOIN
[edit | edit source]我们之前谈到数据库之所以很棒是因为它们允许你将表链接在一起并对链接数据执行复杂的搜索。到目前为止,我们只关注搜索一个表。
当你使用 Facebook 这样的社交网络时,你经常可以在侧边栏看到所有朋友的列表,以及你的记录中的详细信息,例如你的姓名和工作地点。他们是如何找到这些数据的?他们会搜索所有包含你的 ID 的关系,返回参与的人员的姓名,并从你的个人记录中返回诸如职称之类的值。这看起来像是在使用两个查询:--返回关系信息—返回个人记录信息 这样做是可能的,但使用一个查询来完成这两件事要容易得多。
看看这个例子。警方想要知道一名罪犯(ID = 45)的姓名和城镇,以及他们所犯的所有罪行的描述
SELECT name, town, description --select things to return (from different tables)
FROM crooks, crime --name tables that data comes from
WHERE crook.Id = crime.crimId --specify the link dot.notation means table.field. The Ids are the same
AND crook.Id = 45 --specify which crook you are looking at
ORDER BY date ASC --order the results by the oldest first
WHERE 子句中使用的运算符
[edit | edit source]运算符 | 运算符的含义 | 示例 |
---|---|---|
= | 检查它们是否等效 | Id1 = 123 |
> 和 < | 检查一个字段是否大于或小于 |
|
<> | 检查它是否不等于 | Id1 <> 123 |
>= 和 <= | 类似于“> 和 <”,但也检查是否相等 |
|
OR | 如果左边、右边或两者都为真,则将被接受 | Id1 = 123 OR Id2 <> 444 |
AND | 只有当左边部分和右边部分都为真时,才会被接受 | Id1 = 123 AND Id2 <> 444 |
NOT | 反转语句的布尔值 | NOT Id1 = 123 |
IS NULL | 检查变量中是否包含一个空值 | Id1 IS NULL |
... BETWEEN ... AND ... | 检查某事物是否在某个范围内 | Id1 BETWEEN 2.8 AND 3.14159265 |