美文网首页
MYSQL语法

MYSQL语法

作者: 转身一世铅华尽 | 来源:发表于2020-06-08 14:27 被阅读0次

    数据库创建删除

    CREATE DATABASE ***;
    DROP DATABASE ***;
    USE ****;//使用数据库
    

    创建删除表

    CREATE TABLE table_name (column_name column_type);
    DROP TABLE table_name ;
    

    数据插入

    INSERT INTO table_name ( field1, field2,...fieldN )
                           VALUES
                           ( value1, value2,...valueN );
    

    SELECT column_name,column_name
    FROM table_name
    [WHERE Clause]
    [LIMIT N][ OFFSET M]
    

    WHERE子句

    where子句一般后面跟着条件语句:

    SELECT field1, field2,...fieldN FROM table_name1, table_name2...
    [WHERE condition1 [AND [OR]] condition2.....
    

    更新语句 UPDATE

    update语句一般用于向已存在的MySQL数据更新数据

    UPDATE table_name SET field1=new-value1, field2=new-value2
    [WHERE Clause]
    

    可以同时更新多个MySQL字段的值,也可以同时通过where子句指定更新条件

    DELETE语句

    用于删除数据库数据

    DELETE FROM table_name [WHERE Clause]
    

    可以通过where子句指定条件

    LIKE子句

    SELECT field1, field2,...fieldN 
    FROM table_name
    WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
    

    通过like子句进行模糊匹配,匹配field1中包含了条件1的字段

    你可以在 WHERE 子句中指定任何条件。
    你可以在 WHERE 子句中使用LIKE子句。
    你可以使用LIKE子句代替等号 =。
    LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
    你可以使用 AND 或者 OR 指定一个或多个条件。
    你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句来指定条件。
    

    UNION子句

    该子句是用于连结两个以上的select语句的结果到一个集合中,多个select语句会删除重复数据

    SELECT expression1, expression2, ... expression_n
    FROM tables
    [WHERE conditions]
    UNION [ALL | DISTINCT]
    SELECT expression1, expression2, ... expression_n
    FROM tables
    [WHERE conditions];
    

    expression表示查询的数据库的列
    condition表示查询的条件
    ALL|DISTINCT 默认为DISTINCT结果,就是删除重复数据,ALL表示不擅长重复数据

    ORDER BY,MYSQL排序

    如果我们需要对MySQL的数据进行排序,则我们可以通过order by来进行设置,

    SELECT field1, field2,...fieldN FROM table_name1, table_name2...
    ORDER BY field1 [ASC [DESC][默认 ASC]], [field2...] [ASC [DESC][默认 ASC]]
    

    你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
    你可以设定多个字段来排序。
    你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
    你可以添加 WHERE...LIKE 子句来设置条件

    GROUP BY语句

    group by语句可以对一个或多个列对结果集进行分组
    在分组的列上,我们可以使用count,avg,sum等函数

    SELECT column_name, function(column_name)
    FROM table_name
    WHERE column_name operator value
    GROUP BY column_name;
    

    使用 WITH ROLLUP可以在实现分组统计的基础上再进行相同的统计
    下面这个例子:将数据表按名字进行分组,再统计每个人登录的次数:

    mysql> SELECT name, SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;
    +--------+--------------+
    | name   | singin_count |
    +--------+--------------+
    | 小丽 |            2 |
    | 小明 |            7 |
    | 小王 |            7 |
    | NULL   |           16 |
    +--------+--------------+
    4 rows in set (0.00 sec)
    
    ERROR:Can't open the mysql.plugin table
    can not open the mysql.plugin table,please run mysql_upgrade to create it
    
    
    
    ERROR:SELECT list is not in GROUP BY clause and contains nonaggregated column
    再MySQL5.6以上版本,查询模式会有一个ONLY_FULL_GROUP_BY
    只需要去配置文件中修改掉这个就行了mysql.cnf配置文件
    Windows:
    set @@global.sql_mode
    =‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’;
    Linux:
    sudo vim /etc/mysql/conf.d/mysql.cnf
    在文件底部添加下面配置,重启数据库即可
    [mysqld]
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    

    MYSQL连接

    你可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。
    JOIN 按照功能大致分为如下三类:
    INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
    LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
    RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
    例如:

    mysql> SELECT * FROM tcount_tbl;
    +---------------+--------------+
    | runoob_author | runoob_count |
    +---------------+--------------+
    | 菜鸟教程  | 10           |
    | RUNOOB.COM    | 20           |
    | Google        | 22           |
    +---------------+--------------+
    3 rows in set (0.01 sec)
     
    mysql> SELECT * from runoob_tbl;
    +-----------+---------------+---------------+-----------------+
    | runoob_id | runoob_title  | runoob_author | submission_date |
    +-----------+---------------+---------------+-----------------+
    | 1         | 学习 PHP    | 菜鸟教程  | 2017-04-12      |
    | 2         | 学习 MySQL  | 菜鸟教程  | 2017-04-12      |
    | 3         | 学习 Java   | RUNOOB.COM    | 2015-05-01      |
    | 4         | 学习 Python | RUNOOB.COM    | 2016-03-06      |
    | 5         | 学习 C      | FK            | 2017-04-05      |
    +-----------+---------------+---------------+-----------------+
    5 rows in set (0.01 sec)
    
    内连接查询,只有当两个表都有相应条件数据时才能查询
    出数据
    mysql> 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;
    +-------------+-----------------+----------------+
    | a.runoob_id | a.runoob_author | b.runoob_count |
    +-------------+-----------------+----------------+
    | 1           | 菜鸟教程    | 10             |
    | 2           | 菜鸟教程    | 10             |
    | 3           | RUNOOB.COM      | 20             |
    | 4           | RUNOOB.COM      | 20             |
    +-------------+-----------------+----------------+
    4 rows in set (0.00 sec)
    
    
    左连接查询,当右边也没有数据时也能查询出数据,右边会赋予默认值
    mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
    +-------------+-----------------+----------------+
    | a.runoob_id | a.runoob_author | b.runoob_count |
    +-------------+-----------------+----------------+
    | 1           | 菜鸟教程    | 10             |
    | 2           | 菜鸟教程    | 10             |
    | 3           | RUNOOB.COM      | 20             |
    | 4           | RUNOOB.COM      | 20             |
    | 5           | FK              | NULL           |
    +-------------+-----------------+----------------+
    5 rows in set (0.01 sec)
    
    
    右连接查询,当左边也没有数据时也能查询出数据,左边会赋予默认值
    mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
    +-------------+-----------------+----------------+
    | a.runoob_id | a.runoob_author | b.runoob_count |
    +-------------+-----------------+----------------+
    | 1           | 菜鸟教程    | 10             |
    | 2           | 菜鸟教程    | 10             |
    | 3           | RUNOOB.COM      | 20             |
    | 4           | RUNOOB.COM      | 20             |
    | NULL        | NULL            | 22             |
    +-------------+-----------------+----------------+
    5 rows in set (0.01 sec)
    
    

    MYSQL处理字段为NULL情况

    当我们使用条件查询是,有可能碰上字段为null的情况,这种情况下,我们需要使用MySQL提供的处理机制进行处理
    MySQL提供了三大运算符处理null情况

    IS NULL :当列的值为null,返回true
    IS NOT NULL : 当列的值不为null时,返回true
    <=> :比较操作符,当比较的两个值都为null时返回true
    MySQL中无法使用 =null或者 !=null进行判定null,null与任何值比较都返回null
    

    MySQL的正则表达式

    MySQL的查询中同样支持正则表达式
    模式 描述
    ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
    匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性, 也匹配 '\n' 或 '\r' 之前的位置。
    . 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
    [...] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
    [^...] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
    p1|p2|p3 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

    • 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
    • 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
      {n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
      {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

    MySQL事务特性

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

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

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

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

    事务控制语句:

    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。
    

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

    1、用 BEGIN, ROLLBACK, COMMIT来实现

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

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

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

    MYSQL ALTER命令

    当我们需要修改一张表的表名或者数据字段时,就需要使用ALTER命令

    删除,添加或修改表字段

    如下命令使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段:

    ALTER TABLE testalter_tbl  DROP i;
    

    如果数据表中只剩余一个字段则无法使用DROP来删除字段。

    如果表中没有 i 字段,向表中添加一个i字段

    ALTER TABLE testalter_tbl ADD i INT;
    

    如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。

    ALTER TABLE testalter_tbl ADD i INT FIRST;//在第一位新增i字段
    ALTER TABLE testalter_tbl ADD i INT AFTER c;//在c后面增加i字段
    

    FIRST 和 AFTER 关键字可用于 ADD 与 MODIFY 子句,所以如果你想重置数据表字段的位置就需要先使用 DROP 删除字段然后使用 ADD 来添加字段并设置位置。

    修改字段类型及名称

    如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。
    例如,把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:

    ALTER TABLE testalter_tbl MODIFY c CHAR(10);
    

    使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。

    ALTER TABLE testalter_tbl CHANGE i j BIGINT;
    ALTER TABLE testalter_tbl CHANGE j j INT;
    

    当你修改字段时,你可以指定是否包含值或者是否设置默认值。

    ALTER TABLE testalter_tbl MODIFY j BIGINT NOT NULL DEFAULT 100;
    

    修改字段默认值

    ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;//修改默认值为1000
    ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;//删除默认值
    

    修改数据表类型,可以使用 ALTER 命令及 TYPE 子句来完成。尝试以下实例,我们将表 testalter_tbl 的类型修改为 MYISAM :

    ALTER TABLE testalter_tbl ENGINE = MYISAM;
    

    修改表名
    如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使用 RENAME 子句来实现。
    尝试以下实例将数据表 testalter_tbl 重命名为 alter_tbl:

    ALTER TABLE testalter_tbl RENAME TO alter_tbl;
    

    MySQL 索引

    MYSQL的索引能够大幅提升MySQL的检索速率,索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
    创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
    实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
    上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
    建立索引会占用磁盘空间的索引文件。
    创建最基础的索引:

    CREATE INDEX indexName ON mytable(username(length)); 
    

    修改表结构(添加索引)

    ALTER table tableName ADD INDEX indexName(columnName)
    

    创建表的时候直接指定

    CREATE TABLE mytable(  
    ID INT NOT NULL,   
    username VARCHAR(16) NOT NULL,  
    INDEX [indexName] (username(length))  
    );
    

    删除索引的语法

    DROP INDEX [indexName] ON mytable;
    

    使用ALTER 命令添加和删除索引

    有四种方式来添加数据表的索引:

    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 命令添加和删除主键
    主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下

    ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
    ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
    ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);//通过ALTER删除主键
     SHOW INDEX FROM table_name; \G //通过 \G格式化显示索引信息
    

    MySQL 临时表

    MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间
    临时表在MySQL 3.23版本中添加,如果你的MySQL版本低于 3.23版本就无法使用MySQL的临时表。不过现在一般很少有再使用这么低版本的MySQL数据库服务了
    MySQL临时表只在当前连接可见,如果你使用PHP脚本来创建MySQL临时表,那每当PHP脚本执行完成后,该临时表也会自动销毁
    如果你使用了其他MySQL客户端程序连接MySQL数据库服务器来创建临时表,那么只有在关闭客户端程序时才会销毁临时表,当然你也可以手动销毁。

    CREATE TEMPORARY TABLE SalesSummary ();
    

    临时表在 show tables 时无法看到
    删除临时表:

    DROP TABLE SalesSummary;
    

    MySQL 复制表

    MySQL复制表
    步骤如下:
    使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。
    复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。
    如果你想复制表的内容,你就可以使用 INSERT INTO ... SELECT 语句来实现。

    MySQL 序列使用

    MySQL 序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。
    MySQL 中最简单使用序列的方法就是使用 MySQL AUTO_INCREMENT 来定义列。
    重置序列
    如果你删除了数据表中的多条记录,并希望对剩下数据的AUTO_INCREMENT列进行重新排列,那么你可以通过删除自增的列,然后重新添加来实现。 不过该操作要非常小心,如果在删除的同时又有新记录添加,有可能会出现数据混乱。操作如下所示:

    ALTER TABLE insect DROP id;
    ALTER TABLE insect ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id);
    

    设置序列的开始值
    一般情况下序列的开始值为1,但如果你需要指定一个开始值100,那我们可以通过以下语句来实现:

    mysql> CREATE TABLE insect
        -> (
        -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
        -> PRIMARY KEY (id),
        -> name VARCHAR(30) NOT NULL, 
        -> date DATE NOT NULL,
        -> origin VARCHAR(30) NOT NULL
    )engine=innodb auto_increment=100 charset=utf8;
    

    或者在创建完表之后通过:ALTER TABLE t AUTO_INCREMENT = 100;直接指定序列的起始位置

    MySQL 处理重复数据

    有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据
    你可以在 MySQL 数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。
    如果你想要表中两个字段同时都不能重复,则需要设置双主键,但是这样这两个字段都不能为空
    我们可以通过特定的语句想数据库插入重复数据,如:

    INSERT IGNORE INTO person_tbl (last_name, first_name) VALUES( 'Jay', 'Thomas');
    

    这条语句使用会想数据库插入一条数据,首先会先检查这个表中是否存在这条数据,如果不存在则插入,如果存在,这无视这条数据,任然保持原数据
    INSERT IGNORE INTO 当插入数据时,在设置了记录的唯一性后,如果插入重复数据,将不返回错误,只以警告形式返回。 而 REPLACE INTO 如果存在 primary 或 unique 相同的记录,则先删除掉。再插入新记录。
    另一种设置数据的唯一性方法是添加一个 UNIQUE 索引,如下所示:

    CREATE TABLE person_tbl
    (
       first_name CHAR(20) NOT NULL,
       last_name CHAR(20) NOT NULL,
       sex CHAR(10),
       UNIQUE (last_name, first_name)
    );
    

    可以通过distinct的select来将搜索结果去重,也以通过group by搜索出不重复的数据。
    也可以通过对表添加主键或者索引来删除表中重复数据

    ALTER IGNORE TABLE person_tbl ADD PRIMARY KEY (last_name, first_name);
    

    MYSQL的 SQL注入

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

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

    MySQL 导出数据

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

    SELECT * FROM runoob_tbl INTO OUTFILE '/tmp/runoob.txt';
    

    ···
    ERROR 1290 (HY000): THE MYSQL SERVER is running with the --secure-file-priv option so it cantnot execute this statement
    ···
    上面这个错误可以通过

    show global variables like '%secure_file_priv%';
    
    ERROR 1017 (HY000): can't find file: '****************'(ERRNOl13-PERMISSION DENIED)//如果出现这个,这到对应目录修改相应的文件用户所属。如:
    chown -R root:root *****;
    

    这个MySQL指令查询数据库的文件到处设置,如果为值NULL,则表示不允许导入导出,如果值为文件路径,表示只允许这个路径的文件导入导出,如果值为空这表示可以任意导入导出
    所以我们需要去到MySQL的配置下面修改(Linux为my.cnf | window为my.ini)

    secure_file_priv=''
    

    然后重启MySQL,就能继续导入导出了

    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 -u root -p RUNOOB > database_dump.txt
    

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

    mysqldump -u root -p --all-databases > database_dump.txt
    

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

    如果你需要将数据拷贝至其他的 MySQL 服务器上, 你可以在 mysqldump 命令中指定数据库名及数据表。
    在源主机上执行以下命令,将数据备份至 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
    

    MYSQL数据导入

    1、mysql 命令导入

    使用 mysql 命令导入语法格式为:

    mysql -u用户名    -p密码    <  要导入的数据库数据(***.sql)
    

    2、source 命令导入

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

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

    3、使用 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);
    

    MySQL函数链接
    MySQL运算符

    相关文章

      网友评论

          本文标题:MYSQL语法

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