全面了解 SQL:基础知识与入门 – wiki基地


全面了解 SQL:基础知识与入门

在当今数据驱动的世界里,数据无处不在,数据的管理、查询和分析能力变得空前重要。而要与数据库进行有效沟通,SQL (Structured Query Language) 无疑是那门通用的语言。无论你是希望进入数据分析、软件开发、数据库管理等领域,还是仅仅想更好地管理个人信息,掌握 SQL 都是一项极具价值的技能。

本文将带你全面了解 SQL 的基础知识,从它是什么、为什么重要,到如何使用最核心的命令进行数据操作,助你轻松迈出 SQL 学习的第一步。

第一章:SQL 是什么?为什么需要学习它?

1.1 什么是 SQL?

SQL,全称 Structured Query Language,即结构化查询语言。它是一种用于管理关系型数据库系统的标准化语言。简单来说,SQL 就是你用来“告诉”数据库你想做什么的指令集。这些指令可以用来:

  • 查询 (Query) 数据库中的数据。
  • 插入 (Insert) 新数据到数据库。
  • 更新 (Update) 数据库中已有的数据。
  • 删除 (Delete) 数据库中的数据。
  • 创建 (Create) 新的数据库或表结构。
  • 修改 (Alter) 数据库或表结构。
  • 删除 (Drop) 数据库或表结构。
  • 控制 (Control) 数据库的访问权限。

SQL 是一种声明性语言,这意味着你只需描述你想要的结果(例如:“给我所有销售额超过1000的订单”),而无需指定数据库应如何具体执行操作步骤。数据库系统会负责找出最高效的方法来完成任务。

1.2 SQL 与关系型数据库 (RDBMS)

SQL 主要用于操作关系型数据库管理系统(RDBMS)。关系型数据库以表 (Table) 的形式存储数据。每个表由行 (Row)列 (Column) 组成。

  • 表 (Table): 类似于电子表格,用于存储特定类型的数据集合(例如,一个存储顾客信息的表,一个存储订单信息的表)。
  • 行 (Row) / 记录 (Record) / 元组 (Tuple): 表中的每一行代表一个独立的数据记录(例如,关于某一个特定顾客的所有信息构成的行)。
  • 列 (Column) / 字段 (Field) / 属性 (Attribute): 表中的每一列代表数据的一个特定属性(例如,顾客姓名、顾客地址、顾客ID等)。
  • 主键 (Primary Key): 表中的一列或一组列,其值能唯一标识表中的每一行。主键值不能重复,也不能为 NULL。
  • 外键 (Foreign Key): 一个表中的列,它指向另一个表中的主键。外键用于在两个表之间建立关系。

理解关系型数据库的模型是理解 SQL 工作原理的基础。

1.3 为什么需要学习 SQL?

学习 SQL 的理由有很多:

  • 行业标准: 几乎所有主要的数据库系统(如 MySQL, PostgreSQL, SQL Server, Oracle, SQLite)都支持 SQL。掌握 SQL 意味着你可以在不同的数据库平台之间迁移你的技能。
  • 数据分析与报告: SQL 是数据分析师、商业智能专家获取和整理数据的核心工具。通过 SQL,你可以从海量数据中提取所需信息,进行聚合、过滤和转换,为决策提供支持。
  • 软件开发: 后端开发者需要使用 SQL 来与数据库交互,无论是存储用户数据、读取配置信息还是处理业务逻辑。
  • 数据库管理: 数据库管理员(DBA)使用 SQL 来维护数据库的健康运行、优化性能、管理用户权限等。
  • 数据科学与机器学习: 数据科学家在构建模型前,通常需要使用 SQL 从数据仓库中提取、清洗和准备数据。
  • 职业发展: 在许多技术和数据相关岗位中,SQL 技能都是招聘要求中的重要一项,甚至是必备条件。

简而言之,在与数据打交道的任何领域,SQL 都是一把万能钥匙。

第二章:SQL 环境搭建入门

在开始编写 SQL 语句之前,你需要一个可以运行 SQL 的环境。幸运的是,有许多免费或商业的数据库系统和工具可供选择。

2.1 选择一个 RDBMS

