參考
MySQL 5.5 Reference Manual
MySQL 教程 | 菜鳥(niǎo)教程
知識(shí)點(diǎn)大綱
- 1 基本知識(shí)
- 1.1概念
- 1.2安裝與連接
- 1.3客戶端
- 1.4數(shù)據(jù)類型
- 2 DDL
- 2.1庫(kù)操作
- 2.2表操作
- 2.3列操作
- 3 DML
- 增刪改
- 查
- 4 DCL
- 權(quán)限
- 5 高級(jí)(優(yōu)化等等)
1 基本知識(shí)

1.1概念
1.2安裝與連接
1.3客戶端
1.4數(shù)據(jù)類型
因?yàn)閙ysql主要業(yè)務(wù)就是處理數(shù)據(jù),所以他對(duì)數(shù)據(jù)處理更加細(xì)致,數(shù)據(jù)的分類上就很細(xì),大致分為三類:
- 數(shù)值型
- 字符串型
- 時(shí)間日期型
數(shù)值型又細(xì)分為整型 浮點(diǎn)型和定點(diǎn)型,下面細(xì)說(shuō)
數(shù)據(jù)類型>數(shù)值型>整型
|類型名|取值范圍(有符號(hào)或無(wú)符號(hào))|占用存儲(chǔ)(字節(jié))|范圍對(duì)應(yīng)感覺(jué)|
|-|-|-|
|TINYINT| -128~127 或0~2^8-1 | 1|比如存年齡|
|SMALLINT |-32768~32767或0~2^16-1 |2|正負(fù)3萬(wàn),一般商品ID夠了|
|MEDIUMINT |-223~223-1或0~2^24-1 |3|正負(fù)八百萬(wàn)|
|INT| -231~231-1或0~2^32-1 |4|正負(fù)20億|
|BIGINT |-263~263-1或0~2^64-1 |8|正負(fù)十萬(wàn)萬(wàn)億...|
一個(gè)字節(jié)byte=8位bit
有沒(méi)有符號(hào)用unsigned來(lái)表明,
整型還有zerofill和M屬性
M的意思是表明數(shù)字最長(zhǎng)有幾位,配合zerofill用會(huì)將不足的位數(shù)用0填充,如果不寫zerofill,其實(shí)M起不到任何作用,沒(méi)有意義
此此外,寫了zerofill那就是自動(dòng)unsigned的。
數(shù)據(jù)類型>數(shù)值型>定點(diǎn)與浮點(diǎn)
|類型名 |占用存儲(chǔ)(字節(jié))|范圍|
|-|-|
|FLOAT(M,D)| 4|正負(fù)3.4E+38|
|DOUBLE(M,D)| 8|范圍更大,不必去記憶了|
|DECIMAL(M, D) |M+2 (ver >3.23)||
M表示小數(shù)點(diǎn)前后總位數(shù),D表示小數(shù)點(diǎn)后面位數(shù),而且不同于int的M值在zerofill時(shí)才有用,浮點(diǎn)數(shù)的M和D是真的有用,就是這個(gè)范圍了
為什么float和int都是4字節(jié),范圍不一樣呢
float/double , 有精度損失
decimal 定點(diǎn)型,更精確
定點(diǎn)型,是將整數(shù)部分和小數(shù)部分用分別用數(shù)字來(lái)存儲(chǔ)的,所以定點(diǎn)型更精確,看如下的例子

