飞道的博客

超详细的 MySQL 学习教程(多实例、附练习、视频讲解持续更新)

477人阅读  评论(0)

一、启动、连接、断开和停止MySQL服务器命令

1.1 启动、停止 MySQL 服务器

【方式1】图形化界面方式操作。Windows + R 快捷键调出如下窗口,并输入命令:services.msc,回车,打开 Windows 服务管理器,在服务器的列表中找到 MySQL 服务并右键单击,在弹出的快捷菜单中,完成 MySQL 服务的各种操作(启动、重新启动、停止、暂停和恢复)如下图所示:


【方式2】在命令提示符下启动、停止MySQL服务器。命令如下:

-- 你安装的什么版本的数据库后面就写什么,笔者安装的是mysql80
net start mysql80  --启用MySQL服务器
net stop mysql80  --停止MySQL服务器

效果如下图所示:

1.2 连接和断开MySQL服务器

【示例1】连接mysql服务器。password表示你安装mysql数据库时设置的密码。命令如下:

\> mysql -uroot -h127.0.0.1 -ppassword
\>mysql -uroot -h127.0.0.1 -pmysql

注意:在连接MySQL服务器时,MySQL服务器所在地址(如127.0.0.1)可以省略不写。另外在通过 -p 参数指定密码时,参数 -p 和密码之间不要写空格,即直接在 -p 的后面写上密码,输入完命令语句后,按Enter键即可连接MySQL服务器。或者输入完-p之后,按Enter键再输入密码(以加密的方式显示),然后按Enter键即可成功连接MySQL服务器。如下图所示:

【示例2】断开MySQL服务器。在MySQL提示符下输入“exit”或者“quit”命令断开MySQL连接。格式如下:

mysql> quit;
mysql> exit; --两种方式都可

1.1 本小节练习

  1. 使用配置向导配置 MySQL 为系统服务,在系统服务对话框中,手动启动或者关闭 MySQL 服务。
  2. 使用 NET 命令启动或者关闭 MySQL 服务。
  3. 登录数据库(连接 MySQL 服务器)。
  4. 退出数据库(断开 MySQL 连接)。

二、MySQL数据库管理

2.1 创建数据库 语法:CREATE DATABASE 数据库名;

【示例1】创建名称为test的数据库。具体代码如下:

mysql> CREATE DATABASE test;

运行效果如下图所示:

【示例2】其他命令创建数据库。具体代码如下:

mysql> CREATE SCHEMA db_test; --使用SCHEMA创建数据库
mysql> CREATE DATABASE db_test_gbk CHARACTER SET=GBK; --创建指定字符集的数据库
mysql> CREATE DATABASE db_test_utf8 CHARSET=utf8;
--创建数据库前判断是否存在同名数据库。在MySQL中,不允许同一系统中存在两个相同名称的数据库
mysql> CREATE DATABASE IF NOT EXISTS db_library;

2.2 查看数据库语法:SHOW DATABASES;

2.3 选择数据库:USE 数据库名;

--选择名称为db_library的数据库
mysql> USE db_library;

运行效果如下图所示:

2.4 修改数据库:ALTER DATABASE;(了解)

--修改上面创建的数据库db_test_gbk
mysql> ALTER DATABASE db_test_gbk
    -> DEFAULT CHARACTER SET utf8
    -> DEFAULT COLLATE utf8_general_ci;

2.5 删除数据库:DROP DATABASE 数据库名;

--删除名称为db_test_gbk的数据库
mysql> DROP DATABASE db_test_gbk;

2.6 数据库存储引擎的应用。

【示例1】查询支持的全部存储引擎。

--\G:让结果显示得更加美观
mysql> SHOW ENGINES \G;

【示例2】查询默认的存储引擎。

mysql> SHOW VARIABLES LIKE '%storage_engine%';

2.1 本小节练习

  1. 查看当前系统中的数据库。
  2. 创建数据库 zoo。
  3. 选择当前数据库为 zoo,查看数据库 zoo 的信息。
  4. 删除数据库 zoo。
  5. 查看默认存储引擎。

三、MySQL表结构管理

3.1 MySQL 数据类型