一些流行的关系型数据库管理系统包括:

  • MySQL: 开源,广泛用于 Web 应用。
  • PostgreSQL: 开源,功能强大,常用于复杂应用和数据仓库。
  • SQLite: 开源,无服务器,适合小型应用或嵌入式设备,数据存储在一个文件中。
  • SQL Server: 微软开发,常用于企业级应用。
  • Oracle: 甲骨文公司开发,强大的企业级数据库系统。

对于初学者,推荐选择 MySQLPostgreSQL,它们都有强大的社区支持和免费版本,或者更简单的 SQLite,可以直接通过安装一个客户端工具来使用。

2.2 安装与连接

  1. 安装 RDBMS 软件: 根据你选择的数据库,下载并安装其社区版或免费版本。例如,可以安装 MySQL Community Server 或 PostgreSQL。
  2. 安装客户端工具: 大多数数据库系统都有自己的命令行客户端或图形化用户界面 (GUI) 工具,如 MySQL Workbench, pgAdmin, DBeaver (支持多种数据库), SQLiteStudio 等。这些工具可以让你更方便地编写和执行 SQL 语句,并查看结果。
  3. 创建数据库和表: 安装并启动数据库服务后,你可以使用客户端工具连接到数据库服务器,然后创建你自己的数据库和表来练习。

2.3 使用在线 SQL 环境

如果你不想安装任何软件,也可以使用一些在线的 SQL 练习平台,它们通常提供一个临时的数据库环境供你练习。

第三章:核心 SQL 命令分类与详解

SQL 命令可以大致分为几类,其中最常用、也是初学者必须掌握的是以下几类:

  • DDL (Data Definition Language): 数据定义语言,用于定义数据库结构,如创建、修改、删除数据库、表、索引等。
  • DML (Data Manipulation Language): 数据操作语言,用于对表中的数据进行操作,如插入、更新、删除数据。
  • DQL (Data Query Language): 数据查询语言,用于从数据库中查询数据。
  • DCL (Data Control Language): 数据控制语言,用于管理用户权限。

本文重点介绍 DQL 和 DML,以及最基础的 DDL 命令。

为了演示,我们假设有一个名为 Students 的表,结构如下:

Column Name Data Type Description
StudentID INT 学生ID (主键)
Name VARCHAR 姓名
Age INT 年龄
Major VARCHAR 专业
EnrollDate DATE 入学日期

并假设表中有以下数据:

StudentID Name Age Major EnrollDate
101 张三 20 计算机科学 2021-09-01
102 李四 21 软件工程 2020-09-01
103 王五 19 物理学 2022-09-01
104 赵六 20 计算机科学 2021-09-01
105 钱七 22 统计学 2019-09-01

3.1 DDL – 数据定义语言 (入门)

最基础的 DDL 命令是创建表。

  • CREATE TABLE: 用于创建新表。

    sql
    CREATE TABLE Students (
    StudentID INT PRIMARY KEY, -- 定义 StudentID 为整数,并设置为主键
    Name VARCHAR(100), -- 定义 Name 为可变长度字符串,最大100字符
    Age INT, -- 定义 Age 为整数
    Major VARCHAR(50), -- 定义 Major 为可变长度字符串,最大50字符
    EnrollDate DATE -- 定义 EnrollDate 为日期类型
    );

    (注意:不同数据库系统的具体数据类型名称和语法可能略有差异。)

  • DROP TABLE: 用于删除表。

    sql
    DROP TABLE Students; -- 谨慎使用,这将永久删除表及其所有数据!

3.2 DML – 数据操作语言

