MySQL 教程

264 阅读7分钟

MySQL 介绍

现在业界一般采用关系型数据库管理系统(RDBMS)来存储并管理海量数据。
之所以称其为**关系型数据库,是因为所有数据都存储在不同的表中,表之间的关系是建立在主键或其他键(被称为外键)的基础之上的。**

关系型数据库管理系统(RDBMS)具有以下特点:

能够实现一种具有表、列与索引的数据库。
保证不同表的行之间的引用完整性。
能自动更新索引。
能解释 SQL 查询,组合多张表的信息。

术语

数据库(Database):数据库是带有相关数据的表的集合。
表(Table):表是带有数据的矩阵。数据库中的表就像一种简单的电子表格。
列(Column):每一列(数据元素)都包含着同种类型的数据,比如邮编。
行(Row):行(又被称为元组、项或记录)是一组相关数据,比如有关订阅量的数据。
冗余(Redundancy):存储两次数据,以便使系统更快速。
主键(Primary Key):主键是唯一的。同一张表中不允许出现同样两个键值。一个键值只对应着一行
外键(Foreign Key):用于连接两张表。
复合键(Compound Key):复合键(又称组合键)是一种由多列组成的键,因为一列并不足以确定唯一性
索引(Index):它在数据库中的作用就像书后的索引一样。
引用完整性(Referential Integrity):用来确保外键一直指向已存在的一行。

MySQL 安装

    # 数据库服务器,用于管理数据库与表,控制用户访问,以及处理 SQL 查询
    rpm -i MySQL-5.0.9-0.i386.rpm 
    # MySQL 客户端程序,实现用户与服务器的连接与交互功能。
    rpm -i MySQL-client-5.0.9-0.i386.rpm 
    # 编译使用 MySQL 的其他程序的过程中会用到的一些库及头文件 
    rpm -i MySQL-devel-5.0.9-0.i386.rpm
    # MySQL 客户端的共享库。 
    rpm -i MySQL-shared-5.0.9-0.i386.rpm 
    #  用于MySQL 服务器的基准测试与性能测试工具
    rpm -i MySQL-bench-5.0.9-0.i386.rpm 
    mysqladmin --version
    mysqladmin -u root password "new_password";
    #如果想让 MySQL 在系统启动时自动运行,则可以 /etc/rc.local 文件中加入下列项:
    /etc/init.d/mysqld start 
    #检查 MySQL 服务器是否正在运行
    ps -ef | grep mysqld
    #启动
    ./safe_mysqld &
    #关闭正在运行的 MySQL 服务器
    ./mysqladmin -u root -p shutdown

MySQL命令

USE Databasename 用于在MySQL工作区内选择具体某个数据库。
SHOW DATABASES 列出 MySQL DBMS 所能访问的数据库。
SHOW TABLES 一旦数据库被 use 命令选中,显示数据库中的表。
SHOW COLUMNS FROM tablename 显示表的属性、属性类型、键信息、是否允许 NULL 值,默认值,以及其他一些信息。
SHOW INDEX FROM tablename 显示表中所有索引的细节信息,包括PRIMARY KEY。
SHOW TABLE STATUS LIKE tablename\G 报告MySQL DBMS的性能及统计的细节信息。

创建 MySQL 数据库

    #创建一个名叫 TUTORIALS 的数据库
    mysqladmin -u root -p create TUTORIALS
    #删除一个名叫 TUTORIALS 的数据库
    mysqladmin -u root -p drop TUTORIALS

MySQL 选择数据库

    use Databasename

MySQL 数据类型

字段(或者说列)的类型也被称为数据类型。

数字类型

INT 
TINYINT 
SMALLINT 
MEDIUMINT 
BIGINT 
FLOAT(M,D) 
DOUBLE(M,D) 
DECIMAL(M,D)

日期与时间类型

DATE    YYYY-MM-DD 
DATETIME    YYYY-MM-DD HH:MM:SS
TIMESTAMP   YYYYMMDDHHMMSS
TIME    HH:MM:SS
YEAR(M) 

字符串类型

CHAR(M) 
VARCHAR(M) 
BLOB or TEXT
TINYBLOB or TINYTEXT
MEDIUMBLOB or MEDIUMTEXT 
LONGBLOB or LONGTEXT
ENUM

创建 MySQL 表

创建表的命令需要:
                    表名
                    字段名
                    每一字段的定义
   
创建 MySQL 表的 SQL 语法:
                        CREATE TABLE table_name (column_name column_type);

MySQL 删除表

删除 MySQL 表的常用 SQL 命令为:
                                DROP TABLE table_name ; 

MySQL 插入数据

