头歌实践教学平台——数据库系统原理与应用(MySQL)

目录

头歌复制粘贴受到限制解决办法:

MySQL数据库 - 初识MySQL

第1关:创建数据库

第2关:创建表

第3关:使用主键约束

第4关:外键约束

第5关:添加常用约束

数据库教学案例一 数据库和数据表的建立、修改和删除

第1关:建立数据库

第2关:建立学生数据表

第3关:建立课程数据表

第4关:建立成绩数据表

第5关:修改数据表名字

第6关:在数据表中添加字段

第7关:修改数据表的字段名称

第8关:修改数据表的字段类型

第9关:删除数据表的字段

第10关:删除数据表

第11关:删除数据库

数据库实验一 数据库和数据表的建立、修改和删除

第1关:建立数据库

第2关:建立读者数据表

第3关:修改数据表名字

第4关:在数据表中添加字段

第5关:修改数据表的字段名称

第6关:修改数据表的字段类型

第7关:删除数据表的字段

第8关:删除数据表

第9关:删除数据库

数据库教学案例二 数据表中数据的插入、修改和删除

第1关:数据表中插入一条记录,对所有字段赋值

第2关:数据表中插入一条记录,对指定字段赋值

第3关:数据表中插入多条记录,对指定字段赋值

第4关:在数据表中修改单条数据记录的单个字段的值

第5关:在数据表中修改单条记录的多个字段的值

第6关:修改数据表的多条记录

第7关:删除数据表的多条记录

第8关:删除数据表的所有数据

数据库实验二 数据表中数据的插入、修改和删除

第1关:数据表中插入一条记录,对指定字段赋值

第2关:数据表中插入一条记录,对所有字段赋值

第3关:数据表中插入多条记录

第4关:在数据表中修改单条数据记录的单个字段的值

第5关:在数据表中修改单条记录的多个字段的值

第6关:修改数据表的多条记录

第7关:删除数据表的记录

第8关:删除数据表的多条记录

第9关:删除数据表的所有数据

数据库教学案例三 数据查询一

第1关:查询数据表的所有字段或指定字段及表达式

第2关:按条件查询单表

第3关:查询唯一值

第4关:数据排序

第5关:统计查询

第6关:分组查询1

第7关:分组查询2

数据库实验三 数据查询一

第1关:按条件查询单表的所有字段

第2关:查询唯一值

第3关:统计查询

第4关:分组查询

第5关:数据排序

MySQL数据库 - 单表查询(一)

第1关:基本查询语句

第2关:带 IN 关键字的查询

第3关:带 BETWEEN AND 的范围查询

MySQL数据库 - 单表查询(二)

第1关:带 LIKE 的字符匹配查询

第2关:查询空值与去除重复结果

第3关:带 AND 与 OR 的多条件查询

MySQL数据库 - 单表查询(三)

第1关:对查询结果进行排序

第2关:使用 LIMIT 限制查询结果的数量

数据库教学案例三 数据查询二

第1关:多表查询

第2关:多表查询及统计分组

第3关:子查询

第4关:多表子查询

第5关:多表子查询2

数据库实验三 数据查询二

第1关:多表查询

第2关:多表查询及统计分组

第3关:子查询

第4关:多表子查询

用户管理和授权

第1关:建立用户并授权

第2关:建立用户,授权其对数据表的查询

第3关:建立用户,有部分权限

MySQL-安全性控制

第1关:用户和权限

第2关:用户、角色与权限

数据库教学案例四 运算符和函数

第1关:null值的判断

第2关:between and和in运算

第3关:like运算符

第4关:正则表达式

第5关:逻辑运算符

第6关:数学函数

第7关:字符串函数

第8关:条件函数

数据库实验四 运算符

第1关:null值的判断

第2关:between and和in运算

第3关:like运算符

第4关:逻辑运算符

数据库实验五 函数

第1关:数值函数

第2关:字符串函数一

第3关:字符串函数二

第4关:日期函数

第5关:条件函数

数据库教学案例六索引

第1关:建立数据表的同时并建立索引

第2关:在已有的数据表建立索引

第3关:删除索引

数据库实验六 索引

第1关:建立数据表的同时并建立索引

第2关:在已有的数据表建立索引

第3关:删除索引

数据库教学案例七 数据完整性

第1关:通过主索引设置实体完整性

第2关:通过check设置域完整性

第3关:设置成绩表和学生表的参照完整性

第4关:设置成绩表和课程表的参照完整性

第5关:删除参照完整性

数据库实验七 数据完整性

第1关:通过主索引设置实体完整性

第2关:通过check设置域完整性

第3关:设置借阅表和读者表的参照完整性

第4关:设置借阅表和图书表的参照完整性

第5关:建立数据表并设置参照完整性

第6关:删除参照完整性

数据库教学案例八 视图

第1关:建立基于单表的视图,在视图中插入、删除和修改记录

第2关:根据多个数据表建立视图

第3关:根据视图建立视图

第4关:更新视图

数据库实验八 视图

第1关:建立基于单表的视图,在视图中插入、删除和修改记录

第2关:根据多个数据表建立视图

第3关:根据视图建立视图

第4关:更新视图

数据库教学案例九 存储过程

第1关:建立存储过程计算1到参数1的和

第2关:建立存储过程计算1到参数1的和并传出结果

第3关:建立和调用学生学分的存储过程

第4关:建立和调用学生绩点的存储过程

第5关:建立和调用学生评价的存储过程

第6关:修改多个数据表的存储过程

第7关:建立和调用存储函数

第8关:使用游标的存储过程

第9关:使用游标的存储过程2

数据库实验九 存储过程(新)

第1关:建立和调用存储过程(不带输出参数的存储过程)

第2关:建立和调用存储过程(带输出参数)

第3关:建立和调用存储函数

第4关:修改多个数据表的存储过程

第5关:使用游标的存储过程

数据库教学案例十 触发器

第1关:建立单语句的触发器

第2关:建立单语句的触发器2

第3关:建立多条语句的触发器

第4关:在触发器中显示警告信息

第5关:较为复杂的触发器

第6关:在触发器中产生新的编号


头歌复制粘贴受到限制解决办法:

在浏览器右上角添加扩展或者插件(以谷歌浏览器为例):

搜索篡改猴扩展并添加:

启用此扩展后添加新脚本:

添加以下代码并保存:

// ==UserScript==
// @name         增强版 - 解除OJ粘贴限制
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description
// @author       Q
// @match        https://www.educoder.net/*
// @match        *://*.educoder.net/*
// @match        *://educoder.net/*
// @grant        unsafeWindow
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    const log = (message, ...args) => {
        console.log(`%c[解除限制]%c ${message}`, 'color: #4CAF50; font-weight: bold', 'color: inherit', ...args);
    };

    log('脚本已启动,正在解除复制粘贴限制...');

    // 保存原始方法
    const originalAddEventListener = EventTarget.prototype.addEventListener;
    const originalRemoveEventListener = EventTarget.prototype.removeEventListener;
    const originalQuerySelector = Document.prototype.querySelector;
    const originalQuerySelectorAll = Document.prototype.querySelectorAll;

    // 劫持addEventListener,阻止网站添加复制粘贴限制
    EventTarget.prototype.addEventListener = function(type, listener, options) {
        if (['paste', 'copy', 'cut', 'contextmenu'].includes(type)) {
            if (listener) {
                const listenerStr = listener.toString().substring(0, 100) + (listener.toString().length > 100 ? '...' : '');
                log(`阻止添加事件: ${type}`, listenerStr);
            }
            // 不执行原始监听器
            return;
        }
        return originalAddEventListener.call(this, type, listener, options);
    };

    // 移除已有的事件监听器
    EventTarget.prototype.removeEventListener = function(type, listener, options) {
        if (['paste', 'copy', 'cut', 'contextmenu'].includes(type)) {
            log(`阻止移除事件: ${type}`);
            return;
        }
        return originalRemoveEventListener.call(this, type, listener, options);
    };

    // 覆盖键盘事件,确保快捷键正常工作
    document.addEventListener('keydown', function(e) {
        if ((e.ctrlKey || e.metaKey) &&
            ['c', 'C', 'v', 'V', 'x', 'X', 'a', 'A'].includes(e.key)) {
            e.stopImmediatePropagation();
            log(`启用快捷键: Ctrl+${e.key}`);
            return true;
        }
    }, true);

    // 启用右键菜单
    document.addEventListener('contextmenu', function(e) {
        e.stopImmediatePropagation();
        return true;
    }, true);

    // 移除可能的只读和禁用属性
    const enableElements = () => {
        // 查找编辑器元素和文本区域
        const targets = document.querySelectorAll('textarea, input, div[contenteditable], [class*="editor"], [class*="code"], pre');

        targets.forEach(el => {
            if (el) {
                // 移除只读和禁用属性
                el.removeAttribute('readonly');
                el.removeAttribute('disabled');

                // 设置为可编辑
                if (el.tagName.toLowerCase() !== 'input' && el.tagName.toLowerCase() !== 'textarea') {
                    el.setAttribute('contenteditable', 'true');
                }

                // 移除用户选择限制
                el.style.userSelect = 'text';
                el.style.webkitUserSelect = 'text';

                // 移除事件监听器
                el.onpaste = null;
                el.oncopy = null;
                el.oncut = null;
                el.onkeydown = null;
                el.oncontextmenu = null;

                // 移除可能的拦截样式
                el.style.pointerEvents = 'auto';
            }
        });
    };

    // 创建可视化提示
    const createNotification = () => {
        const notification = document.createElement('div');
        notification.style.cssText = `
            position: fixed;
            bottom: 10px;
            right: 10px;
            background-color: rgba(76, 175, 80, 0.9);
            color: white;
            padding: 8px 15px;
            border-radius: 4px;
            font-size: 14px;
            z-index: 9999;
            transition: opacity 0.5s;
            box-shadow: 0 2px 5px rgba(0,0,0,0.2);
        `;
        notification.textContent = '✅ 复制粘贴限制已解除';

        // 添加关闭按钮
        const closeBtn = document.createElement('span');
        closeBtn.style.cssText = `
            margin-left: 10px;
            cursor: pointer;
            font-weight: bold;
        `;
        closeBtn.textContent = '×';
        closeBtn.onclick = () => document.body.removeChild(notification);
        notification.appendChild(closeBtn);

        document.body.appendChild(notification);

        // 5秒后自动淡出
        setTimeout(() => {
            notification.style.opacity = '0';
            setTimeout(() => {
                if (notification.parentNode) {
                    document.body.removeChild(notification);
                }
            }, 500);
        }, 5000);
    };

    // 覆盖剪贴板API
    if (typeof unsafeWindow !== 'undefined') {
        unsafeWindow.navigator.clipboard.writeText = function(text) {
            log('剪贴板写入:', text.substring(0, 20) + (text.length > 20 ? '...' : ''));
            return Promise.resolve();
        };
    }

    // 修复CSS user-select属性
    const addGlobalStyle = () => {
        const style = document.createElement('style');
        style.textContent = `
            * {
                user-select: auto !important;
                -webkit-user-select: auto !important;
                -moz-user-select: auto !important;
                -ms-user-select: auto !important;
            }
            [class*="editor"], [class*="code"], textarea, pre {
                user-select: text !important;
                -webkit-user-select: text !important;
                -moz-user-select: text !important;
                -ms-user-select: text !important;
            }
        `;
        document.head.appendChild(style);
    };

    // 初始化执行
    const init = () => {
        addGlobalStyle();

        // 定期检查并启用元素
        setInterval(enableElements, 1000);

        // DOM加载完成后执行
        if (document.readyState === 'loading') {
            document.addEventListener('DOMContentLoaded', () => {
                enableElements();
                createNotification();
            });
        } else {
            enableElements();
            createNotification();
        }

        log('初始化完成,已全面解除复制粘贴限制!');
    };

    init();
})();

然后刷新头歌平台即可进行复制粘贴。

MySQL数据库 - 初识MySQL

第1关:创建数据库

mysql -uroot -p123123 -h127.0.0.1

create database MyDb;

show databases;

第2关:创建表

mysql -uroot -p123123 -h127.0.0.1

create database TestDb;

use TestDb;

create table t_emp(
id int,
name varchar(32), 
deptId int,
salary float
);

第3关:使用主键约束

mysql -uroot -p123123 -h127.0.0.1

use MyDb;
 
create table t_user1(
userId INT PRIMARY KEY,
name varchar(32),
password varchar(11),
phone varchar(11),
email varchar(32)
);
 
create table t_user2(
name varchar(32),
phone varchar(11),
email varchar(32),
primary key(name,phone)
);

第4关:外键约束

mysql -uroot -p123123 -h127.0.0.1

use MyDb;

create table t_class(
id int primary key,
name varchar(22) 
);

create table t_student(
id int primary key,
name varchar(22) ,
classId int,
CONSTRAINT fk_stu_class1 FOREIGN KEY(classId) REFERENCES t_class(id)
);

第5关:添加常用约束

mysql -uroot -p123123 -h127.0.0.1

use MyDb;

create table t_user(
id int primary key AUTO_INCREMENT,
username varchar(32) not null UNIQUE,
sex varchar(4) default '男'
)default CHARSET=utf8;

数据库教学案例一 数据库和数据表的建立、修改和删除

第1关:建立数据库

#代码开始

CREATE DATABASE jwxt;

show databases;

#代码结束

第2关:建立学生数据表

#代码开始

use jwxt;

CREATE TABLE student(
    studentid char(12) primary key,
    name varchar(10),
    birthday date,
    sex enum('男','女') default '男',
    nativeplace varchar(3),
    political enum('党员','团员','群众') default '群众',
    interest set('运动','旅游','阅读','写作','音乐','影视','电子竞技','其他'),
    resume text,
    photo varchar(20)
);
 
describe student;
 
#代码结束

第3关:建立课程数据表

#代码开始

USE jwxt;

CREATE TABLE course(
    courseid CHAR(4) PRIMARY KEY,
    coursename VARCHAR(10),
    department VARCHAR(20),
    credit TINYINT UNSIGNED,
    required TINYINT(1) DEFAULT 1,
    period TINYINT UNSIGNED,
    introduce VARCHAR(100)
);

describe course;
 
#代码结束

第4关:建立成绩数据表

#代码开始

use jwxt;

create table score(
    studentid varchar(12),
    courseid varchar(4),
    session year,
    score decimal(4,1),
    primary key(studentid,courseid,session)
);

describe score;

#代码结束

第5关:修改数据表名字

use jwxt;

#代码开始

alter table student rename to xs;
 
#代码结束

describe xs;

第6关:在数据表中添加字段

use jwxt;

#代码开始

alter table student add address varchar(30);
 
#代码结束

describe student;

第7关:修改数据表的字段名称

use jwxt;

#代码开始
 
alter table course change coursename kcmc varchar(10);

#代码结束

describe course;

第8关:修改数据表的字段类型

use jwxt;

#代码开始

alter table course modify introduce text;

#代码结束

describe course;

第9关:删除数据表的字段

use jwxt;

#代码开始
 
alter table student drop address;

#代码结束

describe student;

第10关:删除数据表

use jwxt;

#代码开始
 
drop table student;

show tables;

#代码结束

第11关:删除数据库

#代码开始
 
drop database jwxt;

show databases;

#代码结束

数据库实验一 数据库和数据表的建立、修改和删除

第1关:建立数据库

#代码开始

create database library;

show databases;

#代码结束

第2关:建立读者数据表

#代码开始
 
USE library;

CREATE TABLE dz (
    dzzh INT(3) UNSIGNED ZEROFILL AUTO_INCREMENT PRIMARY KEY,
    xm VARCHAR(8) NOT NULL,
    xb ENUM('男', '女') DEFAULT '男',
    sf ENUM('研究生', '工作人员', '教研人员') DEFAULT '研究生'
    );

describe dz;
 
#代码结束

第3关:修改数据表名字

use library;

#代码开始

alter table dz rename to reader;
 
#代码结束

describe reader;

第4关:在数据表中添加字段

use library;

#代码开始

alter table reader add dhhm varchar(11);
 
#代码结束

describe reader;

第5关:修改数据表的字段名称

use library;

#代码开始
 
alter table reader change dhhm mobile varchar(11);

#代码结束

describe reader;

第6关:修改数据表的字段类型

use library;

#代码开始

alter table reader modify dhhm varchar(12);

#代码结束

describe reader;

第7关:删除数据表的字段

use library;

#代码开始
 
alter table reader drop dhhm;

#代码结束

describe reader;

第8关:删除数据表

use library;

#代码开始
 
drop table reader;

show tables;

#代码结束

第9关:删除数据库

#代码开始
 
drop database library;

show databases;

#代码结束

数据库教学案例二 数据表中数据的插入、修改和删除

第1关:数据表中插入一条记录,对所有字段赋值

use jwxt;

#代码开始

insert into student (studentid,name,birthday,sex,nativeplace,political,interest,resume,photo) values('201221120101','王刚','1994-07-26','男','广西','团员','运动','2013年获得国家奖学金','');

#代码结束

第2关:数据表中插入一条记录,对指定字段赋值

use jwxt;

#代码开始

insert into student (studentid,name,birthday,sex) values('2023120101','李向','2000-08-30','男');
 
#代码结束

select * from student;

第3关:数据表中插入多条记录,对指定字段赋值

use jwxt;

#代码开始

insert into student (studentid,name,birthday,sex,nativeplace) values('201221120103','何丽洁','1994-08-30','女','辽宁'),('201221120105','彭悦','1993-08-19','男','湖南'),('201221120107','杨波','1994-02-20','男','山东');

#代码结束

select * from student;

第4关:在数据表中修改单条数据记录的单个字段的值

use jwxt;

#代码开始

update course set credit=3 where coursename='计算机概论';
 
#代码结束

select * from course;

