SQL 常用的判斷、連表、跨庫、去重、分組、ROW_NUMBER()分析函數SQL用法


常用的SQL 

大致上回想一下自己常用的SQL,並做個記錄,目標是實現可以通過在此頁面查找到自己需要的SQL 

首先我創建了兩個庫,每個庫兩張表.(工作的時候,每個公司最好有自己的數據庫模型,產品也可以看,模型工具一般用PD(power designer)什么的,用起來簡單規范方便,建議萌新學習)

·

第二個庫crtest2是復制第一個crtset的  復制表的方法為右鍵--》編寫腳本--》打開庫2的窗口復制(建議瞟一眼腳本,執行不成功的  腳本最上面數據庫改成目標數據庫)

1.基本操作

查三個字名字的人,並把name= 楊永信 的輸出為 雷電法王,這一手是為了使用一下case when (碰到條件查詢不要着急,一步步來,先確保數據邏輯的正確性,寫好后,再去優化SQL)(美化SQL用Navicat Premium,SQL format,SQL Beautifier等等,這三個親測好用)

case when .. then  .. else ..end  就當做  if ...else....來用就行 

查數據量,不建議用 count(*),換成count(字段名),沒有字段名的約束  用 count(1)來查,執行速度截然不同

 

 

連表查詢,超過兩個表以上的連表查詢,一定要記得大表在前小表在后。實際情況里 inner join,left join使用的比較多,這里做一下區分,到底什么時候用inner,什么時候用left

網上也有很多,說的太官方,容易迷。這里我通俗的講一講

left  join:左聯合  就是說兩個表關聯  左邊的是大哥,一切以大哥為准,大哥表的數據無條件全部返回,其他表跟大哥對應的數據,大哥也全都要 (所以一般來說,left比inner的數據量要多)

inner join:內聯合  兩個表是拜把子  互相謙讓,你有我也有的數據才要,取共同點

語法: select   *  from  A表  left  join B表  on  a.id = b.id   很簡單 

 跨庫查詢也是一樣,這里我查crtest 和crtest2 兩個庫的HelloMan表的聯合查詢,很簡單,看一下

 

去重

 SQL去重一般用distinct,group by這兩種方法,介紹一下  

 distinct:   select  distinct(字段名) from  表名  where  條件

 group by:select   字段    from   表名   group  by  字段  having  條件

使用 group by的時候 用having語法 而不是where  (本人傾向於group  by,因為它不僅僅是去重查找,刪重,條件嵌套可以一起寫,功能多一些吧。 )

 

 

ROW_NUMBER()函數

這個ROW_NUMBER(),在數據庫執行的時候有點耗性能,但它的任務多數情況下是用來提升性能的。平時大家用來做分頁功能。

你可以幫他當做成分組函數或是分析函數

語法:ROW_NUMBER() over(order by  字段名 desc) 

 

 

看到了吧,多了個排序字段  在where一下 真分頁就OK了嘛

 假設我們想查一個商場一個時間段內,第88位消費的顧客的信息。嘿嘿,一步到位的話也可以寫,不用ROW_NUMBER()的函數還真的不好寫。用ROW_NUMBER()就好多了

回到我們的測試表 對着上面 我們查一下年齡段在15-25,四個字名字,排名第二高的武林高手(武林排名按照各自的cid來算,劍無塵第一,因為數據少我們能從上面提前看出答案,是關谷),SQL如下:

 

 

 

先分組,再尋找   簡單的很

模糊查詢

很簡單,一看便知  這里說一下我們經常用的通配符為  %% ,但是還有一些 像  like '_ a_'  ,like  '[a]b' 這種的 也是通配符,LZ覺得看關鍵字Like就完事兒了。知道就行了不常用

提一下,左右兩邊帶 %,是兩邊都進行模糊匹,只放在左邊是左邊匹配,右邊同理,一看便知

 

 

時間日期函數

convert()  date()   大家可以去這來看看學習   http://www.w3school.com.cn/sql/func_convert.asp 

寫的全面,很好,這里我就不寫了

 

數據格式轉換,時間戳

時間戳:就是linux的時間   好一點的數據庫儲存時間的字段都是用時間戳存的,int類型,安全,占用空間小, 簡單查看時間戳  https://tool.lu/timestamp/

 方法:  CONVERT(VARCHAR(10),DATEADD(s, ttime + 8 * 3600, '1970-01-01'),120)  AS  times      (這里我又在測試表里又加了個ttime字段,用來存時間戳,取出來的時候用這個函數轉換成時間,精確度自己設置)

convert()  在SQL中convert()函數除了轉時間還可以進行其他格式的轉換,最常用的就是錢,money,decimal類型,還有如果數據庫是varchar類型之類的,然后你扔進來的是int,dateteime之類的就需要convert()轉換一下,很簡單

格式: convert(要轉的類型,要轉的數據)  例如: CONVERT(VARCHAR(50),tid)   tid是int型轉成varchar,很簡單

說到這里要熟練使用 IsNULL()函數,加減乘除都要外面包一層IsNull()函數

 格式:IsNull(數據,默認值)   例如  ISNULL(sum,0)  as sum

希望自己能慢慢提高自己SQL。

通過簡單的兩句代碼,慢慢發現編程的樂趣


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM