原諒轉自:http://www.cnblogs.com/waterystone/p/5085825.html
一. 規範
- 編程時一般關鍵字大寫,其他小寫;
- 儘量少用join查詢;
- 選擇小而簡單的數據類型,儘量避免NULL(使得索引複雜,可用DEFAULT);
- 除非有非常特別的原因需要其他存儲引擎,否則應該優先考慮InnoDB引擎;
- 儘量使用整型定義主鍵。使用InnoDB應該儘可能按主鍵順序插入數據,並儘可能使用單調增加的聚簇鍵。
二. 庫相關
1.1 MySQL
1.1.1 版本
1
|
SELECT VERSION(); |
2.1 用戶
2.1.1 創建
1
|
CREATE USER 'test' @ '%' IDENTIFIED BY '123456' ; |
如果新用戶權限拒絕,編輯/etc/my.cnf:
[mysqld]
skip-grant-tables
2.1.2 授權
1
|
grant all privileges on *.* to test@ "%" identified by '1234' ; |
2.1.3 刪除
1
|
Drop USER test; |
2.1.4 登陸
1
2
|
mysql
-u root -p -h localhost -P 3306 /home/q/mysql/bin/mysql -uroot
-h127.0.0.1 -P3306 |
三. 表結構
3.1 查看創建完整結構
1
2
3
4
5
6
7
|
DESC my_table; SHOW CREATE TABLE my_table; SHOW
COLUMNS FROM my_table LIKE "my_field" ; USE
information_schema; SELECT column_name FROM columns WHERE table_name= 'my_table' ; SELECT ORDINAL_POSITION,
COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_COMMENT FROM information_schema.
COLUMNS WHERE table_schema
= 'my_db_name' AND table_name
= 'my_table_name' ; |
3.2 重命名
1
|
RENAME TABLE my_table TO my_table_new,other_table TO other_table_new; |
3.3 創建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
CREATE TABLE `my_table`
( `id` int (11) NOT NULL AUTO_INCREMENT, `nid` bigint (20) NOT NULL references t_keywords(id), `ugc_name` varchar (20) NOT NULL COMMENT '名稱' , `ugc_type`
enum( 'one' , 'two' , 'three' ) NOT NULL DEFAULT 'one' , `total_count` int (11)
unsigned NOT NULL DEFAULT '0' , `data`
json, `create_date` date NOT NULL , `insert_time`
datetime NOT NULL DEFAULT '1970-01-01
00:00:00' , `updateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , `is_finished`
tinyint(3) NOT NULL DEFAULT '0' , PRIMARY KEY (`id`), KEY `idx_keyword_id_is_finished`
(`keyword_id`,`is_finished`) )
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE =utf8_bin #複製表結構 CREATE TABLE my_table_new LIKE my_table; #將 select 的結果存成表(保留原字段的屬性設置,但不復制索引) CREATE TABLE my_table_new
ENGINE=INNODB AS SELECT * FROM my_table; |
3.4 數據類型
類型名稱 | 佔用空間 | 可用默認值 | 說明 |
tinyint | 1B | -128~127 | 小整數型 |
smallint | 2B | -32768~32767 | 大整數型 |
mediumint | 3B | -8388608~8388607 | 大整數型 |
int/integer | 4B | -2147483648~2147483647 | 大整數型 |
bitint | 8B | -9233372036854775808~9223372036854775807 | 極大整數型 |
float | 4B | -3.402823466E+38~1.175494351E-38 | 單精度浮點數型 |
double | 8B | 1.7976931348623157E+308~2.2250738585072014E-308 | 雙精度浮點數型 |
decimal(m,d) | 對小數需要精確計算時用此類型,但在mysql處理時會轉爲double,所以能不用此類型儘量不用。 | ||
char |
定長字符串,一個字符長度爲1,但根據字符集一個字符可能佔多個字節 (適用於定長或較短的串) 注:在多字節字符編碼中,innodb將char視爲非定長,按varchar存儲 |
||
varchar |
0~65535B |
Latin1(1B/字符):0~65532字符 utf-8(1~3B/字符):21845字符 gbk(2B/字符):32767字符
|
變長字符串 。適用於長度變化大且更新少(壓縮存儲,若經常變大,則可能需要分裂頁的操作)。存儲時,按實際存入數據存儲。並有額外字段標記其長度,以便定位。 注:所有varchar列總長度之和不能超過65536B |
tinyblob/tinytext | 0~255字符 | 小型長度 | |
blob/text | 0~65535字符 | 正常長度 | |
mediumblob/mediumtext | 0~16777215字符 | 中等長度 | |
longblob/longtext | 0-4294967295字符 | 極大長度 | |
json | 受限於max_allowed_packet | 需要5.7+版本 | |
timestamp | 4B | CURRENT_TIMESTAMP,1970~2038 | 保存1970-01-01 00:00:00以來的秒數,同unix時間戳。 |
datetime | 8B | 1001~9999 | 精度爲秒 |
四. 字段操作
4.1 增
1
2
3
|
ALTER TABLE my_table ADD COLUMN status
tinyint(4) NOT NULL DEFAULT '0' ; ALTER TABLE my_table ADD COLUMN my_field VARCHAR (30) NOT NULL DEFAULT '' AFTER id; ALTER TABLE my_table ADD COLUMN age int (11)
COMMENT '年齡' ; |
4.2 刪
1
|
alert TABLE my_table DROP COLUMN my_field; |
4.3 改
1
2
3
|
ALTER TABLE my_table
CHANGE my_field my_field_new VARCHAR (50); ALTER TABLE my_table MODIFY COLUMN my_field INT (11) NOT NULL DEFAULT '0' ; ALTER TABLE my_table ALTER COLUMN my_field SET DEFAULT 5; |
4.3.1 ALTER
ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
設置或刪除列的默認值。該操作會直接修改.frm文件而不涉及表數據。所以,這個操作非常快。
1
2
|
alter table film alter column rental_duration set default 5; alter table film alter column rental_duration drop default ; |
4.3.2 CHANGE
CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
列的重命名、列類型的變更以及列位置的移動
1
2
|
ALTER TABLE MyTable
CHANGE COLUMN foo
bar VARCHAR (32) NOT NULL FIRST ; ALTER TABLE MyTable
CHANGE COLUMN foo
bar VARCHAR (32) NOT NULL AFTER baz; |
4.3.3 MODIFY
MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
除了列的重命名之外,他乾的活和CHANGE COLUMN是一樣的
1
|
ALTER TABLE MyTable MODIFY COLUMN foo VARCHAR (32) NOT NULL AFTER baz; |
4.3.4 總結
- change可以更改字段名,而modify/alter不能;
- 所有的MODIFY COLUMN/CHANGE COLUMN操作都將導致表重建;而ALTER COLUMN操作會修改.frm文件而不涉及表數據。
4.4 調整
1
|
ALTER TABLE my_table
CHANGE my_field my_field VARCHAR (30) NOT NULL DEFAULT '' AFTER id; |
使用change,保持原屬性。
五. 基本操作
5.1 增
1
2
3
4
5
6
7
|
INSERT INTO my_table
(id, keyword) VALUES (1, 'keyword' ); INSERT INTO my_table
(field1,field2) SELECT field1,field2 FROM other_table; //批量插入時有字節限制,max_allowed_packet,一般爲1MB INSERT LOW_PRIORITY INTO t_keywords
(id, keyword) VALUES (1, 'a' ),
(2, 'b' ) INSERT IGNORE INTO my_table
(a,b,c) VALUES (1,2,3),(4,5,6); REPLACE INTO my_table
(keyword, insert_time) VALUES ( 'a1' ,
now())//刪除衝突的舊記錄,增加新記錄 |
5.2 刪
1
2
3
4
5
|
DELETE FROM my_table WHERE id
= 1; DELETE FROM my_table WHERE create_time
< date_sub(now(), INTERVAL 3 MONTH ); DELETE FROM t_keywords; TRUNCATE t_keywords;//刪除所有數據,上邊的逐行刪除,下邊的更高效,而且自增鍵會重置。 |
5.3 改
1
2
3
4
5
|
UPDATE t_keywords SET keyword
= 'test' WHERE id
= 5 UPDATE t_keywords SET keyword
= 'test' , name = "du" WHERE id
= 5 INSERT INTO my_table
(a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE b=2,c=3; INSERT INTO my_table
(a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=c+ VALUES (c); |
5.4 查
1
2
3
4
5
6
7
|
SELECT id,
keyword FROM t_keywords WHERE id
= 5 AND count >
10 LIMIT 3, 5 SELECT id,
keyword FROM t_keywords WHERE id BETWEEN 1 AND 5 SELECT DISTINCT id FROM t_keywords SELECT DISTINCT id FROM t_keywords ORDER BY id, count DESC SELECT SQL_NO_CACHE/SQL_CACHE
* FROM t_keywords WHERE id
= 5;//明確是否緩存 SELECT * FROM my_table WHERE id
>=( SELECT floor(RAND()
* ( SELECT MAX (id) FROM my_table))
) ORDER BY id
LIMIT 5; //隨機取值 SELECT * FROM my_table WHERE id
>=( SELECT floor(RAND()
* (( SELECT MAX (id) FROM my_table)-( SELECT MIN (id) FROM my_table))
+ ( SELECT MIN (id) FROM my_table))) ORDER BY id
LIMIT 5; //隨機取值 |
5.4.1 where子句
- 邏輯操作符:and、or (and優先級高於or)
- 關係操作符:=、!=、<>、<、<=、>、>=、BETWEEN、is、not、in
- 通配符(與like搭配使用):%(任意字符任意次)、_(任意字符單次)
六. 索引
6.1 查看
1
|
SHOW INDEX FROM my_table; |
6.2 創建單個索引
1
2
|
ALTER TABLE t_keywords ADD INDEX idx_keyword
(keyword); CREATE INDEX idx_keyword ON t_keywords
(keyword); |
6.3 創建聯合索引
1
|
ALTER TABLE t_keywords ADD INDEX idx_keyword_time
(keyword, time ); |
6.4 創建前綴索引
1
|
ALTER TABLE t_keywords ADD INDEX idx_keyword
(keyword(5)); |
6.5 擴展索引
1
|
ALTER TABLE t_keywords DROP INDEX idx_keyword ADD INDEX idx_keyword_create_time
(keyword, create_time); |
6.6 刪除
1
|
ALTER TABLE t_keywords DROP INDEX idx_keyword; |
七. 外鍵
7.1 創建
1
|
ALTER TABLE my_table ADD CONSTRAINT fk_userId FOREIGN KEY (my_user_id) REFERENCES other_table
(other_user_id); |
7.2 刪除
1
|
ALTER TABLE my_table DROP FOREIGN KEY fk_name; |
八、存儲引擎
8.1 修改
1
|
ALTER TABLE my_table
ENGINE=INNODB; |