第一篇:SQL語句判斷數(shù)據(jù)庫、表、字段是否存在
SQL語句判斷數(shù)據(jù)庫、表、字段是否存在--判斷[TestDB]是否存在if exists(select 1 from master..sysdatabases where name='TestDB')
print 'TestDB存在'
else
print 'TestDB不存在'
--判斷表[TestTb]是否存在if exists(select * from TestDB..syscolumns where id=object_id('TestDB.dbo.TestTb'))print '表TestTb存在'
else
print '表TestTb不存在'
--判斷[TestDB]數(shù)據(jù)中[TestTb]表中是否存在[Name]字段
if exists(select * from TestDB..syscolumns where id=object_id('TestDB.dbo.TestTb')and name='Name')
print '字段Name存在'
else
print '字段Name不存在'
第二篇:如何判斷SQL語句是否執(zhí)行了?(本站推薦)
如何判斷SQL語句是否執(zhí)行了?
我們可以利用err對象來判斷:
sql=“insert into table(f1,f2)values('v1','v2')”
conn.execute sql
if err.number<>0 then
response.write “哎呀,出錯了:”& err.description err.clear else
response.write “OK”
end if
第三篇:數(shù)據(jù)庫SQL語句十題
作業(yè)十題
1.查詢所有學(xué)生的基本信息,并按學(xué)號降序排列
SELECT * FROM STUDENT
ORDER BY sno DESC;
2.查詢系別代碼為“02”的女同學(xué)信息
SELECT * FROM STUDENT
WHERE ssex=’女’ and sdept=‘02’;
3.查詢學(xué)生的總?cè)藬?shù)
SELECT COUNT(*)AS 學(xué)生總?cè)藬?shù)
FROM STUDENT;
4.所有選修課學(xué)生的姓名,課程名及成績
SELECT sname,cname,grade
FROM STUDENT,COURSE,SC
WHERE STUDENT.sno=SC.sno and COURSE.cno=SC.cno;
5.不及格學(xué)生姓名(合并重復(fù)項)
SELECT distinct sname
FROM SC,STUDENT
WHERE grade<=60 and STUDENT.sno=SC.sno;
6.查詢學(xué)號為“011110”的學(xué)生的哪些課程的成績比他數(shù)據(jù)庫的成績要高 SELECT cno
FROM COURSE
WHERE sno=’011110’ and grade>(SELECT grade FROM COURSE,SC
WHERE cname=’數(shù)據(jù)庫’ and sno=‘011110’ and
COURSE.cno=SC.cno);
7.查詢選修課在3門以上(包括3門)的學(xué)生學(xué)號及選課門數(shù) SELECT sno,COUNT(*)AS 選修門數(shù)
FROM SC
GROUP BY sno HAVING COUNT(*)>=3;
8.查詢學(xué)號為“011110”的學(xué)生的平均成績,并以平均成績命名 SELECT AVG(grade)AS average grade
FROM SC
WHERE sno=’011110’;
9.查詢計算機(jī)系或英語系的所有學(xué)生的個人信息
SELECT*FROM STUDENT
WHERE sdeptIN(SELECT sdept FROM DEPT
WHERE sdname=’計算機(jī)系’OR sdname=’英語系’);
10.查詢與“羅宇波”同一個系的學(xué)生情況
SELECT * FROM STUDENT
WHERE sdept=(SELECT sdept FROM STUDENT
WHERE sname=’羅宇波’);
第四篇:SQL數(shù)據(jù)庫編程學(xué)習(xí)應(yīng)用語句
SQL數(shù)據(jù)庫編程學(xué)習(xí)應(yīng)用語句大全
1as 的用處
as可以對表和列取別名
在開發(fā)過程中經(jīng)常遇到開始給某一個的字段去field1的名稱,但后來有感覺field1字段指定不確切,于是又把此字段改成了field2,由于開始認(rèn)為field1是常量,于是到處使用字符串field1,而且程序中又含有大量對field1的處理,此時就可以使用as
例如原來的 select field1 from tableA,改為selectfield2 asfield1 from tableA 代碼基本就可以不動了。
2自增長的字段的插入
開發(fā)中經(jīng)常遇到某個字段類型為IDENTITY,也就是自增長類型,但由于特殊需要,又要插入數(shù)據(jù)
需要臨時去掉,可以使用如下語句set IDENTITY_INSERTtablename on,在處理完成后在使用如下語句恢復(fù) set IDENTITY_INSERTtablenameoff
3分組取每組的前N個數(shù)據(jù)
開發(fā)中還會遇到需要對某一組數(shù)據(jù)先分組,然后取每組的前n條記錄的情況
不妨試試如下代碼
[sql] view plaincopy
/*
按CurrentNodeLevel列分組,每組按NodeID排序,取出每個組中的前3個元素*/
declare @temp table(NodeIDint, CurrentNodeLevelint ,rowNumberint)--定義臨時表insert into @temp
selectNodeID,CurrentNodeLevel,ROW_NUMBER()
OVER(partitionby CurrentNodeLevel
order by NodeID)as rowNumber
from SchoolTerminalStruct---給臨時表中插入數(shù)據(jù)
select * from @temp where rowNumber<=3--從臨時表中取數(shù)據(jù)
4生成隨機(jī)數(shù)
主意此方法只能寫成存儲過程,不能寫成函數(shù)
[sql] view plaincopy
-----返回Max,Min之間的隨機(jī)數(shù)不能寫成函數(shù)
createproc [dbo].[getRAND]
(@Max int,--最大值
@Min int--,--最小值)
AS
BEGIN
DECLARE @result int
SELECT @result=RAND()*(@Max-@Min)+@Min
select@result
END
5把滿足一定條件的數(shù)據(jù)用逗號分隔
這可能也是一個很常用的語句了,經(jīng)常出現(xiàn)在一對多的關(guān)系中對外展示,要求把子表中的數(shù)據(jù)取出來用逗號或者其他符號分隔開
[sql] view plaincopy
/*
把滿足 t2.NodeID=t1.NodeID的tableA 的字段NodeName 以逗號分隔開合并為一個字段輸出
*/
select *,stuff((select ',' + t1.NodeName from tableA t1,tableB t2
wheret2.NodeID=t1.NodeID
for xml path('')), 1 , 1 , '')as text
fromtableA
6在數(shù)據(jù)庫中處理異常
通過個參數(shù)附加output標(biāo)志來輸出參數(shù),通過TRY,CATCH捕捉異常
[sql] view plaincopy
CREATE PROCEDURE [dbo].[sp_UpdateFunctionTree]
@nodenameint,@Result int output---2,操作失敗;0操作成功
AS
BEGIN
begin
BEGIN TRY
UPDATE FunctionTree SET NodeName=@nodename
set @Result=0--操作成功
END TRY
BEGIN CATCH
set @Result=-2--操作失敗
END CATCH
end
END
7查詢中的條件判斷
經(jīng)常遇到在某些條件下應(yīng)該查詢這個字段,在另外一些條件下需要其他字段的情況,可以通過unoin來完成,但也可以通過CASE WHEN 完成[sql] view plaincopy
/*
在State=0 時返回field1 ,在State=1時返回 field2 ,其他時返回field3
*/
SELECT(CASE WHENState=0 THEN field1 WHENState=1 THEN field2
ELSE field3 END)as State
FROM tablename
8單引號的處理
在包含單引號時應(yīng)該使用兩個單引號轉(zhuǎn)義
[sql] view plaincopy
dbo.sp_executesql @statement = N' select indexID,Sex=(case when Sex=0then ''男'' else ''女'' end)
fromtablename '
9使用游標(biāo)
[sql] view plaincopy
declare @temp table(TaskIDint ,NodeIdint)--聲明臨時表
insert into @temp select A.TaskID ,A.NodeIdfrom tableAA,tableB B
whereA.TaskID=B.TaskID--//--給聲明的臨時表中插入記錄
DECLARE tnames_cursor CURSORLOCAL FORWARD_ONLY READ_ONLY--聲明游標(biāo)
FOR select TaskID,NodeId from @temp;--游標(biāo)需要用到的列
open tnames_cursor--打開游標(biāo)
DECLARE @TaskIDint,@NodeIdint;--聲明變量
FETCH NEXT FROM tnames_cursor INTO @TaskID,@NodeId--移動游標(biāo)給變量賦值,應(yīng)該與游標(biāo)需要用到的列一一對應(yīng),順序類型應(yīng)該一致
WHILE(@@FETCH_STATUS = 0)--循環(huán)
BEGIN
BEGIN
exec TaskType @TaskID,@NodeId--調(diào)用存儲過程
END
FETCH NEXT FROM tnames_cursor INTO @TaskID,@NodeId ,@TaskRunCYCType--移動游標(biāo)給變量賦值 應(yīng)該與游標(biāo)需要用到的列一一對應(yīng),順序類型應(yīng)該一致
END
CLOSE tnames_cursor--關(guān)閉游標(biāo)
DEALLOCATE tnames_cursor--釋放游標(biāo)
10合并更新和插入
在開發(fā)中大部分情況下,插入和更新傳遞的參數(shù)基本上是一樣,那為什么不合并呢
[sql] view plaincopy
createproc [dbo].[Save_TableName]
(@field1 varchar(50),@field2varchar(200),@ID int,@insertOrUpdate--小于0插入 大于0更新)
as
begin
if(@insertOrUpdate<0)
begin
INSERT INTOTableName(field1,field2,ID)
values(@field1,@field2,@ID);
end
else
begin
UPDATE TableNameSET field1= @field1, field2 = @field2
where ID =@ID;
end
end
11定義函數(shù)
在沒有滿足要求的情況時,可以定義函數(shù),但是使用自己定義的函數(shù)時需要加上架構(gòu)名稱
[sql] view plaincopy
create FUNCTION [dbo].[CheckTime]
(@startTimedatetime,@endTimedatetime--,)
RETURNSint
AS
BEGIN
DECLARE @result int
SET@result=DATEDIFF(hour, @startTime, @endTime)--
if(@result=0)--小時相同 比較分鐘
begin
SET@result=DATEDIFF(minute, @startTime, @endTime)
if(@result=0)--分鐘相同比較秒
begin
SET@result=DATEDIFF(second, @startTime, @endTime)
end
end
RETURN @result
END
調(diào)用此函數(shù)
[sql] view plaincopy
dbo.CheckTime(@startTime1, @startTime2)--需要加上架構(gòu)名稱
12遞歸讀取數(shù)據(jù)
在實際的應(yīng)用中經(jīng)常遇到樹結(jié)構(gòu)的表,但讀取會比較麻煩,這里提夠一個函數(shù)
[sql] view plaincopy
/*
函數(shù) 返回表,返回給定節(jié)點(diǎn)的所有子孫節(jié)點(diǎn),而不僅僅是子節(jié)點(diǎn)
*/
Create Function [dbo].[GetChildren](@NodeIDInt)
Returns @Tree Table(NodeIDInt, NodeNameVarchar(50), ParentIDInt)
As
Begin
Insert @Tree Select NodeID, NodeName, ParentIDFromTreetable Where ParentID = @NodeID
While @@Rowcount> 0
Insert @Tree Select A.NodeID, A.NodeName, A.ParentID
From Treetable A
Inner Join @Tree B
On A.ParentID = B.NodeIDAndA.NodeID Not In(Select NodeID From @Tree)Return
End
13通過默認(rèn)值實現(xiàn)存儲過程重載
存儲過程可以使用默認(rèn)值,估計都知道,但以此就可以實現(xiàn)類似函數(shù)重載的效果
例如,如下的存儲過程由于使用了默認(rèn)值,就可以不傳遞參數(shù),傳遞一個參數(shù),兩個,三個,[sql] view plaincopy
CREATE PROCEDURE dbo.my_proc
@firstint = NULL,--NULL default value
@secondint = 2,--Default value of 2
@thirdint = 3--Default value of 3
AS SELECT @first, @second, @third;
14在數(shù)據(jù)庫中拼字符串,也可以用參數(shù)
在實際的開發(fā)中,某些情況下在數(shù)據(jù)庫中拼字符串不可避免,但又擔(dān)心有特殊字符,導(dǎo)致拼出來的SQL有問題,其實數(shù)據(jù)庫中拼字符串也可以使用參數(shù),這就要用到dbo.sp_executesql,這樣就可以避免SQL注入和特殊字符導(dǎo)致的錯誤
如
[sql] view plaincopy
DECLARE @IntVariable INT;--定義變量
DECLARE @SQLString NVARCHAR(500);--存儲拼出來的SQL
DECLARE @ParmDefinition NVARCHAR(500);---存儲拼出來的SQL中的參數(shù)
/* Build the SQL string one time.*/
SET @SQLString =
N'SELECT * FROM AdventureWorks.Sales.Store WHERE SalesPersonID = @SalesID';/* Specify the parameter format one time.*/
SET @ParmDefinition = N'@SalesIDint';--賦值
/* Execute the string with the first parameter value.*/
SET @IntVariable = 275;--賦值
EXECUTE dbo.sp_executesql@SQLString, @ParmDefinition,@SalesID = @IntVariable;
/* Execute the same string with the second parameter value.*/
SET @IntVariable = 276;
EXECUTE dbo.sp_executesql@SQLString, @ParmDefinition,@SalesID = @IntVariable;
16觸發(fā)器需要注意的問題
在使用觸發(fā)器時有一個問題,或許很少有人注意到,一條更新語句一次更新了十條記錄,會觸發(fā)幾次觸發(fā)器?只有一次!很奇怪,但卻是事實,所以這需要注意,一不小心就會把好
多數(shù)據(jù)漏了
第五篇:VB數(shù)據(jù)庫SQL語句學(xué)習(xí)
1.Select * from student查詢所有原始記錄
2.Select StudentID, StudentName from student 只查詢學(xué)號和姓名
3.Select StudentID as 學(xué)號, StudentName as 姓名, Sex as 性別,Class as 班級,NormalScore as平時成績,ExperimentScore as 實驗成績, ExaminationScore as 考試成績 from student
4.Select * from student where sex=’男’只需要查看男生的成績
5.Select * from student where NormalScore>80只需要查看平時成績大于80分的記錄
6.Select * from student where studentname like ‘陳%’查詢姓陳的同學(xué)的記錄
7.Select * from student order by examinationScore根據(jù)考試成績排序
8.Select * from student order by examinationScore排序---降序
9.Select Sum(examinationScore)as 總成績 from student求總成績
10.Select Avg(examinationScore)as平均成績 from student求平均成績
11.Select count(*)as 總記錄數(shù) from student求總記錄數(shù)
12.Select Max(ExaminationScore)as 最高分 from student求最高分
13.Select Min(ExaminationScore)as 最高低分 from student求最低分
14.Select Class as 班級, Avg(ExaminationScore)as平均成績 from student group by class各班級成績的分類匯總
Public Class frmMain
Private ObjCnn As New OleDbConnection
Private ObjCmd As OleDbCommand
Private StrDir As String = “D:MIS1025StudentMgr.accdb”
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs)Handles MyBase.Load
ObjCnn.ConnectionString = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” & StrDir
ObjCnn.Open()
ObjCmd = New OleDbCommand
ObjCmd.Connection = ObjCnn
End Sub
Private Sub FindRecord(ByVal StrSQL As String)
ObjCmd.CommandText = StrSQL
Dim rd As OleDbDataReader = ObjCmd.ExecuteReader
Dim tbl As New DataTable
tbl.Load(rd)
DataGridView1.DataSource = tbl
End Sub
Private Sub CmdFind_Click(ByVal sender As System.Object,System.EventArgs)Handles CmdFind.Click
FindRecord(txtSQL.Text)
End Sub ByVal e As