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)**:数据操作语言,用于对数据库中的数据进行操作。比如添加新数据、修改现有数据、删除数据等。常用的命令有:INSERT、UPDATE、DELETE。 - **DQL(Data Query Language)**:数据查询语言,用于从数据库中查询检索数据。核心命令只有一个:SELECT。虽然它只有一个命令,但SELECT的用法非常灵活,是SQL中最常用也最重要的部分。 - **DCL(Data Control Language)**:数据控制语言,用于管理数据库的权限和访问控制。比如给用户授予权限或撤销权限。常用的命令有:GRANT、REVOKE。
3. SQL的书写
SQL语句不区分大小写,但建议关键字大写
SQL不区分大小写
SQL语句可以单行或多行书写,以结尾的分号作为结束标志。利用这一特性,可以适当使用缩进/换行来增强SQL语句的可读性。
SQL可单行或多行书写
单行注释为:-- 注释内容,MySQL特有单行注释为:# 注释内容
多行注释为:/* 注释内容 */
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,显示创建成功提示
(2) 使用数据库
USE 数据库名;
通过输入语句,使用数据库demon,显示数据库改变。
(3) 查询所有数据库
SHOW DATABASES;
通过输入语句,查询所有数据库,可以看到刚才创建的demon,以及一些系统数据库。
(4) 查询当前数据库
SELECT DATABASE();
通过输入语句,查询当前数据库,显示刚才使用的demon数据库。
(5) 删除数据库
DROP DATABASE [IF EXISTS] 数据库名;
[IF EXISTS]表示如果存在该数据库则删除,若不存在则不进行操作。
通过输入语句,删除数据库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(时间类型,默认创建时间)五个字段,并对应类型与约束,提示操作成功,通过查询所有表发现创建成功。
(2) 查询表结构
DESC表名;
通过输入语句,可以查询学生表的表结构,包括建表语句的各类说明。
(3) 修改表:添加字段
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
[约束]是指给字段加的一些约束,约束用于限制表中数据的合法性,保证数据的完整性和一致性,例如主键约束,唯一约束等
通过输入语句,给学生表添加clazz(班级)字段,类型为字符,非空约束,通过查询表结构发现添加字段成功。
(4) 修改表:修改字段数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
通过输入语句,修改学生表的clazz字段类型,修改为整数类型,查询表结构发现修改成功。
(5) 修改表:修改字段名和字段类型
ALTER TABLE 表名 CHANGE COLUMN 旧字段名 新字段名 类型(长度) [约束] [COMMENT 注释];
通过输入语句,将学生表的telephone字段更改为email,并改变对应的类型与约束条件等,查询表结构发现原字段消失,新字段出现。
(6) 修改表:删除字段
ALTER TABLE 表名 DROP COLUMN 字段名;
注意:删除字段,对应字段的数据也会被删除。
通过输入语句,删除学生表的clazz字段,查询表结构发现clazz字段已删除。
(7) 查询当前数据库所有表
SHOW TABLES;
通过输入语句,查询出当前数据库所有表,当然数据库只有一张学生表。
(8) 查询指定表的建表语句
SHOW CREATE TABLE 表名;
通过输入语句,查询出学生表的建表语句,注意,如果建表后通过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,提示操作成功。
(2) 查询用户
SELECT * FROM mysql.user;
用户信息存储于mysql数据库的user表里,使用这一句语句,即可同时做到切换mysql数据库及访问user表,从而查询所有用户信息。
通过输入语句,查询全部用户,可以看到默认的root用户以及刚才创建的user用户,由于用户字段众多,这里只展示user与host字段。
(3) 修改用户密码
ALTER USER '用户名'@ '主机号' IDENTIFIED WITH mysql_native_password BY '新密码';
通过输入语句,修改user用户密码为abcdef,提示操作成功。
(4) 删除用户
DROP USER '用户名'@ '主机号';
通过输入语句,删除user用户,提示操作成功,再次查询发现user用户被删除。
- 权限控制
(1) 查询权限
SHOW GRANTS FOR '用户名'@ '主机号';
通过输入语句,查询出root用户的权限,可以看到,root用户拥有全部众多的权限。
(2) 授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@ '主机号';
可以通过ON关键字指定作用的数据库或表,可以使用"."来表示所有数据库/表。
创建一个user用户并且只授予SELECT权限,然后通过输入语句,授予user用户INSERT权限,观察前后两次查询权限结构变化。
(3) 撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@ '主机号';
通过输入语句,撤销刚才user用户的INSERT权限,查询并确认结果。
6. DML:数据操作语言
- 添加数据
(1) 给指定字段添加数据
INSERT INTO 表名 (字段名1,字段名2,...) VALUES(值1,值2,...);
插入数据时,指定的字段顺序需要与值的顺序是一一对应的。字符串和日期型数据应该包含在引号中。插入的数据大小,应该在字段的规定范围内。
确认表结构后,就可以根据需求向表里添加数据,这里以学生表为例,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对应的值不能省。
(3) 批量添加数据
INSERT INTO 表名(字段名1,字段名2,...) VALUES (值1,值2,...),(值1,值2,...),(值1,值2,...);
INSERT INTO 表名 VALUES (值1,值2,...),(值1,值2,...),(值1,值2,...);
可以通过第一条语句批量插入对应字段的数据,也可以通过第二条语句批量插入全部字段,注意一定要按顺序一一对应。
通过输入语句,根据需求批量添加数据,这里添加5条学生数据。
- 更新数据
UPDATE 表名 SET 字段名1 = 值1,字段名2 = 值2,... [WHERE 条件];
[WHERE 条件]修改语句的条件是可选项,如果没有条件,则会修改整张表的所有数据。
我们需要把zhangsan的telephone字段改为13000000000,因此可以通过name字段作为条件, 输入语句修改zhangsan的telephone。若不加条件,便修改整张表,例如可以将表中所有数据的sex字段修改为man。
- 删除数据
DELETE FROM 表名 [WHERE 条件];
[WHERE 条件]条件是可选项,如果没有条件,则会删除整张表的所有数据。该语句不能特定删除某一个字段的值。
通过输入语句,可以带条件删除id为1的一行数据,也可以不带条件,删除整张表的数据,此处仅作演示,请勿模仿。
7. DQL:数据查询语言
由于查询语句众多,涉及单表查询,多表查询,聚合查询,子查询等多种,因为关于DQL的讲解将放在另一篇文章《DQL从基础到进阶》中讲述。