當前位置:首頁 » 編程語言 » 復雜sql很難理解
擴展閱讀
web開發技術叢書 2022-09-30 20:01:12
怎麼刪除同步設備 2022-09-30 20:01:11
黑莓9900wifi 2022-09-30 19:59:27

復雜sql很難理解

發布時間: 2022-08-09 03:03:08

A. 小弟剛學sql就遇到一條語句,難以理解,求各位大俠給解析!

首先,你這個sql寫的有問題,我先給你解釋下這個sql吧
這其實就是一個分組查詢語句
group by 是分組,它是按照你的node.name來進行分組,order by是排序
按照你的node.lft來進行排序。select後面跟的是你想要查詢的數據,from後是表名,
表名後使用as是給表使用一個簡短的別名,count()是統計你的parent.name的總和,,
(COUNT(parent.name)-1)AS level,這個的意思是計算出parent.name的總和減去一,
使用一個level這個欄位來代表所查詢出來的數據
但像你那樣寫肯定是執行不下去的。這是我修改後的sql
SELECT node.account_id,node.name,node.acc_num,node.debit,node.credit,node.balance,(COUNT(parent.name)-1)AS level,
node.lft,node.rgt
FROM accounts AS node,accounts AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.account_id,node.name,node.acc_num,node.debit,node.credit,node.balance,node.lft,node.rgt
ORDER BY node.lft;
如有疑問,請聯系我

B. 這個sql語句有點復雜,高手幫我解釋一下

case 表達式A when 表達式B then 表達式C else 表達式D end
當 表達式A 等於 表達式B 返回 表達式C 的值,否則返回 表達式D 的值
我查過了,表達式A 的確可以沒有
沒有的情況下,表達式B 布爾為真時返回 表達式C 的值,否則返回 表達式D 的值

left,right 是從左/右返回字元串內容的函數

本 SQL 返回
wttype 中的 id,typename,id 最後兩位是'00'時返回 '' 否則返回 wttype 中 id 開始的兩位等於 @ttype 參數開始的兩位並且 id 的最後兩位為 '00' 的 typename,id 的左邊兩位加 '00' 別名為 uptypedid 條件為 [email protected]

可看出,這是一個分類名稱表
id是一個4字元長度的編號,前兩位是大類,後兩位是小類,後兩位為 "00" 時此數據行的 typename 就是大類名稱,否則 typename 就是小類名稱
本例子通過參數 @ttype 分類編號
返回 id 類編號, typename 分類名稱, 父分類名稱,大類編號

C. 一個巨復雜,理解不了的sql怎麼寫

create table MM_DATATITLE
(
DataCode VARCHAR(25) not null,
Row INTEGER not null,
TitleVal VARCHAR(60),
TitleType CHAR(1),
constraint P_Key_1 primary key ( DataCode , Row )
)
in TBS1
index in TBS_IDX;

create table MM_DATAVALUE
(
DataCode VARCHAR(25) not null,
Col INTEGER not null,
Row INTEGER not null,
DataVal VARCHAR(60),
constraint P_Key_1 primary key ( DataCode , Col , Row )
)
in TBS1
index in TBS_IDX;

D. 剛學sql資料庫就怎麼那麼復雜的例子看不懂求大神解釋

請參閱下面的文章,主要是講述如何使用命令創建資料庫,

在sql命令有指定文件路徑 文件組 大小

使用sql腳本創建資料庫

如果有疑問,請及時溝通

請採納!

E. sql剛剛接觸存儲過程,怎麼這么難啊,看都看不懂,干什麼的都不知道!有沒有什麼辦法啊

其實存儲過程就是把一系列的sql寫在了一起,你可以分割開,拿出來一步步執行就明白了

F. 怎麼學SQL 簡單些 那些英文太復雜了

那不是英文 就是硬編碼
多寫幾個sql語句就理解了。
建議學習的時候可以建一個欄位少的,記錄少的表。體驗一下關鍵字的作用
復習的時候弄個大表欄位多的表關聯多的表,多個關鍵字配合起來用。
因為你只在單個表上用單個關鍵字是理解不到有用的東西的

G. SQL觸發器中難理解的問題,害怕滴很。求救

由於 SQL Server 的觸發器, 是 語句級別的。 不是 逐行觸發的。

例如你執行
Update STUDENTS SET Name=Name+'_TRG'

假設更新了 10 行數據。

