1. 程式人生 > >資料庫mysql筆記

資料庫mysql筆記

SQL

sql:即Structured Query Language:結構化查詢語言
定義了操作所有關係型資料庫的規則,但每一種資料庫操作的方式存在方言
SQL通用語法
1.SQL語句可以單行或者多行書寫,以分號結尾
2.可以用空格和縮排增強語句可讀性
3.mysql資料庫的sql語句不區分大小寫,關鍵字建議大戲
4.註釋:

  • 單行註釋:– 註釋內容或者 # 註釋內容(mysql特有)
  • 多行註釋: /* 註釋 */

SQL分類
1.DDL(Data Definition Language)資料定義語言
用來定義資料庫物件:資料庫,表,列等,關鍵字create,drop,alter等
2.DML(Data Manipulation Language)資料操作語言
用來對資料庫中表的資料進行增刪改,關鍵字:insert,delete,update等
3.DQL(Data Query Language)資料查詢語言
用來查詢資料庫中表的記錄(資料),關鍵字:select,where等
4.DCL(Data Control Language)資料控制語言
用來定義資料庫的訪問許可權和安全級別,及建立使用者,關鍵字:grant,revoke等

DDL:操作資料庫、表

操作資料庫:CRUD
1.C(Create):建立

  • 建立資料庫:create database 資料庫名;
  • 建立資料庫判斷不存在,再建立:create database if not exists 資料庫名;
  • 建立資料庫並制定字符集:create database 資料名 character set 字符集名;

2.R(Retrieve):查詢

  • 查詢所有資料庫的名稱:show databases;
  • 查詢某個資料庫的字符集(查詢建立語句):show create database 資料庫名;

3.U(Update):修改

  • 修改資料庫的字符集:alter database 資料庫名 character set 字符集名稱;

4.D(Delete):刪除

  • 刪除資料庫:drop database 資料庫名;
  • 判斷資料庫存在,存在再刪除:drop database if exists 資料庫名稱;

5.使用資料庫

  • 查詢當前正在使用的資料庫名稱:select database();
  • 使用資料庫:use 資料庫名稱;

操作表
1.C(Create):建立
語法:

create table 表名(
    列名1 資料型別1,
    列名2
資料型別2, ... 列名n 資料型別n );

最後一列不需要逗號
資料庫資料型別:
int:整數型別
* age int
double:小數型別
* score double(5,2):代表score最高取到9999,且小數點後保留2位
date:日期型別,只包含年月日,yyyy-MM-dd
datetime:日期型別,包含年月日時分秒 yyyy-MM-dd HH:mm:ss

不賦值則預設為null

timestamp:日期戳型別,包含年月日時分秒 yyyy-MM-dd HH:mm:ss

不賦值或賦值為null預設使用系統當前時間

varchar:字串
* name varchar(20):長度20可變字串
複製表
create table 表名 like 被複制的表名;
R(Retrieve)查詢
查詢某個資料庫中所有的表名:
show tables;
查詢表結構
desc 表名;
U(Update)修改
1.修改表名
alter table 表名 rename to 新的表名;
2.修改表的字符集
alter table 表名 character set 字符集名稱;
3.新增一列
alter table 表名 add 列名 資料型別;
4.修改類名稱 型別
alter table 表名 change 列名 新列名 新資料型別;
alter table 表名 modify 列名 新資料型別;
5.刪除列
alter table 表名 drop 列名;
D(Delete)刪除
drop table 表名;
drop table if exists 表名;

DML:增刪改表中資料

1.新增資料
insert into 表名 (列名1,列名2…) values (值1,值2…);

列名和值要一一對應
表名後不定義列名則預設給所有列新增值
insert into 表名 values (值1,值2…);
除了數字型別其他型別需要用單或雙引號引起來

2.刪除資料
delete from 表名 [ where 條件];

如果不加條件,則刪除表中所有記錄
如果要刪除所有記錄
1.delete from 表名; —不推薦使用,有多少條記錄就會執行多少次刪除操作
2.truncate table 表名; —推薦使用,先刪除表再建立一張一模一樣的表