DML 用于操作表中的数据。

  • INSERT INTO: 向表中插入新数据。

    插入所有列的值(需要按列定义的顺序提供值):

    sql
    INSERT INTO Students VALUES (101, '张三', 20, '计算机科学', '2021-09-01');

    插入指定列的值(推荐方式,即使表结构变化,只要指定列名即可):

    “`sql
    INSERT INTO Students (StudentID, Name, Age, Major, EnrollDate)
    VALUES (102, ‘李四’, 21, ‘软件工程’, ‘2020-09-01’);

    — 也可以只插入部分非空约束的列
    INSERT INTO Students (StudentID, Name)
    VALUES (106, ‘孙八’); — 其他列可能需要允许NULL或有默认值
    “`

  • UPDATE: 修改表中已有的数据。非常重要:请务必使用 WHERE 子句指定要更新哪些行,否则将更新表中的所有行!

    更新某个特定学生的专业:

    sql
    UPDATE Students
    SET Major = '人工智能'
    WHERE StudentID = 101; -- 只更新 StudentID 为 101 的那一行

    更新多个列:

    sql
    UPDATE Students
    SET Age = 23, EnrollDate = '2019-09-01'
    WHERE StudentID = 105;

  • DELETE FROM: 从表中删除数据。非常重要:请务必使用 WHERE 子句指定要删除哪些行,否则将删除表中的所有行!

    删除某个特定学生:

    sql
    DELETE FROM Students
    WHERE StudentID = 103; -- 只删除 StudentID 为 103 的那一行

    删除所有专业是“物理学”的学生:

    sql
    DELETE FROM Students
    WHERE Major = '物理学';

    删除表中所有数据(不删除表结构):

    sql
    DELETE FROM Students; -- 谨慎使用,这将删除表中的所有行!

3.3 DQL – 数据查询语言 (核心)

