① sql語句 應用題 專家們 速度解決 答得好另有獎勵
1.SELECT*FROM課程
2.SELECTST.學號,
ST.姓名,
SC.成績
FROM學生ASST
JOIN成績ASSC
ONST.學號=SC.學號
JOIN課程ASCO
ONSC.課程號=CO.課程號
WHERECO.授課教師='劉老師'
3.SELECTCO.課程名,
ST.COUNT(*)
FROM學生ASST
JOIN成績ASSC
ONST.學號=SC.學號
JOIN課程ASCO
橋衫ONSC.課程號=CO.課程號
GROUPBYCO.課程名
4.SELECT*FROM學生
5.SELECTST.學號,
ST.姓名,
敏吵腔SC.成績
FROM學生ASST
JOIN成績ASSC
ONST.學號=SC.學號
JOIN課程ASCO
ONSC.課程號=CO.課程號
WHERECO.課程名='資料庫應用'
6.SELECTCOUNT(*),
性別
FROM學生
GROUPBY性別
7.SELECTST.學號,
ST.姓名,
SC.成績
FROM學生ASST
JOIN成績ASSC
ONST.學號=SC.學號
JOIN課程ASCO
ONSC.課程號=CO.課程號
WHERECO.課程名='Access'
ANDSC.成績>70
8.同6
9.SELECTST.學號,
ST.姓名
FROM學生ASST
JOIN成績ASSC
ONST.學號=SC.學號
JOIN課程ASCO
ON碰唯SC.課程號=CO.課程號
WHERECO.課程名='計算機應用'
ANDST.性別='男'
10.SELECT*FROM學生
WHERE年齡>18AND姓名LIKE'王%'
同學給分吧,不明白的追問。
② 請教 SQL 小技巧
分太少,補分嗎?花我好點時間哦
--FETCH NEXT FROM @cur INTO @fname,@type
--WHILE @@FETCH_STATUS = 0
declare @starttime smalldatetime,
@endtime smalldatetime,
@qty real
select @starttime = '2008-8-12',@endtime ='2010-3-6',@qty=790
declare @s smalldatetime,
@e smalldatetime,
@y1 int,
@y2 int,
@i int,
@x real,
@d int,
@q real
set @x =@qty/datediff(d,@starttime,@endtime)
select @y1=year(@starttime),@y2 =year(@endtime),@s=@starttime
set @i = @y1
declare @tb table(s smalldatetime,e smalldatetime,d int,qty1 real)
while @i<=@y2
begin
set @e =convert(smalldatetime,convert(nvarchar(4),@i)+'-12-31')
if @e>@endtime
set @e=@endtime
set @d = datediff(d,@s,@e)
set @q=@d*@x
insert into @tb (s,e,d,qty1)values(@s,@e,@d,@q)
set @i=@i+1
set @s =convert(smalldatetime,convert(nvarchar(4),@i)+'-1-1')
end
select s starttime1,e endtime1,d [year days] ,qty1 from @tb
③ 關於SQL綜合應用題(學生選課系統)
3、寫出SQL語句。
①查詢所有選SQL課程的學生學號,姓名和專業
select 學生學號,姓名,專業 from 學生基本信息表 where 學號 in (select 學號 from 選課表 where 課程號 in (select 課程號 from 課程表 where 課程名='SQL課程'))
②刪除所有選擇數學的同學的選課記錄
delete from 選課表 where 課程號 in (select 課程號 from 課程表 where 課程名='數學')
③查詢有哪些課程沒有被任何同學報選
select 課程名 from 課程表 where 課程號 not in (select 課程號 from 選課表)
④ 數據分析課程筆記 - 19 - HiveSQL 常用優化技巧
大家好呀,這節課學習 HiveSQL 的常用優化技巧。由於 Hive 主要用來處理非常大的數據,運行過程由於通常要經過 MapRece 的過程,因此不像 MySQL 一樣很快出結果。而使用不同方法寫出來的 HiveSQL 語句執行效率也是不一樣的,因此為了減少等待的時間,提高伺服器的運行效率,我們需要在 HiveSQL 的語句上進行一些優化。
本節課的主要內容 :
引言
1、技巧一:列裁剪和分區裁剪
(1)列裁剪
(2)分區裁剪
2、技巧二:排序技巧——sort by代替order by
3、技巧三:去重技巧——用group by來替換distinct
4、技巧四:聚合技巧——grouping sets、cube、rollup
(1)grouping sets
(2)cube
(3)rollup
5、技巧五:換個思路解題
6、技巧六:union all時可以開啟並發執行
7、技巧七:表連接優化
8、技巧八:遵循嚴格模式
Hive 作為大數據領域常用的數據倉庫組件,在平時設計和查詢時要特別注意效率。影響Hive效率的幾乎從不是數據量過大,而是數據傾斜、數據冗餘、job 或 I/O 過多、MapRece 分配不合理等等。對 Hive 的調優既包含對HiveSQL 語句本身的優化,也包含 Hive 配置項和 MR 方面的調整。
列裁剪就是在查詢時只讀取需要的列。當列很多或者數據量很大時,如果select 所有的列或者不指定分區,導致的全表掃描和全分區掃描效率都很低。Hive中與列裁剪優化相關的配置項是 hive.optimize.cp ,默認是 true 。
分區裁剪就是在查詢時只讀需要的分區。Hive中與分區裁剪優化相關的則是 hive.optimize.pruner ,默認是 true 。
HiveSQL中的 order by 與其他 SQL 語言中的功能一樣,就是將結果按某個欄位全局排序,這會導致所有map端數據都進入一個 rece 中,在數據量大時可能會長時間計算不完。
如果使用 sort by ,那麼就會視情況啟動多個 recer 進行排序,並且保證每個 recer 內局部有序。為了控制 map 端數據分配到 rece 的 key,往往還要配合 distribute by 一同使用。如果不加 distribute by 的話,map 端數據就會隨機分配給 recer。
這里需要解釋一下, distribute by 和 sort by 結合使用是如何相較於 order by 提升運行效率的。
假如我們要對一張很大的用戶信息表按照年齡進行分組,優化前的寫法是直接 order by age 。使用 distribute by 和 sort by 結合進行優化的時候, sort by 後面還是 age 這個排序欄位, distribute by 後面選擇一個沒有重復值的均勻欄位,比如 user_id 。
這樣做的原因是,通常用戶的年齡分布是不均勻的,比如20歲以下和50歲以上的人非常少,中間幾個年齡段的人又非常多,在 Map 階段就會造成有些任務很大,有些任務很小。那通過 distribute by 一個均勻欄位,就可以讓系統均勻地進行「分桶」,對每個桶進行排序,最後再組合,這樣就能從整體上提升 MapRece 的效率。
取出 user_trade 表中全部支付用戶:
原有寫法的執行時長:
優化寫法的執行時長:
考慮對之前的案例進行優化:
注意: 在極大的數據量(且很多重復值)時,可以先 group by 去重,再 count() 計數,效率高於直接 count(distinct **) 。
如果我們想知道用戶的性別分布、城市分布、等級分布,你會怎麼寫?
通常寫法:
缺點 :要分別寫三次SQL,需要執行三次,重復工作,且費時。
那該怎麼優化呢?
注意 :這個聚合結果相當於縱向地堆在一起了(Union all),分類欄位用不同列來進行區分,也就是每一行數據都包含 4 列,前三列是分類欄位,最後一列是聚合計算的結果。
GROUPING SETS() :在 group by 查詢中,根據不同的維度組合進行聚合,等價於將不同維度的 group by 結果集進行 union all。聚合規則在括弧中進行指定。
如果我們想知道用戶的性別分布以及每個性別的城市分布,你會怎麼寫?
那該怎麼優化呢?
注意: 第二列為NULL的,就是性別的用戶分布,其餘有城市的均為每個性別的城市分布。
cube:根據 group by 維度的所有組合進行聚合
注意 :跑完數據後,整理很關鍵!!!
rollup:以最左側的維度為主,進行層級聚合,是cube的子集。
如果我想同時計算出,每個月的支付金額,以及每年的總支付金額,該怎麼辦?
那應該如何優化呢?
條條大路通羅馬,寫SQL亦是如此,能達到同樣效果的SQL有很多種,要學會思路轉換,靈活應用。
來看一個我們之前做過的案例:
有沒有別的寫法呢?
Hive 中互相沒有依賴關系的 job 間是可以並行執行的,最典型的就是
多個子查詢union all。在集群資源相對充足的情況下,可以開啟並
行執行。參數設置: set hive.exec.parallel=true;
時間對比:
所謂嚴格模式,就是強制不允許用戶執行3種有風險的 HiveSQL 語句,一旦執行會直接報錯。
要開啟嚴格模式,需要將參數 hive.mapred.mode 設為 strict 。
好啦,這節課的內容就是這些。以上優化技巧需要大家在平時的練習和使用中有意識地去注意自己的語句,不斷改進,就能掌握最優的寫法。
⑤ Oracle中SQL*PLUS使用的一些技巧
Sql*plus中蘊藏著好多技巧 如果掌握這些技巧 對於在oracle資料庫下進行快速開發與有效維護資料庫都是有益的 .使用SQL*PLUS動態生成批量腳本將spool與select命令結合起來使用 可以生成一個腳本 腳本中包含有可以批量執行某一任務的語句 例 生成一個腳本 刪除SCOTT用戶下的所有的表 a 創建gen_drop_table sql文件 包含如下語句 SPOOLc:drop_table sqlSELECT DROP TABLE || table_name || ; FROM user_tables;SPOOL OFFb 以SCOTT用戶登錄資料庫SQLPLUS > @ … gen_dorp_table sqlc 在c盤根目錄下會生成文件drop_table sql文件 包含刪除所有表的語句 如下所示:SQL>SELECT DROP TABLE || table_name || ; FROM user_tables; DROPTABLE ||TABLE_NAME|| ; DROP TABLE DEPT;DROP TABLE EMP;DROP TABLE PARENT;DROP TABLE STAT_VENDER_TEMP;DROP TABLE TABLE_FORUM; rows selected 中返廳SQL>SPOOL OFFd 對生成的drop_table sql文件進行編輯去掉不必要的部分 只留下drop table … 語句e 在scott用戶下運行dorp_table sql文件 刪除scott用戶下所有的表 SQLPLUS > @ c:dorp_table sql在上面的操作中 在生成的腳本文件中會有多餘的字元 如運行的sql語句 標題 或返回的行數 需要我們編世閉輯該腳本後再運行 給實際的操作帶來諸多不便 懶惰是人的本性 這促使我們用更簡單的辦法來實賣隱現上面的任務 a 創建gen_drop_table sql文件 包含如下語句 set echo offset feedback offset newpage noneset pagesize set linesize set verify offset pagesize set term offset trims onset linesize set headingoffset timing offset verify offset numwidth SPOOLc:drop_table sqlSELECT DROP TABLE || table_name || ; FROM user_tables;SPOOL OFFb 以SCOTT用戶登錄資料庫SQLPLUS > @ … gen_dorp_table sqlc 在c盤根目錄下會生成文件drop_table sql文件 包含刪除所有表的語句 如下所示:DROP TABLE DEPT;DROP TABLE EMP;DROP TABLE PARENT;DROP TABLE STAT_VENDER_TEMP;DROP TABLE TABLE_FORUM;d 在scott用戶下運行dorp_table sql文件 刪除scott用戶下所有的表 SQLPLUS > @ c:dorp_table sql .將一個表中的數據導出生成一個文本文件 列與列之間以 隔開set echo offset feedback offset newpage noneset pagesize set linesize set verify offset pagesize set term offset trims onset linesize set headingoffset timing offset verify offset numwidth SPOOLc:drop_table sqlselect DEPTNO || || DNAME FROM DEPT;SPOOL OFF將上面的內容保存為一個文本文件後 以scott登錄 執行該文件後顯示結果 ACCOUNTING RESEARCH SALES OPERATIONS通過上面的兩個例子 我們可以將 set echo offset feedback offset newpage noneset pagesize set linesize set verify offset pagesize set term offset trims onset linesize set headingoffset timing offset verify offset numwidth SPOOLc:具體的文件名你要運行的sql語句SPOOL OFF作為一個模版 只要將必要的語句假如這個模版就可以了 在oracle的較新版本中 還可以用set colsep命令來實現上面的功能 SQL> set colsep SQL> select * from dept; ACCOUNTING NEW YORK RESEARCH DALLAS SALES CHICAGO OPERATIONS BOSTON aa bb .動態生成spool命令所需的文件名在我們上面的例子中 spool命令所需要的文件名都是固定的 有時我們需要每天spool一次 並且每次spool的文件名都不相同 如文件名包含當天的日期 該如何實現呢?column dat new_value filename;select to_char(sysdate yyyymmddhh mi ) dat from al;spool c:&&filename txtselect * from dept;spool off; .如何從腳本文件中得到WINDOWS環境變數的值 在windos中 spool c: emp\%ORACLE_SID% txtselect * from dept; spool off在上面的例子中 通過%ORACLE_SID%的方式引用環境變數ORACLE_SID的值 如果ORACLE_SID的值為orcl 則生成的spool文件名為 orcl txt在UNIX中 spool c: emp$ORACLE_SID txtselect * from dept; spool off在上面的例子中 通過$ORACLE_SID的方式引用環境變數ORACLE_SID的值 如果ORACLE_SID的值為orcl 則生成的spool文件名為 orcl txt .如何指定預設的編輯腳本的目錄在sql*plus中 可以用save命令 將上一條執行的sql語句保存到一個文件中 但是如何設置該文件的預設目錄呢?通過SQL> set editfile c: empfile sql 命令 可以設置其預設目錄為c: mpe 預設文件名為file sql .如何除去表中相同的行找到相同的行 SELECT * FROM dept aWHERE ROWID <> (SELECT MAX(ROWID)FROM dept bWHERE a deptno = b deptnoAND a dname = b dname Make sure all columns are paredAND a loc = b loc);注釋 如果只找deptno列相同的行 上面的查詢可以改為 SELECT * FROM dept aWHERE ROWID <> (SELECT MAX(ROWID)FROM dept bWHERE a deptno = b deptno)刪除相同的行 DELETE FROM dept aWHERE ROWID <> (SELECT MAX(ROWIDFROM dept bWHERE a deptno = b deptnoAND a dname = b dname Make sure all columns are paredAND a loc = b loc);注意 上面並不刪除列值為null的行 .如何向資料庫中插入兩個單引號( )Insert inot dept values( aa bb a b );在插入時 用兩個 表示一個 .如何設置sql*plus的搜尋路徑 這樣在用@命令時 就不用輸入文件的全路徑 設置SQLPATH環境變數 如 SQLPATH = C:ORANTDBS;C:APPSSCRIPTS;C:MYSCRIPTS .@與@@的區別是什麼?@等於start命令 用來運行一個sql腳本文件 @命令調用當前目錄下的 或指定全路徑 或可以通過SQLPATH環境變數搜尋到的腳本文件 @@用在腳本文件中 用來指定用@@執行的文件與@@所在的文件在同一目錄 而不用指定全路徑 也不從SQLPATH環境變數指定的路徑中尋找文件 該命令一般用在嵌套腳本文件中 .&與&&的區別&用來創建一個臨時變數 每當遇到這個臨時變數時 都會提示你輸入一個值 &&用來創建一個持久變數 就像用用define命令或帶new_vlaue字句的column命令創建的持久變數一樣 當用&&命令引用這個變數時 不會每次遇到該變數就提示用戶鍵入值 而只是在第一次遇到時提示一次 如 將下面三行語句存為一個腳本文件 運行該腳本文件 會提示三次 讓輸入deptnoval的值 select count(*) from emp where deptno = &deptnoval;select count(*) from emp where deptno = &deptnoval;select count(*) from emp where deptno = &deptnoval;將下面三行語句存為一個腳本文件 運行該腳本文件 則只會提示一次 讓輸入deptnoval的值 select count(*) from emp where deptno = &deptnoval;select count(*) from emp where deptno = &deptnoval;select count(*) from emp where deptno = &deptnoval; .引入的目的Copy命令在兩個資料庫之間拷貝數據時特別有用 特別是該命令可以在兩個資料庫之間傳遞long型欄位的數據 缺點 在兩個資料庫之間傳遞數據時 有可能丟失精度(lose precision) .問什麼在修改大量的行時 我的腳本會變得很慢?當通過PL/SQL塊修改一個表中的許多行時 你會創建在表上創建一個cursor 但是只有在你關閉cursor時 才會釋放ROLLBACK SEGMENT 這樣 當cursor仍然打開時 修改過程會變慢 這是因為資料庫不得不搜尋大量的rollback segment以便於維護讀一致性 為了避免這樣情況 試著在表上加一個標志欄位來描述該行是否已經被修改 然後關閉該cursor 然後再打開該cursor 每次可以修改 行 lishixin/Article/program/Oracle/201311/17262
⑥ 你好,請問你幫可以我輔導一下怎麼sql嘛
sql沒什麼技巧。先學會基本租殲模語句,概念,剩下的就是刷題。大概做200道題就會形成自己的解題思路,以後碰到了問題都弊緩會改型得心應手。
⑦ SQL Server實用經驗技巧集(2)
刪除資料庫中重復數據的幾個方法 資料庫的使用過程中由於程序方面的問題有時候會碰到重復數據 重復數據導致了資料庫部分設置不能正確設置…… 方法一 declare @max integer @id integerdeclare cur_rows cursor local for select 主欄位 count(*) from 表名 group by 主欄位 having count(*) > open cur_rowsfetch cur_rows into @id @maxwhile @@fetch_status= beginselect @max = @max set rowcount @maxdelete from 表名 where 主欄位 = @idfetch cur_rows into @id @maxendclose cur_rowsset rowcount 方法二 有兩個意義上的重復記滲孫錄 一是完全重復的記錄 也即所有欄位均重復的記錄 二是部分關鍵欄位重復的記錄 比如Name欄位重復 而其他欄位不一定重復或都重復可以忽略 對於第一種重復 比較容易解決 使用select distinct * from tableName就可以得到無重復記錄的結果集 如果該表需要刪除重復的記燃衡錄(重復記錄保留 條) 可以按以下方法刪除select distinct * into #Tmp from tableNamedrop table tableNameselect * into tableName from #Tmpdrop table #Tmp發生這種重復的原因是表設計不周產生的 增加唯一索引列即可解決 這類重復問題通常要求保留重復記錄中的第一條記錄 操作方法如下假設有重復的欄位為Name Address 要求得到這兩個欄位唯一的結果集select identity(int ) as autoID * into #Tmp from tableNameselect min(autoID) as autoID into #Tmp from #Tmp group by Name autoIDselect * from #Tmp where autoID in(select autoID from #tmp )最後一個select即得到了Name Address不重復的結果集(但多了一個autoID欄位 實際寫時可以寫在select子句中省去此列) 更改數據皮喊做庫中表的所屬用戶的兩個方法 大家可能會經常碰到一個資料庫備份還原到另外一台機器結果導致所有的表都不能打開了 原因是建表的時候採用了當時的資料庫用戶…… 更改某個表 exec sp_changeobjectowner tablename dbo 存儲更改全部表 CREATE PROCEDURE dbo User_ChangeObjectOwnerBatch@OldOwner as NVARCHAR( ) @NewOwner as NVARCHAR( )ASDECLARE @Name as NVARCHAR( )DECLARE @Owneras NVARCHAR( )DECLARE @OwnerNameas NVARCHAR( )DECLARE curObject CURSOR FORselect Name = name Owner = user_name(uid)from sysobjectswhere user_name(uid)=@OldOwnerorder by nameOPENcurObjectFETCH NEXT FROM curObject INTO @Name @OwnerWHILE(@@FETCH_STATUS= )BEGINif @Owner=@OldOwnerbeginset @OwnerName = @OldOwner + + rtrim(@Name)exec sp_changeobjectowner @OwnerName @NewOwnerend select @name @NewOwner @OldOwnerFETCH NEXT FROM curObject INTO @Name @OwnerENDclose curObjectdeallocate curObjectGOSQL SERVER中直接循環寫入數據沒什麼好說的了 大家自己看 有時候有點用處declare @i intset @i= while @i< begininsert into test (userid) values(@i)set @i=@i+ end 無資料庫日誌文件恢復資料庫方法兩則 資料庫日誌文件的誤刪或別的原因引起資料庫日誌的損壞 方法一 新建一個同名的資料庫 再停掉sql server(注意不要分離資料庫) 用原資料庫的數據文件覆蓋掉這個新建的資料庫 再重啟sql server 此時打開企業管理器時會出現置疑 先不管 執行下面的語句(注意修改其中的資料庫名) 完成後一般就可以訪問資料庫中的數據了 這時 資料庫本身一般還要問題 解決辦法是 利用資料庫的腳本創建一個新的資料庫 並將數據導進去就行了 USE MASTERGOSP_CONFIGURE ALLOW UPDATES RECONFIGURE WITH OVERRIDEGOUPDATE SYSDATABASES SET STATUS = WHERE NAME= 置疑的資料庫名 Gosp_dboption 置疑的資料庫名 single user true GoDBCC CHECKDB( 置疑的資料庫名 )Goupdate sysdatabases set status = where name= 置疑的資料庫名 Gosp_configure allow updates reconfigure with overrideGosp_dboption 置疑的資料庫名 single user false 方法二 事情的起因 昨天 系統管理員告訴我 我們一個內部應用資料庫所在的磁碟空間不足了 我注意到資料庫事件日誌文件XXX_Data ldf文件已經增長到了 GB 於是我決意縮小這個日誌文件 經過收縮資料庫等操作未果後 我犯了一個自進入行業以來的最大最愚蠢的錯誤 竟然誤刪除了這個日誌文件!後來我看到所有論及資料庫恢復的文章上都說道 無論如何都要保證資料庫日誌文件存在 它至關重要 甚至微軟甚至有一篇KB文章講如何只靠日誌文件恢復資料庫的 我真是不知道我那時候是怎麼想的?!這下子壞了!這個資料庫連不上了 企業管理器在它的旁邊寫著 (置疑) 而且最要命的 這個資料庫從來沒有備份了 我唯一找得到的是遷移半年前的另外一個資料庫伺服器 應用倒是能用了 但是少了許多記錄 表和存儲過程 真希望這只是一場噩夢! 沒有效果的恢復步驟 附加資料庫_Rambo講過被刪除日誌文件中不存在活動日誌時 可以這么做來恢復 分離被置疑的資料庫 可以使用sp_detach_db 附加資料庫 可以使用sp_attach_single_file_db但是 很遺憾 執行之後 SQL Server質疑數據文件和日誌文件不符 所以無法附加資料庫數據文件 DTS數據導出不行 無法讀取XXX資料庫 DTS Wizard報告說 初始化上下文發生錯誤 緊急模式怡紅公子講過沒有日誌用於恢復時 可以這么做 把資料庫設置為emergency mode 重新建立一個log文件 把SQL Server 重新啟動一下 把應用資料庫設置成單用戶模式 做DBCC CHECKDB 如果沒有什麼大問題就可以把資料庫狀態改回去了 記得別忘了把系統表的修改選項關掉我實踐了一下 把應用資料庫的數據文件移走 重新建立一個同名的資料庫XXX 然後停掉SQL服務 把原來的數據文件再覆蓋回來 之後 按照怡紅公子的步驟走 但是 也很遺憾 除了第 步之外 其他步驟執行非常成功 可惜 重啟SQL Server之後 這個應用資料庫仍然是置疑!不過 讓我欣慰的是 這么做之後 倒是能夠Select數據了 讓我大出一口氣 只不過 組件使用資料庫時 報告說 發生錯誤 未能在資料庫 XXX 中運行 BEGIN TRANSACTION 因為該資料庫處於迴避恢復模式 最終成功恢復的全部步驟 設置資料庫為緊急模式停掉SQL Server服務 把應用資料庫的數據文件XXX_Data mdf移走 重新建立一個同名的資料庫XXX 停掉SQL服務 把原來的數據文件再覆蓋回來 運行以下語句 把該資料庫設置為緊急模式 運行 Use MasterGosp_configure allow updates reconfigure with overrideGo 執行結果 DBCC 執行完畢 如果 DBCC 輸出了錯誤信息 請與系統管理員聯系 已將配置選項 allow updates 從 改為 請運行 RECONFIGURE 語句以安裝 接著運行 update sysdatabases set status = where name = XXX 執行結果 (所影響的行數為 行)重啟SQL Server服務 運行以下語句 把應用資料庫設置為Single User模式 運行 sp_dboption XXX single user true 執行結果 命令已成功完成 ü 做DBCC CHECKDB 運行 DBCC CHECKDB( XXX ) 執行結果 XXX 的 DBCC 結果 sysobjects 的 DBCC 結果 對象 sysobjects 有 行 這些行位於 頁中 sysindexes 的 DBCC 結果 對象 sysindexes 有 行 這些行位於 頁中 syscolumns 的 DBCC 結果 ……… lishixin/Article/program/SQLServer/201311/22060
⑧ 關於寫SQL語句的技巧
恩,這個怎麼說呢
sql語句總結一下,無非就幾種,關聯查詢,子查詢,各種函數的使用
根據要做的需求,先分析一下,需要用到哪些查詢
比如要用到關聯查詢
就先把要用到的表列出來,比如a,b,c三個表
就先寫出來
select from a,b,c
前邊查詢的內容可以先放著不用寫
然後找三個表關聯關系,當然也要看是自然連接還是左連接什麼的,這里就給你舉例正常連接吧
select from a,b,c where a.id=b.aid and b.id=c.bid
關聯關系寫好了,就可以在寫查詢的內容了
select a.name,b.name,sum(c.value) from a,b,c where a.id=b.aid and b.id=c.bid
然後,你再看,因為有聚合查詢,後邊要group by
select a.name,b.name,sum(c.value) from a,b,c where a.id=b.aid and b.id=c.bid group by a.name,b.name
其他的,再有什麼排序啊,等等啊,就好寫了,這里就不往下寫了
子查詢更簡單寫,主要就是要判斷好,要先寫子查詢,然後往外來套,比如
select * from b where id in (select id from a)
這個,你就要先寫括弧里的那個,然後寫外邊的
至於函數的使用,這個沒什麼經驗,就是可能有時會出現類型轉換等等的問題,你就要牢記每個函數的作用,不懂再問吧
⑨ 工作中常用的幾種sql優化技巧
例如:
1、盡可能建立索引,包括條件列,連接列,外鍵列等。
2、盡可能讓where中的列順序與復合索引的列順序一致。
3、盡可能不要select *,而只列出自己需要的欄位列表。
4、盡可能減少子查詢的層數。
5、盡可能在子查詢中進行數據篩選 。
⑩ 怎麼學習SQL語句
創建資料庫
創建之前判斷該資料庫是否存在 if exists (select * from sysdatabases where name='databaseName') drop database 'databaseName' go Create DATABASE database-name
刪除資料庫
drop database dbname
備份sql server
--- 創建 備份數據的 device USE master EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 開始 備份 BACKUP DATABASE pubs TO testBack
創建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根據已有的表創建新表: A:create table tab_new like tab_old (使用舊表創建新表) B:create table tab_new as select col1,col2… from tab_old definition only
刪除新表
drop table tabname
增加一個列
Alter table tabname add column col type 註:列增加後將不能刪除。DB2中列加上後數據類型也不能改變,唯一能改變的是增加varchar類型的長度。
添加主鍵
Alter table tabname add primary key(col) 說明:刪除主鍵: Alter table tabname drop primary key(col)
創建索引
create [unique] index idxname on tabname(col….) 刪除索引:drop index idxname on tabname 註:索引是不可更改的,想更改必須刪除重新建。
創建視圖
create view viewname as select statement 刪除視圖:drop view viewname
幾個簡單的基本的sql語句
選擇:select * from table1 where 范圍 插入:insert into table1(field1,field2) values(value1,value2) 刪除:delete from table1 where 范圍 更新:update table1 set field1=value1 where 范圍 查找:select * from table1 where field1 like 』%value1%』 (所有包含『value1』這個模式的字元串)---like的語法很精妙,查資料! 排序:select * from table1 order by field1,field2 [desc] 總數:select count(*) as totalcount from table1 求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1[separator]
幾個高級查詢運算詞
A: UNION 運算符 UNION 運算符通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重復行而派生出一個結果表。當 ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重復行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。 B: EXCEPT 運算符 EXCEPT 運算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行並消除所有重復行而派生出一個結果表。當 ALL 隨 EXCEPT 一起使用時 (EXCEPT ALL),不消除重復行。 C: INTERSECT 運算符 INTERSECT 運算符通過只包括 TABLE1 和 TABLE2 中都有的行並消除所有重復行而派生出一個結果表。當 ALL 隨 INTERSECT 一起使用時 (INTERSECT ALL),不消除重復行。 註:使用運算詞的幾個查詢結果行必須是一致的。
使用外連接
A、left outer join: 左外連接(左連接):結果集既包括連接表的匹配行,也包括左連接表的所有行。 SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c B:right outer join: 右外連接(右連接):結果集既包括連接表的匹配連接行,也包括右連接表的所有行。 C:full outer join: 全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。