mysql增刪改查
#### create
- alter 修改表結構 add/change/drop 列名/字段/屬性 類型
change只能修改列的類型,不能修改列的名字
- 添加約束
> alter table scores add constranint stu_score foreign key(stuid) references students(id)
update table set column1=value1,column2=value2,... where
condition
修改數據,修改屬性值
delete from table where condition
物理刪除
select
原始數據集和結果集,結果集基於原有數據集合過濾提取。
- 查詢全部
對列篩選
select * from table
select column1,cloumn2 from table
- 去重
去重某個字段中相同的值
select distinct gender from table
select distinct gender,id from table
- 條件
逐行篩選,逐行判斷
where 逐行篩選,並把知足要求的行放到結果集中。
- 比較運算符
< > = !=
- 邏輯運算符
and or not
- 模糊查找
- like
- %表示多個任意字符
- _表示任意一個字符
select * from table where name like "%鵬%"
select * from table where name like "_鵬"
select * from student where name like "黃%" or name like "%靖"
- 範圍查詢
- in表示在非連續的範圍
> select * from where id in(1,3,8)
- between ... and ... 表示一個連續的範圍
> select * from where id between 3 and 8
- 空判斷
- 注意 null與''是不一樣的
> null不指向內存 ''內存存儲空值
- 判空 is null
> select * from student where birthday is null
- 判斷非空 is not null
> select * from student where birthday is not null
- 優先級
> 小括號,not,比較運算符,邏輯運算符
> and 優先於 or
### 聚合函數
> 將現有的多行數據統計,將原始數據集統計成結果集
> mysql提供了經常使用的5個聚合函數
> count() max(column) min(column) sum(column) avg(column)
> select count(*) from table where isDelete = 1
> 先拿到原始數據集過濾,而後聚合
### 分組
- 分組的目的仍是爲了聚合,把此字段相同的數據組合在同一個組,更好的進行數據統計
-語法
> select column1,column2,column3 from table group by column1,column2,column3
select gender as 性別,count(*) from table group by gender;
### 分組後的數據篩選
- **語法**:
> select column1,column2,column3 from table group by column1,column2,column3 having column1 = xxx
>having功能至關於where,不一樣點是having必須加上group by 上;where是對原始數據集篩選,having是對group by分組後的結果集篩選
### 排序
- 爲了方便查看數據,能夠對數據進行排序。
- 語法:
> select * from table order by column1 asc|desc, column2 asc|desc
> select * from students where isDelete = 0 and gender = 1 order by id desc;
> update subjects set isDelete=1 where title in('linux','redhat')
### 分頁
- 當數據量過大時,在一頁中查看數據是一件很是麻煩的事情
- 語法
> select * from table_name limit start,count
- 從start開始,獲取count條數據
- start索引從0開始
### 示例:實現分頁
- 已知:每頁顯示m條數據,當前顯示第n頁
- 求總頁數:此段邏輯後面也會在python/golang中實現
- 查詢總條數p1
- p1/m=p2
- 若是整除則p2爲總頁數
- 若是不整除則p2+1爲總頁數
- 求第n頁的數據
> select * from students where isDelete = 0 limit (n-1)*m,m
### 總結
- 完整select語句
```
select distinct *
from table_A inner|left|right join table_B on table_A.xxx = table_B.xxx
where ...
group by ... having ...
order by ...
limit start,count
```
- 執行順序爲
```
from table_name
where
group by
select distinct *
having
order by
limit start,count
```
mysql高階操做
### 簡介
- 實體與實體之間有三種對應關係
- 視圖用於完成查詢語句的封裝
- 事務能夠保證複雜增刪改查有效
- 當數據量巨大時,爲了提升查詢速度能夠經過建立索引實現
### 關係
> 示例 crate 三張表 students score subjects
>成績表須要引用學生表和科目表
> 關係分爲1 to 1 1 to n n to n
> 學生表 1 to 成績表 n;成績表 1 to 學生表 1;
> 科目表 1 to 成績 n;成績表 1 to 科目表 1;
> so把關係創建在成績表
### 創建表關係
> 關係也是一種字段,須要要表中建立
> 先設計E-R模型中表結構關係,再建立約束
### 外鍵約束
>保證數據有效性
>先肯定表與表之間是否有關係,再肯定時幾對幾的關係,而後爲了確認數據有效性,創建外鍵約束
```
crate table scores (
id int primary auto_increment,
stuid int
subid int
score decimal(5,2),
foreign key(stuid) references students(id),
foreign key(subid) references subjects(id)
);
```
### 外鍵的級聯操做
- 級聯操做的類型
- restrict(限制):默認值,拋異常
- cascade(級聯):若是主表的記錄刪除,則從表中相關聯的記錄會被刪除
- set null:將外鍵設置爲空
- no action:什麼都不作
### 鏈接查詢
>使用場景:須要用到的信息來源於多張表,找到表與表之間的關係再鏈接查詢
- table_A inner join table_B: table_A 與table_B匹配的行會出如今結果中
- table_A left join table_B:table_A 與table_B匹配的行會出如今結果中,外加外表table_A獨有的數據,未對應的數據使用null填充
- table_A right join table_B:table_A 與table_B匹配的行會出如今結果中,外加外表table_B獨有的數據,未對應的數據使用null填充
> 三種鏈接主要的區別是結果集的區別:
```
select students.name,subjects.tile,scores.score
from scores
inner join students on scores.stuid = students.id
inner join subjects on scores.subid = students.id;
```
rename oldname to newname
engine不同 底層的數據結構不同
備份和恢復
備份
mysqldump -uroot -p database_name > backup_db.sql
恢復(注意要先建立數據庫)
mysqldump -uroot -p database_name < backup_db.sql
### 產品設計
確認有哪些實體,確認實體是幾對幾的關係,確認在哪一個實體中創建哪些字段
#### 示例
- 購物車
- 消費者
- 商品
- 數量
- 價格
- 商品信息
- 名稱
- 價格
- 單位
- 日期
...
> 分析對應關係 1個購物車對應1個商品信息
#### 練習
> 查詢男生的姓名、總分
> 使用sum,考慮使用分組,按人名分組
```
select students.name,sum(scores.score) from students inner join scores on scores.stuid = students.id
where students.gender = 1
group by students.id
```
### 自關聯
> 同一張表中不一樣字段關聯,好比 pid refrences aid 把省,市,縣放在同一個表中,減小表開銷。那pid 關聯 aid就稱爲自關聯
### 視圖
- 視圖本質是對查詢語句的封裝
- 對於複雜的查詢,在屢次使用後,維護是一件很是麻煩的事情,解決:定義視圖
```
create view stuscore as
select students.*,scores.score
from studejts inner join scores on students.id = scores.stuid
where
//查詢視圖
select * from stuscore
```
```
create view view_name as statements
```
### 事務
- 一個業務邏輯須要執行多條sql語句,若是某個sql語句出錯,則但願真個操做都回退,保證業務邏輯的完整性
- 事務的四大特性(ACID)
- 原子性(Atomicity) 要麼所有成功,要麼所有失敗
- 一致性(Consistency) 幾個並行執行的事務,其執行結果必須與按某一順序串行執行的結果一致。
- 隔離性(Isolation) 事務執行不受其餘事務干擾,事務執行的中間結果必須對其餘事務是透明的
- 持久性(Durability):對已經提交的事務,其數據必須被持久存儲
- 要求:表的類型必須是 innodb或者bdb類型,纔可使用事務
- innodb 行級鎖
>查看建表語句
```
show crate table students;
```
- 事務語句
>使用事務的前提條件:當存在insert/update/delete
```
begin;
update students set name = "michael" where id = 1 //內存級的臨時表,而且上行級鎖
//持久化存儲數據並解鎖
commit
//拋出異常後回滾
rollback
```
### 索引
- 爲了優化查詢,提升數據庫的訪問速度須要創建索引
- 主鍵和惟一索引都是索引,能夠提升速度
#### 選擇列的數據類型
- 數據小,簡單數據類型,避免null
#### 操做
- 索引分單列索引和組合索引
- 單列索引 一個索引只包含單個列
- 組合索引,一個索引包含多個列
- 查看索引
```
show index from table_name;
```
- 建立索引及刪除索引
```
create index index_name on table(username(length))
DROP index [index_name] on table
```
- 缺點:更新表時速度會變慢
- 啓用運行監測
set profiling = 1
- 查看運行時間
show profiles