本节内容

1、数据库介绍

2、mysql管理

3、mysql数据类型

4、常用mysql命令

  创建数据库

  外键

  增删改查表

5、事务

6、索引

1、数据库介绍

什么是数据库?

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,
每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。
我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS即关系数据库管理系统(Relational Database Management System)的特点:
1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成一张表单
5.若干的表单组成database

RDBMS 术语

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

  • 数据库: 数据库是一些关联表的集合。.
  • 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
  • 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
  • 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
  • 冗余:存储两倍数据,冗余可以使系统速度更快。(表的规范化程度越高,表与表之间的关系就越多;查询时可能经常需要在多个表之间进行连接查询;而进行连接操作会降低查询速度。例如,学生的信息存储在student表中,院系信息存储在department表中。通过student表中的dept_id字段与department表建立关联关系。如果要查询一个学生所在系的名称,必须从student表中查找学生所在院系的编号(dept_id),然后根据这个编号去department查找系的名称。如果经常需要进行这个操作时,连接查询会浪费很多的时间。因此可以在student表中增加一个冗余字段dept_name,该字段用来存储学生所在院系的名称。这样就不用每次都进行连接操作了。)
  • 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
  • 外键:外键用于关联两个表。
  • 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
  • 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
  • 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

Mysql数据库

Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。由瑞典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系统。

2、mysql管理

MySQL 用户设置

如果你需要添加 MySQL 用户,你只需要在 mysql 数据库中的 user 表添加新用户即可。

以下为添加用户的的实例,用户名为lisi,密码为12345678,并授权用户可进行 SELECT, INSERT 和 UPDATE操作权限:

1  insert into user(host,user,password,select_priv,insert_priv,update_priv) values ('localhost','lisi',password('12345678'),'y','y','y');

1 flush privileges;

管理MySQL的命令

以下列出了使用Mysql数据库过程中常用的命令:

  • USE 数据库名 :选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。

  • SHOW DATABASES: 列出 MySQL 数据库管理系统的数据库列表。

  • SHOW TABLES: #显示指定数据库的所有表,使用该命令前需要使用 use命令来选择要操作的数据库。

  • SHOW COLUMNS FROM 数据表: #显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。

  • create database testdb charset "utf8"; #创建一个叫testdb的数据库,且让其支持中文

  • drop database testdb; #删除数据库

  • SHOW INDEX FROM 数据表:显示数据表的详细索引信息,包括PRIMARY KEY(主键)。

3、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不能表示的值时使用"零"值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型 大小
(字节)
范围 格式 用途
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类型,有相同的最大长度和存储需求

4、常用mysql命令

  创建数据库

  语法

  

1 CREATE TABLE table_name (column_name column_type);

创建一个student表

create table student(stu_id int not null auto_increment, name char(32) not null, age int not null, register_date date, primary key (stu_id));

实例解析:

  • 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
  • AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
  • PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。

MySQL 插入数据

语法

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

 1 mysql> insert into student (name,age,register_date) values ("zhangsan",22,"2016-10-26");
 2 Query OK, 1 row affected (0.00 sec)
 3
 4 mysql> select * from student;
 5 +--------+----------+-----+---------------+
 6 | stu_id | name     | age | register_date |
 7 +--------+----------+-----+---------------+
 8 |      1 | zhangsan |  22 | 2016-10-26    |
 9 +--------+----------+-----+---------------+
10 1 row in set (0.00 sec)

MySQL 查询数据

语法

1 SELECT column_name,column_name
2 FROM table_name
3 [WHERE Clause]
4 [OFFSET M ][LIMIT N]

 1 mysql> select * from student;
 2 +--------+-----------+-----+---------------+
 3 | stu_id | name      | age | register_date |
 4 +--------+-----------+-----+---------------+
 5 |      1 | zhangsan  |  22 | 2016-10-26    |
 6 |      2 | zhangsan1 |  23 | 2016-10-27    |
 7 |      3 | zhangsan2 |  24 | 2016-10-28    |
 8 |      4 | zhangsan3 |  25 | 2016-10-29    |
 9 +--------+-----------+-----+---------------+
10 4 rows in set (0.00 sec)
11
12 方法一:
13 mysql> select name from student where name="zhangsan2";
14 +-----------+
15 | name      |
16 +-----------+
17 | zhangsan2 |
18 +-----------+
19 1 row in set (0.00 sec)
20
21 方法二:
22 mysql> select name,age  from student where name="zhangsan2" and age=24;
23 +-----------+-----+
24 | name      | age |
25 +-----------+-----+
26 | zhangsan2 |  24 |
27 +-----------+-----+
28 1 row in set (0.00 sec)

  • 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
  • SELECT 命令可以读取一条或者多条记录。
  • 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
  • 你可以使用 WHERE 语句来包含任何条件。
  • 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
  • 你可以使用 LIMIT 属性来设定返回的记录数。
 1 mysql> select * from student;
 2 +--------+-----------+-----+---------------+
 3 | stu_id | name      | age | register_date |
 4 +--------+-----------+-----+---------------+
 5 |      1 | zhangsan  |  22 | 2016-10-26    |
 6 |      2 | zhangsan1 |  23 | 2016-10-27    |
 7 |      3 | zhangsan2 |  24 | 2016-10-28    |
 8 |      4 | zhangsan3 |  25 | 2016-10-29    |
 9 +--------+-----------+-----+---------------+
10 4 rows in set (0.00 sec)

 1 #limit相当于从表中的第几条开始查询,offset代表从前面第几条开始计算的第几条数据。(包含limit那行)
 2 方法一:
 3 mysql> select * from student limit 2 offset 1;
 4 +--------+-----------+-----+---------------+
 5 | stu_id | name      | age | register_date |
 6 +--------+-----------+-----+---------------+
 7 |      2 | zhangsan1 |  23 | 2016-10-27    |
 8 |      3 | zhangsan2 |  24 | 2016-10-28    |
 9 +--------+-----------+-----+---------------+
10 2 rows in set (0.00 sec)
11
12
13 #下面这个少了个offset,完全就变了。下面说明是从limit指定条开始读,后面1代表读几行。
14 方法二:
15 mysql> select * from student limit 2,1;
16 +--------+-----------+-----+---------------+
17 | stu_id | name      | age | register_date |
18 +--------+-----------+-----+---------------+
19 |      3 | zhangsan2 |  24 | 2016-10-28    |
20 +--------+-----------+-----+---------------+
21 1 row in set (0.00 sec)

MySQL where 子句

语法

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

以下为操作符列表,可用于 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。

使用主键来作为 WHERE 子句的条件查询是非常快速的。

