mysql使用笔记(三)

一、数值类型

1. 数值类型 
    标准sql中包含数据类型 INTEGER, SMALLINT, DECIMAL, NUMERIC,以及FLOAT, REAL, DOUBLE。mysql在此基础上进行了拓展,增加了TINYINT, MEDIUMINT, BIGINT三种长度不同的整数,以及BIT类型,用来存放位数据。

整数类型字节
TINYINT 1
SMALLINT 2
MEDIUMINT 3
INT/INTEGER 4
BIGINT 8
浮点数类型字节
FLOAT 4
DOUBLE 8
定点整数类型字节
DEC(M,D)/DECIMAL(M,D) M+2

(1.1) 整数类型 
    整数类型,mysql支持在类型名称后面的小括号内指定显示宽度,如int(5)表示当数值宽度小于5位的时候在数字前面填满宽度,如果不显式指定宽度则默认为int(11),这一般配合zero_fill一块使用,如 
create table t1(id int(5) zerofill);#表t1中的id列宽度为5位整数,如果数据位数小于5,则在前面添加0;如果数据位数大于5,仍然显示正确的数据,即不会受到数据位数的限制,只要保证该数据是个合法的4字节可以表示的整数。 
    整数类型有unsigned属性,如果一个列指定为zerofill,则mysql会自动给该列添加unsigned属性。 
    整数类型有uto_increment属性一般从1开始,每行增加1,在插入null到一个auto_increment列时,mysql插入一个比该列中当前最大值大1的值。一个表中最多只能有一个auto_increment列。对于任何想要使用auto_increment的列,应该定义为not null,并定义为primary key或定义为unique键。比如: 
create table ai (id int auto_increment not null primary key); 
create table ai(id int auto_increment not null, primary key(id)); 
create table ai(id int auto_increment not null, unique(id));

(1.2) 浮点数类型和定点数类型 
    定点数在mysql内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。浮点数和定点数都可以用类型名称后加"(M,D)"的形式来表示,M为整数加小数部分的总位数,D为小数部分的位置。float, double在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统来决定)来显示,decimal在不指定精度时,默认的整数为为10,默认的小数为为0. 
比如用默认的decimal来存放数据1.23, 则实际只会保留整数位1,小数位的.23被丢弃。

(1.3) BIT类型 
    bit位类型用于存放位字段值,BIT(M)可以用来存放多位二进制数,M范围从1到64,如果不写则默认为1位。对于位字段,直接使用SELECT命令将不会看到结果,可以用bin()(显示为二进制格式)或者hex()(显示为十六进制格式)函数进行读取。

2. 日期和时间类型

日期和时间类型字节最小值最大值
DATE 4 1000-01-01 9999-12-31
DATETIME 8 1000-01-01 00:00:00 9999-12-31 23:59:59
TIMESTAMP 4 19700101080001 2038年的某个时刻
TIME 3 -838:59:59 838:59:59
YEAR 1 1901 2155

    TIMESTAMP值返回后显示为 YYYY-MM-DD HH:MM:SS格式的字符串,显示宽度固定为19个字符;如果想要获得数字值,在TIMESTAMP列添加"+0"即可。如果需要经常插入或者更新日期为当前系统时间,则通常使用TIMESTAMP来表示;TIMESTAMP还和时区相关,插入日期时,会先转化为本地时区后存放,而从数据库取出时,也同样需要经日期转换为本地时区后显示。

3. 字符串类型 
    mysql包含CHAR, VARCHAR, BINARY, VARBINARY, BLOB, TEXT, ENUM, SET等多种字符串类型。 
(3.1) CAHR和VARCHAR类型 
    CHAR 长度为创建表时声明的长度,0-255;VARCHAR为可变长字符串。在检索时,CHAR列删除了尾部的空格,而VARCHAR保留这些空格。比如: 
create table vc(v varchar(4), c char(4)); 
insert into vc values('ab', 'ab'); 
select length(v), length(c) from vc;#结果为4, 2 
select concat(v, '+'), concat(c, '+') from vc; #显示为 ab +和 ab+. 
即,char列最后的空格在做操作时都已经被删除,而varchar依然保留空格。

(3.2) BINARY和VARBINARY类型 
    BINARY和VARBINARY包含二进制字符串而不包含非二进制字符串。当保存BINARY值时,在值的最后通过填充"0x00"以达到指定的字段定义长度。对于一个BINARY(3)列,插入'a'时,变为'a'.

(3.3) ENUM类型 
    1~255个成员的枚举需要1个字节,255~65535个成员的枚举需要2个字节,最多允许65535个成员。枚举类型的成员为 字符串类型:1个或多个字符。比如: 
create table t(en enum('hello','world'));

(3.4) SET类型 
    SET类型也是一个字符串对象,里面可以包含0~64个成员,每个成员对应一个比特位,即最多有8个比特位。 
    SET类型一次可以选取多个成员,而ENUM只能选一个。比如,在表t中插入多组不同的成员: 
create table t(col set('a','b','c','d')); 
insert into t values('a,b'), ('c,d'), ('a, c, d'); #一次插入多个记录

二、算术运算符

    mysql支持算术运算符、比较运算符、逻辑运算符、位运算符。 
算术运算符 
    包括 +,-,*,/,%(mod)。在mysql命令行下,通过select expression 来得到表达式的值。

比较运算符 
    包括=, <>或!=, <=>, <, <=, >, >=, between, in, is null, is not null, like, regexp或rlike. 
    其中<=>判断左右两边是否相等,其中一个操作数是null也可以正确执行 
    is null判断操作数是否为空,如select a is null; 返回1表示true,0表示false。select 0 is null; #返回0,因为数字0不是null 
    like运算符使用格式为a like %123%,其中%为通配符。 
    regexp使用格式为str regexp str_pat,当str字符串中含有str_pat相匹配的字符串时,返回值为1,否则返回0.

逻辑表达式 
    包括not或者!, and或者&&, or或者||, xor(异或).

位运算符 
    包括 &, |, ~, ^, >>, << 等。

运算符优先级 
    和c/c++有差别,比如位运算符的优先级貌似比较高,需要在使用时注意。

 

三、 常用函数

1. 字符串函数

函数功能
concat(s1,s2....sn) 连接s1,s2...sn为一个字符串
insert(str, x, y, instr) 将字符串str从第x个位置开始,y个字符长度的子串替换为字符串instr
lower(str) 将字符串str中所有字符变为小写
upper(str) 将字符串str中所有字母变为大写
left(str, x) 返回字符串str最左边的x个字符
right(str,x) 返回字符串str最右边的x个字符
lpad(str,n,pad) 用字符串pad对str最左边进行填充,直到长度为n个字符串长度
rpad(str,n,pad) 用字符串pad对str最右边进行填充,直到长度为n个字符串长度
ltrim(str) 去掉字符串str左侧的空格
rtrim(str) 去掉字符串str右侧的空格
repeat(str,x) 返回str重复x次的结果
replace(str,a,b) 用字符串b替换字符串str中所有出现的字符串a
strcmp(s1,s2) 比较字符串s1和s2
trim(str) 去掉字符串行尾和行头的空格
substring(str, x, y) 返回从字符串str x位置起y个字符长度的字串

2. 数值函数

函数功能
abs(x) 返回x的绝对值
ceil(x) 返回大于x的最小整数值
floor(x) 返回大于等于x的最小整数值
mod(x,y) 返回x/y的模
rand() 返回参数x的四舍五入的有y位小数的值
round(x,y) 返回参数x的四舍五入的有y位小数的值
truncate(x,y) 返回数字x截断为y位小数的结果

3. 日期和时间函数

函数功能
curdate() 返回当前日期
curtime() 返回当前时间
now() 返回当前日期和时间
unix_timestamp(date) 返回日期date的unix时间戳
from_unixtime 返回unix时间戳的日期值
week(date) 返回date为一年中的第几周
year(date) 返回date的年份
hour(time) 返回time的小时值
minute(time) 返回time的分钟值
monthname(date) 返回date的月份名
date_format(date, fmt) 返回按字符串fmt格式化日期date值
date_add(date interval expr type) 返回一个日期或者时间值加上一个时间间隔的时间值
datediff(expr, expr2) 返回起始时间expr和结束时间expr2之间的天数

4. 流程函数

函数功能
if(value,t f) 如果value是真,返回t;否则返回f
ifnull(value1,value2) 如果value1不为空,返回value1,否则返回value2
case when [value1] then [result] .... else [default] end 如果value1为真,返回result1,否则返回default
case [expr] when [value1] then [result]...else [default]end 如果expr等于value1,返回result,否则返回default

比如,有一张表t,存放雇员的id和薪水salary。认为薪水在2000以上的为高收入,记为high,2000以下的为低,记为low。 
select user_id, if(salary > 2000, 'high', 'low') from t;#得到user_id和工资水平高低的对应 
或者可以这样 
select user_id, case when salary<=2000 then 'low' else 'high' end from t;

ifnull(value1, value2)一般用来替换null值,由于null值不能参与数值运算,该语句就是把null值用0来替换。 
select ifnull(salary, 0) from t;#列出所有的salary,如果salary那一列为空,则显示0.

5. 其他常用函数

函数功能
database() 返回当前数据库名
version() 返回当前数据库版本
user() 返回当前登录用户名
inet_aton(ip) 返回ip地址的网络字节序数字表示
inet_ntoa(num) 返回数字代表的ip地址
password(str) 返回字符串str的加密版本
md5(str) 返回字符串str的md5值

    其中,字符串的加密版本password(str)返回的是一个41字节长的字符串;md5(str)返回str的md5值,常用来对应用中的数据进行加密。

原文地址:https://www.cnblogs.com/gtarcoder/p/4982709.html