SELECT 是 SQL 中使用最频繁、功能最强大的命令,用于从数据库中检索数据。

  • SELECT: 检索数据。

    检索表中的所有列和所有行:

    sql
    SELECT * FROM Students; -- * 表示所有列

    结果会是上面的整个学生表数据。

    检索指定列的所有行:

    sql
    SELECT Name, Age, Major FROM Students;

    结果:
    | Name | Age | Major |
    | :—– | :– | :——— |
    | 张三 | 20 | 计算机科学 |
    | 李四 | 21 | 软件工程 |
    | 王五 | 19 | 物理学 |
    | 赵六 | 20 | 计算机科学 |
    | 钱七 | 22 | 统计学 |

  • WHERE 子句: 过滤行,只返回满足特定条件的行。可以与各种比较运算符和逻辑运算符结合使用。

    查找所有年龄大于等于 20 岁的学生:

    sql
    SELECT *
    FROM Students
    WHERE Age >= 20;

    结果:
    | StudentID | Name | Age | Major | EnrollDate |
    | :——– | :—– | :– | :——— | :——— |
    | 101 | 张三 | 20 | 计算机科学 | 2021-09-01 |
    | 102 | 李四 | 21 | 软件工程 | 2020-09-01 |
    | 104 | 赵六 | 20 | 计算机科学 | 2021-09-01 |
    | 105 | 钱七 | 22 | 统计学 | 2019-09-01 |

    查找专业是“计算机科学”的学生:

    sql
    SELECT Name, Major
    FROM Students
    WHERE Major = '计算机科学';

    结果:
    | Name | Major |
    | :—– | :——— |
    | 张三 | 计算机科学 |
    | 赵六 | 计算机科学 |

    使用 ANDOR 组合条件:

    查找年龄在 20 到 21 岁之间(包含边界)的学生:

    sql
    SELECT *
    FROM Students
    WHERE Age >= 20 AND Age <= 21; -- 或者使用 BETWEEN Age BETWEEN 20 AND 21

    查找专业是“计算机科学”或“软件工程”的学生:

    sql
    SELECT *
    FROM Students
    WHERE Major = '计算机科学' OR Major = '软件工程'; -- 或者使用 IN Major IN ('计算机科学', '软件工程')

    查找名字包含“张”的学生 (使用 LIKE% 通配符):

    sql
    SELECT *
    FROM Students
    WHERE Name LIKE '%张%'; -- % 表示任意数量的字符

    查找入学日期为空的学生:

    sql
    SELECT *
    FROM Students
    WHERE EnrollDate IS NULL; -- 注意:判断 NULL 使用 IS NULL 或 IS NOT NULL

  • ORDER BY 子句: 对查询结果进行排序。默认是升序 (ASC),可以使用 DESC 指定降序。

    按年龄升序排序学生:

    sql
    SELECT *
    FROM Students
    ORDER BY Age ASC; -- ASC 可以省略,它是默认值

    按年龄降序排序,年龄相同的按姓名升序排序:

    sql
    SELECT *
    FROM Students
    ORDER BY Age DESC, Name ASC;

  • LIMIT / TOP: 限制返回的行数。不同数据库语法不同。MySQL/PostgreSQL 使用 LIMIT,SQL Server 使用 TOP

    获取年龄最大的3位学生:

    “`sql
    — MySQL/PostgreSQL
    SELECT *
    FROM Students
    ORDER BY Age DESC
    LIMIT 3;

    — SQL Server
    SELECT TOP 3 *
    FROM Students
    ORDER BY Age DESC;
    “`

  • 聚合函数 (Aggregate Functions): 对一组行执行计算,并返回单个值。常用的有 COUNT(), SUM(), AVG(), MIN(), MAX()

    计算学生总数:

    sql
    SELECT COUNT(*) AS TotalStudents FROM Students; -- 使用 AS 给计算结果起别名

    计算学生的平均年龄:

    sql
    SELECT AVG(Age) AS AverageAge FROM Students;

    查找最早的入学日期:

    sql
    SELECT MIN(EnrollDate) AS EarliestEnrollDate FROM Students;

  • GROUP BY 子句: 将具有相同值的行分组,通常与聚合函数一起使用,对每个分组进行计算。

    按专业分组,计算每个专业的学生人数:

    sql
    SELECT Major, COUNT(*) AS NumberOfStudents
    FROM Students
    GROUP BY Major;

    结果:
    | Major | NumberOfStudents |
    | :——— | :————— |
    | 计算机科学 | 2 |
    | 软件工程 | 1 |
    | 物理学 | 1 |
    | 统计学 | 1 |

  • HAVING 子句: 在 GROUP BY 分组后,对分组进行过滤。WHERE 用于过滤行,HAVING 用于过滤组。

    找出学生人数超过 1 个的专业:

    sql
    SELECT Major, COUNT(*) AS NumberOfStudents
    FROM Students
    GROUP BY Major
    HAVING COUNT(*) > 1;

    结果:
    | Major | NumberOfStudents |
    | :——— | :————— |
    | 计算机科学 | 2 |

  • JOIN: 将两个或多个表中的行基于相关列之间的共同值组合起来。这是关系型数据库的核心操作之一。最常见的是 INNER JOIN

    假设我们还有一个 Courses 表:
    | CourseID | CourseName |
    | :——- | :——— |
    | CS101 | 数据结构 |
    | SE201 | 操作系统 |
    | PH101 | 力学 |
    | ST301 | 概率论 |

    和一个 StudentCourses 表(连接 StudentsCourses):
    | StudentID | CourseID | Score |
    | :——– | :——- | :—- |
    | 101 | CS101 | 90 |
    | 101 | SE201 | 85 |
    | 102 | SE201 | 92 |
    | 103 | PH101 | 88 |
    | 104 | CS101 | 87 |

    查询每个学生的姓名以及他们选修的课程名称:

    sql
    SELECT
    S.Name AS StudentName, -- 使用表别名和列别名
    C.CourseName -- 使用表别名
    FROM
    Students S -- 给 Students 表起别名 S
    INNER JOIN
    StudentCourses SC -- 给 StudentCourses 表起别名 SC
    ON S.StudentID = SC.StudentID -- ON 子句指定连接条件:Students.StudentID 等于 StudentCourses.StudentID
    INNER JOIN
    Courses C -- 给 Courses 表起别名 C
    ON SC.CourseID = C.CourseID; -- ON 子句指定连接条件:StudentCourses.CourseID 等于 Courses.CourseID

    结果:
    | StudentName | CourseName |
    | :———- | :——— |
    | 张三 | 数据结构 |
    | 张三 | 操作系统 |
    | 李四 | 操作系统 |
    | 王五 | 力学 |
    | 赵六 | 数据结构 |

    这个例子展示了如何通过 INNER JOIN 将三个表连接起来,根据它们之间的关系获取学生姓名和对应的课程名称。其他类型的 JOIN(如 LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN)用于处理不完全匹配的情况,可以在后续学习中深入了解。

第四章:常见数据类型概述

