SQL 是什么?一篇入门介绍搞懂它 – wiki基地


SQL 是什么?一篇入门介绍搞懂它

引言:数据时代的基石

在当今这个信息爆炸的时代,数据无处不在。从社交媒体的动态、电商平台的订单、银行的交易记录,到科学研究的实验结果、企业的运营报表,数据构成了现代世界的骨架。然而,仅仅拥有数据是不够的,如何高效地存储、管理、检索和分析这些海量数据,成为了一个核心问题。

想象一下,如果所有的数据都只是杂乱无章地堆在一起,就像一个没有分类、没有索引的巨大仓库,你想找到某个特定的信息将是 Mission Impossible(不可能的任务)。我们需要一种结构化的方式来组织数据,以及一种通用的语言来与这些数据进行交互。

这就是数据库系统的作用,而 SQL,正是与大多数主流数据库系统沟通的标准语言。掌握 SQL,意味着你拥有了与数据对话的能力,能够从庞大的数据海洋中提取有价值的信息,无论是进行数据分析、开发应用程序,还是管理企业资源,SQL 都是一项不可或缺的技能。

那么,SQL 究竟是什么?它为什么如此重要?本文将带你深入浅出地了解 SQL 的世界。

1. SQL 的真面目:它叫什么?做什么?

首先,让我们揭开 SQL 的神秘面纱。

SQLStructured Query Language 的缩写,中文意为“结构化查询语言”。

简单来说,SQL 是一种用于管理关系数据库的标准语言

  • 结构化 (Structured): 意味着数据在数据库中是按照预定的结构(通常是表格形式)存储的,而不是随意存放。
  • 查询 (Query): 表明 SQL 的核心功能之一是检索(查询)数据。当然,它能做的远不止查询,还能修改、添加、删除数据,以及定义和管理数据库的结构。
  • 语言 (Language): 它是一套语法规则,你用这套规则编写命令,数据库管理系统(DBMS)就能理解并执行这些命令。

SQL 于 20世纪70年代初在 IBM 的圣何塞研究实验室开发,最初命名为 SEQUEL (Structured English Query Language)。后来由于商标问题,名称被缩短为 SQL。它很快成为关系数据库领域的标准语言,并由 ANSI(美国国家标准协会)和 ISO(国际标准化组织)进行了标准化。

2. 为什么需要 SQL?——关系数据库的黄金搭档

要理解 SQL 的重要性,首先需要了解它主要服务的对象:关系数据库(Relational Database)

关系数据库是目前最常见、应用最广泛的数据库类型。它的核心思想是使用表格(Table)来组织数据。每个表格都有一个特定的名称(例如:CustomersProductsOrders),由行(Row,也称为记录 Record)列(Column,也称为字段 Field)组成。

  • 表格 (Table): 类似于电子表格(如 Excel)中的一个工作表。它存储某一类特定数据,比如所有客户的信息,或所有产品的信息。
  • 列 (Column): 定义了表格中存储的数据类型。例如,一个 Customers 表可能有 CustomerID(客户编号)、CustomerName(客户姓名)、Email(电子邮件)、City(城市)等列。每一列都有一个特定的数据类型(如整数、文本、日期等)。
  • 行 (Row): 代表表格中的一条具体记录。例如,Customers 表中的一行可能代表一个具体的客户及其所有的信息(一个 CustomerID,一个 CustomerName,一个 Email,一个 City)。

关系数据库之所以“关系”,是因为不同的表格之间可以建立关联。例如,一个 Orders 表可以通过 CustomerID 列与 Customers 表关联起来,通过 ProductID 列与 Products 表关联起来。这种关联(关系)使得我们可以方便地查询跨越多个表格的数据,比如“查找订购了特定产品的客户的姓名”。