1 mysql> select * from student where age > 24;
2 +--------+-----------+-----+---------------+
3 | stu_id | name      | age | register_date |
4 +--------+-----------+-----+---------------+
5 |      4 | zhangsan3 |  25 | 2016-10-29    |
6 +--------+-----------+-----+---------------+
7 1 row in set (0.00 sec)

MySQL UPDATE 查询

语法

 1 mysql> select * from student;
 2 +--------+-----------+-----+---------------+
 3 | stu_id | name      | age | register_date |
 4 +--------+-----------+-----+---------------+
 5 |      1 | zhangsan  |  22 | 2016-10-26    |
 6 |      2 | zhangsan1 |  23 | 2016-10-27    |
 7 |      3 | zhangsan2 |  24 | 2016-10-28    |
 8 |      4 | zhangsan3 |  25 | 2016-10-29    |
 9 +--------+-----------+-----+---------------+
10 4 rows in set (0.00 sec)
11
12 mysql> update student set age=28 where name="zhangsan3" and age="25";
13 Query OK, 1 row affected (0.00 sec)
14 Rows matched: 1  Changed: 1  Warnings: 0
15
16 mysql> select * from student;
17 +--------+-----------+-----+---------------+
18 | stu_id | name      | age | register_date |
19 +--------+-----------+-----+---------------+
20 |      1 | zhangsan  |  22 | 2016-10-26    |
21 |      2 | zhangsan1 |  23 | 2016-10-27    |
22 |      3 | zhangsan2 |  24 | 2016-10-28    |
23 |      4 | zhangsan3 |  28 | 2016-10-29    |
24 +--------+-----------+-----+---------------+
25 4 rows in set (0.00 sec)

MySQL DELETE 语句

语法:

1 DELETE FROM table_name [WHERE Clause]<br><br>delete from student where stu_id=5; 

例如:

 1 mysql> delete from student where name="zhangsan3" and age=28;
 2 Query OK, 1 row affected (0.00 sec)
 3
 4 mysql> select * from student;
 5 +--------+-----------+-----+---------------+
 6 | stu_id | name      | age | register_date |
 7 +--------+-----------+-----+---------------+
 8 |      1 | zhangsan  |  22 | 2016-10-26    |
 9 |      2 | zhangsan1 |  23 | 2016-10-27    |
10 |      3 | zhangsan2 |  24 | 2016-10-28    |
11 +--------+-----------+-----+---------------+
12 3 rows in set (0.00 sec)

MySQL LIKE 子句

语法:

1 SELECT field1, field2,...fieldN table_name1, table_name2...
2 WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
3
4
5 select *from student where name binary like "%Li";
6 select *from student where name binary like  binary "%Li"; #只匹配大写

例如:

 1 mysql> select * from student where name like "zhang%";
 2 +--------+-----------+-----+---------------+
 3 | stu_id | name      | age | register_date |
 4 +--------+-----------+-----+---------------+
 5 |      1 | zhangsan  |  22 | 2016-10-26    |
 6 |      2 | zhangsan1 |  23 | 2016-10-27    |
 7 |      3 | zhangsan2 |  24 | 2016-10-28    |
 8 |      5 | zhangsan3 |  25 | 2016-10-29    |
 9 +--------+-----------+-----+---------------+
10 4 rows in set (0.00 sec)
11
12 mysql> select * from student where age  like "24";
13 +--------+-----------+-----+---------------+
14 | stu_id | name      | age | register_date |
15 +--------+-----------+-----+---------------+
16 |      3 | zhangsan2 |  24 | 2016-10-28    |
17 +--------+-----------+-----+---------------+
18 1 row in set (0.00 sec)

MySQL 排序

1 SELECT field1, field2,...fieldN from table_name1, table_name2...
2 ORDER BY field1, [field2...] [ASC [DESC]]
3 使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。

例如:

 1 mysql> select * from student;
 2 +--------+-----------+-----+---------------+
 3 | stu_id | name      | age | register_date |
 4 +--------+-----------+-----+---------------+
 5 |      1 | zhangsan  |  22 | 2016-10-26    |
 6 |      2 | zhangsan1 |  23 | 2016-10-27    |
 7 |      3 | zhangsan2 |  24 | 2016-10-28    |
 8 |      5 | zhangsan3 |  25 | 2016-10-29    |
 9 |      6 | ZHANGSAN4 |  26 | 2016-10-30    |
10 +--------+-----------+-----+---------------+
11 5 rows in set (0.00 sec)
12
13 mysql> select age from student order by age DESC;
14 +-----+
15 | age |
16 +-----+
17 |  26 |
18 |  25 |
19 |  24 |
20 |  23 |
21 |  22 |
22 +-----+
23 5 rows in set (0.00 sec)
24
25 mysql> select age from student order by age asc;
26 +-----+
27 | age |
28 +-----+
29 |  22 |
30 |  23 |
31 |  24 |
32 |  25 |
33 |  26 |
34 +-----+
35 5 rows in set (0.00 sec)

MySQL GROUP BY 语句  

1 SELECT column_name, function(column_name)
2 FROM table_name
3 WHERE column_name operator value
4 GROUP BY column_name;

例如:

mysql> select * from student;
+--------+-----------+-----+---------------+
| stu_id | name      | age | register_date |
+--------+-----------+-----+---------------+
|      1 | zhangsan  |  22 | 2016-10-26    |
|      2 | zhangsan1 |  23 | 2016-10-27    |
|      3 | zhangsan2 |  24 | 2016-10-28    |
|      5 | zhangsan3 |  25 | 2016-10-29    |
|      6 | ZHANGSAN4 |  26 | 2016-10-30    |
|      7 | zhangsan2 |  24 | 2016-10-25    |
+--------+-----------+-----+---------------+
6 rows in set (0.00 sec)#接下来我们使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:
mysql> select name,count(*) from student group by name;
+-----------+----------+
| name      | count(*) |
+-----------+----------+
| zhangsan  |        1 |
| zhangsan1 |        1 |
| zhangsan2 |        2 |
| zhangsan3 |        1 |
| ZHANGSAN4 |        1 |
+-----------+----------+
5 rows in set (0.00 sec)

 1 #使用 WITH ROLLUP   #我们模拟stu_id 就登陆数,统计一下总登录量
 2 mysql> select coalesce(name,"总数"), sum(stu_id) as singin_conut from student group by name with rollup;
 3 +-------------------------+--------------+
 4 | coalesce(name,"总数") | singin_conut |
 5 +-------------------------+--------------+
 6 | zhangsan                |            1 |
 7 | zhangsan1               |            2 |
 8 | zhangsan2               |           10 |
 9 | zhangsan3               |            5 |
