自從學了SQL編程,哪裡不會點哪裡!!!

来源:http://www.cnblogs.com/System-out-println/archive/2016/01/10/5118939.html
-Advertisement-
Play Games

在學習SQL編程前,先給大家分享幾個段子吧,咱先樂呵樂呵! 《桃花庵--程式員版》寫字樓里寫字間,寫字間中程式員;程式人員寫程式,又將程式換酒錢;酒醒只在屏前坐,酒醉還來屏下眠;酒醉酒醒日復日,屏前屏下年復年;但願老死電腦間,不願鞠躬老闆前;賓士寶馬貴者趣,公交自行程式員;別人笑我太瘋癲,我笑自己命...


在學習SQL編程前,先給大家分享幾個段子吧,咱先樂呵樂呵!

                                        《桃花庵--程式員版》

寫字樓里寫字間,寫字間中程式員;程式人員寫程式,又將程式換酒錢;

酒醒只在屏前坐,酒醉還來屏下眠;酒醉酒醒日復日,屏前屏下年復年;

但願老死電腦間,不願鞠躬老闆前;賓士寶馬貴者趣,公交自行程式員;

別人笑我太瘋癲,我笑自己命太賤;但見滿街漂亮妹,哪個歸得程式員。

 

 

      程式員的八榮八恥
以動手實踐為榮,以只看不練為恥。
以列印日誌為榮,以出錯不報為恥。
以局部變數為榮,以全局變數為恥。
元測試為榮,以手工測試為恥。

以代碼重用為榮,以複製粘貼為恥。
以多態應用為榮,以分支判斷為恥。
以定義常量為榮,以魔法數字為恥。
以總結思考為榮,以不求甚解為恥。

 

好了回歸正題,進入SQL編程

1.0使用變數:

     變數是可以存儲數據值的對象,可以使用局部變數向SQL語句傳遞數據。在T-SQL中執行一批SQL語句時,可以聲明許多變數以

便臨時使用。聲明變數以後,可以在批處理中用一條T-SQL語句設置該變數的值,該批處理中的下一條語句可以從該變數中檢索數值

,並給出結果。

     T-SQL中的變數分為局部變數和全局變數。局部變數的使用也是先聲明,在賦值。而全局變數由系統定義和維護,可以直接使用

但一般不自定義全局變數。

1.1局部變數:

 T-SQL中,局部變數的名稱必須以標記@作為首碼。

聲明局部變數的語句如下:

語法

DECLARE @Exam    DataType

其中@Exam為局部變數的名稱,DataType為數據類型

例如:

DECLARE @name    nvarchar(32)

DECLARE @num      int

局部變數的賦值方法有兩種:也就是SET  , SELECT語句

語法

 

SET  @name  ='小強'

SELECT @name = '小強'

示例根據學號查找“小強”的信息及“小強”的學號相鄰的學生信息

 

--查找小強的信息
DECLARE  @name  nvarchar(32)          --聲明局部變數存儲姓名
SET @name = '小強'                            --使用給SET給變數賦值
SELECT  StuNo,StuName,BornDate,Address  From Student
Where StudentName = @name
--查找與小強學號相鄰的學生信息
DECLARE   @StuNo  int 
--使用SELECT 賦值
SELECT  @StuNo = StudentNo  From  Student
Where  StuName= @name
SELECT  StuNo,StuName,BornDate,Address  From Student
Where (StuNo=@StuNo+1)  OR  (StuNo=@StuNo-1)
GO

 

示例中可以看出,局部變數可用於在上下語句中傳遞數據(比如學號@StuNo)

在TSQ語言中,為局部變數賦值的語句有SET語句和SELECT語句。其中,SET賦值語句一般

賦予給變數指定的數據常量,如本例中的小強;SELECT賦值語句一般用於從表中查詢數據,在

賦給變數。需要註意的是,SELECT語句需要確保篩選的記錄不多於一條。如果查詢的記錄多餘

一條,則將把最後一條記錄的值賦給變數。

SET語句與SELECT語句的區別如下:

  SET SELECT
同時對多個變數賦值 不支持 支持
表達式返回多個值時 出錯 將返回的最後一個值賦給變數
表達式未返回值時 變數被賦值NULL 變數保持原值

 

下麵我用代碼為你們展示他倆的不同之處

--先聲明多個變數
DECLARE @add=' ' nvarchar(100) ,@name=' ' nvarchar(100)

SET @add='北京'@name='張三'               --發生語法錯誤

SELECT @add='北京'@name='張三'          --為兩個局部變數@add,@name賦值

SET @add = (SELECT Address FROM Student)       --發生語法錯誤

SELECT  @add =  Address FROM Student    --最後一條記錄將賦值於@add


--查詢無結果時,@add被賦值NULL
SET @add =(SELECT Address From  Student  where  1<0)


--查詢無結果時,@add保持原值  '北京'
SELECT @add = '北京'
SELECT @add = Address from Student  where 1<0 

1.1全局變數:

 T-SQL中,全局變數的名稱必須以標記@@作為首碼。

