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 '_冰%';