在為列選擇了使用某種數(shù)值類型時(shí),除了要考慮數(shù)據(jù)的類型外,還應(yīng)該注意所要表示的值的范圍和存儲(chǔ)需求,只需選擇能覆蓋要取值的范圍的最小類型即可。
數(shù)據(jù)類型>字符串型
| 類型名 | 備注 |
|---|---|
| CHAR(M) | 定長(zhǎng)字符串,M<255字符,M表示字符數(shù),不夠M的會(huì)用空格填充 |
| VARCHAR(M) | 變長(zhǎng)字符串,M<(65535轉(zhuǎn)換成對(duì)應(yīng)的字符數(shù)) |
| TEXT(M) | M<2^16-1=65535字符 與varchar相反,很大的文本,慢,能用varchar就用varchar |
| ENUM('value1','value2',...) | 枚舉:列只能賦值為某個(gè)枚舉成員或NULL |
| SET('value1','value2',...) | 集合:列可以賦值為多個(gè)(最多64個(gè))集合成員或NULL |
| BLOB | BLOB(2^16-1)音頻圖像等 |
| TINYBLOB | BLOB(2^8-1) |
| MEDIUMBLOB | BLOB(2^24-1) |
| LONGBLOB | BLOB(2^32-1) |
| TINYTEXT | TEXT(2^8-1) |
| MEDIUMTEXT | TEXT(2^24-1) |
| LONGTEXT | TEXT(2^32-1) |
表格中,BLOB是一個(gè)能保存可變數(shù)量的數(shù)據(jù)的二進(jìn)制的大對(duì)象。在某種意義上,串實(shí)際是一種非常“通用”類型,因?yàn)榭捎盟鼈儊?lái)表示任意值,不僅僅是字符串。例如,可用串類型來(lái)存儲(chǔ)二進(jìn)制數(shù)據(jù),如圖像、視頻或音頻。
char和varchard的選擇?
字?jǐn)?shù)少于20的話 直接用char,速度快
char和varchar的區(qū)別很有意思,有時(shí)單獨(dú)開(kāi)一篇
數(shù)據(jù)類型>日期和時(shí)間列類型
|類型名 |范圍|含義|
|-|-|
|DATE|1000-01-01
到9999-12-31|日期, 'YYYY-MM-DD'
年份寫兩位的話0-69是用用20補(bǔ)全,70-99是用19補(bǔ)全|
|TIME|-838:59:59
到838:59:59|時(shí)間, 'HH:MM:SS'|
|DATETIME||時(shí)間和時(shí)間組合, 'YYYY-MM-DD HH:MM:SS|
|TIMESTAMP||時(shí)間戳,是1970-01-01到當(dāng)前的秒數(shù)
timestamp不填的話會(huì)自動(dòng)插入和更新|
所有時(shí)間日期類型數(shù)據(jù)要加引號(hào)插入
舉例,生成一個(gè)日期和時(shí)間表,并插入2個(gè)元素:
CREATE TABLE my_test
(
id INT,
ts TIMESTAMP
)
INSERT my_test VALUES(1,20010101000000)
INSERT my_test(id) VALUES(2);
SELECT * from my_test
+------+----------------+
| id | ts |
+------+----------------+
| 1 | 20010101000000 |
| 2 | 20010113165713 |
+------+----------------+
轉(zhuǎn)意序列列表
| 符號(hào) | 含義 |
|---|---|
| \0 ASCII 0(NUL)字符 | |
| \r | 回車 |
| \b | 退格 |
| ' | 單引號(hào) |
| % | 百分號(hào) |
| \n | 換行 |
| \t | 定位符 |
| 反斜杠 | |
| " | 雙引號(hào) |
| _ | 下劃線 |
2 DDL操作
2.1庫(kù)操作 增刪改查

|序號(hào)|操作 |語(yǔ)法|備注|
|-|-|-|
|1|創(chuàng)建庫(kù)| create database dbname;|數(shù)據(jù)庫(kù)名字可用是數(shù)字,字母,下劃線和美元符號(hào)組成,不能用數(shù)字開(kāi)頭。建議都小寫。|
|2|查看庫(kù)所有庫(kù)| show databases;||
|3|選庫(kù)| use dbname;||
|4|刪除庫(kù)|drop databse dbname;| 謹(jǐn)慎操作!|
|5|查看當(dāng)前庫(kù) | mysql> SELECT database();||
|6|查看當(dāng)前狀態(tài) | mysql> status;||
|7|改root密碼| mysql> SET PASSWORD FOR 'root'@'localhost' = 'newpass';|-|
2.2表操作

