好的,我们继续这个系列。这是第二篇文章的完整内容。
【核心查询】万能的SELECT:如何从表中获取数据?
专辑: SQL快速上手:15篇入门到精通 标签: SQL SELECT 数据库查询 入门教程 数据检索
前言
在上一篇文章 【SQL启航】一切从这里开始:数据库与SQL核心概念 中,我们成功搭建了学习环境,并创建了包含顾客、产品和订单信息的三张表。我们的“数据世界”已经准备就绪。
今天,我们将学习SQL中最常用、也是最核心的命令:SELECT。
SELECT 语句的唯一目的就是从数据库表中**检索(Retrieve)**数据。你在SQL世界中90%以上的时间,都会花在和它打交道上。它就像是你在数据海洋中探索的潜水艇,能带你精准地到达任何你想去的地方,看到任何你想看的数据。
准备好了吗?让我们开始第一次真正的数据探索之旅!
小提示: 本文所有SQL代码,你都可以直接复制到上一篇安装好的数据库工具(如DB Browser for SQLite)的“执行SQL”窗口中运行,并立即看到结果。
1. 最基本的查询:SELECT ... FROM ...
SELECT 语句最简单的形式由两个关键字组成:SELECT 和 FROM。
SELECT 后面跟着你想要查看的列的名称。FROM 后面跟着你想要从哪个表中检索数据。
它的基本语法结构如下:
SELECT column_name
FROM table_name;
示例1:查询所有产品的名称
假设我们想知道我们的产品库里都有哪些产品。我们可以从 Products 表中选择 prod_name 这一列。
输入SQL:
SELECT prod_name
FROM Products;
执行结果:
prod_name倚天剑屠龙刀赤兔马方便面羽毛扇
看,就这么简单!我们成功地从Products表中取出了所有产品的名称。
2. 查询多个列
当然,我们通常不满足于只看一个信息。如果想同时查看产品的名称和价格呢?
很简单,只需要在 SELECT 后面用**逗号(,)**隔开你想要的多个列名即可。
示例2:查询产品名称和价格
输入SQL:
SELECT prod_name, prod_price
FROM Products;
执行结果:
prod_nameprod_price倚天剑6888.00屠龙刀7999.00赤兔马9999.00方便面5.50羽毛扇120.00
请注意:
SELECT后面列出的列名顺序,就是它们在结果中显示的顺序。你可以试着调换 prod_name 和 prod_price 的位置看看结果有何不同。最后一个列名后面不要加逗号。
3. 查询所有列:万能的 * 通配符
有时候,我们想查看一张表里的所有信息,一个列都不落下。如果表里有几十个列,一个一个地写出来显然太麻烦了。这时,我们可以使用**星号(*)**通配符。
* 代表“所有列”。
示例3:查询顾客表的所有信息
输入SQL:
SELECT *
FROM Customers;
执行结果:
cust_idcust_namecust_city1001刘备北京1002关羽上海1003张飞深圳1004赵云杭州1005曹操北京
使用建议: 虽然 * 非常方便,但在实际的开发工作中应谨慎使用。因为它会检索所有列,可能会获取到你并不需要的数据,从而降低查询效率,增加网络开销。最好的习惯是:只取你需要的列。 不过,在学习和探索新表的结构时,SELECT * 是一个非常棒的工具。
4. 去除重复行:DISTINCT 关键字
在上面的顾客表示例中,我们注意到“北京”这个城市出现了两次。如果我们只想知道我们的顾客都来自哪些不同的城市,该怎么办?
DISTINCT 关键字可以帮我们解决这个问题。它必须放在 SELECT 后面,列名之前。
示例4:查询顾客所在的城市(不重复)
输入SQL:
SELECT DISTINCT cust_city
FROM Customers;
执行结果:
cust_city北京上海深圳杭州
可以看到,结果中的“北京”只出现了一次。DISTINCT 自动帮我们过滤掉了重复的值。
注意: DISTINCT 作用于其后跟的所有列,而不仅仅是第一个列。例如,SELECT DISTINCT cust_name, cust_city 会返回唯一的“姓名和城市”组合。
5. 限制返回结果的数量:LIMIT 子句
当表中的数据非常多时(成千上万行),一次性把它们全都检索出来可能不是个好主意。我们可能只想“看一眼”数据长什么样,或者只需要前几条记录。
LIMIT 子句可以限制查询返回的行数。
示例5:只看前3个产品
输入SQL:
SELECT prod_name
FROM Products
LIMIT 3;
执行结果:
prod_name倚天剑屠龙刀赤兔马
LIMIT 也可以接受两个参数,用于实现分页功能。LIMIT offset, count 表示跳过 offset 行,然后取 count 行。
示例6:从第2行开始,取3条产品数据
输入SQL:
-- 跳过第1行,从第2行开始取
SELECT prod_name
FROM Products
LIMIT 1, 3;
执行结果:
prod_name屠龙刀赤兔马方便面
数据库兼容性提示: LIMIT 的语法在 MySQL, PostgreSQL, 和 SQLite 中是通用的。但在其他一些数据库系统(如 SQL Server)中,可能会使用 TOP 关键字来实现类似功能。
6. 好习惯:给你的SQL加点注释
当SQL语句变得越来越复杂时,为它添加注释是一个非常好的习惯。注释可以帮助他人(以及未来的你)快速理解代码的意图。
SQL中的注释主要有两种:
单行注释: 使用 -- (两个减号)。从 -- 开始,到这一行结束的所有内容都会被当作注释。多行注释: 使用 /* ... */。可以跨越多行。
示例7:带注释的查询
/*
这是一个多行注释。
下面的查询是为了获取所有产品的名称和价格,
但只显示前3条记录。
*/
SELECT
prod_name, -- 我想要产品的名字
prod_price -- 以及产品的价格
FROM
Products -- 从产品表中获取
LIMIT 3; -- 只看前3个
注释部分不会被数据库执行,它们只为阅读代码的人服务。
总结与展望
太棒了!你已经掌握了SQL数据检索的根基。
在今天的文章中,我们学习了:
使用 SELECT ... FROM ... 进行最基本的查询。如何选择单个、多个或所有列。使用 DISTINCT 关键字去除重复的结果。使用 LIMIT 子句限制输出的行数。如何为SQL代码添加注释。
现在,你已经可以从数据库中取出你想要的数据了。但这还不够,我们取出的数据是无序的,而且是全量的。如果我想找到价格最贵的产品,或者只看“北京”的顾客怎么办?
别担心,这正是我们下一篇文章要解决的问题。
下一篇预告:【排序与筛选】让数据井井有条:ORDER BY与WHERE子句
敬请期待!