数据库(6) | MySQL进阶

作者: 厲铆兄 | 来源:发表于2017-03-15 13:25 被阅读887次

    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

    相关文章

      网友评论

        本文标题:数据库(6) | MySQL进阶

        本文链接:https://www.haomeiwen.com/subject/srulnttx.html