初學者不點進去就太虧了,MYSQL數據庫超全知識點總結!


1 數據庫概述

1.1 什麼是數據庫

  • 數據庫就是一個文件系統,只不過我們需要通過命令(SQL)來操作這個文件系統。
  • 數據庫是“按照數據結構來組織、存儲和管理數據的倉庫”。是一個長期存儲在計算機內的、有組織的、可共享的、統一管理的大量數據的集合。
  • 數據庫是以一定方式儲存在一起、能與多個用戶共享、具有儘可能小的冗餘度、與應用程序彼此獨立的數據集合,可視爲電子化的文件櫃——存儲電子文件的處所,用戶可以對文件中的數據進行新增、查詢、更新、刪除等操作。

1.2 數據庫的作用

  • 存儲數據,數據的倉庫,帶有訪問權限,限制不同的人有不同的操作。

1.3 爲什麼要學數據庫

  • 操作的都是後臺數據,取到後臺數據進行封裝,然後交給前臺去展現。

1.4 常見的數據庫

  1. MySQL:開源免費的適用於中小型企業的免費數據庫,sun 公司收購了 MySQL,sun 公司被 Oracle 收購了,Oracle 收購之後就開始收費了。
  2. Mariadb:由 MySQL 創始人搞出來的,直接是 MySQL 開源版本的一個分支,基本上所有的命令都是一樣的。
  3. Oracle:甲骨文公司,商業收費,適用於大型電商網站,收購 sun 公司和Java。
  4. db2:IBM 公司,主要提供解決方案,軟件和硬件,服務器架構。銀行系統大多數採用的是 db2。
  5. SQLserver:Windows 裏面,政府網站 asp.net,大多數大學教學通常都是採用 SQLserver,圖形化工具不錯。
  6. Sybase:已經被淘汰了。
  • NoSQL 非關係型數據庫:key:value 的形式,常見的有 Mongodb、Redis 等。

1.5 關係型數據庫

  1. 主要是用來描述實體與實體之間的關係。
  2. E-R 圖表示:實體-方框,屬性-橢圓,關係-菱形。

1.6 MySQL數據庫服務器

  • MySQL 數據庫:數據庫管理軟件。
  • 服務器:類似一臺電腦,這臺電腦安裝相關的服務器軟件,這些軟件會監聽不同的端口號,根據用戶訪問的端口號,提供不同的服務。

2 MySQL的SQL語句

  1. SQL:Structure Query Language 結構化查詢語言。
  2. DDL:數據定義語言。定義數據庫,數據庫表及結構。create(創建),drop(刪除),alter(修改)。
  3. DML:數據操縱語言:主要是用來操作數據。insert(插入),update(修改),delete(刪除)。
  4. DCL:數據控制語言:定義訪問權限,取消訪問權限,安全設置 grant。
  5. DQL:數據查詢語言:select(查詢),from子句,where子句。

2.1 數據庫的CRUD的操作

  • 首先要登錄數據庫服務器:mysql -u [用戶名] -p [密碼]

2.1.1 創建數據庫

  1. create database 數據庫名字;
    create database sql_1;
    
  2. create database 數據庫名字 character set 字符集;
    create database sql_2 character set utf8;
    
  3. create database 數據庫名字 character set 字符集 collate 校對規則;
    create database sql_3 character set utf8 collate utf8_bin;
    

2.1.2 查看數據庫

  1. -- 查看所有的數據庫
    show databases;
    
  2. -- 查看數據庫定義的語句
    show create database 數據庫的名字
    show create database sql_1;
    show create database sql_2;
    

2.1.3 修改數據庫

  1. -- 修改數據的字符集
    alter database 數據庫的名字 character set 字符集;
    alter database sql_1 character set gbk;
    

2.1.4 刪除數據庫

  1. drop database 數據庫名字;
    drop database sql_2;
    drop database sql_3;
    

2.1.5 其它數據庫操作命令

  1. -- 切換數據庫(選中數據庫)
    use 數據庫的名字;
    use sql_1;
    
  2. -- 查看當前正在使用的數據庫
    select database();
    