修改資料
update 表名 set 列名1 = 值1,列名2 = 值2….[where 條件];
如果不加任何條件,則會修改表中所有記錄

DQL:查詢表中的記錄

select * from 表名;
語法:

select
    欄位列表
from
    表名列表
where
    條件列表
group by
    分組欄位
having
    分組之後的條件
order by
    排序
limit
    分頁限定

基礎查詢
1.多個欄位的查詢
select 欄位1,欄位2… from 表名;
如果查詢所有欄位可用*來代替
2.去除重複
select distinct 欄位列表 from 表名列表;
3.計算列
一般可以使用四則運算進行計算
null參與的運算,計算結果都為null
ifnull(表示式1,表示式2):判斷表示式1是否為null若是則替換為表示式2
4.起別名
as:可省略
條件查詢
1.where子句後跟條件
2.運算子
<=,>,<,>=,=,<>
between..and…
if(集合)
like:模糊查詢
佔位符:
_:單個任意字元
%:多個任意字元
is null
and ,&&
or,||
not,!

DQL:查詢語句

排序查詢
語法 :
order by 子句;
order by 排序欄位1 排序方式1,排序欄位2 排序方式2…
排序方式:
ASC:升序,預設
DESC:降序

如果有多個排序條件,則當前邊的條件值一樣的時候,才會判斷第二條件

聚合函式
即將一列資料作為一個整體,進行縱向的計算
1.count:計算個數

一般選擇非空的列:主鍵
或者使用count(*)

2.max
3.min
4.sum
5.avg

聚合函式的計算會排除掉null值
解決方案
1.選擇不包含null的列進行計算
2.使用ifnull函式

分組查詢
語法
group by 分組欄位;

分組之後查詢的欄位:分組欄位,聚合函式
where 和 having 的區別
1.where 在分組之前進行限定,如果不滿足條件,則不參與分組,having在分組之後進行限定,如果不滿足條件,則不會被查詢
2.where後不可以跟聚合函式而having可以進行聚合函式的判斷

分頁查詢
語法
limit 開始的索引,每頁查詢的條數;
開始的索引 = (當前的頁碼 - 1) * 每頁顯示的條數
limit 是mysql的方言

約束

對錶中的資料進行限定,以保證資料的正確性,有效性和完整性
分類
1.主鍵約束:primary key
2.非空約束:not null
3.唯一約束:unique
4.外來鍵約束:foreign key

非空約束
not null,某一列的值不能為null
1.建立表的時候新增約束

create table 表名(
    欄位名 資料型別 not null;
);

2.建立表之後新增非空約束

alter table 表名 modify 列名 資料型別 not null;

3.刪除非空約束

alter table 表名 modify 列名 資料型別;

唯一約束
unique,某一列的值不能重複

目前使用版本唯一約束可以有多條null值

建立表的時候新增唯一約束

create table 表名(
    列名 資料型別 unique
);

建立表之後新增唯一約束

alter table 表名 modify 列名 資料型別 unique;

刪除唯一約束

alter table 表名 drop index 列名;

主鍵約束
primary key
1.非空且唯一
2.一張表只能有一個主鍵,但是可以是多個欄位
3.主鍵就是表中記錄的唯一標識

建立表的時候新增主鍵約束

create table 表名(
    列名 資料型別 primary key
);

建立表之後新增主鍵約束

alter table 表名 modify 列名 資料型別 primary key;

刪除主鍵

alter table 表名 drop primary key;

自動增長
如果某一列是數值型別的,使用auto_increment可以完成值的自動增長
一般都是和主鍵一起使用
建立表的時候新增主鍵約束並且完成主鍵自增長

create table 表名(
    列名 資料型別 primary key auto_increment
);

建立表之後新增自動增長

alter table 表名 modify 列名 資料型別 auto_increment;

刪除自動增長

alter table 表名 modify 列名 資料型別;

