mysql總結筆記(一)

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
相關文章
相關標籤/搜索