在 MySQL 数据库中,每一条数据都有其数据类型。MySQL 支持的数据类型,主要分成 3 类:数字类型、字符串(字符)类型、日期和时间类型。

3.1.1 数字类型总体可以分成整型和浮点型两类,详细内容如表1和表2所示:

数 据 类 型 取 值 范 围 说 明 单 位
TINYINT 符号值:-127~127 无符号值:0~255 最小的整数 1字节
BIT 符号值:-127~127 无符号值:0~255 最小的整数 1字节
BOOL 符号值:-127~127 无符号值:0~255 最小的整数 1字节
SMALLINT 符号值:- 32768~32767 无符号值:0~65535 小型整数 2字节
MEDIUMINT 符号值:- 8388608~8388607 无符号值:0~16777215 中型整数 3字节
INT 符号值:- 2147683648~2147683647 无符号值:0~4294967295 标准整数 4字节
BIGINT - 9223372036854775808~9223372036854775807 无符号:0~18446744073709551615 大整数 8字节


说明:在创建表时,使用哪种数字类型,应遵循以下原则:

  1. 选择最小的可用类型,如果值永远不超过 127,则使用 TINYINT 比 INT 强。
  2. 对于完全都是数字的,可以选择整数类型。
  3. 浮点类型用于可能具有小数部分的数。如货物单价、网上购物交付金额等。

3.1.2 字符串类型可以分为 3 类:普通的文本字符串类型(CHAR和VARCHAR)、可变类型(TEXT和BLOB)和特殊类型(SET和ENUM)。它们之间都有一定的区别,取值的范围不同,应用的地方也不同。

  1. 普通的文本字符串类型,即 CHAR 和 VARCHAR 类型,CHAR 列的长度被固定为创建表所声明的长度,取值在 1~255 之间;VARCHAR 列的值是变长的字符串,取值和 CHAR 一样。下面介绍普通的文本字符串类型如下表所示:

  2. TEXT 和 BLOB 类型。它们的大小可以改变,TEXT 类型适合存储长文本,而 BLOB 类型适合存储二进制数据,支持任何数据,例如文本、声音和图像等。下面介绍 TEXT 和 BLOB 类型,如下表所示:

    数 据 类 型 最大长度(字节数) 说 明
    TINYBLOB 2^8~1(225) 小BLOB字段
    TINYTEXT 2^8~1(225) 小TEXT字段
    BLOB 2^16~1(65 535) 常规BLOB字段
    TEXT 2^16~1(65 535) 常规TEXT字段
    MEDIUMBLOB 2^24~1(16 777 215) 中型BLOB字段
    MEDIUMTEXT 2^24~1(16 777 215) 中型TEXT字段
    LONGBLOB 2^32~1(4 294 967 295) 长BLOB字段
    LONGTEXT 2^32~1(4 294 967 295) 长TEXT字段
  3. 特殊类型 SET 和 ENUM。特殊类型 SET 和 ENUM 的介绍如下表所示:

    数 据 类 型 最大值 说 明
    Enum (“value1”, “value2”, …) 65 535 该类型的列只可以容纳所列值之一或为NULL
    Set (“value1”, “value2”, …) 64 该类型的列可以容纳一组值或为NULL

说明:在创建表时,使用字符串类型时应遵循以下原则:

  1. 从速度方面考虑,要选择固定的列,可以使用 CHAR 类型。
  2. 要节省空间,使用动态的列,可以使用 VARCHAR 类型。
  3. 要将列中的内容限制在一种选择,可以使用 ENUM 类型。
  4. 允许在一个列中有多于一个的条目,可以使用 SET 类型。
  5. 如果要搜索的内容不区分大小写,可以使用 TEXT 类型。
  6. 如果要搜索的内容区分大小写,可以使用 BLOB 类型。

3.1.3 日期和时间数据类型

日期和时间类型包括:DATETIME、DATE、TIMESTAMP、TIME和YEAR。其中的每种类型都有其取值的范围,如赋予它一个不合法的值,将会被 0 代替。下面介绍日期和时间数据类型,如下表所示:

数 据 类 型 取值范围 说 明
DATE 1000-01-01 9999-12-31 日期,格式YYYY-MM-DD
TIME -838:58:59 835:59:59 时间,格式HH:MM:SS
DATETIME 1000-01-01 00:00:00 9999-12-31 23:59:59 日期和时间,格式YYYY-MM-DD HH:MM:SS
TIMESTAMP 1970-01-01 00:00:00 2037年的某个时间 时间标签,在处理报告时使用显示格式取决于M的值
YEAR 1901-2155 年份可指定两位数字和四位数字的格式

3.2 创建表、修改表、查看表、删除表操作

创建数据表使用 CREATE TABLE语 句。语法如下:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 数据表名
[(create_definition,)][table_options] [select_statement]

CREATE TABLE 语句的参数说明如下表所示:

关键字 说明
TEMPORARY 如果使用该关键字,表示创建一个临时表
IF NOT EXISTS 该关键字用于避免表存在时MySQL报告的错误
create_definition 这是表的列属性部分。MySQL要求在创建表时,表要至少包含一列
table_options 表的一些特性参数
select_statement SELECT语句描述部分,用它可以快速地创建表

下面介绍列属性 create_definition 部分,每一列定义的具体格式如下:

col_name  type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
           [PRIMARY KEY ] [reference_definition]

属性 create_definition 的参数说明如下表所示:

关键字 说明
col_name 字段名
type 字段类型
NOT NULL | NULL 指出该列是否允许是空值,系统一般默认允许为空值,所以当不允许为空值时,必须使用NOT NULL
DEFAULT default_value 表示默认值
AUTO_INCREMENT 表示是否是自动编号,每个表只能有一个AUTO_INCREMENT列,并且必须被索引
PRIMARY KEY 表示是否为主键。一个表只能有一个PRIMARY KEY。如表中没有一个PRIMARY KEY,而某些应用程序需要PRIMARY KEY,MySQL将返回第一个没有任何NULL列的UNIQUE键,作为PRIMARY KEY
reference_definition 为字段添加注释

以上是创建一个数据表的一些基础知识,它看起来十分复杂,但在实际的应用中使用最基本的格式创建数据表即可,具体格式如下:

CREATE TABLE table_name(列名1 属性,列名2 属性…);

【示例1】使用 CREATE TABLE 语句在 MySQL 数据库 test 中创建一个名为 tb_bookinfo 的数据表,该表包括 id、barcode、bookname、typeid、author、ISBN、price、page、bookcase和inTime等字段。具体步骤如下。

mysql> USE test;
Database changed
mysql> CREATE TABLE tb_bookinfo(
    -> barcode VARCHAR(30),
    -> bookname VARCHAR(70),
    -> typeid INT(10) UNSIGNED,
    -> author VARCHAR(30),
    -> ISBN VARCHAR(20),
    -> price FLOAT(8,2),
    -> page INT(10) UNSIGNED,
    -> bookcase INT(10) UNSIGNED,
    -> inTime DATE,
    -> del TINYINT(1) DEFAULT '0',
    -> id INT(11) NOT NULL);
Query OK, 0 rows affected, 6 warnings (0.05 sec)

【示例2】在MySQL数据库test中创建一个名为tb_booktype的数据表,要求使用MyISAM存储引擎。具体步骤如下。

mysql> CREATE TABLE tb_booktype(
    -> id INT(10) UNSIGNED NOT NULL,
    -> typename VARCHAR(30),
    -> days INT UNSIGNED) ENGINE MyISAM;
Query OK, 0 rows affected, 1 warning (0.02 sec)

【示例3】在MySQL数据库test中创建一个名为tb_booktype1的数据表,要求将id字段设置为自动编号字段。在将字段为自增类型字段时,建议将其设置为主键,否则数据表将创建失败。

mysql> CREATE TABLE tb_booktype1(
    -> id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    -> typename VARCHAR(30),
    -> days INT(10) UNSIGNED,
    -> PRIMARY KEY(`id`));
Query OK, 0 rows affected, 2 warnings (0.02 sec)

【示例4】创建图书类型表,并设置其字符集为 utf8,可以使用下面的代码。

