主頁 > 資料庫 > 【MySQL】筆記(4)--- 創建表;插入,修改,洗掉資料;主鍵,外鍵約束;事務;索引;視圖;三范式;

【MySQL】筆記(4)--- 創建表;插入,修改,洗掉資料;主鍵,外鍵約束;事務;索引;視圖;三范式;

2021-12-13 06:55:47 資料庫

一.創建表:


1.1 建表陳述句的語法格式:
        create table 表名(
            欄位名1 資料型別,
            欄位名2 資料型別,
            欄位名3 資料型別,
            ....
        );
    
1.2 關于MySQL當中欄位的資料型別?以下只說常見的:
        int        整數型(java中的int)
        bigint     長整型(java中的long)
        float      浮點型(java中的float double)
        char       定長字串(String)
        varchar    可變長字串(StringBuffer/StringBuilder)
        date       日期型別 (對應Java中的java.sql.Date)
        BLOB       二進制大物件(存盤圖片、視頻等流媒體資訊) Binary Large OBject (對應java中的Object)
        CLOB       字符大物件(存盤較大文本,比如,可以存盤4G的字串,) Character Large OBject(對應java中的Object)
        ......
    
1.3 char和varchar怎么選擇?
        在實際的開發中,當某個欄位中的資料長度不發生改變的時候,是定長的,例如:性別、生日等都是采用char,
        當一個欄位的資料長度不確定,例如:簡介、姓名等都是采用varchar,
    
1.4 BLOB和CLOB型別的使用?
        電影表: t_movie
        id(int)    name(varchar)        playtime(date/char)        haibao(BLOB)        history(CLOB)
        ----------------------------------------------------------------------------------------
        1            蜘蛛俠    
        2
        3

    表名在資料庫當中一般建議以:t_或者tbl_開始;

    創建學生表:
        學生資訊包括:
            學號、姓名、性別、班級編號、生日
            學號:bigint
            姓名:varchar
            性別:char
            班級編號:int
            生日:char
        
        create table t_student(
            no bigint,
            name varchar(255),
            sex char(1),
            classno varchar(255),
            birth char(10)
        );

1.5 表的復制語法:
        create table 表名 as select陳述句;
        //將查詢結果當做表創建出來

 

二.插入資料:


2.1 語法格式:
        insert into 表名(欄位名1,欄位名2,欄位名3,....) values(值1,值2,值3,....)
        要求:欄位的數量和值的數量相同,并且資料型別要對應相同,
    
    insert into t_student(no,name,sex,classno,birth) values(1,'zhangsan','1','gaosan1ban');
    ERROR 1136 (21S01): Column count doesn't match value count at row 1

    insert into t_student(no,name,sex,classno,birth) values(1,'zhangsan','1','gaosan1ban', '1950-10-12');

    mysql> select * from t_student;
    +------+----------+------+------------+------------+
    | no   | name     | sex  | classno    | birth      |
    +------+----------+------+------------+------------+
    |    1 | zhangsan | 1    | gaosan1ban | 1950-10-12 |
    +------+----------+------+------------+------------+

    insert into t_student(name) values('wangwu'); // 除name欄位之外,剩下的所有欄位自動插入NULL,
    mysql> select * from t_student;
    +------+----------+------+------------+------------+
    | no   | name     | sex  | classno    | birth      |
    +------+----------+------+------------+------------+
    |    1 | zhangsan | 1    | gaosan1ban | 1950-10-12 |
    |    2 | lisi     | 1    | gaosan1ban | 1950-10-12 |
    | NULL | wangwu   | NULL | NULL       | NULL       |
    +------+----------+------+------------+------------+

    drop table if exists t_student; // 當這個表存在的話洗掉
    create table t_student(
        no bigint,
        name varchar(255),
        sex char(1) default 1,     // 設定默認值“1”
        classno varchar(255),
        birth char(10)
    );

    insert into t_student(name) values('zhangsan');
    mysql> select * from t_student;
    +------+----------+------+---------+-------+
    | no   | name     | sex  | classno | birth |
    +------+----------+------+---------+-------+
    | NULL | zhangsan | 1    | NULL    | NULL  |
    +------+----------+------+---------+-------+

