pan's record

数据库学习笔记

  JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
  简单的来说,JDBC就是连通JAVA和数据库之间的桥梁。

使用软件

  • MYSQL:数据库
  • Navicat:数据库管理软件

基本操作:21分钟 MySQL 入门教程
简易命令查询 :一千行MySQL学习笔记
学习视频课程(慕课网):JDBC之“对岸的女孩走过来”

MySQL

  数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
  所以,现在我们使用关系型数据库管理系统(RDBMS,Relational Database Management System)来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
  RDBMS的特点:

1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成一张表单
5.若干的表单组成database

  RDBMS的术语:

数据库: 数据库是一些关联表的集合。
数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

  MySQL就是一种RDBMS

基础语句

USE <数据库名>;选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。
SHOW DATABASES;列出 MySQL 数据库管理系统的数据库列表。
SHOW TABLES;显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。
SHOW COLUMNS FROM <数据表>;显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。
SHOW INDEX FROM <数据表>;显示数据表的详细索引信息,包括PRIMARY KEY(主键)。
SHOW TABLE STATUS LIKE [FROM db_name] [LIKE ‘pattern’] \G; 该命令将输出Mysql数据库管理系统的性能及统计信息。

1
2
3
mysql> SHOW TABLE STATUS  FROM RUNOOB;   # 显示数据库 RUNOOB 中所有表的信息
mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'; # 表名以runoob开头的表的信息
mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'\G; # 加上 \G,查询结果按列打印

CREATE DATABASE <数据库名>;创建数据库
DROP database <数据库名>;删除数据库

数据类型

  MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

数值

  MySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

类型 大小 用途
TINYINT 1 字节 小整数值
SMALLINT 2 字节 大整数值
MEDIUMINT 3 字节 大整数值
INT或INTEGER 4 字节 大整数值
BIGINT 8 字节 极大整数值
FLOAT 4 字节 单精度浮点数值
DOUBLE 8 字节 双精度浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 小数值

日期和时间类型

  表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

类型 大小(字节) 格式 用途
DATE 3 YYYY-MM-DD 日期值
TIME 3 HH:MM:SS 时间值或持续时间
YEAR 1 YYYY 年份值
DATETIME 8 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

字符串类型

  字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535 字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据

数据表操作

创建数据表

  创建MySQL数据表需要以下信息:表名、表字段名、定义每个表字段

CREATE TABLE table_name (column_name column_type); //列名+列类型,多列用逗号隔开

1
2
3
4
5
6
7
8
9
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
// UNSIGNED无符号类型,AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1
`runoob_title` VARCHAR(100) NOT NULL,
// 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` ) //PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
)ENGINE=InnoDB DEFAULT CHARSET=utf8; //ENGINE 设置存储引擎,CHARSET 设置编码。

删除数据表

  进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失。删除MySQL数据表的通用语法:
DROP TABLE <table_name> ;

修改数据表

  当需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。

ALTER TABLE testalter_tbl DROP i; //删除i列
ALTER TABLE testalter_tbl ADD i INT FIRST; //新增i列
//需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。
ALTER TABLE testalter_tbl MODIFY c CHAR(10); //修改字段类型
ALTER TABLE testalter_tbl CHANGE i j BIGINT; //修改字段名称及类型
ALTER TABLE testalter_tbl MODIFY j BIGINT NOT NULL DEFAULT 100; //修改非空
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000; //修改默认值
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; //删除默认值
ALTER TABLE testalter_tbl ENGINE = MYISAM; //修改数据表类型
ALTER TABLE testalter_tbl RENAME TO alter_tbl; //修改表名

临时表
  MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。
CREATE TEMPORARY TABLE SalesSummary; //创建临时表
DROP TABLE SalesSummary; //删除临时表

复制数据表
SHOW CREATE TABLE runoob_tbl \G; //获得创建源表的语句,包括索引,主键等
CREATE TABLE clone_tbl(与源表相同); //生成新目的表列
INSERT INTO clone_tbl SELECT * FROM runoob_tbl; //复制源表的数据到目的表

也可以缩写到下面两行
CREATE TABLE targetTable LIKE sourceTable;
INSERT INTO targetTable SELECT * FROM sourceTable;

数据操作

