MySQL

198 阅读18分钟

MySQL 服务器

启动

cd c:/mysql/bin
mysqld --console

关闭

cd c:/mysql/bin
mysqladmin -uroot shutdown

登录

[root@host]# mysql -u root -p   
Enter password:******  # 登录后进入终端

密码错误

ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES)

修改密码 (管理员权限运行命令窗口) 参考

1.关闭mysql服务 (窗口一)

net stop mysql

2.跳过Mysql密码验证 (另起窗口二执行)

mysqld -console --skip-grant-tables --shared-memory

3.无密码方式进入Mysql (另起窗口三执行)

mysql -u root -p (此时会显示让你输入密码,直接回车,就可以成功连接Mysql)

4.将登陆密码设置为空 (窗口三上执行)

use mysql; (使用mysql数据表)
update user set authentication_string='' where user='root';(将密码置为空)
quit; (然后退出Mysql)

5.更改自己的登陆密码(关闭窗口一和窗口二)

mysql -u root -p (直接回车登录)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';(更改密码)
quit(退出mysql, 重新登上验证新密码)

服务启动失败

image.png

1.首先进入到MySQL的安装目录下,每个人的安装目录可能会有所不同,比如 C:\Program Files\MySQL\MySQL Server 8.0

2.看一下与bin同级的目录中有没有data这个文件夹,若有,则把原有的data文件夹删掉或者剪切到别的地方,如果有重要的数据请另外保存好;

若没有data文件夹则自己新建一个空的。

3.然后用管理员身份打开命令行窗口,进入bin目录,执行一下初始化 mysqld --initialize,再次net start MySQL就解决了

库 databases

增 CREATE

1.简单创建数据库

CREATE DATABASE 数据库名;

2.创建时添加选项,判断是否已存在(重复会报错) ,设置字符集,排序规则

CREATE DATABASE [IF NOT EXISTS] database_name
  [CHARACTER SET charset_name]
  [COLLATE collation_name];

删 DROP

DROP DATABASE 数据库名;        -- 直接删除数据库,不检查是否存在DROP DATABASE [IF EXISTS] 数据库名;

改 ALTER DATABASE

1.重命名

ALTER DATABASE mydatabase RENAME TO new_name;

2.修改字符集,排序规则

ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

查 SHOW / SELECTED

SHOW DATABASES; -- 当前存在的数据库
SELECTED DATABASE(); -- 当前所在数据库

选择 USE

USE database_name;
mysql -u your_username -p -D database_name;

表 table

数据类型

1) 数值类型

整数类型包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,浮点数类型包括 FLOAT 和 DOUBLE,定点数类型为 DECIMAL。

image.png

2) 日期/时间类型

包括 YEAR、TIME、DATE、DATETIME 和 TIMESTAMP。

image.png

3) 字符串类型

包括 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET 等。

image.png

4) 二进制类型

包括 BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。

约束 constraint

表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性,比如用户表有些列的值(手机号)不能为空,有些列的值(身份证号)不能重复。

1、主键约束(primary key) PK

相当于 唯一约束 + 非空约束 的组合,当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。

2、自增长约束(auto_increment)

初始值是 1,每新增一条记录,字段值自动加 1,修改初始值 auto_increment=100 ,数据类型必须是 NOT NULL整数类型TINYINT、SMALLINT、INT、BIGINT),最大值受该字段的数据类型约束,如果达到上限则失效

3、非空约束(not null)

4、唯一性约束(unique) ,是指所有记录中字段的值不能重复出现。

5、默认约束(default)

create table t_user10 ( 
  ...
  address varchar(20) default ‘北京’ -- 指定默认约束 
);
alter table <表名> modify column <字段名> <类型> default null; 

6、零填充约束(zerofill)

插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0,默认为int(10);

默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,例如,有符号为-128~+127,无符号为0~256。

create table t_user12 ( 
  id int zerofill , -- 零填充约束
  name varchar(20)   
);

alter table t_user12 modify id int;

7、外键约束(foreign key) FK

增 CREATE

