大白話從0開始回顧MySQL,去除了一些繁瑣的操作的演示以及內容,如MySQL安裝等,本篇文章適合復習MySQL語法,學習MySQL語句,對MySQL不太熟練的同學,希望對大家有一些幫助。
MySQL初體驗
首先,我將Mysql安裝到了如下位置
我們點進bin目錄(bin目錄存放了許多可執行文件)
通常,我們是可以雙擊執行這些bin目錄下的可執行文件,常常會出現錯誤,我們需要傳遞一些參數讓它們正常運行,如bin目錄下有許多客戶端程序,比方說:mysqladmin,mysqldump,mysqlcheck等,我們啟動客戶端可執行文件一般參數格式如下:
mysql -h主機名 -u用戶名 -p密碼 (-p和密碼之間不要有空格)
本機連接可以忽略-h,連接成功的前提是必須開啟服務器程序,可以在任務管理器中查看
雖然之后編寫sql語句可能不在小黑框中編寫,我們還是需要簡單介紹一下MySQL語句的注意事項
-
書寫結束符號
- ;
- \g
- \G(不以表格形式展現)
- 沒有大小寫問題 (NOW)
- 語句可以隨意換行
- 可以一次性提交多個語句
- 使用\c放棄本次操作
- 字符串表示
MySQL數據類型
Mysql把數據存到表中,表由若干行組成,每一行由若干列組成,下圖是一張文章表
一行代表一個文章的基本信息,一列代表基本信息的一個屬性,每個屬性有一定格式,不同格式是不能亂填的,比如不能把title填到用戶Id中,為了更好的規范表數據,MySQL設計者針對屬性不同格式定義的不同的數據類型。
數值類型
- 整數類型
計算機采用若干個二進制來表示數字,一個二進制位只能表示21種信息,也就是0和1。
無符號整數 :符號1就表示1,符號0表示0,數字范圍(0 ~ 1),有符號整數 :最左端的二進制數表示正負號,符號1就表示-1,符號0表示0, 數字范圍(-1 ~ 0)
二進制位 | 無符號數代表數值 | 有符號代表數值 |
---|---|---|
0 0 | 0 | 0 |
0 1 | 1 | 1 |
1 0 | 2 | -2 |
1 1 | 3 | -1 |
一個二進制位所能存儲的信息實在太少,計算機一般采用8個二進制位作為分配空間的基本單位,也就是一個字節(Byte),我們采用的字節數越多,意味著數值范圍就越大,但消耗的存儲空間也就多,所以我們可以是根據字節數的不同,將整數劃分為以下幾個類型
在數據類型后面加上UNSIGNED單詞,表明是無符號數,在數據類型后面加上SIGNED單詞或者不加,表明有符號數
create table t3(age tinyint unsigned
);
在數據類型后面加,顯示寬度 (zerofill),整型顯示寬度, 位數不足時用 0 填充
create table t7(id int(10) zerofill primary key auto_increment,name char(32)
);
insert into t7 values(12345, '5個');
insert into t7 values(1234567890, '10個');
insert into t7 values(123456789012, '12個');
select * from t7;
浮點數類型
create table t5 (a float(10, 2),b double(10, 2),c decimal(10, 2)
);
注意:浮點數表示小數是不準確的,比如0.3用二進制是無限循環小數,有時候是需要進行取舍的, MySQL8.0之后float和double不推薦使用(M,D)格式,直接使用float和double即可
如果我們事先知道小數的范圍,就可以使用float(M,D)和double(M,D)這種格式,M 是支持多少個長度, D 是小數點后面的位數
如果想要精準的保存小數,我們可以采用定點數DECIMAL(M, D),M的最大值為65, D的最大值為30,D的值不能超過M的值它占用的存儲空間與M和D有關,這和它是如何解決小數因為取舍不精確有關,它將小數點分割開,將小數點左右倆個十進制整數分別存儲下來,關于它是如何分配的便簡單概述,感興趣的同學可以網上尋找。
- 從小數點分別向左向右每隔9個十進制劃為一組,不足9個十進制也同樣進行
組中的十進制位數 | 占用內存大小 |
---|---|
1或 2 | 1字節 |
3 或 4 | 2字節 |
5 或 6 | 3字節 |
7 或 8 或 9 | 4字節 |
很多場景并不需要精細化處理,比如0.3元可以轉化成20分進行存儲,這樣使用整數存儲即可,還有在float,double,decimal類型后面添加unsigned是沒有必要的,并不會增加它們所能表示的正數范圍
日期和時間類型
- datetime
create table datetime_test (create_at datetime
);insert into datetime_test values('2019-4-2 16:54:00');
insert into datetime_test values('2019/4/2 16:54:00');
insert into datetime_test values(now());
-- 年份最大支持4個長度
insert into datetime_test values('10000/4/2 16:54:00'); -- 錯誤
insert into datetime_test values('9999/4/2 16:54:00');
- time
create table time_test (create_at time
);insert into time_test values('12:12:12');
insert into time_test values('100:12:12');
insert into time_test values('-100:12:12');
insert into time_test values('10 10:12:12');
-- 時間的范圍是: [-838:59:59 - 838:59:59]
insert into time_test values('839:12:12'); -- 錯誤的
- timestamp 時間戳類型
- 時間戳類型在顯示方面和datetime是一樣的, 在存儲上不一樣
- 范圍從 1970-1-1 0:0:0 到 2038-1-19 11:14:07
- 時間戳使用 4 個字節表示
- 該值大小與存儲的位長有關: 2? ** (4* 8 - 1)
create table timestamp_test (create_time timestamp
);insert into timestamp_test values(now());
insert into timestamp_test values('2038-1-19 11:14:07'); -- 時間戳最大值
insert into timestamp_test values('2038-1-19 11:14:08'); -- 錯誤
-
year
create table `year`( create_at_year); -- 從1900年開始 - 1900+255 insert into `year` values(now()); insert into `year` values('2155'); -- 年份最大值 insert into `year` values('2156'); -- 錯誤
在MySQL 5.6.4版本之后,DATETIME存儲空間被優化成了5字節,提供對毫秒,微秒的支持,比如DATETIME(0)表示精確到秒,DATETIME(3)表示精確到毫秒,小時秒位在0~6之間選擇,保留的小數秒位不同,需要增加的內存空間也不同
保留的小數秒位 | 額外需要增加的存儲空間 |
---|---|
0 | 0字節 |
1或 2 | 1字節 |
3或4 | 2字節 |
5或 6 | 3字節 |
字符串類型
表一行數據字節數不能超過165535字節,這個對text是不生效的
字符編碼 : 字符是面向人的概念, 字節是面向計算機的概念,根據字符使用的字節數量是否是固定的可以分為下面倆種
1.固定長度編碼 :ASCII編碼采用一字節,GB2312采用2字節
2.可變長度編碼 :UTF-8采用1~ 4字節編碼,GB2312采用1~2字節編碼,Mysql中使用的utf8mb4就是正宗的UTF-8
CHAR
?與?VARCHAR
?類型的區別:
-
允許的最大值范圍不同。
注意:無論是char(n)還是varchar(n),n表示的都是字符數,而不是字節數。
- char(n)類型里,無論數據庫使用的是哪種編碼方式,n的最大取值都只能取到255,char = char(1),char(0)只能存""和null,
- varchar(n)類型里,如果使用的是Latin1編碼,最大值允許到65535(但是實際取值只能到65532,還要保留三個字節用來記錄長度);如果使用的是UTF8編碼,最大值允許到21845(但是實際取值只能到21844,還要保留一個字符用來記錄長度)。
-
數據庫內存存儲的長度不同。
- char(n)類型里,無論輸入的內容是什么,存儲的長度都是 n個字符。例如,數據類型char(10),寫入字符串’張三’,在數據庫里存入的數據長度是10個字符,所占字節數為n * 編碼集編碼一個字符需要的最大字節。
- varchar(n)類型里,存儲的長度是不固定可變的。
-
對于空格的處理不同。
- char類型在存儲字符串時,會將右側末尾的空格去掉。
- varchar類型在存儲字符串時,會將右側末尾的空格保留。
create table student (id int primary key auto_increment ,name char(20),city varchar(20)); -- 創建數據表 insert into student values(0,' zhangsan ',' shanghai '); -- 插入數據select concat(id,name,'good') from student where id=1; /* 從查詢的結果中可以看到,name左側的空格保留了,但是右側的空格被去掉了 +------------------------+ | concat(id,name,'good') | +------------------------+ | 1 zhangsangood | +------------------------+ */ select name,length(name) from student where id=1; /* 從查詢的結果中可以看到,長度只包括左邊的空格,不包括右邊的空格 +------------+--------------+ | name | length(name) | +------------+--------------+ | zhangsan | 10 | +------------+--------------+ */select concat(id,city,'good') from student where id=1; /* 從查詢的結果中可以看到,city右側的空格也保留了 +------------------------+ | concat(id,city,'good') | +------------------------+ | 1 shanghai good | +------------------------+ */ select city,length(city) from student where id=1; /* 從查詢的長度中也可以看到,city兩端的空格都被保留了 +-----------------+--------------+ | city | length(city) | +-----------------+--------------+ | shanghai | 15 | +-----------------+--------------+ */ Copy
- binary和varbinary類似于char和varchar,不同的是它們包含二進制字符串,不支持模糊查詢之類的,BINARY(M)和VARBINARY這個M存的是最大字節數。
枚舉(enum)
多選一的時候使用的一種數據類型
在前端使用單選框的時候, 枚舉類型可以發揮作用
枚舉類型的優點:
- 限制了可選值
- 節省空間
- 運行效率高
create table t6(name varchar(32),sex enum('男','女','保密') default '保密'
);-- 枚舉類型的計數默認從1開始
insert into t6 set name='王寶強',sex=1;
Copy
集合(set)
SET最多可以有64個不同的成員。類似于復選框, 有多少可以選多少。
create table t7 (name varchar(32),hobby set('吃','睡','玩','喝','抽')
);insert into t7 values('張三','睡,抽,玩,吃,喝');
insert into t7 values('李四','睡,抽');
BIT類型
類型 | 占用存儲空間 | 含義 |
---|---|---|
BIT(M) | 近似(M +7)/ 8 | 存儲M個二進制位的值 |
BLOG類型
這個可以用來存儲圖片,壓縮文件,音頻等,但我們通常將他們村在文件系統中,然后將路徑存到數據庫表中
MySQL初體驗到這就結束啦,如果您感覺有幫助的話,請點贊收藏,您的點贊是我創作的動力。