1. 程式人生 > 資料庫 >MySQL語句(3)

MySQL語句(3)

int型別修飾符

unsigned 無符號整數,修飾符: 規定欄位只能儲存正的資料。它可以增大這個欄位的正數支援的範圍。

zerofill 修飾符: 規定0(不是空格 ) 填補輸出的值。 使用這個值可以防止 mysql儲存負值。

注意:
int(M) 在 integer 資料型別中,M 表示最大顯示寬度。
在 int(M) 中,M 的值跟 int(M) 所佔多少儲存空間並無任何關係。 int(3)、int(4)、int(8) 在磁碟上都是佔用 4 btyes 的儲存空間。其實,除了顯示給使用者的方式有點不同外,int(M) 跟 int 資料型別是相同的。

如int的值為10
int(10)顯示結果為0000000010

int(3)顯示結果為010

浮點型資料型別
float數值型別用於表示單精度浮點數值,而double數值型別用於表示雙精度浮點數值,float和double都是浮點型,而decimal是定點型;
MySQL浮點型和定點型可以用型別名稱後加(M,D)來表示,M表示該值的總共長度,D表示小數點後面的長度,M和D又稱為精度和標度,如float(7,4)表示總長度是7位,小數點後面的長度是4,可顯示為999.9999,MySQL儲存值時進行四捨五入,如果插入999.00009,則結果為999.0001。
float:單精度浮點型,佔位元組數為4,用32位二進位制描述,有符號是7個有效位,無符號是8個有效位

double:雙精度浮點型,佔位元組數為8,用64位二進位制描述,有符號是15個有效位,無符號是16個有效位

decimal:數字型,用128位二進位制描述,不存在精度損失,常用於銀行帳目計算。(28個有效位)

解釋:單精度和雙精度
精度是指計算機表達小數近似值的一種方式,單精度32位二進位制,4個位元組;雙精度64位二進位制,8個位元組。

float數值型別
例如:float(3,1) :表示此欄位有效位數為3位,小數點後面1位數字。
小數點後超過1位,mysql自動給四捨五入。
mysql> select * from kdata6;
在這裡插入圖片描述

發現整數+小數一共只能有3位,整數2位,小數1位,小數點後超過1位自動四捨五入。

儲存精確的小數: double和decimal數值型別
decimal、double要比float儲存小數更精確。

單精度型別float和雙精度型別double在計算機中儲存的時候,由於計算機只能儲存二進位制,所以浮點型資料在儲存的時候,必須轉化成二進位制。我們知道對於float型別的資料,只分配了32位的儲存空間,對於double型別值分配了64位,但是並不是所有的小數都能轉成32位或者64位的二進位制形式,如果超過了,就會出現截斷,這就是誤差的來源。

針對float情況,至少我們可以得出結論:

  1. 如果一個float型資料轉成二進位制後的第32位之後都是0,那麼資料是準的
  2. 如果一個float型資料轉成二進位制後的第32位之後不全為0,則資料就會存在誤差

字串型別
char 和 varchar
char
char :後面括號中必須有數值,來確認字串的範圍。 大小範圍 :0-255.
char(10) ; 指定了一個長度為10的字元值。
舊版本小於長度,空格自動補齊,大於長度 ,自動截短。
新版本超過長度自動報錯。
binary 修飾符: 區分字元大小寫
varchar : 字串可變長
在 MySQL5.0以上的版本中,varchar資料型別的長度支援到了65535,也就是說可以存放65532個位元組的資料,起始位和結束位佔去了3個位元組。
char和varchar區別
CHAR(M)定義的列的長度為固定的,M取值可以為0~255之間,當儲存CHAR值時,在它們的右邊填充空格以達到指定的長度。當檢索到CHAR值時,尾部的空格被刪除掉。
VARCHAR(M)定義的列的長度為可變長字串,M取值可以為0~65535之間。
VARCHAR值儲存時只儲存需要的字元數,另加一個位元組來記錄長度(如果列宣告的長度超過255,則使用兩個位元組)。VARCHAR值儲存時不進行填充。
varchar儲存變長資料,但儲存效率沒有CHAR高。如果一個欄位可能的值是不固定長度的,我們只知道它不可能超過10個字元,把它定義為 VARCHAR(10)是最合算的。
從空間上考慮,用varchar合適;從效率上考慮,用char合適。

字串使用總結
1、VARCHAR型欄位比CHAR型欄位佔用更少的記憶體和硬碟空間。當你的資料庫很大時,這種記憶體和磁碟空間的節省會變得非常重要.
2、雖然VARCHAR使用起來較為靈活,但是從整個系統的效能角度來說,CHAR資料型別的處理速度更快,有時甚至可以超出VARCHAR處理速度的50%。
所以在設計資料庫時應當綜合考慮各方面的因素,以求達到最佳的平衡。

日期和時間型別

date 日期

time時間

Year
year : 00-69自動轉為: 2000-2069 , 70-99自動轉為1970-1999

datatime 或 timestamp
datetime型別能儲存的最大範圍的值為1001年到9999年,精度為秒,它把日期和時間封裝到格式為YYYY-MM-DD HH:MM:SS的整數中,與時區無關,使用8個位元組的儲存空間。
timestamp型別儲存了從1970年1月1日(格林尼治時間)以來的秒數,它和linux的時間戳相同,只是用了4個位元組的儲存空間,因此它的範圍比datetime的範圍小了很多,只能表示從1970年到2038年,我們可以使用它提高空間利用率。
複合型別
它們欄位的值,必須從預先定義好的字串集合中選取。

ENUM(列舉):只能取一個,用於互斥。男人,女人。
set : 能取多個。
列舉
Set
注意:set 型別: 最大包含64類項。在set中,相同的元素不能同時存在。

Msyql語句進階

Mysql基礎命令語句

修改資料表

新增欄位:

alter table 表名 add 欄位名 列型別 [not null|null][primary key][unique][auto_increment][default value]

alter table 表名 add 欄位定義 after ar_id;

解釋:
not null | null:非空約束(NOT NULL)可以通過 CREATE TABLE 或 ALTER TABLE 語句實現。在表中某個列的定義後加上關鍵字 NOT NULL 作為限定詞,來約束該列的取值不能為空。對於使用了非空約束的欄位,如果使用者在新增資料時沒有指定值,資料庫系統就會報錯。Null表示該列可以為空,使用者在插入資料時如果沒有指定值,該列用NULL填充。

default預設值:mysql預設值約束用來指定某列的預設值。如果某列設定了default預設值約束,使用者在插入資料時如果沒有指定值,則用預設值填充。
unique:唯一性約束,如果某列設定了unique唯一性約束,則該列的值是不能重複的。

auto_increment:設定數值型的列自動增長。AUTO_INCREMENT是資料列的一種屬性,只適用於整數型別資料列。所謂自動增長欄位,是指它們的值是系統指定,不需要插入。值從1開始,每增加一條記錄,這個值就加1。
primary key:主鍵(PRIMARY KEY)”的完整稱呼是“主鍵約束”。MySQL 主鍵約束是一個列或者列的組合,其值能唯一地標識表中的每一行。通過它可以強制表的實體完整性(即表中沒有重複的行)。

主鍵應該遵守下面的規則:

1.每個表只能定義一個主鍵。

2.主鍵值必須唯一標識表中的每一行,且不能為 NULL,即表中不可能存在兩行資料有相同的主鍵值。這是唯一性原則。

刪除欄位:
alter table 表名 drop 欄位名

修改欄位:
alter table 表名 modify 欄位名 欄位新型別

完整修改欄位:
alter table 表名 change 舊欄位名稱 新欄位定義

修改表名稱
alter table 表名 rename 新名字

刪除表
drop table [if (not) exists] 表名;

表中行的操作
insert
insert [into] 資料表名稱 [(欄位列表)] values|value (表示式|null|default,…),(表示式|null|default,…)
insert [into] 資料表名稱 set 欄位名稱=值,…
insert與insert…set的區別是後者可以帶有子查詢。
update – 單表
update 表名 set 欄位名稱=值,… [where 條件]
如果省略WHERE條件將更新全部記錄。
刪除記錄 – 單表
delete from 資料表名稱 [where 條件]
如果省略where條件,將刪除全部記錄

常用SELECT命令

使用select命令檢視mysql資料庫系統資訊:

– 列印當前的日期和時間
select now();

– 列印當前的日期
select curdate();

– 列印當前的時間
select curtime();

– 列印當前資料庫
select database();

– 列印MySQL版本
select version();

– 列印當前使用者
select user();