-- 如果省略了DEFAULT CHARSET属性,那么该表将沿用数据库字符集的值,即my.ini文件中指定的default-character-set变量的值。
mysql> CREATE TABLE tb_booktype1(
    -> id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    -> typename VARCHAR(30),
    -> days INT(10) UNSIGNED,
    -> PRIMARY KEY(`id`)) DEFAULT CHARSET=utf8;
Query OK, 0 rows affected, 3 warnings (0.03 sec)

【示例5】复制表结构。

--在数据库test中创建一份数据表tb_bookinfo的拷贝tb_bookinfobak
USE test;
--向数据表tb_bookinfo中插入一条数据
INSERT INTO tb_bookinfo VALUES ('9787115418425','Java Web程序设计慕课版',3,'清华出版社',
'115',49.80,350,1,'2017-02-04',0,1);

--1.数据表tb_bookinfo和tb_bookinfobak的表结构是一样的,但是在复制表时,并没有复制表中的数据
CREATE TABLE tb_bookinfobak LIKE tb_bookinfo; 

--2.如果在复制数据表时,想要同时复制其中的内容,那么需要使用下面的代码来实现
CREATE TABLE tb_bookinfobak1 AS SELECT * FROM tb_bookinfo;

--3.如果想要复制一下表结构和数据都完全一样的数据表,那么需要应用下面的两条语句实现。
CREATE TABLE tb_bookinfobak1 LIKE tb_bookinfo;
INSERT INTO tb_bookinfobak1 SELECT * FROM tb_bookinfo;

【示例6】修改字段。

--1.在为数据表tb_bookinfobak中添加一个translator字段,
--类型为varchar(30),not null,将字段inTime的类型由date改为DATETIME(6)
ALTER TABLE tb_bookinfobak ADD translator VARCHAR(30) NOT NULL, MODIFY inTime DATETIME(6);
--修改数据表结构后,可以通过语句desc tb_bookinfobak;查看整个表的结构,以确认是否修改成功。
--通过alter修改表列,其前提是必须将表中数据全部删除,然后才可以修改表列。

总结:修改表结构使用 ALTER TABLE 语句。修改表结构指增加或者删除字段、修改字段名称或者字段类型、设置取消主键外键、设置取消索引以及修改表的注释等。语法如下:

Alter[IGNORE] TABLE 数据表名 alter_spec[,alter_spec]-- 当指定IGNORE时,如果出现重复关键的行,则只执行一行,其他重复的行被删除。

其中,alter_spec 子句定义要修改的内容,其语法如下:

alter_specification:
    ADD [COLUMN] create_definition [FIRST | AFTER column_name ]   --添加新字段
  |  ADD INDEX [index_name] (index_col_name,...)                             --添加索引名称
  |  ADD PRIMARY KEY (index_col_name,...)                              --添加主键名称
  |  ADD UNIQUE [index_name] (index_col_name,...)                      --添加唯一索引
  |  ALTER [COLUMN] col_name {
  SET DEFAULT literal | DROP DEFAULT}       --修改字段名称
  |  CHANGE [COLUMN] old_col_name create_definition                      --修改字段类型
  |  MODIFY [COLUMN] create_definition                                         --修改子句定义字段
  |  DROP [COLUMN] col_name                                                --删除字段名称
  |  DROP PRIMARY KEY                                                            --删除主键名称
  |  DROP INDEX index_name                                                        --删除索引名称
  |  RENAME [AS] new_tbl_name                                                    --更改表名
  |  table_options

ALTER TABLE 语句允许指定多个动作,其动作间使用逗号分隔,每个动作表示对表的一个修改。
【示例7】修改约束条件。

--1.添加约束
-- Alter TABLE 数据表名 ADD CONSTRAINT 约束名 约束类型 (字段名)
-- 为数据表tb_bookinfo添加主键约束,可以使用下面的代码。
ALTER TABLE tb_bookinfo ADD CONSTRAINT amoprimary PRIMARY KEY(id);

--2.删除约束
--删除主键约束:ALTER TABLE 表名 DROP PRIMARY KEY
ALTER TABLE tb_bookinfo DROP PRIMARY KEY;
--删除外键约束:ALTER TABLE 表名 DROP FOREIGN KEY 约束名
--删除唯一约束:ALTER TABLE 表名 DROP INDEX 唯一索引名

