SQL学习-基础知识

437 阅读13分钟

SQL学习-基础知识

本文介绍数据库的基础知识,包括数据库简介、数据库的分类、数据库表结构、什么是SQL、SQL语句的语法、MySQL介绍和安装、数据库创建和连接、数据库的 CRUD

供自己以后查漏补缺,也欢迎同道朋友交流学习。

引言

作为开发,SQL数据库大家都不陌生,但是我们是否真正的掌握了数据库的基础知识呢?

其实就我来说,多少还是有点不熟悉的,简单的增删改错这些都没问题,但复杂的事务管理、多表查询、复杂的数据分析等,就相对困难了。

尤其是大多数的前端都没有系统性的学习 SQL 语言,这也是我写这个系列博客的初衷。后面我会系统性的学习并且分享出来。

本篇为系统学 SQL 的第一篇文章,会介绍数据库的基础知识。包括数据库简介、数据库的分类、数据库表结构、什么是 SQL、SQL 语句的语法、MySQL 介绍和安装、数据库创建和连接、数据库的 CRUD

数据库简介

数据库(Database)是一个系统化的数据集合,它允许用户存储检索管理数据。数据库通常由一个或多个表格组成,这些表格中包含了结构化的数据。

每个表格由行(记录)列(字段)构成,其中每一列都有特定的数据类型,每一行都包含与列相对应的数据项。

数据库管理系统(DBMS)是用于与数据库交互的软件,它提供了创建、查询、更新和管理数据的工具。

数据库的主要目的是提供数据的组织、检索和分析功能,以便用户能够高效地访问和使用数据。数据库可以是任何类型数据集合,从简单的地址簿到复杂的多表关系数据库,它们存储着企业的关键信息。

数据库的分类

根据数据模型分类

分类定义特点例子
关系型数据库关系型数据库基于关系模型,数据以表格的形式存储,表之间通过关系(如外键)相互关联。提供 ACID 属性(原子性一致性隔离性持久性),支持复杂的查询和事务处理。MySQLPostgreSQLOracleSQL Server等。
非关系型数据库非关系型数据库不依赖于表格模型,它们可以基于键值对文档宽列存储图形数据库等模型。提供灵活的数据模型,易于扩展,适合处理大规模分布式数据。MongoDB(文档存储)、Redis(键值存储)、Cassandra(宽列存储)、Neo4j(图形数据库)等。

根据部署方式分类

分类定义特点例子
本地数据库数据库软件安装在本地服务器个人电脑上,数据存储在本地硬盘上。易于管理和控制,数据访问速度快,但可能存在单点故障风险安装在个人电脑上的 SQLite 数据库。
云数据库数据库服务托管在云服务提供商的服务器上,用户通过网络访问数据库。具有高可用性、可扩展性和灵活性,减少了硬件维护的负担。Amazon RDSGoogle Cloud SQLAzure SQL Database等。

根据用途分类

分类定义特点例子
事务处理系统(OLTP)在线事务处理系统,用于处理日常业务操作,如银行交易电子商务订单处理等。强调高事务吞吐量低延迟,需要快速响应用户请求。零售商店的库存管理系统、银行的 ATM 网络。
数据仓库(OLAP)在线分析处理系统,用于存储和分析大量历史数据,支持复杂的查询和报告。强调数据的聚合和分析,通常与数据挖掘和商业智能工具结合使用。企业的销售数据分析、市场趋势预测。
混合型系统(HTAP)同时支持事务处理分析处理的系统,旨在提供实时的业务洞察。结合了 OLTPOLAP 的优点,可以在同一个数据库上执行事务和分析查询。一些现代的数据库系统,如Google SpannerAmazon Aurora等。

数据库表结构

数据库表是关系型数据库中用于存储数据的基本结构,它由行和列组成,类似于 Excel 中的表格。

表的定义

数据库表是存储相关数据的集合,这些数据通过列(字段)来组织,每列都有特定的数据类型。表中的每一行(记录)代表一个数据项,包含该数据项的所有相关字段值。