查询数据

  数据库使用SQL SELECT语句来查询数据:

1
2
3
4
5
6
SELECT column_name,column_name   //查询多列,用逗号隔开
//可以使用星号(*)来代替字段,SELECT语句会返回表的所有字段数据
FROM table_name1,table_name2 //在多个表中查询用逗号隔开
[WHERE Clause] //设置查询条件
[LIMIT N] // LIMIT 属性来设定返回的记录数。
[ OFFSET M] // OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。

  WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。在 WHERE子句中指定任何条件,可以使用 AND 或者 OR 指定一个或多个条件。
  WHERE 子句可以运用于 SQL 的SELECT、DELETE 或者 UPDATE 命令。

  如果我们想再 MySQL 数据表中读取指定的数据,WHERE 子句是非常有用的。使用主键来作为 WHERE 子句的条件查询是非常快速的。如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据。

  MySQL 的 WHERE 子句的字符串比较是不区分大小写的。 你可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的。

SELECT * from runoob_tbl WHERE BINARY runoob_author=’RUNOOB.COM’;

插入数据

  数据表插入数据通用的 INSERT INTO SQL语法:

1
2
3
4
INSERT INTO <table_name> ( field1, field2,...fieldN )
VALUES
( value1a, value2a,...valueNa ),
( value1b, value2b,...valueNb );

  如果数据是字符型,必须使用单引号或者双引号,如:’value’。

修改数据

  修改或更新 MySQL 中的数据,可以使用 SQL UPDATE 命令来操作。

1
2
3
4
//可以同时更新一个或多个字段
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause] //可以在 WHERE 子句中指定任何条件
UPDATE runoob_tbl SET runoob_title='学习 C++' WHERE runoob_id=3;

删除数据

  DELETE FROM 命令来删除 MySQL 数据表中的记录。如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
ELETE FROM table_name [WHERE Clause]

模糊查询

  在查询语句中,WHERE 子句中可以使用等号 = 来设定获取数据的条件,如 “runoob_author = ‘RUNOOB.COM’”。但是有时候我们需要获取 runoob_author 字段含有 “COM” 字符的所有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。
  SQL LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。

1
2
3
4
SELECT field1, field2,...fieldN 
FROM table_name
//可以使用LIKE子句代替等号 =,通常与 % 一同使用,类似于一个元字符的搜索。
WHERE field1 LIKE '%com' [AND [OR]] filed2 = 'somevalue'

  模糊查询也可以用在 DELETE 或 UPDATE 命令中,使用 WHERE…LIKE 子句来指定条件。

数据处理

组合

  MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。

1
2
3
4
5
6
7
SELECT expression1, expression2, ... expression_n //  要检索的列
FROM tables1
[WHERE conditions]
UNION [ALL | DISTINCT] //默认是DISTINCT删除重复数据,
SELECT expression1, expression2, ... expression_n
FROM tables2
[WHERE conditions];

排序

  如果需要对读取的数据进行排序,可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。

1
2
3
4
SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE conditions]
//ASCDESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
ORDER BY field1, [field2...] [ASC [DESC]]

分组与计数

  GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

1
2
3
4
5
SELECT column_name, function(column_name) //方法可以是计数count,求和sum,均值avg
FROM table_name
[WHERE column_name operator value]
GROUP BY column_name [WITH ROLLUP]; //WITH ROLLUP可以对总数进行相同方法统计
//总数的统计列名为NULL,可以通过coalesce(name, '总数')这种方法来去除NULL

表间连接

  使用 MySQL 的 JOIN 可在两个或多个表中查询数据。JOIN 按照功能大致分为如下三类:

INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

JOIN类型

  INNER JOIN示例

1
2
3
SELECT a.runoob_id, a.runoob_author, b.runoob_count  //设置列
FROM runoob_tbl a INNER JOIN tcount_tbl b //两者取交集
ON a.runoob_author = b.runoob_author; //交集部分条件

  上述语句中,INNER可以省略,只写JOIN。上面的语句和下面是等效的:

1
2
3
SELECT a.runoob_id, a.runoob_author, b.runoob_count 
FROM runoob_tbl a, tcount_tbl b
WHERE a.runoob_author = b.runoob_author;

  LEFT JOIN示例

