day35

MySQL 數據行操做

1. 增

  • 增長一條數據mysql

    # 插入完整數據
    1. 
    insert into 表名(字段1,字段2,...,字段n) values (值1,值2,...,字段n);  # 按照選定的字段依次傳值
    
    2.
    insert into 表名 values (值1,值2,...,字段n); # 若是不選定字段,必須傳入表內
    
    # 指定字段插入數據
    insert into 表名(字段1,字段2,...) values (值1,值2,...)
  • 增長多條數據sql

    # 插入完整數據
    insert into 表名(字段1,字段2,...,字段n) values 
    (值1,值2,...,字段n),
    (值1,值2,...,字段n),
    (值1,值2,...,字段n)
    ......
    ;
    
    # 插入指定數據
    insert into 表名(字段1,字段2,...) values
    (值1,值2,...),
    (值1,值2,...),
    (值1,值2,...),
    ......
    ;
  • 插入查詢結果函數

    # 複製別的表內數據
    insert into 表名 (字段1,字段2,...字段n) select (字段1,字段2,...字段n) from 表2 where 條件;

2. 改

  • 修改數據工具

    # 將按照條件搜索出來的數據對應的列名的值改成新值
    update 表名 set 列名1=新值1,列名2=新值2 ... where 條件;

3. 刪

  • delete優化

    # 1. 刪除全部數據,清空表
    delete from 表名;
    
    # 2. 刪除表內指定的數據
    delete from 表名 where 條件; # 刪除根據條件篩選出來的數據
  • truncate日誌

    # 刪除全部數據,清空表
    truncate 表名;

區別:code

  1. 當表內有主鍵時,好比主鍵 id ,delete 以後,插入數據依然會從以前最大的主鍵 id+1,而 truncate 後,主鍵 id 會從 1 開始;
  2. delete 是將數據一行一行的刪除,truncate 是將數據全選刪除,因此 truncate 刪除的速度是高於 delete 的。

4. 查

4.1 單表查詢

查詢關鍵字的使用順序:排序

select 字段名 from 表名  where 條件 group by 條件 having 條件 order by 條件 limit 條件;

優先級:索引