變數 含義
@@ERROR 最後一個T-SQL錯誤的錯誤號
@@IDENTITY 最後一次插入的標識值
@@LANGUAGE 當前使用的語言名詞
@@MAX_CONNECTIONS 可以創建的,同時可以連接的最大數目
@@ROWWCOUNT 受上一個SQL語句影響的行數
@@SERVERNAME 本地伺服器的名稱
@@SERVICENAME 該電腦上的SQL伺服器名稱
@@TIMETICKS 當前電腦上的每刻度的微秒數
@@TRANSCOUNT 當前連接打開的事物數
@@VERSION SQLSERVER的版本信息

 

 

 

 

 

 

 

 

 

 

全局變數的使用

SELECT @@IDLE  as w           --返回SQL自上次啟動後閑置的時間,單位為毫秒
SELECT @@IO_BUSY AS w   --返回SQL自上次啟動後用於執行輸入和輸出操作的時間,單位為毫秒
SELECT @@LANGID AS w                  --返回當前所使用語言的本地語言標識符(ID)。
SELECT @@LANGUAGE AS w               --返回當前使用的語言名
SELECT @@LOCK_TIMEOUT as w         --當前會話的當前鎖超時設置,單位為毫秒。
SELECT @@MAX_CONNECTIONS  as w  --返回SQL上允許的同時用戶連接的最大數。返回的數不必為當前配置的數值
SELECT @@SERVERNAME as w --返回運行SQL伺服器名稱。
SELECT @@SERVICENAME  as w --返回SQL正在其下運行的註冊表鍵名
SELECT @@TIMETICKS  as w --返回SQL伺服器一刻度的微秒數
SELECT @@TOTAL_READ  as w  --返回 SQL伺服器自啟動後讀取磁碟的次數。
SELECT @@TOTAL_WRITE as w  --返回SQL伺服器自啟動後寫入磁碟的次數。
SELECT @@TRANCOUNT  as w  --返回當前連接的活動事務數。
SELECT @@VERSION as w  --返回SQL伺服器安裝的日期、版本和處理器類型。

有一個小技巧分析一下就是再給變數賦值的時候使用SET語句要比使用SELECT語句的效率高,因為

SET沒有結果集,占用資源比較少。

2.0輸出語句:

T-SQL支持輸出語句,用於顯示處理的數據結果,常用輸出語句有兩種,即PRINT和SELECT

語法

PRINT  局部變數  或字元串

SELECT  局部變數  AS  自定義列名

這裡我重點說一下啊!!!其中使用SELECT  語句輸出的數據是查詢語句的特殊應用。

廢話不多說上代碼:

 

PRINT  '伺服器的名稱:' +  @@SERVERNAME

PRINT  '伺服器的版本:' +  @@VERSION


SELECT   @@SERVERNAME  AS   '伺服器的名稱'

SELECT   @@VERSION  AS   '伺服器的版本'

 

 

大家可以看到我用PRINT語句輸出的結果在消息視窗中以文本方式顯示,用SELECT 語句輸出的結果

在結果視窗中以表格中顯示

使用PRINT語句  時要求+運算符兩側的操作數的數據類型必須一致,需要類型一致我想你應該想到了用

CONVERT()函數轉化,是的,沒錯不光用CONVERT ()我們還要學習另一個轉化函數CAST()

語法:

CAST(表達式  AS  數據類型)

CONVERT (數據類型[長度] ,表達式,[樣式])

CAST  與 CONVERT 都是用於將某種數據類型的表達式轉化為另一種數據類型的表達式。與CAST不同的是

在轉化日期時間類型/浮點類型的數據轉換為字元串時,CONVERT函數可以通過第三個參數指定轉化後的字元樣式。

上代碼:

declare @date datetime
set @date=getdate()
print '今天是'+convert(nvarchar(20),@date,120)

 

 

 

還有倆個函數比較有意思就是floorceiling函數

 

 

  --floor:

 

  select floor(1.92)  --向下取整

 

結果為1

 

  --ceiling

 

  select ceiling(1.01) --向上取整

 

結果為2

2.1邏輯控制語句

T-SQL語言中,常用的邏輯語句有以下幾種

順序結構控制語句         BEGIN-END語法:

BEGIN

語句或語句塊

END

類似於C#中的{}表示語句中的開始和結束。

分支結構控制語句       IF-ELSE語句和CASE-END語句語法:

            IF(條件)

BEGIN

         語句1

         語句2

         ..........

    END

ELSE

.......

迴圈結構控制語句  WHILE語句語法:

WHILE(條件)

BEGIN

    語句或語句塊

  [break  |   CONTINUE]

END

使用BREAK語句將跳出迴圈結束迴圈,使用後者將跳過CONTINUE後面的語句回到第一次根據條件迴圈

 

SQL 中,只有while一種迴圈,沒有do-whilefor迴圈

 

並且沒有while(true)的寫法,可以使用while(1=1)替代。

 