1
2
3
4
SELECT a.runoob_id, a.runoob_author, b.runoob_count 
FROM runoob_tbl a LEFT JOIN tcount_tbl b
//a中的全都会显示,b中的匹配上的显示,没匹配的显示NULL
ON a.runoob_author = b.runoob_author;

  RIGHT JOIN示例

1
2
3
4
SELECT a.runoob_id, a.runoob_author, b.runoob_count 
FROM runoob_tbl a RIGHT JOIN tcount_tbl b
//b中的全都会显示,a中的匹配上的显示,没匹配的显示NULL
ON a.runoob_author = b.runoob_author;

特殊处理

NULL 值处理

  MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。
因为NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 false,即 NULL = NULL 返回false 。
  为了处理这种情况,MySQL提供了三种运算符:

IS NULL: 当列的值是 NULL,此运算符返回 true。
IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
<=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true

正则表达式

  MySQL可以通过 LIKE …% 来进行模糊匹配。同样,也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配。

事务

  MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行
事务用来管理 insert,update,delete 语句

  一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

  在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

事务控制语句

BEGIN或START TRANSACTION;显式地开启一个事务;
COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改成为永久性的;
ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
ROLLBACK TO identifier;把事务回滚到标记点;
SET TRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

处理方法

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

1、用 BEGIN, ROLLBACK, COMMIT来实现

BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认

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

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

索引

  MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
  索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
  过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。

ALTER TABLE tbl_name MODIFY column_list NOT NULL;
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list)
//添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list)
//添加唯一索引,创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list)
//添加普通索引,索引值可出现多次。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list)
//指定了索引为 FULLTEXT ,用于全文索引。
ALTER TABLE testalter_tbl DROP PRIMARY KEY;
//删除主键时,只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。
SHOW INDEX FROM table_name; \G
//列出表中的相关的索引信息

自增序列

  MySQL中最简单使用序列的方法就是使用 MySQL AUTO_INCREMENT 来定义列。

id INT UNSIGNED NOT NULL AUTO_INCREMENT, //设置自增序列
PRIMARY KEY (id), //设置为主键

重置序列

  如果你删除了数据表中的多条记录,并希望对剩下数据的AUTO_INCREMENT列进行重新排列,那么你可以通过删除自增的列,然后重新添加来实现。 不过该操作要非常小心,如果在删除的同时又有新记录添加,有可能会出现数据混乱。
ALTER TABLE insect DROP id; //删除列
ALTER TABLE insect ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (id); //删除后重新生成一样属性的

设置序列起始值

ALTER TABLE t AUTO_INCREMENT = 100;

重复数据处理

  有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。

防止出现重复数据

  可以在MySQL数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。可以设置双主键模式来设置数据的唯一性,主键都不能为NULL。
PRIMARY KEY (last_name, first_name)
UNIQUE (last_name, first_name)

   如果我们设置了唯一索引,那么在插入重复数据时,SQL语句将无法执行成功,并抛出错。此时,不能使用INSERT INTO,而是使用INSERT IGNORE INTO。
  INSERT IGNORE会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据,不返回错误,只以警告形式返回。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。
  如果要替换,可以使用REPLACE INTO,如果存在PRIMARY KEY 或 UNIQUE 相同的记录,则先删除掉。再插入新记录。

统计重复数据

1
2
3
4
SELECT COUNT(*) as repetitions, last_name, first_name  //确定哪一列可能出现重复
FROM person_tbl
GROUP BY last_name, first_name //分组计数
HAVING repetitions > 1; //设置重复数大于1。

过滤重复数据

  如果需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。
SELECT DISTINCT last_name, first_name FROM person_tbl;
可以使用 GROUP BY 来读取数据表中不重复的数据:
SELECT last_name, first_name FROM person_tbl GROUP BY (last_name, first_name);

删除重复数据

可以在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。
ALTER IGNORE TABLE person_tbl ADD PRIMARY KEY (last_name, first_name);

SQL 注入与防止

  通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题。所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
  我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。

  防止SQL注入,我们需要注意以下几个要点:

1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双”-“进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

导入与导出数据

导出数据

  可以使用SELECT…INTO OUTFILE语句来简单的导出数据到文本文件上。