10 | ZHANGSAN4               |            6 |
11 | 总数                  |           24 |
12 +-------------------------+--------------+
13 6 rows in set (0.00 sec)
14
15 其中记录 NULL 表示所有人的登录次数。<br>
16 我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:
17 mysql> select coalesce(name,"总数"), sum(stu_id) as singin_conut from student group by name with rollup;

MySQL ALTER命令

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

删除,添加或修改表字段

删除字段:

 1 mysql> alter table student drop register_date;
 2 Query OK, 6 rows affected (0.01 sec)
 3 Records: 6  Duplicates: 0  Warnings: 0
 4
 5 mysql> select * from student;
 6 +--------+-----------+-----+
 7 | stu_id | name      | age |
 8 +--------+-----------+-----+
 9 |      1 | zhangsan  |  22 |
10 |      2 | zhangsan1 |  23 |
11 |      3 | zhangsan2 |  24 |
12 |      5 | zhangsan3 |  25 |
13 |      6 | ZHANGSAN4 |  26 |
14 |      7 | zhangsan2 |  24 |
15 +--------+-----------+-----+
16 6 rows in set (0.00 sec)

添加字段:

 1 mysql> alter table student add singin int(32) not null;
 2 Query OK, 6 rows affected (0.01 sec)
 3 Records: 6  Duplicates: 0  Warnings: 0
 4
 5 mysql> select * from student;
 6 +--------+-----------+-----+--------+
 7 | stu_id | name      | age | singin |
 8 +--------+-----------+-----+--------+
 9 |      1 | zhangsan  |  22 |      0 |
10 |      2 | zhangsan1 |  23 |      0 |
11 |      3 | zhangsan2 |  24 |      0 |
12 |      5 | zhangsan3 |  25 |      0 |
13 |      6 | ZHANGSAN4 |  26 |      0 |
14 |      7 | zhangsan2 |  24 |      0 |
15 +--------+-----------+-----+--------+
16 6 rows in set (0.00 sec)

修改字段类型及名称

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

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

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

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

1 mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
3 mysql> ALTER TABLE testalter_tbl CHANGE j j INT;

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

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

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

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

修改表名

1 mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;

关于外键