在创建表时,你需要为每一列指定数据类型,这决定了该列可以存储什么类型的数据以及数据如何存储和处理。常见的数据类型包括:

  • 整型 (Integer Types): 存储整数,如 INT (或 INTEGER)。不同系统可能有 TINYINT, SMALLINT, BIGINT 等,表示不同的整数范围。
  • 浮点型 (Floating-Point Types): 存储小数,如 FLOAT, DOUBLE
  • 定点型 (Exact Numeric Types): 存储精确的小数,如 DECIMALNUMERIC。常用于货币计算。
  • 字符串型 (String Types): 存储文本数据,如 VARCHAR(n) (可变长度字符串,最大 n 个字符),CHAR(n) (固定长度字符串),TEXT (存储大量文本)。
  • 日期和时间类型 (Date and Time Types): 存储日期、时间或两者皆有,如 DATE, TIME, DATETIME, TIMESTAMP
  • 布尔型 (Boolean Type): 存储真/假值,如 BOOLEAN (或 BOOL)。

选择合适的数据类型对于数据存储效率、数据完整性和查询性能都非常重要。

第五章:学习 SQL 的一些建议和最佳实践

  • 实践、实践、再实践: SQL 是一门实践性很强的语言。多写查询,尝试不同的命令和组合。
  • 理解你的数据: 在编写查询之前,花时间了解你要操作的表结构、列的含义以及数据之间的关系。
  • 从简单开始: 先掌握 SELECT, FROM, WHERE, ORDER BY, GROUP BY 这些核心子句,再逐步学习 JOIN, 子查询等更高级的主题。
  • 使用别名: 使用 AS 为表或列创建别名,可以使查询更简洁易读,特别是在涉及多个表或复杂表达式时。
  • 格式化你的代码: 使用缩进、换行和一致的命名风格,使你的 SQL 语句清晰易懂。
  • 小心 UPDATEDELETE: 在执行 UPDATEDELETE 语句之前,先用一个 SELECT 语句加上同样的 WHERE 子句来验证你将要修改或删除的数据是否正确。
  • 注释: 在复杂的查询中添加注释(使用 --/* ... */),解释查询的目的或某个部分的逻辑。
  • 查阅官方文档或教程: 遇到问题时,查阅你使用的特定数据库系统的官方文档,或者寻找高质量的在线教程和社区帮助。

第六章:超越基础:后续学习方向

掌握了 SQL 的基础后,你可以进一步学习以下高级主题:

  • 更复杂的 JOIN 类型: LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN 的使用场景和区别。
  • 子查询 (Subqueries): 在一个查询中嵌套另一个查询。
  • 窗口函数 (Window Functions): 在相关的行组上执行计算,但结果不合并为一行。
  • 公共表表达式 (CTE – Common Table Expressions): 使用 WITH 关键字定义临时的命名结果集,提高查询的可读性和模块化。
  • 索引 (Indexes): 了解索引如何提高查询性能,以及何时创建索引。
  • 事务 (Transactions): 学习 ACID 特性,以及如何使用 BEGIN TRANSACTION, COMMIT, ROLLBACK 来确保数据的一致性。
  • 存储过程和函数 (Stored Procedures and Functions): 在数据库服务器上定义和存储可重复使用的逻辑。
  • 数据库设计原则 (Database Design Principles): 学习范式理论(Normalization),如何设计高效、无冗余的数据库结构。
  • 特定数据库系统的特性: 了解你使用的具体数据库系统(如 MySQL, PostgreSQL)特有的函数、数据类型和功能。

结语

恭喜你阅读到这里!你已经对 SQL 的基础知识有了全面的了解。从定义、作用,到核心的 DDL、DML、DQL 命令及其常用子句,我们都进行了详细的探讨,并通过实例进行了演示。

SQL 是一项强大且实用的技能,是许多数据相关工作的基石。掌握它,你就能更有效地与数据世界互动。学习 SQL 的旅程不会一蹴而就,持续的练习和探索是关键。从现在开始,找一个数据库环境,动手实践,不断尝试编写和优化你的 SQL 语句吧!

祝你在 SQL 的学习之路上取得成功!


发表评论

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

滚动至顶部