對於 語句級別的 觸發器, 那麼就執行一次。
而對於 逐行觸發器, 那麼就會執行 10次。 ( Oracle, DB2, MySQL 支持

FOR EACH ROW 的逐行觸發器, SQL Server 不支持)

那麼怎麼解決你這個一次觸發器, 處理 10行數據的問題呢?
在 SQL Server 裡面, 這個 inserted 可以看成是一張 多行的表。

如果業務邏輯復雜, 那麼你需要通過 游標來 依次處理。

如果業務邏輯比較簡單, 例如僅僅是 記錄一個日誌信息。
那麼, 通過 INSERT ... FROM inserted 的方式, 來完成插入多行數據的處理。

下面是一段簡單的例子

IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)
BEGIN
-- 插入觸發.
-- 正確的使用.
INSERT INTO B
SELECT
inserted.aid,
inserted.money
FROM
inserted;

-- 不正確的使用.
SELECT @aid = aid, @money = money FROM inserted;
INSERT INTO C VALUES ( @aid, @money);
END;

H. 一段很復雜很復雜的SQL語句。。求大神解釋。。。

Select
*
From
(
Select
*
From
(
Select
Number
,ChineseName
,tb1.DepartmentCode
,DepartmentName
,ShiftId
,ShiftName
,Degree
,AskForLeaveType
,WorkOnDate
,OnDutyType
,StartTime
,EndTime
,AOnDuty
,AOffDuty
,Allday
,tb1.SumTotal
,'Error'=
Case
WhenDegree=1ANDStartTime<=AOnDutyANDEndTime<=AOnDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=1ANDStartTime>=AOffDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=1ANDStartTime>=WorkOnDate+''+'12:30'ANDEndTime<=WorkOnDate+''+'13:30'ANDCharindex('常白班',ShiftName)>0ANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=2ANDStartTime<=AOnDutyANDEndTime<=AOnDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=2ANDStartTime>=AOffDutyANDEndTime<=BOnDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=2ANDStartTime>=BOffDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=3ANDStartTime<=AOnDutyANDEndTime<=AOnDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=3ANDStartTime>=AOffDutyANDEndTime<=BOnDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=3ANDStartTime>=BOffDutyANDEndTime<=COnDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=3ANDStartTime>=COffDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenShiftId=0ANDLeft(AskForLeaveType,1)='0'Then0
WhenShiftId>0ANDLeft(AskForLeaveType,1)<>'0'ANDLeft(OnDutyType,1)=0Then0
WhenShiftId>0ANDLeft(AskForLeaveType,1)<>'0'ANDLeft(OnDutyType,1)=2ANDAskForLeaveType='出差假'Then0
WhenShiftId>0ANDLeft(AskForLeaveType,1)<>'0'ANDLeft(OnDutyType,1)=2ANDAskForLeaveType='產假'Then0
WhenShiftId=0ANDLeft(AskForLeaveType,1)<>'0'ANDConvert(varchar(10),StartTime,108)='00:00:00'ANDConvert(varchar(10),EndTime,108)='00:30:00'Then0
Else
1
End
From
(
Select
Number
,ChineseName
,DepartmentName
,d.DepartmentCode
,p.ShiftId
,p.ShiftName
,Degree
,AskForLeaveType
,Convert(varchar(10),WorkOnDate,120)as'WorkOnDate'
,StartTime
,EndTime
,AllDay
,SumTotal
,CaseWhenRight(Convert(Varchar(10),WorkOnDate,120),5)IN(selectRight(Convert(Varchar(10),HolidayDate,120),5)FromAttendanceHoliday)THEN'2-公眾假上班'ELSE'0-平時上班'ENDAS'OnDutyType'
,CaseWhenLeft(FristBrushDate,1)='1'ANDConvert(varchar(10),AOffDuty,120)>Convert(varchar(10),AOnDuty,120)ThenCAST(Convert(Varchar(11),Dateadd(dd,-1,OnDutyDate),120)+Convert(Varchar(5),AOnDuty,108)ASDateTime)ELSECAST(Convert(Varchar(11),OnDutyDate,120)+Convert(Varchar(5),AOnDuty,108)ASDateTime)EndAS'AOnDuty'
,CaseWhenLeft(FristBrushDate,1)='0'ANDConvert(varchar(10),AOnDuty,120)<Convert(varchar(10),AOffDuty,120)ThenCAST(Convert(Varchar(11),Dateadd(dd,1,OnDutyDate),120)+Convert(Varchar(5),AOffDuty,108)ASDateTime)ELSECAST(Convert(Varchar(11),OnDutyDate,120)+Convert(Varchar(5),AOffDuty,108)ASDateTime)EndAS'AOffDuty'
,CAST(Convert(Varchar(11),OnDutyDate,120)+Convert(Varchar(5),BOnDuty,108)ASDateTime)AS'BOnDuty'
,CAST(Convert(Varchar(11),OnDutyDate,120)+Convert(Varchar(5),BOffDuty,108)ASDateTime)AS'BOffDuty'
,CAST(Convert(Varchar(11),OnDutyDate,120)+Convert(Varchar(5),COnDuty,108)ASDateTime)AS'COnDuty'
,CAST(Convert(Varchar(11),OnDutyDate,120)+Convert(Varchar(5),COffDuty,108)ASDateTime)AS'COffDuty'
From
.DepartmentCode=d.DepartmentCode
.Employeeid=a.Employeeid
INNERJOINAttendanceSpellpona.Employeeid=p.Employeeidanda.WorkOndate=p.OnDutyDate
LEFTJOINAttendanceShiftssonp.Shiftid=s.Shiftid
)tb1
)tb2WhereError=1

UNIONALL

Select
Number
,ChineseName
,DepartmentCode
,DepartmentName
,ShiftId
,ShiftName
,Degree
,AskForLeaveType
,WorkOnDate
,CaseWhenRight(Convert(Varchar(10),WorkOnDate,120),5)IN(selectRight(Convert(Varchar(10),HolidayDate,120),5)fromAttendanceHoliday)THEN'2-公眾假上班'ELSE'0-平時上班'ENDAS'OnDutyType'
,StartTime
,EndTime
,AOnDuty
,AOffDuty
,Allday
,SumTotal
,Error
From
(
Select
Number
,ChineseName
,d.DepartmentCode
,DepartmentName
,p.ShiftId
,p.ShiftName
,Degree
,AskForLeaveType
,WorkOnDate
,StartTime
,EndTime
,Sumtotal
,NULLAS'AOnDuty'
,NULLAS'AOffDuty'
,AllDay
,1AS'Error'
From
AttendanceAskForLeavea
LEFTJOINEmployeeseONa.Employeeid=e.Employeeid
LEFTJOINDepartmentsdONe.DepartmentCode=d.DepartmentCode
LEFTJOINAttendanceSpellpONa.Employeeid=p.EmployeeidANDa.WorkOnDate=p.OnDutyDate
LEFTJOINAttendanceShiftssONp.ShiftId=s.ShiftId
Where
Left(IncumbencyStatus,1)<>1
Groupby
Number,ChineseName,d.DepartmentCode,DepartmentName,p.ShiftId,p.ShiftName,Degree,AskForLeaveType,AllDay,WorkOnDate,StartTime,EndTime,Sumtotal
having
Count(1)>1
)tb3
)tb4