外键,一个特殊的索引,用于关键2个表,只能是指定内容 

 1 mysql> create table class(
 2     -> id  int not null primary key,
 3     -> name char(16));
 4 Query OK, 0 rows affected (0.02 sec)
 5
 6
 7 CREATE TABLE `student2` (
 8   `id` int(11) NOT NULL,
 9   `name` char(16) NOT NULL,
10   `class_id` int(11) NOT NULL,
11   PRIMARY KEY (`id`),
12   KEY `fk_class_key` (`class_id`),
13   CONSTRAINT `fk_class_key` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`)
14 )
31 此时如果class 表中不存在id 1,student表也插入不了,这就叫外键约束
32 mysql> insert into student2(id,name,class_id) values(1,'alex', 1);
33 ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`student2`, CONSTRAINT `fk_class_key` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))
34
35
36
37 mysql> insert into class(id,name) values(1,"linux");
38 Query OK, 1 row affected (0.01 sec)
39
40 mysql> insert into student2(id,name,class_id) values(1,'alex', 1);
41 Query OK, 1 row affected (0.00 sec)
42
43
44 #如果有student表中跟这个class表有关联的数据,你是不能删除class表中与其关联的纪录的
45 mysql> delete from class where id =1;
46 ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`testdb`.`student2`, CONSTRAINT `fk_class_key` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))

 

MySQL NULL 值处理  

我们已经知道MySQL使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。
为了处理这种情况,MySQL提供了三大运算符:
IS NULL: 当列的值是NULL,此运算符返回true。
IS NOT NULL: 当列的值不为NULL, 运算符返回true。
<=>: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true。
关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。
在MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回false,即 NULL = NULL 返回false 。
MySQL中处理NULL使用IS NULL和IS NOT NULL运算符。

Mysql 连接(left join, right join, inner join ,full join)

我们已经学会了如果在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据。

本章节我们将向大家介绍如何使用 MySQL 的 JOIN 在两个或多个表中查询数据。

你可以在SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。

JOIN 按照功能大致分为如下三类:

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

Inner join(交集):

#交集
mysql> select * from A inner join B on A.id = B.id;
+----+----+
| id | id |
+----+----+
|  3 |  3 |
|  4 |  4 |
+----+----+
2 rows in set (0.00 sec)

LEFT JOIN(差集)

 1 mysql> select * from A  left join B on A.id = B.id;
 2 +----+------+
 3 | id | id   |
 4 +----+------+
 5 |  1 | NULL |
 6 |  2 | NULL |
 7 |  3 |    3 |
 8 |  4 |    4 |
 9 +----+------+
10 4 rows in set (0.00 sec)
11
12 mysql> select * from B  left join A on B.id = A.id;
13 +----+------+
14 | id | id   |
15 +----+------+
16 |  3 |    3 |
17 |  4 |    4 |
18 |  5 | NULL |
19 |  6 | NULL |
20 |  7 | NULL |
21 |  8 | NULL |
22 +----+------+
23 6 rows in set (0.00 sec)

Right join(其实就是left join相反)

 1 mysql> select * from A right join B on A.id = B.id;
 2 +------+----+
 3 | id   | id |
 4 +------+----+
 5 |    3 |  3 |
 6 |    4 |  4 |
 7 | NULL |  5 |
 8 | NULL |  6 |
 9 | NULL |  7 |
10 | NULL |  8 |
11 +------+----+
12 6 rows in set (0.00 sec)

Full join(并集)

mysql 并不直接支持full join,but 总是难不到我们

 1 mysql> select * from A left join B on A.id = B.id union select * from A right join B on A.id = B.id;
 2 +------+------+
 3 | id   | id   |
 4 +------+------+
 5 |    1 | NULL |
 6 |    2 | NULL |
 7 |    3 |    3 |
 8 |    4 |    4 |
 9 | NULL |    5 |
10 | NULL |    6 |
11 | NULL |    7 |
12 | NULL |    8 |
13 +------+------+
14 8 rows in set (0.00 sec)

5、事务

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的引擎分为ISAM,MyIASM(ISAM的升级版),InnoDB。

1/ISAM

ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MySQL能够支持这样的备份应用程序。

2/InnoDB

它提供了事务控制能力功能,它确保一组命令全部执行成功,或者当任何一个命令出现错误时所有命令的结果都被回退,可以想像在电子银行中事务控制能力是非常重要的。支持COMMIT、ROLLBACK和其他事务特性。最新版本的Mysql已经计划移除对BDB的支持,转而全力发展InnoDB。

MyIASM是IASM表的新版本,有如下扩展: 
二进制层次的可移植性。 
NULL列索引。 
对变长行比ISAM表有更少的碎片。 
支持大文件。 
更好的索引压缩。 
更好的键吗统计分布。 
更好和更快的auto_increment处理。

以下是一些细节和具体实现的差别:

1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB中不保存表的 
具体行数,也就是说,执行select count(*) from 
table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 
where条件时,两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.DELETE 
FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
5.LOAD TABLE FROM 
MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update 
table set num=1 where name like “�a%”

任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势.

MySQL 
Administrator建数据库的时候,表缺省是InnoDB类型。

InnoDB,MyISAM 
两种类型有什么区别:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。 
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持,外键等高级数据库功能。

MyISAM类型的二进制数据文件可以在不同操作系统中迁移。也就是可以直接从Windows系统拷贝到linux系统中使用。

1 查看系统支持的存储引擎

show engines;

2 查看表使用的存储引擎

两种方法:

a、show table status from db_name where name='table_name';

b、show create table table_name;

如果显示的格式不好看,可以用\g代替行尾分号

有人说用第二种方法不准确,我试了下,关闭掉原先默认的Innodb引擎后根本无法执行show create table table_name指令,因为之前建的是Innodb表,关掉后默认用MyISAM引擎,导致Innodb表数据无法被正确读取。

3 修改表引擎方法

alter table table_name engine=innodb;

4 关闭Innodb引擎方法

关闭mysql服务: net stop mysql

找到mysql安装目录下的my.ini文件:

找到default-storage-engine=INNODB 改为default-storage-engine=MYISAM

找到#skip-innodb 改为skip-innodb

启动mysql服务:net start mysql

 1 mysql> show create table C;
 2 +-------+-----------------------------------------------------------------------------------------------------+
 3 | Table | Create Table                                                                                        |
 4 +-------+-----------------------------------------------------------------------------------------------------+
 5 | C     | CREATE TABLE `C` (
 6   `a` int(11) NOT NULL,
 7   PRIMARY KEY (`a`)
 8 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
 9 +-------+-----------------------------------------------------------------------------------------------------+
10 1 row in set (0.00 sec)
11
12 mysql> begin;
13 Query OK, 0 rows affected (0.00 sec)
14
15 mysql> insert into C(a)values(1);
16 Query OK, 1 row affected (0.00 sec)
17
18 mysql> select * from C;
19 +---+
20 | a |
21 +---+
22 | 1 |
23 +---+
24 1 row in set (0.00 sec)
25
26 mysql> rollback;
27 Query OK, 0 rows affected (0.00 sec)
28
29 mysql> select * from C;
30 Empty set (0.00 sec)
31
32 mysql>

注意: 如果开始一个事务的时候,直接commit;了就已经提交了,如果再想rollback就回不去了。

6、索引

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。

创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。

普通索引

创建索引

这是最基本的索引,它没有任何限制。它有以下几种创建方式:

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

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

 修改表结构

1 ALTER mytable ADD INDEX [indexName] ON (username(length))

创建表的时候直接指定

1 CREATE TABLE mytable(
2
3 ID INT NOT NULL,
4
5 username VARCHAR(16) NOT NULL,
6
7 INDEX [indexName] (username(length))
8
9 ); 

删除索引的语法

1 DROP INDEX [indexName] ON mytable;

唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

创建索引

 1 创建索引
 2 CREATE UNIQUE INDEX indexName ON mytable(username(length))
 3
 4
 5 修改表结构
 6 ALTER mytable ADD UNIQUE [indexName] ON (username(length))
 7
 8
 9 创建表的时候直接指定
10 CREATE TABLE mytable(
11
12 ID INT NOT NULL,
13
14 username VARCHAR(16) NOT NULL,
15
16 UNIQUE [indexName] (username(length))
17
18 ); 

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

 1 有四种方式来添加数据表的索引:
 2 ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
 3 ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
 4 ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
 5 ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。
 6
 7
 8 以下实例为在表中添加索引。
 9 mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
10 你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:
11 mysql> ALTER TABLE testalter_tbl DROP INDEX (c);

使用 ALTER 命令添加和删除主键

1 主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:
2 mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
3 mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
4
5 你也可以使用 ALTER 命令删除主键:
6 mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;

显示索引信息

1 SHOW INDEX FROM table_name\G

mysql练习题 http://www.cnblogs.com/wupeiqi/articles/5729934.html

更多mysql知识,请看http://www.cnblogs.com/wupeiqi/articles/5713323.html

本节内容

1、数据库介绍

2、mysql管理

3、mysql数据类型

4、常用mysql命令

  创建数据库

  外键

  增删改查表

5、事务

6、索引

7、python 操作mysql

8、ORM sqlachemy学习

1、数据库介绍

什么是数据库?

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,
每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。
我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS即关系数据库管理系统(Relational Database Management System)的特点:
1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成一张表单
5.若干的表单组成database

RDBMS 术语

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

  • 数据库: 数据库是一些关联表的集合。.
  • 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
  • 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
  • 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
  • 冗余:存储两倍数据,冗余可以使系统速度更快。(表的规范化程度越高,表与表之间的关系就越多;查询时可能经常需要在多个表之间进行连接查询;而进行连接操作会降低查询速度。例如,学生的信息存储在student表中,院系信息存储在department表中。通过student表中的dept_id字段与department表建立关联关系。如果要查询一个学生所在系的名称,必须从student表中查找学生所在院系的编号(dept_id),然后根据这个编号去department查找系的名称。如果经常需要进行这个操作时,连接查询会浪费很多的时间。因此可以在student表中增加一个冗余字段dept_name,该字段用来存储学生所在院系的名称。这样就不用每次都进行连接操作了。)
  • 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
  • 外键:外键用于关联两个表。
  • 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
  • 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
  • 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

Mysql数据库

Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。由瑞典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系统。

2、mysql管理

MySQL 用户设置

如果你需要添加 MySQL 用户,你只需要在 mysql 数据库中的 user 表添加新用户即可。

以下为添加用户的的实例,用户名为lisi,密码为12345678,并授权用户可进行 SELECT, INSERT 和 UPDATE操作权限:

1  insert into user(host,user,password,select_priv,insert_priv,update_priv) values ('localhost','lisi',password('12345678'),'y','y','y');

1 flush privileges;

管理MySQL的命令

以下列出了使用Mysql数据库过程中常用的命令:

  • USE 数据库名 :选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。

  • SHOW DATABASES: 列出 MySQL 数据库管理系统的数据库列表。

  • SHOW TABLES: #显示指定数据库的所有表,使用该命令前需要使用 use命令来选择要操作的数据库。

  • SHOW COLUMNS FROM 数据表: #显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。

  • create database testdb charset "utf8"; #创建一个叫testdb的数据库,且让其支持中文

  • drop database testdb; #删除数据库

  • SHOW INDEX FROM 数据表:显示数据表的详细索引信息,包括PRIMARY KEY(主键)。

3、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不能表示的值时使用"零"值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型 大小
(字节)
范围 格式 用途
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类型,有相同的最大长度和存储需求

4、常用mysql命令

  创建数据库

  语法

  

1 CREATE TABLE table_name (column_name column_type);

创建一个student表

create table student(stu_id int not null auto_increment, name char(32) not null, age int not null, register_date date, primary key (stu_id));

实例解析:

  • 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
  • AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
  • PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。

MySQL 插入数据

语法

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

 1 mysql> insert into student (name,age,register_date) values ("zhangsan",22,"2016-10-26");
 2 Query OK, 1 row affected (0.00 sec)
 3
 4 mysql> select * from student;
 5 +--------+----------+-----+---------------+
 6 | stu_id | name     | age | register_date |
 7 +--------+----------+-----+---------------+
 8 |      1 | zhangsan |  22 | 2016-10-26    |
 9 +--------+----------+-----+---------------+
10 1 row in set (0.00 sec)

MySQL 查询数据

语法

1 SELECT column_name,column_name
2 FROM table_name
3 [WHERE Clause]
4 [OFFSET M ][LIMIT N]

 1 mysql> select * from student;
 2 +--------+-----------+-----+---------------+
 3 | stu_id | name      | age | register_date |
 4 +--------+-----------+-----+---------------+
 5 |      1 | zhangsan  |  22 | 2016-10-26    |
 6 |      2 | zhangsan1 |  23 | 2016-10-27    |
 7 |      3 | zhangsan2 |  24 | 2016-10-28    |
 8 |      4 | zhangsan3 |  25 | 2016-10-29    |
 9 +--------+-----------+-----+---------------+
10 4 rows in set (0.00 sec)
11
12 方法一:
13 mysql> select name from student where name="zhangsan2";
14 +-----------+
15 | name      |
16 +-----------+
17 | zhangsan2 |
18 +-----------+
19 1 row in set (0.00 sec)
20
21 方法二:
22 mysql> select name,age  from student where name="zhangsan2" and age=24;
23 +-----------+-----+
24 | name      | age |
25 +-----------+-----+
26 | zhangsan2 |  24 |
27 +-----------+-----+
28 1 row in set (0.00 sec)

  • 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
  • SELECT 命令可以读取一条或者多条记录。
  • 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
  • 你可以使用 WHERE 语句来包含任何条件。
  • 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
  • 你可以使用 LIMIT 属性来设定返回的记录数。
 1 mysql> select * from student;
 2 +--------+-----------+-----+---------------+
 3 | stu_id | name      | age | register_date |
 4 +--------+-----------+-----+---------------+
 5 |      1 | zhangsan  |  22 | 2016-10-26    |
 6 |      2 | zhangsan1 |  23 | 2016-10-27    |
 7 |      3 | zhangsan2 |  24 | 2016-10-28    |
 8 |      4 | zhangsan3 |  25 | 2016-10-29    |
 9 +--------+-----------+-----+---------------+
10 4 rows in set (0.00 sec)

 1 #limit相当于从表中的第几条开始查询,offset代表从前面第几条开始计算的第几条数据。(包含limit那行)
 2 方法一:
 3 mysql> select * from student limit 2 offset 1;
 4 +--------+-----------+-----+---------------+
 5 | stu_id | name      | age | register_date |
 6 +--------+-----------+-----+---------------+
 7 |      2 | zhangsan1 |  23 | 2016-10-27    |
 8 |      3 | zhangsan2 |  24 | 2016-10-28    |
 9 +--------+-----------+-----+---------------+
10 2 rows in set (0.00 sec)
11
12
13 #下面这个少了个offset,完全就变了。下面说明是从limit指定条开始读,后面1代表读几行。
14 方法二:
15 mysql> select * from student limit 2,1;
16 +--------+-----------+-----+---------------+
17 | stu_id | name      | age | register_date |
18 +--------+-----------+-----+---------------+
19 |      3 | zhangsan2 |  24 | 2016-10-28    |
20 +--------+-----------+-----+---------------+
21 1 row in set (0.00 sec)

MySQL where 子句

语法

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

以下为操作符列表,可用于 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。

使用主键来作为 WHERE 子句的条件查询是非常快速的。

1 mysql> select * from student where age > 24;
2 +--------+-----------+-----+---------------+
3 | stu_id | name      | age | register_date |
4 +--------+-----------+-----+---------------+
5 |      4 | zhangsan3 |  25 | 2016-10-29    |
6 +--------+-----------+-----+---------------+
7 1 row in set (0.00 sec)

MySQL UPDATE 查询

语法

 1 mysql> select * from student;
 2 +--------+-----------+-----+---------------+
 3 | stu_id | name      | age | register_date |
 4 +--------+-----------+-----+---------------+
 5 |      1 | zhangsan  |  22 | 2016-10-26    |
 6 |      2 | zhangsan1 |  23 | 2016-10-27    |
 7 |      3 | zhangsan2 |  24 | 2016-10-28    |
 8 |      4 | zhangsan3 |  25 | 2016-10-29    |
 9 +--------+-----------+-----+---------------+
10 4 rows in set (0.00 sec)
11
12 mysql> update student set age=28 where name="zhangsan3" and age="25";
13 Query OK, 1 row affected (0.00 sec)
14 Rows matched: 1  Changed: 1  Warnings: 0
15
16 mysql> select * from student;
17 +--------+-----------+-----+---------------+
18 | stu_id | name      | age | register_date |
19 +--------+-----------+-----+---------------+
20 |      1 | zhangsan  |  22 | 2016-10-26    |
21 |      2 | zhangsan1 |  23 | 2016-10-27    |
22 |      3 | zhangsan2 |  24 | 2016-10-28    |
23 |      4 | zhangsan3 |  28 | 2016-10-29    |
24 +--------+-----------+-----+---------------+
25 4 rows in set (0.00 sec)

MySQL DELETE 语句

语法:

1 DELETE FROM table_name [WHERE Clause]<br><br>delete from student where stu_id=5; 

例如:

 1 mysql> delete from student where name="zhangsan3" and age=28;
 2 Query OK, 1 row affected (0.00 sec)
 3
 4 mysql> select * from student;
 5 +--------+-----------+-----+---------------+
 6 | stu_id | name      | age | register_date |
 7 +--------+-----------+-----+---------------+
 8 |      1 | zhangsan  |  22 | 2016-10-26    |
 9 |      2 | zhangsan1 |  23 | 2016-10-27    |
10 |      3 | zhangsan2 |  24 | 2016-10-28    |
11 +--------+-----------+-----+---------------+
12 3 rows in set (0.00 sec)

MySQL LIKE 子句

语法:

1 SELECT field1, field2,...fieldN table_name1, table_name2...
2 WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
3
4
5 select *from student where name binary like "%Li";
6 select *from student where name binary like  binary "%Li"; #只匹配大写

例如:

 1 mysql> select * from student where name like "zhang%";
 2 +--------+-----------+-----+---------------+
 3 | stu_id | name      | age | register_date |
 4 +--------+-----------+-----+---------------+
 5 |      1 | zhangsan  |  22 | 2016-10-26    |
 6 |      2 | zhangsan1 |  23 | 2016-10-27    |
 7 |      3 | zhangsan2 |  24 | 2016-10-28    |
 8 |      5 | zhangsan3 |  25 | 2016-10-29    |
 9 +--------+-----------+-----+---------------+
10 4 rows in set (0.00 sec)
11
12 mysql> select * from student where age  like "24";
13 +--------+-----------+-----+---------------+
14 | stu_id | name      | age | register_date |
15 +--------+-----------+-----+---------------+
16 |      3 | zhangsan2 |  24 | 2016-10-28    |
17 +--------+-----------+-----+---------------+
18 1 row in set (0.00 sec)

MySQL 排序

1 SELECT field1, field2,...fieldN from table_name1, table_name2...
2 ORDER BY field1, [field2...] [ASC [DESC]]
3 使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。

例如:

 1 mysql> select * from student;
 2 +--------+-----------+-----+---------------+
 3 | stu_id | name      | age | register_date |
 4 +--------+-----------+-----+---------------+
 5 |      1 | zhangsan  |  22 | 2016-10-26    |
 6 |      2 | zhangsan1 |  23 | 2016-10-27    |
 7 |      3 | zhangsan2 |  24 | 2016-10-28    |
 8 |      5 | zhangsan3 |  25 | 2016-10-29    |
 9 |      6 | ZHANGSAN4 |  26 | 2016-10-30    |
10 +--------+-----------+-----+---------------+
11 5 rows in set (0.00 sec)
12
13 mysql> select age from student order by age DESC;
14 +-----+
15 | age |
16 +-----+
17 |  26 |
18 |  25 |
19 |  24 |
20 |  23 |
21 |  22 |
22 +-----+
23 5 rows in set (0.00 sec)
24
25 mysql> select age from student order by age asc;
26 +-----+
27 | age |
28 +-----+
29 |  22 |
30 |  23 |
31 |  24 |
32 |  25 |
33 |  26 |
34 +-----+
35 5 rows in set (0.00 sec)

MySQL GROUP BY 语句  

1 SELECT column_name, function(column_name)
2 FROM table_name
3 WHERE column_name operator value
4 GROUP BY column_name;

例如:

mysql> select * from student;
+--------+-----------+-----+---------------+
| stu_id | name      | age | register_date |
+--------+-----------+-----+---------------+
|      1 | zhangsan  |  22 | 2016-10-26    |
|      2 | zhangsan1 |  23 | 2016-10-27    |
|      3 | zhangsan2 |  24 | 2016-10-28    |
|      5 | zhangsan3 |  25 | 2016-10-29    |
|      6 | ZHANGSAN4 |  26 | 2016-10-30    |
|      7 | zhangsan2 |  24 | 2016-10-25    |
+--------+-----------+-----+---------------+
6 rows in set (0.00 sec)#接下来我们使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:
mysql> select name,count(*) from student group by name;
+-----------+----------+
| name      | count(*) |
+-----------+----------+
| zhangsan  |        1 |
| zhangsan1 |        1 |
| zhangsan2 |        2 |
| zhangsan3 |        1 |
| ZHANGSAN4 |        1 |
+-----------+----------+
5 rows in set (0.00 sec)

 1 #使用 WITH ROLLUP   #我们模拟stu_id 就登陆数,统计一下总登录量
 2 mysql> select coalesce(name,"总数"), sum(stu_id) as singin_conut from student group by name with rollup;
 3 +-------------------------+--------------+
 4 | coalesce(name,"总数") | singin_conut |
 5 +-------------------------+--------------+
 6 | zhangsan                |            1 |
 7 | zhangsan1               |            2 |
 8 | zhangsan2               |           10 |
 9 | zhangsan3               |            5 |
10 | ZHANGSAN4               |            6 |
11 | 总数                  |           24 |
12 +-------------------------+--------------+
13 6 rows in set (0.00 sec)
14
15 其中记录 NULL 表示所有人的登录次数。<br>
16 我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:
17 mysql> select coalesce(name,"总数"), sum(stu_id) as singin_conut from student group by name with rollup;

MySQL ALTER命令

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

删除,添加或修改表字段

删除字段:

 1 mysql> alter table student drop register_date;
 2 Query OK, 6 rows affected (0.01 sec)
 3 Records: 6  Duplicates: 0  Warnings: 0
 4
 5 mysql> select * from student;
 6 +--------+-----------+-----+
 7 | stu_id | name      | age |
 8 +--------+-----------+-----+
 9 |      1 | zhangsan  |  22 |
10 |      2 | zhangsan1 |  23 |
11 |      3 | zhangsan2 |  24 |
12 |      5 | zhangsan3 |  25 |
13 |      6 | ZHANGSAN4 |  26 |
14 |      7 | zhangsan2 |  24 |
15 +--------+-----------+-----+
16 6 rows in set (0.00 sec)

添加字段:

 1 mysql> alter table student add singin int(32) not null;
 2 Query OK, 6 rows affected (0.01 sec)
 3 Records: 6  Duplicates: 0  Warnings: 0
 4
 5 mysql> select * from student;
 6 +--------+-----------+-----+--------+
 7 | stu_id | name      | age | singin |
 8 +--------+-----------+-----+--------+
 9 |      1 | zhangsan  |  22 |      0 |
10 |      2 | zhangsan1 |  23 |      0 |
11 |      3 | zhangsan2 |  24 |      0 |
12 |      5 | zhangsan3 |  25 |      0 |
13 |      6 | ZHANGSAN4 |  26 |      0 |
14 |      7 | zhangsan2 |  24 |      0 |
15 +--------+-----------+-----+--------+
16 6 rows in set (0.00 sec)

修改字段类型及名称

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

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

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

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

1 mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
3 mysql> ALTER TABLE testalter_tbl CHANGE j j INT;

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

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

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

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

修改表名

1 mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;

关于外键

外键,一个特殊的索引,用于关键2个表,只能是指定内容 

 1 mysql> create table class(
 2     -> id  int not null primary key,
 3     -> name char(16));
 4 Query OK, 0 rows affected (0.02 sec)
 5
 6
 7 CREATE TABLE `student2` (
 8   `id` int(11) NOT NULL,
 9   `name` char(16) NOT NULL,
10   `class_id` int(11) NOT NULL,
11   PRIMARY KEY (`id`),
12   KEY `fk_class_key` (`class_id`),
13   CONSTRAINT `fk_class_key` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`)
14 )
31 此时如果class 表中不存在id 1,student表也插入不了,这就叫外键约束
32 mysql> insert into student2(id,name,class_id) values(1,'alex', 1);
33 ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`student2`, CONSTRAINT `fk_class_key` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))
34
35
36
37 mysql> insert into class(id,name) values(1,"linux");
38 Query OK, 1 row affected (0.01 sec)
39
40 mysql> insert into student2(id,name,class_id) values(1,'alex', 1);
41 Query OK, 1 row affected (0.00 sec)
42
43
44 #如果有student表中跟这个class表有关联的数据,你是不能删除class表中与其关联的纪录的
45 mysql> delete from class where id =1;
46 ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`testdb`.`student2`, CONSTRAINT `fk_class_key` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))

 

MySQL NULL 值处理  

我们已经知道MySQL使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。
为了处理这种情况,MySQL提供了三大运算符:
IS NULL: 当列的值是NULL,此运算符返回true。
IS NOT NULL: 当列的值不为NULL, 运算符返回true。
<=>: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true。
关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。
在MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回false,即 NULL = NULL 返回false 。
MySQL中处理NULL使用IS NULL和IS NOT NULL运算符。

Mysql 连接(left join, right join, inner join ,full join)

我们已经学会了如果在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据。

本章节我们将向大家介绍如何使用 MySQL 的 JOIN 在两个或多个表中查询数据。

你可以在SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。

JOIN 按照功能大致分为如下三类:

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

Inner join(交集):

#交集
mysql> select * from A inner join B on A.id = B.id;
+----+----+
| id | id |
+----+----+
|  3 |  3 |
|  4 |  4 |
+----+----+
2 rows in set (0.00 sec)

LEFT JOIN(差集)

 1 mysql> select * from A  left join B on A.id = B.id;
 2 +----+------+
 3 | id | id   |
 4 +----+------+
 5 |  1 | NULL |
 6 |  2 | NULL |
 7 |  3 |    3 |
 8 |  4 |    4 |
 9 +----+------+
10 4 rows in set (0.00 sec)
11
12 mysql> select * from B  left join A on B.id = A.id;
13 +----+------+
14 | id | id   |
15 +----+------+
16 |  3 |    3 |
17 |  4 |    4 |
18 |  5 | NULL |
19 |  6 | NULL |
20 |  7 | NULL |
21 |  8 | NULL |
22 +----+------+
23 6 rows in set (0.00 sec)

