MySQL 是最流行的关系型数据库管理系统,在WEB应用方面 MySQL 是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。本人将详细讲解入门数据库的增删改查等操作。
1、USE 数据库名
选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库
1 | mysql>use XXX; |
2、创建数据库:
1 | Create database db_name [数据库选项,即名称]; |
(每当创建一个数据库,就在mysql–>date文件里创建一个文件)
注意:每条语句 要求使用语句结束符 ; 来结束
标识符(数据库名)命名规则:
大小写取决于当前操作系统。(一般认为是区分的,因为Linux是区分大小写的)
一般命名规则:见名知意。推荐使用下划线方式。
标识符的字符:
原则上可以使用任意字符,数字,符号,甚至是中文。但是一些特殊的组合,例如纯数字组合,特殊符号,包括mysql是内部关键字 应该使用标识符 限定符来包裹。防止冲突。
限定符:反引号。比如:Createdatabase 1234 ; Create database Create;
中文可以:但是要求客户端编码。在mysql的数据目录,形成一个目录,目录名是数据库名。如果是特殊字符,则使用编码的形式保存。
目录内,存在一个文件,用于保存数据库的选项信息。Db.opt
3、数据查询
- 查看当前存在的数据库:(除了自己创建的数据库,系统自己也有的)
1 | Show databases; |
注意: 并不是只有 用户可以创建数据库,mysql内部维护自己数据库。
- 查看数据的创建语句:
1 | Show create database db_name; |
- 数据库删除:(不可逆的,所有要慎重)
1 | Drop database db_name; |
- 修改数据库信息
1 | alter database db_name [修改指令] |
指令:数据库属性的修改
比如:
1 | alter database php_1 character set gbk; |
修改名字:
(1) 简单的可以直接修改目录名。(但是不通用 有时候不行,数据并非只存在一个数据库中)
(2) 将数据库内容全部导出,新建一个数据库,将内容导入,删除旧数据库。
(3) 创建一个新数据库,将旧数据库内的表,都移动(重命名)到新数据库内,删除旧数据库。
4、表操作
- 创建表
1 | Create table tbl_name (列结构)[表结构] |
先分析,需要保存的实体数据,拥有哪些属性。这些属性应该如何保存。
使用某个表
进行表操作时,都会指定当前的默认数据库:
1 | Use db_name;//只是设定了默认数据库,不会影响操作其他数据库 |
- 查看表结构(描述表结构):
1 | Describe tbl_name; |
- 删除表:
1 | drop table [if exists] tbl_name; |
注意:表不存在,会报错。
- 修改表
(1)修改表名.(支持修改多个表,只要在后面加上其他表即可)
1 | Rename table old_tbl_name to new_tbl_name; |
(2)修改列定义
修改表结构,上面的是子命令,上级是, alter table tbl_name [add|drop|change|modify]
(alter的英语意思:改变;修改)
(3)修改表选项
Alter table tbl_name 新的表选项
5、数据操作
create, | delete , | read(retrieve), | update |
---|---|---|---|
创建数据(插入数据)create | 删除数据 | 获得数据(查询数据) | 修改数据 |
创建数据
insert into 表名 (字段列名)values(值列表)
获得数据
Select 字段列表 from 表名 查询条件。
删除数据
Delete from 表名 条件。
删除需要在逻辑上严格给条件,否则容易造成数据误操作,导致损失。语法上可以没有where。但是逻辑上要有。
如果需要删除所有数据,使用where 1。
修改数据
Update 表名 set 字段=新值, … 条件
6、字符集
字符的集合,展示
字符的编码,保存和处理
mysql支持的常见字符集:通过命令:Show character set 。可以看到支持了好多!!(如下图所示)
字符集决定的是 : 字段的数据,是何种形式保存的。如果通过客户端操作服务器,那么客户端与服务器之间进行数据通信,要保证编码一致。可以将互相发送的数据,转换成 目标可以接收的编码。
设置变量:
Set 变量名=值
1 | Set character_set_client= gbk; |
告知服务器,客户端发送的数据是gbk编码。执行后,没有返回数据的语句没有问题了。
如果需要从服务器返回数据,还需要设置服务器发送给客户端的编码
1 | Setcharacter_set_results = gbk; |
服务器在发送数据时,才能转成客户端认识的编码。统一的操作可以用 set names gbk可以完成。(简单项目通用的做法)
其实还有一个有影响:连接层编码。
1 | Set character_set_connection = gbk; |
Set names 可以设置上面的三个。
典型的情况,set names即可。如果情况复杂,需要分开设置
7、整形
类型 | 字节 | 最小值(有符号/无符号) | 最大值(有符号/无符号) |
---|---|---|---|
TINYINT | 1 | -128/0 | 127/255 |
SMALLINT | 2 | -32768/0 | 32767/65535 |
MEDIUMINT | 3 | -8388608/0 | 8388607/16777215 |
INT/INTEGE | 4 | -2147483648/0 | 2147483647 /4294967295 |
BIGINT | 8 | -9223372036854775808/0 | 9223372036854775807/18446744073709551615 |
- 可使用unsigned控制是否有正负
- 可以使用zerofill来进行前导零填充
- 也存在 布尔bool类型,但是就是tinyint(1)的别名
8、小数
类型 | 存储空间(字节) | 最小值(理论) | 最大值(理论) |
---|---|---|---|
FLOAT | 4 | -3.402823466E+38 | 3.402823466E+38 |
DOUBLE | 8 | -1.7976931348623157E+308 | 1.7976931348623157E+308 |
DECIMAL | 变长,大致是每9个数字,采用4个字节存储。整数和分数分开计算 | M,最大是65 D,最大是30 默认是10,2 -(65个9) | (+65个9) |
(1)浮点:小数位数可以变化。
浮点型数据:(小数位可以变化)
float单精度:默认精度位数为 6位左右
double双精度:默认为16左右
支持,控制数值的范围。
Type(M,D)
M表示所有的数值位数(不包括小数点,和符号。但包括小数的)
D,表示允许的小数位数。
(2)定点数
decimal(M,D)
M总位数
D小数位数。(范围存在)
M默认为10,D默认为0;
9、日期时间
类型 | 显示格式 | 取值 | 存储空间 | 零值 |
---|---|---|---|---|
DATETIME | YYYY-MM-DD HH:MM:SS | ‘1000-01-01 00:00:00’到’9999-12-31 23:59:59’ | 8 | 0000-00-00 00:00:00 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 是‘1970-01-01 00:00:00’到2038-01-19 03:14:07 | 4 | 0000-00-00 00:00:00 |
DATE | YYYY-MM-DD | ‘1000-01-01’到’9999-12-31 | 3 | 0000-00-00 |
TIME | HH:MM:SS | -838:59:59’到’838:59:59’ | 3 | 00:00:00 |
YEAR | YYYY | 1901到2155 | 1 | 0000 |
- 年月日时分秒(Datetime类型)
时间戳(Timestamp类型)
存储时,整型,
但是表示时,日期时间。
0 -21多亿
范围: 1970.1.1 0:0:0 到 2038-01-19 03:14:07UTC
年月日(Date类型)
特点:支持 任意分隔符的日期:(如下图所示:会对当前的时间的合理范围进行判断,不需要时间分隔符。如超出正常时间范围会出现错误提示)
Time类型
TIME特点:TIME类型不仅可以用于表示一天的时间,还可以表示一个间隔时间(或者过去了多久)
因此该类型可以设置为多个小时,甚至是 几天几小时几分钟几秒的情况 D HH:II:SS。
同样在设置时分秒时,可以使用其他标点符号作为分隔符,甚至是不用(用天了就不行了)。
表示意义:
1、一天中的时间
2、表示时间间隔,在表示间隔时,可以使用天来表示。格式:
D HH:MM:SS
D代表的是天数。例如:(如下面2中(之前设置了是time类型的):有时间间隔符的和没有时间间隔符的)
Year类型
此时日期的范围,就不是1000-9999,而是 1901-2155 一个字节表示。首先要设置表格属性
1
create tabley_1('begin' year);
如果做一个php项目,通常,保存时间都是 时间戳( timestamp),是unix时间戳,直接以整型的形式保存在数据库内,不是mysql提供 timestamp类型。
10、字符串类型
类型 | 最大长度 | 备注 |
---|---|---|
char | 255 | Char(M),M字符数 |
varchar | 65535,但需要1-2个保存信息,同时由于记录的限制,因此最大为65532 | 编码不同字符数不同: Gbk<=32767 Utf8<=21845 |
tinyText,text,mediumText,longtext | L + n。L为最大长度 2^8+1, 2^16+2, 2^24+3, 2^32+4 | 定义时,通常不用指定长度,可以自己计算。 |
enum | 1、2。枚举选项量(65535) | 内部存储是整型表示。 字段值只能是某一个 |
Set | 1、2、3、4、8。元素数量:64 | |
Binary,varbinary,blob | Binary(char),varbinary(varchar),blob(text) 做类比 | 二进制数据(字节而非字符) |
Char和Varchar类型
Char(M) 固定长度。 其中,M表示:允许的字符串长度。char内M表示严格限定的长度。
Varchar(M) 可变长度。 其中,M在varchar中的表示:是允许的最大长度。
Text
最大长度:2^16+2(需要额外2个字节存储记录长度)
特点:定义时,通常不用指定长度,可以自己计算。文本,有很多 兄弟类型。Tinytext longtext 等等(具体看最上方的表格)。表示的字符串长度不一样。
枚举
Enum 枚举选项量(65535)
特点:看上去是一个字符串,其实,内部存储是整型表示。字段值只能是某一个
set类型
特点:8个字节,所以总共64位,即总共表示64个元素 集合
1
Set(‘value1’,’value2’,…);
表示可以选择可用值的0个或多个组合
Binary类型
二进制类型:(特点:二进制数据(字节而非字符))
如果需要保存一个二进制文件内容的话,应该保存成这些类型。
11、列属性
- 如何选择:(参考原因)
参考原因
1,应该使用最精确的类型。占用的空间少。
2,还应该考虑到相关应用语言的处理。例如常常将时间日期保存成一个整型。便于计算。
3,考虑移植的兼容性。
- 列属性,列约束
约束:保证表的结构和数据的正确性和稳定性。
总的来说有五种:唯一性和主键约束、外键约束、检查约束、空值约束、默认值约束,有五大关键词,UNIQUE和Primary Key, Foreign Key,CHECK, NOT NULL, DEFAULT 。