mysql md 123456_mysql/mysql.md · sdbxpjzq/docs - Gitee.com
[TOC]
# 創(chuàng)建數(shù)據(jù)庫(kù)
```sql
CREATE DATABASE zongqi;
```
每個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)有個(gè)opt文件,每個(gè)表都有frm文件.有的表有3個(gè)文件(和表設(shè)置的類型有關(guān)).

# 數(shù)據(jù)庫(kù)編碼問(wèn)題
### utf8 和 utf8mb4(支持表情)
utf8mb4兼容utf8,且比utf8能表示更多的字符。在做移動(dòng)應(yīng)用時(shí),會(huì)遇到ios用戶會(huì)在文本的區(qū)域輸入emoji表情,如果不做一定處理,就會(huì)導(dǎo)致插入數(shù)據(jù)庫(kù)異常。需要 >= MySQL 5.5.3版本、從庫(kù)也必須是5.5的了、低版本不支持這個(gè)字符集、復(fù)制報(bào)錯(cuò)
### 查看字符集設(shè)置
`show variables like 'collation_%';`
`show variables like 'character_set_%';`
# 表操作
## 創(chuàng)建表
```sql
CREATE table sales_activity_honey_center {
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(11) not null default 0 COMMENT '用戶id',
`ling_num` int(11) COMMENT '領(lǐng)取次數(shù)'
`ling_time` timestamp DEFAULT NULL COMMENT '領(lǐng)取事件'
-- 下面2行建議必須寫
`ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`mtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
}ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
## 修改表
### add
```sql
alter table [tb_name] add [字段] [約束條件]
```
### change
```sql
alter table [table_name] change [舊字段] [新字段] [約束條件]
```
### drop
```sql
alter table [tb_name] drop [字段];
```
### modify
```sql
alter table [tb_name] modify [列名] [約束定義];
```
## 刪除表
```sql
drop table if exists tb_name;【若存在 刪除 推薦】 這樣不會(huì)報(bào)錯(cuò),只是警告
```
## 清空表
相當(dāng)于 delete 語(yǔ)句不寫 where 子句一樣
```sql
truncate [table_name];
```
## 查看創(chuàng)建表語(yǔ)句
```sql
Show create table [table_name]
```
# 列屬性
## unsigned
- 只能用于數(shù)值類型,表示無(wú)符號(hào)的。
- 不允許數(shù)據(jù)出現(xiàn)負(fù)數(shù)。
- 緊跟在 數(shù)字類型后面,
```sql
create table if not exists USER(
id int(10) unsigned not null auto_increment primary key ,
username varchar(20) not null
);
```
## zerofill
- 只能用于數(shù)值類型,在數(shù)值之前自動(dòng)用0 補(bǔ)齊不足的位數(shù)
- 當(dāng)給一個(gè)字段使用`zerofill`修飾時(shí),該字段自動(dòng)應(yīng)用`unsigned`。
## auto_increment
自動(dòng)增量屬性。此字段**不允許重復(fù)**,只能修飾**整數(shù)類**的字段,
設(shè)置auto_increment必須設(shè)置一個(gè)key
## null和 not null
null是特殊的值,代表無(wú)值,與0和空字符串都不相同
## default
指定一個(gè)默認(rèn)值
## 時(shí)間類型
| 類型 | 大小(字節(jié)) | 范圍 | 格式 | 用途 |
| --------- | ------ | --------------------------------------- | ------------------- | ------------ |
| DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值年月日 |
| TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 時(shí)間值或持續(xù)時(shí)間時(shí)分秒 |
| YEAR | 1 | 1901/2155 | YYYY | 年份值 |
| DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和時(shí)間值 |
| TIMESTAMP | 8 | 1970-01-01 00:00:00/2038 年某時(shí) | YYYYMMDD HHMMSS | 混合日期和時(shí)間值,時(shí)間戳 |
- timestamp
需要經(jīng)常插入或者更新日期為當(dāng)前系統(tǒng)時(shí)間,推薦使用 timestamp來(lái)標(biāo)識(shí).返回String.
# 索引
### 主鍵索引 primary key
一個(gè)表只能指定一個(gè)主鍵,且主鍵的值不能為空。
### 唯一索引 unique
一個(gè)表中可以有多個(gè)唯一索引。
主要是為了避免數(shù)據(jù)出現(xiàn)重復(fù)。
主鍵和唯一鍵約束是通過(guò)參考索引實(shí)施的,如果插入的值均為NULL,則根據(jù)索引的原理,全NULL值不被記錄在索引上,所以插入全NULL值時(shí),可以有重復(fù)的,而其他的則不能插入重復(fù)值。
alter table t add constraint uk_t_1 unique (a,b);
insert into t (a ,b ) values (null,1); # 不能重復(fù)
insert into t (a ,b ) values (null,null);#可以重復(fù) .
1. 創(chuàng)建表的時(shí)候直接指定
```sql
CREATE TABLE `sales_activity_honey` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`type` tinyint(4) DEFAULT '0' COMMENT '活動(dòng)類型ID',
`uid` int(11) NOT NULL DEFAULT '0' COMMENT '用戶id',
`num` int(11) DEFAULT NULL COMMENT '連續(xù)領(lǐng)取次數(shù)',
`honey` int(11) DEFAULT NULL COMMENT '總領(lǐng)取數(shù)量',
`last_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `unq_uid_type` (`uid`,`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
2. 創(chuàng)建索引
```sql
CREATE UNIQUE INDEX indexName ON mytable(username(length))
// length注意:
如果是CHAR,VARCHAR類型,length可以小于字段實(shí)際長(zhǎng)度;
如果是BLOB和TEXT類型,必須指定 length。
```
3. 修改表結(jié)構(gòu)
```sql
ALTER table mytable ADD UNIQUE [uniq_name] ([字段1,字段2])
```
4. 刪除索引
```sql
alter table [table_name] drop key [key_name]
```
?
### 常規(guī)索引 index || key
關(guān)鍵字 index 或 key
索引應(yīng)該建立在搜索,排序,分組等操涉及的數(shù)據(jù)列上,就是在 where字句,from字句,order by字句,group by字句
不要建立太多索引,索引會(huì)消耗系統(tǒng)資源。
1. 創(chuàng)建表的時(shí)候直接指定
```sql
create table if not exists you(
id int not null ,
youname CHAR(20),
index indexname(youname(20))
);
```
2. 創(chuàng)建索引
```sql
CREATE INDEX indexName ON mytable(username(length));
```
3. 修改表結(jié)構(gòu)
```sql
ALTER mytable ADD INDEX [indexName] ON (username(length))
```
### 刪除索引
```sql
DROP INDEX [indexName] ON mytable;
```
# CURD
## 插入數(shù)據(jù)
```sql
insert into [tables_name](column1,column2,...) values(value1, value2,..)
```
### 更新數(shù)據(jù)
```sql
update [tables_name]set column1 = new_value1,column2 = new_value2,… WHERE definition
```
**update 表達(dá)式**
```sql
UPDATE article SET pv = pv+1 WHERE id = 123
```
**同時(shí)更新多個(gè)表**
```sql
update emp as a,dept as b set
```
## 查詢數(shù)據(jù)
```sql
select column1,column1,... FROM tb_name
```
## 替換數(shù)據(jù)
【主鍵或唯一索引沖突,執(zhí)行替換,否則插入】
# 連表查詢