2.2 注意:
    當一條insert陳述句執行成功之后,表格當中必然會多一行記錄,即使多的這一行記錄當中某些欄位是NULL,后期也沒有辦法在執行insert陳述句插入資料了,只能使用update進行更新,
    
    // 欄位可以省略不寫,但是后面的value對數量和順序都有要求,
    insert into t_student values(1,'jack','0','gaosan2ban','1986-10-23');
    mysql> select * from t_student;
    +------+----------+------+------------+------------+
    | no   | name     | sex  | classno    | birth      |
    +------+----------+------+------------+------------+
    | NULL | zhangsan | 1    | NULL       | NULL       |
    |    1 | jack     | 0    | gaosan2ban | 1986-10-23 |
    +------+----------+------+------------+------------+

    insert into t_student values(1,'jack','0','gaosan2ban');
    ERROR 1136 (21S01): Column count doesn't match value count at row 1

    // 一次插入多行資料
    insert into t_student
        (no,name,sex,classno,birth) 
    values
        (3,'rose','1','gaosi2ban','1952-12-14'),(4,'laotie','1','gaosi2ban','1955-12-14');

    mysql> select * from t_student;
    +------+----------+------+------------+------------+
    | no   | name     | sex  | classno    | birth      |
    +------+----------+------+------------+------------+
    | NULL | zhangsan | 1    | NULL       | NULL       |
    |    1 | jack     | 0    | gaosan2ban | 1986-10-23 |
    |    3 | rose     | 1    | gaosi2ban  | 1952-12-14 |
    |    4 | laotie   | 1    | gaosi2ban  | 1955-12-14 |
    +------+----------+------+------------+------------+

2.3 將查詢結果插入到一張表中?
    mysql> insert into dept1 select * from dept;
    mysql> select * from dept1;
    +--------+------------+----------+
    | DEPTNO | DNAME      | LOC      |
    +--------+------------+----------+
    |     10 | ACCOUNTING | NEW YORK |
    |     20 | RESEARCH   | DALLAS   |
    |     30 | SALES      | CHICAGO  |
    |     40 | OPERATIONS | BOSTON   |
    |     10 | ACCOUNTING | NEW YORK |
    |     20 | RESEARCH   | DALLAS   |
    |     30 | SALES      | CHICAGO  |
    |     40 | OPERATIONS | BOSTON   |
    +--------+------------+----------+

 

三.修改資料:


3.1 語法格式:
        update 表名 set 欄位名1=值1,欄位名2=值2... where 條件;

    注意:沒有條件整張表資料全部更新,

    案例:將部門10的LOC修改為SHANGHAI,將部門名稱修改為RENSHIBU
    update dept1 set loc = 'SHANGHAI', dname = 'RENSHIBU' where deptno = 10;
    mysql> select * from dept1;
    +--------+------------+----------+
    | DEPTNO | DNAME      | LOC      |
    +--------+------------+----------+
    |     10 | RENSHIBU   | SHANGHAI |
    |     20 | RESEARCH   | DALLAS   |
    |     30 | SALES      | CHICAGO  |
    |     40 | OPERATIONS | BOSTON   |
    |     10 | RENSHIBU   | SHANGHAI |
    |     20 | RESEARCH   | DALLAS   |
    |     30 | SALES      | CHICAGO  |
    |     40 | OPERATIONS | BOSTON   |
    +--------+------------+----------+

3.2 更新所有記錄
        update dept1 set loc = 'x', dname = 'y';
        mysql> select * from dept1;
        +--------+-------+------+
        | DEPTNO | DNAME | LOC  |
        +--------+-------+------+
        |     10 | y     | x    |
        |     20 | y     | x    |
        |     30 | y     | x    |
        |     40 | y     | x    |
        |     10 | y     | x    |
        |     20 | y     | x    |
        |     30 | y     | x    |
        |     40 | y     | x    |
        +--------+-------+------+    


四.洗掉資料: 


4.1 語法格式:
        delete from 表名 where 條件;
    
    注意:沒有條件全部洗掉;

    洗掉“10部門”資料? 
        delete from dept1 where deptno = 10;
    
    洗掉所有記錄?
        delete from dept1;
    
4.2 怎么洗掉大表中的資料?(重點)
        truncate table 表名; // 表被截斷,不可回滾,永久丟失,