對你的代碼格式化後發現,還缺少一些語句,你是否粘貼完整了?

讀完SQL語句後發現,其實是一個考勤核算的查詢語句,是兩個大的SQL查詢Union ALL的結果

I. 一個十分復雜的sql語句,新手不要進

用以下語句吧::
select con,
REPLACE(content.con,
(select top 1 keyword from keywordfont where charindex(keyword,content.con,0) > 0 and charindex(@keyword,keyword,0) > 0
order by charindex(@keyword,keyword,0) asc
)
,'('+ ((select top 1 keyword from keywordfont where
charindex(keyword,content.con,0) > 0 and charindex(@keyword,keyword,0) > 0
order by charindex(@keyword,keyword,0) asc
)) + ')' )
from content
where con like '%' [email protected] + '%' and
exists(select 1 keyword from keywordfont where charindex(keyword,content.con,0) > 0 and charindex(@keyword,keyword,0) > 0)

J. 大家說怎麼才能學好 sql 我看著查詢根本看不懂啊 能看懂的時候但是自己想不出來

大段復雜的SQL都是用最基本的select where 語句拼成的,你可以把無關的內容先去掉,就能看出最基本的框架,知道主要是干什麼
然後這些語句裡面會有很多union left join in 之類的以及一些轉換函數
你要一點點學習select基本句式和擴展句式,以及這些連接詞都是有什麼作用
再回想這個語句的基本任務,通過一段時間的學習,就能越來越明白了
沒有什麼捷徑,所謂的捷徑,就是牢固掌握最基本的語法和各種用法。
任何高深的語句都是這些基本元素堆砌的