数据库笔记09:Transact-SQL语言编程基础

举报
howard2005 发表于 2021/12/30 00:08:37 2021/12/30
【摘要】 /*********************************  第九单元 Transact-SQL语言编程基础 ***********************************/ /* 了解基本知识点,参看教材P176~184 1、标识符(identifier) ...
/*********************************
 第九单元 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程序实现阶乘:

文章来源: howard2005.blog.csdn.net,作者:howard2005,版权归原作者所有,如需转载,请联系作者。

原文链接:howard2005.blog.csdn.net/article/details/79448043

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。