其中,MySQL 支持的约束类型如下表所示:

约束类型 说明
PRIMARY KEY 主键约束
DEFAULT 默认值约束
UNIQUE KEY 唯一约束
NOT NULL 非空约束
FOREIGN KEY 外键约束

【示例8】修改表的其他选项。

--1.修改表的存储引擎 ALTER TABLE 表名 ENGINE=新的存储引擎类型
--修改数据表tb_bookinfo的存储引擎为MyISAM
ALTER TABLE tb_bookinfo ENGINE=MyISAM;

--2.修改表的字符集:ALTER TABLE 表名 DEFAULT CHARSET=新的字符集
--修改数据表tb_bookinfo的字符集为GBK
ALTER TABLE tb_bookinfo DEFAULT CHARSET=GBK;

--3.修改表的自增类型字段的初始值:ALTER TABLE 表名 AUTO_INCREMENT==新的初始值
--修改数据表tb_bookinfo的自增类型字段的初始值为100
 ALTER TABLE tb_bookinfo AUTO_INCREMENT=100;

【示例9】修改表名。RENAME TABLE 数据表名1 To 数据表名2。

--该语句可以同时对多个数据表进行重命名,多个表之间以逗号“,”分隔。
--图书信息表的副本tb_bookinfobak重命名为tb_books
RENAME TABLE tb_bookinfobak TO tb_books;

【示例10】删除表。DROP TABLE 数据表名;

-- 1.删除重命名后的图书信息表的副本tb_books
DROP TABLE tb_books;

--2.在删除数据表的过程中,删除一个不存在的表将会产生错误,如果在删除语句中加入IF EXISTS关键字就不会出错了
-- DROP TABLE IF EXISTS 数据表名;
DROP TABLE IF EXISTS tb_books;

【示例11】查看表基本结构语句。DESC(DESCRIBE) 表名。

--使用DESC查看tb_bookinfo的表结构
DESC tb_bookinfo;

【示例12】定义主键约束、非空约束、CHECK约束。

--创建学生信息表tb_student,限制其age字段的值只能是7-18之间(不包括18)的数
mysql> CREATE TABLE tb_student(
    -> id INT AUTO_INCREMENT,
    -> name VARCHAR(30) NOT NULL,
    -> sex VARCHAR(2),
    -> age INT NOT NULL CHECK(age>6 and age<18),
    -> remark VARCHAR(100),
    -> PRIMARY KEY(id));
Query OK, 0 rows affected (0.06 sec)

3.3 本节练习

  1. 打开 Windows 命令行,输入登录用户名和密码。

  2. 创建数据库 company。

  3. 创建表 offices。

    字段名 数据类型 主键 外键 非空 唯一 自增
    officeCode INT(10)
    city INT(11)
    address VARCHAR(50)
    country VARCHAR(50)
    postalCode VARCHAR(25)
  4. 创建表 employees。

    字段名 数据类型 主键 外键 非空 唯一 自增
    employeeNumber INT(11)
    lastName VARCHAR(50)
    firstName VARCHAR(50)
    mobile VARCHAR(25)
    officeCode VARCHAR(10)
    jobTitle VARCHAR(50)
    birth DATETIME
    note VARCHAR(255)
    sex VARCHAR(5)
  5. 查看数据库 company 中所有的表。

  6. 使用 DESC 分别查看 offices 和 employees 表。

  7. 将表 employees 的 mobile 字段修改到 officeCode 字段后面。

  8. 将表 employees 的 birth 字段改名为 employee_birth。

  9. 修改 sex 字段,数据类型为 CHAR(1),非空约束。

  10. 删除字段 note。

  11. 增加字段 favoriate_activity,数据类型为 VARCHAR(100)。

  12. 删除数据表 offices。

  13. 修改表 employees 存储引擎为 MyISAM。

  14. 将表 employees 名称修改为 employees_info。

五、表记录的更新操作

5.1 使用INSERT…VALUES语句插入新记录

使用 INSERT…VALUES 语句插入数据,是 INSERT 语句的最常用的语法格式。它的语法格式如下:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] 数据表名 [(字段名,...)]
    VALUES ({值 | DEFAULT},...),(...),...
    [ ON DUPLICATE KEY UPDATE 字段名=表达式, ... ]