在这种结构化的表格体系下,SQL 提供了以下关键能力:

  1. 数据检索 (Data Retrieval): 这是 SQL 最基本也是最重要的功能。你可以精确地从一个或多个表格中找出你想要的数据,可以指定要哪些列、哪些行,甚至按照特定的条件进行过滤和排序。
  2. 数据操纵 (Data Manipulation): 你可以使用 SQL 向表格中添加新数据、修改已有的数据、删除不再需要的数据。
  3. 数据定义 (Data Definition): 你可以使用 SQL 定义数据库的结构,比如创建新的表格、定义每个列的名称和数据类型、设置主键(用于唯一标识每一行)、建立表之间的关系、创建索引以提高查询速度等。
  4. 数据控制 (Data Control): SQL 允许你管理数据库用户的权限,控制谁可以访问哪些数据、执行哪些操作,保证数据的安全性和完整性。

没有 SQL,管理和操作大型关系数据库将变得极其困难和低效。SQL 提供了一种标准、高效、灵活的方式来与数据库交互,使得数据的管理和利用变得可行。

3. SQL 是怎样工作的?——与数据库管理系统(DBMS)对话

SQL 本身只是一种语言规范,就像英语是一种语言规范一样。要真正使用 SQL,你需要一个能够理解和执行 SQL 命令的软件,这个软件就是数据库管理系统(Database Management System,简称 DBMS)

常见的关系型 DBMS 包括:

  • MySQL
  • PostgreSQL
  • Oracle Database
  • Microsoft SQL Server
  • SQLite
  • IBM Db2

这些 DBMS 都是基于 SQL 标准实现的,但它们也可能有各自的方言(SQL Dialect),就像不同的中文方言一样,大部分核心语法是通用的,但在一些高级特性或细节上可能存在差异。

SQL 工作流程通常是这样的:

  1. 你(用户或应用程序) 编写一条 SQL 命令(也称为 SQL 语句或 SQL 查询)。
  2. 通过客户端工具(如命令行界面、图形化数据库工具,或者应用程序代码)将这条 SQL 命令发送给 DBMS
  3. DBMS 接收到 SQL 命令后,会对其进行解析(Parse),检查语法是否正确。
  4. 如果语法正确,DBMS 会生成一个执行计划(Execution Plan),确定如何最有效地执行这条命令(例如,如何找到需要的数据、如何更新等等)。
  5. DBMS 按照执行计划与数据库文件(实际存储数据的物理文件)进行交互,执行相应的操作(读取数据、写入数据、修改数据结构等)。
  6. DBMS 将执行结果(如果是查询操作,则返回数据;如果是修改操作,则返回操作成功的状态信息)返回给

这个过程对用户是透明的,你只需要编写 SQL 命令并发送即可,无需关心数据具体存储在哪里、DBMS 内部如何查找数据等细节。

4. SQL 的语言类型:声明式 vs. 命令式

与其他许多编程语言(如 Python, Java, C++)不同,SQL 主要是一种声明式语言(Declarative Language)

  • 声明式语言: 你告诉计算机你想要什么结果,而不是告诉它一步一步地怎么做来实现这个结果。比如,在 SQL 中你写 SELECT * FROM Students WHERE Major = 'Computer Science';,你声明你想要所有专业是“计算机科学”的学生的所有信息。你不需要写一个循环去遍历所有学生记录,然后检查他们的专业。DBMS 会自己决定如何最高效地找到这些数据。
  • 命令式语言 (Imperative Language): 你告诉计算机如何一步一步地做。比如,在 Python 中你可能会写一个循环去遍历列表,然后用 if 语句判断条件,满足条件的就进行某种操作。

SQL 的声明式特性使得它非常适合数据处理任务,因为你可以专注于数据的逻辑需求,而将具体的执行细节交给强大的 DBMS 去优化。

5. SQL 的四大金刚:命令分类(DDL, DML, DCL, TCL)