CREATE TABLE 表名 (
    列名 数据类型 默认值 AUTO_INCREMENT,
    column2 datatype,
    ...
)[表的选项设置 存储引擎,字符集,排序规则...];
-- 常见的数据类型包括 INT, VARCHAR, DATE, BOOLEAN

实例

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    birthdate DATE,
    is_active BOOLEAN DEFAULT TRUE
) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

-- id: 用户 id,整数类型,自增长,作为主键。
-- username: 用户名,变长字符串,不允许为空。
-- email: 用户邮箱,变长字符串,不允许为空。
-- birthdate: 用户的生日,日期类型。
-- is_active: 用户是否已经激活,布尔类型,默认值为 true。

主键设置 PRIMARY KEY

AUTO_INCREMENT 自增需要确定类型

1.单列 PRIMARY KEY

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    ...
);

2.多列 PRIMARY KEY()

CREATE TABLE IF NOT EXISTS `runoob_tbl`(
   `runoob_id` INT UNSIGNED AUTO_INCREMENT,
   ...
   PRIMARY KEY ( `runoob_id`, `runoob_name`, ... )
)

删 DROP

跟删除库一样,关键字不同

DROP TABLE 表名 ;    -- 直接删除表,不检查是否存在DROP TABLE [IF EXISTS] 表名;

改 ALTER TABLE

修改表名

ALTER TABLE 旧表名 RENAME TO 新表名;

查 SHOW

1.查当前存在的表

SHOW TABLES;

2.查表创建的方式

SHOW CREATE TABLE 表名;

增 ALTER TABLE ... ADD COLUMN

ALTER TABLE 表名
ADD COLUMN 新的列名 数据类型;

-- 批量添加
ALTER TABLE 表名
ADD COLUMN 新的列名1 数据类型,
ADD COLUMN 新的列名2 数据类型;

删 ALTER TABLE ... DROP COLUMN

会将表对应列的数据一同删除

ALTER TABLE 表名 DROP COLUMN 列名;

改 ALTER TABLE ... MODIFY / CHANGE COLUMN

MODIFY COLUMN

ALTER TABLE 表名 MODIFY COLUMN 列名 数据类型;

CHANGE COLUMN

ALTER TABLE 表名 CHANGE COLUMN 旧的列名 新的列名 数据类型;

修改默认值 SET DEFAULT

ALTER TABLE 表名 ALTER 列名 SET DEFAULT 1000;

添加或删除 ADD/DROP PRIMARY KEY

ALTER TABLE 表名 MODIFY COLUMN 列名 VARCHAR(50) PRIMARY KEY;
ALTER TABLE 表名 ADD PRIMARY KEY (列名);

ALTER TABLE 表名 DROP PRIMARY KEY (列名);

-- 主键字段会被标记为“PRI”

添加会删除 ADD/DROP FOREIGN KEY

ALTER TABLE 从表名
[ADD CONSTRAINT 外键名]
FOREIGN KEY (从表列名)
REFERENCES 主表名 (主表列名)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}];

-- ADD CONSTRAINT 外键名 省略会自动添加一个外键名

-- 将 从表 从表列名 设置为外键,与 主表 的 主表列名 进行关联

ALTER TABLE 表名 DROP FOREIGN KEY 外键名;

-- 外键字段会被标记为“MUL”(表示Multiple)

查看外键名 1.如果是创建表的时候创建的可以通过查看 show 语句查看创建的命令即可

2.通过mysql自带的系统表查看外键

SELECT *
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = '主表' AND REFERENCED_COLUMN_NAME = 'id';

image.png

3.查看与表所有相关的,包含 primary key

SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE  WHERE constraint_schema = '数据库名'  AND table_name = '从表';

image.png

ON DELETE, ON UPDATE, 当修改表数据的时候触发规则 参考

参数意义
RESTRICT限制外表中的外键改动(默认值,也是最安全的设置)
CASCADE跟随外键改动
SET NULL设为null值
NO ACTION无动作
SET DEFAULT设为默认值

查 DESC / SHOW

DESC 表名;
SHOW COLUMNS FROM 表名;

数据

INSERT INTO

  • 如果出现重复就会报错

插入数据 INSERT INTO, 如果数据是字符型,必须使用单引号 ' 或者双引号 " ,如: 'value1', "value1"。

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

-- table_name 是你要插入数据的表的名称。
-- column1, column2, column3, ... 是表中的列名。
-- value1, value2, value3, ... 是要插入的具体数值。

如果你要插入所有列的数据,可以省略列名

INSERT INTO users
VALUES (NULL,'test', 'test@runoob.com', '1990-01-01', true);

这里,NULL 是用于自增长列的占位符,表示系统将为 id 列生成一个唯一的值。

如果你要插入多行数据,可以在 VALUES 子句中指定多组数值:

INSERT INTO users (username, email, birthdate, is_active)
VALUES
    ('test1', 'test1@runoob.com', '1985-07-10', true),
    ('test2', 'test2@runoob.com', '1988-11-25', false),
    ('test3', 'test3@runoob.com', '1993-05-03', true);

INSERT IGNORE INTO

  • 有重复的就忽略该条数据的插入
# 表中有些字段有默认值,则可以直接根据字段插入数据
INSERT IGNORE INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);

# 按照表中所有字段进行插入数据,一定要与字段在表中定义的顺序一致
INSERT IGNORE INTO 表名 VALUES (值 1,值 2,...);

REPLACE INTO

  • 表示插入并替换数据,若表中有primary key或者unique索引,在插入数据的时候,若遇到重复的数据,则用新数据替换,如果没有数据效果则和insert into一样
# 表中有些字段有默认值,则可以直接根据字段插入数据
REPLACE INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);

# 按照表中所有字段进行插入数据,一定要与字段在表中定义的顺序一致
REPLACE INTO 表名 VALUES (值 1,值 2,...);

删 DELETE FROM

DELETE FROM 表名
WHERE 条件表达式;
-- 没有指定 WHERE 子句,表中的所有记录将被删除。相当于清空表

改 UPDATE

UPDATE 表名
SET 列名 = 值, column2 = value2, ...
WHERE 条件表达式;

查 SELECT ... FROM

SELECT 列名, column2, ...
FROM 表名
[WHERE 条件表达式]
[ORDER BY 列名 [ASC | DESC]]
[LIMIT 行数];
SELECT COUNT(*) FROM 表名;

WHERE

条件运算符(如 =, <, >, <=, >=, !=),逻辑运算符(如 AND, OR, NOT),以及通配符(如 %), 正则 (REGEXP)

-- 使用 AND 运算符和通配符
SELECT * FROM users WHERE username LIKE 'j%' AND is_active = TRUE;

-- 使用 OR 运算符
SELECT * FROM users WHERE is_active = TRUE OR birthdate < '1990-01-01';

-- 使用 IN 子句
SELECT * FROM users WHERE birthdate IN ('1990-01-01', '1992-03-15', '1993-05-03');
操作符描述实例
=等号,检测两个值是否相等,如果相等返回true(A = B) 返回false。
<>, !=不等于,检测两个值是否相等,如果不相等返回true(A != B) 返回 true。
大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true(A > B) 返回false。
<小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true(A < B) 返回 true。
>=大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true(A >= B) 返回false。
<=小于等于号,检测左边的值是否小于或等于右边的值, 如果左边的值小于或等于右边的值返回true(A <= B)

LIKE 、NOT LIKE 和 通配符

通配符说明实例
%搜索模式中给定位置的0个、1个或多个字符,不区分大小写'a%' 匹配以字母 'a' 开头的任何字符串
_总是匹配一个字符,不能多也不能少,常用来限制表达式的字符长度'_r%' 匹配第二个字母为 'r' 的任何字符串

组合使用 % 和 _ , 选择用户名以 'a' 开头、以 'o' 结尾,并且长度为三个字符的所有用户

SELECT * FROM users WHERE username LIKE 'a%o_';

BINARY 关键字 , 设定 WHERE 子句的字符串比较区分大小写