where > group by > having > order by > limit
  • 關鍵字rem

    from      # 後跟表名;指定從哪張表查詢
    where     # 後跟條件;根據條件進行查詢
    group by  # 後跟字段名;按照字段名對數據排序
    having        # 後跟條件,與 group by 連用;對分組後的結果再進行二次篩選
    select        # 後跟字段名或 * ;表示要展現的字段信息,* 表示選擇表內全部的字段
    distinct  # 用在字段名前,對篩選出來的字段進行去重
    order by  # 後跟 字段名 asc/desc;表示對字段進行排序,asc表示升序,desc表示降序,默認爲升序
    limit     # 限制結果的顯示條數
    • select 字段名 from 表名

      1. 查詢表內指定字段的信息
      select 字段1,字段2,...,字段n from 表名; # 查詢對應表內的字段1,字段2,...,字段n的信息
      
      2. 查詢表內全部的信息
      select * from 表名;   # 查詢表內全部字段的信息
    • distinct

      select distinct 字段名 from 表名;    # 查詢表內字段信息,若是字段信息有重複的,則只顯示一個
      例如:
      select distinct name from goods;    # 查詢 goods 表內全部商品的名稱,並去重
    • where 條件

      select * from 表名 where 條件;
      例如:
      select * from goods where id < 10;  # 查詢 goods 表內 id <10 的全部商品信息
      • 條件

        1. 比較運算符
        大於:> ,大於等於:>= ,小於:< ,小於等於:<= ,不等於:!= 或 <>
        例如:
        id>10 , id>=10 , id<10 , id<=10 , id!=10 , id<>10 
        
        2. between...and...
        例如:
        id between 10 and 20  # id 在 10 到 20 之間的(包含 10 和 20 ) 
        
        3. in(值1,值2)
        例如:
        id in(10,20)  # id 是 10 或者 20 的
        name in('張三','李四') # name 是 張三 或者 李四 的
        
        4. 模糊條件(實際使用中最好不要使用,)
        只匹配給出的字符,加了 % 表示給定字符的前或後是什麼內容都忽略,只要對應位置有給定字符就符合條件
          - 以...開始:like 'ghjk%'   # 查詢以 ghjk 開頭的信息
          - 以...結束:like '%ghjk'   # 查詢以 ghjk 結尾的信息
          - 包含... :  like '%ghjk%'  # 查詢包含 ghjk 的信息
        
        5. is NULL , is not NULL  # 判斷字段是否是 NULl 
        例如:
        name is NULL      # name 是 NUll 的
        name is not NULL  # name 不是 NULL 的
        注意:
        name is ''            # ''表示空字符串,不是NULL
    • group by

      group by 必須跟在 where 條件 以後。

      group by 字段名    # 將全部記錄按照某個相同字段進行分組,好比針對員工的職位分組,或者按照性別分組等
      
      必須和聚合函數連用:
          - 聚合函數:
              - count(id)
              - max(salary)
              - min(salary)
              - avg(salary)
              - sum(salary)
      例如:
      select gender,count(id) from staff group by gender;   # 按照性別分組,而後顯示每一個性別的人數
      select gender,max(age) from staff group by gender;    # 按照性別分組,而後顯示每一個性別年齡的最大值
      select gender,min(age) from staff group by gender;    # 按照性別分組,而後顯示每一個性別年齡的最小值
      select gender,avg(age) from staff group by gender;    # 按照性別分組,而後顯示每一個性別年齡的平均值
      select gender,sum(age) from staff group by gender;    # 按照性別分組,而後統計每一個性別的年齡的綜合
    • having

      having 必須跟在 group by 以後。

      having 條件 # 過濾,對 group by 以後的數據進行二次篩選
      
      與 where 的區別
      執行優先級從高到低:where > group by > having 
      1. Where 發生在分組group by 以前,於是 Where 中能夠有任意字段,可是絕對不能使用聚合函數
      2. having 發生在分組 group by 以後,於是 having 中可使用分組的字段,沒法直接取到其餘字段,可使用聚合函數
      
      例如:
      # 按照性別分組,而後顯示平均年齡大於 26 的性別和平均年齡
      select gender,avg(age) from staff group by gender having avg(age) >26;
    • order by

      order by 字段名 asc(升序) / desc(降序) # 將字段排序
      
      例如:
      select * staff order by age asc;    # 將表 staff 內的信息按照年齡升序排列
      select * staff order by age desc;   # 將表 staff 內的信息按照年齡降序排列
      
      select * staff order by age desc , id asc;  # 將表 staff 內的信息按照年齡降序排列,若是年齡相同,再按照 id 升序排列
    • limit

      limit offset , size     # offset:行數據索引;size:取多少條數據
      
      例如:
      select * from staff limit 0,10;     # 將表 staff 的數據從第 1 條開始,取出10條信息
      select * from staff limit 10,10;    # 將表 staff 的數據從第 11 條開始,取出10條信息

4.2 多表查詢

4.2.1 表間關係

使用外鍵將表關聯起來,使其用某種聯繫。

  • 一對多

    給 A 表內的字段增長約束,約束是表 B 內的一個字段,且 A 表內該字段的值可重複,B 表內該字段不可重複。

    關聯方式:foreign key
    建立方法:在被約束的表內添加
    1. 建立表時建立:constraint 外鍵名 foreign key (被約束的字段) references 約束的表(約束的字段)
    2. 建立完成後添加:alter table 表名 constraint 外鍵名 foreign key (被約束的字段) references 約束的表(約束的字段)
  • 多對多

    給 C 表內的多個字段增長約束,約束是 A 表內的字段和 B 表內的字段,且只有 C 表內的值能夠重複。

    foreign key+一張新的表
    建立方法:在新表內添加
    1. 建立表時建立:constraint 外鍵名 foreign key (被約束的字段) references 約束的表(約束的字段)
    2. 建立完成後添加:alter table 表名 constraint 外鍵名 foreign key (被約束的字段) references 約束的表(約束的字段)
  • 一對一

    給 A 表內的字段增長約束,約束是 B 表內的一個字段,且 A、B 兩個字段都不可重複。

    關聯方式:foreign key+unique
    建立方法:在被約束的表內添加
    - 建立表時建立:
      1. 先增長一個惟一字段:字段名 列類型 [約束條件] unique;
      2. constraint 外鍵名 foreign key (被約束的字段) references 約束的表(約束的字段)
    - 建立完成後添加:
      1. 先增長一個惟一字段:字段名 列類型 [約束條件] unique;
      2. alter table 表名 constraint 外鍵名 foreign key (被約束的字段) references 約束的表(約束的字段)

