mysql 語法
1 連接數據庫
語法:
mysql [-h ip][-P port] -uname -p
-h參數表示 主機ip,-P表示主機端口,默認端口為3306。註意P是大寫的,否則和密碼的p混淆。
另外mysql允許在連接階段指定連接以後選中的數據庫。
因為命令行中,都是一個選項後面才能跟一個值,如果單獨出現一個值,那麽mysql會將他解析為數據庫名,在連接以後直接選中數據庫。
-p 密碼選項的值比較特殊,只能緊跟選項不能有空格,因為-p選項的值默認是忽略的避免密碼被別人看到。因此如果在-p 後面加了空格跟上密碼,密碼會被解析為一個數據庫名。
2 庫操作
show databases; -- 查看服務器總所有的數據庫名 use db_name; --選中名為db_name的庫進行操作 select database(); --顯示當前選中的數據庫
顯示當前選中的數據庫操作,使用了select的原因在於,database()是一個函數,而函數的返回值並不能直接顯示在終端中,因此,需要select命令來顯示它。
--創建數據庫 create DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARACTER SET latin1 COLLATE latin1_swedish_ci];
如果存在數據庫,並且沒有指定IF NOT EXISTS,則會出現錯誤。
後面的CHARACTER SET子句用於指定默認的數據庫字符集。COLLATE子句用於指定默認的數據庫整序
因為當數據庫剛剛被創建時,在數據庫中沒有表,所以CREATE DATABASE只創建一個目錄(文件夾)。這個目錄位於MySQL數據目錄和db.opt文件之下。
如果手動在數據目錄之下創建一個目錄(例如,使用mkdir),則服務器會認為這是一個數據庫目錄,並在SHOW DATABASES的輸出中顯示出來。
--刪除數據庫 drop database [if exists] db_name;
該語句用於刪除數據庫,同時也刪除了數據庫中的所用表。對一個帶有符號鏈接的數據庫使用DROP DATABASE,則鏈接和原數據庫都被取消。就如同上面講的數據庫本身就是個文件夾。
DROP DATABASE會返回已被取消的表的數目。此數目相當於被取消的.frm文件的數目。
--更改數據庫 alter database db_name character set utf8 [COLLATE collation_name];
因為在創建數據的時候,選項就只有兩個,因此能夠修改的也比較少。只有兩個
3 表操作
--創建表 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tb_name ( col_name col_type [col_op]
-- 多個,使用逗號分割。
)[table_op];
-- 復制表結構 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tb_name [(] LIKE old_tb_name [)][table_op];
col_op 部分可選的有:
- NOT NULL 表示該字段不能為空
- DEFAULT value 表示默認的時候可以為這個值
- AUTO_INCREMENT 表示當該字段沒有設置值的時候,自動增加
- COMMENT ‘value‘ 當前字段的說明
- PRIMARY [KEY] 主鍵約束,該字段,不能為空,且數據唯一,一個表中只能有一個
- UNIQUE [KEY] 唯一約束,該字段,可以為空,但是數據唯一,一個表中可多次存在
一個整數列可以擁有一個附加屬性AUTO_INCREMENT。當您向一個已編入索引的AUTO_INCREMENT列中插入一個NULL值(建議)或0時,此列被設置為下一個序列的值。通常情況下為value+1,此處value是當前在表中的列的最大值。AUTO_INCREMENT序列從1開始。這樣的列必須被定義為一種整數類型。每個表只有一個AUTO_INCREMENT列,此列必須編制索引,不能有DEFAULT值。一個AUTO_INCREMENT列只有在只包含正數的情況下,才能運行正常。插入一個負數會被認為是插入了一個非常大的正數。這樣做是為了避免當數字由正數轉為負數時出現精度問題,同時也為了確保AUTO_INCREMENT列中不會包含0。
DEFAULT子句用於為列指定一個默認值。默認值必須為一個常數,不能為一個函數或一個表達式,有一種情況例外。例如,一個日期列的默認值不能被設置為一個函數,如NOW()或CURRENT_DATE。不過,有一種例外,您可以對TIMESTAMP列指定CURRENT_TIMESTAMP為默認值。BLOB和TEXT列不能被賦予默認值。
字段類型可選
-- length 實現顯示寬度,也就是說在輸出到終端上時候 -- 字符有多少位,但其實並不影響精度 -- ZEROFILL 是在原有數據不夠寬度的時候補0 TINYINT[(length)] [UNSIGNED] [ZEROFILL] SMALLINT[(length)] [UNSIGNED] [ZEROFILL] MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL] INT[(length)] [UNSIGNED] [ZEROFILL] INTEGER[(length)] [UNSIGNED] [ZEROFILL] BIGINT[(length)] [UNSIGNED] [ZEROFILL] REAL[(length,decimals)] [UNSIGNED] [ZEROFILL] DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL] FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL] DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL] NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL] DATE TIME TIMESTAMP DATETIME -- length 是字符的個數,最大能存儲的字符個數 -- char,varchar 默認使用utf8存儲,存儲的是字符的個數 -- 而不是二進制 CHAR(length) [CHARACTER SET name] VARCHAR(length) [CHARACTER SET name] BINARY(length) VARBINARY(length) TINYBLOB BLOB MEDIUMBLOB LONGBLOB TINYTEXT [BINARY] TEXT [BINARY] MEDIUMTEXT [BINARY] LONGTEXT [BINARY] ENUM(value1,value2,value3,...) SET(value1,value2,value3,...)
character set可以簡寫為char set和charset
表選項可選
ENGINE = engine_name AUTO_INCREMENT = value 還有很多,暫時列這兩個。 例如CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, name BINARY(10) UNIQUE DEFAULT "new_user" )CHARACTER SET utf8 AUTO_INCREMENT=10 ENGINE=innodb;
然後查看mysql的目錄
多了兩個文件
刪除表
-- 刪除表 DROP TABLE [IF EXISTS] tb_name;
更改表結構
-- 更改表結構 ALTER [IGNORE] TABLE tb_name alter_context;
ALTER TABLE 是一個復雜的命令
ADD old_col col_define 改變結構 ADD index index_name col_name 增加索引 用來增加一個列,或是增加索引 CHANGE old_col new_col_name_and_define 改名並改變結構DROP col_name 刪除列 DROP PRIMARY KEY 刪除主鍵 DROP INDEX index_name 刪除索引 RENAME new_tb_name 更改表名
數據操作
插入數據
-- 插入記錄 INSERT tb_name [(col_1,...)] --這裏列的順序要和下面值的順序對應,可省略,默認全部 VALUES (...)[,(...)]; --後面可以跟多份
-- 復制表 -- 首先使用 創建一樣的表結構,使用LIKE 然後 INSERT tb_name select * from old_tb;
mysql 語法