2.2 表的CRUD操作

2.2.1 創建表

  1. create table 表名(
        列名1 列的類型(長度) 約束,
        列名2 列的類型(長度) 約束,
        . . . . . .
    );
    
    create table student(
        sid int primary key,
        sname varchar(15),
        sex int,
        age int
    );
    
  2. 列的類型
    -- int
    -- char/varchar[char:固定長度, varchar:可變類型]
    -- double, float, boolean
    -- date[YYYY-MM-DD]
    -- time[hh:mm:ss]
    -- datatime[YYYY-MM-DD hh:mm:ss] 默認值是null
    -- timestamp[YYYY-MM-DD hh:mm:ss] 默認使用當前時間
    -- text[主要是用來存放文本]
    -- blob[存放的是二進制]
    
  3. 列的約束
    -- 主鍵約束: primary key
    -- 唯一約束: unique
    -- 非空約束: not null
    

2.2.2 查看錶

  1. -- 查看所有表
    show tables;
    
  2. -- 查看錶的定義
    show create table 表的名字;
    show create table student;
    
  3. -- 查看錶的結構
    desc 表的名字;
    desc student;
    

2.2.3 修改表

  • 添加列(add),修改列類型(modify),修改列名(change),刪除列(drop),修改表名(rename)。
  1. -- 添加列
    alter table 表名 add 列名 列的類型 列的約束
    alter table student add grade int not null;
    
  2. -- 修改列類型
    alter table 表名 modify 列名 列的類型;
    alter table student modify sex varchar(2);
    
  3. -- 修改列名
    alter table 表名 change 原列名 新列名 新列的類型;
    alter table student change sex tel varchar(20);
    
  4. -- 刪除列
    alter table 表名 drop 列名;
    alter table student drop tel;
    
  5. -- 修改表名
    rename table 原表名 to 新表名;
    rename table student to stus;
    
  6. -- 修改表的字符集
    alter table 表名 character set 字符集;
    alter table stus character set gbk;
    

2.2.4 刪除表

  1. drop table 表名;
    drop table stus;
    

2.3 表中數據的CRUD操作

2.3.1 插入數據

  1. insert into 表名(列名1, 列名2, 列名3) values(1,2,3);
    insert into student(sid, sname, sex, age) values (1, 'liuyi', 1, 23);
    
  2. -- 如果插入的是全列名的數據,表名後面的列名可以省略
    insert into 表名 values(1,2,3);
    insert into student values(2, 'chener', 1, 23);
    
  3. -- 注意,如果插入的是部分列,列名不可省略
    insert into student(sid, sname) values(3, 'zhangsan');
    insert into student values(3, 'zhangsan');  --錯誤
    
  4. -- 批量插入
    insert into student values
    (4, 'lisi', 1, 23),
    (5, 'wangwu', 1, 23),
    (6, 'zhaoliu', 1, 23),
    (7, 'sunqi', 1, 23),
    (8, 'zhouba', 1, 23);
    

2.3.2 刪除記錄

  1. delete from 表名 [where 條件];
    delete from student where sid=10;
    
  2. -- 如果沒有指定條件,會將表中的數據一條一條全部刪除掉
    delete from student;
    
  3. delete 刪除數據和 truncate 刪除數據的區別
    -- delete: DML 一條一條刪除表中的數據
    -- truncate: DDL 先刪除表再重建表
    -- 關於哪條執行效率高,具體要看錶中的數據
    -- 如果數據比較少,delete 比較高效
    -- 如果數據比較多,truncate 比較高效
    

2.3.3 更新表記錄

  1. update 表名 set 列名1=1的值, 列名2=2的值 [where 條件];
    
    -- 如果參數是字符串或日期,要加上單引號
    update student set sname='李四' where sid=4;
    
    -- 沒有條件,那麼每一條記錄都會執行
    update student set sname='李四', sex=20;
    

