mysql 学习小札(3)-- 数据的处理

本文详细介绍了MySQL中的数据类型、列类型及其属性,包括数值类型、字符串类型、日期时间类型、NULL值处理,以及如何选择合适的列类型以提高性能。此外,还讨论了表达式、类型转换、模式匹配、运算符优先级等内容。
摘要由CSDN通过智能技术生成
一、mysql数据类型
          
     1) 数值值
          ■ 十六进制的数不区分大小写,但其前缀0x不能为0X,即0x0A和0x0a合法,0X0a不合法 ★★★
          ■ 科学计数法 → 1.34E+12、1.34e-12都是合法的,但1.24E12不合法,指数前的符号必须给出
          
     2)字符串值
          ■ 既可用单引号,也可用双引号
          ■ NUL为一个零值(\0 ASCII 0),NULL为没有值 ★★★
          ■ 串中再使用引号 → 若串使用相同的引号,则在串中在需要使用引号的地方双写即可
                                     → 若串使用不同的引号,则在串中在需要使用引号的地方直接用即可
                                     → 用反斜杠的方式表示
          
     3)日期、时间值
          ■ DATE_FORMATE()函数以任意形式显示时间值
          
     4)NULL值
          ■ 无类型的值,可对其进行检索,但不能对其进行算术运算


二、列类型
     
     1)概述     
          ■ 数值列类型 → TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL
          ■ 串列类型 → CHAR、VARCHAR、TINYBLOB、BLOB、MEDIUM、BOLB、LONGBLOB
                           → TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、 ENUMSET
          ■ 时间与日期类型 → DATE(YYYY-MM-DD)、TIME(hh:mm:ss)
                                     → DATETIME(YYYY-MM-DD hh:mm:ss)、TIMESTMAP(YYYYMMDDhhmmss)、YEAR
          ■ 语法 → col_name col_type [col_attribute] [general_attributes] ★★
     
     2)数值列类型
          ■ 三种浮点数类型(FLOAT、DOUBLE、DECIMAL)→ DECIMALE(M, D) ,如DECIMAL(4,1)范围-9.9~99.9
          ■ 类型属性
               → ZEROFILL:相应列的显示值用前导零填充,达到显示宽度
               → 只用于整数列的属性 -- AUTO_INCREMENT:一般从零开始; UNSIGNED:禁用负值 ★★★
               → 通用属性NULL、NOT NULL -- 缺省为NULL; DEFAULT -- 指定缺省值
          ■ 序列号
               → LAST_INSERT_ID() 返回最近自动产生的序列编号值,若当前会话没有生成AUTO_INCREMENT则返回0
               → UPDATE seq_table SET seq = LAST_INSERT_ID(seq+1) -- 不使用AUTO_INCREMENT
                       注释:LAST_INSERT_ID(exp)后下一次调用其但不适用参数时返回exp ★★★

     3)串列类型
          ■ “通用”类型 -- 可存储二进制数据(声音和音像等)、gzip的输出数据
          ■ CHAR & VARCHAR
               → CHAR(M) -- 短于M个字节在右边加空格,但检索时去掉
               → VARCHAR(M) -- 只用必须的字节数存放,结尾空格去掉,再加一个字节记录长度               
               → CHAR(0) -- 占位符,只占一位,后期可用ALTER TABLE 修改
               → 行定长的表比可变长的容易处理,表行只在所有行为定长类型时才是定长的
               → ALTER TABLE tbl_name MODIFY c1 CHAR(10) , MODIFY c2 CHAR(10) ★★★
               
          ■ BLOB & TEXT
               → BLOB 与 TEXT 同 VARCHAR 也是可变长的 (可通过DESCRIBE tbl_name查看细节)
               → BLOB -- 区分大小写; TEXT -- 不区分大小写
               → 使用OPTIMIZE TABLE 减少碎片率以保持良好的性能
               → 若使用很大的值,则需调整max_allowed_packet参数的值

          ■ ENUM & SET
               → ENUM -- 集合中某一成员; SET -- 集合中任意或所有成员
               → 将一个错误值赋给ENUM时, mysql自动将其换成错误成员
               → SET集合成员不是顺序编号的, 每个成员对应SET值中一个二进制位
               → 如果SET列赋予一个含有未作为集合成员列出的子串的值,那么这些子串被删除 ★★★
     
     4)时间类型
          ■ TIMESTAMP -- 取值范围从19700101000000到2037年的某个时间 ↔ 对应UNIX时间(4B)
          
          ■ MYSQL 没有可在记录建立时设置为当前时间和日期,并自此以后保持不变的类型,但有实现方法 
               → 使用TIMESTAMP列,建立一个记录时,设置该列为NULL,初始化为当前时间和日期
                    INSERT INTO tbl_name (ts_col, ...) VALUES(NULL, ...)
               → 使用DATETIME列, 在建立记录时,将该值设置为NOW()     ★★★
                    INSERT INTO tbl_name(ts_col) VALUES(NOW(),...)     ★★★
               注:赋予一个明确的值使时间戳机制生效
          
          ■ MYSQL会按照年份推测规则将YEAR类型的2位值转化为4位
               → 97 得到1997, 14得到2014 但00得到0000,“00”得到2000 ★★★
          
          ■ 属性 -- 缺省时默认为NULL

          ■ MYSQL没有千年虫问题


