首页 > 数据库 > 数据库其它

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

admin 数据库其它 2021-05-25 09:25:42 数据库 mysql sql 
后台-系统设置-扩展变量-手机广告位-内容正文底部

目录

  • 一、启动、连接、断开和停止MySQL服务器命令
    • 1.1 本小节练习
  • 二、MySQL数据库管理
    • 2.1 本小节练习
  • 三、MySQL表结构管理
    • 3.1 MySQL 数据类型
    • 3.2 创建表、修改表、查看表、删除表操作
    • 3.3 本节练习
  • 五、表记录的更新操作
    • 5.1 使用INSERT...VALUES语句插入新记录
    • 5.2 使用INSERT……SELECT语句插入结果集
    • 5.3 使用REPLACE语句插入新记录
    • 5.4 修改表记录
    • 5.5 使用DELETE语句删除表记录
    • 5.6 使用TRUNCATE语句清空表记录
    • 5.7 本小节练习
  • 六、表记录的检索
  • 七、视图、触发器

一、启动、连接、断开和停止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 类型,如下表所示:

    数 据 类 型最大长度(字节数)说 明TINYBLOB2^8~1(225)小BLOB字段TINYTEXT2^8~1(225)小TEXT字段BLOB2^16~1(65 535)常规BLOB字段TEXT2^16~1(65 535)常规TEXT字段MEDIUMBLOB2^24~1(16 777 215)中型BLOB字段MEDIUMTEXT2^24~1(16 777 215)中型TEXT字段LONGBLOB2^32~1(4 294 967 295)长BLOB字段LONGTEXT2^32~1(4 294 967 295)长TEXT字段
  3. 特殊类型 SET 和 ENUM。特殊类型 SET 和 ENUM 的介绍如下表所示:

    数 据 类 型最大值说 明Enum (“value1”, “value2”, …)65 535该类型的列只可以容纳所列值之一或为NULLSet (“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 代替。下面介绍日期和时间数据类型,如下表所示:

数 据 类 型取值范围说 明DATE1000-01-01 9999-12-31日期,格式YYYY-MM-DDTIME-838:58:59 835:59:59时间,格式HH:MM:SSDATETIME1000-01-01 00:00:00 9999-12-31 23:59:59日期和时间,格式YYYY-MM-DD HH:MM:SSTIMESTAMP1970-01-01 00:00:00 2037年的某个时间时间标签,在处理报告时使用显示格式取决于M的值YEAR1901-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_statementSELECT语句描述部分,用它可以快速地创建表

下面介绍列属性 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 NULLDEFAULT default_value表示默认值AUTO_INCREMENT表示是否是自动编号,每个表只能有一个AUTO_INCREMENT列,并且必须被索引PRIMARY KEY表示是否为主键。一个表只能有一个PRIMARY KEY。如表中没有一个PRIMARY KEY,而某些应用程序需要PRIMARY KEY,MySQL将返回第一个没有任何NULL列的UNIQUE键,作为PRIMARY KEYreference_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。

    字段名数据类型主键外键非空唯一自增officeCodeINT(10)是否是是否cityINT(11)否否是否否addressVARCHAR(50)否否否否否countryVARCHAR(50)否否是否否postalCodeVARCHAR(25)否否否是否
  4. 创建表 employees。

    字段名数据类型主键外键非空唯一自增employeeNumberINT(11)是否是是是lastNameVARCHAR(50)否否是否否firstNameVARCHAR(50)否否是否否mobileVARCHAR(25)否否否是否officeCodeVARCHAR(10)否是是否否jobTitleVARCHAR(50)否否是否否birthDATETIME否否是否否noteVARCHAR(255)否否否否否sexVARCHAR(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_idb_nameauthorspricepubdatediscountnotenum1Table of AAADickes2319950.85novel112EmmaTJane lura3519930.70joke223Story of JaneJane Tim4020010.80novel04Lovey DayGeorge Byron2020050.85novel305Old LandHonore Blade3020100.60law06The BattleUpton Sara3019990.65medicine407Rose HoodRichard Haggard2820080.90cartoon28
  3. 将小说类型(novel) 的书的价格都增加 5。

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

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

六、表记录的检索

七、视图、触发器

文章来源:https://blog.csdn.net/xw1680/article/details/117157206

后台-系统设置-扩展变量-手机广告位-内容正文底部
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
本文地址:https://www.jcdi.cn/shujukuqita/30758.html

留言与评论(共有 0 条评论)
   
验证码:
后台-系统设置-扩展变量-手机广告位-评论底部广告位

教程弟

https://www.jcdi.cn/

统计代码 | 京ICP1234567-2号

Powered By 教程弟 教程弟

使用手机软件扫描微信二维码