Linux技術--mysql數據庫增-刪-改-查

# 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行 
```

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