4.2.2 多表聯查

  • 交叉鏈接

    # 直接將兩張表的全部信息聯合起來,生成笛卡爾積
    select * from 表A,表B;
  • 左鏈接

    # 優先顯示左表所有記錄
    select * from 表A left join 表B on A.被外鍵約束字段=B.約束字段     # 將兩張表經過外鍵關聯到一塊兒的字段將兩張錶鏈接起來,若是左邊表的某些信息在右邊沒有,右邊的表會顯示 NULL
  • 右鏈接

    # 優先顯示左表所有記錄
    select * from 表A right join 表B on A.被外鍵約束字段=B.約束字段    # 將兩張表經過外鍵關聯到一塊兒的字段將兩張錶鏈接起來,若是右邊表的某些信息在左邊沒有,左邊的表會顯示 NULL
  • 內鏈接

    # 只顯示匹配的行
    select * from 表A inner join 表B on A.被外鍵約束字段=B.約束字段    # 將兩張表經過外鍵關聯到一塊兒的字段將兩張錶鏈接起來,只顯示兩張表都有內容的信息
    • 鏈接查詢

      將錶鏈接在一塊兒後,就能夠根據條件進行篩選想要的結果,方法和單表查詢基本一致
      
      select * from 表A inner join 表B on A.被外鍵約束字段=B.約束字段 where 條件 group by 條件 having 條件 order by 條件 limit 條件;
  • 子查詢

    1. 子查詢是將一個查詢語句嵌套在另外一個查詢語句中;

    2. 內層查詢語句的查詢結果,能夠爲外層查詢語句提供查詢條件。
    3. 子查詢中能夠包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等關鍵字;
    4. 子查詢中能夠包含比較運算符:= 、 != 、> 、< 等;

5. 索引

優勢:增長索引會極大的提升查詢效率

缺點:建立索引會佔用大量的磁盤空間

5.1 爲何使用索引

爲了提升查詢效率,例如字典中的目錄。

5.2 索引的本質

一個特殊的文件。

5.3 索引的底層原理

B+ 樹

5.4 索引的種類

  • 主鍵索引:加速查找、不能重複、不能爲空

    primary key :

  • 惟一索引 :加速查找,不能重複

    unique(添加索引的字段名)

    • 聯合惟一索引

      unique(添加索引的字段名1,添加索引的字段名2)

  • 普通索引:加速查找

    index(添加索引的字段名)

    • 聯合索引

      index(添加索引的字段名1,添加索引的字段名2)

5.5 索引的使用

5.5.1 索引的建立

  • 主鍵索引

    • 建立

      1. 建立表時添加
      create table 表名(
      id int auto_increment ,
      primary key(id)
      )charset utf8;
      或
      create table 表名(
      id int auto_increment primary key
      )charset utf8;
      
      2. 增長
      alter table 表名 change id id int auto_increment primary key;
      
      3. 增長
      alter table 表名 add primary key (id);
    • 刪除

      alter table 表名 drop primary key;
  • 惟一索引

    • 建立

      1. 建立表時添加
      create table t2(
      id int auto_increment primary key,
      name varchar(32) not null default '',
      unique u_name (name)
      )charset utf8
      
      2. 增長
      create index  索引名 ON 表名 (字段名) ;
      
      3. 增長
      alter table 表名 add index 索引名 (字段名)
    • 刪除

      alter table 表名 drop index 索引名;
  • 普通索引

    • 建立

      1. 建立表時添加
      create table t3(
      id int auto_increment primary key,
      name varchar(32) not null default '',
      index u_name (name)
      )charset utf8
      
      2. 增長
      create  index  索引名 ON 表名 (字段名) ;
      
      3. 增長
      alter table 表名 add index 索引名 (字段名);
    • 刪除

      alter table 表名 drop index 索引名;

5.5.2 索引的使用

當使用 SQL 指令進行查詢時,若是用到了索引,成爲命中了索引。

  • 不會命中索引的幾種狀況

    • 不能在 SQL 指令中作四則運算,會下降查詢效率

    • 使用函數

      例如:select * from 表名 where reverse(email) = 'tom';
    • 類型不一致

      若是列類型是字符串,傳入查詢條件時沒有按照字符串的形式傳入

      例如:select * from 表名 where name = tom;   # 應該使用 name = 'tom'
    • 排序條件爲索引,則 select 字段必須也是索引字段,不然沒法命中

      當根據索引排序時候,select 查詢的字段若是不是索引,則速度仍然很慢
      例如:select name from 表名 order by age     # 假設 age 字段有索引,name 字段沒有索引
      
      特別的:
      若是是對主鍵排序,則不會影響
      例如 select * from 表名 order by 主鍵字段;
    • 組合索引最左前綴

      使用聯合索引的狀況下:當最左邊一個字段存在的時候,就能夠命中,不然,不能命中
      例如:
      index 索引名(字段1,字段2,字段3,字段4)
      能夠命中的狀況:
          where 字段1=值 and 字段2=值 and 字段3=值 and 字段4=值;      
          where 字段1=值 and 字段2=值 and 字段3=值;
          where 字段1=值 and 字段2=值;
          where 字段1=值;
      不能命中的清空
          where 字段2=值 and 字段3=值 and 字段4=值;
          where 字段2=值 and 字段3=值;
          where 字段2=值;
          等等......
    • 查看 SQL 指令是否命中索引

      explain SQL指令 \G
      例如:
      mysql> explain select * from user where name='zekai' and email='zekai@qq.com'\G
      *************************** 1. row ***************************
                      id: 1
                      select_type: SIMPLE
                      table: user
                      partitions: NULL
                      type: ref       索引指向 all
                      possible_keys: ix_name_email     可能用到的索引
                      key: ix_name_email     確實用到的索引
                      key_len: 214            索引長度
                      ref: const,const
                      rows: 1            掃描的長度
                      filtered: 100.00
                      Extra: Using index   使用到了索引
    • 慢查詢日誌

      使用 MySQL 提供的工具記錄效率低的 SQL指令,後期進行優化

      • 查看慢SQL的相關變量

        mysql> show variables like '%slow%';
        +---------------------------+-----------------------------------------------+
        | Variable_name             | Value                                         |
        +---------------------------+-----------------------------------------------+
        | log_slow_admin_statements | OFF                                           |
        | log_slow_slave_statements | OFF                                           |
        | slow_launch_time          | 2                                             |
        | slow_query_log            | OFF   ### 默認關閉慢SQl查詢日誌, on                                          |
        | slow_query_log_file       | D:\mysql-5.7.28\data\DESKTOP-910UNQE-slow.log | ## 慢SQL記錄的位置
        +---------------------------+-----------------------------------------------+
        5 rows in set, 1 warning (0.08 sec)
        
        mysql> show variables like '%long%';
        +----------------------------------------------------------+-----------+
        | Variable_name                                            | Value     |
        +----------------------------------------------------------+-----------+
        | long_query_time                                          | 10.000000 |
      • 配置慢SQL變量

        set global 變量名 = 值    # 查詢要配置的變量名
        set global slow_query_log = on;   # 打開記錄功能
        set global slow_query_log_file="存儲路徑";
        set global long_query_time=1; # 設定記錄的SQL指令執行時間閾值,超過記錄
相關文章
相關標籤/搜索