2.2.1創(chuàng)建表
全面語(yǔ)法
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
create_definition:
col_name column_definition
| [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
[index_option] ...
| {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
[index_option] ...
| [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
[index_name] [index_type] (index_col_name,...)
[index_option] ...
| {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)
[index_option] ...
| [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name,...) reference_definition
| CHECK (expr)
column_definition:
data_type [NOT NULL | NULL] [DEFAULT default_value]
[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
[COMMENT 'string']
[COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
[STORAGE {DISK|MEMORY|DEFAULT}]
[reference_definition]
| 重要參數(shù) | 說(shuō)明 | |
| type | 字段類型 就是列類型,參見(jiàn)數(shù)據(jù)類型 | |
| not null | 如果不寫,默認(rèn)插入null,如果聲明了not null,那就不允許空著,或者設(shè)置default | |
| default | 設(shè)定默認(rèn)值 | |
| auoto_increment | 設(shè)定自動(dòng)編號(hào),每個(gè)表只能有一個(gè)自增列,并且必須被索引 | |
| primary key | 設(shè)定主鍵,主鍵是不能重復(fù)的 |
實(shí)例
mysql> create table goods2 (
-> goods_id int(10) not null auto_increment primary key,
->goods_num int(10) not null default 0);
Query OK, 0 rows affected (0.02 sec)
注意列名一律小寫,因?yàn)閚ull查詢不方便所以所有列都要聲明not null
2.2.2刪除表
drop table tbl_name;
2.2.3查看表
查看本數(shù)據(jù)庫(kù)的所有表
show tables;
查看某一個(gè)表的列
語(yǔ)法SHOW COLUMNS Syntax
SHOW [FULL] {COLUMNS | FIELDS} {FROM | IN} tbl_name [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]
實(shí)例
show columns from shop.goods2;

或者用describe table語(yǔ)法

2.2.4 改表名
實(shí)例(rename)
rename table goods2 to shangpin;

2.3 列操作 修改列ALTER TABLE Syntax(添加 刪除 修改列)

全面語(yǔ)法
ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_options]
alter_specification:
table_options
| ADD [COLUMN] col_name column_definition
[FIRST | AFTER col_name ]
| ADD [COLUMN] (col_name column_definition,...)
| ADD {INDEX|KEY} [index_name]
[index_type] (index_col_name,...) [index_option] ...
| ADD [CONSTRAINT [symbol]] PRIMARY KEY
[index_type] (index_col_name,...) [index_option] ...
| ADD [CONSTRAINT [symbol]]
UNIQUE [INDEX|KEY] [index_name]
[index_type] (index_col_name,...) [index_option] ...
| ADD FULLTEXT [INDEX|KEY] [index_name]
(index_col_name,...) [index_option] ...
| ADD SPATIAL [INDEX|KEY] [index_name]
(index_col_name,...) [index_option] ...
| ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,...)
reference_definition
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] old_col_name new_col_name column_definition
[FIRST|AFTER col_name]
| MODIFY [COLUMN] col_name column_definition
[FIRST | AFTER col_name]
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP {INDEX|KEY} index_name
| DROP FOREIGN KEY fk_symbol
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO|AS] new_tbl_name
| ORDER BY col_name [, col_name] ...
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]
| DISCARD TABLESPACE
| IMPORT TABLESPACE
| FORCE
| ADD PARTITION (partition_definition)
| DROP PARTITION partition_names
| TRUNCATE PARTITION {partition_names | ALL}
| COALESCE PARTITION number
| REORGANIZE PARTITION [partition_names INTO (partition_definitions)]
| ANALYZE PARTITION {partition_names | ALL}
| CHECK PARTITION {partition_names | ALL}
| OPTIMIZE PARTITION {partition_names | ALL}
| REBUILD PARTITION {partition_names | ALL}
| REPAIR PARTITION {partition_names | ALL}
| PARTITION BY partitioning_expression
| REMOVE PARTITIONING
實(shí)例(add)
alter table goods2 add imag1 varchar(100) not null;

深入學(xué)習(xí) MySQL 5.5 Reference Manual/SQL Statement Syntax/Data Definition Statements/
3 DML操作(行操作)

3.1增加數(shù)據(jù)insert
Insert
語(yǔ)法
insert into tbl_name
(col_name,…) values (value1,…) //指定列
insertinto *tbl_name
(value1,…) //所有列
insert into tbl_name
*(value1,…),(value1,…),**(value1,…) //一次加入多行
注意:數(shù)字不用加單引號(hào),字符串必須加單引號(hào)
3.2 刪除delete
delete from tbl_name (col_name,…) where expr
3.3 更改 update
update tbl_name set col_name = value where expr
3.3 查找數(shù)據(jù)select
select * from tbl_name
select * from tbl_name where expr
高級(jí)版
SELECT selection_list // 選擇哪些列
FROM table_list // 從何處選擇行
WHERE primary_constraint // 行必須滿足什么條件
GROUP BY grouping_columns // 怎樣對(duì)結(jié)果分組
HAVING secondary_constraint // 行必須滿足的第二條件
ORDER BY sorting_columns // 怎樣對(duì)結(jié)果排序
LIMIT count // 結(jié)果限定
Tips: 所有使用的關(guān)鍵詞必須精確地以上面的順序給出。例如,一個(gè) HAVING 子句必須跟在 GROUP BY 子句之后和 ORDER BY 子句之前。
where→group by →having→order by→ limit
實(shí)例:
mysql> SELECT * FROM pet; // 普通查詢
mysql> SELECT * FROM pet WHERE name = "Bowser"; // 查詢特定行
mysql> SELECT name, birth FROM pet where owner="Gwen"; // 查詢特定列
mysql> SELECT death-birth FROM pet WHERE name="Bowser"; // 表達(dá)式計(jì)算
mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f"; // 條件查詢
mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m") // 多重條件
-> OR (species = "dog" AND sex = "f");
mysql> SELECT name, birth FROM pet ORDER BY birth DESC; // 排序輸出
mysql>SELECT * FROM pet GROUP BY species; // 分組輸出
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; // 分組統(tǒng)計(jì)