返回
软件
分类

显示记录,MySQL是一个关系型数据库管理系统

日期: 2020-01-02 08:00 浏览次数 : 109

以下的文章主要向大家描述的是用c语言正确读取MySQL数据库的实际操作流程,如果你对用c语言正确读取MySQL数据库的正确操作流程感兴趣的话,那么以下的文章就会满足你的好奇之心了。

简述

之前一直使用的django的orm模型,最近想学习下原生sql语句的编写。以后工作中可能不使用django,为了更好的工作和提高自己的知识全面点,记录下常用的sql语句编写。

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

最近一段时间我们学习了linux操作系统下的C开发,呵呵,写了一个测试程序,作用是读取MySQL的数据,然后显示出来。经测试成功…

一、创建、删除、选择数据库

1. 如果数据库不存在就创建

CREATE DATABASE IF NOT EXISTS blog CHARACTER SET utf8 COLLATE utf8_general_ci;

2. 如果数据库存在就删除

DROP DATABASE IF EXISTS blog;

3. 切换到我们选择的数据库,并查看库中所有表

USE blog;
SHOW TABLES;

4. 数据库授权用户创建

grant all on blog.* to blog@'%' identified by '123456';

5. 查看数据库结构

SHOW DATABASES LIKE 'blog%';

6. 查询授权用户

SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;

7. 修改数据库用户密码

USE mysql;
UPDATE USER SET PASSWORD = PASSWORD ("new-password") WHERE USER = "root";
FLUSH PRIVILEGES;

 

#include <stdio.h> #include <stdlib.h> #include <MySQL.h> #define DB_SERVER ""  #define DB_NAME "test"  #define DB_USER "root"  #define DB_PWD ""  static MySQL *db_handel,MySQL;  static MySQL_ROW row;  static int query_error;  MySQL_RES *query_test(char *sql);  int query_show(MySQL_RES *result);  int main(int argc,char *argv[])  {  MySQL_RES * results;  results=query_test("select * from test");  

二、MySQL数据类型介绍

MySQL 数据类型

MySQL中定义数据字段的类型对你数据库的优化是非常重要的。
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。


数值类型

MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 字节 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度
浮点数值
DOUBLE 8 字节 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度
浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

类型 大小(字节) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535 字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据

CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。
有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。

 

获取记录

三、MySQL数据的各种骚操作

1. 创建数据表

创建MySQL数据表需要以下信息:
表名
表字段名
定义每个表字段

语法
以下为创建MySQL数据表的SQL通用语法:

CREATE TABLE table_name (column_name column_type);

以下例子中我们将在blog数据库中创建数据表author、article、tag以及article和tag的关联表article_tag
创建author表:

