MySQL開發技巧(一)

SQL 開發技巧
    SQL 語句類型    
        DDL:數據定義語言
        TPL:事務處理無言
        DCL:數據控制語言
        DML:數據操做語言{SELECT INSERT UPDATE DELETE}前端

    SQL重要性:
        1.增長數據庫處理效率,減小 應用相應時間。
        2.減小數據庫服務器負載,增長服務器穩定。
        3.減小服務器間通信的網絡流量。
        (實現一些其餘人以爲SQL語句完成不了的功能,這也是一件很是酷的事情)數據庫

    Join從句的正確使用
        例子表:
        一表: 唐僧四人表(four)                           悟空關係表(relation)
                id      username   over             id      uasername       over
                1       唐僧        仙               1        牛魔王            被降服
                2       孫悟空      鬥戰             2         紅孩兒           被降服
                3       豬八戒      豬               3         托塔天王         被降服
                4       沙和尚      傻逼             4         孫悟空           超牛逼
        Join的類型:
        1.內鏈接--INNER
            將兩張表的組合在一塊兒,產生新的結果表
            SELECT * FROM four as f INNER JOIN relation as r ON f.username = r.username
            結果就是隻有一條記錄 服務器

        2.全外鏈接--FULL OUTER
            左鏈接和右鏈接的結合
            1.能夠將兩張表的全部字段結果集
            2.能夠過濾AB兩表的關聯字段
            問題來了:
            SELECT * FROM four as f FULL JOIN relation as r ON r.username = f.username   會報ERROR 1600錯誤
            解決方法:UNION ALL
            select f.username, f.over, r.over from four f LEFT JOIN relation r ON f.username = r.username 
            union ALL 
            select r.username, r.over, f.over from relation r RIGHT JOIN four f ON r.username = f.username
            這樣就能查詢出兩表的全部數據
            
        3.左外鏈接--LEFT OUTER
            1.A表B表關聯,取得A表中的全部結果集
            2.A表B表關聯,取得A表中除了和B表關聯的其餘字段結果集
            查詢取經四人組中哪些人不是悟空的結拜兄弟。
            select a.user_name,a.over,b.over FROM four as f LEFT JOIN relation as r ON r.username = f.username WHERE r.username IS NULL(反之則IS NOT NULL)網絡

        4.右外鏈接--RIGHT OUTER
            1.A表B表關聯,取得B表中的全部結果集
            2.A表B表關聯,取得B表中除了和A表關聯的其餘字段結果集
            查詢悟空的結拜兄弟中那些人沒有去取經
            select r.user_name,r.over,f.over FROM four as f LEFT JOIN relation as r ON r.username = f.username WHERE f.username IS NULL(反之則IS NOT NULL)
            函數


        5.交叉鏈接(CROSS)
            交叉鏈接(cross join),又稱笛卡爾鏈接(cartesian join)或叉乘(Product),若是A和B是兩個集合,他們的交叉鏈接就爲:A x B(若是A有4個字段,B有五個,就是20個)
            select a.name,b.name from user1 a CROSS JOIN user b  (沒有任何關鍵字)優化

    Join相關SQL技巧
        如何更新使用過濾調教中包括自身的表?
        UPDATE user1 a join (select b.username from user1 a join user2 b on a.username = b.username) b on a.username = b.username 
        SET a.over = '齊天大神';事務

        使用JOIN優化子查詢
        select a.username,a.over,b.over as over2 from user1 a LEFT JOIN user2 b ON a.username = b.username開發

        使用JOIN優化聚合子查詢
        select 【field1,field2..fieldn】 functionname(聚合函數) from tablename 
        【where condition】
        group by field1,field2..fieldn  進行分類聚合的字段
        【with rollup】 可選語法:是否對已經聚合過的結果再進行彙總
        【having where condition】分類聚合後再進行條件過濾it

    分組選擇
        使用場景:選擇閱讀量前十的不一樣分類的新聞頭條//選擇前十的不一樣分類的課程(如前端,後段,數據庫)
        例子: SELECT d.username, ctimestr, kills FROM (SELECT user_id, timestr,kills, (SELECT COUNT(*) FROM user_kills b WHERE b.user_id=a.user_id AND a.kills <= b.kills) AS cnt FROM user_kills a GROUPS BY user_id,timestr,kills) c JOIN user1 d ON c.user_id=d.id WHERE cnt <= 2
        
        io

                                                            =====================本身記錄的筆記,可能有點簡陋

相關文章
相關標籤/搜索