参数说明如下表所示:

参数 说明
[LOW_PRIORITY | DELAYED | HIGH_PRIORITY] 可选参数,其中LOW_PRIORITY是INSERT、UPDATE和DELETE语句都支持的一种可选修饰符,通常应用在多用户访问数据库的情况下,用于指示MySQL降低INSERT、DELETE或UPDATE操作执行的优先级;DELAYED是INSERT语句支持的一种可选修饰符,用于指定MySQL服务器把待插入的行数据放到一个缓冲器中,直到待插数据的表空闲时,才真正在表中插入数据行;HIGH_PRIORITY是INSERT和SELECT语句支持的一种可选修饰符,它的作用是用于指定INSERT和SELECT操作优先执行的
[IGNORE] 可选项,表示在执行INSERT语句时,所出现的错误都会被当作警告处理
[INTO] 数据表名 用于指定被操作的数据表,其中,[INTO]为可选项
[(字段名,…)] 可选项,当不指定该选项时,表示要向表中所有列插入数据,否则表示向数据表的指定列插入数据
VALUES ({值 | DEFAULT},…),(…),… 必选项,用于指定需要插入的数据清单,其顺序必须与字段的顺序相应。其中的每一列的数据可以通过一个常量、变量、表达式或者NULL,但是其数据类型要与对应的字段类型相匹配;也可以直接使用DEFAULT关键字,表示为该列插入默认值,但是使用的前提是已经明确指定了默认值,否则会出错
ON DUPLICATE KEY UPDATE子句 可选项,用于指定向表中插入行时,如果导致UNIQUE KEY或PRIMARY KEY出现重复值,系统会根据UPDATE后的语句修改表中原有行数据

【示例1】在 test 数据库下创建表tb_manager,sql语句如下:

USE test; --1.切换数据库
CREATE TABLE tb_manager( --2.创建表
id INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30),
PWD VARCHAR(30));
DESC tb_manager; --3.查看表结构

--在编写SQL语句之前,我们要养成好的习惯就是先查看一下数据表的表结构

【示例2】通过INSERT…VALUES语句向tb_manager中插入一条完整的数据,sql语句如下:

mysql> INSERT INTO tb_manager VALUES(1, 'amo', '123456');
Query OK, 1 row affected (0.00 sec)
--查看数据表tb_manager中的数据
SELECT * FROM tb_manager;

【示例3】通过INSERT… VALUES语句向数据表tb_manager中插入数据记录的一部分,sql语句如下:

INSERT INTO tb_manager(name, PWD) VALUES('amox','AmoXiang');
--说明:由于在设计数据表时,将id字段设置为自动编号,所以即使我们没有指定id的值,MySQL也会自动为它填上相应的编号。

【示例4】通过INSERT… VALUES语句向数据表tb_manager中一次插入多条记录。sql语句如下:

mysql> INSERT INTO tb_manager(name,PWD)
    -> VALUES('admin', '111'),
    -> ('paul', '222'),
    -> ('jerry', '333');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

--通过SELECT * FROM tb_manager来查看数据表tb_manager中的数据
SELECT * FROM tb_manager;

执行效果如下图所示:

5.2 使用INSERT……SELECT语句插入结果集

在 MySQL 中,支持将查询结果插入到指定的数据表中,这可以通过 INSERT…SELECT 语句来实现。语法格式如下:

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
    [INTO] 数据表名 [(字段名,...)]
    SELECT ...
    [ ON DUPLICATE KEY UPDATE 字段名=表达式, ... ]

参数说明如下表所示:

参数 说明
[LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] 可选项,其作用与INSERT…VALUES语句相同,这里将不再赘述
[INTO] 数据表名 用于指定被操作的数据表,其中,[INTO]为可选项,可以省略
[(字段名,…)] 可选项,当不指定该选项时,表示要向表中所有列插入数据,否则表示向数据表的指定列插入数据
SELECT子句 用于快速的从一个或者多个表中取出数据,并将这些数据作为行数据插入到目标数据表中。需要注意的是:SELECT子句返回的结果集中的字段数、字段类型必须与目标数据表完全一致
ON DUPLICATE KEY UPDATE子句 可选项,,其作用与INSERT…VALUES语句相同,这里将不再赘述

【示例1】在 test 数据库下创建借阅表,主要包括ID、读者ID、图书ID、借阅时间、归还时间、操作员、是否归还字段,sql语句如下:

mysql> CREATE TABLE tb_borrow(
    -> id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    -> readerid INT(10) UNSIGNED,
    -> bookid INT(10),
    -> borrowTime DATE,
    -> backTime DATE,
    -> operator VARCHAR(30),
    -> ifback TINYINT(1) DEFAULT '0',
    -> PRIMARY KEY(id)) DEFAULT CHARSET=utf8;
Query OK, 0 rows affected, 5 warnings (0.05 sec)

【示例2】向借阅表中插入两条数据,sql语句如下:

INSERT INTO tb_borrow(readerid,bookid,borrowTime,backTime,operator,ifback)
VALUES(1,1,'2021-05-23','2021-06-23','amo',1),
(1,2,'2021-05-23','2021-05-31','paul',0);
--查询借阅表的数据,具体代码如下:
SELECT * FROM tb_borrow;

【示例3】创建归还表,主要包括ID、读者ID、图书ID归还日期、操作员字段,sql语句如下:

mysql> CREATE TABLE tb_giveback(
    -> id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    -> readerid INT(11),
    -> bookid INT(11),
    -> backTime DATE,
    -> operator VARCHAR(30),
    -> PRIMARY KEY(id)) DEFAULT CHARSET=utf8;
Query OK, 0 rows affected, 4 warnings (0.06 sec)

【示例4】从数据表tb_borrow中查询readerid和bookid字段的值,插入到数据表tb_giveback中。sql语句如下:

mysql> INSERT INTO tb_giveback
    -> (readerid, bookid)
    -> SELECT readerid, bookid FROM tb_borrow;
--通过SELECT语句来查看数据表tb_giveback中的数据
SELECT * FROM tb_giveback;

执行效果如下图所示:

说明:通INSERT语句和SELECT语句可以使用相同的字段名,也可以使用不同的字段名。因为MySQL不关心SELECT语句返回的字段名,它只是将返回的值按列插入到新表中。

5.3 使用REPLACE语句插入新记录

在实现数据插入时,还可以使用 REPLACE 插入新记录。REPLACE 语句与 INSERT INTO 语句类似。所不同的是:如果一个要插入数据的表中存在主键约束(PRIMARY KEY)或者唯一约束(UNIQUE KEY),而且要插入的数据中又包含与要插入数据的表中相同的主键约束或唯一约束列的值,那么使用 INSERT INTO 语句则不能插入这条记录,而使用 REPLACE 语句则可以插入,只不过它会先将原数据表中起冲突的记录删除,然后再插入新的记录。REPLACE 语句有以下 3 种语法格式。

REPLACE INTO 数据表名[(字段列表)] VALUES(值列表)
REPLACE INTO 目标数据表名[(字段列表1)] SELECT (字段列表2) FROM 源表 [WHERE 条件表达式]
REPLACE INTO 数据表名 SET 字段1=1,字段2=2,字段3=3……

【示例1】向归还表tb_giveback中插入两条数据。sql语句如下:

mysql> INSERT INTO tb_giveback
    -> SELECT id,readerid,bookid,backtime,operator FROM tb_borrow;

执行后的效果如下图所示:

从上图中,可以发现在插入数据时产生了主键重复。下面再应用 REPLACE 语句实现同样的操作,代码如下:

mysql> REPLACE INTO tb_giveback
    -> SELECT id,readerid,bookid,backtime,operator FROM tb_borrow;

执行后的效果如下图所示:

从上图中,可以发现数据被成功插入了。通过 SELECT 语句来查看数据表 tb_giveback 中的数据。

5.4 修改表记录

要执行修改的操作可以使用 UPDATE 语句,语法如下:

UPDATE 数据表名 SET column_name = new_value1,column_name2 = new_value2,WHERE 条件表达式

其中,set 子句指出要修改的列和它们给定的值,where 子句是可选的,如果给出它将指定记录中哪行应该被更新,否则,所有的记录行都将被更新。

【示例1】将图书馆管理系统的借阅表中id字段为2的记录的“是否归还”字段值设置为1,sql语句如下:

UPDATE tb_borrow SET ifback=1 WHERE id=2;

执行效果如下图所示:

注意:更新时一定要保证where子句的正确性,一旦where子句出错,将会破坏所有改变的数据。

5.5 使用DELETE语句删除表记录

在数据库中,有些数据已经失去意义或者错误时就需要将它们删除,此时可以使用 DELETE 语句,语法如下:

DELETE FROM 数据表名 WHERE condition

注意:该语句在执行过程中,如果没有指定 where 条件,将删除所有的记录;如果指定了 where 条件,将按照指定的条件进行删除。而且在实际的应用中,执行删除操作时,执行删除的条件一般应该为数据的id,而不是具体某个字段值,这样可以避免一些不必要的错误发生。一般在工作中我们会使用逻辑删除。

【示例1】 将管理员信息表tb_manager中的名称为admin的管理员删除,sql语句如下:

mysql> DELETE FROM tb_manager WHERE name='admin';
Query OK, 1 row affected (0.01 sec)

5.6 使用TRUNCATE语句清空表记录

在删除数据时,如果要从表中删除所有的行,那么不必使用 DELETE 语句。通过 TRUNCATE 语句也可以实现。通过 TRUNCATE TABLE 语句删除数据的基本语法格式如下:

TRUNCATE [TABLE] 数据表名

注意:由于TRUNCATE TABLE语句会删除数据表中的所有数据,并且无法恢复,因此使用TRUNCATE TABLE语句时一定要十分小心。

【示例1】 清空图书馆管理系统的管理员信息表tb_manager,sql语句如下:

mysql> TRUNCATE TABLE tb_manager;
Query OK, 0 rows affected (0.04 sec)

DELETE 语句和 TRUNCATE TABLE 语句的区别:

  1. 使用 TRUNCATE TABLE 语句后,表中的 AUTO_INCREMENT 计数器将被重新设置为该列的初始值。
  2. 对于参与了索引和视图的表,不能使用 TRUNCATE TABLE 语句来删除数据,而应用使用 DELETE 语句。
  3. RUNCATE TABLE 操作比 DELETE 操作使用的系统和事务日志资源少。DELETE 语句每删除一行,都会在事务日志中添加一行记录,而 TRUNCATE TABLE 语句是通过释放存储表数据所用的数据页来删除数据的,因此只在事务日志中记录页的释放。

5.7 本小节练习

  1. 在 数据库 test 中创建数据表 books,并按照下表结构定义各个字段。

    字段名 字段说明 数据类型 主键 外键 非空 唯一 自增
    b_id 书编号 INT(11)
    b_name 书名 VARCHAR(50)
    authors 作者 VARCHAR(100)
    price 价格 FLOAT
    pubdate 出版日期 YEAR
    note 说明 VARCHAR(100)
    num 库存 INT(11)
  2. 将下表中的记录插入 books 表中,分别使用不同的方法插入记录。1、将 b_id 为 1 的指定所有字段名称插入记录。2、将 b_id 为 2 的不指定字段名称插入记录。3、将剩下的 5 条数据同时插入。

    b_id b_name authors price pubdate discount note num
    1 Table of AAA Dickes 23 1995 0.85 novel 11
    2 EmmaT Jane lura 35 1993 0.70 joke 22
    3 Story of Jane Jane Tim 40 2001 0.80 novel 0
    4 Lovey Day George Byron 20 2005 0.85 novel 30
    5 Old Land Honore Blade 30 2010 0.60 law 0
    6 The Battle Upton Sara 30 1999 0.65 medicine 40
    7 Rose Hood Richard Haggard 28 2008 0.90 cartoon 28
  3. 将小说类型(novel) 的书的价格都增加 5。

  4. 将名称为 EmmaT 的书的价格改为 40,并将说明改为 drama。

  5. 删除库存为 0 的记录。

六、表记录的检索

七、视图、触发器


转载:https://blog.csdn.net/xw1680/article/details/117157206
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场