MySQL基础命令笔记

MySQL基础命令笔记

上学期间学习记录的笔记,放这里方便查阅。

-- 创建数据库
-- CREATE 创建; DATABASE 数据库;
CREATE DATABASE stuinfo
-- 默认字符集
DEFAULT CHARACTER SET utf8mb4
-- 排序规则
DEFAULT COLLATE utf8mb4_general_ci;


-- 显示当前服务器下,所有数据库
SHOW DATABASES;
-- 选择数据库
USE stuinfo

-- 修改数据库
-- 选择数据库
ALTER DATABASE webinfo
-- 修改默认字符集
DEFAULT CHARACTER SET utf8
-- 修改排列规则
DEFAULT COLLATE utf8_general_ci;

-- 删除数据库
-- 使用 DROP 权限
DROP DATABASE webinfo;

-- 数据类型P28

-- 创建表
CREATE TABLE student1 (
 --  INT整数型, UNSIGNED无符号, NOT NULL不得为空,auto_increment自动填充, PRIMARY KEY设为主键;
 id INT UNSIGNED NOT NULL auto_increment PRIMARY KEY
--  CHAR定长字符串
 sNo CHAR(10) NOT NULL,
--  VARCHAR变长字符串
 sName VARCHAR(20) NOT NULL,
 sex CHAR(2),
--  DATE"年-月-日"日期类型
 birthday DATE,
 deptName VARCHAR(30),
 remark VARCHAR(80)
-- ENGINE....之后可不写,默认使用一下形式
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

-- 选择数据库
USE stuinfo;
-- 显示该数据库下所有表
SHOW TABLES;

-- 查看表结构
DESC student;

-- 查看数据库的创建语句
-- \G使表纵向输出显示
SHOW CREATE TABLE student \G

-- 修改表结构

-- 选择要修改的表
ALTER TABLE student
--  在birthday后面添加一个entryDate字段
 ADD entryDate DATE AFTER birthday
-- 把entryDate字段的数据类型改为 TIMESTAMP
 MODIFY entryDate TIMESTAMP
-- 把entryDate字段的名字改为rxDate,数据类型改为 datetime
 CHANGE entryDate rxDate datetime
--  删除rxDate字段
 DROP rxDate;
 
-- 删除数据表
DROP TABLE course;

-- 插入表数据
-- 向student表中插入数据(可多行输入)
INSERT INTO student(sNo,sName,sex,birthday,deptName,remark)
VALUES('1308013101','陈斌','男','1993-03-20','软件131','NULL')
      ('1308013102','张洁','女','1996-02-08','机电131','NULL');

-- 修改表数据
-- 选择需要更新的表
UPDATE student
-- 修改为以下字段数据
SET birthday='1993-11-25',remark='班长'
-- 修改符合此条件的数据
WHERE sNo='130813101';

-- 删除表数据
-- 选择需要删除数据的表
DELETE FROM student
-- 删除符合此条件的数据信息
WHERE sNo='1308013102'

-- 查询表的数据
SELECT deptName,sNo FROM student;

-- 查询所选表,所选的 字段名数据,并将字段名用AS后字符所代替
SELECT sNo AS '学名', sName '姓名' FROM student;

-- 查询所选表格,字段名中符合条件的数据
SELECT * FROM student
WHERE sex='女';

-- 查询课程表中,学分大于4的课程
SELECT * FROM course
WHERE credit > 4;

-- 查询所选表格,字段名
SELECT * FROM student
WHERE birthday>='1995-01-01' AND birthday<='1995-12-31';

-- 模糊查询
--     %:显示所有含关键字的数据
SELECT * FROM student
WHERE sName LIKE '杨%';

--        _:模糊代替一个字符
SELECT * FROM student
WHERE sName LIKE '杨_';

SELECT * FROM student
WHERE birthday BETWEEN '1995-01-01' AND '1995-12-31';

SELECT * FROM score
WHERE grade NOT BETWEEN 60 AND 89;

-- 找出符合指定的条件的数据(常用于离散,不连续)
SELECT * FROM student
WHERE sNo IN('1308013101','1309122503','1312054904');

-- 检索符合条件值的数据
SELECT * FROM course
WHERE remark IS NULL;

-- 查询指定内容,并按birthday降序排列
SELECT * FROM student
WHERE sex='男'
ORDER BY birthday DESC;

-- 查询指定内容,并按birthday升序排列(不加desc,默认升序)
SELECT * FROM student
WHERE sex='男'
ORDER BY birthday;

-- 选取查询的指定内容中(此例未选),指定范围的记录
SELECT * FROM student
ORDER BY birthday DESC
-- [初始位置,] 记录数;默认从0开始
LIMIT 0,5;  
-- LIMIT 5;可省略0

-- 查询时不查看重复数据,可对多个字段列表进行处理
SELECT DISTINCT birthday
FROM student;

--  5.3高级查询

-- 内连接

-- 查询所有女生的学号、姓名、性别、课程ID、成绩
-- 语法一
-- 显示内容
SELECT sNo, sName, sex, cId, grade  
-- 数据来源表(基于student)
FROM student  
-- 内连接方式,等值连接这两个表
INNER JOIN score ON student.id= score.sId
-- 筛选条件
WHERE sex='女';

-- 语法二
-- 显示这些内容
SELECT sNo, sName, sex, cId, grade
-- 数据来源于student score 这两个表
FROM student, score
-- 连接条件与筛选条件,默认内连接
WHERE student.id=score.sId
AND sex='女';

-- 查询学号为“1308013101”学生的学号、姓名、性别、班级、课程名称和成绩
-- 语法一
SELECT sNo, sName, sex, deptName, cName, grade
FROM student
INNER JOIN score ON student.id=score.sId
INNER JOIN course ON course.id=score.cId
WHERE sNo='1308013101';

-- 语法二
SELECT sNo, sName, sex, deptName, cName, grade
FROM student, score, course
WHERE student.id=score.sId AND course.id=score.cId
AND sNo='1308013101';

-- 外连接(左连接)
SELECT sNo, sName, sex, deptName, cId, grade
FROM student
LEFT OUTER JOIN score ON student.id=score.sId
WHERE deptName='网络131';

-- 对比(内连接)
SELECT sNo, sName, sex, deptName, cId, grade  
FROM student  
INNER JOIN score ON student.id= score.sId
WHERE deptName='网络131';

-- 外连接(右连接)
SELECT sNo, sName, sex, deptName, cId, grade
FROM score
RIGHT OUTER JOIN student ON student.id=score.sId
WHERE deptName='网络131';

-- 外连接(全连接)(oracle支持)
-- SELECT sNo, sName, sex, deptName, cId, grade
-- FROM student
-- FULL OUTER JOIN score ON student.id=score.sId
-- WHERE deptName='网络131';

-- 统计函数

-- 统计student表中男生的人数
-- count统计数据记录行数
SELECT COUNT(*) AS '男生人数'
FROM student
WHERE sex='男';

-- 统计学号为'1308013101'的学生选修课程的最高分、最低分、平均分、总分
-- max求最大值,min求最小值,avg求平均值,sum求总分,AS可省略
SELECT MAX(grade) AS '最高分', MIN(grade) AS '最低分',
AVG(grade) AS '平均分', SUM(grade) AS '总分'
FROM score 
-- 默认使用内连接
JOIN student ON student.id=score.sId
WHERE sNo='1308013101';

-- 加上disinct取消字段的重复值后再进行统计
SELECT course(DISTINCT sId) AS '已选修课程学生人数'
FROM score;

-- 分组统计男、女学生的人数。
-- 显示出列,count(*)统计范围为所有
SELECT sex AS'性别', COUNT(*)AS '学生人数'
FROM student
-- 分组统计sex
GROUP BY sex
-- 对字符串 '男'、'女'进行排序
ORDER BY sex DESC;

-- 分组统计被选修过1次以上的课程的课程名、选修次数、和平均分
SELECT cName AS '课程名称', COUNT(*) AS'选修次数', AVG(grade)AS '平均分'
FROM course 
JOIN score ON course.id=score.cId
-- 对cName进行分组汇总
GROUP BY cName
HAVING COUNT(*) > 1;

-- 第6章 视图的创建和使用
-- 创建视图v_stu, 列出所有1995年9月1日及之后出生的学生名单;然后在该视图中查询“网络131”班级的学生记录
CREATE VIEW v_stu  -- 创建视图v_stu
AS
SELECT * FROM student  -- 查询student表
WHERE birthday >= '1995-9-1';  -- 出生日期在1995年9月1日及之后
-- 查询“网络131”班级的学生记录
SELECT * FROM v_stu WHERE deptName = '网络131';

-- 创建视图 v_stu_grade,列出学号、姓名、性别、班级、课程名称、成绩,然后在该视图中查询所有女生的数据记录
CREATE VIEW v_stu_grade(sNo, sName, sex, deptName, cName, grade)
AS
SELECT student.sNo, sName, sex, deptName, course.cName, score.grade FROM score
INNER JOIN student ON student.id = score.sId
INNER JOIN course ON course.id = score.cId;
SELECT * FROM v_stu_grade WHERE sex = '女';

-- 查看视图
DESC v_stu;
SHOW TABLE STATUS LIKE 'v_stu'\G  -- 查看视图的基本信息 -- 在命令行内可运行,且\G属于制表符同时含有“;”的意思,\g仅表示“;”的含义
SHOW CREATE VIEW v_stu\G  -- 查看视图的详细信息
SELECT * FROM information_schema.views WHERE TABLE_NAME = 'v_stu'\G	  -- 在 information_schema的views表中查看v_stu视图的详细信息

-- 修改视图(法一)
CREATE OR REPLACE VIEW v_stu  -- 修改视图,若已存在,则修改视图;若不存在,则创建视图
AS
SELECT sNo, sName, sex, birthday, deptName FROM student
WHERE birthday >= '1995-9-1' AND sex = '女';
SELECT * FROM v_stu;
-- 修改视图(法二)
ALTER VIEW v_stu_grade  -- 修改视图,若已存在,则修改视图;若不存在,则报错
AS
SELECT student.sNo, sName, deptName, course.CNo, cName, score.grade FROM score
INNER JOIN student s ON student.id = score.sId
INNER JOIN course c ON course.id = score.cId
WHERE deptName = '网络131';
SELECT * FROM v_stu_grade;

-- 更新视图
INSERT v_stu(sNo, sName, sex, birthday, deptName)  -- 插入学生数据
VALUES('123123123', '更新插入', '女', '1996-5-3', '软件131');

-- 按条件修改视图
UPDATE v_stu  -- 更新视图
SET deptName = '网络131'  -- 更新内容
WHERE sNo = '1308013110'; -- 更新条件

-- 按条件删除视图
DELETE FROM v_cou  -- 指定删除视图的内容
WHERE cNo = '01004';  -- 删除条件

-- 删除视图
DROP VIEW v_stu;


-- mysql 编程基础

-- 显示全部的系统变量
SHOW GLOBAL VARIABLES;

-- 显示版本号,主机名,现在的用户
SELECT @@VERSION, @@HOSTNAME, CURRENT_USER;

-- 显示基本目录,数据目录
SELECT @@BASEDIR, @@DATADIR;

-- 显示现在的路径,现在的时间,现在的具体时间
SELECT CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP;

-- 初始化用户变量‘myHH’,并赋值为‘Rin’
SET @myHH='Rin';
SELECT @myHH;

-- 初始化用户变量‘myYY’,并赋值学生表中学号为‘1308013101’学生的班级信息
SET @myYY=(SELECT deptName FROM student WHERE sNo='1308013101');
SELECT * FROM student WHERE deptName=@myYY;

-- 算术运算符的使用
-- DIV整除,MOD相除取余
SELECT 5+2, 5-2, 5*2, 5/2, 5 DIV 2, 5%2, 5 MOD 2;

-- 建立用户变量A,b并赋值
SET @A=3,@b=12;
-- 显示同时满足a<4且b>12的数值
SELECT @a<4 AND @b>12;

-- 显示所有字段,将greade的数值减5,并命名为newGrade,数据来源于score
SELECT *, grade-5 AS 'newGrade' FROM score;

-- CEILING(a)显示大于a的最小整数,FLOOR(X)显示小于X的最大整数
SELECT CEILING(1.73),FLOOR(1.73);

-- ROUND(X,D)保留X小数点后D位,并四舍五入。若无D,则直接四舍五入取整数;TRUNCATE(X,D)保留X小数点后D位,不进行四舍五入
SELECT ROUND(1.76,1), TRUNCATE(1.76,1);

-- RAND()返回0~1之间的随机数
SELECT ROUND(RAND()*9+1);

SELECT RAND();
-- CHAR_LENGTH返回字符串的字符数,一个多字节算一个字符;LENGTH返回字符串的字符数,在utf8中,一个汉字算3个字符
SELECT CHAR_LENGTH('MySQL'), CHAR_LENGTH('数据库'),
LENGTH('MySQL'), LENGTH('数据库');

-- NOW()返回当前时间
SELECT NOW();

-- MD5()加密括号内的字符串
SELECT MD5('DSZhhh');

SELECT 16-3*5, (5+9)/4, 7%3, 7 DIV 3;

-- <=>是否相等,TRUE则返回1,FALSE则返回0
SELECT 35>=25, 36<=25, 18<=>18, NULL<=>NULL;

-- POW(X,Y)返回X的Y次方
SELECT POW(2,5),
 ROUND(3.45678,2),
 FLOOR(-7.2),
 CEIL(-7.2);

SELECT LOWER('MYSQL'),
SUBSTRING('default-character-set',9,4),
TRIM(LEADING 'Hi' FROM 'Hi Tom,Tom Hi'),
POSITION('char' IN 'default-character-set')
;

SELECT YEAR(NOW()),
MONTH(NOW()),
DAYNAME(NOW());

-- 用户变量
SET @vstuNo='1308013103', @vcouNo='01001';

SELECT @vstuNo ,@vcouNo , grade FROM score
INNER JOIN student ON student.id=score.sId
INNER JOIN course ON course.id=score.cId
WHERE sNo=@vstuNo && cNo=@vcouNo;


-- 创建不带有参数的存储过程,查询出所有1994年9月之前出生的学生
CREATE PROCEDURE up_studentInfo()
BEGIN
	SELECT * FROM student WHERE birthday < '1994-09-01';
END;

-- 创建带有输入参数的存储过程,通过一个给定的班,查出该班级的所有学生记录
CREATE PREPARE up_deptStudentInfo(IN stuDeptName VARCHAR(30))
BEGIN
		SELECT * FROM student WHERE deptName = stuDeptName;
END

-- 创建一个带有输入参数和输出参数的存储过程 up_scoreGradeInfo, 通过一个给定的学号,查询出该学生选修课程的数量及平均值,并通过输出参数返回
CREATE PROCEDURE up_scoreGradeInfo(IN stuNo CHAR(10), OUT countNum INT, OUT avgGrade FLOAT)
BEGIN
		SELECT COUNT(*) INTO countNum FROM score
		INNER JOIN student ON student.id = score.sId WHERE sNo = stuNo;
		SELECT AVG(grade) INTO avgGrade FROM score
		INNER JOIN student ON student.id = score.sId WHERE sNo = stuNo;
END

-- 创建函数func_getStudentName, 通过一个给定的学号,返回该学生的姓名
CREATE FUNCTION func_getStudentName(stuNo CHAR(10)
RETURNS VARCHAR(20)
BEGIN
		RETURN (SELECT FROM student WHERE sNo = stuNo);
END

-- 局部变量的使用

-- 定义变量
-- 定义一个名为 myVar 的变量, INT类型, 默认值为10
DECLARE myVar INT DEFAULT 10;
-- 给变量赋值
-- 为变量myVar 赋值30
SET myVar = 30;
-- 在成绩表(score)中查询学号为“1308013101”、课程编号为“01003”的成绩,并把它赋给变量myVar
SELECT grade INTO myVar
FROM score WHERE sNo = '1308013101' && cNo='01003';

-- 定义条件和处理程序
-- 定义“ERROR 1146(42S02)” 这个错误,名称为can_not_find
DELETE can_not_find CONDITION FOR SQLSTATE '42S02';
-- 或者
DECLARE can_not_find CONDITION FOR 1146;
-- 定义处理程序( CONTINUE表示遇到错误不进行处理,继续向下执行;EXIT表示遇到错误后马上退出;UNDO 表示遇到错误撤回之前的操作
#方法一:捕捉 sqlstata_value
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='CAN NOT FIND';
#方法二:捕捉 mysql_error_code
DECLARE CONTINUE HANDLER FOR 1146 SET @info='CAN NOT FIND';
#方法三:先定义条件,然后调用
DECLARE can_not_find CONDITION FOR 1146;
DECLARE CONTINUE HANDLER FOR can_not_find SET @info='CAN NOT FIND';
#方法四:使用 SQLWARNING (捕捉所有以01开头的sqlstate_value值,然后执行exit,并输出“error”)
DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR';
#方法五:使用 NOT FOUND (捕捉所有以02开头的sqlstate_value值,然后执行exit,并输出“can not find”)
DECLARE EXIT HANDLER FOR NOT FOUND SET @info = 'CAN NOT FIND';
#方法六:使用 SQLEXCEPTION (捕捉所有没有被sqlwarning或not found捕获的sqlstate_value值,然后执行exit操作,并输出“error”信息)
DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';

-- 流程控制语句
-- IF语句
-- 创建存储过程 up_scoreStateInfo, 通过给定的学号和课程号,查询出该学生指定课程的成绩,如果成绩合格,则返回1;否则返回0
CREATE PROCEDURE up_scoureStateInfo(IN stuNo CHAR(10), IN couNo CHAR(5), OUT stateScore INT)
BEGIN
		DECLARE stuScore INT;
		SELECT grade INTO stuScore FROM score
		INNER JOIN student ON student.id=score.sId
		INNER JOIN course ON course.id=score.cId
		WHERE sNo=stuNo && cNo=couNo;
		IF stuScore >= 60 THEN SET stateScore = 1;
				ELSE SET stateScore=0;
		END IF;
END
-- CASE语句
-- (法二)用case语句实现上述过程(法一:先出结果再一一对比;法二:一一运算并对比)
CREATE PROCEDURE up_scoreStateInfo(IN stuNo CHAR(10), IN couNo CHAR(5), OUT stateScore INT)
BEGIN
		DECLARE stuScore INT;
		SELECT grade INTO stuScore FROM score
		INNER JOIN student ON student.id=score.sId
		INNER JOIN course ON course.id=score.cId
		WHERE sNo=stuNo && cNo=couNo;
		CASE
				WHEN stuScore>=60 THEN SET stateScore=1;
				ELSE SET stateScore=0
		END CASE;
END

-- (法二)查询成绩表,输出学号、课程编号、成绩以及成绩等级
SELECT sNo '学号', sName '姓名', cName '课程名称', grade '成绩',
	CASE
		WHEN grade>=90 THEN '优秀'
		WHEN grade>=80 THEN '良好'
		WHEN grade>=70 THEN '中等'
		WHEN grade>=60 THEN '及格'
		ELSE '不及格'
	END '成绩等级'
FROM score
INNER JOIN student ON student.id=score.sId
INNER JOIN course ON course.id=score.cId;
-- (法一)查询学生表,输出学号、姓名、性别和班级,要求将性别“男”换成“1”,性别“女”换成“0”
SELECT sNo '学号', sName '性别',
CASE sex
	WHEN '男' THEN '1'
	WHEN '女' THEN '0'
	ELSE '未知'
END AS '性别', deptName '班级'
FROM student;

-- WHILE语句(当满足特定条件时,则进入循环)
-- 创建函数func_sum, 计算1+2+3+..+n的和。
CREATE FUNCTION func_sum(n INT)
RETURNS INT
DETERMINISTIC
BEGIN
		DECLARE i, sum INT;
		SET i=1, sum=0;
		WHILE i<=n DO
			SET sum=sum+1;
			SET i=i+1;
		END WHERE;
		RETURN sum;
END

-- repeat语句(当满足特定条件时,则会终止循环,跳出循环体)
-- 改写以上内容
CREATE FUNCTION func_sum(n INT)
RETURNS INT
DETERMINISTIC
BEGIN
		DECLARE i, sum INT;
		SET i=1, sum=0;
		PREPARE
			SET sum=sum+1;
			SET i=i+1;
			UNTIL i>n
		END REPEAT;
		RETURN sum;
END

-- LOOP语句(本身无终止循环语句,需配合leave使用)
-- 改写以上内容
CREATE FUNCTION func_sum(n INT)
RETURNS INT
DETERMINISTIC
BEGIN
		DECLARE i, sum INT;
		SET i=1, sum=0;
		num:LOOP
			SET sum=sum+1;
			SET i=i+1;
			IF i>n THEN LEAVE num;
			END IF;
		END LOOP num;
		RETURN sum;
END

-- ITERATE语句(跳过该语句后面的任何语句)
-- 创建函数func_sum1, 计算1+2+3+..+n的和,但不包括同时能被3和7整除的数。
CREATE FUNCTION func_sum1(n INT)
RETURNS INT
DETERMINISTIC
BEGIN
		DECLARE i, sum INT;
		SET i=1, sum=0;
		num:WHILE i<=n DO
			IF i%3=0 && i%7=0 THEN
			SET i=i+1;
			ITERATE num;
			END IF;
			SET sum=sum+i;
			SET i=i+1;
		END WHILE num;
		RETURN sum;
END

-- 游标的操作
-- 声明游标




CREATE PROCEDURE up_mngrade(IN snumb INT)
BEGIN
	SELECT * FROM score,course,student
	WHERE student.id=score.sId AND course.id=score.cId;
	DECLARE i INT;
	SET i=1;
	WHERE i<=snumb DO
		SET i=i+1
		
		INSERT INTO score(sId, cId, sex, grade)
		VALUES(i ,ROUND(RAND()*9+1) ,'女' ,ROUND(RAND()*50+50));
	
	END WHILE;
	
	CALL up_mngrade(10);
	SELECT * FROM score
END	

INSERT INTO score(sId, cId, grade)
		VALUES(i ,ROUND(RAND()*9+1) ,ROUND(RAND()*50+50));
		
-- 4
CREATE PROCEDURE up_190217103insscore(IN snumb INT) -- 创建存储过程
BEGIN -- 存储过程开始
	DECLARE i, c INT; -- 声明局部变量i,c 且为int类型
	DECLARE grade1 TINYINT; -- 声明局部变量grade1 且为tinyint类型
	SET i=0; -- 给局部变量i赋值为0
	-- chaRu为iterate定义的范围
	chaRu:	WHILE i<=snumb DO -- while循环条件i<=snumb
					SET c=ROUND(RAND()*8+1); -- 给局部变量c赋值为1~9之间的随机数
					SET i=i+1; -- 给局部变量i赋值为i+1后的值
					IF (SELECT COUNT(*) FROM score WHERE sId = i AND cId = c) = 1 THEN -- if语句开始;select中查询满足sId=i并且cId=c时的数量,如果为1,则跳过本次循环,并不执行iterate后的语句
						ITERATE chaRu;
						SET i=i-1; -- 给局部变量i赋值为i-1
					END IF; -- 结束if循环
					SET grade1=ROUND(RAND()*50+50); -- 给局部变量grade1赋值为50~100之间的随机数
					INSERT INTO score(sId, cId, grade) -- 向score插入sId,cId,grade的值
					VALUES(i ,c ,grade1); -- sId,cId,grade的值
	END WHILE chaRu;			
END; -- 存储过程结束

	CALL up_190217103insscore(10);
	SELECT * FROM score;
	
CREATE PROCEDURE up_190217103getscore(IN stuId CHAR(10), IN coName CHAR(10), OUT gradee INT)
BEGIN
		SELECT grade INTO gradee FROM score
		INNER JOIN student ON student.id = score.sId
		INNER JOIN course ON course.id = score.cId
		WHERE student.sNo=stuId AND course.cName=coName;
END;

CALL up_190217103getscore('1308013101','C语言程序设计',@gradee);
SELECT @gradee;

set global log_bin_trust_function_creators=1;
CREATE FUNCTION fun_190217103cmp(a CHAR(10),b CHAR(10),c CHAR(10))
RETURNS CHAR(10)
BEGIN
DECLARE numMax INT;
		CASE 
		WHEN a>=b AND a>=c THEN SET numMax=a;
		WHEN b>=a AND b>=c THEN SET numMax=b;
		ELSE SET numMax=c;
		END CASE;
		RETURN (SELECT numMax);
END;

SELECT fun_190217103cmp('3','4','5');

DECLARE a1,b1,c1 INT;
SET a1=2, b1=3, c1=4;
SELECT MAX(a,b);

-- 创建一个存储过程up_学号state,给定学号与课程号,如果成绩大于等于60则显示“通过!”,如果成绩小于60则显示‘不通过!’,如果该学号没有修读指定课程,则显示“没有该课程记录!”
CREATE PROCEDURE up_190217103state(IN stuNo CHAR(10),IN couNo CHAR(5))
BEGIN
		SELECT course.cName '课程名称',COUNT(*),
			CASE 
			WHEN grade>=60 THEN '通过!'
			WHEN grade<60 THEN '不通过!'
			ELSE '没有该课程记录'
			END '结果'
		FROM score
		INNER JOIN student ON student.id=score.sId
		INNER JOIN course ON course.id=score.cId
		WHERE student.sNo=stuNo AND course.cNo=couNo;
END;

CALL up_190217103state('1308013104','09001');

-- 创建插入触发器tr_insertStudent,当在学生表中插入数据时,检查性别是否为“男”或“女”,如果不是,则默认设为“男”
CREATE TRIGGER tr_insertStudent
BEFORE INSERT
ON student
FOR EACH ROW  #逐行
BEGIN
	IF new.sex!='男' && new.sex!='女' THEN
		SET new.sex='男';
		END IF;
END;
	
	
	
	
	
posted @ 2023-12-06 22:30  DumpInfou  阅读(25)  评论(0编辑  收藏  举报