mysql-sql高級應用

来源:http://www.cnblogs.com/Aiapple/archive/2016/07/18/5683030.html
-Advertisement-
Play Games

sql語言進階 典型操作 order by - select * from play_list order by createtime; - select * from play_list order by bookedcount desc,createtime asc; order by 語句用於 ...


sql語言進階   典型操作
  order by
- select * from play_list order by createtime;
- select * from play_list order by bookedcount desc,createtime asc;
order by  語句用於根據指定的列對結果集進行排序 order by  語句預設按照升序對記錄排序,使用desc則降序排序 order by  也可以多個欄位排序,而desc只作用於一個欄位;   distinct  
     select distinct userid from play_list;
     select distinct userid,play_name from play_list;    
(userid,play_named都相同時去重)
distinct 用於去重,可以返回多列的唯一組合; distinct 在後臺做排序,所以很消耗CUP的;   group by having 場景:統計雲音樂創建歌單的用戶列表和每人創建歌單的數量
mysql> select userid,count(*) AS play_num from play_list group by userid having count(*)>=2;
分組關鍵字userid,需要在查詢中出現,且一般查詢分組關鍵字後要加聚合函數;   like   
   select * from play_list where play_name like '%男孩%'

 

通配符 描述
% 代替一個或多個字元
_ 替代單個字元
[charlist] 中括弧中的任何單一字元
[^charlist] 或者 [!charlist] 不在中括弧中的任何單一字元
  大表慎用like; 除了%號在最右邊以外,會對錶中所有記錄進行查詢匹配;   limit offset 場景4:查詢一個月內創建的歌單(從第6行開始顯示10條記錄)
select * from play_list where (createtime between 1427701323 and 1430383307) limit 10 offset 6
註意:offset 後面的值不要太大,假設offset1000,那它會掃描前1000條記錄,這樣IO開銷會很大   case when case when 實現類似編程語言的 if  else 功能,可以對SQL的輸出結果進行選擇判斷; 場景5:對於未錄入的歌單(trackcount  = null),輸出結果時歌曲數返回0
mysql> select play_name,case when trackcount is null then 0 else trackcount end from play_list;
  連接-join 用一個SQL 語句把多個表中相互關聯的數據查詢出來; 場景6:查詢收藏“老男孩”歌單的用戶列表
mysql> SELECT play_fav.userid FROM play_fav INNER JOIN play_list ON play_fav.play_id = play_list.id where play_list.play_name = '老男孩';
另一種寫法:
mysql> select f.userid from play_list lst,play_fav f where lst.id = f.play_id and lst.play_name = '老男孩'

 

子查詢及問題
  子查詢的寫法:
select userid from play_fav where play_id=(select id from play_list where play_name = '老男孩');
別名 可以不用使用AS 關鍵字,直接空格加別名就可以了;   子查詢在性能上有一定劣勢,不利於mysql性能優化器進行優化; 因為內層表和驅動表用戶自己定死了,而聯結的驅動表和內層表 性能優化器 會根據實際情況 來定;   子查詢為什麼不利於優化: 聯結是嵌套迴圈查詢實現; 如select * from play_list,play_fav where play_list.id = play_fav.play_id; play_list驅動表(where等號左邊);內層表play_fav(where等號右邊); 遍歷去東北play_list.id,找到一個id後再去play_fav.play_id中找;依次迴圈下去; 內層表此時可以查詢一次或者幾次索引,便可以得到; 所以基本的優化就是將表量比較小的作為驅動表,這樣減少了迴圈的次數;   union 作用:把不同表中相同的欄位聚合在一個結果集中返回給用戶 場景8:老闆想看創建和收藏歌單的所有用戶,查詢play_list和play_fav兩表中所有的userid;  
mysql> select userid from play_list
         -> union
         -> select userid from play_fav;
預設的union 會對結果集進行去重處理,不想去重使用 union all;     DML進階語法
  • 多值插入:insert into table values(.....),(.....)
  • 覆蓋插入:replace into  table values(...)
  • 忽略插入:insert ignore into table values(...)
  • 查詢插入:insert into table_a select * from table_b
  多值插入:減少資料庫訪問次數,提高效率;   覆蓋插入,忽略插入:簡化業務邏輯的判斷;避免主鍵重覆;   查詢插入:導表結構中;   insert主鍵重覆則update:      insert into table tb1 values(id,col1,col2)      on duplicate key update col2=....;  
mysql> insert into  a values(1,100) on duplicate key update age=100;
如果id = 1存在,則鍵age 更改為100; 註意得是主鍵噢,如何表中沒有設置主鍵,則會新增加一條記錄;   而給表a增加主鍵則是: 
mysql> alter table order add primary key (id);

 