mysql> SELECT * from runoob_tbl WHERE BINARY runoob_author='runoob.com';
Empty set (0.01 sec)
 
mysql> SELECT * from runoob_tbl WHERE BINARY runoob_author='RUNOOB.COM';
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title  | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 3         | JAVA 教程   | RUNOOB.COM    | 2016-05-06      |
| 4         | 学习 Python | RUNOOB.COM    | 2016-03-06      |
+-----------+---------------+---------------+-----------------+
2 rows in set (0.01 sec)

DISTINCT 关键字去重

SELECT DISTINCT * FROM 表名;

条件查询 WHERE

SELECT * FROM table_name WHERE condition; -- 根据特定条件过滤数据
SELECT * FROM table_name WHERE column LIKE 'value%'; -- 模糊匹配
SELECT * FROM table_name WHERE column IN (value1, value2); -- 在指定值之间进行比较
SELECT * FROM table_name WHERE column BETWEEN value1 AND value2; -- 在指定范围内进行比较
SELECT * FROM table_name ORDER BY column ASC|DESC; -- 按指定列进行升序或降序排序

聚合查询 (聚合函数)

SELECT COUNT(*) FROM table_name; -- 计算表中记录的数量
SELECT SUM(column_name) FROM table_name; -- 对指定列进行求和操作
SELECT AVG(column_name) FROM table_name; -- 对指定列进行平均值计算
SELECT MAX(column_name), MIN(column_name) FROM table_name; -- 获得最大/小值
SELECT GROUP_CONCAT(column_name SEPARATOR ', ') FROM table_name; -- 将多行数据合并为一行字符串
SELECT SUM(column_name) AS '别名' FROM table_name; -- 别名设置

image.png

分组查询 GROUP BY

SELECT 列名, AVG(IsNull(score,0)) FROM 表名 GROUP BY 分组字段;
  • 一般结合聚合函数进行分组,否则单独分组没有意义
  • 分组结果就是根据分组字段,将值相同的进行归类合并(类似于做报表统计)

image-20231206084817504.png

分组过滤条件 HAVING
  • having子句用于分组后筛选,where子句用于条件筛选
  • having一般都是配合group by 和聚合函数一起出现如(count(),sum(),avg(),max(),min())
  • where条件子句中不能使用聚集函数,而having子句就可以。
  • having只能用在group by之后,where执行在group by之前

实例

SELECT city ,count(*) as num from staff  where age> 19 group by city HAVING num >= 3;

连接查询 JOIN

  • 左表: 连接关键字的左边的表
  • 右表: 连接关键字的右边的表

1.INNER JOIN

返回的结果以满足条件的数据, 即有多少条满足条件的,返回的结果就有多少行

SELECT *
 FROM tbl_emp a
 INNER JOIN tbl_dept b
 ON a.deptID = b.ID;

外包不满足条件,所以结果中没有外包

image.png

2.LEFT JOIN

返回的结果以左表为准,即左表有多少行,返回的结果就有多少行,满足条件就有数据,不满足为null

 SELECT *
 FROM tbl_dept b
 LEFT JOIN tbl_emp a
 ON a.deptID = b.ID;

此处将 dept 作为左表,所以结果以dept为准,不满足条件则为 null

image.png

3.RIGHT JOIN

返回的结果以右表为准,即右表有多少行,返回的结果就有多少行,满足条件就有数据,不满足为null

SELECT *
 FROM tbl_emp a
 RIGHT JOIN tbl_dept b
 ON a.deptID = b.ID

image.png

嵌套查询 (子查询)

SELECT column_name FROM table_name WHERE column_name IN (SELECT column_name FROM another_table); -- 通过子查询来限制主查询的结果
SELECT column_name FROM table_name WHERE EXISTS (SELECT column_name FROM another_table WHERE condition); -- 判断子查询是否存在结果

联合查询 UNION

  • 需要保证两个查询语句中的字段数量是一致的
  • Union 和 Join 子句不同,因为 union 总是垂直组合结果集,而 join水平附加输出
  • 最后结果的表头会以第一个查询语句的字段名为准,可以使用别名替换