主键与外键

  • 主键(Primary Key:表中用于唯一标识每条记录的字段或字段组合。主键的值必须唯一,不能为 NULL,一个表可以有一个或多个主键。
  • 外键(Foreign Key:一个表中的字段或字段组合,它在另一个表中作为主键。外键用于建立和维护两个表之间的关系。

SQL的数据类型

MySQL 中,数据类型(datatype)是可以定义存储列的数据的类型格式

数值类型

  • 整数类型:包括TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT,它们存储整数值,占用的空间和范围不同。
  • 浮点数类型:包括FLOATDOUBLE,它们存储单精度和双精度浮点数值。
  • 定点数类型DECIMALNUMERIC,用于存储精确的小数值。

日期和时间类型

  • 日期类型DATE,格式为YYYY-MM-DD
  • 时间类型TIME,格式为HH:MM:SS
  • 日期和时间类型DATETIMETIMESTAMP,格式为YYYY-MM-DD HH:MM:SS
  • 年份类型YEAR,格式为YYYYYY

字符串类型

  • 固定长度字符串CHAR,存储定长的字符串,不足部分用空格填充。
  • 可变长度字符串VARCHAR,存储不定长的字符串,只占用必要的空间。
  • 二进制字符串BINARYVARBINARY,与 CHARVARCHAR 类似,但用于存储二进制数据。
  • 大文本数据TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT,用于存储不同长度的文本数据。
  • 大二进制数据TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB,用于存储不同长度的二进制数据。

特殊数据类型

  • 枚举类型ENUM,用于存储预定义集合中的一个字符串值。
  • 集合类型SET,用于存储多个枚举值的组合。
  • JSON类型JSON,用于存储 JSON 格式的数据。

布尔类型

  • 布尔类型BOOLEAN,存储 TRUEFALSE 值。

什么是SQL

上面了解了数据库的一些分类和表结构,如果需要和数据库通讯,就要使用 SQL 语言了。

SQL(Structured Query Language)是一种专门用来与数据库通信的语言。它是一种声明式语言,用于执行数据库的各种操作,包括数据查询、数据操作、数据定义和数据访问控制。

SQL是关系型数据库的标准语言,几乎所有的关系型数据库管理系统(RDBMS)都支持SQL。

SQL语句的基本结构

SQL 语句通常由以下几个部分组成:

  • SELECT语句:用于查询数据库中的数据。
SELECT column1, column2
FROM table_name
WHERE condition;
  • INSERT INTO语句:用于向数据库表中插入新数据。
INSERT INTO table_name (column1, column2)
VALUES (value1, value2);
  • UPDATE语句:用于更新数据库表中的现有数据。
UPDATE table_name
SET column1 = value1, column2 = value2
WHERE condition;
  • DELETE语句:用于从数据库表中删除数据。
DELETE FROM table_name
WHERE condition;
  • CREATE语句:用于创建新的数据库对象,如视图等。
CREATE TABLE table_name (
  column1 datatype,
  column2 datatype,
  ...
);
  • ALTER语句:用于修改现有数据库对象的结构。
ALTER TABLE table_name
ADD column_name datatype;
  • DROP语句:用于删除数据库对象
DROP TABLE table_name;
  • JOIN语句:用于结合两个或多个表的行,基于相关的列。
SELECT *
FROM table1
JOIN table2 ON table1.column_name = table2.column_name;

SQL语句的语法

基本的SQL语法规则

SQL 语句的语法规则是编写有效 SQL 语句的基础。以下是一些基本的规则:

  • 区分大小写:SQL 语句通常不区分大小写,但是数据库标识符(如表名列名)可能区分大小写,这取决于数据库系统。
  • 使用分号:每个 SQL 语句以分号(;)结束,表示语句的结束。有些 DBMS 数据库系统可能允许在语句末尾省略分号,但是这是不推荐的。
  • 使用逗号分隔:在 SELECT 语句中选择多个列时,使用逗号(,)分隔列名。
  • 使用空格:SQL 语句中关键字之间通常需要有空格,以提高可读性。
  • 使用引号字符串值通常需要用单引号(')括起来,而标识符(如列名和表名)可以使用反引号(`)或双引号(")括起来,尤其是在它们包含特殊字符或关键字时。
  • 使用括号:在函数子查询中使用括号(())来明确操作的顺序。

保留字和关键字

保留字关键字是 SQL 语言中预先定义的,具有特殊意义的单词。它们用于构成 SQL 语句的结构,因此不能用作列名表名其他标识符,除非使用反引号双引号将它们括起来。

一些常见的 SQL 关键字包括:SELECTFROMWHEREINSERTINTOUPDATEDELETECREATEDROPALTERJOINANDORNOTGROUP BYORDER BYHAVINGLIMIT...

注释的使用

  • 单行注释:使用 -- 开始,后面跟随注释内容,直到行尾。
-- 这是一个单行注释
  • 多行注释:使用/*开始,*/结束,可以跨越多行。
/*
这是一个
多行注释
*/

MySQL介绍和安装

SQL 数据库和软件非常的多,这里只介绍MySQL,后续案例都是基于MySQL,下面我们简单介绍下:

MySQL 是一个流行的开源关系型数据库管理系统(RDBMS),使用 SQL 语言进行数据库的查询和管理。它最初由 MySQL AB 公司开发,后来被 Sun Microsystems 收购,最终成为 Oracle 公司的产品。

MySQL 以其高性能可靠性易用性而闻名,适用于各种应用程序,从小型网站到大型企业应用。

特点包括:

  • 跨平台:可在多种操作系统上运行,包括 LinuxWindowsmacOS
  • 多用户和多线程:支持多个用户同时访问数据库。
  • 事务处理:支持 ACID 事务,确保数据的完整性。
  • 存储引擎:支持多种存储引擎,如 InnoDB(默认)和 MyISAM
  • 安全性:提供强大的数据加密访问控制功能。

下载MySQL

访问官方网站:MySQL Official Site

选择适合操作系统的 MySQL 版本进行下载。对于大多数用户,推荐下载 MySQL Community Server,这是免费开源版本。

安装MySQL

  • Windows

    • 运行下载的安装程序。
    • 遵循安装向导的步骤,选择安装类型(典型或自定义)。
    • 设置 root 用户密码。
    • 完成安装。
  • Linux(以Ubuntu为例)

    • 添加 MySQL 官方 PPA 仓库:sudo apt-add-repository ppa:ondrej/mysql-5.7
    • 更新软件包列表:sudo apt-get update
    • 安装 MySQL:sudo apt-get install mysql-server
    • 运行安全安装脚本:sudo mysql_secure_installation
  • macOS(使用Homebrew)

    • 安装 Homebrew (如果尚未安装):/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    • 安装 MySQL:brew install mysql
    • 启动 MySQL 服务:brew services start mysql

我一般基于 Homebrew 安装。

配置MySQL环境

  • 设置环境变量(如果需要):确保 bin 目录在系统 PATH 环境变量中,以便在任何位置运行 MySQL 命令。
  • 配置文件:MySQL的配置文件通常位于/etc/my.cnf(Linux)C:\ProgramData\MySQL\MySQL Server X.X\my.ini(Windows)。根据需要调整配置,如最大连接数字符集等。
  • 字符集和校对规则:推荐使用utf8mb4字符集和utf8mb4_general_ci校对规则,以支持全Unicode字符集。

vscode连接MySQL

vscode 中安装 Database Client 插件,点击右侧数据库图标上的加号进行连接添加即可。

数据库创建和连接

登录到MySQL

可以用软件登录到 MySQL 服务器,也可以使用命令行登录。

# username 是 MySQL 用户名,-p 表示需要输入密码
mysql -u username -p

创建数据库

-- database_name是你自定义的sql名
CREATE DATABASE database_name;
-- 选择数据库
USE database_name;

创建表

CREATE TABLE table_name (
  column1 datatype constraints,
  column2 datatype constraints,
  ...
  PRIMARY KEY (column_name)
);
  • table_name:表的名称
  • column1, column2:列的名称
  • datatype:列的数据类型,
  • constraints:约束条件,如NOT NULL, UNIQUE等,PRIMARY KEY定义了表的主键。

创建User用户表

-- 创建数据库
CREATE DATABASE `sql-test-db`
    DEFAULT CHARACTER SET = 'utf8mb4';

-- 选择数据库
USE `sql-test-db`;

-- 创建用户user数据表
CREATE TABLE user (
  id INT AUTO_INCREMENT PRIMARY KEY, -- id int类型 自增 主键
  username VARCHAR(50) NOT NULL, -- 用户名 最长50个字节 不能为空
  age INT NOT NULL, -- 年龄 整型 不能为空
  city VARCHAR(50) NOT NULL, -- 户籍 最长50个字节 不能为空
  job VARCHAR(50) NOT NULL, -- 岗位 最长50个字节 不能为空
  is_active BOOLEAN DEFAULT TRUE
);

删除user表

DROP TABLE user;

数据库的基本操作-CRUD

CRUDCreate(创建)、Read(读取)、Update(更新)和 Delete(删除)的缩写,代表了数据库操作中的基本功能。

C(创建)- 插入数据

插入数据通常使用 INSERT INTO 语句,上面已经介绍过语法了,我们模拟给 user 表插入数据。

-- 插入数据
INSERT INTO user (username, age, city, job)
VALUES
  ('王一', 25, '上海', '前端开发'),
  ('赵二', 30, '北京', '采购经理'),
  ('张三', 35, '苏州', '后端开发'),
  ('李四', 40, '上海', '项目经理'),
  ('周五', 22, '广州', '产品经理'),
  ('李华', 34, '深圳', '前端开发'),
  ('张伟', 37, '北京', '运营'),
  ('王强', 27, '上海', '后端开发'),
  ('刘洋', 29, '北京', '运营'),
  ('陈杰', 30, '深圳', '前端开发'),
  ('李晓峰', 26, '广州', '产品经理'),
  ('张晓东', 30, '苏州', '后端开发');

R(读取)- 查询数据

查询数据使用 SELECT 语句。这个语句用于从数据库表中检索数据,上面已经介绍过语法了,我们模拟查询 user 表数据。

-- 查询数据
SELECT * FROM user;

U(更新)- 修改数据

更新数据使用 UPDATE 语句。这个语句用于修改表中的现有数据,上面已经介绍过语法了,我们模拟修改 user 表数据。

-- 修改数据
UPDATE user SET age = 26 WHERE id = 1;
UPDATE user SET city = '广州' WHERE username = '赵二';

D(删除)- 删除数据

删除数据使用 DELETE FROM 语句。这个语句用于从表中删除数据,上面已经介绍过语法了,我们模拟删除 user 表数据。

但真实环境里,我们一般使用软删除,不会真的删除掉数据,我们使用 UPDATE 语句来修改 is_active 模拟软删除数据。

-- 删除数据(硬删除)
DELETE FROM user WHERE username = '周五';
-- 删除数据(软删除)
UPDATE user SET is_active = FALSE WHERE username = '李四';

SQL学习专栏系列

练习代码库地址

SQL学习 sql-study