前面的两篇文章,小鱼为大家介绍了数据库和数据库管理软件 MySQL 的基本概念。本节呢,我们先来学习基本的 SQL 查询语句,以实现和 DBMS 的交流,完成基本的检索操作。
注:如果大家和小鱼一样,不想在个人笔记本上安装数据库,也没有买云主机、云数据库这些,学习 SQL 最简单的办法就是在线练习,比如牛客网这样的平台,也可以使用 SQLite 数据库,SQLite 把数据文件存储在一个单独的文件里。
小鱼下载了一个现成的 SQLite 文件,这样就免去建表、插入数据的麻烦了,因为对于我们数据分析师而言,重点掌握查询语句就好啦~如何设计对象关系模型、设计表等等都是工程师的 tip 。
注:SQLite 文件下载地址为 https://forta.com/books/0135182794/
![]()
SQL 语句由一个或多个关键字构成,其中最长使用的关键词就是 SELECT 了。SELECT 语句用于从一个或多个表中检索数据。
SELECT 检索数据时,必须至少给出两个信息:想检索什么信息?从哪些地方检索?
检索单个列
商品表 Products 中的内容如下:
检索出所有的产品名称:
SELECT prod_name
FROM Products;
上述语句从 Products 表中检索出 prod_name 列的全部内容:
注 1:返回结果没有过滤,也没有排序。
注 2:多条 SQL 语句必须使用分号分隔,虽然有的 DBMS 不要求在单条 SQL 结束时加上分号,但养成以分号结束一条 SQL 是个不错的习惯。
注 3:SQL 语句不许分大小写,也就是说 SELECT 和 select 是一样的。但强烈建议对所有 SQL 关键字使用大写,列名和表名使用小写。这样整个 SQL 会更清晰,便于后期的维护。
注 4:SQL 语句被执行时,所有的空格都会被忽略。我们可以将 SQL 1 行书写完,也可以像小鱼这样清晰地写到多行。
检索多个列
检索多个列时只需要在 SELECT 关键字之后,将多个列的列名以逗号作为分隔符列出即可。
SELECT prod_id, prod_name, prod_price
FROM Products;
上述 SQL 将依次检索出 Products 表中的 prod_id prod_name prod_price 列的全部内容:
检索所有列
使用 SELECT * 可以直接检索出所有列:
SELECT *
FROM Products;
使用通配符
*检索所有列的好处在于,在不知道列名的情况下可以列出所有列;缺点在于当数据量庞大的时候,响应速度是非常慢的。
以上在检索时,我们只讨论了列如何选择,返回的结果都包含了所有的记录(行),接下来我们来讨论如何对返回的行做一些限定。
检索内容不同的行(去重)
检索所有厂商的 ID:
SELECT vend_id
FROM Products;
目前检索出的厂商 ID 中存在大量重复的记录,实际的厂商 ID 只有 3 种类型。那如何只检索不同的值呢?答案就是使用 DISTINCT 关键字。
SELECT DISTINCT vend_id
FROM Products;
去重检索结果:
另外,需要我们注意的是 DISTINCT 关键字应用于所有的列,不仅仅是它后面的那个列。也就是对后面所有列组合后的返回结果去重。比如在不去重时:
SELECT vend_id, prod_price
FROM Products;
从 vend_id 和 prod_price 整体返回来看,重复的记录如下:
使用 DISTINCT 关键字去重:
SELECT DISTINCT vend_id, prod_price
FROM Products;
去重检索结果:
限定返回的行
大多数 DBMS 都支持使用 LIMIT 关键字限定返回的行数。比如下面的检索,返回前 5 行检索到的内容:
SELECT prod_name
FROM Products
LIMIT 5;
检索结果:
还可以使用 LIMIT n OFFSET m 指定检索的开始行和行数,也就是在返回指定行数的前提前,添加一个偏置项,表示从 m 行开始。下面的 SQL 语句从第 5 行开始,对多返回 5 行:
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;
这里只有 4 行是因为我们的表中一共就只有 9 行~
注:行的索引从 0 开始,也就是说
OFFSET 5其实是从第 6 条记录开始返回的。
关于注释
SQL 语句中的单行注释使用 -- 开始,多行注释使用 /* 开始,*/ 结束。下面是小鱼本节输入的所有 SQL ,由于前面的 SQL 都注释了,每次运行时,将只运行最新的 SQL:
-- SELECT prod_name
-- FROM Products;
/*SELECT prod_id, prod_name, prod_price
FROM Products;*/
-- SELECT *
-- FROM Products;
-- SELECT DISTINCT vend_id
-- FROM Products;
/*SELECT DISTINCT vend_id, prod_price
FROM Products;*/
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;












网友评论