SELECT column_name FROM table1 UNION SELECT column_name FROM table2; -- 合并两个查询结果集,自动去除重复行
SELECT column_name FROM table1 UNION ALL SELECT column_name FROM table2; -- 合并两个查询结果集,保留重复行

UNION 和其他语句一同出现执行顺序

from—>on—>join—>where—>group by—>having+(聚合函数)—>select—>distinct—>UNION—>order by—>limit

举例:

1.UNION 和 WHERE 语句 ,UNION 在 where 之后,所以第二个表的WHERE先筛选后进行数据集拼接;

-- 1、第二个子句中的 where 语句不能同时作用于两个select语句
SELECT *, 'table1' FROM test_user u 
UNION ALL
SELECT *, 'table2' FROM test_user u WHERE AGE = 30;

2.UNION 和 GROUP 语句,UNION 在 GROUP BY 之后,所以 table2 的 GROUP BY 先分组后进行数据集拼接;

-- 2、第二个子句中的 group by 语句不能同时作用于两个select语句
-- 5 + 3,共计 8 条
SELECT *, 'table1' FROM test_user u 
UNION ALL
SELECT *, 'table2' FROM test_user u GROUP BY AGE;

索引 index

  • 单列索引,即一个索引只包含单个列,一个表可以有多个单列索引。
  • 组合索引,即一个索引包含多个列。

创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

有 普通索引 INDEX,唯一索引 UNIQUE,全文索引FULLTEXT

增 CREATE INDEX

CREATE INDEX 索引名 ON 表名 (列名 [ASC|DESC], column2 [ASC|DESC], ...);
ALTER TABLE 表名
ADD INDEX 索引名(列名 [ASC|DESC], column2 [ASC|DESC], ...);
CREATE TABLE 表名 (
  ...,
  INDEX 索引名(列名 [ASC|DESC], column2 [ASC|DESC], ...)
);

唯一索引

CREATE UNIQUE INDEX 索引名
ON 表名 (列名 [ASC|DESC], column2 [ASC|DESC], ...);
ALTER TABLE 表名 ADD UNIQUE [索引名] (columnName(length))

删 DROP INDEX

DROP INDEX 索引名 ON 表名;
ALTER TABLE 表名 DROP INDEX 索引名;

先删再建

查 SHOW INDEX

SHOW INDEX FROM 表名 \G;
-- \G 格式化

视图 view

  • 视图是一种 虚拟表 ,本身是 不具有数据 的,占用很少的内存空间。
  • 视图建立在已有表的基础上, 视图赖以建立的这些表称为基表
  • 可以帮助我们把经常查询的结果集放到虚拟表中,提升使用效率
  • 因为视图是一个虚拟存在的表,不保存数据,当对视图数据进行操作时,就相当于对基本表数据进行操作

增 CREATE VIEW

CREATE VIEW 视图名称 AS 查询语句
  • 实际上就是我们在 SQL 查询语句的基础上封装了视图 VIEW,这样就会基于 SQL 语句的结果集形成一张虚拟表。
  • 在创建视图时,没有在视图名后面指定字段列表,则视图中字段列表默认和SELECT语句中的字段列表一致。如果SELECT语句中给字段取了别名,那么视图中的字段名和别名相同。
CREATE [OR REPLACE] 
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] 
VIEW 视图名称 [(字段列表)] 
AS 查询语句 
[WITH [CASCADED|LOCAL] CHECK OPTION]

删 DROP VIEW

DROP VIEW IF EXISTS 视图名称;
DROP VIEW IF EXISTS 视图名称1,视图名称2,视图名称3,...;

改 ALTER VIEW

ALTER VIEW 视图名称 
AS查询语句
CREATE OR REPLACE VIEW empvu80 
(id_number, name, sal, department_id) 
AS
SELECT employee_id, first_name || ' ' || last_name, salary, department_id 
FROM employees
WHERE department_id = 80;

查 SHOW/SELECT/DESC

