數據庫筆記09:Transact-SQL語言編程基礎
/*********************************
第九單元 Transact-SQL語言編程基礎
***********************************/
/*
了解基本知識點,參看教材P176~184
1、標識符(identifier)
(1)構成:字母、數字、下劃線、@(at)、#(sharp)
(2)打頭:不能以數字打頭
(3)避免:不能使用T-SQL保留字
2、分隔符(separator)
方括號[]或雙引號""
3、數據類型(data type)
4、常量(constant)
5、變量(variable)
(1)局部變量:都是以@打頭的變量,可讀可寫
(2)全局變量:都是以@@打頭的變量,只能訪問但不能修改
6、運算符(operator)
7、表達式(expression)
8、函數(function)
9、對象的引用:四個層次(服務器名.數據庫名.數據庫所有者名.對象名)
*/
/*
任務:不用切換數據庫,直接訪問Xk數據庫中的Student表記錄
*/
SELECT ? *
FROM ? Student ; ? --如果當前數據庫不是Xk,那么就報錯找不到對象名Student
SELECT ? *
FROM ? [ Q - 7 A972CB106 \ SQL2005 ]. Xk . dbo . Student ; ? --有點類似于訪問磁盤文件采用的完整標識符(c:\dx\notice\xy.txt)
SELECT ? *
FROM ? Xk . dbo . Student ; ? --Xk數據庫就在本地數據庫服務器上,所以可以省掉服務器名
SELECT ? *
FROM ? Xk .. Student ; ? --省掉數據庫所有者名稱,但是不能省掉原點
/*
任務:SQL Server 編程
*/
--1. 編程計算50與60之和
--聲明部分
DECLARE ?@ a ? int , ?@ b ? int , ?@ sum ? int ?? --定義三個整型變量
--輸入部分
SET ?@ a = 50 ? --給變量a賦值
SET ?@ b = 60 ? --給變量b賦值
--處理部分
SELECT ?@ sum = @ a + @ b
--輸出部分
PRINT ?@ sum
GO
/*********************/
--聲明部分
DECLARE ?@ a ? int , ?@ b ? int , ?@ sum ? int ?? --定義三個整型變量
--輸入部分
SET ?@ a = 50 ? --給變量a賦值
SET ?@ b = 60 ? --給變量b賦值
--處理部分
SELECT ?@ sum = @ a + @ b
--輸出部分(T-SQL不會自動進行類型轉換,必須用戶調用類型轉換函數CONVERT())
PRINT ? CONVERT ( varchar , ?@ a )+ '+' + CONVERT ( varchar , ?@ b )+ '=' + CONVERT ( varchar , ?@ sum )
GO
--2. 輸出SQL Server的版本號與服務器名稱
-- ''是字符串或日期常量的定界符(delimiter)
PRINT ? 'SQL Server 版本號:' + @@ VERSION ?? --@@打頭的是全局變量
PRINT ? '服務器名稱:' + @@ SERVERNAME ? --@@打頭的是全局變量
SET ?@@ VERSION = 2012
GO
PRINT ? '當前錯誤號:' + CONVERT ( varchar , ?@@ ERROR )
GO
--結論:全部變量是以@@打頭,只能訪問,不能修改其值
--3. 顯示Course表有多少類課程,利用局部變量保存,然后再輸出
USE ? Xk ? --切換上下文數據庫
GO
SELECT ? COUNT ( DISTINCT ? Kind ) ?課程類別數? FROM ? Course ;
DECLARE ?@ KindCount ? int
SELECT ?@ KindCount = COUNT ( DISTINCT ? Kind ) ? FROM ? Course ;
PRINT ? 'Course表中有' + CONVERT ( varchar , ?@ KindCount )+ '種類別的課程。'
GO
--4. 輸入一個整數,判斷奇偶性。
DECLARE ?@ n ? int
SET ?@ n = 216
IF ?@ n % 2 = 0
PRINT ? '偶數'
ELSE
PRINT ? '奇數'
GO
/*
Java代碼:
public class JudgeOddEven {
public static void main(String[] args) {
int n;
n = 215;
if (n % 2 == 0) {
System.out.println("偶數");
} else {
System.out.println("奇數");
}
}
}
VB代碼:
Dim n As Integer
n = 215
If n Mod 2 = 0 Then
Print "偶數"
Else
Print "奇數"
End If
*/
--5. 編程計算1+2+3+……+100
--聲明變量
DECLARE ?@ i ? int , ?@ sum ? int
--變量初始化
SELECT ?@ i = 1 , ?@ sum = 0
WHILE ?@ i <= 100 ? --設置循環條件
--循環體(BEGIN...END作用類似于Java程序里花括號{})
BEGIN
SET ?@ sum = @ sum + @ i ? --累加
SET ?@ i = @ i + 1 ? --迭代
END
PRINT ? '1+2+...+100=' + CONVERT ( varchar , ?@ sum )
GO
/*
public class Sum {
public static void main(String[] args) {
int i, sum;
i = 1;
sum = 0;
while (i <= 100) {
sum = sum + i;
i++;
}
System.out.println("1+2+...+100=" + sum);
}
}
*/
--6. 輸入兩個整數,輸出較大者
DECLARE ?@ a ? int , ?@ b ? int , ?@ max ? int
SELECT ?@ a = 45 , ?@ b = 24
SET ?@ max = @ a
IF ?@ b > @ max
SET ?@ max = @ b
PRINT ? 'max=' + CONVERT ( varchar , ?@ max )
GO
--思考題:輸入三個整數,輸出最大那個整數
DECLARE ?@ a ? int , ?@ b ? int , ?@ c ? int , ?@ max ? int
SELECT ?@ a = 15 , ?@ b = 24 , ?@ c =- 23
SET ?@ max = @ a
IF ?@ b > @ max
SET ?@ max = @ b
IF ?@ c > @ max
SET ?@ max = @ c
PRINT ? 'max=' + CONVERT ( varchar , ?@ max )
GO
--7. 對課程進行分類統計,要求顯示課程類別、課程名稱和報名人數,并計算各類課程的平均報名人數。查詢結果按照課程類別與報名人數升序排列。
SELECT ? Kind , ? '課程類別' =
CASE ? Kind
WHEN ? '工程技術' ? THEN ? '工科類課程'
WHEN ? '人文' ? THEN ? '人文類課程'
WHEN ? '信息技術' ? THEN ? '信息類課程'
ELSE ? '其它類課程'
END , ? '課程名稱' = CouName , ? '報名人數' = WillNum
FROM ? Course
ORDER ? BY ? Kind , ? WillNum
COMPUTE ? AVG ( WillNum ) ? BY ? Kind
GO
--8. 利用IF與GOTO語句實現1+2+3+……+100
DECLARE ?@ i ? int , ?@ sum ? int
SELECT ?@ i = 1 , ?@ sum = 0
hw : ? SET ?@ sum = @ sum + @ i
SET ?@ i = @ i + 1
IF ?@ i <= 100
GOTO ? hw
PRINT ? '1+2+3+…+100=' + CONVERT ( varchar , @ sum )
GO
/*
#include "stdio.h"
void main()
{
int i=1, sum=0;
hw: sum=sum+i;
i++;
if(i<=100) goto hw;
printf("sum=%d\n",sum);
}
*/
/*
任務:使用系統函數
參看教材P186~193
字符串函數、日期函數、數學函數、系統函數、元數據函數、安全函數、配置函數、聚合函數和排名函數
*/
--1. 查看“數據庫”在“大型數據庫開發”的起始位置
SELECT ? CHARINDEX ( '數據庫' , '大型數據庫開發' ) ? --以字符為單位來定位的,一個英文字母、數字與漢字都認為是一個字符
/*
public class SearchString {
public static void main(String[] args) {
String str1 = "數據庫";
String str2 = "大型數據庫開發";
System.out.println(str2.indexOf(str1));
}
}
輸出結果是2。
由于Java采用Unicode,所以一個字母、數字或漢字都當成一個字符看待。
Java程序里下標是從0開始的,因此輸出結果2表明起始位置是第3個字符。
*/
--2. 輸出字符串“SQL Server數據庫管理系統”,要求每個字符之間加一個“*”
DECLARE ?@ i ? int , ?@ str ? varchar ( 24 ), ?@ strnew ? varchar ( 48 )
SET ?@ i = 1
SET ?@ str = 'SQL Server數據庫管理系統'
SET ?@ strnew = ''
WHILE ?@ i <= LEN ( @ str )
BEGIN
IF ?@ i < LEN ( @ str )
SET ?@ strnew = @ strnew + SUBSTRING ( @ str , @ i , 1 )+ '*'
ELSE
SET ?@ strnew = @ strnew + SUBSTRING ( @ str , @ i , 1 )
SET ?@ i = @ i + 1
END
PRINT ?@ strnew
GO
--3. 重復顯示“瀘職院”3次,中間隔開3個空格,再重復顯示3次。
PRINT ? REPLICATE ( '瀘職院' , 3 )+ SPACE ( 3 )+ REPLICATE ( '瀘職院' , 3 )
--SELECT REPLICATE('瀘職院',3), SPACE(3), REPLICATE('瀘職院',3)
-- 說明:其它系統函數,大家下去自行練習掌握
/*
任務:創建自定義函數
*/
--1. 創建階乘函數jc(n)
--函數三要素:函數名、參數列表、返回值
CREATE ? FUNCTION ? jc ? --指定函數名
( @ n ? int ) ? --指定參數(形參)
RETURNS ? int ? --指定返回值類型
AS
BEGIN ? --函數體開始
DECLARE ?@ i ? int , ?@ jc ? int ? --聲明變量
SELECT ?@ i = 1 , ?@ jc = 1 ? --變量初始化
WHILE ?@ i <= @ n ? --設置循環條件
BEGIN ? --循環體開始
SET ?@ jc = @ jc * @ i ? --累乘
SET ?@ i = @ i + 1 ? --迭代
END ? --循環體結束
RETURN ?@ jc ? --返回函數值
END ? --函數體結束
PRINT ? '5!=' + CONVERT ( varchar , dbo . jc ( 5 )) ? --調用函數,傳入實參
--練習:在Java程序里,創建“int jc(int n)”方法,然后在主方法里調用。
/*
public class TestJc {
public static void main(String[] args) {
System.out.println("5!=" + jc(5));
}
/**
* 階乘函數
* @param n
* @return
*/
public ? static ? int ? jc ( int ? n ) ? {
int ? jc ? = ? 1 ;
for ? ( int ? i ? = ? 1 ; ? i ? <= ? n ; ? i ++) ? {
jc ? = ? jc ? * ? i ;
}
return ? jc ;
}
}
*/
錯誤在于沒有正確引用對象。
利用了類型轉換函數CONVERT(目標類型名,?變量名)
這個思路可以推廣到任何多個整數求最大值。
但是這種做法不符合結構化程序設計的原則。
其他系統函數大家下去自行學習。
Java程序實現階乘:
SQL 數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。