数据库(6) | MySQL进阶

MySQL进阶讲义

这一章我们开始进一步探讨MySQL的使用,从MySQL的介绍开始,接触MySQL的安装、命令行的操作以及基本数据库连接工具的使用等,全面的认识和学习使用MySQL数据库。

MySQL的用户管理

新建用户

  1. 登录MYSQL:

    @>mysql -u root -p
    Enter password:
    #mysql完整的语法
    @>mysql -P 端口号 -h mysql主机名\ip -u 用户名  -p密码
    #举例:连接172.31.95.189:3306的mysql,用户名/密码:demo/123456
    @>mysql -P 3306 -h 172.31.95.189 -u demo -p 123456
    #登录后查看当前登录用户名:
    mysql>select user();
    

  2. 创建用户:

    mysql> insert into mysql.user(Host, User, Password) 
     -> values("localhost", "test", password("123456"));
    

    这样就创建了一个名为:test 密码为:123456 的用户。

    注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录。

    用户的类型

    host 注释 示例
    localhost 用户能够在localhost访问MySQL root@localhost
    % 用户能够在 非localhost 访问 MySQL root@%
    ip(指定ip) 用户能够在 指定ip访问MySQL root@172.31.95.168

    具体例子一:

    创建用户 demo_l,让demo_l能够在本地进行访问 在本地,访问(localhost)

    -- 1. 创建一个用户,这个用户名字是 demo_l, 密码是 123456 ,规定这个用户只能在 'localhost' 使用
    INSERT INTO mysql.user (HOST, USER, PASSWORD) 
    VALUES
      (
        'localhost',
        'demo_l',
        PASSWORD("123456")
      ) ;
    
    -- 2. 授权 demo 访问 ranzhi 数据库的所有的权限
    GRANT ALL PRIVILEGES 
    ON ranzhi.* TO demo_l@'localhost'
    IDENTIFIED BY '123456';
    
    -- 3. 刷新所有的授权(上述两条语句每执行一条,均需要执行此语句刷新权限)
    FLUSH PRIVILEGES;
    

    具体例子二:

    创建用户 demo_a,让demo_a能够在本地电脑之外的任何电脑进行访问 在本地,访问(172.31.xx.xx)

    -- 1. 创建一个用户,这个用户名字是 demo_a, 密码是 123456 ,规定这个用户能在 '%' 使用 (%代表本地电脑之外的任何电脑)
    INSERT INTO mysql.user (HOST, USER, PASSWORD) 
    VALUES
      (
        '%',
        'demo_a',
        PASSWORD("123456")
      ) ;
    
    -- 2. 授权 demo 访问 ranzhi 数据库的所有的权限
    GRANT ALL PRIVILEGES 
    ON ranzhi.* TO demo_a@'%'
    IDENTIFIED BY '123456';
    
    -- 3. 刷新所有的授权
    FLUSH PRIVILEGES;
    

    具体例子三:

    创建用户 demo_ip,让demo_ip只能够在 ip = 172.31.95.188 进行访问, 在本地以及其他任何电脑无访问权限

    -- 1. 创建一个用户,这个用户名字是 demo_ip, 密码是 123456 ,规定这个用户只能在 '192.168.17.129' 使用
    INSERT INTO mysql.`user` (HOST, USER, PASSWORD) 
    VALUES
      (
        '192.168.17.129',
        'demo_ip',
        PASSWORD("123456")
      ) ;
    
    -- 2. 授权 demo 访问 ranzhi 数据库的所有的权限
    GRANT ALL PRIVILEGES 
    ON ranzhi.* TO demo_ip@'192.168.17.129'
    IDENTIFIED BY '123456';
    
    -- 3. 刷新所有的授权
    FLUSH PRIVILEGES;
    
  3. 登录用户

    使用刚刚创建的用户进行登录

    mysql> exit;
    @> mysql -u test -p
    Enter password: 
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 6
    Server version: 10.1.9-MariaDB mariadb.org binary distribution
    Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    

用户授权