外來鍵約束
foreign key
讓表和表產生關係,從而保證資料的正確性
建立表的時候新增外來鍵

create table 表名(
    外來鍵列名 資料型別;
    [constraint 外來鍵名稱] foreign key (外來鍵列名) references 主表名稱(主表列名)
);

建立表之後新增外來鍵

alter table 表名 add constraint 外來鍵名 foreign key (外來鍵列名) references 主表名(主鍵名);

刪除外來鍵

alter table 表名 drop foreign key 外來鍵名;

級聯操作
刪除主鍵或更新主鍵時,外來鍵會隨之改變
新增級聯操作,只能和外來鍵一起新增

alter table 表名 add constraint 外來鍵名 foreign key (外來鍵列名) references 主表名(主表列名)on update cascade on delete cascade;

分類
1.級聯更新:on update cascade;
2.級聯刪除:on delete cascade;

多表之間的關係

1.一對一:在任意一方的唯一外來鍵指向另一方主鍵
2.一對多:在多的一方建立外來鍵,指向一的一方主鍵
3.多對多:需要藉助第三張中間表,其至少包含兩個欄位,這兩個欄位作為外來鍵分別指向另外兩張表的主鍵

資料庫設計的正規化

* 概念:設計資料庫時,需要遵循的一些規範。要遵循後邊的正規化要求,必須先遵循前邊的所有正規化要求

    設計關係資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。
    目前關係資料庫有六種正規化:第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF)、巴斯-科德正規化(BCNF)、第四正規化(4NF)和第五正規化(5NF,又稱完美正規化)。

* 分類:
    1. 第一正規化(1NF):每一列都是不可分割的原子資料項
    2. 第二正規化(2NF):在1NF的基礎上,非碼屬性必須完全依賴於碼(在1NF基礎上消除非主屬性對主碼的部分函式依賴)
        * 幾個概念:
            1. 函式依賴:A-->B,如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值。則稱B依賴於A
                例如:學號-->姓名。  (學號,課程名稱) --> 分數
            2. 完全函式依賴:A-->B, 如果A是一個屬性組,則B屬性值得確定需要依賴於A屬性組中所有的屬性值。
                例如:(學號,課程名稱) --> 分數
            3. 部分函式依賴:A-->B, 如果A是一個屬性組,則B屬性值得確定只需要依賴於A屬性組中某一些值即可。
                例如:(學號,課程名稱) -- > 姓名
            4. 傳遞函式依賴:A-->B, B -- >C . 如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值,在通過B屬性(屬性組)的值可以確定唯一C屬性的值,則稱 C 傳遞函式依賴於A
                例如:學號-->系名,系名-->系主任
            5. 碼:如果在一張表中,一個屬性或屬性組,被其他所有屬性所完全依賴,則稱這個屬性(屬性組)為該表的碼
                例如:該表中碼為:(學號,課程名稱)
                * 主屬性:碼屬性組中的所有屬性
                * 非主屬性:除過碼屬性組的屬性

    3. 第三正規化(3NF):在2NF基礎上,任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)

資料庫的備份和還原

命令列
備份:mysqldump -u使用者名稱 -p密碼 資料庫名 > 儲存的路徑;
還原:
1.登陸資料庫
2.建立資料庫
3.使用資料庫
4.執行檔案。source 檔案路徑

多表查詢

查詢語法
select 列名列表 from 表名列表 where …
笛卡兒積:顯示集合AB所有的組成情況
要完成多表查詢,需要消除無用的資料
多表查詢的分類
1.內連線查詢
隱式內連線:使用where條件消除無用資料
顯式內連結:
select 欄位列表 from 表名1 [inner] join 表名2 on 條件;
2.外連線查詢
左外連線:
select 欄位列表 from 表名1 left [outer] join 表名2 on 條件;
會查詢左表所有資料以及兩者交集部分
右外連線:
select 欄位列表 from 表名1 right [outer] join 表名2 on 條件;
會查詢右表所有資料以及兩者交集部分
全連線:
select 欄位列表 from 表名1 full [outer] join 表名2 on 條件;
會查詢兩表所有資料以及兩者交集部分
3.子查詢
查詢中巢狀查詢,稱之為子查詢
子查詢不同情況
子查詢結果為單行單列的:
子查詢可以作為條件,使用運算子取判斷: >, >=, <, <=, =
子查詢結果為多行單列的:
子查詢可以作為條件使用運算子in來判斷
子查詢結果為多行多列的:
子查詢可以作為一張虛擬表參與查詢

