第一篇:數據庫SQL語句十題
作業十題
1.查詢所有學生的基本信息,并按學號降序排列
SELECT * FROM STUDENT
ORDER BY sno DESC;
2.查詢系別代碼為“02”的女同學信息
SELECT * FROM STUDENT
WHERE ssex=’女’ and sdept=‘02’;
3.查詢學生的總人數
SELECT COUNT(*)AS 學生總人數
FROM STUDENT;
4.所有選修課學生的姓名,課程名及成績
SELECT sname,cname,grade
FROM STUDENT,COURSE,SC
WHERE STUDENT.sno=SC.sno and COURSE.cno=SC.cno;
5.不及格學生姓名(合并重復項)
SELECT distinct sname
FROM SC,STUDENT
WHERE grade<=60 and STUDENT.sno=SC.sno;
6.查詢學號為“011110”的學生的哪些課程的成績比他數據庫的成績要高 SELECT cno
FROM COURSE
WHERE sno=’011110’ and grade>(SELECT grade FROM COURSE,SC
WHERE cname=’數據庫’ and sno=‘011110’ and
COURSE.cno=SC.cno);
7.查詢選修課在3門以上(包括3門)的學生學號及選課門數 SELECT sno,COUNT(*)AS 選修門數
FROM SC
GROUP BY sno HAVING COUNT(*)>=3;
8.查詢學號為“011110”的學生的平均成績,并以平均成績命名 SELECT AVG(grade)AS average grade
FROM SC
WHERE sno=’011110’;
9.查詢計算機系或英語系的所有學生的個人信息
SELECT*FROM STUDENT
WHERE sdeptIN(SELECT sdept FROM DEPT
WHERE sdname=’計算機系’OR sdname=’英語系’);
10.查詢與“羅宇波”同一個系的學生情況
SELECT * FROM STUDENT
WHERE sdept=(SELECT sdept FROM STUDENT
WHERE sname=’羅宇波’);
第二篇:SQL數據庫編程學習應用語句
SQL數據庫編程學習應用語句大全
1as 的用處
as可以對表和列取別名
在開發過程中經常遇到開始給某一個的字段去field1的名稱,但后來有感覺field1字段指定不確切,于是又把此字段改成了field2,由于開始認為field1是常量,于是到處使用字符串field1,而且程序中又含有大量對field1的處理,此時就可以使用as
例如原來的 select field1 from tableA,改為selectfield2 asfield1 from tableA 代碼基本就可以不動了。
2自增長的字段的插入
開發中經常遇到某個字段類型為IDENTITY,也就是自增長類型,但由于特殊需要,又要插入數據
需要臨時去掉,可以使用如下語句set IDENTITY_INSERTtablename on,在處理完成后在使用如下語句恢復 set IDENTITY_INSERTtablenameoff
3分組取每組的前N個數據
開發中還會遇到需要對某一組數據先分組,然后取每組的前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---給臨時表中插入數據
select * from @temp where rowNumber<=3--從臨時表中取數據
4生成隨機數
主意此方法只能寫成存儲過程,不能寫成函數
[sql] view plaincopy
-----返回Max,Min之間的隨機數不能寫成函數
createproc [dbo].[getRAND]
(@Max int,--最大值
@Min int--,--最小值)
AS
BEGIN
DECLARE @result int
SELECT @result=RAND()*(@Max-@Min)+@Min
select@result
END
5把滿足一定條件的數據用逗號分隔
這可能也是一個很常用的語句了,經常出現在一對多的關系中對外展示,要求把子表中的數據取出來用逗號或者其他符號分隔開
[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在數據庫中處理異常
通過個參數附加output標志來輸出參數,通過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查詢中的條件判斷
經常遇到在某些條件下應該查詢這個字段,在另外一些條件下需要其他字段的情況,可以通過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單引號的處理
在包含單引號時應該使用兩個單引號轉義
[sql] view plaincopy
dbo.sp_executesql @statement = N' select indexID,Sex=(case when Sex=0then ''男'' else ''女'' end)
fromtablename '
9使用游標
[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--聲明游標
FOR select TaskID,NodeId from @temp;--游標需要用到的列
open tnames_cursor--打開游標
DECLARE @TaskIDint,@NodeIdint;--聲明變量
FETCH NEXT FROM tnames_cursor INTO @TaskID,@NodeId--移動游標給變量賦值,應該與游標需要用到的列一一對應,順序類型應該一致
WHILE(@@FETCH_STATUS = 0)--循環
BEGIN
BEGIN
exec TaskType @TaskID,@NodeId--調用存儲過程
END
FETCH NEXT FROM tnames_cursor INTO @TaskID,@NodeId ,@TaskRunCYCType--移動游標給變量賦值 應該與游標需要用到的列一一對應,順序類型應該一致
END
CLOSE tnames_cursor--關閉游標
DEALLOCATE tnames_cursor--釋放游標
10合并更新和插入
在開發中大部分情況下,插入和更新傳遞的參數基本上是一樣,那為什么不合并呢
[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定義函數
在沒有滿足要求的情況時,可以定義函數,但是使用自己定義的函數時需要加上架構名稱
[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
調用此函數
[sql] view plaincopy
dbo.CheckTime(@startTime1, @startTime2)--需要加上架構名稱
12遞歸讀取數據
在實際的應用中經常遇到樹結構的表,但讀取會比較麻煩,這里提夠一個函數
[sql] view plaincopy
/*
函數 返回表,返回給定節點的所有子孫節點,而不僅僅是子節點
*/
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通過默認值實現存儲過程重載
存儲過程可以使用默認值,估計都知道,但以此就可以實現類似函數重載的效果
例如,如下的存儲過程由于使用了默認值,就可以不傳遞參數,傳遞一個參數,兩個,三個,[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在數據庫中拼字符串,也可以用參數
在實際的開發中,某些情況下在數據庫中拼字符串不可避免,但又擔心有特殊字符,導致拼出來的SQL有問題,其實數據庫中拼字符串也可以使用參數,這就要用到dbo.sp_executesql,這樣就可以避免SQL注入和特殊字符導致的錯誤
如
[sql] view plaincopy
DECLARE @IntVariable INT;--定義變量
DECLARE @SQLString NVARCHAR(500);--存儲拼出來的SQL
DECLARE @ParmDefinition NVARCHAR(500);---存儲拼出來的SQL中的參數
/* 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觸發器需要注意的問題
在使用觸發器時有一個問題,或許很少有人注意到,一條更新語句一次更新了十條記錄,會觸發幾次觸發器?只有一次!很奇怪,但卻是事實,所以這需要注意,一不小心就會把好
多數據漏了
第三篇:sql語句
簡單基本的sql語句 幾個簡單的基本的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%’
(1)數據記錄篩選:
sql=“select * from 數據表 where 字段名=字段值 order by 字段名 [desc]”
sql=“select * from 數據表 where 字段名 like '%字段值%' order by 字段名 [desc]”sql=“select top 10 * from 數據表 where 字段名=字段值 order by 字段名 [desc]”sql=“select top 10 * from 數據表 order by 字段名 [desc]”
sql=“select * from 數據表 where 字段名 in('值1','值2','值3')”
sql=“select * from 數據表 where 字段名 between 值1 and 值2”
(2)更新數據記錄:
sql=“update 數據表 set 字段名=字段值 where 條件表達式”
sql=“update 數據表 set 字段1=值1,字段2=值2 …… 字段n=值n where 條件表達式”
(3)添加數據記錄:
sql=“insert into 數據表(字段1,字段2,字段3 …)values(值1,值2,值3 …)”
sql=“insert into 目標數據表 select * from 源數據表”(把源數據表的記錄添加到目標數據表)
(4)數據記錄統計函數:
AVG(字段名)得出一個表格欄平均值
COUNT(*;字段名)對數據行數的統計或對某一欄有值的數據行數統計MAX(字段名)取得一個表格欄最大的值
MIN(字段名)取得一個表格欄最小的值
SUM(字段名)把數據欄的值相加
引用以上函數的方法:
sql=“select sum(字段名)as 別名 from 數據表 where 條件表達式”
set rs=conn.excute(sql)
用 rs(“別名”)獲取統計的值,其它函數運用同上。
查詢去除重復值:select distinct * from table1between的用法
between限制查詢數據范圍時包括了邊界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 數值1 and 數值2
in 的使用方法
select * from table1 where a [not] in(‘值1’,’值2’,’值4’,’值6’)
第四篇:SQL語句
SQL語句,用友的SQL2000,通過查詢管理器寫的語句
1、查詢
2、修改
3、刪除
4、插入
表名:users 包含字段:id,sname,sage
查詢 select * from users查詢users表中所有數據
select id,sname,sage from users查詢users表中id,sname,sage字段所有數據
可以限定查詢條件比如:
select sname from users where sage>20查詢年齡大于20歲的所有人的名字
修改 update users set sname='李四',sage=22將users表中數據都改為姓名李四,年齡22
update users set sname='李四',sage=22 where id=1限定id為1的人的信息修改為
姓名李四,年齡22
可以加where條件。
刪除 delete from users where id=2刪除users表中id為2的一行數據delete from users 代表刪除users中所有數據
插入 insert into users(id,sname,sage)values(5,'劉三',21)插入一條數據
SQL四條最基本的數據操作語句:Insert,Select,Update和Delete。
例如:SELECT columns FROM tables;其中columns為列的名稱,tables為表格名稱
1、查詢:select 字段名 from 表名 where 條件
查找在表(如A)中符合條件的字段
2、修改:update 表名 set 字段名=‘所要修改的內容’
修改在表(如A)中的字段的值為:所要修改的內容
3、刪除: delete from 表名 where 條件
刪除符合條件的表(如A)中的信息
4、插入: insert into 表名(字段名)(‘插入內容’)
在表(如A)中插入字段為:插入內容 的一條信息
第五篇:SQL數據庫心得
黃淮學院 2015---2016學年第 一 學期 《C#數據庫應用程序開發技術與案例教程》課程
題目:
學習報告
院
系:數學科學系 專
業:數學與應用數學 年
級:1301B 姓
名:曹占營 學
號:1331110101 任課教師:楊鋒英
2015年 12 月 30日
C#數據庫學習報告
在日常生活中,我們和朋友、親戚聯系,會廣泛用到通訊錄,因此這門課程以通訊錄開發為案例,教我們學習軟件開發。
軟件開發是一項非常注重實踐工作,不可能只憑看書、看視頻就學會軟件開發,必須扎扎實實、一行一行的編寫代碼,不斷積累項目經驗,才能真正掌握編程技術,所以我們要親自上級編寫程序,才能真正掌握軟件開發技術。
本書分為基礎篇、進階篇、高級篇,由淺入深地介紹了基于C#的數據庫編程技術,所用的開發工具為Visual Studio 2008、SQL Server 2005以及Access 2007。
學習數據庫的內容是從數據庫、數據表的創建和修改開始的,表是建立關系數據庫的基本結構,用來存儲數據具有已定義的屬性,在表的操作過程中,有查看表信息、查看表屬性、修改表中的數據、刪除表中的數據及修改表和刪除表的操作。從課程中讓我更明白一些知識,查詢可以通過SQL語言進行完成,這樣加深了查詢語句的基本結構,讓我們能更好的掌握其中語句,方便于我們后面的學習和應用。表是數據最重要的一個數據對象,表的創建好壞直接關系到數數據庫的成敗,表的內容是越具體越好,但是也不能太繁瑣,以后在實際應用中多使用表,對表的規劃和理解就會越深刻。在編程方面是需要我們對于編程有邏輯思維能力及一定的編程技巧。在數據庫中插入表、表中的信息等都需要注意,不然很容易出錯。
在基礎篇中,詳細講解了通訊錄系統的設計、開發和安裝部署這樣一個完整過程,對各個任務進行詳細講解。基礎篇學習分為9個任務,分別為系統分析與設計、用戶登錄、主窗體設計、聯系人分組管理、聯系人管理、用戶密碼修改、數據庫備份與恢復、設計“關于”窗體、系統安裝與部署。學完基礎篇,即可開發出一個功能較為完備的通訊錄系統。在聯系人管理任務學習中,由于在Contact表中保存的是分組編號,而窗體上要顯示的是分組名稱,所以在查詢語句中需要級聯查詢,即SQL語句為”select Contact.Id, Name, Phone, Email, QQ, GroupName from Contact, ContactGroup where Contact.GroupId = ContactGroup.Id”。為了實現代碼復用,可以提供查詢功能,根據用戶選擇的擦尋天劍,拼接產生SQL語句。同時為了支持模糊查詢,還在SQL語句中用了like語句。通過SqlDataAdapter的Fill方法填充數據集,獲取數據。數據集中有了數據以后,我們只需設置DataGridView控件的DataSource屬性,就可以顯示數據了。
在進階篇中,介紹了企業項目開發中廣發用到的參數化SQL語句、存儲過程使用及定義數據庫操作類,分為3個任務學習,分別為使用參數化SQL語句、使用存儲過程、使用自定義數據庫操作類,進一步提高我們的數據庫編程能力。在使用存儲過程任務學習中,了解到存儲過程是在大型數據庫系統中,一組為了完成特定功能的SQL語句集,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來執行它。在性能方面,存儲過程有如下的優點。(1)與編譯,存儲過程預先編譯好放在數據庫內,減少編譯語句所花的時間。(2)緩存,編譯好的存儲過程會進入緩存,所以對于經常執行的存儲過程,除了第一次執行外,其他次執行的書都會有明顯提高。(3)減少網絡傳輸,特別對于處理一些數據的存儲過程,不必像直接用SQL語句實現那樣多次傳送數據到客戶端。通過前面的學習,細細體會對數據庫的操作,可以發現,這么多操作其實可以分為4種。(1)對數據庫進行非連接式查詢操作,返回多條記錄。這種操作可以通過SqlDataAdapter對象的Fill方法來完成,即把查詢得到的結果填充到DataTable(或DataSet)對象中。(2)對數據庫進行連接式查詢操作,返回多條查詢記錄。這種操作可以通過SqlCommand對象的ExecuteReader方法來完成,返回SqlDataReader對象。(3)從數據庫中檢索單值。這種操作可以通過SqlCommand對象的ExecuteNonQuery方法來完成。ExecuteScalar方法返回的是Object類型,需要根據實際情況進行類型轉換。(4)對數據庫執行增、刪、改操作。這種操作可以通過SqlCommand對象的ExecuteNonQuery方法來完成,返回增、刪、改操作后數據庫中受影響的行數。
在高級篇中,分為4個任務學習,分別為開發基于三層構架的通訊錄程序、開發基于Access的通訊錄程序、實現基于抽象工廠模式的三層架構、使用MD5加密用戶密碼。首先詳細講解了基于三層構架的通訊錄程序開發過程以及如何開發一個基于Access的通訊錄系統。最后,介紹了如何采用MD5加密技術對用戶密碼加密。MD5加密技術也是實際項目開發中廣泛用到的,通過MD5加密用戶密碼,可以提高程序的安全性。“三層架構”一詞中的“三層”是指:“表示層”、“業務邏輯層”、“數據訪問層”。表示層:位于最外層,離用戶最近。用于顯示和接收用戶輸入的數據,為用戶提供一種交互式操作界面。表示層的常見形式為WinFrom和WebForm。業務邏輯層:負責處理用戶輸入的信息,或者是將這些信息發送給數據訪問層進行保存,或者是調用數據訪問層中的函數再次讀出這些數據。業務邏輯層也可以包括一些對“商業邏輯”描述代碼在里面。數據訪問層:僅實現對數據的保存和讀取操作。可以訪問數據庫系統、二進制文件、文本文檔或是XML文檔。
在這一學期有限的幾次實驗課后,我雖然沒有學會很多,但也學會了一些簡單的操作,我學會了一些簡單的數據運算,會建立一些簡單的表。有時候在做實驗時,對于實驗中的一些東西我不怎么了解,但我還會去做,因為我想只有多練習才能熟練,也才能理解掌握知識。我不知道這一門課對其他同學來說怎么樣,但對我來說卻有些難,但我會努力。因為我認為它對我以后考計算機二級有很大的幫助。
很快這一學期馬上就要結束了,數據庫這一門課也很快就要結束了,但這一學期的學習讓我知道了很多,也告訴了我在以后的人生中如何去做事,如何去做人。尤其是老師的耐心,老師的敬業精神感動了我,再做任何事時都應該認真負責,任何一個人都應該被尊重。