易懂且上手快的常用SQL語句系列及其示例

<code>本系統為@牛旦教育IT課堂在微頭條上發佈的內容,

為便於查閱,特輯錄於此,都是常用SQL基本用法。/<code>

前兩篇連接:

(一):

(二):

(三):

(四):

(五):

(六):

(七):


易懂且上手快的常用SQL語句系列及其示例


SQL點滴(46):如何通過SQL語句計算某個列值的累計和?


比如在員工信息表中有工資列,假設有3列,員工ABC三人,工資分別為400,600,900,那麼希望通過sql語句,多出一列值,分別顯示的內容就是列值的累計,分別為400,1000,1900.如何實現呢?
參考語句可以類似這樣來寫(mySQL為例,PostgreSQL和SQL Server也適用):
SELECT
e.ename,
e.salary,
( SELECT sum( d.salary ) FROM employee d WHERE d.emid <= e.emid ) AS sumtotal
FROM
employee e
ORDER BY 3
----------------------------
若是在Oracle中實現此功能,語句會更簡單些(也適用DB2),參考示例如下:
select ename,salary,sum(salary) over (order by salary,emid) as sumtotal from employee order by 2.
通過SQL語句來實現這樣的功能,比單純的用程序讀取數據在處理是不是更爽啊。試試吧。

SQL點滴(47):如何計算計算指定列中某類值佔總合的百分比?


易懂且上手快的常用SQL語句系列及其示例


比如,員工工資表中員工分屬不同部門,不如部門3有員工,工資分別為300,500,而員工工資列的總和(所有員工)為8000,這樣可以算出部門3的工資佔總工資的10%,那如何通過SQL實現呢?
1)、這裡以MySQL未來,實例如下所示:
SELECT
d3,total, ROUND( ( d3 / total ) * 100, 2 ) AS pct
FROM
( SELECT sum( CASE WHEN departid = 3 THEN salary END ) AS d3, sum( salary ) AS total FROM employee ) emp
這個也適用PostgreSQL數據庫。
2)、其它的數據庫比如OracleDB2和MSSQL,可以參照如下SQL實現:
select distinct(d3/total)*100 as pct
from (select departid,sum(salary) over () total,sum(salary) over(partition by departid) 10
from employee) x
where departid =3
OK,一則分享就這些了,試試吧。

SQL點滴(48):“去掉一個最高分,去掉一個最低分”,如何計算平均分?


看綜藝的節目的經常有專家組評分,常常是把最高和最低的排除,計算其餘數的平均分這種情況。用數據庫的表述就是“計算不包含最大值和最小值其餘列值總和平均值”,我們來看如何用SQL實現,比如計算剔除員工最高薪和最低薪來計算平均工資,參考SQL語句:
1)MySQL寫法——


SELECT
count( salary ),
avg( salary )
FROM
employee
WHERE
salary NOT IN ( ( SELECT min( salary ) FROM employee ), ( SELECT max( salary ) FROM employee ) )
這個寫法也是適用PostgreSQL的。注意count只是為確認計算了多少個列值。可省去。
這裡需要注意的是:如果存在重複值(最大最小值),那麼都會排除在平均值外。
2)Oracle寫法:
SELECT
avg( salary )
FROM (
select salary,min(salary) over() min_sal,max(salary) over() max_sal from employee
) x
WHERE
salary NOT IN (min_sal,max_sal )
這個寫法,同樣適合DB2和MS SQL。
問題,如果他們也有重複值,這種計算會怎樣?自己動手試試吧。

SQL點滴(49):如何用SQL實現年月日的加減運算?


易懂且上手快的常用SQL語句系列及其示例


經常在程序中要處理日期,若利用數據庫提供的日期處理功能,可以大大提高處理效率。那麼數據庫中如何通過SQL來操作日期呢?參考如下:
1)MySQL的日期加減法(對當前日期的年月日的加減)運算SQL:
SELECT
now( ) AS curdate,
now( ) - INTERVAL 5 DAY AS cd_minus_5D,
now( ) + INTERVAL 5 DAY AS cd_plus_5D,
now( ) - INTERVAL 5 MONTH AS cm_minus_5M,
now( ) + INTERVAL 5 MONTH AS cm_plus_5M,
now( ) - INTERVAL 5 YEAR AS cy_minus_5Y,
now( ) + INTERVAL 5 YEAR AS cy_plus_5Y
注意這裡利用interval、數字及年月日單位(year,month,day,大小寫無關),其中now代表當前日期時間,你可以用自己表中的日期值。當然,也可利用date_add函數來實現,形如這樣:
select date_add(now(),interval -5 day) as cd_minus_5D
2)Oralce的日期加減操作語句(員工僱用日期為操作數),類似如下:
select hiredate -5 as hd_minus_5D,hiredate + 5 as hd_plus_5D,
add_months(hiredate,5) as hd_minus_5M,
add_months(hiredate,5) as hd_plus_5M,
add_months(hiredate,-5*12) as hd_minus_5Y,
add_months(hiredate,5*12) as hd_plus_5Y
from employee
其它的數據庫就不舉例了,有興趣自己研究一下,再動手操練一下吧 ^_^ 。


SQL點滴(50):如何計算兩個日期間的天數?


易懂且上手快的常用SQL語句系列及其示例


也就是求兩個日期間相差的天數。例如計算兩個員工間僱用日期相差天數。下面我們來看看如何實現?
1)在MySQL中的寫法示例:
SELECT
datediff( ml_hd, zh_hd )
FROM
( SELECT hiredate AS ml_hd FROM employee WHERE ename = '馬力' ) x,
( SELECT hiredate AS zh_hd FROM employee WHERE ename = '鄭合' ) y
注意,datediff在MS SQL中同樣有效,只是得在函數的第一個參數為day,而其他的不便,只要把函數改成datediff(day, ml_hd, zh_hd ) 即可。注意這裡針對一個表查詢,只能是子查詢。


2)在Oracle中的示例寫法:
select ml_hd - zh_hd
from
( SELECT hiredate AS ml_hd FROM employee WHERE ename = '馬力' ) x,
( SELECT hiredate AS zh_hd FROM employee WHERE ename = '鄭合' ) y
這個寫法也適用PostgreSQL。
3)BD2中寫法:
子查詢同上面的一樣,只是得用days函數,把第一個select後換成days(mz_hd)-days(zl_hd),即可。
好了,試試吧 ^_*

本篇就輯錄到這,點個贊,分享出去吧。


分享到:


相關文章: