自学《数据库系统原理与应用》——— 黄宝贵、马春梅、禹继国 —— 清华大学出版社

创建了一个Student的数据库进行学习,里面有两个基础表——Student和Score:

SQL基础编程

常量:

        常量即在程序运行过程中恒定不变的值,分为字符串常量、数值常量、日期时间常量和布尔常量等。和c++差不多,字符串就是“hello”,“He said: \"hello.\" ”,(ts:\" 为转义字符,表示冒号里的”)。数值就是整数类型和浮点数类型。日期是DATA(“年-月-日”),时间为TIME类型(“8:10:20),如果时间和日期混用,类型就为DATETIME。

变量:

        和上面的常量相对,为可以变化的数据,分为系统变量、用户变量和局部变量三种。

系统变量:

       系统变量一般以@@开头,如@@VERSION为系统版本号。系统变量也分为全局变量和会话变量,前者改变会影响服务器,后者只影响当前会话。

查看系统变量的语句为:
SHOW [GLOBAL | SESSION] VARIABLES [LIKE‘字符串’];
其中:
(1) GLOBAL表示全局变量,SESSION表示会话变量。若都省略,则默认为会话变量。
(2)“LIKE '字符串‘”一般是含有通配符的变量名,若省略该项,则表示查看所有变量。
如:SHOW GLOBAL VARIABLES;查看所有全局变量
也可以使用以下语句:
SELECT @@[GLOBAL. | SESSION. ]变量名1 [, @@ [GLOBAL. | SESSION.]変量名2, ...];
如查看全局系统变量sort_buffer_size : SELECT @@GLOBAL.sort_buffer_size;

查看会话变量就是把GLOBAL 换成 SESSION 即可。

给系统变量赋值语句为:
SET [GLOBAL | SESSION] 系统变量名 = 表达式。
SET @@[GLOBAL. | SESSION.] 系统变量名 = 表达式。

用户变量:

       用户自己定义的变量称为用户变量。一般以一个@开头,如@sname,该变量无法被其他客户端使用,断开连接后也会自动销毁。

定义和初始化的方法有三种:
SET @用户变量 = 表达式;
SET @用户变量:= 表达式;
SELECT @用户变量:= 表达式;
如,SET @username = ‘舟舟’;
       SET @sex:= '女';
       SELECT @id:= '123456';
       SELLECT @username,@sex,@id;

使用用户变量查询Score表中id为01的学生平均成绩:
SET @score = (SELECT AVG(score) FROM Score WHERE id = '01');

(st:AVG()是平均值函数)

局部变量:

       使用DECLARE声明,该命令执行完后就会自动释放。作用范围在BEGIN········END之间。

声明局部变量方法:
DECLARE 变量名列表 类型 [DEFAULT 值]
如:
DECLARE num INT DEFAULT 10;把10作为默认值赋给num变量。

局部变量赋值:
SET 变量名 = 表达式;
SELECT 字段表达式 INTO 局部变量列表 FROM 表名 [WHERE <条件>];
如:
SELECT sname(*) INTO num FROM Student WHERE sex = ‘男’;

SQL流程控制语句:

1.分支结构:

1.if语句:

IF条件表达式 1 THEN 语句序列1;
        [ELSEIF条件表达式2 THEN语句序列2;]
        ...
        [ELSE语句序列n; ]
END IF;
如计算学号为01的学生的成绩平均分,大于80为“良好”,小于80但大于60为及格,小于60为不及格:
BEGIN
        DECLARE co FLOAT;
        SELECT ROUND(AVG(score),2) INTO co FROM Score WHERE id = '01';
        IF(co >= 80.0) THEN
                SELECT '良好';
        ELSE IF(co >= 60) THEN
                SELECT '及格';
        ELSE SELECT '不及格';
        END IF;
END;
没法之间写,要在后面的存储过程和函数中参能写,所以不提供例子。

2.case语句:

CASE选择变量名
WHEN表达式1 THEN语句序列 1;
WHEN表达式2 THEN语句序列 2;
·······
WHEN表达式n THEN语句序列 n;
ELSE语句序列 n+1;
END CASE;
与if相比,这个只能用整数,与c++的使用方式类似。
还有一个方法:
CASE 变量名
        WHEN 条件表达式1 THEN 语句序列 1;
        WHEN 条件表达式2 THEN 语句序列 2;
        ·······
        WHEN 条件表达式n THEN 语句序列n;

        ELSE 语句序列n+ 1;
END CASE;

2.循环结构:

1.while循环:

WHILE 条件表达式 DO 
        循环体语句;
END WHILE;
如计算1~100的和:
BEGIN
        DECLARE V_C,V_SUM INTO DEFAULT 0;
        WHILE V_C < 100 DO
                SET V_C = V_C + 1;
                SET V_SUM = V_SUM + V_C;
        END WHILE;
        SELECT V_SUM AS 1 到 100的和;
END;
AS 表示以左边的字符串或参数作为右边数据的表格上标。

2.REPEAT循环:

属于无条件循环
REPEAT
        循环体语句;
        UNTIL条件表达式
END REPEAT;
类似c++的do while
还是上面的计算1~100:
BEGIN
        DECLARE V_C,V_SUM INTO DEFAULT 0;
        REPEAT
                SET V_C = V_C + 1;
                SET V_SUM = V_SUM + V_C;
                UNTIL V_C >=100
        END REPEAT;
         SELECT V_SUM AS 1 到 100的和;
END;

3.LOOP循环:

[语句标号:]LOOP
        循环体语句;
        LEAVE语句标号;
END LOOP [语句标号];

BEGIN
        DECLARE V_C,V_SUM INT DEFAULT 0;
        labell: LOOP
                SET V_C=V_C+ 1;
                SET V_SUM = V_SUM + V_C;
                IF V_C = 100 THEN
                        LEAVE labell;
                END IF;

        END LOOP labell;
         SELECT V_SUM AS 1 到 100的和;
END;
使用if语句调控,到达临界,用 LEAVE 语句离开循环。

异常处理:

DECLARE handle_action HANDLER FOR condition_value statement

当condition_valuve 条件满足时,发生异常,则先执行satemert处理语句,再执行handle_ action 动作。

condition_ value的取值有以下几种情况:
①mysql error_ code: MySQL的错误码,为整数类型。例如,错误码1602表示重复键值。②SQLSTATE sqlstate_ value: 用五个字符表示的SQLSTATE值。例如,SQLSTATE'23000'也表示重复键值。
③condition_ name:处理条件的名称。
④NOT FOUND:所有以02开头的SQLSTATE代码的速记。
⑤SQLWARNING:所有以01开头的SQLSTATE代码的运记。
⑥SQLEXCEPTION:所有不以00、01、02开头的SQLSTATE代码的运记。

原本想把存储结构和函数游标一起写的,时间不是很够,明天补。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