基础SQL总结

15 阅读12分钟

1. 引言

无论是开发后台系统、进行数据分析,还是维护数据库,SQL都是必备技能。 本文将从零开始,带你掌握数据库的创建、表的操作、数据的增删改查等核心语法, 每个知识点都配有实际截图,让你不仅看懂,更能跟着做出来。

2. SQL简介

- 什么是SQL

SQL(Structured Query Language,结构化查询语言)是一种专门用来管理和操作关系型数据库的编程语言。 它就像数据库的"通用语言",无论你是想查询数据、添加新记录、更新已有信息,还是删除无用数据,都可以通过SQL语句来完成。

简单来说,SQL是我们与数据库沟通的桥梁。通过它,我们可以告诉数据库"我想做什么", 数据库则会理解并执行我们的指令。目前,几乎所有主流的关系型数据库管理系统(如MySQL、Oracle、SQL Server、PostgreSQL等)都支持SQL。

- SQL的分类

根据功能的不同,SQL语言主要可以分为以下四个类别:

  • DDL(Data Definition Language):数据定义语言,用于定义或修改数据库的结构。比如创建表、删除表、修改表结构等。常用的命令有:CREATE、ALTER、DROP。

      - **DML(Data Manipulation Language**:数据操作语言,用于对数据库中的数据进行操作。比如添加新数据、修改现有数据、删除数据等。常用的命令有:INSERTUPDATEDELETE- **DQL(Data Query Language**:数据查询语言,用于从数据库中查询检索数据。核心命令只有一个:SELECT。虽然它只有一个命令,但SELECT的用法非常灵活,是SQL中最常用也最重要的部分。
    
      - **DCL(Data Control Language**:数据控制语言,用于管理数据库的权限和访问控制。比如给用户授予权限或撤销权限。常用的命令有:GRANTREVOKE

3. SQL的书写

SQL语句不区分大小写,但建议关键字大写

SQL不区分大小写

SQL不区分大小写

SQL语句可以单行或多行书写,以结尾的分号作为结束标志。利用这一特性,可以适当使用缩进/换行来增强SQL语句的可读性。

SQL可单行或多行书写

SQL可单行或多行书写

单行注释为:-- 注释内容,MySQL特有单行注释为:# 注释内容

多行注释为:/* 注释内容 */

SQL注释示例

SQL注释示例

除此之外,在接下来的内容中会出现[ ]中括号,在SQL基本语句的表达中,[ ]里的内容属于可选项,不填入不会对SQL语句的功能产生影响。

4. DDL:数据定义语言

- 数据库操作

(1) 创建数据库

CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];

[IF NOT EXISTS]表示如果不存在该数据库则执行创建,若已经存在,则不进行操作。

[DEFAULT CHARSET 字符集]用来指定数据库所使用的字符集,例如UTF-8或GBK。

[COLLATE 排序规则]用来指定数据库的排序规则,排序规则(Collation)是数据库中用于比较和排序字符数据的一组规则, 它决定了当对字符串进行 ORDER BY、GROUP BY、WHERE 比较时,字符如何排序、是否区分大小写、是否区分重音等。

通过输入语句,创建一个名为demon的数据库,设置编码为utf8mb4,编码排序规则为utf8mb4_unicode_ci,显示创建成功提示

通过输入语句,创建一个名为demon的数据库,设置编码为utf8mb4,编码排序规则为utf8mb4_unicode_ci,显示创建成功提示

(2) 使用数据库

USE 数据库名;

通过输入语句,使用数据库demon,显示数据库改变。

通过输入语句,使用数据库demon,显示数据库改变。

(3) 查询所有数据库

SHOW DATABASES;

通过输入语句,查询所有数据库,可以看到刚才创建的demon,以及一些系统数据库。

通过输入语句,查询所有数据库,可以看到刚才创建的demon,以及一些系统数据库。

(4) 查询当前数据库

SELECT DATABASE();

通过输入语句,查询当前数据库,显示刚才使用的demon数据库。

通过输入语句,查询当前数据库,显示刚才使用的demon数据库。

(5) 删除数据库

DROP DATABASE [IF EXISTS] 数据库名;

[IF EXISTS]表示如果存在该数据库则删除,若不存在则不进行操作。

通过输入语句,删除数据库demon,提示成功,通过查询发现确实被删除。

通过输入语句,删除数据库demon,提示成功,通过查询发现确实被删除。

- 表操作

(1) 创建表

CREATE TABLE 表名(字段1 字段1类型 [约束] [COMMENT '注释'], 字段2 字段2类型 [约束] [COMMENT '注释'], 字段3 字段3类型 [约束] [COMMENT '注释'],......, 字段n 字段n类型 [约束] [COMMENT '注释']) [COMMENT 表注释];

语句长度取决于所需要创建的表的字段数,书写时依次罗列即可,[COMMENT 字段n注释]可以用来给当前字段增加注释。

通过输入语句,创建一个学生表,有字段id(主键自增id),name(字符类型,非空约束),telephone(字符类型,唯一约束),sex(枚举类型,非空约束),create_time(时间类型,默认创建时间)五个字段,并对应类型与约束,提示操作成功,通过查询所有表发现创建成功。

通过输入语句,创建一个学生表,有字段id(主键自增id),name(字符类型,非空约束),telephone(字符类型,唯一约束),sex(枚举类型,非空约束),create_time(时间类型,默认创建时间)五个字段,并对应类型与约束,提示操作成功,通过查询所有表发现创建成功。

(2) 查询表结构

DESC表名;

通过输入语句,可以查询学生表的表结构,包括建表语句的各类说明。

通过输入语句,可以查询学生表的表结构,包括建表语句的各类说明。

(3) 修改表:添加字段

ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];

[约束]是指给字段加的一些约束,约束用于限制表中数据的合法性,保证数据的完整性和一致性,例如主键约束,唯一约束等

通过输入语句,给学生表添加clazz(班级)字段,类型为字符,非空约束,通过查询表结构发现添加字段成功。

通过输入语句,给学生表添加clazz(班级)字段,类型为字符,非空约束,通过查询表结构发现添加字段成功。

(4) 修改表:修改字段数据类型

ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);

