SQL代表结构化查询语言(Structured Query Language),是一种与存储在关系数据库中的数据进行交互的语言。
表(Table)的介绍
我们可以将关系数据库视为表的集合。
- 一个表只是一组行和列,就像一个电子表格一样,只代表一种类型的实体(entity)。例如,一个表可以表示公司的员工或交易情况,但不能同时表示这两种情况。
- 表的每一行或记录(record)都包含有关单个实体的信息。例如,在表示雇员的表中,每行表示一个人。
- 表的每一列或字段(field)都包含表中所有行的单个属性。例如,在表示员工的表中,我们可能有一列包含所有员工的名字和姓氏。
员工表可能如下所示:
id | name | age | nationality |
---|---|---|---|
1 | Jessica | 22 | Ireland |
2 | Gabriel | 48 | France |
3 | Laura | 36 | USA |
SELECT 语句
查询是从数据库表(或表的组合)请求数据。查询是数据科学家的一项基本技能,因为分析所需的数据通常存在于数据库中。
选择某一列
在SQL中,可以使用select
语句从表中选择数据。例如,以下查询从people
表中选择name
列:
SELECT name
FROM people;
在这个查询中,SELECT
和FROM
被称为关键字(keywords)。在SQL中,关键字不区分大小写,即上述代码与以下这个查询相同:
select name
from people;
因此,将SQL关键字大写是一种很好的做法,这可以将它们与查询的其他部分(如列名和表名)区分开来。此外,在查询的末尾加上分号也是一种很好的做法,这将告诉SQL查询的结束位置
选择多列
在现实世界中,通常需要用到多个列的数据,而这一点在SQL中很容易实现。
要从表中选择多列,只需用逗号分隔列名
例如,此查询从“people
”表中选择两列“name
”和“birthdate
”:
SELECT name, birthdate
FROM people;
有时,可能需要从表中选择所有列。这里则用到 select *
SELECT *
FROM people;
如果只想返回一定数量的结果,可以使用LIMIT
关键字限制返回的行数:
SELECT *
FROM people
LIMIT 10;
SELECT DISTINCT
结果通常会包含许多重复值。如果要从列中选择所有唯一值,可以使用DISTINCT
关键字。
例如,如果您有兴趣了解films
表中有 哪些不同的语言,这可能很有用:
SELECT DISTINCT language
FROM films;
COUNT 语句
假如我们有一张employees表,应该如何计算总雇员数?
COUNT
语句允许通过返回一列或多列中的行数来解决该问题。
例如,此代码给出people
表中的行数:
SELECT COUNT(*)
FROM people;
可以看到,COUNT(*)
告诉我们一个表中有多少行。但是,如果要计算特定列中未丢失值(non-missing values)的数量,可以仅对该列调用count
。
例如,要计算人员表中的出生日期数,可以执行以下操作:
SELECT COUNT(birthdate)
FROM people;
将COUNT
与DISTINCT
结合起来计算列中不同值的数量也是很常见的。
例如,此查询统计人员表中包含的不同出生日期数:
SELECT COUNT(DISTINCT birthdate)
FROM people;
用WHERE 进行筛选(filter)
在SQL中,WHERE
关键字允许您根据表中的文本值和数字值进行筛选。
有以下几种不同的比较运算符:
= 相等
<> 不相等
< 小于
> 大于
<= 小于或等于
= 大于或等于
通过这个关键字,我们可以过滤文本记录,例如标题。
以下代码返回标题为“Metropolis”的所有影片:
SELECT title
FROM films
WHERE title = 'Metropolis';
注意: WHERE子句总是在FROM语句之后
根据SQL标准, 我们将使用 <>
而不是 !=
来作为不等 运算符。
简单的数值过滤
WHERE
子句还可以用于过滤数字记录,例如年份或年龄。
例如,以下查询将筛选出预算超过一万美元的电影的所有详细信息:
SELECT *
FROM films
WHERE budget > 10000;
简单的文本过滤
WHERE
子句还可以用于过滤文本结果,例如名称或国家。
例如,此查询获取在中国拍摄的所有电影的标题:
SELECT title
FROM films
WHERE country = 'China';
WHERE AND
通常,我们需要基于多个条件选择数据。这可以通过将多个条件与AND关键字组合来构建WHERE查询实现。例如,
SELECT title
FROM films
WHERE release_year > 1994
AND release_year < 2000;
可以用来获得1994年到2000年间发行的电影的片名。
需要注意的是,需要为每个AND条件分别指定列名,因此以下内容*!!无效!!*
:
SELECT title
FROM films
WHERE release_year > 1994 AND < 2000;
WHERE AND OR
如果要基于多个条件选择行,其中需要满足部分但不是全部条件,该怎么办?
为此,SQL有OR运算符。
例如,以下代码返回 films 表中1994年或2000年发行的所有电影:
SELECT title
FROM films
WHERE release_year = 1994
OR release_year = 2000;
和上部分内容相同,我们需要为每个或条件指定列。
当组合AND和OR时,请确保将各个子句括在括号中,如下所示:
SELECT title
FROM films
WHERE (release_year = 1994 OR release_year = 1995)
AND (certification = 'PG' OR certification = 'R');
BETWEEN
当我们需要筛选的某一列值在 一个范围内时,我们可以利用 >
, <
和 and
来实现;
同时, sql 也提供between 关键字用于筛选指定范围内的值。例如,可以使用以下查询来获取1994年至2000年间发行的所有电影的标题:
#method 1
SELECT title
FROM films
WHERE release_year >= 1994
AND release_year <= 2000;
#method 2
SELECT title
FROM films
WHERE release_year
BETWEEN 1994 AND 2000;
WHERE IN
由上可见,WHERE对于过滤结果非常有用。但是,如果想基于许多条件进行过滤,WHERE会变得笨拙。例如:
SELECT name
FROM kids
WHERE age = 2
OR age = 4
OR age = 6
OR age = 8
OR age = 10;
而IN运算符允许我们在WHERE子句中指定多个值,从而使指定多个或多个条件变得更容易、更快,更整洁。由此,上面的代码可以改写为:
SELECT name
FROM kids
WHERE age IN (2, 4, 6, 8, 10);
NULL 和 IS NULL
在SQL中,NULL表示缺少或未知的值。可以使用表达式IS NULL
检查空值。例如,要计算人员表中缺少的出生日期数,请执行以下操作:
SELECT COUNT(*)
FROM people
WHERE birthdate IS NULL;
可见,is null
在与WHERE结合起来找出丢失的数据时非常有用。
有时,我们需要过滤掉缺失的值,以便只得到不为NULL的结果。为此,可以使用IS NOT NULL
运算符。
例如,此查询提供了在people
表中没有缺少出生日期的所有人员的姓名。
SELECT name
FROM people
WHERE birthdate IS NOT NULL;
LIKE 和NOT LIKE
WHERE子句可用于过滤文本数据。但是,到目前为止,只能通过指定确切的文本来进行筛选。在现实世界中,通常需要搜索模式(pattern)而不是特定的文本字符串。
在SQL中,可以在WHERE
子句中使用LIKE
运算符来搜索列中的模式。要实现这一点,可以使用通配符作为其他值的占位符。有两个通配符可和LIKE
一起使用,
%
通配符将匹配文本中的零个、一个或多个字符。例如,以下查询将从companies
表中匹配 “Data”、 “DataC”、 “DataCamp”、 “DataMind”等公司:
SELECT name
FROM companies
WHERE name LIKE 'Data%';
_
通配符将匹配单个字符。例如,以下查询匹配“DataCamp”、“DataComp”等公司:
SELECT name
FROM companies
WHERE name LIKE 'DataC_mp';
我们还可以使用NOT LIKE
操作符查找与指定模式不匹配的记录。
更多推荐
SQL新手入门 详细总结笔记(一)
发布评论