# mysql 數據庫
## 數據庫的操作
### 五個單位
* 數據庫服務器 Linux或者 windows
* 數據庫
* 數據表
* 數據字段
* 數據行
### 連接數據庫
```
1.windows win+R 打開cmd
mysql -u root -p
-u 用戶名
-p 密碼
linux 也是 mysql -u root -p
2. 可視化工具 navicat
```
### 創建數據庫 database
```
mysql> create database python06; #分號結束 如果不寫代表一直輸入 直到 遇到分號
Query OK, 1 row affected (0.01 sec) ok表示創建成功
```
### 查看數據庫
```
show databases; #查看數據庫
databases 全部數據庫 這裏是複數
```
### 選中數據庫
```
use 數據庫名字;
mysql> use python1806;
Database changed #表示被選中
```
### 查看數據庫中的數據表 table 表
```
1.先選中數據庫
2.show tables;#列出所有的數據表
```
### 刪除數據庫
```
drop database 數據庫名;
mysql> drop database python06;
Query OK, 0 rows affected (0.06 sec
```
## 數據表的操作
### 創建表
```
create table 表名(字段名 類型(長度),字段1 類型(長度));
mysql> create table users(id int(11),name char(64),age int(4));
Query OK, 0 rows affected (0.02 sec)
```
### 查看錶結構
```
mysql> desc user;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(64) | YES | | NULL | |
| age | int(4) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
```
### 刪除表
```
mysql> drop table users;
Query OK, 0 rows affected (0.07 sec)
```
### 創建表 指定 引擎 和 字符集
```
mysql 引擎 myisam innodb
字符集 utf-8
create table 表名(id int(11))engine=MyISAM default charset=utf8;
mysql> create table user(id int(11),name varchar(64),age int(4))engine=Myisam default charset=utf8;
Query OK, 0 rows affected (0.22 sec)
mysql> show create table user; #查看錶的創建過程
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| user | CREATE TABLE `user` (
`id` int(11) DEFAULT NULL,
`name` varchar(64) DEFAULT NULL,
`age` int(4) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> show create table info;#如果說創建表 不指定引擎 mysql5.7的默認引擎是 innodb 5.7以前是myisam
+-------+---------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------+
| info | CREATE TABLE `info` (
`id` int(11) DEFAULT NULL,
`name` varchar(64) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
```
## 數據字段的操作 alter table 表名
```
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(64) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
field 字段名
type 字段類型
null 是否爲空
key 是否爲主鍵
default 默認值
extra 額外信息 備註信息
desc 表名;查看錶結構
```
### 修改表字段類型 modify 修改類型
```
alter table 表名 modify 字段名 新類型(長度);
mysql> alter table info modify name char(32);
```
### 調整字段的順序 modify
```
mysql> alter table info modify infomations char(64) first; #沒有second last
alter table 表名 modify 字段名 類型(長度) first;
#這裏的類型長度不需要非得原來的類型和長度 可以自己重新定義 但是不要瞎自定義
```
### 增加表字段 add column
```
mysql> alter table info add column age int(4);
alter table 表名 add column 字段名 類型(長度);
```
### 增加表字段的時候 控制字段順序 after
```
alter table 表名 add 字段名 字段類型(長度) after 指定字段名;
mysql> alter table info add sex int(1) after name; 將新增加的字段 添加到 name後邊
新增字段 放到第一個位置
mysql> alter table info add infoid int(11) first; #不加first 會添加到最後一行
```
### 刪除表字段 drop column
```
alter table 表示 drop column 字段名;
mysql> alter table info drop column infoid;
```
### 表字段改名 change
```
mysql> alter table info change infos infomations char(64);
alter table 表名 change 原字段名 新字段名 類型(長度);
```
### 修改表名 rename
```
alter table 表名 rename 新名字;
```
## mysql 數據類型
* 數值類型(整型 浮點型)
* 字符串
* 日期時間
* 符合類型
* 空間類型 (用來科學計算)
### 整型
| 類型 | 所佔字節 | 範圍 |
| --------- | ---- | ------------ |
| int | 4 | |
| tinyint | 1 | -128~127 |
| smallint | 2 | -32768-32767 |
| mediumint | 3 | |
| bigint | 8 | |
> 在開發過程中 性別 不存男女 存 0 男 1 女 2 未知
>
> 年齡 沒有負數
### 浮點型
| 類型 | 所佔字節 | 範圍 |
| ----------- | ---- | ---------------------- |
| float(m,d) | 4 | 單精度 m 表示長度 d 小數點位數 |
| double(m,d) | 8 | 雙精度 m表示長度 d表示小數點位數 |
| decimal | | '123.456789' 存儲字符串的浮點數 |
> decimal定點數 如果某個字段 精度要求比較高 比如銀行金額 就選用decimal
### 字符類型
| 類型 | 所佔字節 | 長度 |
| ---------- | ------- | ----------- |
| char | 0-255 | 定長 |
| varchar | 0-255 | 變長 |
| tinyblob | 0-255 | 二進制短文本字符串 |
| blob | 0-65535 | 二進制形式的長文本數據 |
| text | 0-65535 | 長文本數據 |
| tinytext | 0-255 | 短文本數據 |
| mediumtext | | 中等長度文本 |
| mediumblob | | 中等二進制形式文本 |
| longtext | | 極長文本 |
| longblob | | 極長二進制文本 |
| | | |
| | | |
> char 定長 佔據0-255 字節超過 被忽略 不足255 用空格填補上
>
> varchar 也是佔據0-255個字節 超過255 個字節被忽略 不足255個字節 不用空格補 能夠節約磁盤空間 提高效率
>
> 可以根據實際內容 動態的修改 存儲的長度
>
> blob 圖像 聲音 二進制類型 可以使用blob 來存儲 blob 裏邊內容嚴格區分大小寫
>
> text 不區分大小
### 時間類型
| 數據類型 | 所佔字節 | 範圍 |
| --------- | ---- | ------------------- |
| date | 3 | 2018-09-04 |
| time | 3 | 11:35:43 |
| datetime | 8 | 2018-09-04 11:35:43 |
| timestamp | 4 | 自動存儲記錄修改的時間 |
| year | 1 | 年份 |
| | | |
> 一般存儲時間 不存儲 2018-09-04 11:35:43 存時間戳
>
> 土豪 也可以用 datetime 直接存儲
### 複合類型
| 類型 | 說明 | 舉例 |
| ---- | ---- | ---------------------------------- |
| set | 集合類型 | set("member1","member2","member3") |
| enum | 枚舉類型 | |
> enum只能從集合中取 一個值 單選框
>
> set 允許從集合中取任意多個值
### 類型的使用
unsigned 無符號的意思 表示該字段 只能是整數 比如 id age id int(11) unsigned
zerofill age int(4) zerofill
not null id int(11) not null
null 精確說法是無 不是空字符串 0 一般在創建整型或者浮點型字段的時候 聲明 not null 即可
### 字符集
中文 英語 法語 俄語 德語 日語 需要對常用的符號進行編碼 這個編碼就是字符集 字符集就相當於 計算機中 人類的語言
比如 說的英文 用英文存儲 說過說的是中文 用英文來存儲的話 看不懂
* 常用的字符集
* 數據庫用什麼字符集即可
ASCII碼 單字節
GBK 雙字節
Unicode 4個字節 萬國碼 容納世界上 所有文字和符號的字符編碼方案 能夠跨語言 跨平臺
utf-8 1-6分字節 針對 Unicode 可變字符編碼
實際工作用 需要的 編碼
* gbk_chinese_ci 簡體中文 不區分大小寫
* utf8_general_ci unicode 多語言 不區分大小寫
### 表 引擎
| 引擎名稱 | 說明 |
| ------ | ------------------------------ |
| myisam | 常用引擎 讀的效率高 不支持事務 表鎖 支持全文索引 |
| innodb | 支持事務 數據安全性高 行鎖 |
> 如果你這張表 用來 讀 寫 那 選擇myisam 引擎
>
> 如果你這張表 經常更新 刪除 選擇 innodb 引擎
## 索引
* 普通索引 最基本的索引 沒有任何限制
* 唯一索引 要求該字段對應的列 不能有重複值 年齡 性別 不能添加唯一索引
* 主鍵索引 特殊的唯一索引 要求這一列不能有重複值 不能爲空
* 複合索引 所謂的複合索引就是 對多個字段同時添加索引
* 全文索引 需要對數據全局搜索 需要添加全文索引
#### 普通索引
```
alter table 表名 add index(字段);
mysql> alter table user add index(name);
show index from 表名;查看數據表所有的索引
mysql> alter table user drop index name; #刪除索引
mysql> alter table user add index in_name(name); #添加索引的同時 起名字
mysql> alter table user drop index in_name;
```
### 唯一索引
```
alter table user add unique(name);
alter table bailele drop index name;#刪除唯一索引
mysql> alter table user add unique un_name(name); un_name 是索引的名字
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
alter table bailele drop index un_name;;#刪除唯一索引
show index from 表名\G \G表示最佳閱讀體驗閱讀 寫了\G就不要寫;
```
### 主鍵索引
```
alter table user drop primary key; #刪除主鍵索引 如果說 主鍵自動遞增 會刪不掉
需要先 消除主鍵自增
mysql> alter table user modify id int(11) unsigned not null;#消除自增
mysql> alter table user drop primary key; #再次刪除 ok
mysql> alter table user add primary key(id); #添加主鍵索引
mysql> alter table user modify id int(11) unsigned not null auto_increment;#讓主鍵自動遞增
auto_increment 要放到 unsigned 後面
```
### 全文索引
```
mysql> alter table user add column contents text;
alter table user add fulltext(字段名);
mysql> alter table user add fulltext(contents);
mysql> alter table user drop index contents;
```
### 創建表的時候直接聲明索引
```mysql
create table test(
id int(11) unsigned not null,
username varchar(20) not null,
password char(32) not null,
content text,
primary key(id),
index pw(password),
unique un_name(username),
fulltext quanwen(content)
)engine=myisam default charset=utf8;
```
## 語句的操作 增刪改查
### 增 insert
```
1.insert into 表名 values(值1,值2,值3,值4); 有多少個字段 就必須插入多少個值 一個不能多 一個不能少 如果有默認值 你不想傳 寫null 即可
2.insert into 表名(字段1,字段2,字段3,字段4) values(值1,值2,值3,值4);
本來有5個字段 其中一個字段有默認值 可以只寫 4個字段 對應的值 寫4個即可
mysql> insert into test values(1,'hahahaha','123abc','太陽出來東方亮');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test(id,password) values(2,'123321');
Query OK, 1 row affected (0.00 sec)
```
### 批量插入
```
create table users(id int(11) unsigned not null primary key auto_increment,username char(64) not null,password char(60),email char(64) not null,sex tinyint not null)engine=innodb default charset=utf8;
mysql> insert into users(username,email,sex) values
('canglaoshi','[email protected]',1),
('sicong','[email protected]',1),
('dongge','[email protected]',1),
('mochameimei','[email protected]',1);
```
## 查詢 select
```
select 'zelinx'; #類似於Linux中的 echo 'zelinx';
create table money(
id int(11) unsigned not null primary key auto_increment,
username varchar(50) not null,
balance float(8,2) not null,
province varchar(20) not null,
age tinyint unsigned not null,
sex tinyint not null
)engine=Myisam default charset=utf8;
INSERT INTO `money` (`id`, `username`, `balance`, `province`, `age`, `sex`) VALUES ('9', '薛之謙', '88888.12', '上海', '30', '0');
```
#### 基礎查詢
```
select * from 表名;
* 正則表達式寫法 匹配所有 顯示所有字段的信息
mysql> select * from money;
+----+--------------+-----------+-----------+-----+-----+
| id | username | balance | province | age | sex |
+----+--------------+-----------+-----------+-----+-----+
| 1 | 澤林兄 | 88888.12 | 遼寧 | 19 | 0 |
| 2 | 秋林兄 | 66666.45 | 黑龍江 | 18 | 0 |
| 3 | 王思聰 | 99999.99 | 北京 | 30 | 0 |
| 4 | 劉強東 | 99999.66 | 江蘇 | 40 | 0 |
| 5 | 抹茶妹妹 | 77777.66 | 浙江 | 30 | 1 |
| 6 | 范冰冰 | 77777.31 | 山東 | 40 | 1 |
| 7 | 李晨 | 666666.12 | 北京 | 30 | 0 |
| 8 | 魏纓絡 | 7777.13 | 上海 | 29 | 1 |
| 9 | 薛之謙 | 88888.12 | 上海 | 30 | 0 |
+----+--------------+-----------+-----------+-----+-----+
9 rows in set (0.00 sec)
```
### 指定字段查詢
```
mysql> select id,username,balance from money;
+----+--------------+-----------+
| id | username | balance |
+----+--------------+-----------+
| 1 | 澤林兄 | 88888.12 |
| 2 | 秋林兄 | 66666.45 |
| 3 | 王思聰 | 99999.99 |
| 4 | 劉強東 | 99999.66 |
| 5 | 抹茶妹妹 | 77777.66 |
| 6 | 范冰冰 | 77777.31 |
| 7 | 李晨 | 666666.12 |
| 8 | 魏纓絡 | 7777.13 |
| 9 | 薛之謙 | 88888.12 |
+----+--------------+-----------+
9 rows in set (0.00 sec)
```
> 2000條 及以內數據 查詢 不需要添加索引 添加索引反而累贅
>
> 2000條以上的數據要是提高查詢速度 需要添加索引
### 查詢 單個字段 不重複記錄
```
mysql> select distinct age from money;
+-----+
| age |
+-----+
| 19 |
| 18 |
| 30 |
| 40 |
| 29 |
+-----+
5 rows in set (0.00 sec)
mysql> select distinct age,id,username from money; #不重複失效
+-----+----+--------------+
| age | id | username |
+-----+----+--------------+
| 19 | 1 | 澤林兄 |
| 18 | 2 | 秋林兄 |
| 30 | 3 | 王思聰 |
| 40 | 4 | 劉強東 |
| 30 | 5 | 抹茶妹妹 |
| 40 | 6 | 范冰冰 |
| 30 | 7 | 李晨 |
| 29 | 8 | 魏纓絡 |
| 30 | 9 | 薛之謙 |
+-----+----+--------------+
9 rows in set (0.00 sec)
```
### 條件查詢
```
mysql> select * from money where age=30;
+----+--------------+-----------+----------+-----+-----+
| id | username | balance | province | age | sex |
+----+--------------+-----------+----------+-----+-----+
| 3 | 王思聰 | 99999.99 | 北京 | 30 | 0 |
| 5 | 抹茶妹妹 | 77777.66 | 浙江 | 30 | 1 |
| 7 | 李晨 | 666666.12 | 北京 | 30 | 0 |
| 9 | 薛之謙 | 88888.12 | 上海 | 30 | 0 |
+----+--------------+-----------+----------+-----+-----+
4 rows in set (0.00 sec)
```
#### where 條件
| 符號 | 說明 |
| ---- | ---- |
| > | |
| < | |
| >= | |
| <= | |
| != | |
| = | |
| or | 或者 |
| and | 並且 |
| | |
```
mysql> select id,username from money where id<9 and province='北京';
+----+-----------+
| id | username |
+----+-----------+
| 3 | 王思聰 |
| 7 | 李晨 |
+----+-----------+
```
### 結果集排序 order by
* desc 倒序排列
* asc 正序排列
```
mysql> select id,username,balance,province from money order by balance desc;
+----+--------------+-----------+-----------+
| id | username | balance | province |
+----+--------------+-----------+-----------+
| 7 | 李晨 | 666666.12 | 北京 |
| 3 | 王思聰 | 99999.99 | 北京 |
| 4 | 劉強東 | 99999.66 | 江蘇 |
| 1 | 澤林兄 | 88888.12 | 遼寧 |
| 9 | 薛之謙 | 88888.12 | 上海 |
| 5 | 抹茶妹妹 | 77777.66 | 浙江 |
| 6 | 范冰冰 | 77777.31 | 山東 |
| 2 | 秋林兄 | 66666.45 | 黑龍江 |
| 8 | 魏纓絡 | 7777.13 | 上海 |
+----+--------------+-----------+-----------+
9 rows in set (0.00 sec)
```
### 多字段 排序
```
mysql> select id,username,balance,age,province from money order by balance desc,age asc;
+----+--------------+-----------+-----+-----------+
| id | username | balance | age | province |
+----+--------------+-----------+-----+-----------+
| 7 | 李晨 | 666666.12 | 30 | 北京 |
| 3 | 王思聰 | 99999.99 | 30 | 北京 |
| 4 | 劉強東 | 99999.66 | 40 | 江蘇 |
| 1 | 澤林兄 | 88888.12 | 19 | 遼寧 |
| 9 | 薛之謙 | 88888.12 | 30 | 上海 |
| 5 | 抹茶妹妹 | 77777.66 | 30 | 浙江 |
| 6 | 范冰冰 | 77777.31 | 40 | 山東 |
| 2 | 秋林兄 | 66666.45 | 18 | 黑龍江 |
| 8 | 魏纓絡 | 7777.13 | 29 | 上海 |
+----+--------------+-----------+-----+-----------+
9 rows in set (0.00 sec)
上面 按照 餘額 降序 年齡升序
如果 第一個字段 已經拍好了 那麼第二個字段就失效
如果第一個字段 排不好 第二個就生效
```
### 限制結果集 limit 數據行 行數
```
mysql> select id,username,balance,age,province from money order by balance desc,age asc limit 5;
+----+-----------+-----------+-----+----------+
| id | username | balance | age | province |
+----+-----------+-----------+-----+----------+
| 7 | 李晨 | 666666.12 | 30 | 北京 |
| 3 | 王思聰 | 99999.99 | 30 | 北京 |
| 4 | 劉強東 | 99999.66 | 40 | 江蘇 |
| 1 | 澤林兄 | 88888.12 | 19 | 遼寧 |
| 9 | 薛之謙 | 88888.12 | 30 | 上海 |
+----+-----------+-----------+-----+----------+
5 rows in set (0.00 sec)
將結果限制爲 5行
```