sql数据库相关语句
易錯點
Where需要放在from語句之后;where中不能出現聚合函數(就是能夠將幾行一列合并為一行一列的函數,比如max,min,avg,count());但是可以出現其他,如比較符,getdate(0之類的哈
2,篩選條件中需要用到聚合函數的話,不能用where子句,此時考慮是否可以采用having,但是having只能夠和group by 結合使用,其使用的對象必須是前面select出的參與分組的哪些列
3,group by子句必須放在where子句的后面,并且沒有在group by 子句中出現的列是不能夠出現在select中的,因此select中的列要么在group by中出現過,要么就是聚合函數,此時聚合函數作用的對象只在分組內部,對表中的列按照分組后的結果進行處理(因為多行聚合為一行之后,只有聚合函數才能同樣返回一行的結果)
2,Like,=后的字符串的單引號別忘記了,一看到前幾名,后幾名,別忘記加上ofrderby,并且這個子句一般是最后一句
4,感覺執行的時候大概是這么一個順序,先看from的對象,然后查看where子句,然后是groupby,的處理,之后是orderby 的排序,最后才返回select來查
不過書寫的順序
select
from
where
groupby
orderby
或者
select
from
groupby
having
5,要將多個結果集進行合并,使用union或者union all,此時要求列數相等,第一個select定義的是列明,類型相容;查詢的結果集來自多個有關聯的表采用join on(這些表之間存在類似于外鍵的概念)
創建和刪除表
? ? ? ? ? ? ? ? ? ? ? ?
修改表
?
主鍵選擇
?
數據的update
?
以及In(集合)between? and
?
數據檢索(別名)
?
Select之后有幾個字段,得到的結果集就有幾個列;如果select 檢索不和表關聯的字段的時候,相當于計算函數或者表達式的值。
數據匯總
?
數據排序
?
通配符過濾
?
空值處理
?
SELECT userinfo.id, user_name, role, adm_regionid, IFNULL(region_name,0) as region_name, create_time FROM userinfo LEFT JOIN region ON userinfo.adm_regionid = region.id?
數據分組
?
Having
?
取得特定條數
?
?
去掉重復數據
?distinct
聯合結果集;
?
(聯合之后的列名是頭一個selsect對應的列名,如果列數不相同,那么只有自己寫一個相同類型的數據如上條語句那樣給人工補全;此時補全的表達式不在是雷鳴,而是前一個sql語句對應字段下面的取值)
?
數據庫函數
數字函數
?
字符串函數
?
如果要去除兩邊的空格,這么來做
LTRIM(RTRIM(“???? aa????? ”));
日期函數
?
?
Hour hh 小時
Second 秒鐘
類型轉換函數
?
當然轉換的前提是這些類型確實可以轉換
空值處理函數
?
流程函數
?
?
幾條案例
查詢員工的最高最低年齡,得到一個結果表
?
其中的員工最高最低年齡,并非原來的表中已經具有的列,所以需要注意select語句不僅僅是在已經有的數據中檢索,還能有其他用途;如果與表無關聯的時候,就是計算表達式或者函數的值作為這一列的值輸出(不是列名)
在最后一行加上合計
?
計算入職的年份;并根據結果進行排序
?
取出當前日期的年份
?
取出每一年入職員工的人數
?
兩列聲稱三個列
?
Select 單號,
(Case 金額
When 金額>0 then 金額
Else 0
As 收入),
(case 金額
When 金額<0 then 金額
Else 0
As 支出)
From tableName
?
《這個例子的特點是行數不變,只是將其中原來的一列拆分為兩列,并不存在函數的聚合》
計算比賽的勝負場次
?
select Name,
sum(case Score
when N’勝’ then 1 else 0 )as 勝,
sum(case Score
when N’負’ then 1 else 0 )as 負,
from T_Score
group by Name
綜合練習
?
1,? 取得通話時間最長的3條記錄
SELECT?? TOP (3) Id, CallerNumber, TelNumber, StartDateTime, EndTime, DATEDIFF(second, StartDateTime, EndTime)
AS 間隔
FROM????? T_call
ORDER BY 間隔 DESC
如果不想要多增加一個字段,可以
SELECT?? TOP (3) Id, CallerNumber, TelNumber, StartDateTime, EndTime,
FROM????? T_call
ORDER BY DATEDIFF(second, StartDateTime, EndTime) ????DESC
?
2,? 輸出所有數據中撥打長途號碼的總時長,like,sum
SELECT?? SUM(DATEDIFF(second, StartDateTime, EndTime)) AS Expr1
FROM????? T_call
WHERE?? (TelNumber LIKE '0%')
3,? 輸出本月通話總時長最多的前兩名話務員的編號以及對應的通話總時
SELECT?? TOP (2) CallerNumber, SUM(DATEDIFF(second, StartDateTime, EndTime)) AS 間隔
FROM????? T_call
WHERE?? (DATEDIFF(month, StartDateTime, GETDATE()) = 0)
GROUP BY CallerNumber
ORDER BY 間隔 DESC
4,? 輸出本月撥打電話次
5,? 數最多的前兩名呼叫員的編號
SELECT?? CallerNumber, COUNT(*) AS 通話次數
FROM????? T_call
WHERE?? (DATEDIFF(month, StartDateTime, GETDATE()) = 0)
GROUP BY CallerNumber
ORDER BY 通話次數 DESC
6,? 匯總室內通話總時長和長途通話總時長
(挺麻煩的,這里暫時省略,可以參考視頻)
索引
?
多個表之間的查詢Join
?
(這貌似可以解決自己微博與微博報之間多對一的關系,而且在一個表對應的dataset中也可以查詢另外的表中的數據)
子查詢(子查詢最好具有一個別名)
?
?
其中vs內置的row_number()函數是對結果集進行從1依次進行編號,但是這是個開窗函數,不能出現在where子句中,只能夠在select或者order by中進行使用,因此一般采用子查詢
其實上面限制結果集進行分頁的查詢如果寫成這個樣子就很容易理解
Select row_number() over(order by Fsalary desc) as rownum,fNumber,FName,FAge from T_employee where rownum>=1 and rownum<=5不過由于上面所說的語法的限制這種格式不能運行,因此套用了子查詢
(有這么一條規律,如果select語句from的對象是子查詢的話,如果是單個值的子查詢,得到的結果只能是單個值,因此一般也不會放在from子句中,如果是多行一列的子查詢,相當于一個集合,選擇的對象只能是這個集合中的一個,如果是多行多列的子查詢,那么就把它看做一張新表來寫對應的select語句)
在插入數據的同時希望能夠得到插入數據自動生成的id
方法一:可以使用out
方法二:可以使用這個全局變量select @@
轉載于:https://www.cnblogs.com/bobodeboke/p/3179580.html
總結
以上是生活随笔為你收集整理的sql数据库相关语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王勇详谈 Linux Deepin 背后
- 下一篇: 为什么用C而不用C++