授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by '密码'; 
  1. 登录MySQL,需要用有ROOT权限的用户

    @>mysql -u root -p
    Enter password:
    

  2. 为用户创建一个数据库

    mysql>create database testDB;
    

  3. grant语法

    mysql> GRANT <privileges> ON <what>
    -> TO <user> [IDENTIFIED BY "<password>"]
    -> [WITH GRANT OPTION];
    

  4. 授权test用户拥有testDB数据库的所有权限(某个数据库的所有权限)

    mysql>grant all privileges on testDB.* to test@localhost identified by '123456';
    mysql>flush privileges; ## 刷新系统权限表
    

  5. 如果想指定部分权限给一用户,可以这样来写

    mysql>grant select, update on testDB.* to test@localhost identified by '123456';
    mysql>flush privileges; ## 刷新系统权限表
    

  6. 授权test用户拥有所有数据库的某些权限

    mysql>grant select, delete, update, create, drop on . to test@'%' identified by '123456';
    mysql>flush privileges; ## test用户对所有数据库都有select, delete, update, create, drop 权限。
    

    @"%" 表示对所有非本地主机授权,不包括localhost。(localhost地址设为127.0.0.1)

    对localhost授权:加上一句grant all privileges on testDB.* to test@'localhost' identified by '123456';即可。

    权限关键字说明:

    数据库/数据表/数据列权限:
    Alter: 修改已存在的数据表(例如增加/删除列)和索引。
    Create: 建立新的数据库或数据表。
    Delete: 删除表的记录。
    Drop: 删除数据表或数据库。
    INDEX: 建立或删除索引。
    Insert: 增加表的记录。
    Select: 显示/搜索表的记录。
    Update: 修改表中已存在的记录。

    全局管理MySQL用户权限:
    file: 在MySQL服务器上读写文件。
    PROCESS: 显示或杀死属于其它用户的服务线程。
    RELOAD: 重载访问控制表,刷新日志等。
    SHUTDOWN: 关闭MySQL服务。

    特别的权限:
    ALL: 允许做任何事(和root一样)。
    USAGE: 只允许登录--其它什么也不允许做。

  7. 权限查询

    --直接查询mysql.user表
    mysql>select *  from mysql.user where host='localhost' and user='test';
    --查询授权
    mysql>show grants for test@'localhost';
    --查询结果:
    GRANT USAGE ON *.* TO 'test'@'localhost' IDENTIFIED BY PASSWORD  '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'     --具备登录权限
    GRANT ALL PRIVILEGES ON `ranzhi`.* TO 'test'@'localhost' --具备ranzhi数据库的所有权限
    

  8. 权限回收

    --回收test用户的ranzhi数据库所有权限
    REVOKE ALL PRIVILEGES ON `ranzhi`.* FROM 'test'@'localhost'
    

完整的实例

如果你需要添加 MySQL 用户,你只需要在 mysql 数据库中的 user 表添加新用户即可。

以下为添加用户的的实例,用户名为hr,密码为123456,并授权用户可进行 SELECT, INSERT 和 UPDATE操作权限:

root@host# mysql -u root -p
Enter password:*******
--创建一个数据库hrdb,采用utf-8为默认字符编码
mysql>CREATE DATABASE hrdb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Database changed
--从user表添加用户,且用户具备所有数据库的增、改、查权限
mysql> INSERT INTO mysql.user 
          (host, user, password, 
           select_priv, insert_priv, update_priv) 
           VALUES ('localhost', 'hr', 
           PASSWORD('123456'), 'Y', 'Y', 'Y');
Query OK, 1 row affected (0.20 sec)
--提交权限
mysql> FLUSH PRIVILEGES;
--将hrdb的所有权限授予hr@localhost用户
mysql> grant all privileges on hrdb.* to hr@'localhost' identified by '123456'
--将登录权限授予hr@localhost用户
mysql> GRANT USAGE ON *.* TO 'hr'@'localhost' IDENTIFIED BY 'guest123'
--提交权限
mysql> FLUSH PRIVILEGES;
Query OK, 1 row affected (0.01 sec)
--查询user表
mysql> SELECT host, user, password FROM user WHERE user = 'hr';
+-----------+---------+------------------+
| host      | user    | password         |
+-----------+---------+------------------+
| localhost | hr | 6f8c114b58f2ce9e |
+-----------+---------+------------------+
1 row in set (0.00 sec)
--查询grants
mysql>show grants for hr@localhost

在添加用户时,请注意使用MySQL提供的 PASSWORD() 函数来对密码进行加密。 你可以在以上实例看到用户密码加密后为: 6f8c114b58f2ce9e.