CREATE TABLE IF NOT EXISTS `author`(
   `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '作者ID',
   `name` VARCHAR(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '作者名字',
   `qq` BIGINT(20) NULL DEFAULT NULL COMMENT '作者QQ',
   `phone` BIGINT(20) NULL DEFAULT NULL COMMENT '作者电话',
   PRIMARY KEY ( `id` ),
   INDEX `name` (`name`) USING BTREE,
   UNIQUE INDEX `phone` (`phone`) USING BTREE
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
ROW_FORMAT=DYNAMIC
;

查看author表结构:

mysql> desc author;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(40) | YES  | MUL | NULL    |                |
| qq    | bigint(20)  | YES  |     | NULL    |                |
| phone | bigint(20)  | YES  | UNI | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

创建article表:

CREATE TABLE IF NOT EXISTS `article`(
   `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '文章ID',
   `title` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文章标题',
   `content` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文章内容',
   `author_id` INT(11) NOT NULL COMMENT '作者ID',
   `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '发布时间',
   PRIMARY KEY ( `id` ),
   FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   UNIQUE INDEX `author_id` (`author_id`) USING BTREE
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
ROW_FORMAT=DYNAMIC
;

查看article表结构:

mysql> desc article;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| title       | varchar(100) | YES  |     | NULL    |                |
| content     | text         | YES  |     | NULL    |                |
| author_id   | int(11)      | NO   | MUL | NULL    |                |
| create_time | date         | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

创建tag表:

CREATE TABLE IF NOT EXISTS `tag`(
   `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '标签ID',
   `name` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标签名称',
   PRIMARY KEY ( `id` )
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
ROW_FORMAT=DYNAMIC
;

查看tag表结构:

mysql> desc tag;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(100) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

创建article_tag表:

CREATE TABLE IF NOT EXISTS `article_tag`(
   `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '文章标签关联表ID',
   `article_id` INT(11) NOT NULL COMMENT '文章ID',
   `tag_id` INT(11) NOT NULL COMMENT '标签ID',
   PRIMARY KEY ( `id` ),
   FOREIGN KEY (`article_id`) REFERENCES `article` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   FOREIGN KEY (`tag_id`) REFERENCES `tag` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   UNIQUE INDEX `article_tag_unique` (`article_id`, `tag_id`) USING BTREE ,
   INDEX `article_id` (`article_id`) USING BTREE 
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
ROW_FORMAT=DYNAMIC
;

查看article_tag表结构:

mysql> desc article_tag;
+------------+---------+------+-----+---------+----------------+
| Field      | Type    | Null | Key | Default | Extra          |
+------------+---------+------+-----+---------+----------------+
| id         | int(11) | NO   | PRI | NULL    | auto_increment |
| article_id | int(11) | NO   | MUL | NULL    |                |
| tag_id     | int(11) | NO   | MUL | NULL    |                |
+------------+---------+------+-----+---------+----------------+

语句解析:
如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
ENGINE 设置存储引擎, CHARACTER SET设置编码。
INDEX设置该字段为索引,UNIQUE INDEX设置字段值唯一,并且设置该字段为索引。
COMMENT给该字段添加注释。

ROW_FORMAT=DYNAMIC,设置表为动态表(在mysql中, 若一张表里面不存在varchar、text以及其变形、blob以及其变形的字段的话,那么张这个表其实也叫静态表,即该表的row_必赢备用网址 ,format是fixed,就是说每条记录所占用的字节一样。其优点读取快,缺点浪费额外一部分空间。 若一张表里面存在varchar、text以及其变形、blob以及其变形的字段的话,那么张这个表其实也叫动态表,即该表的row_format是dynamic,就是说每条记录所占用的字节是动态的。其优点节省空间,缺点增加读取的时间开销。所以,做搜索查询量大的表一般都以空间来换取时间,设计成静态表)。

数据表解析:
author是作者表,有4个字段:id, name, qq, phone
article是文章表,文章和作者是多对一的关系,这里使用外键方式关联。字段author_id关联的是author的id字段。
tag是标签表,有2个字段:id, name
文章和标签是多对多的关系(ManyToMany),这里使用第三张表article_tag把它们关联起来。字段article_id外键关联的是article的id字段,字段tag_id外键关联的是tag的id字段。

2. 删除数据表

DROP TABLE IF EXISTS article_tag;

3. 插入数据
MySQL 表中使用 INSERT INTO SQL语句来插入数据。
你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据。

语法
以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法:

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

如果数据是字符型,必须使用单引号或者双引号,如:"value"。

author表插入几条数据:

INSERT INTO author(name, qq, phone) VALUES('君惜', 123456, 18500178899), ('糖糖', 234567, 13256987582), ('琳琳', 345678, 15636589521);

查看author表:

mysql> SELECT * FROM author;
+----+------+--------+-------------+
| id | name | qq     | phone       |
+----+------+--------+-------------+
|  1 | 君惜 | 123456 | 18500178899 |
|  2 | 糖糖 | 234567 | 13256987582 |
|  3 | 琳琳 | 345678 | 15636589521 |
+----+------+--------+-------------+

article表插入几条数据:

INSERT INTO article(title, content, author_id) VALUES('流畅的python', 'Python各种拽', 1), ('嘻哈', '中国有嘻哈', 2), ('严肃', '你这辈子就是吃了太严肃的亏', 3);

查看article表:

mysql> select * from article;
+----+--------------+----------------------------+-----------+---------------------+
| id | title        | content                    | author_id | create_time         |
+----+--------------+----------------------------+-----------+---------------------+
|  1 | 流畅的python | Python各种拽               |         1 | 2017-09-12 16:36:43 |
|  2 | 嘻哈         | 中国有嘻哈                 |         2 | 2017-09-12 16:36:43 |
|  3 | 严肃         | 你这辈子就是吃了太严肃的亏 |         3 | 2017-09-12 16:36:43 |
+----+--------------+----------------------------+-----------+---------------------+

tag表插入数据:

INSERT INTO tag(name) VALUES('技术'), ('娱乐'), ('文学');

查看tag表:

mysql> select * from tag;
+----+------+
| id | name |
+----+------+
|  1 | 技术 |
|  2 | 娱乐 |
|  3 | 文学 |
+----+------+

article_tag表插入数据:

INSERT INTO article_tag(article_id, tag_id) VALUES(1, 1), (2, 2), (3, 3);

查看article_tag表:

mysql> select * from article_tag;
+----+------------+--------+
| id | article_id | tag_id |
+----+------------+--------+
|  1 |          1 |      1 |
|  2 |          2 |      2 |
|  3 |          3 |      3 |
+----+------------+--------+

4. 查询数据
MySQL 数据库使用SQL SELECT语句来查询数据。
你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据。

语法
以下为在MySQL数据库中查询数据通用的 SELECT 语法:

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[OFFSET M ][LIMIT N]
  • 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
  • SELECT 命令可以读取一条或者多条记录。
  • 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
  • 你可以使用 WHERE 语句来包含任何条件。
  • 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
  • 你可以使用 LIMIT 属性来设定返回的记录数。

实例
以下实例将返回数据表article的所有记录

mysql> select * from article;
+----+--------------+----------------------------+-----------+---------------------+
| id | title        | content                    | author_id | create_time         |
+----+--------------+----------------------------+-----------+---------------------+
|  1 | 流畅的python | Python各种拽               |         1 | 2017-09-12 16:36:43 |
|  2 | 嘻哈         | 中国有嘻哈                 |         2 | 2017-09-12 16:36:43 |
|  3 | 严肃         | 你这辈子就是吃了太严肃的亏 |         3 | 2017-09-12 16:36:43 |
+----+--------------+----------------------------+-----------+---------------------+

查询指定字段数据

mysql> select title, content from article;
+--------------+----------------------------+
| title        | content                    |
+--------------+----------------------------+
| 流畅的python | Python各种拽               |
| 嘻哈         | 中国有嘻哈                 |
| 严肃         | 你这辈子就是吃了太严肃的亏 |
+--------------+----------------------------+

5. WHERE 子句
我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。

语法
以下是 SQL SELECT 语句使用 WHERE 子句从数据表中读取数据的通用语法:

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
  • 查询语句中你可以使用一个或者多个表,表之间使用逗号, 分割,并使用WHERE语句来设定查询条件。
  • 你可以在 WHERE 子句中指定任何条件。
  • 你可以使用 AND 或者 OR 指定一个或多个条件。
  • WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
  • WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。

以下为操作符列表,可用于 WHERE 子句中。
下表中实例假定 A 为 10, B 为 20

操作符 描述 实例
= 等号,检测两个值是否相等,如果相等返回true (A = B) 返回false。
<>, != 不等于,检测两个值是否相等,如果不相等返回true (A != B) 返回 true。
> 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true (A > B) 返回false。
< 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true (A < B) 返回 true。
>= 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true (A >= B) 返回false。
<= 小于等于号,检测左边的值是否小于于或等于右边的值, 如果左边的值小于或等于右边的值返回true (A <= B) 返回 true。

如果我们想再 MySQL 数据表中读取指定的数据,WHERE 子句是非常有用的。
使用主键来作为 WHERE 子句的条件查询是非常快速的。
如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据。

实例
以下实例将读取article表中title字段值为 嘻哈 的所有记录:

mysql> select * from article where title="嘻哈";
+----+-------+------------+-----------+---------------------+
| id | title | content    | author_id | create_time         |
+----+-------+------------+-----------+---------------------+
|  2 | 嘻哈  | 中国有嘻哈 |         2 | 2017-09-12 16:36:43 |
+----+-------+------------+-----------+---------------------+

6. UPDATE 语句
如果我们需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作。

语法
以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法:

UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
  • 你可以同时更新一个或多个字段。
  • 你可以在 WHERE 子句中指定任何条件。
  • 你可以在一个单独表中同时更新数据。

当你需要更新数据表中指定行的数据时 WHERE 子句是非常有用的。

通过命令提示符更新数据
以下我们将在 SQL UPDATE 命令使用 WHERE 子句来更新 author 表中指定的数据:
实例
以下实例将更新数据表中 id 为 1 的 qq 字段值:

mysql> update author set qq='2298630081' where id=1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from author where id=1;
+----+------+------------+-------------+
| id | name | qq         | phone       |
+----+------+------------+-------------+
|  1 | 君惜 | 2298630081 | 18500178899 |
+----+------+------------+-------------+
1 row in set (0.00 sec)

7. DELETE 语句
你可以使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录。
你可以在 mysql> 命令提示符或 PHP 脚本中执行该命令。

语法
以下是 SQL DELETE 语句从 MySQL 数据表中删除数据的通用语法:

DELETE FROM table_name [WHERE Clause]
  • 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
  • 你可以在 WHERE 子句中指定任何条件
  • 您可以在单个表中一次性删除记录。

当你想删除数据表中指定的记录时 WHERE 子句是非常有用的。

实例
插入一条数据:

INSERT INTO author(name, qq, phone) VALUES('悦悦','456789','13343809438');

删除 author 表中 name 为 悦悦 的记录:

mysql> delete from author where name="悦悦";
Query OK, 1 row affected (0.01 sec)

mysql> select * from author;
+----+------+------------+-------------+
| id | name | qq         | phone       |
+----+------+------------+-------------+
|  1 | 君惜 | 2298630081 | 18500178899 |
|  2 | 糖糖 |     234567 | 13256987582 |
|  3 | 琳琳 |     345678 | 15636589521 |
+----+------+------------+-------------+
3 rows in set (0.00 sec)

8. LIKE 子句

我们知道在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。
WHERE 子句中可以使用等号 = 来设定获取数据的条件,如 "runoob_author = 'RUNOOB.COM'"。
但是有时候我们需要获取 runoob_author 字段含有 "COM" 字符的所有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。
SQL LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。
如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。

语法
以下是 SQL SELECT 语句使用 LIKE 子句从数据表中读取数据的通用语法:

SELECT field1, field2,...fieldN 
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
  • 你可以在 WHERE 子句中指定任何条件。
  • 你可以在 WHERE 子句中使用LIKE子句。
  • 你可以使用LIKE子句代替等号 =。
  • LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
  • 你可以使用 AND 或者 OR 指定一个或多个条件。
  • 你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句来指定条件。

实例
插入几条数据:

insert into author(name, qq, phone) values('李天星', '5678911', '13345607861'), ('王星', '5678912', '13345607862'), ('张星星', '5678913', '13345607863');

查询 author 表 name 字段中以星为结尾的的所有记录:

mysql> select * from author where name like '%星';
+----+--------+---------+-------------+
| id | name   | qq      | phone       |
+----+--------+---------+-------------+
|  5 | 李天星 | 5678911 | 13345607861 |
|  6 | 王星   | 5678912 | 13345607862 |
|  7 | 张星星 | 5678913 | 13345607863 |
+----+--------+---------+-------------+
3 rows in set (0.01 sec)

9. UNION 操作符
MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。

语法
MySQL UNION 操作符语法格式:

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

参数

  • expression1, expression2, ... expression_n: 要检索的列。
  • tables: 要检索的数据表。
  • WHERE conditions: 可选, 检索条件。
  • DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
  • ALL: 可选,返回所有结果集,包含重复数据。

articles表

mysql> select * from articles;
+----+--------------+----------------------------+---------+
| id | title        | content                    | user_id |
+----+--------------+----------------------------+---------+
|  1 | 中国有嘻哈   | 哈哈哈                     |       1 |
|  2 | 星光大道     | 成名之路                   |       2 |
|  3 | 平凡的真谛   | 开心即完美                 |       3 |
|  4 | python进阶   | Python高级用法             |       1 |
|  5 | 流畅的python | 就问你流畅不流畅            |       1 |
|  6 | 严肃         | 你这辈子就是吃了太严肃的亏 |       3 |
+----+--------------+----------------------------+---------+
6 rows in set (0.00 sec)

article表

mysql> select * from article;
+----+--------------+----------------------------+-----------+---------------------+
| id | title        | content                    | author_id | create_time         |
+----+--------------+----------------------------+-----------+---------------------+
|  1 | 流畅的python | Python各种拽               |         1 | 2017-09-12 16:36:43 |
|  2 | 嘻哈         | 中国有嘻哈                 |         2 | 2017-09-12 16:36:43 |
|  3 | 严肃         | 你这辈子就是吃了太严肃的亏 |         3 | 2017-09-12 16:36:43 |
+----+--------------+----------------------------+-----------+---------------------+
3 rows in set (0.00 sec)

SQL UNION 实例
下面的 SQL 语句从 article 和 articles 表中选取所有不同的title(只有不同的值):

mysql> select title from article union select title from articles order by title;
+--------------+
| title        |
+--------------+
| python进阶   |
| 严肃         |
| 中国有嘻哈   |
| 嘻哈         |
| 平凡的真谛   |
| 星光大道     |
| 流畅的python |
+--------------+
7 rows in set (0.00 sec)

注释:UNION 不能用于列出两个表中所有的title。如果出现重复的数据,只会列出一次。UNION 只会选取不同的值。请使用 UNION ALL 来选取重复的值!

SQL UNION ALL 实例
下面的 SQL 语句使用 UNION ALL 从 "article" 和 "articles" 表中选取所有的title(也有重复的值):

mysql> select title from article union all select title from articles order by title;
+--------------+
| title        |
+--------------+
| python进阶   |
| 严肃         |
| 严肃         |
| 中国有嘻哈   |
| 嘻哈         |
| 平凡的真谛   |
| 星光大道     |
| 流畅的python |
| 流畅的python |
+--------------+
9 rows in set (0.00 sec)

带有 WHERE 的 SQL UNION ALL
下面的 SQL 语句使用 UNION ALL 从 "article" 和 "articles" 表中选取所标题(title)为流畅的python的书籍(也有重复的值):

mysql> select title, content from article where title='流畅的python' union all select title, content from articles  where title='流畅的python' order by title;
+--------------+------------------+
| title        | content          |
+--------------+------------------+
| 流畅的python | Python各种拽     |
| 流畅的python | 就问你流畅不流畅 |
+--------------+------------------+
2 rows in set (0.00 sec)

10. 排序
我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。
如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。

语法
以下是 SQL SELECT 语句使用 ORDER BY 子句将查询数据排序后再返回数据:

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

实例
尝试以下实例,结果将按升序及降序排列。

mysql> select * from article order by create_time asc;
+----+--------------+----------------------------+-----------+---------------------+
| id | title        | content                    | author_id | create_time         |
+----+--------------+----------------------------+-----------+---------------------+
|  1 | 流畅的python | Python各种拽               |         1 | 2017-09-12 16:36:41 |
|  2 | 嘻哈         | 中国有嘻哈                 |         2 | 2017-09-12 16:36:42 |
|  3 | 严肃         | 你这辈子就是吃了太严肃的亏 |         3 | 2017-09-12 16:36:43 |
+----+--------------+----------------------------+-----------+---------------------+
3 rows in set (0.00 sec)

mysql> select * from article order by create_time desc;
+----+--------------+----------------------------+-----------+---------------------+
| id | title        | content                    | author_id | create_time         |
+----+--------------+----------------------------+-----------+---------------------+
|  3 | 严肃         | 你这辈子就是吃了太严肃的亏 |         3 | 2017-09-12 16:36:43 |
|  2 | 嘻哈         | 中国有嘻哈                 |         2 | 2017-09-12 16:36:42 |
|  1 | 流畅的python | Python各种拽               |         1 | 2017-09-12 16:36:41 |
+----+--------------+----------------------------+-----------+---------------------+
3 rows in set (0.00 sec)

11. GROUP BY 语句
GROUP BY 语句根据一个或多个列对结果集进行分组。
在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

GROUP BY 语法

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

实例演示
实例使用到了以下表结构及数据,使用前我们可以先将以下数据导入数据库中。

SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
--  Table structure for `user_login`
-- ----------------------------
DROP TABLE IF EXISTS `user_login`;
CREATE TABLE `user_login` (
  `id` int(11) NOT NULL,
  `name` char(10) NOT NULL DEFAULT '',
  `date` datetime NOT NULL,
  `singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `user_login`
-- ----------------------------
BEGIN;
INSERT INTO `user_login` VALUES ('1', '小明', '2016-04-22 15:25:33', '1'), ('2', '小王', '2016-04-20 15:25:47', '3'), ('3', '小丽', '2016-04-19 15:26:02', '2'), ('4', '小王', '2016-04-07 15:26:14', '4'), ('5', '小明', '2016-04-11 15:26:40', '4'), ('6', '小明', '2016-04-04 15:26:54', '2');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

导入成功后,执行以下 SQL 语句:

mysql> select * from user_login;
+----+------+---------------------+--------+
| id | name | date                | singin |
+----+------+---------------------+--------+
|  1 | 小明 | 2016-04-22 15:25:33 |      1 |
|  2 | 小王 | 2016-04-20 15:25:47 |      3 |
|  3 | 小丽 | 2016-04-19 15:26:02 |      2 |
|  4 | 小王 | 2016-04-07 15:26:14 |      4 |
|  5 | 小明 | 2016-04-11 15:26:40 |      4 |
|  6 | 小明 | 2016-04-04 15:26:54 |      2 |
+----+------+---------------------+--------+
6 rows in set (0.00 sec)

接下来我们使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:

mysql> select name, count(*) from user_login group by name;
+------+----------+
| name | count(*) |
+------+----------+
| 小丽 |        1 |
| 小明 |        3 |
| 小王 |        2 |
+------+----------+
3 rows in set (0.00 sec)

使用 WITH ROLLUP
WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:

mysql> select name, sum(singin) as singin_count from user_login group by name with rollup;
+------+--------------+
| name | singin_count |
+------+--------------+
| 小丽 |            2 |
| 小明 |            7 |
| 小王 |            7 |
| NULL |           16 |
+------+--------------+
4 rows in set (0.00 sec)

其中记录 NULL 表示所有人的登录次数。
我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:

select coalesce(a,b,c);

参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。

以下实例中如果名字为空我们使用总数代替:

mysql> select coalesce(name, '总数'), sum(singin) as singin_count from user_login group by name with rollup;
+------------------------+--------------+
| coalesce(name, '总数') | singin_count |
+------------------------+--------------+
| 小丽                   |            2 |
| 小明                   |            7 |
| 小王                   |            7 |
| 总数                   |           16 |
+------------------------+--------------+
4 rows in set (0.00 sec)

12. 多表连查
在真正的应用中经常需要从多个数据表中读取数据。下面将向大家介绍如何使用 MySQL 的 JOIN 在两个或多个表中查询数据。
你可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。
JOIN 按照功能大致分为如下三类:

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

我们在blog数据库中有四张表 author、article、tag、article_tag。数据表数据如下:

mysql> select * from author;
+----+--------+------------+-------------+
| id | name   | qq         | phone       |
+----+--------+------------+-------------+
|  1 | 君惜   | 2298630081 | 18500178899 |
|  2 | 糖糖   |     234567 | 13256987582 |
|  3 | 琳琳   |     345678 | 15636589521 |
|  5 | 李天星 |    5678911 | 13345607861 |
|  6 | 王星   |    5678912 | 13345607862 |
|  7 | 张星星 |    5678913 | 13345607863 |
+----+--------+------------+-------------+
6 rows in set (0.00 sec)

mysql> select * from article;
+----+--------------+----------------------------+-----------+---------------------+
| id | title        | content                    | author_id | create_time         |
+----+--------------+----------------------------+-----------+---------------------+
|  1 | 流畅的python | Python各种拽               |         1 | 2017-09-12 16:36:41 |
|  2 | 嘻哈         | 中国有嘻哈                 |         2 | 2017-09-12 16:36:42 |
|  3 | 严肃         | 你这辈子就是吃了太严肃的亏 |         3 | 2017-09-12 16:36:43 |
+----+--------------+----------------------------+-----------+---------------------+
3 rows in set (0.00 sec)

mysql> select * from tag;
+----+------+
| id | name |
+----+------+
|  1 | 技术 |
|  2 | 娱乐 |
|  3 | 文学 |
+----+------+
3 rows in set (0.00 sec)

mysql> select * from article_tag;
+----+------------+--------+
| id | article_id | tag_id |
+----+------------+--------+
|  1 |          1 |      1 |
|  2 |          2 |      2 |
|  3 |          3 |      3 |
+----+------------+--------+
3 rows in set (0.01 sec)

INNER JOIN 实例
使用 INNER JOIN查询article中author_id等于author的id的数据(这里SQL语句中INNER可以省略):

mysql> select name, qq, phone, title, content, create_time from author as u join article as a on u.id=a.author_id;
+------+------------+-------------+--------------+----------------------------+---------------------+
| name | qq         | phone       | title        | content                    | create_time         |
+------+------------+-------------+--------------+----------------------------+---------------------+
| 君惜 | 2298630081 | 18500178899 | 流畅的python | Python各种拽               | 2017-09-12 16:36:41 |
| 糖糖 |     234567 | 13256987582 | 嘻哈         | 中国有嘻哈                 | 2017-09-12 16:36:42 |
| 琳琳 |     345678 | 15636589521 | 严肃         | 你这辈子就是吃了太严肃的亏 | 2017-09-12 16:36:43 |
+------+------------+-------------+--------------+----------------------------+---------------------+
3 rows in set (0.00 sec)

以上SQL语句等价于:
where 子句

mysql> select name, qq, phone, title, content, create_time from author as u join article as a where u.id=a.author_id;
+------+------------+-------------+--------------+----------------------------+---------------------+
| name | qq         | phone       | title        | content                    | create_time         |
+------+------------+-------------+--------------+----------------------------+---------------------+
| 君惜 | 2298630081 | 18500178899 | 流畅的python | Python各种拽               | 2017-09-12 16:36:41 |
| 糖糖 |     234567 | 13256987582 | 嘻哈         | 中国有嘻哈                 | 2017-09-12 16:36:42 |
| 琳琳 |     345678 | 15636589521 | 严肃         | 你这辈子就是吃了太严肃的亏 | 2017-09-12 16:36:43 |
+------+------------+-------------+--------------+----------------------------+---------------------+
3 rows in set (0.00 sec)

利用第三张表连接查询

mysql> select title as '书名', content as '内容', name as '标签', create_time as "创建时间" from article, tag inner join article_tag as at where at.article_id=article.id and at.tag_id=tag.id;
+--------------+----------------------------+------+---------------------+
| 书名         | 内容                       | 标签 | 创建时间            |
+--------------+----------------------------+------+---------------------+
| 流畅的python | Python各种拽               | 技术 | 2017-09-12 16:36:41 |
| 嘻哈         | 中国有嘻哈                 | 娱乐 | 2017-09-12 16:36:42 |
| 严肃         | 你这辈子就是吃了太严肃的亏 | 文学 | 2017-09-12 16:36:43 |
+--------------+----------------------------+------+---------------------+
3 rows in set (0.00 sec)

mysql> select au.name as '作者', ar.title as '书名', ar.content as '内容', t.name as '标签', ar.create_time as '创建时间' from author as au, article as ar, tag as t inner join article_tag as at where au.id=ar.author_id and at.art
icle_id=ar.id and at.tag_id=t.id;
+------+--------------+----------------------------+------+---------------------+
| 作者 | 书名         | 内容                       | 标签 | 创建时间            |
+------+--------------+----------------------------+------+---------------------+
| 君惜 | 流畅的python | Python各种拽               | 技术 | 2017-09-12 16:36:41 |
| 糖糖 | 嘻哈         | 中国有嘻哈                 | 娱乐 | 2017-09-12 16:36:42 |
| 琳琳 | 严肃         | 你这辈子就是吃了太严肃的亏 | 文学 | 2017-09-12 16:36:43 |
+------+--------------+----------------------------+------+---------------------+
3 rows in set (0.00 sec)

LEFT JOIN 实例
MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
以 author 为左表,article为右表。右表无对应数据自动填充为NULL:

mysql> select name, qq, phone, title, content, create_time from author as u left join article as a on u.id=a.author_id;
+--------+------------+-------------+--------------+----------------------------+---------------------+
| name   | qq         | phone       | title        | content                    | create_time         |
+--------+------------+-------------+--------------+----------------------------+---------------------+
| 君惜   | 2298630081 | 18500178899 | 流畅的python | Python各种拽               | 2017-09-12 16:36:41 |
| 糖糖   |     234567 | 13256987582 | 嘻哈         | 中国有嘻哈                 | 2017-09-12 16:36:42 |
| 琳琳   |     345678 | 15636589521 | 严肃         | 你这辈子就是吃了太严肃的亏 | 2017-09-12 16:36:43 |
| 李天星 |    5678911 | 13345607861 | NULL         | NULL                       | NULL                |
| 王星   |    5678912 | 13345607862 | NULL         | NULL                       | NULL                |
| 张星星 |    5678913 | 13345607863 | NULL         | NULL                       | NULL                |
+--------+------------+-------------+--------------+----------------------------+---------------------+
6 rows in set (0.00 sec)

RIGHT JOIN 实例
MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。
以 article 为左表,author为右表,左表无对应数据自动填充为NULL。:

mysql> select title, content, create_time, name, qq, phone from article as a right join author as u on u.id=a.author_id;
+--------------+----------------------------+---------------------+--------+------------+-------------+
| title        | content                    | create_time         | name   | qq         | phone       |
+--------------+----------------------------+---------------------+--------+------------+-------------+
| 流畅的python | Python各种拽               | 2017-09-12 16:36:41 | 君惜   | 2298630081 | 18500178899 |
| 嘻哈         | 中国有嘻哈                 | 2017-09-12 16:36:42 | 糖糖   |     234567 | 13256987582 |
| 严肃         | 你这辈子就是吃了太严肃的亏 | 2017-09-12 16:36:43 | 琳琳   |     345678 | 15636589521 |
| NULL         | NULL                       | NULL                | 李天星 |    5678911 | 13345607861 |
| NULL         | NULL                       | NULL                | 王星   |    5678912 | 13345607862 |
| NULL         | NULL                       | NULL                | 张星星 |    5678913 | 13345607863 |
+--------------+----------------------------+---------------------+--------+------------+-------------+
6 rows in set (0.00 sec)

mysql> select title, content, create_time, name, qq, phone from article as a right join author as u on u.id=a.author_id where title is not null;
+--------------+----------------------------+---------------------+------+------------+-------------+
| title        | content                    | create_time         | name | qq         | phone       |
+--------------+----------------------------+---------------------+------+------------+-------------+
| 流畅的python | Python各种拽               | 2017-09-12 16:36:41 | 君惜 | 2298630081 | 18500178899 |
| 嘻哈         | 中国有嘻哈                 | 2017-09-12 16:36:42 | 糖糖 |     234567 | 13256987582 |
| 严肃         | 你这辈子就是吃了太严肃的亏 | 2017-09-12 16:36:43 | 琳琳 |     345678 | 15636589521 |
+--------------+----------------------------+---------------------+------+------------+-------------+
3 rows in set (0.00 sec)

先记录到这了。

Mysql是什么?

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

必赢备用网址 1

query_show(results); 

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 的存储引擎接口定义良好。有兴趣的开发者可以通过阅读文档编写自己的存储引擎。

return 0;  } 

Mysql管理工具

MyDB Studio 下载:

DBTools Manager 下载:

dbForge Studio 下载:

SQLWave 下载:

phpMyAdmin 下载:

Sequel Pro 下载:

HeidiSQL 下载:

Navicat 下载:

查询记录

Mysql附加资料

MySQL官网:

MySQL文档:

MySQL下载:

MySQL教程:

MySQL_RES *query_test(char *sql)  {  static MySQL_RES *query_result;  printf("%sn",sql);  MySQL_init(&MySQL);  db_handel=MySQL_real_connect(&MySQL,DB_SERVER,DB_USER,DB_PWD,DB_NAME,0,0,0); 

更新记录:

  • MySQL IN 操作符 12-08 22:14

  • MySQL 入门教程 12-02 10:35

  • MySQL 事务 11-10 17:32

  • MySQL 字符串连接CONCAT()函数 11-10 17:31

  • MySQL 导入数据 11-10 17:22

  • MySQL 导出数据 11-10 17:20

  • MySQL 元数据 11-10 17:08

  • MySQL 复制表 11-10 17:04

  • MySQL 临时表 11-10 16:59

  • MySQL ALTER命令 11-10 16:55

 

打开读取MySQL数据库连接

MySQL IN 操作符


if(db_handel==NULL) 

IN 操作符

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

错误处理

MySQL IN 语法

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


{

演示数据库

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

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

CustomerID CustomerName ContactName Address City PostalCode Country
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

printf(MySQL_error(&MySQL));  return NULL;  }  query_error=MySQL_query(db_handel,sql);  

IN 操作符实例

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

查询

实例

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

 

 

if(query_error!=0) 

MySQL 入门教程

必赢备用网址 2

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

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


错误处理

什么是数据库?

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

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

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

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

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

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

{  printf(MySQL_error(db_handel));  return NULL;  }  query_result=MySQL_store_result(db_handel); 

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系统。

MySQL_close(db_handel); 

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

在开始学习本教程前你应该了解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选项 决定什么时候吧事务保存到日志里。
return query_result; 

在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导出的数据。


int query_show(MySQL_RES *result)  {  unsigned int i,num_fields;  MySQL_FIELD *fileds;  num_fields=MySQL_num_fields(result);  

使用 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 'rn';

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="rn"  database_name dump.txt
password *****

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

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

fileds= mysql _fetch_fields(result); 

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语句来简单的导出数据到文本文件上。


while((row=mysql_fetch_row(result))!=NULL) 

使用 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 'rn';

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

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服务器所拥有。这意味着,虽然你就可以读取该文件,但可能无法将其删除。

{  for(i=0;i<num_fields;i++)  {  printf("%s: %s n",fileds[i].name,row[i]?row[i]:"NULL");  }  }  return 0;  } 

导出表作为原始数据

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

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

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

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

以下是MakeFile文件内容

导出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 及以后版本加入。

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


CC=gcc #LDLIBS=`gtk-config --libs --cflags`  LDLIBS=-L /usr/lib/mysql -I /usr/include/mysql -l mysqlclient  CFLAGS=-Wall -g`gtk-config --cflags`  window:window.c  $(CC) $(LDLIBS) window.c -o window  #window.o:window.c  # $(CC) $(LDLIBS) -c window.c  clean:  rm -f window  rm -f *.o  

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

如果你需要将数据拷贝至其他的 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

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

 

 

以上的相关内容就是对c语言读取Mysql的介绍,望你能有所收获。

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 affectedn", (defined ($count) ? $count : 0);

# 方法 2
# 使用prepare( ) 及 execute( ) 执行  $query 
my $sth = $dbh->prepare ($query);
my $count = $sth->execute ( );
printf "%d rows were affectedn", (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 affectedn");

数据库和数据表列表

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

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

PERL 实例

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

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数据表的索引,该功能我们会在接下来的章节中介绍。