mySQL(一)
创建数据库
在MySQL中,可以使用CREATE DATABASE语句创建数据库,语法格式如下:
1 | CREATE DATABASE [IF NOT EXISTS] <数据库名> |
语法说明如下。
● <数据库名>:创建数据库的名称。MySQL的数据存储区将以目录方式表示MySQL数据库,因此数据库名称必须符合操作系统的文件夹命名规则,注意在MySQL中不区分大小写。
● IF NOT EXISTS:在创建数据库之前进行判断,只有该数据库目前尚不存在时才能执行操作。此选项可以用来避免数据库已经存在而重复创建的错误。
一般在语法格式描述中会使用如下符号。
● < >:表示在语句中必须指定的数据对象,是不可缺少的。
● [ ]:表示可以根据需要进行选择,也可以不选。
● | :表示多个选项只能选择其一。
● { }:表示必选项。
创建并查看数据库
在MySQL中,可使用SHOW DATABASES语句来查看可用的数据库列表。查看数据库的语法格式为:
1 | SHOW DATABASE [LIKE <数据库名>] |
语法说明如下。
● LIKE:可选项,LIKE从句用于匹配指定的数据库名称。
● SHOW DATABASES用于查看当前用户权限范围内的数据库。
修改数据库
在MySQL中,可以使用ALTER DATABASE或ALTER SCHEMA语句来修改已经被创建或者存在的数据库的相关参数。修改数据库的语法格式为:
1 | ALTER DATABASE [数据库名] {[DEFAULT] CHARACTER SET <字符集名> | [DEFAULT] COLLATE <校对规则名>} |
语法说明如下:
● ALTER DATABASE用于更改数据库的全局特性。这些特性存储在数据库目录的db.opt文件中。
● 使用ALTER DATABASE需要获得数据库ALTER权限。
● 数据库名称可以忽略,此时语句对应于默认数据库。
● CHARACTER SET子句用于更改默认的数据库字符集。
删除数据库
在MySQL中,当需要删除已创建的数据库时,可以使用DROP DATABASE或DROP SCHEMA语句。其语法格式为:
1 | DROP DATABASE [IF EXISTS] <数据库名> |
语法说明如下。
● <数据库名>:指定要删除的数据库名。
● IF EXISTS:用于防止当数据库不存在时发生错误。
● DROP DATABASE:删除数据库中的所有表格并同时删除数据库。使用此语句时要非常小心,以免错误删除。如果要使用DROP DATABASE,需要获得数据库DROP权限。
选择数据库
在MySQL中,USE命令用来完成一个数据库到另一个数据库的跳转。当用CREATE DATABASE语句创建数据库之后,该数据库不会自动成为当前数据库,需要用USE来指定当前数据库。其语法格式为:
1 | USE <数据库名> |
选择数据库的语法说明如下:
● USE <数据库名>可以通知MySQL把<数据库名>所示的数据库作为当前数据库。该数据库保持为默认数据库,直到语段的结尾,或者直到发布一个不同的USE语句。
只有使用USE命令来指定某个数据库作为当前数据库之后,才能对该数据库及其存储的数据对象执行操作。
存储引擎
MySQL 5.7支持的存储引擎有InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE等。
如果要提供提交、回滚和恢复的事务安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个很好的选择。如果数据表主要用来插入和查询记录,则MyISAM引擎提供较高的处理效率。如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存的MEMORY引擎中,MySQL中使用该引擎作为临时表,存放查询的中间结果。如果只有INSERT和SELECT操作,可以选择Archive引擎,Archive存储引擎支持高并发的插入操作,但是本身并不是事务安全的。Archive存储引擎非常适合存储归档数据,如记录日志信息可以使用Archive引擎。
InnoDB是系统的默认引擎,支持可靠的事务处理。使用语句“SET default_storage_engine=<存储引擎名>”可以修改数据库临时的默认存储引擎。
数据类型
数据类型(data_type)是指系统中所允许的数据的类型。
数据库中的每个列都应该有适当的数据类型,用于限制或允许该列中存储的数据。例如,列中存储的为数字,则相应的数据类型应该为数值类型。使用数据类型有助于对数据进行正确排序,并在优化磁盘使用方面起着重要的作用。因此,在创建表时必须为每个列设置正确的数据类型及可能的长度。
MySQL的数据类型分别有整数、浮点数和定点数类型、日期和时间类型、字符串类型和二进制类型等。
整数类型
数值型数据类型主要用来存储数字,MySQL提供了多种数值型数据类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,所需的存储空间也会越大。MySQL主要提供的整数类型有TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,其属性字段可以添加AUTO_INCREMENT自增约束条件。
浮点数类型和定点数类型
MySQL中使用浮点数和定点数来表示小数。浮点类型有两种:单精度浮点数(FLOAT)和双精度浮点数(DOUBLE)。定点类型只有一种:DECIMAL。浮点类型和定点类型都可以用(M, N)来表示,其中M称为精度,表示总共的位数;N称为标度,表示小数的位数。
在MySQL中,定点数以字符串形式存储,在对精度要求比较高的时候(如货币、科学数据),使用DECIMAL的类型比较好,另外两个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。
日期与时间类型
MySQL中有多处表示日期的数据类型:YEAR、TIME、DATE、DTAETIME、TIMESTAMP。当只记录年信息的时候,可以只使用YEAR类型。每一个类型都有合法的取值范围,当指定确定不合法的值时,系统将“零”值插入数据库中。
(1)YEAR类型
YEAR类型是一个单字节类型,用于表示年,在存储时只需要1个字节。可以使用各种格式指定YEAR,如下所示。
● 以4位字符串或者4位数字格式表示的YEAR,范围为’1901’~’2155’。输入格式为’YYYY’或者YYYY,例如,输入’2010’或2010,插入数据库的值均为2010。
● 以2位字符串格式表示的YEAR,范围为’00’到’99’。’00’~’69’和’70’~’99’范围的值分别被转换为2000~2069和1970~1999范围的YEAR值。’0’与’00’的作用相同。插入超过取值范围的值将被转换为2000。
● 以2位数字表示的YEAR,范围为1~99。1~99和70~99范围的值分别被转换为2001~2069和1970~1999范围的YEAR值。注意,在这里0值将被转换为0000,而不是2000。
(2)TIME类型
TIME类型用于只需要时间信息的值,在存储时需要3个字节。格式为HH:MM:SS。HH表示小时,MM表示分钟,SS表示秒。TIME类型的取值范围为-838:59:59~838:59:59,小时部分如此大的原因是TIME类型不仅可以用于表示一天的时间(必须小于24小时),还可能是某个事件过去的时间或两个事件之间的时间间隔(可大于24小时,或者甚至为负)。可以使用各种格式指定TIME值,如下所示。
●’D HH:MM:SS’格式的字符串。还可以使用这些“非严格”的语法:’HH:MM:SS’、’HH:MM’、’DHH’或’SS’。这里的D表示日,可以取0~34之间的值。在插入数据库时,D被转换为小时保存,格式为“D*24+HH”。
●’HHMMSS’格式、没有间隔符的字符串或者HHMMSS格式的数值,假定是有意义的时间。例如,’101112’被理解为’10:11:12’,但是’101112’是不合法的(它有一个没有意义的分钟部分),在存储时将变为00:00:00。
(3)DATE类型
DATE类型用于仅需要日期值时,没有时间部分,在存储时需要3个字节。日期格式为’YYYY-MM-DD’,其中YYYY表示年,MM表示月,DD表示日。在给DATE类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合DATE的日期格式即可。
● 以’YYYY-MM-DD’或者’YYYYMMDD’字符中格式表示的日期,取值范围为’1000-01-01’~’9999-12-3’。例如,输入’2015-12-31’或者’20151231’,插入数据库的日期为2015-12-31。
● 以’YY-MM-DD’或者’YYMMDD’字符串格式表示日期,在这里YY表示两位的年值。MySQL解释两位年值的规则:’00~69’范围的年值转换为’20002069’, ‘7099’范围的年值转换为’1970~1999’。例如,输入’15-12-31’,插入数据库的日期为2015-12-31;输入’991231’,插入数据库的日期为1999-12-31。
● 以YY-MM-DD或者YYMMDD数字格式表示的日期,与前面相似,00~69范围的年值转换为2000~2069,80~99范围的年值转换为1980~1999。例如,输入15-12-31,插入数据库的日期为2015-12-31,输入991231,插入数据库的日期为1999-12-31。
● 使用CURRENT_DATE或者NOW(),插入当前系统日期。
(4)DATETIME类型
DATETIME类型用于需要同时包含日期和时间信息的值,在存储时需要8个字节。日期格式为’YYYY-MM-DDHH:MM:SS’,其中YYYY表示年,MM表示月,DD表示日,HH表示小时,MM表示分钟,SS表示秒。在给DATETIME类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合DATETIME的日期格式即可,如下所示。
● 以’YYYY-MM-DD HH:MM:SS’或者’YYYYMMDDHHMMSS’字符串格式表示的日期,取值范围为’1000-01-01 00:00:00’~’9999-12-3 23:59:59’。例如,输入’2014-12-3105:05:05’或者’20141231050505’,插入数据库的DATETIME值都为2014-12-31 05:05:05。
● 以’YY-MM-DD HH:MM:SS’或者’YYMMDDHHMMSS’字符串格式表示的日期,在这里YY表示两位的年值。与前面相同,’00~79’范围的年值转换为’2000~2079’, ‘80~99’范围的年值转换为’1980~1999’。例如,输入’14-12-31 05:05:05’,插入数据库的DATETIME为2014-12-31 05:05:05;输入141231050505,插入数据库的DATETIME为2014-12-31 05:05:05。
● 以’YYYYMMDDHHMMSS’或者’YYMMDDHHMMSS’数字格式表示的日期和时间。例如,输入20141231050505,插入数据库的DATETIME为2014-12-31 05:05:05;输入140505050505,插入数据库的DATETIME为2014-12-31 05:05:05。
(5)TIMESTAMP类型
TIMESTAMP的显示格式与DATETIME相同,显示宽度固定在19个字符,日期格式为YYYY-MM-DD HH:MM:SS,在存储时需要4个字节。但是TIMESTAMP列的取值范围小于DATETIME的取值范围,为’1970-01-01 00:00:01’UTC~’2038-01-19 03:14:07’ UTC。在插入数据时,要保证在合法的取值范围内。
TIMESTAMP与DATETIME除了存储字节和支持的范围不同外,还有一个最大的区别是:DATETIME在存储日期数据时,按实际输入的格式存储,即输入什么就存储什么,与时区无关;而TIMESTAMP值的存储是以UTC(世界标准时间)格式保存的,存储时对当前时区进行转换,检索时再转换回当前时区。即查询时,根据当前时区的不同,显示的时间值是不同的。
字符串和二进制类型
字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据。字符串可以区分或者不区分大小写的串比较,还可以进行正则表达式的匹配查找。MySQL中的字符串类型有CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM、SET等。
VARCHAR、BLOB和TEXT类型是变长类型,其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型的最大可能尺寸。例如,一个VARCHAR(10)列能保存一个最大长度为10个字符的字符串,实际的存储需要字符串的长度L加上一个字节以记录字符串的长度。对于字符“abcd”, L是4,而存储要求5个字节。
(1)CHAR和VARCHAR类型
CHAR(M)为固定长度字符串,在定义时指定字符串列长。当保存时,在右侧填充空格以达到指定的长度。M表示列的长度,范围是0~255个字符。例如,CHAR(4)定义了一个固定长度的字符串列,包含的字符个数最大为4。当检索到CHAR值时,尾部的空格将被删除。
VARCHAR(M)是长度可变的字符串,M表示最大列的长度,M的范围是0~65535。VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,而实际占用的空间为字符串的实际长度加1。例如,VARCHAR(50)定义了一个最大长度为50的字符串,如果插入的字符串只有10个字符,则实际存储的字符串为10个字符和一个字符串结束字符。VARCHAR在值保存和检索时尾部的空格仍保留。
(2)TEXT类型
TEXT列保存非二进制字符串,如文章内容、评论等。当保存或查询TEXT列的值时,不删除尾部空格。TEXT类型分为4种:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。不同的TEXT类型的存储空间和数据长度不同。
TINYTEXT表示长度为255(28-1)字符的TEXT列。
TEXT表示长度为65535(216-1)字符的TEXT列。
MEDIUMTEXT表示长度为16777215(224-1)字符的TEXT列。
LONGTEXT表示长度为4294967295或4GB(232-1)字符的TEXT列。
(3)ENUM类型ENUM是一个字符串对象,值为表创建时列规定中枚举的一列值。其语法格式如下:
1 | <字段名> ENUM ('值1','值2',...'值n') |
字段名指将要定义的字段,值n指枚举列表中第n个值。ENUM类型的字段在取值时,能在指定的枚举列表中获取,而且一次只能取一个。如果创建的成员中有空格,尾部的空格将自动被删除。ENUM值在内部用整数表示,每个枚举值均有一个索引值;列表值所允许的成员值从1开始编号,MySQL存储的就是这个索引编号,枚举最多可以有65535个元素。
ENUM值依照列索引顺序排列,并且空字符串排在非空字符串前,NULL值排在其他所有枚举值前。
(4)SET类型
SET是一个字符串的对象,可以有零或多个值,SET列最多可以有64个成员,值为表创建时规定的一列值。指定包括多个SET成员的SET列值时,各成员之间用逗号(,)隔开,语法格式如下:
1 | SET ('值1','值2',...,'值n') |
与ENUM类型相同,SET值在内部用整数表示,列表中每个值都有一个索引编号。当创建表时,SET成员值的尾部空格将自动删除。但与ENUM类型不同的是,ENUM类型的字段只能从定义的列值中选择一个值插入,而SET类型的列可从定义的列值中选择多个字符的联合。
MySQL支持两类字符型数据:文本字符串和二进制字符串。MySQL中的二进制字符串有BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。
(1)BIT类型
位字段类型。M表示每个值的位数,范围为1~64。如果M被省略,默认值为1。如果为BIT(M)列分配的值的长度小于M位,在值的左边用0填充。例如,为BIT(6)列分配一个值b’101’,其效果与分配b’000101’相同。BIT数据类型用来保存位字段值,例如以二进制的形式保存数据13,13的二进制形式为1101,在这里需要位数至少为4位的BIT类型,即可以定义列类型为BIT(4)。大于二进制1111的数据是不能插入BIT(4)类型的字段中的。
(2)BINARY和VARBINARY类型
BINARY和VARBINARY类型类似于CHAR和VARCHAR,不同的是它们包含二进制字节字符串。使用的语法格式如下:
1 | 列名称BINARY(M)或VARBINARY(M) |
BINARY类型的长度是固定的,指定长度后,不足最大长度的,将在它们右边填充“\0”补齐,以达到指定长度。例如,指定列数据类型为BINARY(3),当插入a时,存储的内容实际为“a\0\0”,当插入ab时,实际存储的内容为“ab\0”,无论存储的内容是否达到指定的长度,存储空间均为指定的值M。
VARBINARY类型的长度是可变的,指定好长度之后,长度可以在0到最大值之间。例如,指定列数据类型为VARBINARY(20),如果插入的值长度只有10,则实际存储空间为10加1,实际占用的空间为字符串的实际长度加1。
(3)BLOB类型BLOB是一个二进制的对象,用来存储可变数量的数据。BLOB类型分为4种:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,它们可容纳值的最大长度不同。