跳转到内容

数据库基础:SELECT

来自维基教科书,开放的书籍,面向开放的世界

试卷 2 - ⇑ 数据库基础 ⇑

← 结构化查询语言 (SQL) SELECT UPDATE →


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 语句

使用罪犯数据集,编写 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
  • Id1 < 123
<> 检查它是否不等于 Id1 <> 123
>=<= 类似于“><”,但也检查是否相等
  • 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
华夏公益教科书