SHOW TABLES
SELECT * FROM 视图名称;
DESC / DESCRIBE 视图名称;
SHOW CREATE VIEW 视图名称;
SHOW TABLE STATUS LIKE 'view_name'\G;

-- Name和Comment之外,其余的信息均为NULL, 且Comment = VIEW,则表示此表为视图

视图数据的增删改查与TABLE一样,将表名换成视图名

事务 TRANSACTION

用来管理 insert、update、delete 语句

保证成批的 SQL 语句要么全部执行,要么全部不执行

事务处理主要有两种方法:

1、用 BEGIN, ROLLBACK, COMMIT 来实现

  • BEGIN 或 START TRANSACTION:开用于开始一个事务。
  • ROLLBACK 事务回滚,取消之前的更改。
  • COMMIT:事务确认,提交事务,使更改永久生效。

2、直接用 SET 来改变 MySQL 的自动提交模式:

  • SET AUTOCOMMIT=0 禁止自动提交
  • SET AUTOCOMMIT=1 开启自动提交

BEGIN 或 START TRANSACTION -- 用于开始一个事务:

BEGIN; -- 或者使用 START TRANSACTION;

COMMIT -- 用于提交事务,将所有的修改永久保存到数据库:

COMMIT;

ROLLBACK -- 用于回滚事务,撤销自上次提交以来所做的所有更改:

ROLLBACK;

SAVEPOINT -- 用于在事务中设置保存点,以便稍后能够回滚到该点:

SAVEPOINT savepoint_name;

ROLLBACK TO SAVEPOINT -- 用于回滚到之前设置的保存点:

ROLLBACK TO SAVEPOINT savepoint_name;

实例

-- 开始事务
START TRANSACTION;

-- 执行一些SQL语句
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;

-- 判断是否要提交还是回滚
IF (条件) THEN
    COMMIT; -- 提交事务
ELSE
    ROLLBACK; -- 回滚事务
END IF;

隔离级别

READ UNCOMMITTED

READ COMMITTED

REPEATABLE READ

SERIALIZABLE

复制备份

复制数据库

mysqldump 是 MySQL 自带的一种备份工具,可以将数据库备份为.sql 格式的文件。

当备份和恢复时,需要停止数据库,否则数据可能会因为正在进行的更改而不一致。

完整的数据库

1.复制一个完整的数据库

mysqldump -u 用户名 -p 数据库名 > 备份文件名.sql

2.将备份文件复制到另一台机器上

mysql -u 用户名 -p 目标数据库名 < 备份文件名.sql

复制指定表

mysqldump -u 用户名 -p 数据库名 表名1 表名2 > 备份文件名.sql

备份压缩

1.备份压缩

mysqldump -u 用户名 -p 数据库名 | gzip > 备份文件名.gz

2.解压还原

gunzip < 备份文件名.gz | mysql -u 用户名 -p 数据库名

复制表

-- 在目标数据库上创建与源数据库相同的表格结构
CREATE TABLE IF NOT EXISTS 目标数据库.表 LIKE 原数据库.表;
 
-- 从源数据库复制数据到目标数据库的新表格
INSERT INTO 目标数据库.表 (SELECT * FROM 原数据库.表);

详细:(若使用 INSERT INTO语句,需要先创建新表,再插入)

-- 不会将旧表中的一些主键等,Extra(auto_increament)等属性复制,但会将旧表中的所有内容都拷贝过来
CREATE TABLE 新表 SELECT * FROM 旧表;
-- 会创建一个新表并复制旧表的结构,包括列名、数据类型、索引等,但是不会复制旧表的数据和约束。
-- 也不会自动复制旧表的主键、外键和唯一性约束等属性,和前一种一样,只不过第一种多了一个表数据
CREATE TABLE 新表 LIKE 旧表;

-- 单纯复制旧表的数据到新表(前提两个表结构相同)
INSERT INTO 新表 (SELECT * FROM 旧表);
-- 单纯复制旧表的指定的数据到新表(两个表结构可以不一样, 字段得对上)
INSERT INTO 新表 (字段1,字段2,,,,,,,,,) (SELECT 字段1 , 字段2 FROM 旧表);