Right join(其实就是left join相反)

 1 mysql> select * from A right join B on A.id = B.id;
 2 +------+----+
 3 | id   | id |
 4 +------+----+
 5 |    3 |  3 |
 6 |    4 |  4 |
 7 | NULL |  5 |
 8 | NULL |  6 |
 9 | NULL |  7 |
10 | NULL |  8 |
11 +------+----+
12 6 rows in set (0.00 sec)

Full join(并集)

mysql 并不直接支持full join,but 总是难不到我们

 1 mysql> select * from A left join B on A.id = B.id union select * from A right join B on A.id = B.id;
 2 +------+------+
 3 | id   | id   |
 4 +------+------+
 5 |    1 | NULL |
 6 |    2 | NULL |
 7 |    3 |    3 |
 8 |    4 |    4 |
 9 | NULL |    5 |
10 | NULL |    6 |
11 | NULL |    7 |
12 | NULL |    8 |
13 +------+------+
14 8 rows in set (0.00 sec)

5、事务

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的引擎分为ISAM,MyIASM(ISAM的升级版),InnoDB。

1/ISAM

ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MySQL能够支持这样的备份应用程序。

2/InnoDB

它提供了事务控制能力功能,它确保一组命令全部执行成功,或者当任何一个命令出现错误时所有命令的结果都被回退,可以想像在电子银行中事务控制能力是非常重要的。支持COMMIT、ROLLBACK和其他事务特性。最新版本的Mysql已经计划移除对BDB的支持,转而全力发展InnoDB。