事務

如果一個包含多個步驟的業務操作,被事務管理,那麼這些操作要麼同時成功,要麼同時失敗
操作:
1.開啟事務: start tansaction;
2.回滾:rollback;
3.提交:commit;
MySQL資料庫中事務預設自動提交
事務提交的兩種方式
自動提交:mysql就是自動提交的
一條DML語句會自動提交一次事務
手動提交:oracle就是預設手動提交事務
需要先開啟事務再提交
修改事務預設提交方式:
檢視事務的預設提交方式:select @@autocommit; 1代表自動提交 0代表手動提交
修改預設提交方式:set @@autocommit = 0;

  1. 事務的四大特徵:
    1. 原子性:是不可分割的最小操作單位,要麼同時成功,要麼同時失敗。
    2. 永續性:當事務提交或回滾後,資料庫會持久化的儲存資料。
    3. 隔離性:多個事務之間。相互獨立。
    4. 一致性:事務操作前後,資料總量不變
  2. 事務的隔離級別(瞭解)

    • 概念:多個事務之間隔離的,相互獨立的。但是如果多個事務操作同一批資料,則會引發一些問題,設定不同的隔離級別就可以解決這些問題。
    • 存在問題:
      1. 髒讀:一個事務,讀取到另一個事務中沒有提交的資料
      2. 不可重複讀(虛讀):在同一個事務中,兩次讀取到的資料不一樣。
      3. 幻讀:一個事務操作(DML)資料表中所有記錄,另一個事務添加了一條資料,則第一個事務查詢不到自己的修改。
    • 隔離級別:

      1. read uncommitted:讀未提交
        • 產生的問題:髒讀、不可重複讀、幻讀
      2. read committed:讀已提交 (Oracle)
        • 產生的問題:不可重複讀、幻讀
      3. repeatable read:可重複讀 (MySQL預設)
        • 產生的問題:幻讀
      4. serializable:序列化

        • 可以解決所有的問題

        • 注意:隔離級別從小到大安全性越來越高,但是效率越來越低

        • 資料庫查詢隔離級別:
        • select @@tx_isolation;
        • 資料庫設定隔離級別:
        • set global transaction isolation level 級別字串;

DCL

管理使用者,授權
1.新增使用者:
create user ‘使用者名稱’@’主機名’ identified by ‘密碼’;
2.刪除使用者:
drop user ‘使用者名稱’@’主機名’;
3.修改使用者密碼
update user set password = password(‘新密碼’) where user = ‘使用者名稱’;
set password for ‘使用者名稱’@’主機名’ = password(‘新密碼’);
mysql中忘記了管理員賬號的密碼
1. cmd – > net stop mysql 停止mysql服務
需要管理員執行該cmd
2. 使用無驗證方式啟動mysql服務: mysqld –skip-grant-tables
3. 開啟新的cmd視窗,直接輸入mysql命令,敲回車。就可以登入成功
4. use mysql;
5. update user set password = password(‘你的新密碼’) where user = ‘root’;
6. 關閉兩個視窗
7. 開啟工作管理員,手動結束mysqld.exe 的程序
8. 啟動mysql服務
9. 使用新密碼登入。

許可權管理:
1查詢許可權
show grants for ‘使用者名稱’@’主機名’;
2授予許可權
grant 許可權列表 on 資料庫名.表名 to ‘使用者名稱’@’主機名’;
3撤銷許可權
revoke 許可權列表 on 資料庫名.表名 from ‘使用者名稱’@’主機名’;