SQL 命令可以按照其功能大致分为以下四大类:

  1. 数据定义语言 (Data Definition Language, DDL)

    • 用于定义、修改和删除数据库对象的结构,如表格、视图、索引等。
    • 主要命令:
      • CREATE: 创建数据库、表格、视图、索引等。
      • ALTER: 修改现有数据库对象的结构。
      • DROP: 删除数据库对象。
      • TRUNCATE: 快速删除表格中的所有数据(结构保留)。
      • RENAME: 重命名对象。
  2. 数据操纵语言 (Data Manipulation Language, DML)

    • 用于对数据库中的数据进行增、删、改、查操作。这是我们日常使用 SQL 最多的部分。
    • 主要命令:
      • SELECT: 从数据库中检索数据。
      • INSERT: 向表格中插入新数据。
      • UPDATE: 修改表格中已有的数据。
      • DELETE: 删除表格中的数据。
  3. 数据控制语言 (Data Control Language, DCL)

    • 用于控制数据库用户的权限,管理谁可以访问哪些数据和执行哪些操作。
    • 主要命令:
      • GRANT: 授予用户对数据库对象的权限。
      • REVOKE: 收回用户对数据库对象的权限。
  4. 事务控制语言 (Transaction Control Language, TCL)

    • 用于管理数据库事务。事务是一系列数据库操作的集合,这些操作要么全部成功执行,要么全部失败回滚,以保证数据的完整性和一致性。
    • 主要命令:
      • COMMIT: 提交事务,将所有更改永久保存到数据库。
      • ROLLBACK: 回滚事务,撤销自上次 COMMIT 或 ROLLBACK 以来所做的所有更改。
      • SAVEPOINT: 在事务中设置一个保存点,允许部分回滚到该点。

对于初学者来说,DML (SELECT, INSERT, UPDATE, DELETE) 和最基本的 DDL (CREATE TABLE, DROP TABLE) 是最先需要掌握的核心内容。

6. SQL 入门:最常用的 DML 命令详解(带简单示例)

让我们通过一些简单的例子来感受一下 SQL 的魅力。假设我们有一个名为 Students 的表格,包含以下列:StudentID (整数,主键), Name (文本), Major (文本), EnrollmentDate (日期)。

6.1 CREATE TABLE: 定义表格结构 (DDL)

首先,你需要创建这个表格来存储数据:

sql
-- 创建一个名为 Students 的表格
CREATE TABLE Students (
StudentID INT PRIMARY KEY, -- 学生ID,整数类型,设为主键(唯一标识每行)
Name VARCHAR(255), -- 姓名,可变长度字符串,最大255个字符
Major VARCHAR(255), -- 专业,可变长度字符串
EnrollmentDate DATE -- 入学日期,日期类型
);

解释:
* CREATE TABLE Students: 告诉数据库你要创建一个名为 Students 的新表格。
* 括号内的内容定义了表格的列:
* StudentID INT PRIMARY KEY: 创建一个名为 StudentID 的列,数据类型是 INT(整数),并将其设为 PRIMARY KEY(主键)。主键的值必须唯一,且不能为空,用于唯一标识表格中的每一行。
* Name VARCHAR(255): 创建一个名为 Name 的列,数据类型是 VARCHAR(可变长度字符串),最大长度为 255 个字符。
* Major VARCHAR(255): 创建一个名为 Major 的列,数据类型是 VARCHAR
* EnrollmentDate DATE: 创建一个名为 EnrollmentDate 的列,数据类型是 DATE
* 每列的定义之间用逗号 , 分隔。
* 语句以分号 ; 结束(虽然很多数据库不强制要求,但这是一个好习惯)。

6.2 INSERT INTO: 添加新数据 (DML)

表格建好了,现在我们可以向其中插入数据:

“`sql
— 插入一条学生记录
INSERT INTO Students (StudentID, Name, Major, EnrollmentDate)
VALUES (101, ‘张伟’, ‘数据科学’, ‘2023-09-01’);

— 插入另一条学生记录
INSERT INTO Students (StudentID, Name, Major, EnrollmentDate)
VALUES (102, ‘王芳’, ‘计算机科学’, ‘2023-09-01’);

— 插入更多记录
INSERT INTO Students (StudentID, Name, Major, EnrollmentDate)
VALUES
(103, ‘李明’, ‘计算机科学’, ‘2023-09-01’),
(104, ‘赵丽’, ‘人工智能’, ‘2023-09-01’);
“`

解释:
* INSERT INTO Students: 告诉数据库你要向 Students 表格插入数据。
* (StudentID, Name, Major, EnrollmentDate): 指定了要插入数据的列的顺序。这要求 VALUES 子句中提供的值也按照这个顺序排列。如果提供了所有列的值,可以省略列名列表(但不推荐,因为如果表格结构改变,语句可能失效)。
* VALUES (...): 指定要插入的具体值。值的顺序必须与前面指定的列顺序一致。文本值和日期值通常用单引号 ' 包围。

6.3 SELECT: 查询数据 (DML)

这是使用最频繁的命令。你可以用它从表格中检索你想要的数据。

sql
-- 查询 Students 表格中的所有列和所有行
SELECT * FROM Students;

解释:
* SELECT *: * 是通配符,表示选择所有列。
* FROM Students: 指定从哪个表格中查询数据。

这将返回类似下面的结果:

StudentID Name Major EnrollmentDate
101 张伟 数据科学 2023-09-01
102 王芳 计算机科学 2023-09-01
103 李明 计算机科学 2023-09-01
104 赵丽 人工智能 2023-09-01

查询特定列:

sql
-- 只查询学生ID和姓名
SELECT StudentID, Name FROM Students;

解释:
* 你可以用逗号分隔列名,来指定你想要查询的特定列。

使用 WHERE 子句过滤数据:

WHERE 子句用于指定筛选条件,只返回符合条件的行。

sql
-- 查询专业是“计算机科学”的学生的所有信息
SELECT * FROM Students
WHERE Major = '计算机科学';

解释:
* WHERE Major = '计算机科学': 这是筛选条件。它只选择 Major 列的值等于 '计算机科学' 的那些行。

使用比较运算符 (=, !=<>, >, <, >=, <=):

“`sql
— 查询学生ID大于102的学生
SELECT * FROM Students WHERE StudentID > 102;

— 查询入学日期晚于2023年9月1日的学生 (如果数据有差异)
SELECT * FROM Students WHERE EnrollmentDate > ‘2023-09-01’;
“`

使用逻辑运算符 (AND, OR, NOT):

“`sql
— 查询专业是“计算机科学” 且 学生ID小于等于103的学生
SELECT * FROM Students
WHERE Major = ‘计算机科学’ AND StudentID <= 103;

— 查询专业是“计算机科学” 或 专业是“人工智能”的学生
SELECT * FROM Students
WHERE Major = ‘计算机科学’ OR Major = ‘人工智能’;

— 查询专业不是“数据科学”的学生
SELECT * FROM Students
WHERE NOT Major = ‘数据科学’;
— 或者更简洁地:
SELECT * FROM Students
WHERE Major != ‘数据科学’;
“`

SELECT 还有很多高级用法,如排序 (ORDER BY)、分组 (GROUP BY)、聚合函数 (COUNT, SUM, AVG, MAX, MIN)、连接 (JOIN) 等,这些是 SQL 强大的数据分析能力的体现,但作为入门,先理解 SELECTWHERE 是基础。

6.4 UPDATE: 修改数据 (DML)

UPDATE 命令用于修改表中已有的数据。

sql
-- 将学生ID为101的学生的专业修改为“大数据”
UPDATE Students
SET Major = '大数据'
WHERE StudentID = 101;