2.3.4 查詢記錄

  1. select [distinct] [*] [列名1, 列名2] from 表名 [where 條件]; -- distinct 去除重複數據
    
  2. 先創建兩個表,用於操作:

    -- 商品分類
    -- 1. 分類ID
    -- 2. 分類名稱
    -- 3. 分類描述
    create table category(
        cid int primary key auto_increment,
        cname varchar(10),
        cdesc varchar(31)
    );
    
    -- 所有商品
    -- 1. 商品ID
    -- 2. 商品名稱
    -- 3. 商品價格
    -- 4. 生產日期
    -- 5. 商品分類ID
    -- 商品和商品分類:所屬關係
    create table product(
        pid int primary key auto_increment,
        pname varchar(10),
        price double,
        pdate timestamp,
        cno int
    );
    -- 關於數據這裏就不再操作了,隨便一點數據就行
    
  3. 簡單查詢

    -- 查詢所有商品
    select * from product;
    
    -- 查詢商品名稱和商品價格
    select pname, price from product;
    
  4. 別名查詢,as 關鍵字,as 可以省略

    -- 表別名(主要用於多表查詢)
    select p.pname, p.price from product as p;
    
    -- 列別名
    select pname as 商品名稱, price as 商品價格 from product;
    
    -- 省略 as 關鍵字
    select pname 商品名稱, price 商品價格 from product;
    
  5. 去掉重複的值

    -- 查詢商品所有的價格
    select price from product;
    select distinct price from product;
    
    -- select 運算查詢:僅僅在查詢結果上做了運算,不改變表中的數據
    select *, price*1.5 from product;
    select *, price*0.9 from product;
    select *, price*0.5 as 折後價 from product;
    
  6. 條件查詢 [where關鍵字], 指定條件,確定要操作的記錄

    -- 查詢商品價格>60的所有商品信息
    select * from product where price > 60;
    
    -- where 後的條件寫法
    -- 關係運算符:> >= < <= = != <>
    -- <> 不等於,標準 SQL 語法
    -- != 不等於,非標準 SQL 語法
    
    -- 查詢商品價格不等於 88 的所有商品
    select * from product where price <> 88;
    
    -- 查詢商品價格在 10 到 100 之間
    select * from product where price > 10 and price < 100;
    
    -- between...and...
    select * from product where price between 10 and 100;
    
  7. 邏輯運算:and, or, not

    -- 查詢出商品價格小於 100 或者商品價格大於 900 的商品
    select * from product where price < 100 or price > 900;
    
  8. like 模糊查詢

    -- _:代表一個字符
    -- %:代表多個字符
    
    -- 查詢出名字中帶有'餅'的所有商品 '%餅%'
    select * from product where pname like '%餅%';
    
    -- 查詢第二名是'煙'的所有商品 '_煙%'
    select * from product where pname like '_煙%';
    
  9. in 在某個範圍中獲取值

    -- 查詢出商品分類ID在1,4,5裏面的所有商品
    select * from product where cno in (1, 4, 5);
    
  10. 排序查詢:order by 關鍵字

    -- asc: ascend 升序,默認的排序方式
    -- desc: descend 降序
    
    -- 查詢所有商品,按照價格進行排序
    select * from product order by price;
    
    -- 查詢所有商品,按價格進行降序排序
    select * from product order by price desc;
    
    -- 查詢名稱有'小'的商品,按價格升序
    select * from product where pname like '%小%' order by price asc;
    
  11. 聚合函數

    sum():求和
    avg():求平均值
    count():統計數量
    max():最大值
    min():最小值
    
    -- 獲取所有商品價格的總和
    select sum(price) from product;
    
    -- 獲取所有商品的平均價格
    select avg(price) from product;
    
    -- 獲取所有商品的個數
    select count(*) from product;
    
  • 注意,where 條件後面不能接聚合函數
  1. 子查詢

    -- 查詢商品價格大於平均價格的商品
    select * from product where price > (select avg(price) from product);
    
  2. 分組:group by

    -- 根據 cno 字段分組,分組後統計商品個數
    select cno, count(*) from product group by cno;
    
    -- 根據 cno 分組,分組統計每組商品的平均價格並且商品平均價格>60
    select cno, avg(price) from product group by cno having avg(price) > 60;
    
    -- having 關鍵字,可以接聚合函數,出現在分組之後
    -- where 關鍵字,不可以接聚合函數,出現在分組之前
    
  3. 編寫順序

    -- S..F..W..G..H..O
    -- select .. from .. where .. group by .. having .. order by
    
  4. 執行順序

    -- F..W..G..H..S..O
    -- from .. where .. group by .. having .. select .. order by 
    

