MySQL数据类型和运算符
文章目录
- MySQL数据类型和运算符
- 1、 MySQL数据类型
- 2、 MySQL运算符
一、mysql的数据类型
1、整数系列
TINYINT:非常小的整数,类似于Java的byte类型
SMALLINT:小整数,类似于Java的short类型
MEDIUMINT:中整数,Java没有对应
INT、INTEGER:整数,类似于Java的int类型
BIGINT:大整数,类似于Java的long类型
tinyint、smallint、mediumint、int 、integer、bigint
使用int数据类型:
(1)int,等价于int(11)
(2)int(M):M表示宽度,需要结合另外的两个参数使用
unsigned:表示无符号,即没有负数
zerofill:表示用0填充 zerofill 用0填充
例如:int(5) unsigned zerofill,表示每一个整数有5位数字,如果不足5位的在左边用0凑够5位
如果只是单独int(5),那是不会起作用。
无论:int的宽度指定为多少,在内存中都是占4个字节,如果你的数字超过了int(5)也可以存储 ,Java int 展四个字节的。
2、浮点小数
float:4个字节
double:8个字节
使用float和double时:
(1)float或double
(2)float(M,D),double(M,D):M表示总位数,D表示精度,即小数点几位
例如:double(5,2)表示的数据范围[-999.99,999.99],如果超过这个范围会报错。超过了存不了
3、定点小数,类似于Java的BigDecimal,底层使用字符串存储
DECIMAL
DECIMAL(M,D)
4、日期时间类型
date:只能表示日期
time:表示时间
datetime:表示日期和时间
year:表示年
timestamp:时间戳,表示日期和时间
datetime和timestamp:
(1)timestamp实际存储的毫秒值,显示时,显示根据毫秒值算出来一个本地化的日期时间
datetime就是存储日期时间
(2)timestamp因为存储的毫秒值,所以在比较和计算时,效率比较高。
(3)datetime和timestamp可以表示的时间范围是不同的
timestamp 实际存储的毫秒值 显示时 显示根据豪秒值算出来一个本地化的日期时间timestamp
出生日期可以用 date 2028-09-01
精确秒 datetime timestamp
5、字符串
强调:mysql没有单字符类型,只有字符串类型
char:定长字符串,长度[1,255]
char,char(1),长度为1个字符
char(10),长度为10个字符
varchar:变长字符串
varchar(M):必须指定M,这个M的意思是最长不超过M个字符
例如:varchar(20),最长不超过20个字符
text:长文本
一般用于存储,文字比较多的,简介等,又不经常检索的信息
char和varchar
(1)内存占用空间不同
char(M):M字符就占M个字符的空间
例如:char(2) 实际存储的是’男’,但是也是占2个字符的位置,那一个空的字符存储的是\u0000
定长
varchar:实际几个字符 + 1/2个字节的空间
例如:varchar(20) 实际存储的是’张三’,占的2个字符 + 1/2个字节(用来记录实际的字符个数的)
实际占字符 1/2个字节用来记录实际的字符个数的
(2)
varchar节省空间,但是每次存和取,都要数字符个数
char:看起来浪费空间,但是每次存和取,都按照固定的长度去处理的
建议:像身份证号,学号,邮编等定长的字符串使用char,例如:地址等使用变长的
现在mysql的版本对varchar优化的越来越快了,可以使用varchar。
6、位类型(了解)
二进制的位类型,BIT(M)类型允许存储M位值。M范围为1~64,默认为1
7、blob系列类型(了解)
BINARY和VARBINARY类型类似于CHAR和VARCHAR类型,但是不同的是,它们存储的不是字符字符串,而是二进制串。所以它们没有字符集。
binary、varbinary 存储的二进制串
8、枚举(ENUM)
多个中选择一个
9、集合
多个中可以选择多个
1、 MySQL数据类型
整型系列:xxxInt
int(M),必须和unsigned zerofill一起使用才有意义
tinyint、smallint、mediumint、int、integer、bigint
浮点型系列:float,double
double(M,D):表示最长为M位,其中小数点后D位
例如:double(5,2)表示的数据范围[-999.99,999.99],如果超过这个范围会报错。
定点型系列:decimal
decimal(M,D):表示最长为M位,其中小数点后D位
字符串类型:char,varchar(M),text
char如果没有指定宽度,默认为1个字符
varchar(M),必须指定宽度
日期时间类型:year, date, datetime, timestamp
注意一下每一种日期时间的表示范围
其他类型:bit, xxBlob, 枚举,集合等
+----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| eid | int(11) | NO | PRI | NULL | auto_increment |
| ename | varchar(20) | NO | | NULL | |
| tel | char(11) | NO | | NULL | |
| gender | char(1) | YES | | 男 | |
| salary | double | YES | | NULL | |
| commission_pct | double(3,2) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| job_id | int(11) | YES | | NULL | |
| email | varchar(32) | YES | | NULL | |
| mid | int(11) | YES | | NULL | |
| address | varchar(150) | YES | | NULL | |
| native_place | varchar(10) | YES | | NULL | |
| did | int(11) | YES | | NULL | |
+----------------+--------------+------+-----+---------+----------------+
2、 MySQL运算符
1、算术运算符
加:+
减:-
乘:*
除:/ div(只保留整数部分)
模:% mod
2、比较运算符
大于:>
小于:<
大于等于:>=
小于等于:>=
等于:= 不能用于null判断
不等于:!= 或 <>
安全等于:<=> 可以用于null值判断
3、逻辑运算符(建议用单词,可读性来说)
逻辑与:&& 或 and
逻辑或:|| 或 or
逻辑非:! 或 not
逻辑异或:^ 或 xor
4、范围
区间范围:between x and y
not between x and y
集合范围:in (xxx)
not in(xxx)
5、模糊查询(只针对字符串类型,日期类型)
like 'xxx'
如果想要表示0~n个字符,用%
如果想要表示确定的1个字符,用_
like ‘%柳%’
like ‘菜鸡_’
6、位运算符(很少使用)
左移:<<
右移:>>
按位与:&
按位或:|
按位异或:^
7、特殊的null值处理
#(1)判断时
xx is null
xx is not null
xx <=> null
#(2)计算时
ifnull(xx,代替值) 当xx是null时,用代替值计算
/*一、运算符
1、算术运算符
+:加
-:减
*:乘
/:除 可以保留小数部分
div:除 如果整数与整数相除只保留整数部分
%:求余数
mod:求余数
*/
select 1+1;
select 1/2; #0.5
select 1 div 2; #0
/*
2、比较运算符
>:大于
<:小于
=:等于 注意区别,Java中是==,mysql中是=
>=:大于等于
<=:小于等于
!=:不等于
<>:不等于
<=>:安全等于 用于判断null值的比较运算符
null值的判断,习惯上我们用is null 和is not null
*/
#查询薪资大于20000元的员工
select * from t_employee where salary > 20000;
#查询所有男员工
select * from t_employee where gender = '男';
select * from t_employee where gender != '女';
select * from t_employee where gender <> '女';
#查询奖金比例commision_pct是null的员工
select * from t_employee where commission_pct <=> null;
select * from t_employee where commission_pct is null;
/*
3、逻辑运算符
&&和and:逻辑与
两个条件同时满足
||和or:逻辑或
两个条件满足任意一个
^和xor:逻辑异或
两个条件只能满足其中一个
!和not:
不满足xx条件
*/
#查询薪资大于20000元的女员工
select * from t_employee where salary > 20000 && gender = '女';
select * from t_employee where salary > 20000 and gender = '女';
#查询男员工
select * from t_employee where not gender = '女';
select * from t_employee where !(gender = '女');
#查询薪资大于10000 异或 性别是男的,即它俩只能满足一个
#即查询薪资大于10000的女的或薪资低于10000的男的
select * from t_employee where salary>10000 ^ gender ='男';
select * from t_employee where salary>10000 xor gender ='男';
/*
4、范围
(1)区间范围:
在[a,b]之间,between a and b
不在[a,b]之间,not between a and b
(2)集合范围
in(...)
not in(...)
*/
#查询薪资在[15000,20000]之间的员工
select * from t_employee where salary between 15000 and 20000;
select * from t_employee where salary >= 15000 and salary <=20000;
#查询薪资在9000,10000,12000
select * from t_employee where salary in(9000,10000,12000);
select * from t_employee where salary =9000 || salary =10000 || salary =12000;
/*
5、模糊查询
like '%x%' x代表确定的字符 %表示不确定的0~n个字符
'_x%' x代表确定的字符 _表示确定的1个字符
*/
#查询,名字ename中包含“冰”这个字的员工
select * from t_employee where ename like '%冰%';
#查询,名字ename是张xx,三个字
select * from t_employee where ename like '张__';
#查询,名字ename是第二个字是'冰'
select * from t_employee where ename like '_冰%';