SELECT * FROM runoob_tbl INTO OUTFILE ‘/tmp/runoob.txt’;
  还可以通过命令选项来设置数据输出的指定格式,以下实例为导出 CSV 格式:

1
2
3
SELECT * FROM passwd INTO OUTFILE '/tmp/runoob.txt'
FIELDS TERMINATED BY ',' ENCLOSED BY '"' //以逗号隔开,以双引号包围
LINES TERMINATED BY '\r\n'; //行结束为 \r\n

SELECT…INTO OUTFILE ‘file_name’形式的SELECT可以把被选择的行写入一个文件中。该文件被创建到服务器主机上,因此您必须拥有FILE权限,才能使用此语法。
输出不能是一个已存在的文件。防止文件数据被篡改。
你需要有一个登陆服务器的账号来检索文件。否则 SELECT … INTO OUTFILE 不会起任何作用。
在UNIX中,该文件被创建后是可读的,权限由MySQL服务器所拥有。这意味着,虽然你就可以读取该文件,但可能无法将其删除。

  mysqldump 是 mysql 用于转存储数据库的实用程序。它主要产生一个 SQL 脚本,其中包含从头重新创建数据库所必需的命令 CREATE TABLE INSERT 等。

导出SQL 格式的数据到指定文件
mysqldump -u root -p RUNOOB runoob_tbl > dump.txt
导出整个数据库的数据,可以使用以下命令:
mysqldump -u root -p RUNOOB > database_dump.txt
备份所有数据库,可以使用以下命令:
mysqldump -u root -p –all-databases > database_dump.txt

将数据表及数据库拷贝至其他主机

1
2
3
4
5
6
7
// 将数据备份至 dump.txt 文件中
mysqldump -u root -p database_name table_name > dump.txt
// 将备份的数据库导入到MySQL服务器
mysql -u root -p database_name < dump.txt
//可组合后直接导入
mysqldump -u root -p database_name \
| mysql -h other-host.com database_name

将远程服务器的数据拷贝到本地
mysqldump -h other-host.com -P port -u root -p database_name > dump.txt

导入数据

1、mysql 命令导入

mysql -u用户名 -p密码 < 要导入的数据库数据
例:mysql -uroot -p123456 < runoob.sql

2、source 命令导入
source 命令导入数据库需要先登录到数库终端

1
2
3
4
create database abc;      // 创建数据库
use abc; // 使用已创建的数据库
set names utf8; // 设置编码
source /home/abc/abc.sql // 导入备份数据库

3、使用 LOAD DATA 导入数据

  LOAD DATA INFILE是SELECT … INTO OUTFILE的逆操作。为了将一个数据库的数据写入一个文件,使用SELECT … INTO OUTFILE,为了将文件读回数据库,使用LOAD DATA INFILE。

1
2
3
LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n';

  如果指定LOCAL关键词,则表明从客户主机上按路径读取文件。如果没有指定,则文件在服务器上按路径读取文件。
  可以明确地在LOAD DATA语句中指出列值的分隔符和行尾标记,但是默认标记是定位符和换行符。两个命令的 FIELDS 和 LINES 子句的语法是一样的。两个子句都是可选的,但是如果两个同时被指定,FIELDS 子句必须出现在 LINES 子句之前。

  LOAD DATA 默认情况下是按照数据文件中列的顺序插入数据的,如果数据文件中的列与插入表中的列不一致,则需要指定列的顺序。如,在数据文件中的列顺序是 a,b,c,但在插入表的列顺序为b,c,a,则数据导入语法如下:

1
2
LOAD DATA LOCAL INFILE 'dump.txt' 
INTO TABLE mytbl (b, c, a);

4、使用 mysqlimport 导入数据

//从文件 dump.txt 中将数据导入到 mytbl 数据表中
mysqlimport -u root -p –local database_name dump.txt

//mysqlimport命令可以指定选项来设置指定格式
mysqlimport -u root -p –local –fields-terminated-by=”,” \
–lines-terminated-by=”\r\n” database_name dump.txt
//mysqlimport 语句中使用 –columns 选项来设置列的顺序
mysqlimport -u root -p –local –columns=b,c,a \
database_name dump.txt

🐶 您的支持将鼓励我继续创作 🐶