連表update 用B表中的age 更新到 A 表中的age :
mysql> select * from a;
+----+------+
| id | age  |
+----+------+
|  1 |  100 |
|  2 |   34 |
|  3 |   23 |
|  4 |   29 |
+----+------+
mysql> select * from b;
+------+------+------+
| id   | name | age  |
+------+------+------+
|    1 | pw   |   20 |
|    2 | ljb  |   30 |
+------+------+------+
mysql> update a,b set a.age=b.age where a.id = b.id;
mysql> select * from a;
+----+------+
| id | age  |
+----+------+
|  1 |   20 |
|  2 |   30 |
|  3 |   23 |
|  4 |   29 |
+----+------+
連表delete 用B表中的條件去刪除A表中數據;
mysql> select * from a;
+----+------+
| id | age  |
+----+------+
|  1 |   20 |
|  2 |   30 |
|  3 |   23 |
|  4 |   29 |
+----+------+
mysql> select * from b;
+------+------+------+
| id   | name | age  |
+------+------+------+
|    1 | pw   |   20 |
|    2 | ljb  |   30 |
+------+------+------+
mysql> delete a from a,b where a.id=b.id and b.name='pw';
mysql> select * from a;
+----+------+
| id | age  |
+----+------+
|  2 |   30 |
|  3 |   23 |
|  4 |   29 |
+----+------+

 

刪除語法:
DELETE FROM Customers
WHERE cust_id = '1000000006';
連表在delete之後還要將需要刪除的表放在delete後面;   內置函數

  • 目標:掌握常用的mysql聚合函數,預定義函數
  • 在SQL查詢語句中運用上述函數結構group by,order by等語法完成各種統計功能
  聚合函數
  • 聚合函數面向一組數據,對數據進行聚合運算後返回單一的值
  • mysql聚合函數基本語法:select function(列) from 表
  常用聚合函數:     場景:查詢播放次數最多的歌曲
mysql> select song_name,max(playcount) from song_list; //錯誤查法
#select song_name,沒有對應 playcount;
#註意聚合函數是對返回列來做處理的,此中放回列是所有歌曲;
 
mysql> select song_name,playcount from song_list order by playcount desc limit1;//正確
 
子查詢方法:
select song_name from song_list where playcount=(select max(playcount) from song_list);

 

場景:顯示每張專輯的歌曲列表。例如:
mysql> select album,group_concat(song_name) from song_list group by album;
+------------------+-------------------------------------------------+
| album            | group_concat(song_name)                  |
+------------------+-------------------------------------------------+
| 1701             | 大象,定西                                        |
| Straight Shooter | Good Lovin' Gone Bad,Weep No More,Shooting Star |
| 作品李宗盛         | 風櫃來的人                                       |
| 紅雪蓮            | 紅雪蓮                                           |
+------------------+-------------------------------------------------+
group_concat 連接的最長字元是1024,可以通過參數調整;   使用聚合函數做資料庫行列轉換:  

 

      預定義函數:
  • 預定義函數面向單一值數據,返回一對一的處理結果(聚合函數可以理解成多對一)
  • 預定義函數基本語法:select  function(列) from 表;select * from 表 where 列 = function(value)
 

 

  時間處理函數:

 

  總結
  1. order by
  2. distinct
  3. limit offset:
  4. case when then else end
  5. 連接-join兩種寫法
  6. 子查詢為什麼不利於優化:優化器不能改變,驅動表,內層表;從而不能優化;驅動表一般表量較小,因其需要全表id;內層表,僅需要查找一個或幾個索引;這就是jion後優化器工作
  7. union:把不同表中相同欄位聚合在一個結果集中
  8. 連表update,根據B表age值更新A表age:update a,b set a.age=b.age where a.id = b.id;
  9. 連表delete,根據B表name刪除A表的數據:delete a from a,b where a.id=b.id and b.name='pw';
  10. 聚合函數:AVG(),COUNT(),COUNT(DISTNCT),MAX(),MIN(),SUM()常與 group by,order by連用;
  11. group_concat()mysql特有
  12. 預定義函數

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 04
    04 ...
  • 相對佈局由其名稱大致可以猜測其是相對於其他的控制項進行佈局的。因此呢!其屬性也就比較多了,不過基本上都是有跡可循的。下麵就其屬性值的特點可以將一些常用的屬性分為以下三個類別。 1. 屬性值為true或false(相對於父控制項的位置) android:layout_centerHrizontal 水平居 ...
  • 顧名思義,LinearLayout是指將佈局或者是控制項以線性的形式排布到佈局里;當然,此處就涉及到兩個方向的排布,只要將LinearLayout中的android:orientation屬性的屬性值設置為vertical(垂直方向)和horizontal(水平方向)即可。 線性佈局當中的一些常見屬性 ...
  • 狀態欄動畫切換效果 效果 源碼 https://github.com/YouXianMing/iOS-Project-Examples 中的 StatusBarAnimation ...
  • 1、UIApplication(應用程式實例) 獲取方式:[UIApplication sharedApplication] 詳細:http://www.cnblogs.com/hissia/p/5678518.html 2、NSNotificationCenter(消息中心) 獲取方式:[NSNo ...
  • user_tab_columns來源於user_tab_cols,user_tab_cols where hidden_column='NO',引自:http://blog.csdn.net/gumengkai/article/details/50823140 user_all_tables 是 u ...
  • 我執行下邊的sql語句 得到下麵結果 誰能告訴我那一步沒有去重嗎? ...
  • 工作中的問題總結: 問題一:scala 之向下轉型 引言:假如在複雜的業務邏輯中,變數的類型不能確認,只能給個介面類型,這樣數據類型推導不會錯誤,但是後面要使用實現類的類型時,你卻發現轉不過來了? 對於這樣的一個問題,scala可以這樣解決: 首先建造一個介面,People: 這樣定義了一個介面,接 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...