MySQL | SQL基础、数据表的基本CURD操作详解

Ubuntu 17.04及之前版本的MySQL数据库的安装过程见下文:
《Ubuntu 18.04 下MySQL数据库的安装、基本配置和完全卸载》

Ubuntu 18.04版本的MySQL数据库的安装过程见下文:

《Ubuntu18.04 解决MySQL不能输入中文的问题》

本文及之后的MySQL相关博文中均使用下述环境:

  • Ubuntu 18.04 64位
  • MySQL 8.0.16

文章目录

    • SQL基础:语句结构、数据类型与运算符
      • 语句结构
      • 数据类型
      • MySQL运算符
    • 数据库的基本操作
      • 创建和查看数据库
      • 修改数据库
      • 删除数据库
    • 数据表的基本操作
      • 创建数据表
      • 修改数据表
      • 删除数据表
    • 表的约束
      • 主键约束
      • 非空约束
      • 唯一约束
      • 默认约束
      • 设置表的字段值自动增加
    • 添加、更新和删除数据
      • 添加数据
      • 更新数据
      • 删除数据


SQL基础:语句结构、数据类型与运算符

结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

SQL可以非常高效的进行数据库的增删改查操作,SQL+索引更是可以实现带各种附加条件的高效率查询操作。


语句结构

结构化查询语言包含6个部分:

1、数据查询语言(DQL:Data Query Language)

其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。

保留字SELECT是DQL(也是所有SQL)用得最多的动词其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。

2、数据操作语言(DML:Data Manipulation Language)

其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。

3、事务处理语言(TPL)

它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。

4、数据控制语言(DCL)

它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。

5、数据定义语言(DDL)

其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREATE TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与数据库目录中获得数据有关的保留字。它也是动作查询的一部分

6、指针控制语言(CCL)

它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。


数据类型

使用MySQL数据库存储数据时,不同的数据类型决定了MySQL存储数据方式的不同。类型规定了数据的大小,因此使用的时候选择合适的类型,不仅会降低表占用的磁盘空间,间接减少了磁盘I/O的次数,提高了表的访问效率,而且索引的效率也和数据的类型息息相关。为此,MySQL数据库提供了多种数据类型,其中包括

  • 整数类型
  • 浮点数类型
  • 定点数类型
  • 日期和时间类型
  • 字符串类型
  • 二进制类型。

整数类型
MySQL | SQL基础、数据表的基本CURD操作详解_第1张图片
浮点数类型和定点数类型
MySQL | SQL基础、数据表的基本CURD操作详解_第2张图片
日期与时间类型
MySQL | SQL基础、数据表的基本CURD操作详解_第3张图片
注意TIMESTAMP会自动更新时间,非常适合那些需要记录最新更新时间的场景,而DATETIME需要手动更新。

字符串和二进制类型
MySQL | SQL基础、数据表的基本CURD操作详解_第4张图片

TEXT类型用于表示大文本数据例如:文章内容、评论等,TEXT类型分为四种,如下表所示:

BLOB类型是一种特殊的二进制类型,它用于表示很大的二进制数据。例如:图片、PDF文档等。BLOB类型分为四种,如下表所示:


MySQL运算符

接下来我们主要介绍 MySQL 的运算符及运算符的优先级。 MySQL 主要有以下几种运算符:

  • 算术运算符
  • 比较运算符
  • 逻辑运算符
  • 位运算符

算术运算符

MySQL 支持的算术运算符包括:
MySQL | SQL基础、数据表的基本CURD操作详解_第5张图片
在除法运算和模运算中,如果除数为0,将是非法除数,返回结果为NULL。


比较运算符

SELECT 语句中的条件语句经常要使用比较运算符。通过这些比较运算符,可以判断表中的哪些记录是符合条件的。比较结果为真,则返回 1,为假则返回 0,比较结果不确定则返回 NULL

MySQL | SQL基础、数据表的基本CURD操作详解_第6张图片

逻辑运算符

逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回 1。如果表达式是假,结果返回 0。

MySQL | SQL基础、数据表的基本CURD操作详解_第7张图片

位运算符

位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。
MySQL | SQL基础、数据表的基本CURD操作详解_第8张图片


数据库的基本操作

创建和查看数据库

MySQL安装完成后,要想将数据存储到数据库的表中,首先要创建一个数据库。创建数据库就是在数据库系统中划分一块存储数据的空间。在MySQL中,创建数据库的基本语法格式如下:

CREATE DATABASE 数据库名称;

注意:数据库名是唯一的,不可重复出现。

接下来创建一个名为 itcast 的数据库:

CREATE DATABASE itcast;

创建成功后,可以使用下述语句来查看数据库:

SHOW DATABASES;
MySQL | SQL基础、数据表的基本CURD操作详解_第9张图片

创建好数据库后,若想查看某个已经创建的数据库信息,可以通过下述语句查看:

SHOW CREATE DATABASE 数据库名称;

我们接下来查看之前已经创建好的数据库itcast:

SHOW CREATE DATABASE itcast;
MySQL | SQL基础、数据表的基本CURD操作详解_第10张图片 上述执行结果显示出看数据库itcast的创建信息,例如,数据库的编码方式为utf8。

修改数据库

MySQL数据库一旦安装成功,创建数据库的编码也就确定了。但如果想修改数据库的编码,可以使用ALTER DATABASE实现。修改数据库编码的基本语法格式如下所示:

ALTER DATABASE 数据库名称 DEFAULT CHARACTER 
SET 编码方式 COLLATE 编码方式_bin;

接下来我们修改itcast数据库的编码格式为gbk:

ALTER DATABASE itcast DEFAULT CHARACTER 
SET gbk COLLATE gbk_bin;
MySQL | SQL基础、数据表的基本CURD操作详解_第11张图片 从上述执行结果我们可以看到,数据库itcast的编码为gbk,我们已经将itcast数据库的编码修改成功了。

删除数据库

删除数据库是将数据库系统中已经存在的数据库删除。成功删除数据库后,数据库中的所有数据都将被清除,原来分配的空间也将被回收。在MySQL中,删除数据库的基本语法格式如下:

DROP DATABASE 数据库名称;

需要注意的是,如果要删除的数据库不存在,那么将会删除失败。

那么接下来我们删除名称为itcast的数据库:

DROP DATABASE itcast;
MySQL | SQL基础、数据表的基本CURD操作详解_第12张图片

从上述执行结果可以看出,数据库系统中已经不存在名称为itcast的数据库了,说明itcast数据库被成功删除了。


数据表的基本操作

创建数据表

CREATE TABLE  表名(字段名1  数据类型[完整性约束条件],
···
字段名n  数据类型[完整性约束条件]);

接下来我们创建一个用于存储学生信息的表tb_grade。

首先创建数据库:

CREATE DATABASE itcast; 

选择使用的数据库:

USE itcast;

创建数据表:

CREATE TABLE tb_grade(
id int, 
name VARCHAR(20), 
grade FLOAT);

查看数据表是否创建成功:

SHOW TABLES;
MySQL | SQL基础、数据表的基本CURD操作详解_第13张图片

查看数据表的创建语句、表的字符编码(使用\G使得显示结果整齐美观)

SHOW CREATE TABLE 表名\G
MySQL | SQL基础、数据表的基本CURD操作详解_第14张图片

使用DESCRIBE语句查看数据表:

DESCRIBE 表名;

-- 简写为
DESC 表名;
MySQL | SQL基础、数据表的基本CURD操作详解_第15张图片

修改数据表

修改表名

alter table 旧表名 rename to 新表名;

接下来我们将数据库itcast中的 tb_grade 表名修改为 grade 表:

alter table tb_grade rename to grade;
MySQL | SQL基础、数据表的基本CURD操作详解_第16张图片

从上述结果可以看出,数据库itcast中的tb_grade已被成功修改为grade了。


修改字段名(注意新数据类型不能为空)

alter table 表名 change 旧字段名 新字段名 新数据类型; 

接下来我们将数据表grade中的name字段修改为username,数据类型保持不变:

alter table grade change name username VARCHAR(20);
MySQL | SQL基础、数据表的基本CURD操作详解_第17张图片

从上述结果可以看出,数据表 grade 中的name字段名称已被成功修改为username了。


修改字段的数据类型

alter table 表名 modify 字段名 数据类型;

接下来我们将数据表grade中 id 字段的数据类型由 int(11) 修改为 int(20) :

alter table grade modify id int(20);
MySQL | SQL基础、数据表的基本CURD操作详解_第18张图片

从上述结果可以看出,数据表 grade 中的 id 字段的数据类型已被成功修改为 int(20) 了。


添加字段

alter table 表名 add 新字段名 数据类型
	[约束条件] [first|after 已存在字段名]

first参数为可选参数,用与将新添加的字段设置为表的第一个字段,after也为可选参数,用于添加新字段到指定的"已存在的字段名"后面。

接下来我们在数据表grade中的 username 字段后面添加一个没有约束条件的INT类型的字段age :

alter table grade add age int(10) after username;
MySQL | SQL基础、数据表的基本CURD操作详解_第19张图片

从上述结果可以看出,数据表 grade 中的 username 字段后面成功添加了age字段。


删除字段

alter table 表名 drop 字段名

接下来我们删除grade表中的age字段:

alter table grade drop age;
MySQL | SQL基础、数据表的基本CURD操作详解_第20张图片

从上述结果可以看出,数据表 grade 中的 age字段后面成功添加了age字段。


修改字段的排列位置

alter table 表名 modify 字符段1 数据类型 first|after 字段2

first参数为可选参数,指的是将字段1修改为表的第一个字段,after也为可选参数,用于将字段1插入到字段2的后面。

接下来我们将数据表grade中的username字段修改为表的第一个字段:

alter table grade modify username VARCHAR(20) first;
MySQL | SQL基础、数据表的基本CURD操作详解_第21张图片

接下来我们将数据表grade中的id字段插入到grade字段的后面:

alter table grade modify id int(20) after grade;
MySQL | SQL基础、数据表的基本CURD操作详解_第22张图片

删除数据表

删除数据表是指删除数据库中已存在的表。在删除数据表的同时,数据表中的存储的数据都将被删除。需要注意的是,创建数据表时,表和表之间可能会存在关联,要删除这些被其他表关联的表比较复杂,之后会讲解。下面是删除没有关联的表:

drop table 表名;

表的约束

为了防止数据表中插入错误的数据,MySQL中定义了一些维护数据库完整性的规则,即表的约束。下面列举了常见的表的约束。

  • PRIMARY KEY:主键约束,用于唯一标识对应的记录
  • FOREIGN KEY:外键约束
  • NOT NULL:非空约束
  • UNIQUE:唯一性约束
  • DEFAULT:默认值约束

主键约束

在MySQL中,为了快速查找表中的某条信息,可以通过设置主键来实现。主键约束是通过 PRIMARY KEY 定义的,它可以唯一的标识表中的记录。在MySQL中,主键约束分为以下两种:

  • 单字段主键
  • 多字段主键

单字段主键

单字段主键指的是由一个字段构成的主键,基本语法格式如下:

字段名 数据类型 primary key

示例:创建一个数据表example,并设置 id 作为主键。

create table example
(id INT primary key,
 name VARCHAR(20),
 grade FLOAT);

多字段主键(联合主键)

多字段主键指的是多个字段组合而成的主键,基本语法格式如下:

primary key(字段名1, 字段名2, 字段名n)

示例:创建一个数据表example,在表中将 stu_id 和 course_id 两个字段共同作为主键。

create table example
(stu_id INT,
 course_id INT,
 grade FLOAT
 primary key(stu_id, course_id)
);

注意:每个数据表中最多只能有一个主键约束,定义为primary key的字段不能有重复值且不能为NULL值。


非空约束

非空约束指的是字段的值不能为NULL,在MySQL中,非空约束是通过NOT NULL定义的,其基本的语法格式如下所示:

字段名 数据类型 NOT NULL;

示例:创建一个数据表example,为表中的name字段设置非空约束。

create table example
(id INT primary key,
 name VARCHAR(20) NOT NULL,
 grade FLOAT);

需要注意的是,在同一个数据表中可以定义多个非空字段


唯一约束

唯一约束用于保证数据表中字段值的唯一性,即表中字段的值不能重复出现。其基本语法格式如下:

字段名 数据类型 unique;

示例:创建一个数据表example,为表中的 stu_id 字段设置唯一约束。

create table example
(id INT primary key,
 stu_id INT UNIQUE,
 name VARCHAR(20) NOT NULL);

默认约束

默认约束用于给数据表中的字段指定默认值,即当在表中插入一条新记录时,如果没有给这个字段赋值,那么数据库系统会自动为这个字段插入默认值,基本语法格式如下:

字段名 数据类型 default 默认值;

示例:创建一个数据表example,为表中的 grade 字段设置唯一约束。

create table example
(id INT primary key,
 stu_id INT UNIQUE,
  grade FLOAT DEFAULT 0);

设置表的字段值自动增加

在数据表中,若想为表中插入的新纪录自动生成唯一的ID,可以使用AUTO_INCREMENT约束来实现。

AUTO_INCREMENT约束的字段可以是任何整数类型。默认情况下,该字段的值是从1开始自增的。其基本语法格式如下:

字段名 数据类型 auto_increment
create table example
(id INT primary key AUTO_INCREMENT,
 stu_id INT UNIQUE,
  grade FLOAT DEFAULT 0);

添加、更新和删除数据

要操作数据表中的数据,必须通过MySQL提供了数据库操作语言实现,包括插入数据的 INSERT 语句,更新数据的 UPDATE 语句以及删除数据的 DELETE 语句。

添加数据

要操作数据表中的数据,首先要保证数据表中存在数据,MySQL使用 INSERT 向数据表中添加数据,并且根据添加方式的不同分为三种,分别是为表的所有字段添加数据、为表的指定字段添加数据、同时添加多条记录。接下来进行详细的讲解。


为表中所有字段添加数据

为表中所有字段添加数据的INSERTE语句有两种:

  • INSERT语句中指定所有字段名
  • INSERT语句中不指定字段名

INSERTE语句中指定所有字段名

基本语法格式如下:

INSERT INTO 表名(字段名1, 字段名2, ··)
	VALUES(1,2, ···);
	
-- 示例
INSERT INTO student(id,name,grade)
VALUES(1, ’zhangsan‘, 98.5);

INSERTE语句中不指定字段名

基本语法格式如下:

INSERT INTO 表名 VALUES(1,2, ···);
	
-- 示例
INSERT INTO student
VALUES(3, ’wangwu‘,61.5);

为表的指定字段添加数据

基本语法格式如下:

INSERT INTO 表名(字段名1, 字段名2, ···)
	VALUES(1,2, ···);
	
-- 示例
INSERT INTO student(id,name)
VALUES(4, ’zhaoyun‘);

注意:如果某个字段在定义时添加了非空约束,但是没有添加default默认约束,那么插入新纪录时就必须为该字段赋值,否则数据库系统会提示错误。


同时添加多条记录

有时候,需要一次向表中添加多条记录,当然可以使用上述两种方式将记录逐条添加,但这样做需要添加多条INSERT语句,比较麻烦

更重要的是INSERT逐条添加的效率问题,当我们使用MySQL数据库时,便与MySQL服务器建立了一条TCP连接,每次发送的SQL语句都是一次完整的通信过程,但我们发送多条SQL语句时,便是进行了多次通信,而我们使用INSERT语句可以实现一次添加多条记录,这样不但完成了业务工作,也减少了通信次数,提高了使用效率

基本语法格式如下:

INSERT INTO 表名(字段名1, 字段名2, ···)
	VALUES(1,2, ···),
	(1,2, ··`),
	···
	(1,2, ···);		/*每条记录直接使用逗号隔开*/
	
-- 示例
INSERT INTO student VALUES
(6, ’liubei‘, 99),
(7, ’guanyu‘, 100),
(8, ’zhangfei‘, 40.5);

更新数据

更新数据是指对表中存在的记录进行修改,这是数据库常见的操作,比如某个学生改了名字,就需要对其记录的name字段值进行修改,MySQL中使用UPDATE语句来更新表中的记录,其基本的语法格式如下所示:

UPDATE 表名
	SET 字段名1=1[,字段名2=2,···]
	[WHERE 条件表达式]

UPDATE对表中数据的更新可以实现两种操作:

  • UPDATE 更新部分数据
  • UPDATE 更新全部数据

UPDATE 更新部分数据

更新部分数据是指根据指定的条件更新表中的某一条或几条记录,需要使用WHERE子句来指定更新记录的条件

-- 示例
UPDATE student
SET name='caocao',score=50
WHERE id=1;

UPDATE student
SET grade='合格'
WHERE score > 60;

UPDATE 更新全部数据

如果UPDATE语句中没有使用WHERE子句,那么表中所有记录的指定字段都会被更新。

-- 示例
UPDATE student
SET grade=80;

删除数据

删除数据是对表中已存在的记录进行删除,这是数据库的常见操作,比如一个学生转学了,就需要在student表中将其信息记录删除,MySQL中使用DELETE语句来删除表中的记录,其基本语法格式如下:

DELETE FROM 表名 [WHERE 条件表达式]

同样的,DELETE对表中数据的删除可以实现两种操作:

  • DELETE 删除部分数据
  • DELETE 删除全部数据

DELETE 删除部分数据

删除部分数据是指根据指定的条件删除表中的某一条或几条记录,需要使用WHERE子句来指定删除记录的条件。

-- 示例
DELETE FROM student
WHERE id=11;

DELETE FROM student
WHERE id>5;

DELETE 删除全部数据

如果DELETE语句中没有使用WHERE子句,那么表中所有记录都会被删除。

-- 示例
DELETE FROM student;

使用关键字TRUNCATE 删除表中数据

在MySQL数据库中,还有一种方式可以删除表中的所有记录,这种方式需要用到一个关键字TRUNCATE,其语法格式如下:

TRUNCATE [TABLE] 表名
-- 示例
TRUNCATE TABLE student;

TRUNCATE语句和DELETE语句都可以实现删除表中所有数据的功能,但两者也存在一定的区别。

  • DELETE语句是DML语言,TRUNCATE语句通常被认为是DDL语言
  • DELETE语句后面可以跟WHERE子句删除表中部分记录,而TRUNCATE语句只能用于删除表中的全部记录
  • 使用TRUNCATE语句删除表中数据后,再次向表中添加记录时,若表中存在有自动增加属性的字段,那么它值将重新从1开始;而DELETE语句删除表中数据后,再次向表中添加记录时,自动增加属性的字段的值为删除时该字段的最大值加一
  • 使用DELETE语句时,每删除一条记录都会在日志中记录,而使用TRUNCATE语句时,不会在日志中记录删除的内容,因此TRUNCATE语句的执行效率比DELETE语句要高。

你可能感兴趣的:(MySQL,MySQL数据库)