解释:
* UPDATE Students: 告诉数据库你要更新 Students 表格。
* SET Major = '大数据': 指定要修改的列及其新值。可以同时修改多个列,用逗号分隔(例如:SET Major = '大数据', EnrollmentDate = '2023-09-05')。
* WHERE StudentID = 101: 重要! WHERE 子句指定了要更新哪些行。如果你省略了 WHERE 子句,那么表格中的所有行的 Major 列都将被修改为“大数据”! 在执行 UPDATE 命令时,务必小心使用 WHERE 子句。

6.5 DELETE FROM: 删除数据 (DML)

DELETE FROM 命令用于从表格中删除数据。

sql
-- 删除学生ID为104的学生记录
DELETE FROM Students
WHERE StudentID = 104;

解释:
* DELETE FROM Students: 告诉数据库你要从 Students 表格中删除数据。
* WHERE StudentID = 104: 重要! WHERE 子句指定了要删除哪些行。如果你省略了 WHERE 子句,那么表格中的所有行都将被删除! 在执行 DELETE 命令时,务必小心使用 WHERE 子句。

删除所有数据 (但保留表格结构):

如果你想删除表格中的所有记录,可以使用 TRUNCATE TABLE 命令(属于 DDL),它通常比 DELETE FROM 不带 WHERE 子句更快速和高效,因为它通常不会逐行删除,而是释放整个存储空间。

sql
-- 删除 Students 表格中的所有数据
TRUNCATE TABLE Students;

请注意:TRUNCATE TABLE 通常是不可回滚的(取决于具体的 DBMS 和配置),不像 DELETE FROM 在事务中可以回滚。

6.6 DROP TABLE: 删除表格 (DDL)

如果你不再需要整个表格及其所有数据和结构,可以使用 DROP TABLE 命令。

sql
-- 删除 Students 表格
DROP TABLE Students;

解释:
* DROP TABLE Students: 永久删除名为 Students 的表格。一旦执行,表格及其所有数据都将丢失,且通常无法恢复。请谨慎使用此命令。

7. SQL 的应用场景:无处不在的数据语言

SQL 的应用范围极其广泛,几乎所有涉及到数据存储和管理的地方都能看到它的身影:

  • Web 开发后端: 大多数网站和网络应用程序的后端都需要数据库来存储用户信息、文章、商品、订单等数据。开发者使用 SQL 从数据库中读取和写入数据。
  • 数据分析与商业智能 (BI): 数据分析师和 BI 专业人士使用 SQL 来提取、清洗、转换和分析存储在数据库中的数据,生成报告和洞察。
  • 数据科学与机器学习: 数据科学家经常需要使用 SQL 来获取用于模型训练和评估的数据集。
  • 企业资源规划 (ERP) 和客户关系管理 (CRM) 系统: 这些大型企业应用都依赖于强大的关系数据库和 SQL 来管理复杂的业务流程和客户信息。
  • 金融行业: 银行、证券交易所等使用 SQL 来管理交易记录、账户信息等。
  • 医疗健康: 医院和医疗机构使用 SQL 来管理病历、预约、药品库存等。
  • 移动应用程序: 许多移动应用(尤其是需要离线能力的)使用轻量级关系数据库(如 SQLite)来在设备本地存储数据,并使用 SQL 进行操作。
  • 游戏开发: 一些游戏使用数据库存储玩家数据、游戏进度、物品信息等。

可以说,任何需要结构化地存储和管理大量数据的场景,SQL 都是一个强大的工具。

8. 为什么你应该学习 SQL?

学习 SQL 带来的好处是多方面的:

  1. 职业机会: SQL 是许多技术职位(如后端开发工程师、数据分析师、数据科学家、数据库管理员 DBA、商业智能工程师、数据工程师等)的核心技能要求。掌握 SQL 可以显著增加你的就业机会和职业发展空间。
  2. 数据理解能力: 即使你的工作不直接与数据库打交道,理解 SQL 也能帮助你更好地理解数据是如何组织和工作的,提升你的数据素养。
  3. 独立获取数据: 你不再需要依赖他人来为你提取数据。只要有数据库访问权限,你就可以自己编写查询,快速获取你需要的信息,提高工作效率。
  4. 与其他技术的结合: SQL 可以轻松地与各种编程语言(Python, Java, Node.js 等)结合使用,在应用程序中实现数据库交互。
  5. 相对易于入门: 与一些复杂的编程语言相比,SQL 的核心概念和语法相对直观,特别是查询部分,更接近自然语言的表达方式,因此入门门槛相对较低。