INSERT INTO 命令为表插入数据的一般语法如下所示:
        INSERT INTO table_name ( field1, field2,...fieldN )
                               VALUES
                               ( value1, value2,...valueN )

MySQL 选择查询

SELECT 命令从 MySQL 表中获取数据的一般语法格式如下:
    SELECT field1, field2,...fieldN 
    FROM table_name1, table_name2...  
    [WHERE Clause]  
    [OFFSET M ][LIMIT N]
    SELECT field1, field2,...fieldN 
    FROM table_name1, table_name2...
    [WHERE condition1 [AND [OR]] condition2.....
为了加快搜索,往往使用主键搜索记录
clause 
n. 	从句; 分句; 子句; (法律文件等的) 条款

MySQL 更新

MySQL 表中的已有数据可能需要修改,可以使用 SQL 的 UPDATE 命令来处理。它会修改MySQL表中任何字段的值    
   UPDATE table_name 
   SET field1=new-value1, field2=new-value2
   [WHERE Clause]

MySQL 删除

    DELETE FROM table_name 
    [WHERE Clause]

MySQL 排序

    SELECT field1, field2,...fieldN 
    FROM table_name1, table_name2...
    ORDER BY field1, [field2...] [ASC [DESC]]
descending order  递减次序,降序排列
ascending order  升幂,递升次序,递升序

MySQL Using Join

在一个 SQL 查询中使用多张表,联结(join)行为在 MySQL 数据库中指的就是将2张或更多的表合为一张表。
MySQL的左联结(LEFT JOIN):左联结侧重考虑左侧的表。

MySQL NULL Values

MySQL 提供了三种运算符:
IS NULL:如果列值为 NULL,则该运算符返回 true。
IS NOT NULL:如果列值不为NULL,则该运算符返回 true。
<=>:该运算符用于两个值的对比,当两个值相等时(即使这两个值都为 NULL 时,这一点与 = 运算符不同)返回 true。

MySQL 正则表达式

运算符是 REGEXP

示例:
寻找以 'st' 开头的名称,查询如下:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
寻找以 'ok' 结尾的名称,查询如下:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
寻找包含 'mar' 的名称,查询如下:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
寻找以元音字母开始并以 'ok' 结尾的名称,查询如下:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

MySQL 事务

事务就是一组连续的数据库操作,执行起来仿佛像是单一的工作单元。换句话说,除非该组内所有操作都成功完成,否则事务永远不会结束。如果事务中的某一个操作失败,则整个事务也将失败。

事务的特点:
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)

在 MySQL 中,事务通常以 BEGIN WORK 语句开始,以 COMMIT 或 ROLLBACK(只取其一) 语句结束。在开始与结束声明之间的 SQL 命令就构成了事务的主体。

MySQL ALTER 命令

利用 MySQL 的 ALTER 命令可以很方便地修改表名与表字段名,以及添加或删除表中已有的列。 
示例:
删列:ALTER TABLE testalter_tbl DROP i;
增列:ALTER TABLE testalter_tbl ADD i INT;
      ALTER TABLE testalter_tbl ADD i INT FIRST;
      ALTER TABLE testalter_tbl ADD i INT AFTER c;
要想改变列的定义,需要使用 MODIFY 或 CHANGE 子句,并配合使用 ALTER 命令
改列:ALTER TABLE testalter_tbl MODIFY c CHAR(10);
      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;
      ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
      ALTER TABLE testalter_tbl TYPE = MYISAM;
      ALTER TABLE testalter_tbl RENAME TO alter_tbl;

MySQL 索引

数据库索引是一种能够改善表操作速度的数据结构。
在创建索引时,需要考虑哪些列会用于 SQL 查询,然后为这些列创建一个或多个索引。
事实上,索引也是一种表,保存着主键或索引字段,以及一个能将每个记录指向实际表的指针。
数据库用户是看不到索引的,它们只是用来加速查询的。数据库搜索引擎使用索引来快速定位记录。
INSERT 与 UPDATE 语句在拥有索引的表中执行会花费更多的时间,而 SELECT 语句却会执行得更快。这是因为,在进行插入或更新时,数据库也需要插入或更新索引值。 
示例:
为表创建唯一索引
    CREATE UNIQUE INDEX index_name
    ON table_name ( column1, column2,...);
    
    CREATE UNIQUE INDEX AUTHOR_INDEX
    ON tutorials_tbl (tutorial_author DESC)
    
    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 命令来添加与删除主键
    ALTER TABLE testalter_tbl 
    MODIFY i INT NOT NULL;
    
    ALTER TABLE testalter_tbl 
    ADD PRIMARY KEY (i);
    
    ALTER TABLE testalter_tbl 
    DROP PRIMARY KEY;
显示索引信息
    SHOW INDEX FROM table_name\G