MyIASM是IASM表的新版本,有如下扩展: 
二进制层次的可移植性。 
NULL列索引。 
对变长行比ISAM表有更少的碎片。 
支持大文件。 
更好的索引压缩。 
更好的键吗统计分布。 
更好和更快的auto_increment处理。

以下是一些细节和具体实现的差别:

1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB中不保存表的 
具体行数,也就是说,执行select count(*) from 
table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 
where条件时,两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.DELETE 
FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
5.LOAD TABLE FROM 
MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update 
table set num=1 where name like “�a%”

任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势.

MySQL 
Administrator建数据库的时候,表缺省是InnoDB类型。

InnoDB,MyISAM 
两种类型有什么区别:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。 
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持,外键等高级数据库功能。

MyISAM类型的二进制数据文件可以在不同操作系统中迁移。也就是可以直接从Windows系统拷贝到linux系统中使用。

1 查看系统支持的存储引擎

show engines;

2 查看表使用的存储引擎

两种方法:

a、show table status from db_name where name='table_name';

b、show create table table_name;

如果显示的格式不好看,可以用\g代替行尾分号

有人说用第二种方法不准确,我试了下,关闭掉原先默认的Innodb引擎后根本无法执行show create table table_name指令,因为之前建的是Innodb表,关掉后默认用MyISAM引擎,导致Innodb表数据无法被正确读取。

3 修改表引擎方法

alter table table_name engine=innodb;

4 关闭Innodb引擎方法

关闭mysql服务: net stop mysql

找到mysql安装目录下的my.ini文件:

找到default-storage-engine=INNODB 改为default-storage-engine=MYISAM

找到#skip-innodb 改为skip-innodb