## 內(nèi)連接
選出兩張表中相互匹配的記錄,連接的多個(gè)數(shù)據(jù)必須存在才能進(jìn)行連接 .
方式一:
```sql
select a.ename, b.deptname from emp as a,dept as b where a.deptno=b.deptno; //在沒有用關(guān)鍵字的情況下,使用on條件會(huì)報(bào)錯(cuò)
```
方式二:
`inner join`關(guān)鍵字
```sql
select * from news inner join you on news.id = you.id;
```
方式三:
`using()`關(guān)鍵字
要求:**連接的兩個(gè)實(shí)體之間的字段名稱一致**
```sql
select * from news inner join you using(id);
```
## 外連接
### 左連接(left outer join)
包含所有左邊表中的記錄,甚至是右表中沒有和他相匹配的記錄.
### 右連接(right outer join)
包含所有的右邊的記錄,甚至是左邊表中沒有與他相匹配的記錄
### 注意事項(xiàng)
1. 不支持`where`作為連接條件, 使用 `on`
2. `using`:會(huì)去掉結(jié)果中的重復(fù)字段,并將判斷條件放在第一列
3. 外連接不能缺少連接條件,否則會(huì)報(bào)錯(cuò)
```sql
A left join B ON 條件表達(dá)式;
select * from news left join you on news.id=you.id;
```
## 自然連接(natural join)
通過(guò)mysql自己的判斷完成連接的過(guò)程,不需要指定連接條件,mysql會(huì)使用多表內(nèi)的,相同的字段,作為連接條件。
```sql
select * from table1 natrual join table2;
```
分類:
- 內(nèi)連接:`natural join`
- 左外連接:`natural left join`
- 右外連接:`natural right join`
# SQL中on條件與where條件的區(qū)別
數(shù)據(jù)庫(kù)在通過(guò)連接兩張或多張表來(lái)返回記錄時(shí),都會(huì)生成一張中間的臨時(shí)表,然后再將這張臨時(shí)表返回給用戶。
在使用`left jion`時(shí),`on`和`where`條件的區(qū)別如下:
1、 `on`條件是在生成臨時(shí)表時(shí)使用的條件,它不管on中的條件是否為真,都會(huì)返回左邊表中的記錄。
2、`where`條件是在臨時(shí)表生成好后,再對(duì)臨時(shí)表進(jìn)行過(guò)濾的條件。這時(shí)已經(jīng)沒有`left join`的含義(必須返回左邊表的記錄)了,條件不為真的就全部過(guò)濾掉。
# 聯(lián)合查詢 - union ,union all
合并兩個(gè)或多個(gè) SELECT 語(yǔ)句的結(jié)果集
`union` 、`union all`
## union和union all的區(qū)別
- union all是把結(jié)果直接合并在一起
- union是將union all的后的結(jié)果進(jìn)行一次`distinct`(去重),之后的結(jié)果
栗子:
```sql
(select id from news)
union all
(select id from you);//推薦將select語(yǔ)句用()包起來(lái)
```
```txt
id
--------
2
3
4
5
2
3
```
```sql
(select id from news)
union
(select id from you);
```
```txt
id
--------
2
3
4
5
```
## 注意事項(xiàng)
1. **子語(yǔ)句的 order by,只有在配合limit時(shí),才會(huì)生效**.
原因:union會(huì)對(duì)沒有l(wèi)imit 的 order by 忽略。
```sql
(SELECT id,name FROM table_name1 order by id limit 100)
union
(SELECT id,name FROM table_name2 order by id limit 100);
```
對(duì)union結(jié)果排序
```sql
(SELECT id, name FROM table_name1)
union
(SELECT id,name FROM table_name2)order by id asc|desc;
```
2. **UNION 內(nèi)部的 SELECT 語(yǔ)句必須擁有相同數(shù)量的列**
3. **列也必須擁有相似的數(shù)據(jù)類型。同時(shí),每條 SELECT 語(yǔ)句中的列的順序必須相同**
# 用戶
## 創(chuàng)建用戶
```sql
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
```
username - 你將創(chuàng)建的用戶名,
host - 指定該用戶在哪個(gè)主機(jī)上可以登陸.`%` 表示任意主機(jī)
password - 該用戶的登陸密碼
## 授權(quán)
```sql
GRANT privileges ON databasename.tablename TO 'username'@'host'
```
privileges - 用戶的操作權(quán)限,如SELECT , INSERT , UPDATE 等. `ALL`表示授予所的權(quán)限.
databasename - 數(shù)據(jù)庫(kù)名
tablename-表名,
如果要授予該用戶對(duì)所有數(shù)據(jù)庫(kù)和表的相應(yīng)操作權(quán)限則可用`*`表示
栗子:
```sql
GRANT ALL ON zongqi.* TO 'zongqi'@'%'
```
## 撤銷用戶權(quán)限
```sql
REVOKE privilege ON databasename.tablename FROM 'username'@'host';
```
注意: 假如你在給用戶'pig'@'%'授權(quán)的時(shí)候是這樣的(或類似的):
`GRANT SELECT ON test.user TO 'pig'@'%'`, 則在使用`REVOKE SELECT ON *.* FROM 'pig'@'%'`;命令并不能撤銷該用戶對(duì)test數(shù)據(jù)庫(kù)中user表的SELECT 操作.
如果授權(quán)使用的是`GRANT SELECT ON *.* TO 'pig'@'%'`;則`REVOKE SELECT ON test.user FROM 'pig'@'%'`;命令也不能撤銷該用戶對(duì)test數(shù)據(jù)庫(kù)中user表的Select 權(quán)限.
## 設(shè)置與更改用戶密碼
```sql
SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');如果是當(dāng)前登陸用戶用SET PASSWORD = PASSWORD("newpassword");
```
例子:
```sql
SET PASSWORD FOR 'pig'@'%' = PASSWORD("123456");
```
## 刪除用戶
```sql
DROP USER 'username'@'host';
```
# 模式問(wèn)題
## 查看模式
```sql
select @@sql_mode;
SELECT @@GLOBAL.sql_mode;
```
## 修改模式
需要root權(quán)限
### 修改配置文件
` vim /etc/my.cnf`
在`[mysqld]`下面添加如下列:
`sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES`
### 執(zhí)行sql
```sql
SET @@sql_mode="NO_ENGINE_SUBSTITUTION";
SET @@GLOBAL.sql_mode="NO_ENGINE_SUBSTITUTION";
```
http://www.ywnds.com/?p=8865
一鍵復(fù)制
編輯
Web IDE
原始數(shù)據(jù)
按行查看
歷史
總結(jié)
以上是生活随笔為你收集整理的mysql md 123456_mysql/mysql.md · sdbxpjzq/docs - Gitee.com的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 入选最受关注AI公司的Kitt.AI:多
- 下一篇: 范德堡大学计算机专业研究生,范德堡大学计