注意:在 MySQL5.7 中 user 表的 password 已换成了authentication_string

注意:在注意需要执行 FLUSH PRIVILEGES 语句。 这个命令执行后会重新载入授权表。

如果你不使用该命令,你就无法使用新创建的用户来连接mysql服务器,除非你重启mysql服务器。

删除用户

  1. 登录MySQL,需要用有ROOT权限的用户

    @>mysql -u root -p
    Enter password:
    

  2. 删除指定的用户、数据库和权限

    #drop user将会删除mysql.user表数据 + 用户数据库 + 权限数据
    mysql>drop user test #默认删除:test@'%',如无会报错
    mysql>drop user test@'localhost'
    mysql>drop user test@'ip'
    
    #如果用delete from user......,则只删除mysql.user表,其他需要手动再删除
    #否则当之后创建同名的用户时,将继承之前用户的相关权限和数据库
    mysql>delete from user where User='test' and Host='localhost';
    mysql>flush privileges;
    mysql>drop database testDB; ## 删除用户的数据库
    mysql>drop user test@'%';
    mysql>drop user test@ localhost; 
    

修改指定用户密码

  1. 首先登录,然后修改用户的密码
mysql>update mysql.user set password=password('新密码') where User='test' and Host='localhost'
mysql>flush privileges;

其他操作

  1. 列出所有数据库

    mysql>show database;
    

  2. 切换数据库

    mysql>use '数据库名';
    

  3. 列出所有表

    mysql>show tables;
    

  4. 显示数据表结构

    mysql>describe 表名;
    

  5. 删除数据库和数据表

    mysql>drop database 数据库名;
    mysql>drop table 数据表名;
    

Linux/UNIX上安装MySQL

Linux平台上推荐使用RPM包来安装MySQL,MySQL AB提供了以下RPM包的下载地址:

  • MySQL - MySQL服务器。你需要该选项,除非你只想连接运行在另一台机器上的MySQL服务器。
  • MySQL-client - MySQL 客户端程序,用于连接并操作MySQL服务器。
  • MySQL-devel - 库和包含文件,如果你想要编译其它MySQL客户端,例如Perl模块,则需要安装该RPM包。
  • MySQL-shared - 该软件包包含某些语言和应用程序需要动态装载的共享库(libmysqlclient.so*),使用MySQL。
  • MySQL-bench - MySQL数据库服务器的基准和性能测试工具。

以下安装MySQL RMP的实例是在SuSE Linux系统上进行,当然该安装步骤也适合应用于其他支持RPM的Linux系统,如: Centos。

安装步骤如下:

使用root用户登陆你的Linux系统。

下载MySQL RPM包,下载地址为:MySQL 下载

通过以下命令执行MySQL安装,rpm包为你下载的rpm包:

[root@host]# rpm -i MySQL-5.0.9-0.i386.rpm

以上安装mysql服务器的过程会创建mysql用户,并创建一个mysql配置文件my.cnf。

你可以在/usr/bin和/usr/sbin中找到所有与MySQL相关的二进制文件。所有数据表和数据库将在/var/lib/mysql目录中创建。

以下是一些mysql可选包的安装过程,你可以根据自己的需要来安装:

[root@host]# rpm -i MySQL-client-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-devel-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-shared-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-bench-5.0.9-0.i386.rpm

MySQL 的查询

基本查询

查询语法

SELECT table1.column, table2.column,...
FROM  table1
WHERE ...
LIMIT 0, 1000;

查询示例:

-- 查询工资高于5000且部门不是100号的雇员的所有信息
SELECT 
  e.* 
FROM
  hr.employees e 
WHERE e.SALARY > 5000 
  AND e.DEPARTMENT_ID <> 100 ;

查询示例:

-- 按部门编号(department_id)统计工资高于5000且部门不是100号的雇员,
-- 统计结果包括每个部门的 人数,最高工资、最低工资,平均工资、工资总和
-- 按部门人数 降序排列
SELECT 
  e.DEPARTMENT_ID,
  COUNT(e.EMPLOYEE_ID) ct,
  AVG(e.SALARY) gs,
  SUM(e.salary) us,
  MAX(e.salary) ms,
  MIN(e.salary) ns 
FROM
  hr.employees e 
WHERE e.SALARY > 5000 
  AND e.DEPARTMENT_ID <> 100 