註意:SQL中比較是否相等,用單等號(=

while迴圈示例

 

 

--1到100之間所有偶數的和
--01.定義一個變數,保存總和
declare @sum int
set @sum=0
--02.定義一個初始變數
declare @num int
set @num=1
--03.進行while迴圈
while(@num<=100)
begin
  --判定
  if(@num%2=0)  --代碼執行到這裡,證明@num是偶數
  begin
    set @sum+=@num
  end
   set @num+=1
end
--出了迴圈,列印總和sum
print @sum

 

--用迴圈的方式列印出直角三角形(不是重點,是難點) 
第一種
declare @i int
 declare @j int
 declare @str nvarchar(100)
 set @i=1
 set @j=1
 set @str=''
 while(@i<=5)
 begin
   while(@j<=@i)
   begin
     set @str+='*'  
     set @j+=1
   end
   print @str
   set @i+=1
 end
第二種
declare @str2 nvarchar(200)
 declare @count int
 declare @result nvarchar(200)
 set @str2='*'
 set @count=0
 set @result=''
 while(@count<5)
    begin
        set @result+=@str2
        print @result
        set @count+=1
    end

福利共用:

--經典while迴圈加分題目
--檢查學生“oop”課最近一次考試是否有不及格(分及格)的學生。
--如有,每人加2分,高於95分的學生不再加分,直至所有學生這次考試成績均及格
--***********************************************************************
--01.看一下oop課程最近一次考試分以下人數
--準備一個變數,保存不及格人數,科目編號,最近考試時間

--01.科目編號

select * from result

declare @subid int
select @subid=subjectid from subject
where subjectname='oop'

--02.最近一次考試時間
declare @mydate datetime
select @mydate=max(examdate) from result
where subjectid=@subid

--03.不及格人數
declare @num int
select @num=count(1) from result
where subjectid=@subid
and examdate=@mydate
and studentresult<70


--04.
while(@num>0)  --有成績低於分的學員,
begin
  --每個人+2分,但是95分以上不加分
  update result set studentresult+=2
  where studentresult<95
  and subjectid=@subid
  and examdate=@mydate
  
select @num=count(1) from result
where subjectid=@subid
and examdate=@mydate
and studentresult<70
print @num
  
end

select * from result
order by subjectid,examdate

2.2case多分支語句語法:

CASE

    WHEN   條件1  THEN  結果1

    WHEN   條件2  THEN  結果2

ELSE  其他結果

END

 

--             .Case End 經典練習
--採用美國ABCDE五級打分制顯示學生oop課最近一次考試成績(姓名等級)
--A級:   90分以上
--B級:80-分
--C級:   70-分
--D級:60-分
--E級:60分以下

 declare @subid int
 declare @maxdate datetime
 
 select @subid=subjectid
 from subject
 where subjectname='oop'
 
 select @maxdate=max(examdate)
 from result
 where subjectid=@subid
 
 
 select studentname,等級=
 case
   when studentresult>=90 then 'A'
   when studentresult>=80 then 'B'
   when studentresult>=70 then 'C'
   when studentresult>=60 then 'D'
   else 'E'
 end
 from student,result
 where student.StudentNo=result.StudentNo
 and subjectid=@subid
 and examdate=@maxdate
 

 

 

 

好了,今天的總結就到這裡了,希望可以幫助到看完整篇的人

 

雖然很累但是心裡很開心!熱愛代碼熱愛生命!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題目:Two elements of a binary search tree (BST) are swapped by mistake.Recover the tree without changing its structure.Note:A solution using O(n) space ...
  • 題目:Given a binary tree, determine if it is a valid binary search tree (BST).Assume a BST is defined as follows:The left subtree of a node contains onl...
  • 1.三元操作符 #includemain(){ int score; char grade; printf("input your score"); scanf("%d",&score); grade = score >= 90?'A':(score >= 60?'B':'C'); printf (...
  • Spark中最核心的概念為 RDD(Resilient Distributed DataSets) 中文為: 彈性分散式數據集 ,RDD為對分散式記憶體對象的 抽象它表示一個 被分區不可變 且能 並行操作 的數據集;RDD為可序列化的、可緩存到記憶體對RDD進行操作過後還可以存到記憶體中,下次操作直接把內...
  • Linux安裝redis。
  • 1、登陸到伺服器2、新建一個文件夾來保存webmin,建議在個人用戶下新建。,3、下載Webmin的安裝文件,命令是:wget http://prdownloads.sourceforge.net/webadmin/webmin-1.670.tar.gz到官網下載也可,我喜歡用wget命令來下載。4...
  • SQL Server中所有全局變數都使用兩個@符號作為首碼--1.@@error 最後一個T-SQL錯誤的錯誤號(目的是或得違反約束的錯誤號)insert into Subject values('測試工程師')--違反了約束select @@ERROR --2.@@identity 最後一次插入的...
  • SQL Server 2008中的全局變數及其用法T-SQL程式中的變數分為全局變數和局部變數兩類,全局變數是由SQL Server系統定義和使用的變數。DBA和用戶可以使用全局變數的值,但不能自己定義全局變數。下麵詳細總結一下SQL Server 2008中的33個全局變數,並且寫一下示例.@@....
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...