2.3 分頁查詢

  1. limit [索引], [顯示的個數]
    
    select * from product limit 0, 3; -- 出來的是第1~3條的3條數據
    select * from product limit 3, 3; -- 出來的是第4~6條的3條數據
    

2.4 多表之間的關係維護

  1. 外鍵約束: foreign key
    -- 給 product 中的 cno 添加一個外鍵約束(兩張表:product,category)
    alter table product add foreign key(cno) references category(cid);
    
  • 刪除的時候, 先刪除外鍵關聯的所有數據,再才能刪除分類的數據。
  1. 主鍵約束:默認就是不能爲空,唯一。

    • 外鍵都是指向另外一張表的主鍵
    • 一張表只能有一個主鍵
  2. 唯一約束:列裏面的內容必須是唯一,不能出現重複情況,可爲空。

    • 唯一約束不可以作爲其它表的外鍵
    • 可以有多個唯一約束

2.4.1 建數據庫原則

  • 通常情況下,一個項目/應用建一個數據庫。

2.4.2 多表之間的建表原則

  1. 一對多:商品和分類

    • 建表原則:在多的一方添加一個外鍵,指向一的一方的主鍵。
  2. 多對多:老師和學生,學生和課程

    • 建表原則:建立一張中間表,將多對多的關係,拆分成一對多的關係,中間表至少要有兩個外鍵,分別指向原來的那兩張表。
  3. 一對一:班級和班長, 公民和身份證, 國家和國旗

    • 建表原則:
      • 將一對一的情況,當作是一對多情況處理,在任意一張表添加一個外鍵,並且這個外鍵要唯一,指向另外一張表
      • 直接將兩張表合併成一張表
      • 將兩張表的主鍵建立起連接,讓兩張表裏面主鍵相等
    • 實際用途: 用的不是很多(拆表操作).
      • 拆表操作:將個人的常用信息和不常用信息拆分出來,減少表的臃腫。

2.5 多表查詢

2.5.1 笛卡爾積(交叉連接查詢)

  1. -- 查出來的就是兩張表的乘積,查出的結果沒有意義。
    select * from product, category;
    
  2. -- 過濾出有意義的數據
    select * from product, category where cno = cid;
    select * from product as p, category as c where p.cno = c.cid;
    select * from product p, category c where p.cno = c.cid;
    

2.5.2 內連接查詢

  1. -- 隱式內連接
    select * from product p, category c where p.cno = c.cid;
    
  2. -- 顯式內連接
    select * from product p inner join category c on p.cno = c.cid;
    
  3. -- 區別
    -- 隱式內連接:在查詢出結果的基礎上去做 where 條件過濾
    -- 顯式內連接:帶着條件去查詢結果,執行效率要高
    

2.5.3 左外連接

  1. 左外連接,會將左表中的所有數據都查詢出來,如果右表中沒有對應的數據,用 null 代替。
  2. select * from product p left outer join category c on p.cno = c.cid;
    

2.5.4 右外連接

  1. 右外連接,會將右表中的所有數據都查詢出來,如果左表中沒有對應的數據,用 null 代替。
  2. select * from product right outer join category c on p.cno = c.cid;
    

3 END

感謝看到這裏的各位讀者朋友們,如果你感到本文寫的不錯,就順手點個贊👍收藏一下,也可以關注一波~~

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