GROUP BY e.DEPARTMENT_ID 
HAVING ct > 1 
ORDER BY ct DESC ;

查询示例:

-- 按雇员经理(manager_id)和部门(department_id)统计
-- 工资高于5000且部门不是100号的雇员,统计每一组的人数和平均工资
-- 并按照人数降序,平均工资降序排列
  SELECT 
    e.DEPARTMENT_ID,
    e.MANAGER_ID,
    COUNT(*) ct,
    AVG(e.SALARY) gs 
  FROM
    hr.employees e 
  WHERE e.SALARY > 5000 
    AND e.DEPARTMENT_ID <> 100 
  GROUP BY e.DEPARTMENT_ID,
    e.MANAGER_ID 
  HAVING ct > 1 
  ORDER BY ct DESC,
    gs DESC ;

多表查询

查询语法

SELECT  table1.column, table2.column,...
FROM    table1
INNER JOIN table2
ON  table1.column1 = table2.column2;

查询示例

--  查询每个雇员的编号、姓名和部门名称
SELECT 
  e.`EMPLOYEE_ID`,
  e.`FIRST_NAME`,
  d.`DEPARTMENT_NAME`
FROM
  hr.`employees` e 
  INNER JOIN hr.`departments` d 
    ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID` ;

多表相当于合作,就是一个表的数据内容不缺,缺乏了一部分存储在别的表中的字段。那么需要这些表精诚合作,谈好条件,得出结论。

INNER JOIN 连接谈判的各方(注意,这里不只是可以用 inner join,还有 left join, right join, full join

ON 是谈判的条件。

查询示例:

-- 查询每个部门的具体信息:
-- 部门编号、部门名称、所在城市、所在州(省份)、邮编、街道
-- department_id, department_name, 
-- city, state_province, postal_code, street_address
SELECT 
  d.`DEPARTMENT_ID`,
  d.`DEPARTMENT_NAME`,
  l.`CITY`,
  l.`STATE_PROVINCE`,
  l.`POSTAL_CODE`,
  l.`STREET_ADDRESS` 
FROM
  hr.`departments` d 
  INNER JOIN hr.`locations` l 
    ON d.`LOCATION_ID` = l.`LOCATION_ID` ;

TOP-N 分析

TOP-N分析在MySQL中用 LIMIT 语句

示例1:

-- 查询所有雇员,按照雇员的工资进行降序排序,
-- 并从高到底列出前5名雇员信息。
SELECT 
  e.* 
FROM
  hr.`employees` e 
ORDER BY e.`SALARY` DESC 
LIMIT 5;

LIMIT 5 就是取出结果的前五条记录。

示例2:

-- 查询所有雇员,按照雇员的工资进行降序排序,
-- 并从高到底列出第9-13名雇员信息。
SELECT 
  e.* 
FROM
  hr.`employees` e 
ORDER BY e.`SALARY` DESC 
LIMIT 8, 5;

LIMIT 8,5 意思是 从第 8+1 条数据开始,连续取出5条。

这里,第一条开始,取10条,是LIMIT 0, 10,注意,LIMIT 从0开始取记录。

综合练习示例

-- 按雇员经理(manager_id)和部门(department_id)统计
-- 工资高于5000且部门不是100号的雇员,统计每一组的人数和平均工资
-- 并按照人数降序,平均工资降序排列
-- 列出来 经理姓名,部门的名称,部门的城市,人数,平均工资
-- 列出 第2-6条
SELECT 
  CONCAT(M.FIRST_NAME, ' ', M.LAST_NAME) MANAGER_NAME,
  d.DEPARTMENT_NAME,
  l.CITY,
  s.ct,
  s.gs 
FROM
  (SELECT 
    e.DEPARTMENT_ID,
    e.MANAGER_ID,
    COUNT(*) ct,
    AVG(e.SALARY) gs 
  FROM
    hr.employees e 
  WHERE e.SALARY > 5000 
    AND e.DEPARTMENT_ID <> 100 
  GROUP BY e.DEPARTMENT_ID,
    e.MANAGER_ID 
  HAVING ct > 1) S 
    /* S作为子查询,是一个拥有一堆ID的主表*/
  INNER JOIN hr.departments d 
    ON s.DEPARTMENT_ID = d.DEPARTMENT_ID 
    /* 拉上 departments表,取出部门名称 */
  INNER JOIN hr.locations l 
    ON d.location_id = l.location_id 
    /* 拉上 locations 表,取出城市 */
  INNER JOIN hr.employees m 
    ON s.manager_id = m.EMPLOYEE_ID 
    /* 经理也是员工,大家想一下nancy怎么找出来的? 雇员的经理id,等于经理的 员工id */
ORDER BY ct DESC,
  gs DESC 
LIMIT 1, 5 ;


MySQL 导出数据

MySQL中你可以使用SELECT...INTO OUTFILE语句来简单的导出数据到文本文件上。


使用 SELECT ... INTO OUTFILE 语句导出数据

以下实例中我们将数据表 hrdb.employees 数据导出到 /tmp/tutorials.txt 文件中:

mysql> SELECT * FROM hrdb.employees INTO OUTFILE 
    ->'d:\\xampp826\\mysql\\bin\\data\\empData.txt';

你可以通过命令选项来设置数据输出的指定格式,以下实例为导出 CSV 格式:

mysql> SELECT * FROM passwd INTO OUTFILE '/tmp/tutorials.txt'
    -> FIELDS TERMINATED BY ',' ENCLOSED BY '"'
    -> LINES TERMINATED BY '\r\n';

在下面的例子中,生成一个文件,各值用逗号隔开。这种格式可以被许多程序使用。

SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;

SELECT ... INTO OUTFILE 语句有以下属性:

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

导出表作为原始数据

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

使用mysqldump导出数据需要使用 --tab 选项来指定导出文件指定的目录,该目标必须是可写的。

以下实例将数据表 runoob_tbl 导出到 /tmp 目录中:

$ mysqldump -u root -p --no-create-info \
            --tab=/tmp RUNOOB runoob_tbl
password ******

导出SQL格式的数据

导出SQL格式的数据到指定文件,如下所示:

$ mysqldump -u root -p RUNOOB runoob_tbl > dump.txt
password ******

以上命令创建的文件内容如下:

-- MySQL dump 8.23
--
-- Host: localhost    Database: RUNOOB
---------------------------------------------------------
-- Server version       3.23.58

--
-- Table structure for table `runoob_tbl`
--

CREATE TABLE runoob_tbl (
  runoob_id int(11) NOT NULL auto_increment,
  runoob_title varchar(100) NOT NULL default '',
  runoob_author varchar(40) NOT NULL default '',
  submission_date date default NULL,
  PRIMARY KEY  (runoob_id),
  UNIQUE KEY AUTHOR_INDEX (runoob_author)
) TYPE=MyISAM;

--
-- Dumping data for table `runoob_tbl`
--

INSERT INTO runoob_tbl 
       VALUES (1,'Learn PHP','John Poul','2007-05-24');
INSERT INTO runoob_tbl 
       VALUES (2,'Learn MySQL','Abdul S','2007-05-24');
INSERT INTO runoob_tbl 
       VALUES (3,'JAVA Tutorial','Sanjay','2007-05-06');

如果你需要导出整个数据库的数据,可以使用以下命令:

$ mysqldump -u root -p RUNOOB > database_dump.txt
password ******

如果需要备份所有数据库,可以使用以下命令:

$ mysqldump -u root -p --all-databases > database_dump.txt
password ******

--all-databases 选项在 MySQL 3.23.12 及以后版本加入。

该方法可用于实现数据库的备份策略。


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

如果你需要将数据拷贝至其他的 MySQL 服务器上, 你可以在 mysqldump 命令中指定数据库名及数据表。

在源主机上执行以下命令,将数据备份至 dump.txt 文件中:

$ mysqldump -u root -p database_name table_name > dump.txt
password *****

如果完整备份数据库,则无需使用特定的表名称。

如果你需要将备份的数据库导入到MySQL服务器中,可以使用以下命令,使用以下命令你需要确认数据库已经创建:

$ mysql -u root -p database_name < dump.txt
password *****
你也可以使用以下命令将导出的数据直接导入到远程的服务器上,但请确保两台服务器是相通的,是可以相互访问的:</p>
$ mysqldump -u root -p database_name \
       | mysql -h other-host.com database_name

以上命令中使用了管道来将导出的数据导入到指定的远程主机上。

MySQL 导入数据

MySQL中可以使用两种简单的方式来导入MySQL导出的数据。


使用 LOAD DATA 导入数据

MySQL 中提供了LOAD DATA INFILE语句来插入数据。 以下实例中将从当前目录中读取文件 dump.txt ,将该文件中的数据插入到当前数据库的 mytbl 表中。

mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;

如果指定LOCAL关键词,则表明从客户主机上按路径读取文件。如果没有指定,则文件在服务器上按路径读取文件。

你能明确地在LOAD DATA语句中指出列值的分隔符和行尾标记,但是默认标记是定位符和换行符。

两个命令的 FIELDS 和 LINES 子句的语法是一样的。两个子句都是可选的,但是如果两个同时被指定,FIELDS 子句必须出现在 LINES 子句之前。

如果用户指定一个 FIELDS 子句,它的子句 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可选的,不过,用户必须至少指定它们中的一个。

mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl
  -> FIELDS TERMINATED BY ':'
  -> LINES TERMINATED BY '\r\n';

LOAD DATA 默认情况下是按照数据文件中列的顺序插入数据的,如果数据文件中的列与插入表中的列不一致,则需要指定列的顺序。

如,在数据文件中的列顺序是 a,b,c,但在插入表的列顺序为b,c,a,则数据导入语法如下:

mysql> LOAD DATA LOCAL INFILE 'dump.txt' 
    -> INTO TABLE mytbl (b, c, a);

使用 mysqlimport 导入数据

mysqlimport客户端提供了LOAD DATA INFILEQL语句的一个命令行接口。mysqlimport的大多数选项直接对应LOAD DATA INFILE子句。

从文件 dump.txt 中将数据导入到 mytbl 数据表中, 可以使用以下命令:

$ mysqlimport -u root -p --local database_name dump.txt
password *****

mysqlimport命令可以指定选项来设置指定格式,命令语句格式如下:

$ mysqlimport -u root -p --local --fields-terminated-by=":" \
   --lines-terminated-by="\r\n"  database_name dump.txt
password *****

mysqlimport 语句中使用 --columns 选项来设置列的顺序:

$ mysqlimport -u root -p --local --columns=b,c,a \
    database_name dump.txt
password *****

mysqlimport的常用选项介绍

选项 功能
-d or --delete 新数据导入数据表中之前删除数据数据表中的所有信息
-f or --force 不管是否遇到错误,mysqlimport将强制继续插入数据
-i or --ignore mysqlimport跳过或者忽略那些有相同唯一 关键字的行, 导入文件中的数据将被忽略。
-l or -lock-tables 数据被插入之前锁住表,这样就防止了, 你在更新数据库时,用户的查询和更新受到影响。
-r or -replace 这个选项与-i选项的作用相反;此选项将替代 表中有相同唯一关键字的记录。
--fields-enclosed- by= char 指定文本文件中数据的记录时以什么括起的, 很多情况下 数据以双引号括起。 默认的情况下数据是没有被字符括起的。
--fields-terminated- by=char 指定各个数据的值之间的分隔符,在句号分隔的文件中, 分隔符是句号。您可以用此选项指定数据之间的分隔符。 默认的分隔符是跳格符(Tab)
--lines-terminated- by=str 此选项指定文本文件中行与行之间数据的分隔字符串 或者字符。 默认的情况下mysqlimport以newline为行分隔符。 您可以选择用一个字符串来替代一个单个的字符: 一个新行或者一个回车。

mysqlimport命令常用的选项还有-v 显示版本(version), -p 提示输入密码(password)等。

MySQL 的四处不同

  1. 用户 user@host
  2. 查询Top-N 用 Limit x 和 Limit x, y
  3. MySQL 默认用 反引号 '`' 键盘左上角第二个。反引号可以去掉。
  4. MySQL 对脚本要求低,可以执行的语句,不代表是对的。

访问虚拟机中Linux 的MySQL

  1. 在Linux中用命令行登录MySQL,创建用户,或者修改
    'update user set host = '%' where user = 'root' and host = '127.0.0.1';'
  2. 修改防火墙设置。需要关闭防火墙,或者自定义防火墙。
    setup,关闭
    setup,customize, forward, add Protocol and port (3306, tcp)
  3. 重启MySQL service mysqld restart
  4. 用本地的 SQLYog 连接 Linux的 MySQL
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容