mysql常用語句(轉)

原諒轉自: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 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子句

  1. 邏輯操作符:and、or   (and優先級高於or)
  2. 關係操作符:=、!=、<>、<、<=、>、>=、BETWEEN、is、not、in
  3. 通配符(與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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章