使⽤SQL语句操作数据表-数据类型
SQl语句操作数据表
SQL语句操作数据表
回顾结构化查询语⾔
vb中datediff在MySQL中实现对数据库查询和操作的语⾔称为SQL,SQl的全称是结构化查询语⾔。
SQL语⾔包括以下四个部分。
(1)DML(数据操作语⾔):⽤来插⼊,修改和删除表中的数据,如 INSERT,UPDATE,DELETE语句。
(2)DDL(数据定义语⾔):在数据库中创建或删除数据库对象操作,如CREATE,DROP,ALER等语句。
(3)DQL(数据查询语⾔):⽤来对数据库中的数据进⾏查询,指SELECT语句。
(4)DCL(数据控制语⾔):⽤来控制数据库组件的存取许可,存取权限等,如GRANT,REVOKE等。
数据类型
三角形计算公式数据类型(data_type)是指系统中所允许的数据的类型。
数据库中的每个列都应该有适当的数据类型,⽤于限制或允许该列中存储的数据。例如,列中存储的为数字,则相应的数据类型应该为数值类型。
使⽤数据类型有助于对数据进⾏正确排序,并在优化磁盘使⽤⽅⾯起着重要的作⽤。因此,在创建表时必须为每个列设置正确的数据类型及可能的长度。
MySQL 常见数据类型
在 MySQL 中常见的数据类型如下:
1. 整数类型
包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,浮点数类型 FLOAT 和 DOUBLE,定点数类型 DECIMAL。
2. ⽇期/时间类型
包括 YEAR、TIME、DATE、DATETIME 和 TIMESTAMP。
3. 字符串类型
包括 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET 等。
4. ⼆进制类型
包括 BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。
整数类型
整数类型⼜称数值型数据,数值型数据类型主要⽤来存储数字。
MySQL 提供了多种数值型数据类型,不同的数据类型提供不同的取值范围,可以存储的值范围越⼤,所需的存储空间也会越⼤。
MySQL 主要提供的整数类型有 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,其属性字段可以添加 AUTO_INCREMENT ⾃增约束条件。下表中列出了 MySQL 中的数值类型。
类型名称说明存储需
求
取值范围
TINYINT很⼩的整数1个字节有符号值: -128〜127 ⽆符号值: 0 〜255 SMALLINT⼩的整数2个宇节有符号值: -32768〜32767 ⽆符号值: 0〜65535
MEDIUMINT 中等⼤⼩的整
数
3个字节有符号值:-8388608〜8388607 ⽆符号值:0〜16777215
INT (INTEGHR)普通⼤⼩的整
数
4个字节有符号值:-2147483648〜2147483647 ⽆符号值:0〜4294967295
BIGINT⼤整数8个字节有符号值: -9223372036854775808〜9223372036854775807 ⽆符号值: 0〜
18446744073709551615
类型名称说明存储需
求
取值范围
从上表中可以看到,不同类型的整数存储所需的字节数不相同,占⽤字节数最⼩的是 TINYINT 类型,占⽤字节最⼤的是 BIGINT 类型,占⽤的字节越多的类型所能表⽰的数值范围越⼤。如果超出了该类型的取值范围,则插⼊的值被截断并显⽰警告信息。
根据占⽤字节数可以求出每⼀种数据类型的取值范围。例如,TINYINT 需要 1 个字节(8bit)来存储,那么 TINYINT ⽆符号数的最⼤值为28-1,即 255;TINYINT 有符号数的最⼤值为 27-1,即 127。其他类型的整数的取值范围计算⽅法相同,如下表所⽰。
提⽰:显⽰宽度和数据类型的取值范围是⽆关的。显⽰宽度只是指明 MySQL 最⼤可能显⽰的数字个数,数值的位数⼩于指定的宽度时会由空格填充。如果插⼊了⼤于显⽰宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插⼊,⽽且能够显⽰出来。例如,year
字段插⼊ 19999,当使⽤ SELECT 查询该列值的时候,MySQL 显⽰的将是完整的带有 5 位数字的 19999,⽽不是 4 位数字的值。
其他整型数据类型也可以在定义表结构时指定所需的显⽰宽度,如果不指定,则系统为每⼀种类型指定默认的宽度值。
不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此应根据实际需要选择最合适的类型,这样有利于提⾼查询的效率和节省存储空间。
若数据位数⼤于显⽰宽度,只要不超过该类型取值类型范围,则以实际位数显⽰;反之数据位数如果⼩于指定宽度时以空格填充。如果需要以0填充不⾜的位置,需要在类型后添加zerofll关键字。
例如: 创建tb_type1,其中包含⼀个sid字段,类型为INF型且宽度为4,不⾜4位以0填充。
Use test
CREATE TABLE'tb_type1'(
'sid' INF(4) ZEROFILL
);
#插⼊数据
INSERT INTO ‘tb_type1’ VALUE(12),(1234),(123456);
⼩数类型
MySQL 中使⽤浮点数和定点数来表⽰⼩数。
浮点类型有两种,分别是单精度浮点数(FLOAT)和双精度浮点数(DOUBLE);定点类型只有⼀种,就是 DECIMAL。
浮点类型和定点类型都可以⽤(M, D)来表⽰,其中M称为精度,表⽰总共的位数;D称为标度,表⽰⼩数的位数。
浮点数类型的取值范围为 M(1~255)和 D(1~30,且不能⼤于 M-2),分别表⽰显⽰宽度和⼩数位数。M 和 D 在 FLOAT 和DOUBLE 中是可选的,FLOAT 和 DOUBLE 类型将被保存为硬件所⽀持的最⼤精度。DECIMAL 的默认 D 值为 0、M 值为 10。
下表中列出了 MySQL 中的⼩数类型和存储需求。
类型名称说明存储
proofread是什么意思需求
取值范围
FLOAT 单精度浮点
数
4 个
字节
有符号的取值范围:-3.402823466E+38~-1.175494351E-38。⽆符号的取值范围:0 和 -1.175494351E-38~-
3.402823466E+38。
DOUBLE 双精度浮点
数
8 个
字节
有符号的取值范围:-1.7976931348623157E+308~-2.2250738585072014E-308。⽆符号的取值范围:0 和 -
2.2250738585072014E-308~-1.7976931348623157E+308。
DECIMAL (M, D),DEC 压缩
的“严
格”定点数
M+2
个字
节
M:最⼤精度位数即总位数,M的取值范围是1~65,默认值为10 D:⼩数位精度位数,D的取值范围是0~30 该类型可能
的取值范围与DOUBLE相同,但有效取值的范围由M,D决定。例如:类型为DECIMAL(5,2)的字段取值范围是-
999.99~999.99;
DECIMAL 类型不同于 FLOAT 和 DOUBLE。DOUBLE 实际上是以字符串的形式存放的,DECIMAL 可能的最⼤取值范围与 DOUBLE 相同,但是有效的取值范围由 M 和 D 决定。
从上表中可以看到,DECIMAL 的存储空间并不是固定的,⽽由精度值 M 决定,占⽤ M+2 个字节。
提⽰:不论是定点还是浮点类型,如果⽤户指定的精度超出精度范围,则会四舍五⼊进⾏处理。
FLOAT 和 DOUBLE 在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定),DECIMAL 如果不指定精度,默认为(10,0)。
浮点数相对于定点数的优点是在长度⼀定的情况下,浮点数能够表⽰更⼤的范围;缺点是会引起精度问题。
最后再强调⼀下:在 MySQL 中,定点数以字符串形式存储,在对精度要求⽐较⾼的时候(如货币、科学数据),使⽤ DECIMAL 的类型⽐较好,另外两个浮点数进⾏减法和⽐较运算时也容易出问题,所以在使⽤浮点数时需要注意,并尽量避免做浮点数⽐较。
数据类型都包含有符号数和⽆符号数两类,默认为有符号数,即可以保持负数,如该字段为⾮负数,则需添加UNSIGNED属性。例如,创建tb_type2 表,定义sid字段为INT类型⽆符号数,语句如下。
create table'tb_type2'(
'sid'INT(4)UNSIGNED
);
提⽰如果为某数值字段指定了ZEROFILL属性,MySQL 将⾃动为该字段添加UNSIGNED属性。
⽇期和时间类型
MySQL 中有多处表⽰⽇期的数据类型:YEAR、TIME、DATE、DTAETIME、TIMESTAMP。当只记录年信息的时候,可以只使⽤ YEAR 类型。
每⼀个类型都有合法的取值范围,当指定确定不合法的值时,系统将“零”值插⼊数据库中。
下表中列出了 MySQL 中的⽇期与时间类型。
类型名称⽇期格式⽇期范围存储需求
YEAR YYYY1901 ~ 2155 1 个字节sql程序设计
TIME HH:MM:SS-838:59:59 ~ 838:59:59 3 个字节
DATE YYYY-MM-DD1000-01-01~ 9999-12-3
DATETIME YYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
TIMESTAMP YYYY-MM-DD HH:MM:SS1980-01-01 00:00:01 UTC ~ 2040-01-19 03:14:07 UTC
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。
mysql语句分类以 2 位数字表⽰的 YEAR,范围为 1~99。1~99 和 70~99 范围的值分别被转换为 2001~2069 和 1970~1999 范围的 YEAR 值。注意,在这⾥ 0 值将被转换为 0000,⽽不是 2000。
**提⽰:**两位整数范围与两位字符串范围稍有不同。例如,插⼊ 3000 年,读者可能会使⽤数字格式的 0 表⽰ YEAR,实际上,插⼊数据库的值为 0000,⽽不是所希望的 3000。只有使⽤字符串格式的 ‘0’ 或 ‘00’,才可以被正确解释为 3000,⾮法 YEAR值将被转换为 0000。
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’、‘D HH’ 或
‘SS’。这⾥的 D 表⽰⽇,可以取 0~34 之间的值。在插⼊数据库时,D 被转换为⼩时保存,格式为 “D*24+HH”。
‘HHMMSS’ 格式、没有间隔符的字符串或者 HHMMSS 格式的数值,假定是有意义的时间。例如,‘101112’ 被理解为’10:11:12’,但是 ‘106112’ 是不合法的(它有⼀个没有意义的分钟部分),在存储时将变为 00:00:00。
提⽰:为 TIME 列分配简写值时应注意:如果没有冒号,MySQL 解释值时,假定最右边的两位表⽰秒。(MySQL 解释 TIME 值为过去的时间⽽不是当前的时间)。例如,读者可能认为 ‘1112’ 和 1112 表⽰ 11:12:00(即 11 点过 12 分钟),但MySQL 将它们解释为 00:11:12(即 11 分 12 秒)。同样 ‘12’ 和 12 被解释为00:00:12。相反,TIME 值中如果使⽤冒号则肯定被看作当天的时间,也就是说,‘11:12’ 表⽰ 11:12:00,⽽不是 00:11:12。
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’范围的年值转换为 ‘200099’ 范围的年值转换为 ‘1970~1999’。例如,输⼊ ‘15-12-31’,插⼊数据库的⽇期为2015-12-31;输⼊ ‘991231’,插⼊数据库的⽇期为 1999-12-31。
以 YYMMDD 数字格式表⽰的⽇期,与前⾯相似,00~69 范围的年值转换为 2000~2069,80~99 范围的年值转换为 1980~1999。例如,输⼊ 151231,插⼊数据库的⽇期为 2015-12-31,输⼊ 991231,插⼊数据库的⽇期为 1999-12-31。使⽤ CURRENT_DATE 或者 NOW(),插⼊当前系统⽇期。
提⽰:MySQL 允许“不严格”语法:任何标点符号都可以⽤作⽇期部分之间的间隔符。例如,‘98-11-31’、‘98.11.31’、‘98/11/31’和’98@11@31’ 是等价的,这些值也可以正确地插⼊数据库。
DATETIME 类型
DATETIME 类型⽤于需要同时包含⽇期和时间信息的值,在存储时需要 8 个字节。⽇期格式为 ‘YYYY-MM-DD HH: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-31 05: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-3105: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。提⽰:MySQL 允许“不严格”语法:任何标点符
号都可⽤作⽇期部分或时间部分之间的间隔符。例如,‘98-12-31 11:30:45’、‘98.12.31 11+30+35’、‘98/12/31 113045’ 和 ‘98@12@31 1145’ 是等价的,这些值都可以正确地插⼊数据库。
TIMESTAMP 类型
TIMESTAMP 的显⽰格式与 DATETIME 相同,显⽰宽度固定在 19 个字符,⽇期格式为 YYYY-MM-DD HH:MM:SS,在存储时需要4 个字节。但是 TIMESTAMP 列的取值范围⼩于 DATETIME 的取值范围,为 '1970-01-01 00:00:01’UT~’2038-01-19 03:14:07’UTC。在插⼊数据时,要保证在合法的取值范围内。
**提⽰:**协调世界时(英:Coordinated Universal Time,法:Temps Universel Coordonné)⼜称为世界统⼀时间、世界标准时间、国际协调时间。英⽂(CUT)和法⽂(TUC)的缩写不同,作为妥协,简称 UTC。TIMESTAMP 与 DATETIME 除了存储字节和⽀持的范围不同外,还有⼀个最⼤的区别是:DATETIME 在存储⽇期数据时,按实际输⼊的格式存储,即输⼊什么就存储什么,与时区⽆关;
⽽ TIMESTAMP 值的存储是以 UTC(世界标准时间)格式保存的,存储时对当前时区进⾏转换,检索时再转换回当前时区。即查询时,根据当前时区的不同,显⽰的时间值是不同的。
**提⽰:**如果为⼀个 DATETIME 或 TIMESTAMP 对象分配⼀个 DATE 值,结果值的时间部分被设置为 ‘00:00:00’,因此 DATE 值未包含时间信息。如果为⼀个 DATE 对象分配⼀个 DATETIME 或 TIMESTAMP 值,结果值的时间部分被删除,因此DATE 值未包含时间信息。
字符串类型
2069’,'7030
CHAR类型字节数是M,适合存储少量字符串,VARCHAR类型长度是可变的,当字符串的长度经常变化是,为了节省空间,可设置为VARCHAR类型,其长度范围是0~65535.TINYTEXT和TEXT类型⽤来存储⽂章内容等纯⽂本。
字符串类型⽤来存储字符串数据,还可以存储图⽚和声⾳的⼆进制数据。字符串可以区分或者不区分⼤⼩写的串⽐较,还可以进⾏正则表达式的匹配查。
MySQL 中的字符串类型有 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET 等。
下表中列出了 MySQL 中的字符串数据类型,括号中的M表⽰可以为其指定长度。
类型名称说明存储需求
CHAR(M)固定长度⾮⼆进制字符串M 字节,1<=M<=255 VARCHAR(M)变长⾮⼆进制字符串L+1字节,在此,L< = M和 1<=M<=255
TINYTEXT⾮常⼩的⾮⼆进制字符串L+1字节,在此,L<2^8 TEXT⼩的⾮⼆进制字符串L+2字节,在此,L<2^16 MEDIUMTEXT中等⼤⼩的⾮⼆进制字符串L+3字节,在此,L<2^24
LONGTEXT⼤的⾮⼆进制字符串L+4字节,在此,L<2^32 ENUM枚举类型,只能有⼀个枚举字符串值1或2个字节,取决于枚举值的数⽬ (最⼤值为65535)
SET⼀个设置,字符串对象可以有零个或 多个SET成员1、2、3、4或8个字节,取决于集合 成员的数量(最多64个成员)
VARCHAR 和 TEXT 类型是变长类型,其存储需求取决于列值的实际长度(在前⾯的表格中⽤ L 表⽰),⽽不是取决于类型的最⼤可能尺⼨。
例如,⼀个 VARCHAR(10) 列能保存⼀个最⼤长度为 10 个字符的字符串,实际的存储需要字符串的长度 L 加上⼀个字节以记录字符串的长度。对于字符 “abcd”,L 是 4,⽽存储要求 5 个字节。
CHAR 和 VARCHAR 类型
CHAR(M) 为固定长度字符串,在定义时指定字符串列长。当保存时,在右侧填充空格以达到指定的长度。M 表⽰列的长度,范围是 0~255 个字符。
例如,CHAR(4) 定义了⼀个固定长度的字符串列,包含的字符个数最⼤为 4。当检索到 CHAR 值时,尾部的空格将被删除。
VARCHAR(M) 是长度可变的字符串,M 表⽰最⼤列的长度,M 的范围是 0~65535。VARCHAR 的最⼤实际长度由最长的⾏的⼤⼩和使⽤的字符集确定,⽽实际占⽤的空间为字符串的实际长度加 1。sklearn教程
例如,VARCHAR(50) 定义了⼀个最⼤长度为 50 的字符串,如果插⼊的字符串只有 10 个字符,则实际存储的字符串为 10 个字符和⼀个字符串结束字符。VARCHAR 在值保存和检索时尾部的空格仍保留。
【实例】下⾯将不同的字符串保存到 CHAR(4) 和 VARCHAR(4) 列,说明 CHAR 和 VARCHAR 之间的差别,如下表所⽰。
插⼊值CHAR(4)存储需求VARCHAR(4)存储需求
’ ’’ ’4字节‘’1字节
‘ab’'ab ’4字节‘ab’3字节
‘abc’'abc ’4字节‘abc’4字节
‘abcd’‘abcd’4字节‘abcd’5字节
‘abcdef’‘abcd’4字节‘abcd’5字节
对⽐结果可以看到,CHAR(4) 定义了固定长度为 4 的列,⽆论存⼊的数据长度为多少,所占⽤的空间均为 4 个字节。VARCHAR(4) 定义的列所占的字节数为实际长度加 1。
TEXT 类型
TEXT 列保存⾮⼆进制字符串,如⽂章内容、评论等。当保存或查询 TEXT 列的值时,不删除尾部空格。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论