4.3 洗掉表?
        drop table 表名;           // 通用寫法
        drop table if exists 表名; // oracle不支持這種寫法

4.4 在實際開發中表一旦設計好之后,對表結構的修改是很少的,修改表結構就是對之前的設計進行了否定,即使需要修改表結構,我們也可以直接使用工具操作;修改表結構的陳述句不會出現在Java代碼當中,出現在java代碼當中的sql包括:insert delete update select(這些都是表中的資料操作);

 

五.約束(Constraint):


楔子:

什么是約束?常見的約束有哪些呢?
    在創建表的時候,可以給表的欄位添加相應的約束,添加約束的目的是為了保證表中資料的合法性、有效性、完整性,

常見的約束有哪些呢?
    非空約束(not null):約束的欄位不能為NULL;
    唯一約束(unique):約束的欄位不可重復;
    主鍵約束(primary key):約束的欄位既不能為NULL,也不能重復(簡稱PK);
    外鍵約束(foreign key):...(簡稱FK);
    檢查約束(check):注意Oracle資料庫有check約束,但是mysql沒有,目前mysql不支持該約束;

 

5.1、非空約束 not null
    drop table if exists t_user;
    create table t_user(
        id int,
        username varchar(255) not null,
        password varchar(255)
    );
    insert into t_user(id,password) values(1,'123');
    ERROR 1364 (HY000): Field 'username' doesn't have a default value  //報錯資訊

5.2、唯一性約束(unique)
    * 唯一約束修飾的欄位具有唯一性,不能重復,但可以為NULL;

    * 案例:給兩個列或者多個列添加unique

        // 表級約束:
        drop table if exists t_user;
        create table t_user(
            id int, 
            usercode varchar(255),
            username varchar(255),
            unique(usercode,username)
        );

        insert into t_user values(1,'111','zs');
        insert into t_user values(2,'111','ls');
        insert into t_user values(4,'111','zs');
        ERROR 1062 (23000): Duplicate entry '111-zs' for key 'usercode'//雙欄位同時重復才報錯

        //列級約束:

        drop table if exists t_user;
        create table t_user(
            id int, 
            usercode varchar(255) unique,
            username varchar(255) unique
        );
        insert into t_user values(1,'111','zs');
        insert into t_user values(2,'111','ls');
        ERROR 1062 (23000): Duplicate entry '111' for key 'usercode' //一個欄位重復就報錯
    * 注意:not null約束只有列級約束,沒有表級約束,