三)选择列的属性
          ■ 表示钱用DECIMAL(M,2)类型
          
          ■ 性能与效率
               → 数值运算一般比串运算更快,如果串列的数值有限应使用ENUM或SET
               → 可索引的类型,不能对BLOB和TEXT进行索引
               → 如果定义一列为NOT NULL 其处理更快
          
          ■ 区分大小写的比较
               
               → my_col = "ABC" -- 不区分大小写
               → BINARY my_col = "ABC" -- 区分大小写
               → my_col = BINARY "ABC" -- 区分大小写

          ■ AUTO_INCREMENT、PRIMARY KEY、UNIQUE


四)表达式&类型转换

          ■ 撰写表达式
               
          ■ ANSI SQL ||作为串运算符,但在mysql中表示一个逻辑或运算
                    SELECT "ABC" || "CD" 返回0 ,串被转换成0

          ■ 比较运算符
               → IN、BETWEEN...AND...、LIKE、NOT LIKE、REGEXP、NOT REGEXP
               → <=> (两个操作数是否相等,即使为NULL)、IS NULL 、IS NOT NULL
                                    -- BINARY (BINARY "abc" = "Abc" 返回0) 
               注:除非至少有一个操作数为二进制串,否则LIKE是不区分大小写的     ★★★

          ■ 模式匹配 -- 具有NULL操作数的任何模式匹配都将失败
                      
          ■ 运算符优先级 -- 从大到小
              
          ■ 如果给函数传递一个NULL,除了那些处理NULL值得函数,其他都返回NULL  ★★★
          
          ■ 类型转换
               → 除了<=>,涉及NULL值的比较其都为NULL
               → 如果两个操作数都是串,则按串字典的顺序比较
               → 不与数进行比较的十六进制常量按二进制串进行比较 ★★
               → 一个为TIMESTAMP 或DATETIME 另一个为常量,则按TIMESTAMP比较
               → 数和串比较,串转化为数,若转换后不是数,则结果为0   ★★★
                    
               → 强制类型转换
               

          ■ 时间与日期
               → TO_DAYS("1997-04-10") 、TO_DAYS("19970410")、TO_DAYS(19970410)等同

          ■ 超范围值和非法值得转换
               → 对于数值和TIME,超出合法范围内的值被裁剪为相应取值范围内最接近的值
               → 对于非ENUM、SET的串列,太长的串会被裁剪为适合该列存储的最大长串
               → 对于日期和列,非法值被转化为该类型适当的“零值”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值