• MySQL教程(复习)


    MySQL是一个关系型数据库管理系统。

    Mysql是什么?

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,它分为社区版和商业版,其体积小、速度快、总体拥有成本低,并且开源.

    Mysql有什么特性?

    1.使用 C和 C++编写,并使用了多种编译器进行测试,保证了源代码的可移植性。

    2.支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。

    3.为多种编程语言提供了 API。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby,.NET和 Tcl 等。

    4.支持多线程,充分利用 CPU 资源。

    5.优化的 SQL查询算法,有效地提高查询速度。

    6.既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。

    7.提供多语言支持,常见的编码如中文的 GB 2312、BIG5,日文的 Shift_JIS等都可以用作数据表名和数据列名。

    8.提供 TCP/IP、ODBC 和 JDBC等多种数据库连接途径。

    9.提供用于管理、检查、优化数据库操作的管理工具。

    10.支持大型的数据库。可以处理拥有上千万条记录的大型数据库。

    11.支持多种存储引擎。

    12.MySQL 是开源的,所以你不需要支付额外的费用。

    13.MySQL 使用标准的 SQL数据语言形式。

    14.MySQL 对 PHP 有很好的支持,PHP是目前最流行的 Web 开发语言。

    15.MySQL是可以定制的,采用了 GPL协议,你可以修改源码来开发自己的 MySQL 系统。

    16.在线 DDL/更改功能,数据架构支持动态应用程序和开发人员灵活性(5.6新增)

    17.复制全局事务标识,可支持自我修复式集群(5.6新增)

    18.复制无崩溃从机,可提高可用性(5.6新增)

    19.复制多线程从机,可提高性能(5.6新增)

    20.3倍更快的性能(5.7新增)

    21.新的优化器(5.7新增)

    22.原生JSON支持(5.7新增)

    23.多源复制(5.7新增)

    24.GIS的空间扩展(5.7新增)

    Mysql存储引擎

    1.MyISAM MySQL 5.0 之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务.

    2.InnoDB事务型数据库的首选引擎,支持ACID事务,支持行级锁定, MySQL 5.5 起成为默认数据库引擎.

    3.BDB源 自 Berkeley DB,事务型数据库的另一种选择,支持Commit 和Rollback 等其他事务特性

    4.Memory所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在 MySQL 重新启动时丢失

    5.Merge将一定数量的 MyISAM 表联合而成一个整体,在超大规模数据存储时很有用

    6.Archive非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive 拥有高效的插入速度,但其对查询的支持相对较差

    7.Federated将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用

    8.Cluster/NDB高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用

    9.CSV 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个 .csv 文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV 存储引擎不支持索引。

    10.BlackHole 黑洞引擎,写入的任何数据都会消失,一般用于记录 binlog 做复制的中继

    11.EXAMPLE 存储引擎是一个不做任何事情的存根引擎。它的目的是作为 MySQL 源代码中的一个例子,用来演示如何开始编写一个新存储引擎。同样,它的主要兴趣是对开发者。EXAMPLE 存储引擎不支持编索引。另外,MySQL 的存储引擎接口定义良好。有兴趣的开发者可以通过阅读文档编写自己的存储引擎。

    Mysql管理工具

    MyDB Studio 下载:http://www.cr173.com/soft/57493.html#address

    DBTools Manager 下载:https://www.crsky.com/soft/88541.html

    dbForge Studio 下载:http://down.51cto.com/data/881344

    SQLWave 下载:https://www.crsky.com/soft/8510.html#down

    phpMyAdmin 下载:https://www.phpmyadmin.net/

    Sequel Pro 下载:http://www.sequelpro.com/

    HeidiSQL 下载:http://www.heidisql.com/download.php

    Navicat 下载:http://www.liangchan.net/liangchan/6005.html

    Mysql附加资料

    MySQL官网:https://www.mysql.com/

    MySQL文档:http://dev.mysql.com/doc/

    MySQL下载:https://www.mysql.com/downloads/

    MySQL教程:http://www.w3cschool.cn/mysql/mysql-install-setup.html

    更新记录:

    MySQL IN 操作符


    IN 操作符

    IN 操作符允许您在 WHERE 子句中规定多个值。

    MySQL IN 语法

    SELECT column_name(s)
    FROM table_name
    WHERE column_name IN (value1,value2,...);



    演示数据库

    在本教程中,我们将使用众所周知的 Northwind 样本数据库。

    下面是选自 "Customers" 表的数据:

    CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
    1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
    2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
    3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico
    4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
    5 Berglunds snabbköp Christina Berglund Berguvsvägen 8 Luleå S-958 22 Sweden



    IN 操作符实例

    下面的 SQL 语句选取 City 为 "Paris" 或 "London" 的所有客户:

    实例

    SELECT * FROM Customers
    WHERE City IN ('Paris','London');
     
     

    MySQL 入门教程

    mysql

    Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

    在本教程中,会让大家快速掌握Mysql的基本知识,并轻松使用Mysql数据库。


    什么是数据库?

    数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,

    每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。

    我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。

    所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

    RDBMS即关系数据库管理系统(Relational Database Management System)的特点:

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

    RDBMS 术语

    在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:

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

    Mysql数据库

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

    • MySQL是开源的,所以你不需要支付额外的费用。
    • MySQL支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
    • MySQL使用标准的SQL数据语言形式。
    • MySQL可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
    • MySQL对PHP有很好的支持,PHP是目前最流行的Web开发语言。
    • MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。
    • MySQL是可以定制的,采用了GPL协议,你可以修改源码来开发自己的MySQL系统。

    在开始学习本教程前你应该了解?

    在开始学习本教程前你应该了解PHP和HTML的基础知识,并能简单的应用。

    本教程的很多例子都跟PHP语言有关,我们的实例基本上是采用PHP语言来演示。

    如果你还不了解PHP,你可以通过本站的PHP教程来了解该语言。

    MySQL 事务

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

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

    一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)

    • 1、事务的原子性:一组事务,要么成功;要么撤回。
    • 2、稳定性 : 有非法数据(外键约束之类),事务撤回。
    • 3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
    • 4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。

    在MySQL控制台使用事务来操作

    1,开始一个事务

    start transaction
    

    2, 做保存点

    savepoint 保存点名称
    

    3, 操作

    4,可以回滚,可以提交,没有问题,就提交,有问题就回滚。

    PHP中使用事务实例

    <?php
    $handler=mysql_connect("localhost","root","password");
    mysql_select_db("task");
    mysql_query("SET AUTOCOMMIT=0");//设置为不自动提交,因为MYSQL默认立即执行 mysql_query("BEGIN");//开始事务定义
    if(!mysql_query("insert into trans (id) values('2')"))
    {
    mysql_query("ROOLBACK");//判断当执行失败时回滚
    }
    if(!mysql_query("insert into trans (id) values('4')"))
    {
    mysql_query("ROOLBACK");//判断执行失败回滚
    }
    mysql_query("COMMIT");//执行事务
    mysql_close($handler);
    ?>


    MySQL字符串连接函数  

    使用方法:
    CONCAT(str1,str2,…)  

    返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。

    注意:
    如果所有参数均为非二进制字符串,则结果为非二进制字符串。 
    如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。
    一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型 cast, 例如:

    SELECT CONCAT(CAST(int_col AS CHAR), char_col)

    MySQL的concat函数可以连接一个或者多个字符串,如

    mysql> select concat('10');
    +--------------+
    | concat('10') |
    +--------------+
    | 10   |
    +--------------+
    1 row in set (0.00 sec)
    mysql> select concat('11','22','33');
    +------------------------+
    | concat('11','22','33') |
    +------------------------+
    | 112233 |
    +------------------------+
    1 row in set (0.00 sec)
    
    

    MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL

    mysql> select concat('11','22',null);
    +------------------------+
    | concat('11','22',null) |
    +------------------------+
    | NULL   |
    +------------------------+
    1 row in set (0.00 sec)
    
    
    

    MySQL中 concat_ws 函数
    使用方法: 
    CONCAT_WS(separator,str1,str2,...)

    CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。
    注意:
    如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。

    如连接后以逗号分隔 

    mysql> select concat_ws(',','11','22','33');
    
    +-------------------------------+
    | concat_ws(',','11','22','33') |
    +-------------------------------+
    | 11,22,33 |
    +-------------------------------+
    1 row in set (0.00 sec)
    
    和MySQL中concat函数不同的是, concat_ws函数在执行的时候,不会因为NULL值而返回NULL 
    mysql> select concat_ws(',','11','22',NULL);
    +-------------------------------+
    | concat_ws(',','11','22',NULL) |
    +-------------------------------+
    | 11,22 |
    +-------------------------------+
    1 row in set (0.00 sec)
    

    MySQL中 group_concat 函数
    完整的语法如下:
    group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])

    基本查询

    mysql> select * from aa;
    +------+------+
    | id| name |
    +------+------+
    |1 | 10|
    |1 | 20|
    |1 | 20|
    |2 | 20|
    |3 | 200   |
    |3 | 500   |
    +------+------+
    6 rows in set (0.00 sec)
    

    以id分组,把name字段的值打印在一行,逗号分隔(默认)

    mysql> select id,group_concat(name) from aa group by id;
    +------+--------------------+
    | id| group_concat(name) |
    +------+--------------------+
    |1 | 10,20,20|
    |2 | 20 |
    |3 | 200,500|
    +------+--------------------+
    3 rows in set (0.00 sec)

    以id分组,把name字段的值打印在一行,分号分隔

    mysql> select id,group_concat(name separator ';') from aa group by id;
    +------+----------------------------------+
    | id| group_concat(name separator ';') |
    +------+----------------------------------+
    |1 | 10;20;20 |
    |2 | 20|
    |3 | 200;500   |
    +------+----------------------------------+
    3 rows in set (0.00 sec)

    以id分组,把去冗余的name字段的值打印在一行,

    逗号分隔

    mysql> select id,group_concat(distinct name) from aa group by id;
    +------+-----------------------------+
    | id| group_concat(distinct name) |
    +------+-----------------------------+
    |1 | 10,20|
    |2 | 20   |
    |3 | 200,500 |
    +------+-----------------------------+
    3 rows in set (0.00 sec)
    
    

    以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序

    mysql> select id,group_concat(name order by name desc) from aa group by id;
    +------+---------------------------------------+
    | id| group_concat(name order by name desc) |
    +------+---------------------------------------+
    |1 | 20,20,10   |
    |2 | 20|
    |3 | 500,200|
    +------+---------------------------------------+
    3 rows in set (0.00 sec)
    
    

    repeat()函数

        用来复制字符串,如下'ab'表示要复制的字符串,2表示复制的份数

      

     mysql> select repeat('ab',2);
    
    +----------------+
    | repeat('ab',2) |
    +----------------+
    | abab           |
    +----------------+
    
       1 row in set (0.00 sec)
    
    又如
    mysql> select repeat('a',2);
    
    +---------------+
    | repeat('a',2) |
    +---------------+
    | aa            |
    +---------------+
    1 row in set (0.00 sec)
    


    mysql向表中某字段后追加一段字符串:

    update table_name set field=CONCAT(field,'',str)

    mysql 向表中某字段前加字符串

    update table_name set field=CONCAT('str',field)



    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 '
    ';
    

    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="
    "  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 导出数据

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


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

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

    mysql> SELECT * FROM tutorials_tbl 
        -> INTO OUTFILE '/tmp/tutorials.txt';
    

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

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

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

    SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '
    '
    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 选项来指定导出文件指定的目录,该目标必须是可写的。

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

    $ mysqldump -u root -p --no-create-info 
                --tab=/tmp W3CSCHOOL w3cschool_tbl
    password ******
    

    导出SQL格式的数据

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

    $ mysqldump -u root -p W3CSCHOOL w3cschool_tbl > dump.txt
    password ******
    

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

    -- MySQL dump 8.23
    --
    -- Host: localhost    Database: W3CSCHOOL
    ---------------------------------------------------------
    -- Server version       3.23.58
    
    --
    -- Table structure for table `w3cschool_tbl`
    --
    
    CREATE TABLE w3cschool_tbl (
      w3cschool_id int(11) NOT NULL auto_increment,
      w3cschool_title varchar(100) NOT NULL default '',
      w3cschool_author varchar(40) NOT NULL default '',
      submission_date date default NULL,
      PRIMARY KEY  (w3cschool_id),
      UNIQUE KEY AUTHOR_INDEX (w3cschool_author)
    ) TYPE=MyISAM;
    
    --
    -- Dumping data for table `w3cschool_tbl`
    --
    
    INSERT INTO w3cschool_tbl 
           VALUES (1,'Learn PHP','John Poul','2007-05-24');
    INSERT INTO w3cschool_tbl 
           VALUES (2,'Learn MySQL','Abdul S','2007-05-24');
    INSERT INTO w3cschool_tbl 
           VALUES (3,'JAVA Tutorial','Sanjay','2007-05-06');
    

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

    $ mysqldump -u root -p W3CSCHOOL > 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以下三种信息:

    • 查询结果信息: SELECT, UPDATE 或 DELETE语句影响的记录数。
    • 数据库和数据表的信息: 包含了数据库及数据表的结构信息。
    • MySQL服务器信息: 包含了数据库服务器的当前状态,版本号等。

    在MySQL的命令提示符中,我们可以很容易的获取以上服务器信息。 但如果使用Perl或PHP等脚本语言,你就需要调用特定的接口函数来获取。 接下来我们会详细介绍。


    获取查询语句影响的记录数

    PERL 实例

    在 DBI 脚本中, 语句影响的记录数通过函数 do( ) 或 execute( )返回:

    # 方法 1
    # 使用do( ) 执行  $query 
    my $count = $dbh->do ($query);
    # 如果发生错误会输出 0
    printf "%d rows were affected
    ", (defined ($count) ? $count : 0);
    
    # 方法 2
    # 使用prepare( ) 及 execute( ) 执行  $query 
    my $sth = $dbh->prepare ($query);
    my $count = $sth->execute ( );
    printf "%d rows were affected
    ", (defined ($count) ? $count : 0);
    

    PHP 实例

    在PHP中,你可以使用 mysql_affected_rows( ) 函数来获取查询语句影响的记录数。

    $result_id = mysql_query ($query, $conn_id);
    # 如果查询失败返回 
    $count = ($result_id ? mysql_affected_rows ($conn_id) : 0);
    print ("$count rows were affected
    ");
    

    数据库和数据表列表

    你可以很容易的在MySQL服务器中获取数据库和数据表列表。 如果你没有足够的权限,结果将返回 null。

    你也可以使用 SHOW TABLES 或 SHOW DATABASES 语句来获取数据库和数据表列表。

    PERL 实例

    # 获取当前数据库中所有可用的表。
    my @tables = $dbh->tables ( );
    foreach $table (@tables ){
       print "Table Name $table
    ";
    }
    

    PHP 实例

    <?php
    $con = mysql_connect("localhost", "userid", "password");
    if (!$con)
    {
      die('Could not connect: ' . mysql_error());
    }
    
    $db_list = mysql_list_dbs($con);
    
    while ($db = mysql_fetch_object($db_list))
    {
      echo $db->Database . "<br />";
    }
    mysql_close($con);
    ?>
    

    获取服务器元数据

    以下命令语句可以在MySQL的命令提示符使用,也可以在脚本中 使用,如PHP脚本。

    命令描述
    SELECT VERSION( ) 服务器版本信息
    SELECT DATABASE( ) 当前数据库名 (或者返回空)
    SELECT USER( ) 当前用户名
    SHOW STATUS 服务器状态
    SHOW VARIABLES 服务器配置变量
     

    MySQL 复制表

    如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等。 如果仅仅使用CREATE TABLE ... SELECT 命令,是无法实现的。

    本章节将为大家介绍如何完整的复制MySQL数据表,步骤如下:

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

    实例

    尝试以下实例来复制表 w3cschool_tbl 。

    步骤一:

    获取数据表的完整结构。

    mysql> SHOW CREATE TABLE w3cschool_tbl G;
    *************************** 1. row ***************************
           Table: w3cschool_tbl
    Create Table: CREATE TABLE `w3cschool_tbl` (
      `w3cschool_id` int(11) NOT NULL auto_increment,
      `w3cschool_title` varchar(100) NOT NULL default '',
      `w3cschool_author` varchar(40) NOT NULL default '',
      `submission_date` date default NULL,
      PRIMARY KEY  (`w3cschool_id`),
      UNIQUE KEY `AUTHOR_INDEX` (`w3cschool_author`)
    ) ENGINE=InnoDB
    1 row in set (0.00 sec)
    
    ERROR:
    No query specified
    

    步骤二:

    修改SQL语句的数据表名,并执行SQL语句。

    mysql> CREATE TABLE `clone_tbl` (
      -> `w3cschool_id` int(11) NOT NULL auto_increment,
      -> `w3cschool_title` varchar(100) NOT NULL default '',
      -> `w3cschool_author` varchar(40) NOT NULL default '',
      -> `submission_date` date default NULL,
      -> PRIMARY KEY  (`w3cschool_id`),
      -> UNIQUE KEY `AUTHOR_INDEX` (`w3cschool_author`)
    -> ) ENGINE=InnoDB;
    Query OK, 0 rows affected (1.80 sec)
    

    步骤三:

    执行完第二步骤后,你将在数据库中创建新的克隆表 clone_tbl。 如果你想拷贝数据表的数据你可以使用 INSERT INTO... SELECT 语句来实现。

    mysql> INSERT INTO clone_tbl (w3cschool_id,
        ->                        w3cschool_title,
        ->                        w3cschool_author,
        ->                        submission_date)
        -> SELECT w3cschool_id,tutorial_title,
        ->        w3cschool_author,submission_date
        -> FROM w3cschool_tbl;
    Query OK, 3 rows affected (0.07 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    

    执行以上步骤后,你将完整的复制表,包括表结构及表数据。

    MySQL ALTER命令

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

    开始本章教程前让我们先创建一张表,表名为:testalter_tbl。

    root@host# mysql -u root -p password;
    Enter password:*******
    mysql> use W3CSCHOOL;
    Database changed
    mysql> create table testalter_tbl
        -> (
        -> i INT,
        -> c CHAR(1)
        -> );
    Query OK, 0 rows affected (0.05 sec)
    mysql> SHOW COLUMNS FROM testalter_tbl;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | i     | int(11) | YES  |     | NULL    |       |
    | c     | char(1) | YES  |     | NULL    |       |
    +-------+---------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    

    删除,添加或修改表字段

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

    mysql> ALTER TABLE testalter_tbl  DROP i;
    

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

    MySQL 中使用 ADD 子句来想数据表中添加列,如下实例在表 testalter_tbl 中添加 i 字段,并定义数据类型:

    mysql> ALTER TABLE testalter_tbl ADD i INT;
    

    执行以上命令后,i 字段会自动添加到数据表字段的末尾。

    mysql> SHOW COLUMNS FROM testalter_tbl;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | c     | char(1) | YES  |     | NULL    |       |
    | i     | int(11) | YES  |     | NULL    |       |
    +-------+---------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    

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

    尝试以下 ALTER TABLE 语句, 在执行成功后,使用 SHOW COLUMNS 查看表结构的变化:

    ALTER TABLE testalter_tbl DROP i;
    ALTER TABLE testalter_tbl ADD i INT FIRST;
    ALTER TABLE testalter_tbl DROP i;
    ALTER TABLE testalter_tbl ADD i INT AFTER c;
    

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


    修改字段类型及名称

    如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

    例如,把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:

    mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);
    

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

    mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
    

    <p如果你现在想把字段 j 从 BIGINT 修改为 INT,SQL语句如下:

    mysql> ALTER TABLE testalter_tbl CHANGE j j INT;
    

    ALTER TABLE 对 Null 值和默认值的影响

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

    以下实例,指定字段 j 为 NOT NULL 且默认值为100 。

    mysql> ALTER TABLE testalter_tbl 
        -> MODIFY j BIGINT NOT NULL DEFAULT 100;
    

    如果你不设置默认值,MySQL会自动设置该字段默认为 NULL。


    修改字段默认值

    你可以使用 ALTER 来修改字段的默认值,尝试以下实例:

    mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
    mysql> SHOW COLUMNS FROM testalter_tbl;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | c     | char(1) | YES  |     | NULL    |       |
    | i     | int(11) | YES  |     | 1000    |       |
    +-------+---------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    

    你也可以使用 ALTER 命令及 DROP子句来删除字段的默认值,如下实例:

    mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
    mysql> SHOW COLUMNS FROM testalter_tbl;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | c     | char(1) | YES  |     | NULL    |       |
    | i     | int(11) | YES  |     | NULL    |       |
    +-------+---------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    Changing a Table Type:
    

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

    注意:查看数据表类型可以使用 SHOW TABLE STATUS 语句。

    mysql> ALTER TABLE testalter_tbl TYPE = MYISAM;
    mysql>  SHOW TABLE STATUS LIKE 'testalter_tbl'G
    *************************** 1. row ****************
               Name: testalter_tbl
               Type: MyISAM
         Row_format: Fixed
               Rows: 0
     Avg_row_length: 0
        Data_length: 0
    Max_data_length: 25769803775
       Index_length: 1024
          Data_free: 0
     Auto_increment: NULL
        Create_time: 2007-06-03 08:04:36
        Update_time: 2007-06-03 08:04:36
         Check_time: NULL
     Create_options:
            Comment:
    1 row in set (0.00 sec)
    

    修改表名

    如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使用 RENAME 子句来实现。

    尝试以下实例将数据表 testalter_tbl 重命名为 alter_tbl:

    mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
    

    ALTER 命令还可以用来创建及删除MySQL数据表的索引,该功能我们会在接下来的章节中介绍。

     
  • 相关阅读:
    使用NSIS打包程序
    vue.config.js 的完整配置(超详细)!
    前端 Electron Nsis Web 安装包配置方法
    使用NSIS制作安装包
    Echarts X轴(xAxis)
    Windows环境下Jenkins打包、发布、部署
    一、NSIS介绍
    织梦DEDECMS首页调用单页文档内容并带过滤HTML的方法
    php调试方法
    jQuery 图片轮播滚动效果
  • 原文地址:https://www.cnblogs.com/Samboo/p/6399945.html
Copyright © 2020-2023  润新知