5.3、主鍵約束:
    * 主鍵相關的術語?
        主鍵約束:primary key
        主鍵欄位:id欄位添加primary key之后,id叫做主鍵欄位
        主鍵值:  id欄位中的每一個值都是主鍵值,
    
    * 主鍵有什么作用?
        - 表的設計三范式中有要求,第一范式就要求任何一張表都應該有主鍵;
        - 主鍵的作用:主鍵值是這行記錄在這張表當中的唯一標識;
    
    * 主鍵的分類?
        根據主鍵欄位的欄位數量來劃分:
            單一主鍵(推薦,常用)
            復合主鍵(多個欄位聯合起來添加一個主鍵約束不建議使用,因為復合主鍵違背三范式
        根據主鍵性質來劃分:
            自然主鍵:主鍵值最好就是一個和業務沒有任何關系的自然數(推薦)
            業務主鍵:主鍵值和系統的業務掛鉤,例如:拿著銀行卡的卡號做主鍵,拿著身份證號碼作為主鍵(不推薦用)
    *注意:最好不要拿著和業務掛鉤的欄位作為主鍵,因為以后的業務一旦發生改變的時候,主鍵值可能也需要隨著發生變化,但有的時候沒有辦法變化,因為變化可能會導致主鍵值重復,

5.4  定義主鍵:
        drop table if exists t_user;
        create table t_user(
            id int primary key,    //列級約束方式定義主鍵
            username varchar(255),
            email varchar(255)

            primary key(id)        //表級約束方式定義主鍵
        );
        insert into t_user(id,username,email) values(1,'zs','[email protected]');
        insert into t_user(id,username,email) values(2,'ls','[email protected]');
        insert into t_user(id,username,email) values(3,'ww','[email protected]');
        select * from t_user;
        +----+----------+------------+
        | id | username | email      |
        +----+----------+------------+
        |  1 | zs       | [email protected] |
        |  2 | ls       | [email protected] |
        |  3 | ww       | [email protected] |
        +----+----------+------------+

        insert into t_user(id,username,email) values(1,'jack','[email protected]');
        ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

        insert into t_user(username,email) values('jack','[email protected]');
        ERROR 1364 (HY000): Field 'id' doesn't have a default value

        主鍵的特點:不能為NULL,也不能重復       
        根據以上的測驗得出:id符合主鍵的特點,所以id是此表的主鍵,

    * 注意:一張表的主鍵約束只能有1個;    
    * mysql提供主鍵值自增:(重要) 
        drop table if exists t_user;
        create table t_user(
            id int primary key auto_increment, //id欄位自動維護一個自增的數字,從1開始遞增
            username varchar(255)
        );

    *PS:Oracle當中也提供了一個自增機制,叫做:序列(sequence)物件

 

六.外鍵約束:


6.1  關于外鍵約束的相關術語:
        外鍵約束: foreign key;
        外鍵欄位:添加有外鍵約束的欄位;
        外鍵值:  外鍵欄位中的每一個值;
    
6.2  業務背景:
        請設計資料庫表,用來維護學生和班級的資訊?
            第一種方案:一張表存盤所有資料
            no(pk)            name            classno            classname
            -------------------------------------------------------------------------------------------
            1                    zs1                101                北京大興區經濟技術開發區亦莊二中高三1班
            2                    zs2                101                北京大興區經濟技術開發區亦莊二中高三1班
            3                    zs3                102                北京大興區經濟技術開發區亦莊二中高三2班
            4                    zs4                102                北京大興區經濟技術開發區亦莊二中高三2班
            5                    zs5                102                北京大興區經濟技術開發區亦莊二中高三2班
            缺點:冗余,【不推薦】

            第二種方案:兩張表(班級表和學生表)【推薦】
            t_class 班級表
            cno(pk)        cname
            --------------------------------------------------------
            101        北京大興區經濟技術開發區亦莊二中高三1班
            102        北京大興區經濟技術開發區亦莊二中高三2班

            t_student 學生表
            sno(pk)        sname                classno(該欄位添加外鍵約束fk)
            ------------------------------------------------------------
            1                zs1                101
            2                zs2                101
            3                zs3                102
            4                zs4                102
            5                zs5                102
        
    * 將以上表的建表陳述句寫出來:

        t_student中的classno欄位參考t_class表中的cno欄位,此時t_student表叫做子表,t_class表叫做父表

        順序要求:
            洗掉資料的時候,先洗掉子表,再洗掉父表
            添加資料的時候,先添加父表,在添加子表
            創建表的時候,先創建父表,再創建子表
            洗掉表的時候,先洗掉子表,在洗掉父表
        
        drop table if exists t_student;
        drop table if exists t_class;

        create table t_class(   //先創建父表
            cno int,
            cname varchar(255),
            primary key(cno)
        );

        create table t_student(
            sno int,
            sname varchar(255),
            classno int,
            primary key(sno),
            foreign key(classno) references t_class(cno)  //參考
        );

        insert into t_class values(101,'xx');       //先添加父表

        insert into t_student values(1,'zs1',101);

        insert into t_student values(7,'lisi',103); //報錯:不能添加父表中的cno所沒有的classno

6.3  注意:外鍵可以為NULL;
           外鍵欄位參考其他表的某個欄位的時候,被參考的欄位不一定是主鍵,但至少具有unique約束;

 

七.事務(Transaction):


    7.1、一個事務是一個完整的業務邏輯單元,不可再分,

         銀行賬戶轉賬,從A賬戶向B賬戶轉賬10000.需要執行兩條update陳述句:
            update t_act set balance = balance - 10000 where actno = 'act-001';
            update t_act set balance = balance + 10000 where actno = 'act-002';
        
        以上兩條DML陳述句必須同時成功,或者同時失敗,不允許出現一條成功,一條失敗,而要想保證以上的兩條DML陳述句同時成功或者同時失敗,那么就需要使用資料庫的“事務機制”;


    7.2、和事務相關的陳述句只有:DML陳述句(insert delete update)
         為什么?因為它們這三個陳述句都是和資料庫表當中的“資料”相關的;事務的存在是為了保證資料的完整性,安全性,
    
    7.3、假設所有的業務都能使用1條DML陳述句搞定,還需要事務機制嗎?
        那就不需要了;但實際情況不是這樣的,通常一個“事兒(事務/業務)”需要多條DML陳述句共同聯合完成,
    
    7.4、事務的特性?
        事務包括四大特性:ACID
        A: 原子性:事務是最小的作業單元,不可再分;
        C: 一致性:事務必須保證多條DML陳述句同時成功或者同時失敗;
        I:隔離性:事務A與事務B之間具有隔離;
        D:持久性:持久性說的是最終資料必須持久化到硬碟檔案中,事務才算成功的結束;
    
    7.5、關于事務之間的隔離性
        事務隔離性存在隔離級別,理論上隔離級別包括4個:
            第一級別:讀未提交(read uncommitted)
                對方事務還沒有提交,我們當前事務可以讀取到對方未提交的資料;
                讀未提交存在臟讀(Dirty Read)現象:表示讀到了臟的資料,
            第二級別:讀已提交(read committed)
                對方事務提交之后的資料我方可以讀取到;這種隔離級別解決了“臟讀現象”;
                讀已提交存在的問題是:不可重復讀,
            第三級別:可重復讀(repeatable read)
                這種隔離級別解決了“不可重復讀問題”;
                這種隔離級別存在的問題是:讀取到的資料是幻象,
            第四級別:序列化讀/串行化讀(serializable) 
                解決了所有問題;但效率低,需要事務排隊,

       oracle資料庫默認的隔離級別 --- 讀已提交(2);
       mysq l資料庫默認的隔離級別 --- 可重復讀(3);

    
    7.6、演示事務
        * mysql事務默認情況下是自動提交的,
            (什么是自動提交?只要執行任意一條DML陳述句則提交一次)怎么關閉自動提交 --- start transaction;
        
        * 準備表:
            drop table if exists t_user;
            create table t_user(
                id int primary key auto_increment,
                username varchar(255)
            );
        
        * 演示:mysql中的事務是支持自動提交的,只要執行一條DML,則提交一次,
            mysql> insert into t_user(username) values('zs');

            mysql> select * from t_user;
            +----+----------+
            | id | username |
            +----+----------+
            |  1 | zs       |
            +----+----------+

            mysql> rollback;   // 回滾(撤回未提交的操作)

            mysql> select * from t_user;
            +----+----------+
            | id | username |
            +----+----------+
            |  1 | zs       |
            +----+----------+        
        * 演示:使用start transaction 關閉自動提交機制:
            mysql> start transaction;

            mysql> insert into t_user(username) values('lisi');

            mysql> select * from t_user;
            +----+----------+
            | id | username |
            +----+----------+
            |  1 | zs       |
            |  2 | lisi     |
            +----+----------+

            mysql> insert into t_user(username) values('wangwu');

            mysql> select * from t_user;
            +----+----------+
            | id | username |
            +----+----------+
            |  1 | zs       |
            |  2 | lisi     |
            |  3 | wangwu   |
            +----+----------+

            mysql> rollback;

            mysql> select * from t_user;
            +----+----------+
            | id | username |
            +----+----------+
            |  1 | zs       |
            +----+----------+
            --------------------------------------------------------------------
            mysql> start transaction;

            mysql> insert into t_user(username) values('wangwu');

            mysql> insert into t_user(username) values('rose');

            mysql> insert into t_user(username) values('jack');

            mysql> select * from t_user;
            +----+----------+
            | id | username |
            +----+----------+
            |  1 | zs       |
            |  4 | wangwu   |
            |  5 | rose     |
            |  6 | jack     |
            +----+----------+

            mysql> commit; // 提交

            mysql> select * from t_user;
            +----+----------+
            | id | username |
            +----+----------+
            |  1 | zs       |
            |  4 | wangwu   |
            |  5 | rose     |
            |  6 | jack     |
            +----+----------+

            mysql> rollback; 

            mysql> select * from t_user;

            +----+----------+    //滾不回來已經提交的操作
            | id | username |
            +----+----------+
            |  1 | zs       |
            |  4 | wangwu   |
            |  5 | rose     |
            |  6 | jack     |
            +----+----------+

        * 演示兩個事務,假如隔離級別
            演示第1級別:讀未提交:
                set global transaction isolation level read uncommitted;
            演示第2級別:讀已提交:
                set global transaction isolation level read committed;
            演示第3級別:可重復讀:
                set global transaction isolation level repeatable read;
            
        * mysql遠程登錄:mysql -h192.168.151.18 -uroot -p444

 

八.索引:



    8.1、索引就相當于一本書的目錄,通過目錄可以快速的找到對應的資源;
        在資料庫方面,查詢一張表的時候有兩種檢索方式:
            第一種方式:全表掃描(效率低);
            第二種方式:根據索引檢索(效率很高);

        索引為什么可以提高檢索效率呢?
            最根本的原理是縮小了掃描的范圍,
        
        索引雖然可以提高檢索效率,但是不能隨意的添加索引,因為索引也是資料庫當中的物件,也需要資料庫不斷的維護,是有維護成本的;比如,表中的資料經常被修改這樣就不適合添加索引,因為資料一旦修改,索引需要重新排序,進行維護,

        添加索引是給某一個欄位,或者說某些欄位添加索引;

    8.2、怎么創建索引物件?怎么洗掉索引物件?
        創建索引物件:
            create index 索引名稱 on 表名(欄位名);
        洗掉索引物件:
            drop index 索引名稱 on 表名;

    8.3、什么時候考慮給欄位添加索引?
        * 資料量龐大(根據客戶的需求,根據線上的環境);
        * 該欄位很少的DML操作(因為欄位進行修改操作,索引也需要維護);
        * 該欄位經常出現在where子句中(經常根據哪個欄位查詢);
    
    8.4、注意:主鍵和具有unique約束的欄位自動會添加索引;由于根據主鍵查詢效率較高,所以盡量根據主鍵檢索,
    
    8.5、給薪資sal欄位添加索引:
        mysql> create index emp_sal_index on emp(sal);
        mysql> explain select ename,sal from emp where sal = 5000;
        +----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
        | id | select_type | table | type | possible_keys | key           | key_len | ref   | rows | Extra       |
        +----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
        |  1 | SIMPLE      | emp   | ref  | emp_sal_index | emp_sal_index | 9       | const |    1 | Using where |
        +----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
    
    8.6、索引底層采用的資料結構是:B + Tree
    
    8.7、索引的實作原理?
        通過B Tree縮小掃描范圍,底層索引進行了排序,磁區,索引會攜帶資料在表中的“物理地址”,最終通過索引檢索到資料之后,獲取到關聯的物理地址,通過物理地址定位表中的資料,效率是最高的,
            select ename from emp where ename = 'SMITH';
            通過索引轉換為:
            select ename from emp where 物理地址 = 0x3;

    8.8、索引的分類?
        單一索引:給單個欄位添加索引
        復合索引: 給多個欄位聯合起來添加1個索引
        主鍵索引:主鍵上會自動添加索引
        唯一索引:有unique約束的欄位上會自動添加索引
        ....
    
    8.9、索引什么時候失效?
        select ename from emp where ename like '%A%';
        模糊查詢的時候,第一個通配符使用的是%,這個時候索引是失效的;

 

九.視圖(view):



    9.1、視圖:站在不同的角度去看到資料(同一張表的資料,通過不同的角度去看待),
    
    9.2、怎么創建視圖?怎么洗掉視圖?
        create view myview as select empno,ename from emp;
        drop view myview;

        注意:只有DQL陳述句才能以視圖物件的方式創建出來,
    
    9.3、對視圖進行增刪改查,會影響到原表資料,(通過視圖影響原表資料的,不是直接操作的原表)
    可以對視圖進行CRUD操作,

    9.4、面向視圖操作?

        create table emp_bak as select * from emp;
        create view myview1 as select empno,ename,sal from emp_bak;
        update myview1 set ename='hehe',sal=1 where empno = 7369;   // 通過視圖修改原表資料
        delete from myview1 where empno = 7369;    // 通過視圖洗掉原表資料
    
    9.5、視圖的作用?
        視圖可以隱藏表的實作細節,保密級別較高的系統,資料庫只對外提供相關的視圖,java程式員只對視圖物件進行CRUD;

 

十.資料庫設計三范式(重點):



    7.1、設計范式:設計表的依據,按照這個三范式設計的表不會出現資料冗余,
    
    7.2、三范式都是哪些?

        第一范式:任何一張表都應該有主鍵,并且每一個欄位原子性不可再分;

        第二范式:建立在第一范式的基礎之上,所有非主鍵欄位完全依賴主鍵,不能產生部分依賴;
            口訣;多對多?三張表,關系表兩個外鍵
            t_student學生表
            sno(pk)        sname
            -------------------
            1                張三
            2                李四
            3                王五

            t_teacher 講師表
            tno(pk)        tname
            ---------------------
            1                王老師
            2                張老師
            3                李老師

            t_student_teacher_relation 學生講師關系表
            id(pk)        sno(fk)        tno(fk)
            ----------------------------------
            1                1                3
            2                1                1
            3                2                2
            4                2                3
            5                3                1
            6                3                3
        
        第三范式:建立在第二范式的基礎之上,所有非主鍵欄位直接依賴主鍵,不能產生傳遞依賴,
            口訣:一對多?兩張表,多的表加外鍵
            班級t_class
            cno(pk)            cname
            --------------------------
            1                    班級1
            2                    班級2

            學生t_student
            sno(pk)            sname                classno(fk)
            ---------------------------------------------
            101                張1                1
            102                張2                1
            103                張3                2
            104                張4                2
            105                張5                2
        
        注意:在實際的開發中,以滿足客戶的需求為主,有的時候會拿冗余換執行速度,

    7.3、一對一怎么設計?

        第一種設計方案 --- 主鍵共享
            t_user_login  用戶登錄表
            id(pk)        username            password
            --------------------------------------
            1                zs                    123
            2                ls                    456

            t_user_detail 用戶詳細資訊表
            id(pk+fk)    realname            tel            ....
            ------------------------------------------------
            1                張三                1111111111
            2                李四                1111415621

        第二種設計方案 --- 外鍵唯一
            t_user_login  用戶登錄表
            id(pk)        username            password
            --------------------------------------
            1                zs                    123
            2                ls                    456

            t_user_detail 用戶詳細資訊表
            id(pk)       realname            tel                userid(fk+unique)....
            -----------------------------------------------------------
            1                張三                1111111111        2
            2                李四                1111415621        1


            

隨筆:


1.增刪改查有一個術語:CRUD操作
Create(增) Retrieve(檢索) Update(修改) Delete(洗掉)

2.復合主鍵(不需要掌握):
            drop table if exists t_user;
            create table t_user(
                id int,
                username varchar(255),
                password varchar(255),
                primary key(id,username)
            );
            insert .......

3、DBA命令
    3.1、將資料庫當中的資料匯出
        在windows的dos命令視窗中執行:(匯出整個庫)
            mysqldump bjpowernode>D:\bjpowernode.sql -uroot -p333
        
        在windows的dos命令視窗中執行:(匯出指定資料庫當中的指定表)
            mysqldump bjpowernode emp>D:\bjpowernode.sql -uroot –p123

    3.2、匯入資料
        create database bjpowernode;
        use bjpowernode;
        source D:\bjpowernode.sql

4.存盤引擎:(了解)
    4.1、完整的建表陳述句
        CREATE TABLE `t_x` (
          `id` int(11) DEFAULT NULL
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

        注意:在MySQL當中,凡是識別符號是可以使用飄號括起來的,最好別用,不通用,

        建表的時候可以指定存盤引擎,也可以指定字符集,

        mysql默認使用的存盤引擎是InnoDB方式,
        默認采用的字符集是UTF8
    
    4.2、什么是存盤引擎呢?
        存盤引擎這個名字只有在mysql中存在,(Oracle中有對應的機制,但是不叫做存盤引擎,Oracle中沒有特殊的名字,
        就是“表的存盤方式”)

        mysql支持很多存盤引擎,每一個存盤引擎都對應了一種不同的存盤方式,
        每一個存盤引擎都有自己的優缺點,需要在合適的時機選擇合適的存盤引擎,
    
    4.3、查看當前mysql支持的存盤引擎?
        show engines \G

        mysql 5.5.36版本支持的存盤引擎有9個:
            *************************** 1. row ***************************
                    Engine: FEDERATED
                  Support: NO
                  Comment: Federated MySQL storage engine
            Transactions: NULL
                         XA: NULL
              Savepoints: NULL
            *************************** 2. row ***************************
                    Engine: MRG_MYISAM
                  Support: YES
                  Comment: Collection of identical MyISAM tables
            Transactions: NO
                         XA: NO
              Savepoints: NO
            *************************** 3. row ***************************
                    Engine: MyISAM
                  Support: YES
                  Comment: MyISAM storage engine
            Transactions: NO
                         XA: NO
              Savepoints: NO
            *************************** 4. row ***************************
                    Engine: BLACKHOLE
                  Support: YES
                  Comment: /dev/null storage engine (anything you write to it disappears)
            Transactions: NO
                         XA: NO
              Savepoints: NO
            *************************** 5. row ***************************
                    Engine: CSV
                  Support: YES
                  Comment: CSV storage engine
            Transactions: NO
                         XA: NO
              Savepoints: NO
            *************************** 6. row ***************************
                    Engine: MEMORY
                  Support: YES
                  Comment: Hash based, stored in memory, useful for temporary tables
            Transactions: NO
                         XA: NO
              Savepoints: NO
            *************************** 7. row ***************************
                    Engine: ARCHIVE
                  Support: YES
                  Comment: Archive storage engine
            Transactions: NO
                         XA: NO
              Savepoints: NO
            *************************** 8. row ***************************
                    Engine: InnoDB
                  Support: DEFAULT
                  Comment: Supports transactions, row-level locking, and foreign keys
            Transactions: YES
                         XA: YES
              Savepoints: YES
            *************************** 9. row ***************************
                    Engine: PERFORMANCE_SCHEMA
                  Support: YES
                  Comment: Performance Schema
            Transactions: NO
                         XA: NO
              Savepoints: NO

    4.4、常見的存盤引擎?

            Engine: MyISAM
                  Support: YES
                  Comment: MyISAM storage engine
            Transactions: NO
                         XA: NO
              Savepoints: NO
            
            MyISAM這種存盤引擎不支持事務,
            MyISAM是mysql最常用的存盤引擎,但是這種引擎不是默認的,
            MyISAM采用三個檔案組織一張表:
                xxx.frm(存盤格式的檔案)
                xxx.MYD(存盤表中資料的檔案)
                xxx.MYI(存盤表中索引的檔案)
            優點:可被壓縮,節省存盤空間,并且可以轉換為只讀表,提高檢索效率,
            缺點:不支持事務,

        -----------------------------------------------------------------------------

                  Engine: InnoDB
                  Support: DEFAULT
                  Comment: Supports transactions, row-level locking, and foreign keys
            Transactions: YES
                         XA: YES
              Savepoints: YES
                
            優點:支持事務、行級鎖、外鍵等,這種存盤引擎資料的安全得到保障,
            
            表的結構存盤在xxx.frm檔案中
            資料存盤在tablespace這樣的表空間中(邏輯概念),無法被壓縮,無法轉換成只讀,
            這種InnoDB存盤引擎在MySQL資料庫崩潰之后提供自動恢復機制,
            InnoDB支持級聯洗掉和級聯更新,
        
        -------------------------------------------------------------------------------------

                    Engine: MEMORY
                  Support: YES
                  Comment: Hash based, stored in memory, useful for temporary tables
            Transactions: NO
                         XA: NO
              Savepoints: NO
            
            缺點:不支持事務,資料容易丟失,因為所有資料和索引都是存盤在記憶體當中的,
            優點:查詢速度最快,
            以前叫做HEPA引擎,

5.索引實作原理:


資料出處:https://www.bilibili.com/video/BV1fx411X7BD

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/379489.html

標籤:MySQL

上一篇:Laravel存盤檔案未下載(未找到檔案)

下一篇:缺少[路線:攝影師.edit][URI:posts/edit/{photographers}]的必需引數

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more