9. SQL 的“方言”:标准与差异

正如前面提到的,虽然 SQL 有国际标准 (ANSI/ISO SQL),但不同的数据库管理系统(如 MySQL, PostgreSQL, SQL Server, Oracle)在实现时会加入自己特有的功能、语法或优化方式,形成了各自的“方言”。

对于初学者来说,无需过度担心方言问题。核心的 DDL 和 DML 命令(CREATE TABLE, SELECT, INSERT, UPDATE, DELETE, WHERE, JOIN, GROUP BY 等)在大多数主流数据库中是高度相似且通用的。当你深入学习并需要使用特定 DBMS 的高级特性时,再去了解其 specific dialect 即可。

选择哪种 SQL 方言入门通常取决于你的学习目标或你将要使用的具体技术栈。MySQL 和 PostgreSQL 是非常流行的开源选择,SQLite 适合学习和本地应用,SQL Server 和 Oracle 则常用于企业级应用。

10. 如何开始学习 SQL?实践是关键!

理论知识讲了不少,但学习 SQL 最好的方式是动手实践

以下是一些入门建议:

  1. 选择一个 DBMS 或学习平台:

    • 在线交互式平台: 许多网站提供在线的 SQL 编辑器和练习题,例如 LeetCode 的数据库部分、SQLZoo、Mode Analytics 的 SQL 教程等。这是最快速的入门方式,无需安装任何软件。
    • 安装一个本地 DBMS: 安装 MySQL 或 PostgreSQL 等开源数据库到你的电脑上,使用命令行客户端或图形化工具(如 DBeaver, pgAdmin, MySQL Workbench)进行操作。这能让你更全面地体验数据库环境。SQLite 是一个轻量级的选择,只需要一个文件就可以创建一个数据库,适合快速上手。
    • 使用教学软件或网站: 许多在线课程平台(如 Coursera, edX, Udemy, 慕课网, Bilibili 上的教程)提供结构化的 SQL 课程。
  2. 从基础语法开始: 集中精力掌握 SELECT, INSERT, UPDATE, DELETE 以及 CREATE TABLEALTER TABLEDROP TABLE 的基本用法。理解 WHERE 子句进行条件过滤是关键。

  3. 理解关系: 学习如何通过主键和外键在不同表格之间建立关系,以及如何使用 JOIN 操作来组合来自多个表格的数据。

  4. 练习,练习,再练习: 找一些示例数据集,自己动手写查询、插入、更新、删除语句。尝试解决各种数据提取和分析问题。

  5. 学习高级主题: 在掌握基础后,可以逐步学习更复杂的概念,如子查询、窗口函数、索引、事务、视图、存储过程等。

SQL 是一门实践性很强的语言,只有通过不断地编写和执行命令,你才能真正掌握它。

结论

SQL,结构化查询语言,是关系数据库世界的通行证。它不是一门复杂的编程语言,而是一种强大而高效的数据交互工具。通过 SQL,我们可以轻松地定义数据结构、存取数据、维护数据完整性。

在这个数据驱动的时代,理解和掌握 SQL 就像掌握了与数据沟通的超能力。无论你是想成为一名数据专业人士,还是希望在现有领域提升数据处理能力,学习 SQL 都将是一个回报丰厚的投资。

现在,你已经对 SQL 有了一个初步的、系统的认识。不要停留在理论层面,立即选择一个平台,开始你的 SQL 实践之旅吧!从简单的 SELECT * FROM YourTable; 开始,一步步探索数据的奥秘。祝你在 SQL 的学习道路上一切顺利!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部