SQL代表结构化查询语言(Structured Query Language),是一种与存储在关系数据库中的数据进行交互的语言。

表(Table)的介绍

我们可以将关系数据库视为表的集合。

  • 一个表只是一组行和列,就像一个电子表格一样,只代表一种类型的实体(entity)。例如,一个表可以表示公司的员工或交易情况,但不能同时表示这两种情况。
  • 表的每一行或记录(record)都包含有关单个实体的信息。例如,在表示雇员的表中,每行表示一个人。
  • 表的每一列或字段(field)都包含表中所有行的单个属性。例如,在表示员工的表中,我们可能有一列包含所有员工的名字和姓氏。

员工表可能如下所示:

idnameagenationality
1Jessica22Ireland
2Gabriel48France
3Laura36USA

SELECT 语句

查询是从数据库表(或表的组合)请求数据。查询是数据科学家的一项基本技能,因为分析所需的数据通常存在于数据库中。

选择某一列

在SQL中,可以使用select语句从表中选择数据。例如,以下查询从people表中选择name列:

SELECT name
FROM people;

在这个查询中,SELECTFROM被称为关键字(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;

COUNTDISTINCT结合起来计算列中不同值的数量也是很常见的。
例如,此查询统计人员表中包含的不同出生日期数:

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一起使用,

  1. %通配符将匹配文本中的零个、一个或多个字符。例如,以下查询将从companies表中匹配 “Data”、 “DataC”、 “DataCamp”、 “DataMind”等公司:
SELECT name
FROM companies
WHERE name LIKE 'Data%';
  1. _ 通配符将匹配单个字符。例如,以下查询匹配“DataCamp”、“DataComp”等公司:
SELECT name
FROM companies
WHERE name LIKE 'DataC_mp';

我们还可以使用NOT LIKE操作符查找与指定模式不匹配的记录。

更多推荐

SQL新手入门 详细总结笔记(一)