[数据库] SQL语句select简单记录总结
生活随笔
收集整理的這篇文章主要介紹了
[数据库] SQL语句select简单记录总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近SQL語句寫得比較多,也發現了自己的很多不足之處。在此先寫一篇關于SQL語句的在線筆記,方便大家學習和后面的工作,SQL Server、MySQL、Oracle基本語法都類似,接下來我需要閱讀《SQL Server性能優化與管理的藝術》。
最后,希望這篇文章對你有所幫助吧!重點是select語句的用法。目錄如下:
- 一.創建數據庫和表
- 1.創建數據庫
- 2.創建表并設置主鍵
- 3.插入數據
- 二.select查詢操作
- 1.通過日期計算年齡
- 2.獲取某列所有不同的屬性值 group by
- 3.查詢字符串匹配like和多值屬性判斷in
- 4.查詢輸出某列屬性中某個特定值
- 5.子查詢統計不同階段學生總數
- 6.使用子查詢按行動態輸出學院相關信息
- 7.Oracle數據庫null設置成自定義值的方法
- 8.Oracle計算百分比trunc方法
- 9.Oracle查詢除法/運算
- 10.Oracle統計某個屬性逗號分隔值的個數
- 11.Oracle使用CASE WHEN替代子查詢
- 12.Oracle子查詢中使用a.* 統計所有字段
- 13.Oracle使用decode函數防止除法分母為0
- 1.創建數據庫
- 2.創建表并設置主鍵
- 3.插入數據
- 1.通過日期計算年齡
- 2.獲取某列所有不同的屬性值 group by
- 3.查詢字符串匹配like和多值屬性判斷in
- 4.查詢輸出某列屬性中某個特定值
- 5.子查詢統計不同階段學生總數
- 6.使用子查詢按行動態輸出學院相關信息
- 7.Oracle數據庫null設置成自定義值的方法
- 8.Oracle計算百分比trunc方法
- 9.Oracle查詢除法/運算
- 10.Oracle統計某個屬性逗號分隔值的個數
- 11.Oracle使用CASE WHEN替代子查詢
- 12.Oracle子查詢中使用a.* 統計所有字段
- 13.Oracle使用decode函數防止除法分母為0
一. 創建數據庫和表
1.創建數據庫 --創建數據庫 create database StudentMS--使用數據庫 use StudentMS--刪除數據庫 --drop database StudentMS
2.創建表并設置主鍵(外鍵類似)
--創建學生表 (屬性:姓名、學號(pk)、學院、出生日期、性別、籍貫) create table xs (name varchar(10) not null,id varchar(10) not null,xy varchar(10),birthday datetime,xb char(2),jg varchar(8) )--創建學生表主鍵:學號 alter table xsadd constraint pk_xs primary key(id)--創建表學生表外鍵:系代號 此表中xdh已被省略 alter table xsadd constraint fk_xs foreign key(xdh) references xb (xdh)
3.插入數據
insert into xs (id, name, xb, birthday, xy, jg) values('1160001', '劉備', '男', '1991-11-5', '軟件學院', '河北省'); 總共插入10個學生的數據,其中如birthday可為null,如下:
二. select查詢操作
1.通過日期計算年齡 通過 (當前日期-出生日期) 兩種方法:
? ? ? ? 1).?year(getdate()) - year(birthday)
? ? ? ? 2). datediff(YY, birthday, getdate())?
代碼如下:
select id as 學號, name as 姓名, year(getdate())-year(birthday) as 年齡, birthday as 出生日期 from xs;select id as 學號, name as 姓名, datediff(YY,birthday,getdate()) as 年齡, birthday as 出生日期 from xs;輸出如下所示,后面也可以計算不同年齡段的人數:
注意:Oracle會報錯“ORA-00904: 'DATEDIFF' invalid identifier”, 它的方法如下:
? ? ? ? ??Trunc(MONTHS_BETWEEN(SYSDATE, BIRTH_DATE)/12)
? ? ? ? ??函數Trunc在這里對帶有小數位數的數字取整數部分,SYSDATE為oracle的獲取當前日期的函數,BIRTH_DATE為我自己的數據庫表中存儲生日日期的字段。
? ? ? ? ? 判斷年份等于當前年份方法:YEAR=to_char(sysdate, 'yyyy')
? ? ? ? ? 如果BIRTH_DATE是字符串類型,則計算年齡語句如下:
? ? ? ? ??Trunc(MONTHS_BETWEEN(SYSDATE, to_date(BIRTH_DATE,'yyyy-mm-dd'))/12)
2.獲取某列所有不同的屬性值 group by
它的功能包括:獲取學院列所有學院信息,也可以用來統計所有學生同名的人數。
--方法1:group by 列分組 select xy from xs group by xy;--方法2:列出不同的值 select distinct xy from xs;輸出結果:
統計不同學院的人數信息:
select xy as 學院, count(*) as 總人數 from xs group by xy;
PS:如果需要排序可以添加order by xy,而統計重名學生可通過having count(*)>1。
推薦:http://www.cnblogs.com/rainman/archive/2013/05/03/3058451.html
3.查詢字符串匹配like和多值屬性判斷in LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式:SQL LIKE 操作符 -?w3school
--匹配姓名以"黃"開頭的學生 select * from xs where name like '黃%';--匹配學院包含"計算機"的學生 select * from xs where xy like '%計算機%';--匹配姓名以"尚香"結尾的學生 select * from xs where name like '%尚香';輸出結果:
LIKE匹配某個字段的變量的方法:DL_BHXNZYMC like '%' || ZY_NAME ||'%'
select T_WSTB_DLPYJBQKB.DL_BHXNZYMC, ZY_NAME from T_WSTB_ZYJBQK, T_WSTB_DLPYJBQKB where T_WSTB_DLPYJBQKB.DL_BHXNZYMC like '%' || ZY_NAME ||'%'輸出如下所示,也可以某個字段包含的個數:
IN 操作符允許我們在 WHERE 子句中規定多個值,換種說法就是替換or:
select * from xs where jg in ('河北省','河南省');輸出結果:
4.查詢輸出某列屬性中的某個特定值
比如我希望輸出軟件學院這個值,可以使用group by分組再定義這個值。其缺點是這個值必需是定義存在的,當然如果C#或JAVA可以定義變量連接這個值。
select xy as 學院名稱 from xs where xy='軟件學院' group by xy;輸出結果:
5.子查詢統計不同階段學生總數
使用子查詢統計不同學院總人數、不同性別總人數和河北/河南學生總人數。
--子查詢統計人數 select a.a_num as 軟院人數, b.b_num as 計院人數, c.c_num as 自動化人數, d.d_num as 男生人數, e.e_num as 女生人數, f.f_num as 河北河南人數 from (select count(*) as a_num from xs where xy='軟件學院') a, (select count(*) as b_num from xs where xy='計算機學院') b, (select count(*) as c_num from xs where xy='自動化學院') c, (select count(*) as d_num from xs where xb='男') d, (select count(*) as e_num from xs where xb='女') e, (select count(*) as f_num from xs where jg in ('河北省','河南省')) f;輸出結果:
PS:當時需要設計一條SQL,統計各個學院的教師總數、高級職稱教師總數、35歲以下青年教師總數、教授教師總數;而且輸出是一行,每個學院共5個值,例如:
上面這種顯示方法非常局限,不能實現動態的查詢,如果增加新的學院,你SQL語句中 where xy='軟件學院' 需要相應修改,如果是連接前端建議使用逗號連接查詢。當然,SQL語句更理想的輸出如下:(參考6)
6.使用子查詢按行動態輸出學院相關信息
獲取每個學院總人數、男生總人數、小于等于25歲的總人數和生源地河北河南人數。
這種方法通常是多個表之間的夸表查詢,首先創建一個學院表:學院名稱和學院代碼。
--創建學院表 create table table_xy (name varchar(10) not null,id varchar(10) not null );--插入數據 insert into table_xy(id, name) values('001', '軟件學院'); insert into table_xy(id, name) values('002', '計算機學院'); insert into table_xy(id, name) values('003', '自動化學院'); insert into table_xy(id, name) values('004', '法學院');輸出如下,這里插入一個法學院,它的統計結果都為空:
然后,子查詢SQL語句如下:
select distinct name as 學院名稱, (select count(*) from xs where xs.xy=table_xy.name) as 總人數, (select count(*) from xs where xs.xy=table_xy.name and xs.xb='男') as 男生總數, (select count(*) from xs where xs.xy=table_xy.name and datediff(YY,birthday,getdate())<=25) as 二十五歲人數, (select count(*) from xs where xs.xy=table_xy.name and xs.jg in ('河北省','河南省')) as 河北河南生源地 from table_xy;輸出結果:
7.Oracle數據庫null設置成自定義值的方法
方法包括主要有兩個,參考:http://www.soso.io/article/72986.html
1).?nvl(expr1, expr2)
若EXPR1是NULL,則返回EXPR2,否則返回EXPR1。nvl(person_name,“未知”)表示若person_name字段值為空時返回“未知”,如不為空則返回person_name的字段值。通過這個函數可以定制null的排序位置。 |
2).?decode(DEPARTMENT_NAME, null, 'NULL', DEPARTMENT_NAME)
如果部門名稱在表中值為null,則用NULL替代,也可設置為"空"各種自定義字符串。decode函數比nvl函數更強大,同樣它也可以將輸入參數為空時轉換為一特定值。
如decode(person_name,null,“未知”, person_name)表示當person_name為空時返回“未知”,如不為空則返回person_name的字段值。?
PS:而SQL Server中沒有函數decode,但是其實質可以通過case when來實現和替代。
參考:http://blog.csdn.net/hu_shengyang/article/details/10533865
8.Oracle計算百分比trunc方法
核心SQL語句如下:to_char(trunc(NUM/ALL_NUM*100, 2)) || '%
其中NUM除以ALL_NUM總數,并且保留兩位有效數字,如下圖所示:
9.Oracle查詢除法/運算
主要語句:select a/b from c;
如:1.0*男生人數/ 人總數*100,使用trunc主要是小數點保留兩位有效數字。
如果出現錯誤:[Err]ORA-01476: divisor is equal to zero,可修改為:select decode(b,0,0,a/b) from c。 select t1.ZFJGSL as 數量,trunc( 1.0 * (select ITEM_VALUE from T_WSTB_YJBKBYSJYQKwhere RECORD_YEAR=(to_char(sysdate, 'yyyy')-2) and FIRST_NUM='2' and SECOND_NUM='2') /(select ITEM_VALUE from T_WSTB_YJBKBYSJYQKwhere RECORD_YEAR=(to_char(sysdate, 'yyyy')-2) and FIRST_NUM='2' and SECOND_NUM='1') * 100,2) as 比例 from (select ITEM_VALUE as ZFJGSL from T_WSTB_YJBKBYSJYQKwhere RECORD_YEAR=(to_char(sysdate, 'yyyy')-2) and FIRST_NUM='2' and SECOND_NUM='2') t1;輸出如下所示:
10.Oracle統計某個屬性逗號分隔值的個數
如下圖所示,學科大類中包括各個學科專業名稱,通過逗號分隔,如何統計個數呢?
SQL代碼如下,Orcale使用length,其他是len函數:
select DL_NAME as num1,length(DL_BHXNZYMC)-length(replace(DL_BHXNZYMC,',',''))+1 as num2 from T_WSTB_DLPYJBQKB運行結果如下所示:
11.Oracle使用CASE WHEN替代子查詢
前面第5步中使用子查詢進行統計:
--子查詢統計人數 select a.a_num as 軟院人數, b.b_num as 計院人數, c.c_num as 自動化人數, d.d_num as 男生人數, e.e_num as 女生人數, f.f_num as 河北河南人數 from (select count(*) as a_num from xs where xy='軟件學院') a, (select count(*) as b_num from xs where xy='計算機學院') b, (select count(*) as c_num from xs where xy='自動化學院') c, (select count(*) as d_num from xs where xb='男') d, (select count(*) as e_num from xs where xb='女') e, (select count(*) as f_num from xs where jg in ('河北省','河南省')) f;輸出結果:
在Oracle中如果想減少代碼量或者不適用子查詢,可以CASE WHEN語句進行替代。
SELECT COUNT(*) AS 總人數,COUNT(CASE WHEN HIGHEST_DEGREE='博士'THEN 1 END) AS 博士人數, COUNT(CASE WHEN HIGHEST_DEGREE='碩士'THEN 1 END) AS 碩士人數, COUNT(*)-COUNT(CASE WHEN HIGHEST_DEGREE='博士'THEN 1 END)-COUNT(CASE WHEN HIGHEST_DEGREE='碩士'THEN 1 END) AS 其他學歷 FROM T_WSTB_FULL_TIME_TEACHER WHERE IS_FOREGOER='是' and YEAR_START=to_char(sysdate,'yyyy')-1;這段SQL語句表示求教師表IS_FOREGOER學科帶頭人且入校年份為2015年的總人數、博士人數、碩士人數和其他學歷的人數。
COUNT(CASE WHEN HIGHEST_DEGREE='博士' THEN 1 END) AS NUM2
表示當最高學歷HIGHEST_DEGREE字段為'博士'時,統計數量加1。
當然如果需要計算學院各個班級的總人口,可以采用使用下面的SQL:
COUNT(CASE WHEN DW_NAME='軟件學院' THEN NUM_STU END) AS NUM2
也可以使用提到的CASE防止除法計算分母為0,ZS總數、SHSJ社會實踐人數。即:
round((case when ZS!=0 then SHSJ/ZS else 0 end),3) as bl
輸出如下圖所示:
12.Oracle子查詢中使用a.* 統計所有字段
前面5的子查詢需要設置不同的字段,而這里是使用a.*統計所有字段,其中a表示子查詢重命名的結果,給人以很清新的感覺,雖然有點華而不實吧!
PS: 這部分代碼是我的學生XW寫的表2-6,非常不錯,感覺自愧不如,學習之~
SELECT a.*, b.* FROM (SELECT SUM(DOMESTIC_TRAIN) + SUM(OVERSEA_TRAIN_TOTAL) AS zj, SUM(DEGREE_PHD) AS qzgdbsx, SUM(DOMESTIC_TRAIN) AS jnjxrcs, SUM(OVERSEA_TRAIN_TOTAL) AS jwjxrcs FROM TRAIN_INTERFLOW where YEAR_START=to_char(sysdate,'yyyy')-2 ) a, (SELECT SUM(PARTICIPANT_NUMBER) AS cyjglxkrcs FROM EDU_REVOLUTION where YEAR_START=to_char(sysdate,'yyyy')-2 ) b;其中表對應各學院的信息,但希望你能學習這種SQL語句的格式。
輸出如下圖所示:
13.Oracle使用decode函數防止除法分母為0
Oracle中通常需要統計如男生占全班總人數比例等用法,此時如果分母為0,它會報錯"[Err] ORA-01476: divisor is equal to zero"。那怎么辦呢?
解決方法:使用函數decode,當分母為0時直接返回0,否則進行除法運算。
selecta/b from c; 修改成如下即可:select decode(b, 0, 0, a/b) from c;
例如:decode(XF_ALL, 0, 0,trunc(XF_JZXSYJXHJ / XF_ALL * 100, 1)) as BL
下面這段代碼是涉及到子查詢的除法運算所占百分比:
select decode ((select sum(BYSJY_BYS_NUM) from T_WSTB_YJBKBYSFZYBYJYQK t where t.BYSJY_XNZY_CODE=T_WSTB_ZYJBQK.XNZY_CODE),0,0,(select sum(BYSJY_JY_NUM) from T_WSTB_YJBKBYSFZYBYJYQK t where t.BYSJY_XNZY_CODE=T_WSTB_ZYJBQK.XNZY_CODE) * 1.0/(select sum(BYSJY_BYS_NUM) from T_WSTB_YJBKBYSFZYBYJYQK t where t.BYSJY_XNZY_CODE=T_WSTB_ZYJBQK.XNZY_CODE) ) * 100 as JYL from T_WSTB_ZYJBQK當然也可以使用前面11提到的CASE防止分母為0,即:
round((case when ZS!=0 then SHSJ/ZS else 0 end),3) as bl
三. 總結
最后希望文章對你有所幫助,這是一篇我的在線筆記,同時后面結合自己實際項目和SQL性能優化,將分享一些更為專業的文章~
最近真的太忙了,做自己的畢設、學校的項目、幫別人畢設或項目解惑,雖然累,但感覺還是非常充實的;買了本《鄧肯專·永不退場》,有機會再品味吧!同時每天刀兩把,周末搞個小火鍋,這也是生活啊!(*^__^*) 嘻嘻.......
(By:Eastmount 2016-01-17 深夜3點 ??http://blog.csdn.net//eastmount/?)
總結
以上是生活随笔為你收集整理的[数据库] SQL语句select简单记录总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [python] 基于k-means和t
- 下一篇: [数据库] Navicat for Or