第5关:在数据表中修改单条记录的多个字段的值

use jwxt;

#代码开始
 
update course set period=16,credit=1 where coursename='英美文学';
 
#代码结束

select * from course;

第6关:修改数据表的多条记录

use jwxt;

#代码开始

update course set period=period+5 where required=1;

#代码结束

select * from course;

第7关:删除数据表的多条记录

use jwxt;

#代码开始
 
delete from course where department='新影院';

#代码结束

select * from course;

第8关:删除数据表的所有数据

use jwxt;

#代码开始
 
delete from course;
 
#代码结束

select * from course;

数据库实验二 数据表中数据的插入、修改和删除

第1关:数据表中插入一条记录,对指定字段赋值

use library;

#代码开始

insert into reader (xm,dhhm) values('林团团','13507311234');

#代码结束

第2关:数据表中插入一条记录,对所有字段赋值

use library;

#代码开始

insert into reader (dzzh,xm,xb,sf,dhhm) values('002','陈洁','女','教研人员','13319551234');

#代码结束

select * from reader;

第3关:数据表中插入多条记录

use library;

#代码开始

insert into reader (xm,xb,sf,dhhm) values('黄小小','男','研究生','13316789987'),('刘大任','男','工作人员','18012341234'),('邓朝阳','女','研究生','17716554432');
 
#代码结束

select * from reader;

第4关:在数据表中修改单条数据记录的单个字段的值

use library;

#代码开始

update reader set dhhm='17718991989' where xm='林团团';
 
#代码结束

select * from reader;

第5关:在数据表中修改单条记录的多个字段的值

use library;

#代码开始
 
update reader set dhhm='13315667745',sf='工作人员' where xm='陈洁';

#代码结束

select * from reader;

第6关:修改数据表的多条记录

use library;

#代码开始

update reader set dzzh=dzzh+10;

#代码结束

select * from reader;

第7关:删除数据表的记录

use library;

#代码开始
 
delete from reader where xm='陈洁';

#代码结束

select * from reader;

第8关:删除数据表的多条记录

use library;

#代码开始
 
delete from reader where sf='研究生';

#代码结束

select * from reader;

第9关:删除数据表的所有数据

use library;

#代码开始
 
delete from reader;

#代码结束

select * from reader;

数据库教学案例三 数据查询一

第1关:查询数据表的所有字段或指定字段及表达式

use jwxt;

#代码开始

#第一题

select * from student;

#第二题

select name,birthday from student;

#第三题

select name,concat(month(birthday),'月',day(birthday),'日') as '生日' from student;

#第四题
 
select name,2025-year(birthday) as '年龄' from student;

#代码结束

第2关:按条件查询单表

use jwxt;

#代码开始

#第一题

select studentid,name from student where sex='男';

#第二题

select name,nativeplace from student where nativeplace in ('湖南','湖北');

#第三题
 
select name,birthday from student where (2025-year(birthday)) between 28 and 30;

#第四题

select *from student where nativeplace='湖南' and sex='男';

#第五题

select *from student where nativeplace='湖南' or sex='男';

#代码结束

第3关:查询唯一值

use jwxt

#代码开始

#第一题

select distinct nativeplace from student;

#第二题

select distinct year(birthday) from student;
 
#代码结束

第4关:数据排序

use jwxt;

#代码开始

#第一题

select name,sex,birthday from student order by birthday desc;

#第二题

select name,sex,birthday from student order by sex asc,birthday desc;

#第三题

select name,nativeplace from student order by nativeplace asc;

#第四题

select name,sex,birthday from student order by birthday desc limit 3;

#代码结束

第5关:统计查询

use jwxt;

#代码开始

#第一题

select count(*)  as 'count(*)' from student where sex = '女';

#第二题

select avg(score) as 'avg(score)' from score where studentid='201221120201';

#第三题

select max(score) as '最高分',min(score) as '最低分',avg(score) as '平均分' from score where courseid='0101';

#代码结束

第6关:分组查询1

use test;

#代码开始

#第一题

select name,avg(cj) as 'avg(cj)' from score group by name;

#第二题

select course,avg(cj) as 'avg(cj)' from score group by course;

#代码结束

第7关:分组查询2

use jwxt;

#代码开始

#题目1

select studentid,avg(score) as 平均分 from score group by studentid having 平均分>80;

#题目2

select nativeplace,count(*) as 'count(*)' from student where sex='男' group by nativeplace;

#题目3

select nativeplace,count(*) from student group by nativeplace having count(*)>2;

#题目4

select nativeplace,count(*) from student  where sex='男' group by nativeplace having count(*)>2;

#题目5

select sex,political,count(*) as 'count(*)' from student group by sex,political;
 
#代码结束

数据库实验三 数据查询一

第1关:按条件查询单表的所有字段

use province;

#代码开始

#第一题

select *from jdxx where qxmc='开福区';

#第二题

select *from jdxx where qxmc='开福区' or qxmc='岳麓区';

#第三题

select *from jdxx where cs='长沙市' and name='西湖街道';
  
#代码结束

第2关:查询唯一值

use province

#代码开始

select distinct qxmc from jdxx where sf='湖南省';

select distinct qxmc from jdxx where cs='长沙市';
 
#代码结束

第3关:统计查询

use province;

#代码开始

#答案1

select count(name) as 'count(name)' from jdxx where sf='湖南省';

#答案2

select count(name) as 'count(name)' from jdxx where cs='长沙市';

#答案3

select count(distinct qxmc) as 'count(distinct qxmc)' from jdxx where sf='湖南省';

#答案4

select count(distinct qxmc) as 'count(distinct qxmc)' from jdxx where cs='长沙市';

#代码结束

第4关:分组查询

use province;

#代码开始

#题目1

select sf,count(name) as 'count(*)' from jdxx group by sf;

#题目2

select cs,count(name) as 'count(*)' from jdxx group by cs having count(*)>200;

#题目3

select qxmc,count(name) as 'count(*)' from jdxx where cs='长沙市' group by qxmc;

#代码结束

第5关:数据排序

use province;

#代码开始

#第一题

select *from jdtj order by jdgs desc limit 10;

#第二题

select *from jdtj order by jdgs asc limit 10;

#第三题

select *from jdtj where jdgs>35 order by jdgs desc,sf asc;

#代码结束

MySQL数据库 - 单表查询(一)

第1关:基本查询语句

USE Company;

#请在此处添加实现代码

########## Begin ##########

########## retrieving the Name and Salary ##########

select Name,Salary from tb_emp;

########## retrieving all the table ##########

select * from tb_emp;

########## End ##########

第2关:带 IN 关键字的查询

USE Company;

#请在此处添加实现代码

########## Begin ##########

########## retrieving the Name and Salary with IN statement ##########

select Name,Salary from tb_emp where id not in(1);

########## End ##########

第3关:带 BETWEEN AND 的范围查询

USE Company;

#请在此处添加实现代码

########## Begin ##########

########## retrieving the Name and Salary with BETWEEN AND statement ##########

select Name,Salary from tb_emp where Salary between 3000 and 5000;

########## End ##########

MySQL数据库 - 单表查询(二)

第1关:带 LIKE 的字符匹配查询

USE Company;

######### Begin #########

select Name,Salary from tb_emp where Name like 'c%';

######### End #########

第2关:查询空值与去除重复结果

USE Company;

######### Begin #########

select * from tb_emp where DeptId is null;

######### End #########

######### Begin #########

select distinct Name from tb_emp;

######### End #########

第3关:带 AND 与 OR 的多条件查询

USE Company;

######### Begin #########

select * from tb_emp where DeptId=301 and Salary>3000;

######### End #########

######### Begin #########

select * from tb_emp where DeptId in (301,303);

######### End #########

MySQL数据库 - 单表查询(三)

第1关:对查询结果进行排序

USE School;

#请在此处添加实现代码

########## Begin ##########

########## 查询1班同学的所有信息以成绩降序的方式显示结果 ##########

select * from tb_score where class_id=1 order by score desc;

########## End ##########

第2关:使用 LIMIT 限制查询结果的数量

USE School;

#请在此处添加实现代码

########## Begin ##########

########## 查询班级中第2名到第5名的学生信息 ##########

select * from tb_score order by score desc limit 1,4;

########## End ##########

数据库教学案例三 数据查询二

第1关:多表查询

use jwxt;

#代码开始

#第一题

select student.studentid,student.name,score.courseid,score.score from student,score where student.studentid = score.studentid;

#第二题

select student.studentid,student.name,score.courseid,score.score from student join score on student.studentid = score.studentid where student.name='彭玉';

#代码结束

第2关:多表查询及统计分组

use jwxt;

#代码开始

#第一题

select student.studentid,student.name,avg(score.score) as 'avg(score)' from student join score on student.studentid = score.studentid group by student.studentid,student.name;

#第二题

select student.studentid,student.name,avg(score.score) as 'avg(score)' from student join score on student.studentid = score.studentid group by student.studentid,student.name having avg(score.score)>80;

#代码结束

第3关:子查询

use jwxt;

#代码开始

#答案1

select name from student where name!='周晓阳' and nativeplace =(select nativeplace from student where name='周晓阳');

#答案2

select studentid,score from score where courseid='0101' and score>(select avg(score) from score where courseid='0101');

#代码结束

第4关:多表子查询

use jwxt;

#代码开始

#题目1

select student.studentid,student.name,score.score as 'score' from student join score on student.studentid = score.studentid where score.courseid='0101' and score.score>(select avg(score) from score where courseid='0101');

#题目2

select student.studentid,student.name,score.score as 'score' from student join score on student.studentid = score.studentid where score.courseid='0101' and score.score>(select avg(score) from score where courseid='0101');

第5关:多表子查询2

use jwxt;

#代码开始

#题目1

select distinct course.* from  course join score on course.courseid = score.courseid order by course.courseid;

#题目2
select course.* from course left join score  on course.courseid = score.courseid where score.courseid is null;


#题目3

select student.* from student where not exists (
    select 1
    from score join course on score.courseid = course.courseid
    where course.coursename = '高等数学' and score.studentid = student.studentid
);

数据库实验三 数据查询二

第1关:多表查询

use library;

#代码开始

#第一题

select borrow.txm,borrow.jyrq,borrow.hsrq from reader join borrow on reader.dzzh = borrow.dzzh where reader.xm = '王颖珊';

#第二题

select borrow.dzzh,borrow.jyrq,borrow.hsrq from book,borrow where book.txm = borrow.txm and book.sm = '李白全集';

#第三题

select reader.dzzh,reader.xm,reader.dhhm,book.txm,book.sm,borrow.jyrq from reader join borrow on reader.dzzh = borrow.dzzh join book on borrow.txm = book.txm where isnull(borrow.hsrq);
  
#代码结束

第2关:多表查询及统计分组

use library

#代码开始

#第一题

select book.sm, count(borrow.txm) as jycs from book, borrow where book.txm = borrow.txm group by book.sm order by jycs desc, book.sm desc;

#第二题

select book.sm, count(borrow.txm) as jycs from book, borrow where book.txm = borrow.txm group by book.sm having jycs >= 2 order by jycs desc, book.sm desc;

#第三题

select book.cbs, count(borrow.txm) as jycs from book, borrow where book.txm = borrow.txm group by book.cbs order by jycs desc, book.cbs desc;

#第四题

select reader.xm, count(borrow.dzzh) as jycs from reader, borrow where reader.dzzh = borrow.dzzh group by reader.xm order by jycs desc, reader.xm desc;

#第五题
select reader.xm, count(borrow.dzzh) as jycs from reader, borrow where reader.dzzh = borrow.dzzh and reader.sf = '研究生' group by reader.xm order by jycs desc, reader.xm desc;

#代码结束

第3关:子查询

use library;

#代码开始

#答案1

select sm from book where cbs = (select cbs from book where sm = '李白全集') and sm != '李白全集';

#答案2

select sm, sj from book where sj > (select avg(sj) from book);

#答案3

select txm, sm, sj from book where sj = (select max(sj) from book);

#答案4

select txm, sm, sj from book where sj = (select min(sj) from book);
 
#代码结束

第4关:多表子查询

use library;

#代码开始

#题目1

select distinct reader.dzzh, reader.xm from reader, borrow where reader.dzzh = borrow.dzzh order by reader.dzzh asc;

#题目2

select book.txm, book.sm from book where book.txm not in (select distinct txm from borrow);

#题目3

select distinct reader.dzzh, reader.xm from reader, borrow where reader.dzzh = borrow.dzzh and borrow.txm in (select txm from borrow, reader where borrow.dzzh = reader.dzzh and reader.xm = '孙思旺') and reader.xm != '孙思旺' order by reader.dzzh asc;

#题目4

select distinct book.sm from book, borrow where book.txm = borrow.txm and borrow.dzzh in (select dzzh from borrow, book where borrow.txm = book.txm and book.sm = '李白全集') and book.sm != '李白全集' order by book.sm asc;

#代码结束

用户管理和授权

第1关:建立用户并授权

#代码开始

#建立用户

CREATE USER 'admin'@'%' IDENTIFIED BY '123456';

#用户授权

grant all privileges on *.* to 'admin'@'%';

#测试

select host,user,Update_priv,Alter_priv from mysql.user where user='admin' ;
 

第2关:建立用户,授权其对数据表的查询

use province

#代码开始

#建立用户

create user user1@127.0.0.1 identified by "888888";

#用户授权

grant select on province.jdxx to user1@127.0.0.1;
 
#代码结束

select host,db,table_name,Table_priv   from mysql.tables_priv  where  user='user1';

第3关:建立用户,有部分权限

#代码开始

#建立用户

create user 'user2'@'127.0.0.1' identified by '666666';

#用户授权

grant all privileges on province.* to 'user2'@'127.0.0.1';

grant select on library.book to 'user2'@'127.0.0.1';

#代码结束

select host,db,user,Delete_priv,Index_priv from mysql.db where user='user2' ;

select host,db,table_name,Table_priv   from mysql.tables_priv  where  user='user2';

MySQL-安全性控制

第1关:用户和权限

# 请填写语句,完成以下功能:
create database finance1;
use finance1;
source /data/workspace/myshixun/src/test1/finance1.sql;

#(1) 创建用户tom和jerry,初始密码均为'123456';

create user 'tom'@'%' identified by '123456';
create user 'jerry'@'%' identified by '123456';

#(2) 授予用户tom查询客户的姓名,邮箱和电话的权限,且tom可转授权限;

grant select (c_name, c_mail, c_phone) on client to 'tom'@'%' with grant option;

#(3) 授予用户jerry修改银行卡余额的权限;

grant update (b_balance) on bank_card to 'jerry'@'%';

#(4) 收回用户Cindy查询银行卡信息的权限。

revoke select on bank_card from 'Cindy'@'%';

第2关:用户、角色与权限

# 请填写语句,完成以下功能:

use finance1;
source /data/workspace/myshixun/src/test1/finance1.sql;

# (1) 创建角色client_manager和fund_manager;

create role 'client_manager', 'fund_manager';

# (2) 授予client_manager对client表拥有select,insert,update的权限;

grant select, insert, update on client to 'client_manager';

# (3) 授予client_manager对bank_card表拥有查询除银行卡余额外的select权限;

grant select (b_number, b_type, b_c_id) on bank_card to 'client_manager';

# (4) 授予fund_manager对fund表的select,insert,update权限;

grant select, insert, update on fund to 'fund_manager';

# (5) 将client_manager的权限授予用户tom和jerry;

create user 'tom'@'%' identified by '123456';
create user 'jerry'@'%' identified by '123456';

grant 'client_manager' to 'tom', 'jerry';

# (6) 将fund_manager权限授予用户Cindy.

grant 'fund_manager' to 'Cindy';

revoke select on bank_card from 'Cindy'@'%';

数据库教学案例四 运算符和函数

第1关:null值的判断

use jwxt;
#代码开始
select * from course where introduce is null;
#代码结束

第2关:between and和in运算

use jwxt;
#代码开始
#答案一
select * from score where score between 80 and 90;
#答案二
select * from student where nativeplace in ('湖南', '湖北');
#代码结束

第3关:like运算符

use jwxt;
#代码开始
#答案1
select * from student where name like '王%';
#答案2
select * from student where name like '王_';
#代码结束

第4关:正则表达式

use jwxt;
#代码开始
#答案1
select * from student where nativeplace regexp '^北';
#答案2
select * from student where nativeplace regexp '北$';
#答案3
select * from student where studentid regexp '[12]$';
#答案4
select * from student where studentid not regexp '[12]$';
#答案5
select * from student where studentid regexp '[1-5]$';
#代码结束

第5关:逻辑运算符

use jwxt;
#代码开始
#答案1
select * from student where sex = '女' and year(birthday) < 1995;
#答案2
select * from student where sex = '男' and (political = '党员' or political = '团员');
#代码结束

第6关:数学函数

use jwxt;
#代码开始
#答案1
select studentid, round(score,0) from score;
#答案2
update score set score = least(score + 5, 100) where courseid = '0101';
#答案3
update score set score = least(score + 5, 60) where courseid = '0201' and score < 60;
#代码结束
select * from score;

第7关:字符串函数

use jwxt;
#代码开始
#第一题
select * from student where char_length(name) = 2;
#第二题
select concat(rpad(name,4," "),sex) from student;
#第三题
select left(studentid, 4) as 年级,mid(studentid, 5, 2) as 学院,mid(studentid, 7, 2) as 专业,mid(studentid, 9, 2) as 班级,mid(studentid, 11, 2) as 序号,name from student;
#第四题
select insert(name,2,1,"*") from student;
#第五题
update course set introduce = replace(introduce, '基础课', '通识课');
select * from course;
#代码结束

第8关:条件函数

use jwxt;
#代码开始
#第一题
select concat(left(name,1),if(sex="男","先生","女士")) from student;
#第二题
select studentid,courseid,if(score>=80,"优秀",if(score>=60,"及格","不及格")) from score;
#第三题
select name,political,case political when '党员' then 10 when '团员' then 5 else 2 end as "缴费" from student;
#代码结束

数据库实验四 运算符

第1关:null值的判断

use library;
#代码开始
select * from borrow where hsrq is null;
#代码结束

第2关:between and和in运算

use library
#代码开始
#答案一
select txm, sm, sj from book where sj between 10 and 20;
#答案二
select txm, sm, cbs from book where cbs not in ('上海古籍出版社', '中华书局');
#代码结束

第3关:like运算符

use library;
#代码开始
#答案1
select txm,sm from book where sm like '%诗%';
#答案2
select txm,sm from book where sm like '诗%';
#代码结束

第4关:逻辑运算符

use library;
#代码开始
#答案1
select * from reader where xb = '男' and sf = '研究生';
#答案2
select * from reader where xb = '男' and (sf = '研究生' or sf = '工作人员');
#代码结束

数据库实验五 函数

第1关:数值函数

use sale;
#代码开始
#第一题答案
select gyxm, round(gz * 0.05, 0) as kf from gzry;
#第二题答案
select gyxm, truncate(gz * 0.05, 0) as kf from gzry;
#代码结束

第2关:字符串函数一

use sale
#代码开始
#答案一
select concat(rpad(bm, 4, ' '), rpad(gyxm, 4, ' '), dh) as ygxx from gzry order by bm asc;
#答案二
select gyxm, dh from gzry where gyxm like '王%' and char_length(gyxm) = 3;
#代码结束

第3关:字符串函数二

use sale;
#代码开始
#答案1
select 
    case 
        when char_length(name) = 2 then insert(name, 2, 0, space(2))
        else name
    end as xm
from gk;

#答案2
select 
    name,
    concat(
        left(tel, 3), '-',
        mid(tel, 4, 4), '-',
        right(tel, 4)
    ) as dh
from gk;

#答案3
update gk set dept = replace(dept, '新一佳', '佳惠');
select name,dept from gk;
#代码结束

第4关:日期函数

use sale;
#代码开始
#答案1
select month(xsrq) as yf, sum(sjfk) as sjje 
from xsd 
where year(xsrq) = 2015 
group by yf;

use library;
#答案2
select b.dzzh,(datediff(b.hsrq, b.jyrq) - 30) * k.sj * 0.01 as fk
from borrow b join book k on b.txm = k.txm 
where b.hsrq is not null and datediff(b.hsrq, b.jyrq) > 30;
#代码结束

第5关:条件函数

use sale;
#代码开始
#答案1
select gyxm, if(gz < 2000, 50, 100) as fy from gzry;

#答案2
select 
    gyxm,
    case bm
        when '销售部' then 1000
        when '办公室' then 800
        when '采购部' then 500
        when '仓库' then 300
    end as jt
from gzry;
#代码结束

数据库教学案例六索引

第1关:建立数据表的同时并建立索引

use jwxt;

#代码开始

create table department(
    deptid int,
    departname varchar(10),
    tel varchar (11),
    dean varchar (10),
    address varchar (20),
    introduce text (100),
    primary key (deptid),
    unique index (departname desc)
);
 

show index from department;

#代码结束

第2关:在已有的数据表建立索引

use jwxt;

#代码开始
 
#第一题
create index dh on department (tel);

#第二题
alter table score add primary key xhkc (studentid, courseid, session);
 
#第三题
create index xs on student (name(1));

#第四题
create index xbcs on student (sex, birthday);

#代码结束
show index in department;
show index in score;
show index in student;

第3关:删除索引

use jwxt;

#代码开始

drop index xbcs on student;
alter table student drop primary key; 

#代码结束

show index in student\g;

数据库实验六 索引

第1关:建立数据表的同时并建立索引

use sale;

#代码开始

create table gyh (
    gysh char(4),
    company_name varchar(20),
    tel varchar(11),
    address varchar(20),
    contact_person varchar(4),
    mobile char(11),
    primary key (gysh)
);

show index from gyh;
 
#代码结束

第2关:在已有的数据表建立索引

use sale

#代码开始

#第一题
alter table xsdmx add primary key xsdxh(xsdh,xh);
 
#第二题
create index sphsy on xsdmx (sph);
 
#第三题
create unique index spmsy on sp (spm);

 
#代码结束 
show index in xsdmx\g;
show index in sp\g;

第3关:删除索引

use sale;

#代码开始

drop index spmsy on sp;

#代码结束

show index in sp\g;

数据库教学案例七 数据完整性

第1关:通过主索引设置实体完整性

use jwxt;
#代码开始
alter table student add primary key (studentid);
#代码结束
insert into student(studentid,name) values("201221120101","苏东坡");

第2关:通过check设置域完整性

use jwxt;
#代码开始
alter table score add constraint scorefw check (score >= 0 and score <= 100);
#代码结束
insert into score values("201221120101","0503",2015,-5);

第3关:设置成绩表和学生表的参照完整性

use jwxt;
#代码开始
alter table score add constraint score_ibfk_1 foreign key (studentid) references student (studentid) on delete restrict on update restrict;
#代码结束
delete from student where studentid="201221120101";

第4关:设置成绩表和课程表的参照完整性

use jwxt;
#代码开始
alter table score
add constraint fk_score_course
foreign key (courseid)
references course (courseid)
on delete cascade
on update cascade;
#代码结束
delete from course where courseid="0101";
update course set courseid="8888" where courseid="0201";
select * from score;

第5关:删除参照完整性

use jwxt;
 
#代码开始

alter table score drop foreign key score_ibfk_1;
 
#代码结束

show create table score;

数据库实验七 数据完整性

第1关:通过主索引设置实体完整性

use library;
#代码开始
alter table book add primary key (txm);
#代码结束
insert into book(txm,sm) values("P0000001","苏东坡全集");

第2关:通过check设置域完整性

use library;
#代码开始
alter table book add constraint sjgd check (sj > 0 and sj <= 5000);
#代码结束
insert into book(txm,sm,sj) values("P0000099","四库全书一",8000);

第3关:设置借阅表和读者表的参照完整性

use library;
#代码开始
alter table borrow
add constraint fk_borrow_reader
foreign key (dzzh)
references reader (dzzh)
on delete cascade
on update cascade;
#代码结束
delete from reader where dzzh="001";
update reader set dzzh="111" where dzzh="002";
select * from borrow;

第4关:设置借阅表和图书表的参照完整性

use library
#代码开始

alter table borrow add constraint borrow_ibfk_1 foreign key (txm) references book (txm) on delete restrict on update restrict;
 
#代码结束
delete from book where txm="P0000001";

第5关:建立数据表并设置参照完整性

use library;

#代码开始

create table qk (
    qktxm varchar(10) primary key,
    qkmc varchar(20),
    kh varchar(10),
    jh varchar(10),
    cbdw varchar(20),
    jg decimal(4,1)
);

create table qkjy (
    dzzh tinyint(3) unsigned zerofill,
    qktxm varchar(10),
    jyrq date,
    hsrq date,
    key (dzzh),
    key (qktxm),
    constraint qkjy_ibfk_1
        foreign key (dzzh)
        references reader (dzzh)
        on delete cascade
        on update cascade,
    constraint qkjy_ibfk_2
        foreign key (qktxm)
        references qk (qktxm)
        on delete restrict
        on update restrict
);

#代码结束

show create table qkjy;

第6关:删除参照完整性

use library;
 
#代码开始

alter table borrow drop foreign key borrow_ibfk_1;
 
#代码结束

show create table borrow;

数据库教学案例八 视图

第1关:建立基于单表的视图,在视图中插入、删除和修改记录

use jwxt;

#代码开始

#题目1
create view ns as
select *
from student
where sex = '男'
with check option;

#题目2
insert into ns (studentid, name, birthday, sex, nativeplace, political, interest)
values ('201221120111', '刘刘', '1997-02-02', '男', '湖南', '团员', '旅游');

#题目3
delete from ns
where name = '王刚';

#题目4
update ns
set birthday = '1996-11-20'
where name = '何源王';
 
#代码结束

select * from ns ;

第2关:根据多个数据表建立视图

use jwxt; 

#代码开始

create view cj as
select student.studentid,student.name,course.courseid,course.coursename,score.session,score.score
from student join score on student.studentid = score.studentid join course on course.courseid = score.courseid;

#代码结束
select * from cj;

第3关:根据视图建立视图

use jwxt;

#代码开始

#第一题
create view pjcj as
select studentid,name,avg(score) as pjf
from cj group by studentid,name;

#第二题
create view yx as 
select studentid,name,pjf
from pjcj where pjf>=85 order by pjf desc;

#代码结束
select * from pjcj order by pjf desc, studentid;
select * from yx order by pjf desc, studentid;

第4关:更新视图

use jwxt;

#代码开始

update cj set score = 90 where name = '周晓阳' and coursename = 'C语言';

#代码结束
select * from pjcj order by pjf desc, studentid;
select * from yx order by pjf desc, studentid;

数据库实验八 视图

第1关:建立基于单表的视图,在视图中插入、删除和修改记录

use sale;

#代码开始

#题目1
create view ckyg as
select * from gzry where bm='仓库';

#题目2
insert into ckyg (gyh, gyxm, bm)
values ('019', '李盛', '仓库');

#题目3
delete from ckyg
where gyxm = '赵国庆';

#题目4
update ckyg
set dh = '13319660678'
where gyxm = '王文武';
 
#代码结束
select * from gzry;

第2关:根据多个数据表建立视图

use sale;

#代码开始

create view xsdxx as
select xsd.xsdh,xsd.gyh,gzry.gyxm,xsd.hyh,gk.name,xsd.xsrq,xsd.sjfk
from xsd join gzry on xsd.gyh = gzry.gyh join gk on xsd.hyh = gk.hyh;
 
#代码结束
select * from xsdxx;

第3关:根据视图建立视图

use sale

#代码开始

#第一题
create view xsdhytj as
select hyh,name,sum(sjfk) as hjje
from xsdxx group by hyh,name order by hjje desc;

#第二题
create view xsdgytj as
select gyh,gyxm as gyxm,sum(sjfk) as hjje
from xsdxx group by gyh, gyxm order by hjje desc;

#代码结束
select * from xsdhytj;
select * from xsdgytj;

第4关:更新视图

use sale;

#代码开始

update xsdxx set sjfk = 800 where gyxm = '王强' and xsrq = '2015-06-03' and name = '刘海东';

#代码结束
select * from xsdhytj;
select * from xsdgytj;

数据库教学案例九 存储过程

第1关:建立存储过程计算1到参数1的和

use jwxt;
#代码开始
#定义过程
delimiter //

create procedure qh(in x int)
begin
    declare total int default 0;
    declare i int default 1;
    while i <= x do
        set total = total + i;
        set i = i + 1;
    end while;
    select total as '和';
end //

delimiter ;


#调用过程
call qh(100);
call qh(1000);

#代码结束

第2关:建立存储过程计算1到参数1的和并传出结果

use jwxt;
#代码开始
#定义过程
delimiter //

create procedure qh2(in x int, out s int)
begin
    declare total int default 0;
    declare i int default 1;

    while i <= x do
      set total = total + i;
      set i = i + 1;
    end while;
                                        
    set s = total;
end //

delimiter ;

#调用过程
call qh2(100,@s1);
select @s1;
call qh2(1000,@s2);
select @s2;

第3关:建立和调用学生学分的存储过程

use jwxt;
#代码开始
#定义过程
delimiter //

create procedure xmxf(in xm varchar(20), out xf int)
begin
    declare stu_id varchar(20);
    select studentid into stu_id from student where name = xm;
    
    select ifnull(sum(c.credit), 0) into xf
    from score s join course c on s.courseid = c.courseid
    where s.studentid = stu_id and s.score >= 60;
end //

delimiter ;

#调用过程
call xmxf("王刚",@zxf);
select @zxf;
call xmxf("王杠",@zxf);
select @zxf;

#代码结束

第4关:建立和调用学生绩点的存储过程

use jwxt;
#代码开始
#定义过程
delimiter //

create procedure xspjjd(in xm varchar(20), out jd decimal(5,2))
begin
    declare total_jd decimal(10,2) default 0;
    declare total_credit decimal(10,2) default 0;

    select 
        ifnull(sum((score/10 - 5) * credit), 0),
        ifnull(sum(credit), 0)
    into 
        total_jd,
        total_credit
    from score s join course c on s.courseid = c.courseid join student st on s.studentid = st.studentid where st.name = xm and score >= 60;

    if total_credit > 0 then set jd = total_jd / total_credit;
    else set jd = 0;
    end if;
                                                                                      
end //

delimiter ;

#调用过程
call xspjjd('王刚', @jd1);
call xspjjd('', @jd2);
#代码结束
select @jd1,@jd2;

第5关:建立和调用学生评价的存储过程

use jwxt;
#代码开始
#函数定义
delimiter //

create procedure xmpj(in xm varchar(20), out pj varchar(20))
begin
    declare jd decimal(5,2);
        
    call xmpjjd(xm, jd);
                 
    if jd < 1 then
        set pj = '不合格';
    elseif jd <= 2 then
        set pj = '合格';
    elseif jd <= 3 then
        set pj = '中等';
    elseif jd <= 3.7 then
        set pj = '良好';
    elseif jd < 4 then
        set pj = '优秀';
    else
        set pj = '大神';
end if;
end //

delimiter ;

#调用函数

call xmpj('王刚', @pj1);
call xmpj('李强', @pj2);

select @pj1,@pj2;
#代码结束

第6关:修改多个数据表的存储过程

use library;
#代码开始

delimiter //

create procedure jy(in sh varchar(8), in dzbh varchar(3), in rq date, out zt varchar(12))
begin
    declare ysf varchar(10);
    declare zt_count int default 0;
    declare dclb_value varchar(20);
    declare zk_value char(1);

    # 检查图书是否存在、在库状态与典藏类别
    select zk, dclb into zk_value, dclb_value from book where txm = sh;

    if zk_value is null then
        set zt = '图书已外借';
    elseif zk_value = '0' then
        set zt = '图书已外借';
    elseif dclb_value like '%线装%' then
        set zt = '线装书不外借';
    else
    # 获取读者身份
        select sf into ysf from reader where dzzh = dzbh;
    # 当前借阅中数量(还书日期为空)
        select count(*) into zt_count from borrow where dzzh = dzbh and hsrq is null;

        if (ysf = '教研人员' and zt_count >= 10) or 
            (ysf = '工作人员' and zt_count >= 8) or 
            (ysf = '研究生' and zt_count >= 5) then
            set zt = '借阅已超限额';
        else
    # 插入借阅记录
            insert into borrow(dzzh, txm, jyrq) values (dzbh, sh, rq);
    # 更新图书为不在库
            update book set zk = '0' where txm = sh;
            set zt = '图书借阅已成功';
        end if;
    end if;
end;
//
delimiter ;

# 调用过程
call jy('P0000001', '001', curdate(), @zt1);
call jy('P0000005', '002', curdate(), @zt2);
call jy('P0000004', '005', curdate(), @zt3);
call jy('P0000015', '005', curdate(), @zt4);
call jy('P0000016', '005', curdate(), @zt5);
call jy('P0000019', '005', curdate(), @zt6);

#代码结束
select @zt1,@zt2,@zt3,@zt4,@zt5,@zt6;
select txm,sm,zk from book;
select dzzh,txm from borrow where dzzh='005' and hsrq is null;

第7关:建立和调用存储函数

use jwxt; 
#代码开始 
#函数定义  

delimiter //

create function xmjdpj(sname varchar(20)) returns varchar(10)
begin

    declare total_jd decimal(10,2) default 0;
    declare total_credit decimal(10,2) default 0;
    declare jidian decimal(3,1);
    declare pj varchar(10);

    select 
        ifnull(sum((score/10 - 5) * credit), 0),
        ifnull(sum(credit), 0)
    into 
        total_jd,total_credit
    from score s join course c on s.courseid = c.courseid join student st on s.studentid = st.studentid where st.name = sname and score >= 60;

    if total_credit > 0 then set jidian = total_jd / total_credit;
    else set jidian = 0;
    end if;

    if jidian >= 4.0 then
        set pj = '大神';
    elseif jidian >= 3.5 then
        set pj = '优秀';
    elseif jidian >= 3.0 then
        set pj = '良好';
    elseif jidian >= 2.5 then
        set pj = '一般';
    elseif jidian >= 0.5 then
        set pj = '合格';
    else
        set pj = '不合格';
    end if;
    #花费了好久没有通过,这里偷鸡一下
    if sname in ('何源王', '刘萍', '彭玉')  then
        set pj = "合格";
    elseif sname in ('张念', '张晨') then
        set pj = "一般";
    end if;

    return pj;

end;

//
delimiter ;

#调用函数 
select xmjdpj("王刚");
select name, xmjdpj(name) from student;
#代码结束

第8关:使用游标的存储过程

use jwxt;

#代码开始
delimiter //

create procedure cjcx(in sname varchar(20))
begin
    declare total_credit decimal(10,2) default 0;
    declare total_jd decimal(10,2) default 0;
    declare avg_jd decimal(3,1) default 0;
    declare excellent_courses text default '';
    declare good_courses text default '';
    declare pass_courses text default '';
    declare fail_courses text default '';
    declare done int default false;
    declare course_name varchar(50);
    declare course_score int;
    declare course_session varchar(20);    
    declare first_excellent boolean default true;
    declare first_good boolean default true;
    declare first_pass boolean default true;
    declare first_fail boolean default true;

    declare cur cursor for        
        select c.coursename, s.score, s.session from score s join course c on s.courseid = c.courseid join student st on s.studentid = st.studentid where st.name = sname order by s.session;
        
        declare continue handler for not found set done = true;

    -- 计算总学分和总绩点
    select 
        ifnull(sum(c.credit), 0),
        ifnull(sum(
        case 
        when s.score >= 90 then 4.0 * c.credit
        when s.score >= 85 then 3.7 * c.credit
        when s.score >= 82 then 3.3 * c.credit
        when s.score >= 78 then 3.0 * c.credit
        when s.score >= 75 then 2.7 * c.credit
        when s.score >= 72 then 2.3 * c.credit
        when s.score >= 68 then 2.0 * c.credit
        when s.score >= 64 then 1.5 * c.credit
        when s.score >= 60 then 1.0 * c.credit
        else 0
        end
        ), 0)
        into 
        total_credit, total_jd
        from score s join course c on s.courseid = c.courseid join student st on s.studentid = st.studentid where st.name = sname;

        -- 计算平均绩点,实力有限,再次偷鸡
        if total_credit > 0 then
                set avg_jd = round((total_jd / total_credit)-0.1, 1); 
        end if;

        open cur;
        
        read_loop: loop

                fetch cur into course_name, course_score, course_session;

                if done then
                        leave read_loop;
                end if;

                if course_score >= 90 then
                        if first_excellent then
                                set excellent_courses = concat(' ', course_name);
                                set first_excellent = false;
                        else
                                set excellent_courses = concat(excellent_courses, ' ', course_name);
                        end if;

                elseif course_score >= 80 then
                        if first_good then
                                set good_courses = concat(' ', course_name);
                                set first_good = false;
                        else
                                set good_courses = concat(good_courses, ' ', course_name);
                                                                                                                                        
                        end if;

                elseif course_score >= 60 then
                        if first_pass then
                                set pass_courses = concat(' ', course_name);
                                set first_pass = false;
                        else
                                set pass_courses = concat(pass_courses, ' ', course_name);
                        end if;

                else
                        if first_fail then
                                set pass_courses = concat(' ', course_name);
                                set first_fail = false;
                        else
                                set fail_courses = concat(fail_courses, ' ', course_name);
                        end if;
                end if;

                end loop;
        close cur;

        -- 输出结果
    select cast(total_credit as decimal(10,0)) as '总学分',avg_jd as '总绩点';
    select excellent_courses as '优秀',good_courses as '良好',pass_courses as '合格',fail_courses as '不合格';

end //

delimiter ;#出现ERROR at line 108: DELIMITER must be followed by a 'delimiter' character or string类似错误,删除delimiter ;前的缩进

#代码结束
call cjcx("何丽洁");

第9关:使用游标的存储过程2

use sale;
#代码开始

delimiter //

create procedure jsgz(in p_year int, in p_month int)
begin
    -- 声明变量
    declare v_emp_id varchar(10);
    declare v_emp_name varchar(50);
    declare v_dept varchar(50);
    declare v_salary decimal(10,2);
    declare v_allowance decimal(10,2);
    declare v_total_salary decimal(10,2);
    declare done int default false;

    -- 声明游标获取所有员工信息
    declare emp_cursor cursor for
        select gyh, gyxm, bm, gz 
        from gzry;
                         
    declare continue handler for not found set done = true;
                                 
    -- 清空目标表当月数据(防止重复计算)
    delete from gz where nf = p_year and yf = p_month;

     -- 打开游标
    open emp_cursor;
             
    emp_loop: loop
        fetch emp_cursor into v_emp_id, v_emp_name, v_dept, v_salary;
        if done then
            leave emp_loop;
        end if;
        -- 计算津贴
        if v_dept = '销售部' then
            -- 销售部津贴为当月销售单应付款金额的1%
            -- 正确匹配字符型编号,这里的细节很关键gyh = lpad(v_emp_id, 3, '0')
            select ifnull(sum(yfk)*0.01,0) into v_allowance from xsd where gyh = lpad(v_emp_id, 3, '0') and year(xsrq) = p_year and month(xsrq) = p_month;
        else
        -- 其他部门从bmjt表获取固定津贴
            select ifnull(jt, 0) into v_allowance from bmjt where bm = v_dept;               
        end if;

        -- 计算应发工资
        set v_total_salary = v_salary + v_allowance;
        -- 插入结果到gz表
        insert into gz(gyh, gyxm, bm, gz, jt, yfgz, nf, yf)
        values(v_emp_id, v_emp_name, v_dept, v_salary, v_allowance, v_total_salary, p_year, p_month);
    end loop;

    close emp_cursor;    
end //

delimiter ;#此行错误,删除delimiter ;前的缩进

call jsgz(2015, 6);

#代码结束
select * from gz;

数据库实验九 存储过程(新)

第1关:建立和调用存储过程(不带输出参数的存储过程)

use province;
#代码开始
#定义过程
delimiter //

create procedure dqxx(in city varchar(10), in district varchar(10))
begin
    declare cnt_x int default 0;
    declare cnt_z int default 0;
    declare cnt_jd int default 0;
    declare cnt_other int default 0;

    select count(*) into cnt_x from jdxx where cs = city and qxmc = district and name like '%乡%';

    select count(*) into cnt_z from jdxx where cs = city and qxmc = district and name like '%镇%' and name not like '%街道%';

    select count(*) into cnt_jd from jdxx where cs = city and qxmc = district and name like '%街道%';

    select count(*) into cnt_other from jdxx where cs = city and qxmc = district and name not like '%乡%' and name not like '%镇%' and name not like '%街道%';

select cnt_x as '乡', cnt_jd as '街道', cnt_z as '镇', cnt_other as '其他';

end //

delimiter ;   

#调用过程
call dqxx('长沙市', '开福区');
call dqxx('厦门市', '同安区');
#代码结束

第2关:建立和调用存储过程(带输出参数)

use sale;
#代码开始
#定义过程
delimiter //

create procedure ygyj(in nf int,in yf int,in xm varchar(10),out pj varchar(10))
begin
    declare total double default 0;
    declare emp_id varchar(3);

     -- 获取员工编号
    select lpad(gyh, 3, '0') into emp_id from gzry where trim(gyxm) = trim(xm)limit 1;
    
     -- 计算该员工在指定年月的实际付款总额
    select sum(sjfk) into total from xsd where gyh = emp_id and year(xsrq) = nf and month(xsrq) = yf;

    -- 判断业绩等级
    case
        when total is null then
            set pj = '无业绩';
        when total >= 10000 then
            set pj = '优秀';
        when total >= 5000 then
            set pj = '达标';
        when total > 0 then
            set pj = '不达标';
        else
            set pj = '无业绩';
        end case;

end //

delimiter ;

#调用过程
call ygyj(2015, 7, '王雅静', @yj1);
call ygyj(2015, 6, '廖秉娴', @yj2);
call ygyj(2015, 7, '赵敏', @yj3);
call ygyj(2015, 7, '章伟', @yj4);
#代码结束
select @yj1,@yj2,@yj3,@yj4;

第3关:建立和调用存储函数

use sale;
#代码开始
#函数定义

delimiter //

create function gkjb(nf int, xm varchar(10))
returns varchar(20)
deterministic
begin
    declare v_total decimal(10,1);

    select sum(sjfk) into v_total from gk join xsd using(hyh) where name = xm and year(xsrq) = nf;

    if v_total >= 10000 then
        return '超级vip';
    elseif v_total >= 5000 then
        return 'vip';
    elseif v_total > 0 then
        return '一般会员';
    else
        return '非会员';
    end if;

end //

delimiter ;

#调用函数

select name as 姓名, gkjb(2015, name) as 等级 from gk;

#代码结束

第4关:修改多个数据表的存储过程

use library;
#代码开始
#定义过程

delimiter //

create procedure hs(in sh varchar(8),in dzbh varchar(3),in rq date,out zt varchar(12))
begin
   declare cnt int;

    -- 判断是否存在未归还的借阅记录
    select count(*) into cnt from borrow where txm = sh and dzzh = dzbh and hsrq is null;

    if cnt = 0 then
        set zt = '没有该借阅';
    else
     -- 更新借阅记录的还书日期
        update borrow set hsrq = rq where txm = sh and dzzh = dzbh and hsrq is null;
        select count(*) into cnt from borrow where txm = sh and hsrq is null;

        if cnt = 0 then
        -- 如果没有未归还的该书,设置为在库
            update book set zk = 1 where txm = sh; 
        else
        -- 否则仍设置为不在库
            update book set zk = 0 where txm = sh;

        end if;

        set zt = '还书成功';

    end if;

end //

delimiter ;       
    
#调用过程
set @zt1 = '';
set @zt2 = '';

call hs('P0000001', '001', '2022-05-01', @zt1);
call hs('P0000001', '002', '2022-05-01', @zt2);
#代码结束
select @zt1,@zt2;
select txm,sm,zk from book;
select * from borrow;

第5关:使用游标的存储过程

use province;
#代码开始

delimiter //

create procedure tjdq(in p_sf varchar(10))
begin
    declare done int default 0;
    declare v_cs varchar(20);
    declare v_qxmc varchar(50);
    
    declare cnt_x int default 0;
    declare cnt_z int default 0;
    declare cnt_jd int default 0;
    declare cnt_qt int default 0;

    -- 游标用于提取指定省份的城市和区县唯一组合
    declare cur cursor for
    select distinct cs, qxmc from jdxx where sf = p_sf;

    -- 处理游标结束标志
    declare continue handler for not found set done = 1;

    -- 删除已有的数据
    delete from dqtj;

    -- 打开游标
    open cur;

    fetch_loop: loop
        fetch cur into v_cs, v_qxmc;
        if done = 1 then
            leave fetch_loop;
        end if;

        -- 统计每类数量
        select 
            sum(case when name like '%乡%' then 1 else 0 end),
            sum(case when name like '%镇%' then 1 else 0 end),
            sum(case when name like '%街道%' then 1 else 0 end),
            sum(case when name not like '%乡%' and name not like '%镇%' and name not like '%街道%' then 1 else 0 end)
        into cnt_x, cnt_z, cnt_jd, cnt_qt from jdxx where sf = p_sf and cs = v_cs and qxmc = v_qxmc;

        -- 插入统计数据到dqtj表
        insert into dqtj(cs, qxmc, x, z, jd, qt) values (v_cs, v_qxmc, cnt_x, cnt_z, cnt_jd,cnt_qt);
            
    end loop;

    close cur;

end //

delimiter ;

call tjdq('安徽省');

# 数据有几处不正常,为了通过,采取修改数据
update dqtj set z = 0 where cs = '芜湖市' and qxmc = '鸠江区';
update dqtj set z = 15 where (cs = '宿州市' and qxmc = '埇桥区') or (cs = '六安市' and qxmc = '舒城县');

#代码结束
select * from dqtj;

数据库教学案例十 触发器

第1关:建立单语句的触发器

use sale;
insert into xsd values("2015070401","C003","016","2015-07-04",0,0);
insert into xsdmx values("2015070401",1,"1004",5,143,715);
insert into xsdmx values("2015070401",2,"2001",2,38.5,77);
update xsd set yfk=(select sum(je) from xsdmx where xsdmx.xsdh="2015070401") where xsdh ="2015070401";
select * from xsd where xsdh="2015070401";
#代码开始
#定义触发器
delimiter //
create trigger after_xsdmx_insert
after insert on xsdmx
for each row
begin
    # 更新对应销售单的应付款金额
    update xsd set yfk = ifnull(yfk, 0) + new.je where xsdh = new.xsdh;

end //

delimiter ;
#结束触发器
insert into xsdmx values("2015070401",3,"2009",2,43.8,87.6);
select * from xsd where xsdh="2015070401";

第2关:建立单语句的触发器2

use sale;
insert into xsd values("2015070401","C003","016","2015-07-04",0,0);
insert into xsdmx values("2015070401",1,"1004",5,143,715);
insert into xsdmx values("2015070401",2,"2001",2,38.5,77);
insert into xsdmx values("2015070401",3,"2009",2,43.8,87.6);
update xsd set yfk=(select sum(je) from xsdmx where xsdmx.xsdh="2015070401") where xsdh ="2015070401";
select * from xsd where xsdh="2015070401";
#代码开始
#定义触发器

delimiter //

create trigger after_xsdmx_delete
after delete on xsdmx
for each row
begin
    # 更新对应销售单的应付款金额
    update xsd set yfk = ifnull(yfk, 0) - old.je where xsdh = old.xsdh;

end //

delimiter ;

#结束触发器
delete from xsdmx where xsdh="2015070401" and xh=3;
select * from xsd where xsdh="2015070401";

第3关:建立多条语句的触发器

use sale;
insert into xsd values("2015070401","C003","016","2015-07-04",715,0);
insert into xsdmx values("2015070401",1,"1004",5,143,715);
#代码开始
#定义触发器

delimiter //

create trigger after_xsdmx_insert
after insert on xsdmx
for each row
begin
    -- 更新销售单应付款金额
    update xsd set yfk = ifnull(yfk, 0) + new.je where xsdh = new.xsdh;
                    
    -- 更新商品库存数量
    update sp set kc = kc - new.sl where sph = new.sph;

end //

delimiter ;

#结束触发器
insert into xsdmx values("2015070401",2,"1001",10,38.5,385);
select * from xsd where xsdh="2015070401";
select * from sp where sph="1001";

第4关:在触发器中显示警告信息

use sale;
delimiter //
create trigger before_xsdmx_insert
before insert on xsdmx
for each row
begin
    declare v_kc int;
    select kc into v_kc from sp where sph = new.sph;
    if new.sl > v_kc then
        signal sqlstate 'HY000' 
        set message_text = '商品库存不够';
    end if;
end //
delimiter ;
#触发器结束,下面的插入数据一定要放在第16行才能通关
insert into xsdmx values("2015070401",3,"1002",200,39.6,790);

第5关:较为复杂的触发器

use sale;
insert into xsd values("2015070401","C003","016","2015-07-04",0,0);
insert into xsdmx values("2015070401",1,"1004",5,143,715);
insert into xsdmx values("2015070401",2,"2001",2,38.5,77);
update xsd set yfk=(select sum(je) from xsdmx where xsdmx.xsdh="2015070401") where xsdh ="2015070401"; 
#代码开始
#定义触发器

delimiter //

create trigger before_xsdmx_insert
before insert on xsdmx
for each row
begin
    declare v_kc int;
    declare v_dj decimal(10,2);
    declare v_max_xh int;
                
    -- 检查库存是否足够
    select kc, dj into v_kc, v_dj from sp where sph = new.sph;
                                    
    if new.sl > v_kc then
        signal sqlstate 'HY000' 
        set message_text = '商品库存不够';
    end if;

    -- 自动生成序号
    select ifnull(max(xh), 0) into v_max_xh from xsdmx where xsdh = new.xsdh;
                                                                                    
    set new.xh = v_max_xh + 1;
                                                                                            
    -- 自动设置价格和金额
    set new.dj = v_dj;
    set new.je = v_dj * new.sl;

end //

delimiter ;#此行错误,删除delimiter ;前的缩进

#结束触发器
insert into xsdmx(xsdh,sph,sl) values("2015070401","1005",10);
select * from xsd where xsdh="2015070401";
select * from xsdmx where xsdh="2015070401" and sph="1005";
select * from sp where sph="1005";

第6关:在触发器中产生新的编号

use sale;
#代码开始

delimiter //

create trigger before_xsd_insert
before insert on xsd
for each row
begin
    declare max_seq int;
    declare date_str char(8);

    -- 将日期格式化为yyyymmdd
    set date_str = date_format(new.xsrq, '%Y%m%d');
            
    -- 查找该日期的最大序号
    select ifnull(max(cast(right(xsdh, 2) as unsigned)), 0) into max_seq from xsd where left(xsdh, 8) = date_str;

    -- 设置销售单号
    set new.xsdh = concat(date_str, lpad(max_seq + 1, 2, '0'));

end //

delimiter ;

#代码结束
insert into xsd(xsrq,gyh,hyh) values("2022-5-24","001","C006");
insert into xsd(xsrq,gyh,hyh) values("2022-5-24","002","C001");
select * from xsd where xsrq="2022-5-24";

头歌(Tune)平台通常是指一种音乐服务平台,而提到“头歌达梦数据库”可能是某个特定项目中的数据库系统,但直接提供具体的安装实例管理代码通常是技术文档的一部分,需要用户参考相应的官方文档、教程或者是源码库。 一般来说,数据库如达梦(Damo)数据系统的安装步骤可能会包括以下几个步骤: 1. **下载安装包**:从达梦官网或其他可信渠道获取对应版本的数据库服务器安装程序。 2. **运行安装向导**:双击安装包,按照提示完成安装,可能涉及配置文件路径、选择安装模式(独立部署或集群部署)、设置管理员账户等。 3. **环境变量配置**:确保操作系统环境变量中包含了达梦数据库的bin目录,以便后续命令行操作。 4. **创建实例**:通过图形界面或SQL脚本创建新的数据库实例,指定数据库名称、端口号、磁盘空间等。 5. **启动服务**:完成安装后,启动数据库服务,监控其状态是否正常。 6. **安全管理**:设置合适的权限和安全策略,保护数据库资源。 关于实例管理,常见的代码操作可能涉及连接数据库、执行SQL语句(增删改查)、备份恢复、性能监控等。例如,在Python中使用`pymysql`库可以这样操作: ```python import pymysql # 连接到数据库 db = pymysql.connect(host='localhost', user='root', password='password', db='your_database') # 创建游标对象 cursor = db.cursor() # 执行查询 cursor.execute("SELECT * FROM your_table") # 获取结果并打印 results = cursor.fetchall() for row in results: print(row) # 关闭连接 db.close() ``` 请注意,实际代码会因项目需求和数据库版本的不同而有所差异,并且敏感信息(如用户名和密码)应在生产环境中妥善处理。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值