1. 程式人生 > >mysql資料庫基本操作注意點

mysql資料庫基本操作注意點

對於一個初學資料庫的人來說,最主要的還是要掌握DQL資料庫查詢語言和DML資料操作語言。

這裡主要對DQL進行簡單的總結,實質就是學習的筆記。

資料查詢語言基本的語句結構為select * from table_name;

1. 條件語句where關建字,支援多種運算子

  • 比較運算子 
    • > < = >= <= (!= <>)其中<> 與!= 均是不等於的意思
  • 邏輯運算子
    • and 與
    • or   或
    • not 非
  • 模糊查詢
    • like
      • _匹配任意一個字元
        • select * from table_name where name like '周_'    #查詢table_name表中name欄位為兩個字,且第一個字為周的資訊
      • %匹配任意多個字元
        • select * from table_name where name like '周%'  # 查詢table_name表中name欄位為多個字,且第一個字為周的資訊
  • 範圍查詢
    • in 表示在一個非連續的範圍內 與  not  in 不非連續的範圍內
      • select * from table_name where age in (18,22,24,26)  #查詢table_name表中age欄位是18或22或24或26的資訊
    • between and  表示在一個連續的範圍內(等價於18<=age<=38)與 not between and
      • select * from table_name where age between 18 and 38  #查詢table_name表中age欄位是在18到38之間的所有資訊
  • 空判斷  
    • is null  查詢為空的內容(where語句中)  
      •  select * from student where height is null; # 判斷身高欄位為空的內容
    •  is not null 查詢不為空的內容(where語句中)  
      • select * from student where height is not null;

注:
        優先順序由高到低的順序為:
            小括號,not,比較運算子,邏輯運算子
           and比or先運算,如果同時出現並希望先算or,需要結合()使用

2. 分頁查詢(limit)

select * from 表名 limit start=0,count
        1. limit 3 :從第一條開始取3條
            注:start預設為0,即第一條開始
        2. limit 1,3: 從第2條後邊開始取3條
        n個頁面,每個頁面顯示m條資料
        select * from 表名 limit (n-1)*m,m    

3. 聚合函式:不包含欄位為空的行數
        
        概念:
            聚合函式又稱組函式,操作的物件就是一組資料,預設情況下聚合函式會對當前所在表當作一個組進行統計。

        聚合函式有以下幾個特點:
            * 每個組函式接收一個引數(欄位名或者表示式)
            * 統計結果中預設忽略欄位為NULL的記錄 要想列值為NULL的行也參與組函式的計算,必須使用IFNULL函式對NULL值做轉換。

            * 不允許出現巢狀 比如sum(max(xx))
            1. count(*) 表示計算總行數,括號中寫星與列名,結果是相同的
                    注:count計算的是內容不為空的行數
            2. max(列) 表示求此列的最大值
                select max(age) from students;
            3. min(列) 表示求此列的最小值
                select min(height) from students;
            4. sum(列) 表示求此列的和
                select sum(age)/count(age) from students;
            5. avg(列) 表示求此列的平均值
                select avg(age) from students;
            6. round預設保留0位小數 round(數值,保留的位數)
                select round(avg(age),1) from students;
                注: round不是組函式
            注:聚合函式操作的物件是一組資料,可以是某個表資料,也可以是表的分組資料(group by),但不能是拼接的資料(join).
 4. 分組函式,對於空的欄位也會進行分組
        一旦對錶中資料進行分組,那麼分組的結果將不再是之前的二維表結構,而是多維結構,就不能直接使用SQL語句顯示全部資料,即不能直接使用select *。
        使用特點:
            1. group by的含義:將查詢結果按照1個或多個欄位進行分組,欄位值相同的為一組
            2. group by可用於單個欄位分組,也可用於多個欄位分組
        group  對照看看正則
        1. select gender(這裡只能寫被分組的欄位) from  students group gender;
        
        2. select gender,group_concat(name) from students group by gender
            注:因為分組之後的結果不再是普通的二維結構了,不能直接顯示全部,如果需要檢視每個分組中每個成員的某一個欄位group_concat()可以將同組成員的某一個欄位進行拼接在一個???顯示
        
        3. select gender,group_concat(name),count(*) from students group by gender
            注:在沒有分組之前,聚合函式是整個表,如果結合了group by之後,統計的就是每一個小的分組
                按照性別gender分組,前面可以不寫gender,寫其他的欄位需要加group_concat(欄位名)
        4. having 判斷,篩選:對分組的結果進行條件篩選
            select gender,group_concat(name),count(*) from students group by gender having count(*) <3;
            例如:通過身高和年齡進行分組,然後篩選性別為男的欄位,注意gender也需要加group_concat(gender)
                select height,age,group_concat(name) from students group by height,age having group_concat(gender) ="男";
        注:1. where對錶中記錄進行條件的篩選
               having 對分組的結果進行條件篩選
            
            2. 多個欄位的分組,要同時滿足多個欄位才會分為一組
                select height,age,group_concat(name) from students group by height,age;
        5. 在最後一行加一個彙總的結果group by 後加 with rollup
            1. select gender,group_concat(name),count(*) from students group by gender with rollup;

 5. 連線查詢
            內連線:只取兩個表有關聯的資料
            外連線;內連線+外部資料
                右(外)連線: 內連線 + 外部資料來自於左表資料,右表於左表中不存在的資料使用null填充
                左(外)連線: 內連線 + 外部資料來自於右表資料,左表於右表中不存在的資料使用null填充
            笛卡爾積(交叉連線):左表每一行分別拼接右表每一行
            
            on 條件:對笛卡爾積的結果中的資料進行過濾
            內連線:
            select * from hero jion gongfu on hero.kongfuid = gongfu.id;
            左連結:
            select * from hero left jion gongfu on hero.kongfuid = gongfu.id;