通过输入语句,修改学生表的clazz字段类型,修改为整数类型,查询表结构发现修改成功。

通过输入语句,修改学生表的clazz字段类型,修改为整数类型,查询表结构发现修改成功。

(5) 修改表:修改字段名和字段类型

ALTER TABLE 表名 CHANGE COLUMN 旧字段名 新字段名 类型(长度) [约束] [COMMENT 注释];

通过输入语句,将学生表的telephone字段更改为email,并改变对应的类型与约束条件等,查询表结构发现原字段消失,新字段出现。

通过输入语句,将学生表的telephone字段更改为email,并改变对应的类型与约束条件等,查询表结构发现原字段消失,新字段出现。

(6) 修改表:删除字段

ALTER TABLE 表名 DROP COLUMN 字段名;

注意:删除字段,对应字段的数据也会被删除。

通过输入语句,删除学生表的clazz字段,查询表结构发现clazz字段已删除。

通过输入语句,删除学生表的clazz字段,查询表结构发现clazz字段已删除。

(7) 查询当前数据库所有表

SHOW TABLES;

通过输入语句,查询出当前数据库所有表,当然数据库只有一张学生表。

通过输入语句,查询出当前数据库所有表,当然数据库只有一张学生表。

(8) 查询指定表的建表语句

SHOW CREATE TABLE 表名;

通过输入语句,查询出学生表的建表语句,注意,如果建表后通过ALTER关键字进行了修改,
那么建表语句会保留修改结果,与最初的语句不同,可以看到输出的结果是email字段而不是原来的telephone字段。

通过输入语句,查询出学生表的建表语句,注意,如果建表后通过ALTER关键字进行了修改, 那么建表语句会保留修改结果,与最初的语句不同,可以看到输出的结果是email字段而不是原来的telephone字段。

(9) 删除表

DROP TABLE [IF EXISTS] 表名;

注意:删除表,表里的数据也会被删除。

通过输入语句,删除学生表,查询发现学生表已删除。

通过输入语句,删除学生表,查询发现学生表已删除。

(10) 删除指定表,并重新创建该表

TRUNCATE TABLE 表名;

该条命令会先删除指定表,再重新创建出来指定表,这样能实现表数据的清空,类似于格式化。 TRUNCATE 比 DELETE 更快,因为它不逐行删除数据,而是直接释放表的数据页。 同时,TRUNCATE 无法像 DELETE 那样加 WHERE 条件。

学生表中先插入部分数据并查询,通过输入语句,清空表数据,再次查询发现表还在,但是数据为空。

学生表中先插入部分数据并查询,通过输入语句,清空表数据,再次查询发现表还在,但是数据为空。

5. DCL:数据控制语言

- 用户管理

(1) 创建用户

CREATE USER '用户名'@ '主机号' IDENTIFIED BY '密码';

通过主机号指定对应用户的主机IP,从而保证安全性,例如远程连接时所对应的IP,这里统一使用%作为演示,%表示任意IP均可访问,生产环境不建议使用%。

通过输入语句,创建一个user用户,密码为123456,提示操作成功。

通过输入语句,创建一个user用户,密码为123456,提示操作成功。

(2) 查询用户

SELECT * FROM mysql.user;

用户信息存储于mysql数据库的user表里,使用这一句语句,即可同时做到切换mysql数据库及访问user表,从而查询所有用户信息。

通过输入语句,查询全部用户,可以看到默认的root用户以及刚才创建的user用户,由于用户字段众多,这里只展示user与host字段。

通过输入语句,查询全部用户,可以看到默认的root用户以及刚才创建的user用户,由于用户字段众多,这里只展示user与host字段。

(3) 修改用户密码

ALTER USER '用户名'@ '主机号' IDENTIFIED WITH mysql_native_password BY '新密码';

通过输入语句,修改user用户密码为abcdef,提示操作成功。

通过输入语句,修改user用户密码为abcdef,提示操作成功。

(4) 删除用户

DROP USER '用户名'@ '主机号';

通过输入语句,删除user用户,提示操作成功,再次查询发现user用户被删除。

通过输入语句,删除user用户,提示操作成功,再次查询发现user用户被删除。

- 权限控制

(1) 查询权限

SHOW GRANTS FOR '用户名'@ '主机号';

通过输入语句,查询出root用户的权限,可以看到,root用户拥有全部众多的权限。

通过输入语句,查询出root用户的权限,可以看到,root用户拥有全部众多的权限。

(2) 授予权限

GRANT 权限列表 ON 数据库名.表名 TO '用户名'@ '主机号';

可以通过ON关键字指定作用的数据库或表,可以使用"."来表示所有数据库/表。

创建一个user用户并且只授予SELECT权限,然后通过输入语句,授予user用户INSERT权限,观察前后两次查询权限结构变化。

创建一个user用户并且只授予SELECT权限,然后通过输入语句,授予user用户INSERT权限,观察前后两次查询权限结构变化。

(3) 撤销权限

REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@ '主机号';

通过输入语句,撤销刚才user用户的INSERT权限,查询并确认结果。

通过输入语句,撤销刚才user用户的INSERT权限,查询并确认结果。

6. DML:数据操作语言

- 添加数据

(1) 给指定字段添加数据

INSERT INTO 表名 (字段名1,字段名2,...) VALUES(值1,值2,...);

插入数据时,指定的字段顺序需要与值的顺序是一一对应的。字符串和日期型数据应该包含在引号中。插入的数据大小,应该在字段的规定范围内。

确认表结构后,就可以根据需求向表里添加数据,这里以学生表为例,id字段为自动生成的主键,create_time默认值为创建时间,
因此这两个字段不需要我们显式添加。name字段和sex字段因为加了非空约束,所以必须添加,
因此我们来添加这两个字段。在这里,我们添加一条name为zhangsan,sex为man的数据。

确认表结构后,就可以根据需求向表里添加数据,这里以学生表为例,id字段为自动生成的主键,create_time默认值为创建时间, 因此这两个字段不需要我们显式添加。name字段和sex字段因为加了非空约束,所以必须添加, 因此我们来添加这两个字段。在这里,我们添加一条name为zhangsan,sex为man的数据。

(2) 给全部字段添加数据

INSERT INTO 表名 VALUES (值1,值2,...);

插入数据时,所有的字段顺序都需要与值的顺序是一一对应的,如果字段有默认值且允许省略(比如自增id、默认当前时间),可以显式添加数据,也可以用 DEFAULT 关键字占位,自动生成数据。

通过输入语句,添加一条数据,name为lisi,telephone为19000000000,sec为woman,注意,这里的id和create_time对应的值不能省。

通过输入语句,添加一条数据,name为lisi,telephone为19000000000,sec为woman,注意,这里的id和create_time对应的值不能省。

(3) 批量添加数据

INSERT INTO 表名(字段名1,字段名2,...) VALUES (值1,值2,...),(值1,值2,...),(值1,值2,...);
INSERT INTO 表名 VALUES (值1,值2,...),(值1,值2,...),(值1,值2,...);

可以通过第一条语句批量插入对应字段的数据,也可以通过第二条语句批量插入全部字段,注意一定要按顺序一一对应。

通过输入语句,根据需求批量添加数据,这里添加5条学生数据。

通过输入语句,根据需求批量添加数据,这里添加5条学生数据。

- 更新数据

UPDATE 表名 SET 字段名1 = 值1,字段名2 = 值2,... [WHERE 条件];

[WHERE 条件]修改语句的条件是可选项,如果没有条件,则会修改整张表的所有数据。

我们需要把zhangsan的telephone字段改为13000000000,因此可以通过name字段作为条件,
输入语句修改zhangsan的telephone。若不加条件,便修改整张表,例如可以将表中所有数据的sex字段修改为man。

我们需要把zhangsan的telephone字段改为13000000000,因此可以通过name字段作为条件, 输入语句修改zhangsan的telephone。若不加条件,便修改整张表,例如可以将表中所有数据的sex字段修改为man。

- 删除数据

DELETE FROM 表名 [WHERE 条件];

[WHERE 条件]条件是可选项,如果没有条件,则会删除整张表的所有数据。该语句不能特定删除某一个字段的值。

通过输入语句,可以带条件删除id为1的一行数据,也可以不带条件,删除整张表的数据,此处仅作演示,请勿模仿。

通过输入语句,可以带条件删除id为1的一行数据,也可以不带条件,删除整张表的数据,此处仅作演示,请勿模仿。

7. DQL:数据查询语言

由于查询语句众多,涉及单表查询,多表查询,聚合查询,子查询等多种,因为关于DQL的讲解将放在另一篇文章《DQL从基础到进阶》中讲述。