启动mysql服务:net start mysql

 1 mysql> show create table C;
 2 +-------+-----------------------------------------------------------------------------------------------------+
 3 | Table | Create Table                                                                                        |
 4 +-------+-----------------------------------------------------------------------------------------------------+
 5 | C     | CREATE TABLE `C` (
 6   `a` int(11) NOT NULL,
 7   PRIMARY KEY (`a`)
 8 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
 9 +-------+-----------------------------------------------------------------------------------------------------+
10 1 row in set (0.00 sec)
11
12 mysql> begin;
13 Query OK, 0 rows affected (0.00 sec)
14
15 mysql> insert into C(a)values(1);
16 Query OK, 1 row affected (0.00 sec)
17
18 mysql> select * from C;
19 +---+
20 | a |
21 +---+
22 | 1 |
23 +---+
24 1 row in set (0.00 sec)
25
26 mysql> rollback;
27 Query OK, 0 rows affected (0.00 sec)
28
29 mysql> select * from C;
30 Empty set (0.00 sec)
31
32 mysql>

注意: 如果开始一个事务的时候,直接commit;了就已经提交了,如果再想rollback就回不去了。

6、索引

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。

创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。

普通索引

创建索引

这是最基本的索引,它没有任何限制。它有以下几种创建方式:

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

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

 修改表结构

1 ALTER mytable ADD INDEX [indexName] ON (username(length))

创建表的时候直接指定

1 CREATE TABLE mytable(
2
3 ID INT NOT NULL,
4
5 username VARCHAR(16) NOT NULL,
6
7 INDEX [indexName] (username(length))
8
9 ); 

删除索引的语法

1 DROP INDEX [indexName] ON mytable;

唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

创建索引

 View Code

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

 View Code

使用 ALTER 命令添加和删除主键

 View Code

显示索引信息

1 SHOW INDEX FROM table_name\G

mysql练习题 http://www.cnblogs.com/wupeiqi/articles/5729934.html

更多mysql知识,请看http://www.cnblogs.com/wupeiqi/articles/5713323.html

转载于:https://www.cnblogs.com/shenzikun1314/p/6819200.html

mysql的介绍和安装相关推荐

  1. mysql的介绍;安装及基本配置;mysql数据库运行必备技能

    一.MySQL的介绍 1. 数据库:数据库集中存放位置 1) 常见的数据库类型:关系型(mysql.oracle.SQLserver2008,DB2),树型(windows注册表).非关系型(NoSQ ...

  2. python数据库管理软件_MySQL管理工具MySQL Utilities — 介绍与安装(1)

    MySQL Utilities介绍 MySQL Utilities 提供一组命令行工具用于维护和管理 MySQL 服务器,包括: 管理工具 (克隆.复制.比较.差异.导出.导入) 复制工具 (安装.配 ...

  3. 什么是mysql的安装版本的_一:MySQL基本介绍及安装

    一:MySQL基本介绍 1 MySQL安装包版本选择,潜规则 MySQL5.6:GA 6-12个月 小版本是偶数版,奇数版一般都是测试. MySQL5.7:GA 6-12个月 小版本是偶数版,选择5. ...

  4. MySQL数据库介绍、安装(服务端软件安装、客户端软件安装(图形化界面客户端和命令行客户端))

    1. MySQL数据库的介绍 MySQL是一个关系型数据库管理系统,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System, ...

  5. 数据库概述(了解数据库,当前数据库介绍,mysql数据库介绍,安装mysql数据库)

    文章目录 数据库概述 什么是数据库(数据,表,数据库) 数据库有什么作用? 关系数据库详解 非关系数据库详解 数据库系统发展史 数据库管理系统(DBMS) 当今主流数据库介绍 MySQL数据库 MyS ...

  6. 数据库开发——MySQL——简单介绍和安装

    数据库 数据实际上就是描述事物特征的一组符号,数据库指的就是存储数据的仓库. 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 在软件开发过程中,程 ...

  7. Mysql介绍与安装LinuxmacOS系统

    数据库: 用于存储和管理数据的仓库 数据库的好处: 可以持久化存储数据 方便存储和管理数据 使用了统一的方式操作数据库 – SQL 常见的数据库: Oracle:收费的大型数据库,Oracle公司的产 ...

  8. MySQL介绍及安装(一)

    一.关系型数据库和非关系型数据库 1.1:关系型数据库 关系型数据库是把复杂的数据结构归结为简单的二元关系(即二维表格的形式),在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上的,通过 ...

  9. 三、安装cmake,安装resin ,tars服务,mysql 安装介绍,安装jdk,安装maven,c++ 开发环境安装...

    三.安装cmake,安装resin 2018年07月01日 21:32:05 youz1976 阅读数:308 开发环境说明: centos7.2 ,最低配置:1核cpu,2G内存,1M带宽 1.安装 ...

最新文章

  1. 开放平台鉴权以及OAuth2.0介绍
  2. 41-高级路由:BGP AS长度:接收一切、最大AS长度、不比较AS长度
  3. Java 最常见的 10000+ 面试题及答案整理:持续更新
  4. linux——管理系统设备之LVM的管理
  5. python解题软件哪个好_笔试 - 高德软件有限公司python问题 和 答案
  6. 基于Visual C++2013拆解世界五百强面试题--题5-自己实现strstr
  7. C++ Vector 汇总
  8. Distribution download cancelled. Using distribution from 'https://services.gradle.org/distributions/
  9. Kongzue的App更新框架
  10. php jwplayer mp4,jwplayer6 和 php播放视频
  11. win10计算机护眼,win10系统开启电脑护眼的操作方法
  12. 微信小程序加载圆形图片
  13. 关于Win10系统-svchost大量占用网速及自动更新问题——完美解决
  14. ListNode的理解
  15. 数据库范式讲解(1NF、2NF、3NF、BCNF)
  16. 纷享销客订货通:B2B渠道管理专属的经销商订货平台
  17. 【原创】随手记下-电脑版微信双开
  18. C++实现 数字游戏之拼出最大数
  19. matlab构造差商表,牛顿法 代数插值 – 差商表的求法
  20. 数据结构与算法实验6——图论 7-10 公路村村通

热门文章

  1. 360浏览器清除缓存_微信缓存清理教程
  2. iis10.0 php多版本,IIS7 IIS8 中多个版本php共存的方法
  3. 多线程是并行还是并发_并发,并行,线程,进程,异步和同步有相关性吗?
  4. python中排序的函数_Python中sorted()排序函数
  5. linux中特殊字符反引号,linux中的特殊符号$ ‘’ 反引号 反斜杠
  6. 初入java行业,环境你可知如何配置
  7. python 文件修改记录_python基础-文件增删改查
  8. java base64转文件_JAVA将Base64转为文件并保存详解
  9. python map 多参数_python – multiprocessing.pool.map和带有两个参数的函数
  10. php函数传引用,关于php:函数调用通过引用传递?