mysql数据库创建,编写,查询,自定义函数实战案例
创建汽车修理数据库,并完成数据库编写:
本文分三个部分,第一部分为数据库的创建编写和基础查询,第二部分为关联查询等复杂查询方法,第三部分为存储过程的创建和自定义函数方法,难度逐渐提高,建议初学者可以分层次学习掌握,高手也可以通过目录快速查询。程序都有注释,这里不多赘述了,如果觉得写的还可以,麻烦点赞关注一下哦,您的关注是我最大的动力!
软件版本: Mysql 8.0 Navicat for mysql 16.1.3
目录
第一部分:数据库及表文件的建立和基本操作
1.由提供的表格建立包含在QCXL数据库中的汽车维修表QCWX。
2.显示QCWX的结构。
3.查询记录:
3.1显示QCWX表的所有记录;
3.2显示维修编号为‘1003’的记录;
3.3查询所有维修价格在1000以上维修记录的维修编号、修理项目及送修日期;
3.4查询所有送修日期在2022年11月的维修编号、车牌号、是否完成及维修说明;
3.5显示所有未完成的维修记录信息。
4.增加一个“送修车间”的字段,字段属性及值自定。
5.将sfwc字段的值为‘T’的修改为‘维修完成’,sfwc字段的值为‘F’的修改为‘维修未完成’。
6.用修改命令将所有2022年10月送修但未完成的维修费用打8折。
7.复制QCWX表的结构
8.复制表QCWX结构及2022年11月的维修记录。
9.创建按照wxfy升序排列的索引。
10.创建按照sfwc升序排列、再按照wxfy降序排序的索引。
第二部分:数据库及表的查询和应用
11. 创建如下结构的零件库存表(LJKC)。
12.为零件库存表(ljkc)的库存量( kcl)设置索引,要求降序排列。
13.为零件库存表(ljkc)的标准件(bzj)和价格(jg)设置索引。
14.删除题3建立的索引。
15.用SELECT语句显示从第2条记录到第6条记录的ljh,ljmc,kcl,rkri, 查询结果用中文名表示各字段变量名,即显示为:零件号,零件名称,库存量,入库日期,并要求显示结果按“入库日期”降序排列。
16.创建视图获取零件库存表(ljkc)中2022年9月入库的零件数据,并将字段名改为中文。
17.通过视图向ljkc表中添加一条记录,数据自拟。
18.删除题7添加的记录。
19.查询零件库存表(ljkc)中500<1000之间的零件信息。<>
20.为LJKC表取别名为KC,查询零件号为“20003”的入库日期。
21.查询汽车维修表(QCWX)中以字母‘A’开头的车牌号的记录相关信息。
22.查询送修日期在2022 年10月且已完成维修的汽车信息。
23.查询修理项目为“大修”或“换轮胎”的记录。
24.查询汽车维修表(QCWX)中最高的维修费用、最低维修费用及平均维修费用。
25.建立如下结构的零件明细表(LJMX)。其关系模式为:LJMX(wxbh,ljbh,sysl)。
25.1.查询零件明细表(LJMX)中每条维修记录使用零件的总数量。
25.2. 查询维修编号为“1001”的车牌号、送修日期、使用零件编号及每种零件的使用数量。
25.3. 查询汽车维修表(QCWX)中维修费用在500元以上的维修编号、修理项目、维修费用及零件明细表(LJMX)中的零件编号、使用数量及零件库存表(LJKC)的零件号、零件名称及价格。
26.创建新表(zhb),要求该表包括以下字段:零件编号,零件名称,价格,库存量,标准件,入库日期、维修编号、使用数量;并要求该表中包含所有合理的记录。
第三部分:自定义函数和存储过程创建
27.创建存储过程 proc_sum(IN n INT,OUT sum INT):求出 n(n>0)内所有质数并输出,同时计算所有质数之和,并输出结果。
28.已知数据库 QCXL 中有以下三个表:
28.1.创建一个存储过程,对汽车维修表(QCWX)中的零件数量(ljsl)进行修改:对于未完成维修的记录,零件数量修改为 0;对于已完成维修的记录,其零件数量由零件明细表中统计录入。
28.2.创建一个存储过程 proc_insert( ):向零件明细表(LJMX)中插入一条记录,数据自拟。创建另一存储过程 proc_query( ):调用已创建好的存储过程 proc_insert(),并查询 wxbh 为’101’和’1006’的记录信息。
28.3.创建存储过程,更新零件库存表:库存量(kcl)=库存量(kcl)-使用数量(sysl),并查询库存量(kcl)少于 20 的零件信息。
28.4.创建自定义函数 func_count(IN wxbh INT):要求根据维修编号统计使用零件个数并返回。
29.在 STUDENT 数据库中,创建名称为 USER 的表,包含三个字段:用户编号(uid, INT, AUTO_INCREMENT NOT NULL PRIMARY KEY ), 用 户 名 (user,VARCHAR(10)) , 密 码(password,VARCHAR(10)),任意输入三条记录。再创建一个用户权限验证自定义函数,包含两个参数:用户名和用户密码,根据表 USER 中记录,判断输入用户的登录信息:合法返回 1,否则返回 0。
全代码展示
总结
第一部分:数据库及表文件的建立和基本操作
1.由提供的表格建立包含在QCXL数据库中的汽车维修表QCWX。
其表结构如下:
字段名 | 数据类型 | 长度 | 是否空值 | 主键外键 | 备注 |
wxbh | CHAR | 4 | NO | 主键 | 维修编号 |
cph | CHAR | 8 | NO | 车牌号 | |
xlxm | VARCHAR | 10 | 修理项目 | ||
sxrq | DATE | 送修日期 | |||
wxfy | DECIMAL | DECIMAL(8,1) | 维修费用 | ||
ljsl | INT | 4 | 零件数量 | ||
sfwc | CHAR | 1 | 是否完成 | ||
wxsm | VARCHAR | 20 | 维修说明 |
汽车维修表
wxbh | cph | xlxm | sxrq | wxfy | ljsl | sfwc | wxsm |
1001 | C3542186 | 大修 | 2022-10-03 | 21000 | 15 | T | 车祸送修 |
1002 | K3337667 | 转动轴 | 2022-10-07 | 4800 | 2 | F | 换转动轴 |
1003 | A2020203 | 火花塞 | 2022-10-09 | 280 | 8 | T | 保养 |
1004 | B3456782 | 刹车 | 2022-11-01 | 360 | 5 | F | 前轮刹车片磨损 |
1005 | H2105100 | 反光镜 | 2022-11-12 | 800 | 2 | T | 反光镜碎裂 |
1006 | A1212568 | 换轮胎 | 2022-11-15 | 1400 | 2 | T | 换后面两条轮胎 |
create database QCXL;
#用create database语句创建数据库,命名为qcxl
use QCXL;
#用use语句使用该数据库
create table qcwx(
wxbh char(4) not null primary key comment'维修编号',
cph char(8) not null comment'车牌号',
xlxm varchar(10) comment'修理项目',
sxrq date comment'送修日期',
wxfy decimal(8,1) comment'维修费用',
ljsl int(4) comment'零件数量',
sfwc char(1) comment'是否完成',
wxsm varchar(20) comment'维修说明'
);
#在该数据库下创建表,命名为qcwx,并创建数据库结构。
engine=InnoDB default charset=utf8;
#定义格式,搜索引擎默认,编码格式默认,一般会默认不需要这个语句
alter table qcwx convert to character set utf8;
#如果还不能输入汉字说明定义无效可以用这个,一般5以前的版本会出现这个问题。
insert into qcwx values('1001','C3542186','大修','2022-10-03','21000','15','T','车祸送修');
insert into qcwx values('1002','K3337667','传动轴','2022-10-07','4800','2','F','换传动轴');
insert into qcwx values('1003','A2020203','火花塞','2022-10-09','280','8','T','保养');
insert into qcwx values('1004','B3456782','刹车','2022-11-01','360','5','F','前轮刹车片磨损');
insert into qcwx values('1005','H2105100','反光镜','2022-11-12','800','2','T','反光镜碎裂');
insert into qcwx values('1006','A1212568','换轮胎','2022-11-15','1400','2','T','换后面两条轮胎');
#录入六行数据。
2.显示QCWX的结构。
desc qcwx;
#查询表结构,看结构是否正确,注意这里用desc查询只显示结构没有内容。
3.查询记录:
3.1显示QCWX表的所有记录;
Select*from qcwx;
#select语句查询表内容
3.2显示维修编号为‘1003’的记录;
Select*from qcwx where wxbh=1003;
#查询编号1003列
3.3查询所有维修价格在1000以上维修记录的维修编号、修理项目及送修日期;
Select wxbh,xlxm,sxrq from qcwx where wxfy>'1000';
#查询维修费用大于1000的几个项目
3.4查询所有送修日期在2022年11月的维修编号、车牌号、是否完成及维修说明;
Select wxbh,cph,sfwc,wxsm from qcwx where sxrq like '2022-11%';
#查询2022年11月的记录,like可用于通配符的查询,%为通配符
3.5显示所有未完成的维修记录信息。
Select wxbh,cph,sfwc,wxsm from qcwx where sfwc='F';
#查询未完成的记录
4.增加一个“送修车间”的字段,字段属性及值自定。
alter table qcwx
add column sxcj char(8) comment'送修车间';
#alter修改表结构,add column结构增加一个字段
5.将sfwc字段的值为‘T’的修改为‘维修完成’,sfwc字段的值为‘F’的修改为‘维修未完成’。
alter table qcwx
modify column sfwc char(10);
#这里隐含了一步,首先要修改表,更改qcwx字段的字符长度。为下面的修改做准备
update qcwx set sfwc ='维修完成' where sfwc='T';
update qcwx set sfwc ='维修未完成' where sfwc='F';
#用UPDATE命令修改QCWX中的记录,更新T和F的值,注意怎么使用函数。
6.用修改命令将所有2022年10月送修但未完成的维修费用打8折。
update qcwx set wxfy=wxfy*0.8 where sxrq like '2022-10%' and sfwc='维修未完成';
#更新特定条件的值
7.复制QCWX表的结构
create table qcwx1 select*from qcwx where 1=2;
#仅复制表结构,注意如果去掉where 1=2 就是完整复制表。新表命名为qcwx1
8.复制表QCWX结构及2022年11月的维修记录。
create table qcwx2 as(
select*from qcwx where sxrq like '2022-11%'
);
#复制表的一部分内容到新表。新表命名为qcwx2
9.创建按照wxfy升序排列的索引。
Create index wxfy_index1 on qcwx(wxfy asc);
#创建索引,asc表示升序,命名为wxfy_index1
10.创建按照sfwc升序排列、再按照wxfy降序排序的索引。
Create index wxfy_index2 on qcwx(sfwc asc,wxfy desc);
#创建索引,在sfwc升的基础上令wxfy降序,desc表示降序,命名为wxfy_index2
当前数据库所有文件如下,注意,索引是包含在表里的,不具备单独的文件。
也可以用Navicat来直观创建和查看表格,这里主要面向编程开发,就不演示图形界面了
第二部分:数据库及表的查询和应用
11. 创建如下结构的零件库存表(LJKC)。
打开实例一创建的数据库文件:汽修厂数据库文件QCXL(汽车修理),创建如下结构的零件库存表(LJKC)。其关系模式为:LJKC(ljh,ljmc,jg,kcl,bzj,rkri,cjdm)。
字段名 | 数据类型 | 长度 | 是否空值 | 主键外键 | 备注 |
ljh | CHAR | 5 | NO | 主键 | 零件号 |
ljmc | VARCHAR | 20 | NO | 零件名称 | |
jg | DECIMAL | DECIMAL (7,2) | 零件价格 | ||
kcl | INT | 3 | 库存量 | ||
bzj | tinyint | 1 | 标准件 | ||
rkri | date | 入库日期 | |||
cjdm | CHAR | 4 | 厂家代码 |
零件库存表(LJKC)
ljh | ljmc | jg | kcl | bzj | rkri | cjdm |
20001 | 前灯 | 350 | 42 | 0 | 2022-09-01 | 5001 |
20002 | 方向盘 | 580 | 15 | 1 | 2022-09-15 | 5002 |
20003 | 离合器 | 750 | 8 | 0 | 2022-09-21 | 5003 |
20004 | 火花塞 | 120 | 285 | 1 | 2022-09-24 | 5003 |
20005 | 反光镜 | 180 | 86 | 0 | 2022-10-08 | 5001 |
20006 | 刹车片 | 268 | 135 | 0 | 2022-10-26 | 5006 |
20007 | 轮胎 | 780 | 500 | 1 | 2022-11-01 | 5008 |
20008 | 转动轴 | 1200 | 21 | 0 | 2022-11-13 | 5008 |
create table ljkc(
ljh char(5) not null primary key comment'零件号',
ljmc varchar(20) not null comment'零件名称',
jg decimal(7,2) comment'零件价格',
kcl int(3) comment'库存量',
bzj tinyint(1) comment'标准件',
rkri date comment'入库日期',
cjdm char(4) comment'厂家代码'
);
#创建表结构
insert into ljkc values('20001','前灯','350','42','0','2022-09-01','5001');
insert into ljkc values('20002','方向盘','580', '15','1','2022-09-15','5002');
insert into ljkc values('20003','离合器','750', '8','0','2022-09-21','5003');
insert into ljkc values('20004','火花塞','120', '285','1','2022-09-24','5004');
insert into ljkc values('20005','反光镜','180', '86','0','2022-10-08','5005');
insert into ljkc values('20006','刹车片','268', '135','0','2022-10-26','5006');
insert into ljkc values('20007','轮胎','780','500','1','2022-11-01','5007');
insert into ljkc values('20008','传动轴','1200','21','0','2022-11-13','5008');
#输入数据
select*from ljkc;
#查看表
12.为零件库存表(ljkc)的库存量( kcl)设置索引,要求降序排列。
create index kcl_index1 on ljkc (kcl desc);
13.为零件库存表(ljkc)的标准件(bzj)和价格(jg)设置索引。
create index bzjjg_index2 on ljkc (bzj asc,jg desc);
14.删除题3建立的索引。
drop index bzjjg_index2 on ljkc;
15.用SELECT语句显示从第2条记录到第6条记录的ljh,ljmc,kcl,rkri, 查询结果用中文名表示各字段变量名,即显示为:零件号,零件名称,库存量,入库日期,并要求显示结果按“入库日期”降序排列。
select ljh as'零件号',ljmc as'零件名称',kcl as'库存量',rkri as'入库日期'
from ljkc order by rkri desc limit 1,5;
16.创建视图获取零件库存表(ljkc)中2022年9月入库的零件数据,并将字段名改为中文。
create view ljkcview as select * from ljkc where rkri like '2022-09%';
#注意视图的创建方法
17.通过视图向ljkc表中添加一条记录,数据自拟。
insert into ljkcview values('20009','发动机','2200','22','0','2022-09-13','5009');
select*from ljkcview;
18.删除题7添加的记录。
delete from ljkcview where ljh=20009;
select*from ljkcview;
19.查询零件库存表(ljkc)中500<jg<1000之间的零件信息。
select*from ljkc where jg>500 and jg<1000;
20.为LJKC表取别名为KC,查询零件号为“20003”的入库日期。
rename table ljkc to kc;
select rkri from kc where ljh=20003;
#用rename来重命名表名
汽车维修表(QCWX)(第一部分创建)
wxbh | cph | xlxm | sxrq | wxfy | ljsl | sfwc | wxsm | sxcj |
1001 | C3542186 | 大修 | 2022/10/3 | 21000 | 15 | 维修完成 | 车祸送修 | 维修1车间 |
1002 | K333-667 | 转动轴 | 2022/10/7 | 4800 | 2 | 维修未完成 | 换转动轴 | 维修2车间 |
1003 | A2020203 | 火花塞 | 2022/10/9 | 280 | 8 | 维修完成 | 保养 | 维修3车间 |
1004 | B3456782 | 刹车 | 2022/11/1 | 360 | 5 | 维修未完成 | 前轮刹车片磨损 | 维修1车间 |
1005 | H210-100 | 反光镜 | 2022/11/12 | 800 | 2 | 维修完成 | 反光镜碎裂 | 维修3车间 |
1006 | A1212568 | 换轮胎 | 2022/11/15 | 1400 | 2 | 维修完成 | 换后面两条轮胎 | 维修3车间 |
21.查询汽车维修表(QCWX)中以字母‘A’开头的车牌号的记录相关信息。
select*from qcwx where cph like 'A%';
22.查询送修日期在2022 年10月且已完成维修的汽车信息。
select*from qcwx where sxrq like '2022-10%' and sfwc='维修完成';
23.查询修理项目为“大修”或“换轮胎”的记录。
select*from qcwx where xlxm= '大修' or xlxm='换轮胎';
24.查询汽车维修表(QCWX)中最高的维修费用、最低维修费用及平均维修费用。
select max(wxfy) as '最高费用'from qcwx;
select min(wxfy) as '最低费用'from qcwx;
select avg(wxfy) as '平均费用'from qcwx;
25.建立如下结构的零件明细表(LJMX)。其关系模式为:LJMX(wxbh,ljbh,sysl)。
字段名 | 数据类型 | 长度 | 是否空值 | 主键外键 | 备注 |
wxbh | CHAR | 4 | NO | 外键 | 维修编号 |
ljbh | CHAR | 5 | NO | 外键 | 零件编号 |
sysl | INT(2) | 使用数量 |
零件明细表(LJMX)
wxbh | ljbh | sysl |
1001 | 20003 | 4 |
1001 | 20006 | 4 |
1001 | 20001 | 2 |
1003 | 20004 | 1 |
1004 | 20006 | 1 |
1006 | 20007 | 2 |
create table ljmx(
wxbh char(4) not null comment '维修编号',
ljh char(5) not null comment '零件号 ',
sys int(2) comment '使用数量',
constraint ljmx_qcwx
foreign key(wxbh)
references qcwx(wxbh),
constraint ljmx_kc
foreign key(ljh)
references kc(ljh)
insert into ljmx values('1001','20003','4');
insert into ljmx values('1001','20006','4');
insert into ljmx values('1001','20001','2');
insert into ljmx values('1003','20004','1');
insert into ljmx values('1004','20006','1');
insert into ljmx values('1006','20007','2');
25.1.查询零件明细表(LJMX)中每条维修记录使用零件的总数量。
select sum(sys) as '使用零件总数量' from ljmx group by wxbh;
25.2. 查询维修编号为“1001”的车牌号、送修日期、使用零件编号及每种零件的使用数量。
select cph,sxrq,ljh,sys from ljmx inner join qcwx
where qcwx.wxbh=ljmx.wxbh and qcwx.wxbh=1001;
25.3. 查询汽车维修表(QCWX)中维修费用在500元以上的维修编号、修理项目、维修费用及零件明细表(LJMX)中的零件编号、使用数量及零件库存表(LJKC)的零件号、零件名称及价格。
Select q.wxbh,q.xlxm,q.wxfy,l.ljbh,l.sys,k.ljh,k.ljmc,k.jg
From (ljmx as l left join kc as k on k.ljh=l.ljbh)
Left join qcwx as q on q.wxbh=l.wxbh
Where q.wxfy>500;
#注意这里是左连接的三表联合查询
26.创建新表(zhb),要求该表包括以下字段:零件编号,零件名称,价格,库存量,标准件,入库日期、维修编号、使用数量;并要求该表中包含所有合理的记录。
alter table ljmx change ljh ljbh char(5);
#这个是为了防止下面编号冲突,修改表结构中字段名称的代码
create table zhb as(
select ljh,ljmc,jg,kcl,bzj,rkri,ljmx.wxbh,sys
from kc
left join ljmx on kc.ljh=ljmx.ljbh
);
第三部分:自定义函数和存储过程创建
27.创建存储过程 proc_sum(IN n INT,OUT sum INT):求出 n(n>0)内所有质数并输出,同时计算所有质数之和,并输出结果。
delimiter $
drop table if exists procsum$
create table procsum(
num int not null comment'任意大于0的数',
zs int not null primary key comment'所有小于n的质数',
s int not null comment'质数之和'
);$
drop procedure if exists proc_sum$
create procedure proc_sum(in n int, out sum int)
begin
declare number int default 2;
declare temp int default 2;
set sum =0;
while number<n do
set temp=2;
label: while temp<number do
if number%temp=0 then
leave label;
end if;
set temp = temp+1;
end while;
if temp = number then
set sum=sum+number;
insert into procsum values(n,number,sum);
end if;
set number = number+1;
end while;
Select*from procsum;
end$
call proc_sum(100,@sum)$
#这里首先创建了一个表,然后创建了一个存储过程,将存储过程生成的内容写入表中并展示,最后用call语句调用该函数
select*from information_schema.routines
where routine_name='proc_sum';$
#通过这个语句可查看函数;
#结果如下
28.已知数据库 QCXL 中有以下三个表:
汽车维修表(QCWX)(第一部分创建)
wxbh | cph | xlxm | sxrq | wxfy | ljsl | sfwc | wxsm | sxcj |
1001 | C3542186 | 大修 | 2022/10/3 | 21000 | 15 | 维修完成 | 车祸送修 | 维修 1 车间 |
1002 | K333-667 | 转动轴 | 2022/10/7 | 4800 | 2 | 维修未完成 | 换转动轴 | 维修 2 车间 |
1003 | A2020203 | 火花塞 | 2022/10/9 | 280 | 8 | 维修完成 | 保养 | 维修 3 车间 |
1004 | B3456782 | 刹车 | 2022/11/1 | 360 | 5 | 维修未完成 | 前轮刹车片磨损 | 维修 1 车间 |
1005 | H210-100 | 反光镜 | 2022/11/12 | 800 | 2 | 维修完成 | 反光镜碎裂 | 维修 3 车间 |
1006 | A1212568 | 换轮胎 | 2022/11/15 | 1400 | 2 | 维修完成 | 换后面两条轮胎 | 维修 3 车间 |
零件库存表(LJKC)(第二部分创建)
ljh | ljmc | jg | kcl | bzj | rkri | cjdm |
20001 | 前灯 | 350 | 42 | 0 | 2022/9/1 | 5001 |
20002 | 方向盘 | 580 | 15 | 1 | 2022/9/15 | 5002 |
20003 | 离合器 | 750 | 8 | 0 | 2022/9/21 | 5003 |
20004 | 火花塞 | 120 | 285 | 1 | 2022/9/24 | 5003 |
20005 | 反光镜 | 180 | 86 | 0 | 2022/10/8 | 5001 |
20006 | 刹车片 | 268 | 135 | 0 | 2022/10/26 | 5006 |
20007 | 轮胎 | 780 | 500 | 1 | 2022/11/1 | 5008 |
20008 | 转动轴 | 1200 | 21 | 0 | 2022/11/13 | 5008 |
零件明细表(LJMX)(第二部分创建)
wxbh | ljbh | sysl |
1001 | 20003 | 4 |
1001 | 20006 | 4 |
1001 | 20001 | 2 |
1003 | 20004 | 1 |
1004 | 20006 | 1 |
1006 | 20007 | 2 |
28.1.创建一个存储过程,对汽车维修表(QCWX)中的零件数量(ljsl)进行修改:对于未完成维修的记录,零件数量修改为 0;对于已完成维修的记录,其零件数量由零件明细表中统计录入。
Drop procedure if exists proc_xg$
create procedure proc_xg()
Begin
Update qcwx set ljsl=0 Where sfwc='维修未完成';
Update qcwx as q,ljmx as l
set q.ljsl=l.sys
Where q.wxbh=l.wxbh and q.sfwc='维修完成';
Select*from qcwx;
end$
call proc_xg()$
#修改表格数据要注意两者的先后关系
#结果如下
28.2.创建一个存储过程 proc_insert( ):向零件明细表(LJMX)中插入一条记录,数据自拟。创建另一存储过程 proc_query( ):调用已创建好的存储过程 proc_insert(),并查询 wxbh 为’101’和’1006’的记录信息。
drop procedure if exists proc_insert$
create procedure proc_insert()
begin
insert into ljmx values('1002','20007','3');
select*from ljmx;
end$
call proc_insert()$
drop procedure if exists proc_quert$
create procedure proc_quert()
Begin
call proc_insert();
Select * from ljmx where wxbh=1006 or wxbh=1001;
end$
call proc_quert()$
#注意这是两个存储过程
#结果如下
28.3.创建存储过程,更新零件库存表:库存量(kcl)=库存量(kcl)-使用数量(sysl),并查询库存量(kcl)少于 20 的零件信息。
drop procedure if exists proc_kcl$
create procedure proc_kcl()
begin
update kc as k,ljmx as l
set k.kcl=k.kcl-l.sys;
Select*from kc
where kcl<20;
end$
call proc_kcl()$
#使用set来完成赋值运算
28.4.创建自定义函数 func_count(IN wxbh INT):要求根据维修编号统计使用零件个数并返回。
drop function if exists func_count$
create function func_count(wxh int)
returns int
Reads sql data
Begin
Declare bh int;
Select sys into bh from ljmx where wxbh=wxh;
Return (bh);
End$
select func_count(1003)$
#对于自定义函数来说reads sql data语句极为重要,否则无法正常运行
#注意select into 语句使用方法
29.在 STUDENT 数据库中,创建名称为 USER 的表,包含三个字段:用户编号(uid, INT, AUTO_INCREMENT NOT NULL PRIMARY KEY ), 用 户 名 (user,VARCHAR(10)) , 密 码(password,VARCHAR(10)),任意输入三条记录。再创建一个用户权限验证自定义函数,包含两个参数:用户名和用户密码,根据表 USER 中记录,判断输入用户的登录信息:合法返回 1,否则返回 0。
drop table if exists users;$
create table users(
uid int auto_increment not null primary key comment '用户编号' ,
user varchar(10) not null comment '用户名' ,
password int not null comment '密码');
insert into users(uid, user, password)
values
('202201','管理员1',123456),
('202202','管理员2',654321),
('202203','管理员3',147258);$
drop function if exists func_login$
create function func_login(u varchar(10), passw int)
returns int
reads sql data
begin
declare getpass int;
declare result int default 0;
select password into getpass from users where user=u limit 1;
if getpass= passw
then
set result=1;
else
set result=0;
end if;
return (result);
end$
select func_login('管理员1',123456)$
#这里1为真0为假
#结果如下
全代码展示
第一部分
create database QCXL;
use QCXL;
create table qcwx(
wxbh char(4) not null primary key comment'维修编号',
cph char(8) not null comment'车牌号',
xlxm varchar(10) comment'修理项目',
sxrq date comment'送修日期',
wxfy decimal(8,1) comment'维修费用',
ljsl int(4) comment'零件数量',
sfwc char(1) comment'是否完成',
wxsm varchar(20) comment'维修说明'
);
engine=InnoDB default charset=utf8;
alter table qcwx convert to character set utf8;
insert into qcwx values('1001','C3542186','大修','2022-10-03','21000','15','T','车祸送修');
insert into qcwx values('1002','K3337667','传动轴','2022-10-07','4800','2','F','换传动轴');
insert into qcwx values('1003','A2020203','火花塞','2022-10-09','280','8','T','保养');
insert into qcwx values('1004','B3456782','刹车','2022-11-01','360','5','F','前轮刹车片磨损');
insert into qcwx values('1005','H2105100','反光镜','2022-11-12','800','2','T','反光镜碎裂');
insert into qcwx values('1006','A1212568','换轮胎','2022-11-15','1400','2','T','换后面两条轮胎');
desc qcwx;
Select*from qcwx;
Select*from qcwx where wxbh=1003;
Select wxbh,xlxm,sxrq from qcwx where wxfy>'1000';
Select wxbh,cph,sfwc,wxsm from qcwx where sxrq like '2022-11%';
Select wxbh,cph,sfwc,wxsm from qcwx where sfwc='F';
alter table qcwx
add column sxcj char(8) comment'送修车间';
alter table qcwx
modify column sfwc char(10);
update qcwx set sfwc ='维修完成' where sfwc='T';
update qcwx set sfwc ='维修未完成' where sfwc='F';
update qcwx set wxfy=wxfy*0.8 where sxrq like '2022-10%' and sfwc='维修未完成';
create table qcwx1 select*from qcwx where1=2;
create table qcwx2 as(
select*from qcwx where sxrq like '2022-11%'
);
Create index wxfy_index1 on qcwx(wxfy asc);
Create index wxfy_index2 on qcwx(sfwc asc,wxfy desc);
第二部分
create table ljkc(
ljh char(5) not null primary key comment'零件号',
ljmc varchar(20) not null comment'零件名称',
jg decimal(7,2) comment'零件价格',
kcl int(3) comment'库存量',
bzj tinyint(1) comment'标准件',
rkri date comment'入库日期',
cjdm char(4) comment'厂家代码'
);
insert into ljkc values('20001','前灯','350','42','0','2022-09-01','5001');
insert into ljkc values('20002','方向盘','580', '15','1','2022-09-15','5002');
insert into ljkc values('20003','离合器','750', '8','0','2022-09-21','5003');
insert into ljkc values('20004','火花塞','120', '285','1','2022-09-24','5004');
insert into ljkc values('20005','反光镜','180', '86','0','2022-10-08','5005');
insert into ljkc values('20006','刹车片','268', '135','0','2022-10-26','5006');
insert into ljkc values('20007','轮胎','780','500','1','2022-11-01','5007');
insert into ljkc values('20008','传动轴','1200','21','0','2022-11-13','5008');
select*from ljkc;
create index kcl_index1 on ljkc (kcl desc);
create index bzjjg_index2 on ljkc (bzj asc,jg desc);
drop index bzjjg_index2 on ljkc;
select ljh as'零件号',ljmc as'零件名称',kcl as'库存量',rkri as'入库日期'
from ljkc order by rkri desc limit 1,5;
create view ljkcview as select * from ljkc where rkri like '2022-09%';
insert into ljkcview values('20009','发动机','2200','22','0','2022-09-13','5009');
select*from ljkcview;
delete from ljkcview where ljh=20009;
select*from ljkcview;
select*from ljkc where jg>500 and jg<1000;
rename table ljkc to kc;
select rkri from kc where ljh=20003;
select*from qcwx where cph like 'A%';
select*from qcwx where sxrq like '2022-10%' and sfwc='维修完成';
select*from qcwx where xlxm= '大修' or xlxm='换轮胎';
select max(wxfy) as '最高费用'from qcwx;
select min(wxfy) as '最低费用'from qcwx;
select avg(wxfy) as '平均费用'from qcwx;
create table ljmx(
wxbh char(4) not null comment '维修编号',
ljh char(5) not null comment '零件号 ',
sys int(2) comment '使用数量',
constraint ljmx_qcwx
foreign key(wxbh)
references qcwx(wxbh),
constraint ljmx_kc
foreign key(ljh)
references kc(ljh)
);
insert into ljmx values('1001','20003','4');
insert into ljmx values('1001','20006','4');
insert into ljmx values('1001','20001','2');
insert into ljmx values('1003','20004','1');
insert into ljmx values('1004','20006','1');
insert into ljmx values('1006','20007','2');
select sum(sys) as '使用零件总数量' from ljmx group by wxbh;
select cph,sxrq,ljh,sys from ljmx inner join qcwx
where qcwx.wxbh=ljmx.wxbh and qcwx.wxbh=1001;
Select q.wxbh,q.xlxm,q.wxfy,l.ljbh,l.sys,k.ljh,k.ljmc,k.jg
From (ljmx as l left join kc as k on k.ljh=l.ljbh)
Left join qcwx as q on q.wxbh=l.wxbh
Where q.wxfy>500;
create table zhb as(
select l.ljh,l.wxbh,l.sys,k.ljmc,k.jg,k.kcl,k.bzj,k.rkri
from ljmx as l, kc as k
);
alter table ljmx change ljh ljbh char(5);
create table zhb as(
select ljh,ljmc,jg,kcl,bzj,rkri,ljmx.wxbh,sys
from kc
left join ljmx on kc.ljh=ljmx.ljbh
);
第三部分
delimiter $
drop table if exists procsum$
create table procsum(
num int not null comment'任意大于0的数',
zs int not null primary key comment'所有小于n的质数',
s int not null comment'质数之和'
);$
drop procedure if exists proc_sum$
create procedure proc_sum(in n int, out sum int)
begin
declare number int default 2;
declare temp int default 2;
set sum =0;
while number<n do
set temp=2;
label: while temp<number do
if number%temp=0 then
leave label;
end if;
set temp = temp+1;
end while;
if temp = number then
set sum=sum+number;
insert into procsum values(n,number,sum);
end if;
set number = number+1;
end while;
Select*from procsum;
end$
call proc_sum(100,@sum)$
select*from information_schema.routines
where routine_name='proc_sum';$
Drop procedure if exists proc_xg$
create procedure proc_xg()
Begin
Update qcwx set ljsl=0 Where sfwc='维修未完成';
Update qcwx as q,ljmx as l
set q.ljsl=l.sys
Where q.wxbh=l.wxbh and q.sfwc='维修完成';
Select*from qcwx;
end$
call proc_xg()$
drop procedure if exists proc_insert$
create procedure proc_insert()
begin
insert into ljmx values('1002','20007','3');
select*from ljmx;
end$
call proc_insert()$
drop procedure if exists proc_quert$
create procedure proc_quert()
Begin
call proc_insert();
Select * from ljmx where wxbh=1006 or wxbh=1001;
end$
call proc_quert()$
drop procedure if exists proc_kcl$
create procedure proc_kcl()
begin
update kc as k,ljmx as l
set k.kcl=k.kcl-l.sys;
Select*from kc
where kcl<20;
end$
call proc_kcl()$
drop function if exists func_count$
create function func_count(wxh int)
returns int
Reads sql data
Begin
Declare bh int;
Select sys into bh from ljmx where wxbh=wxh;
Return (bh);
End$
select func_count(1003)$
drop table if exists users;$
create table users(
uid int auto_increment not null primary key comment '用户编号' ,
user varchar(10) not null comment '用户名' ,
password int not null comment '密码');
insert into users(uid, user, password)
values
('202201','管理员1',123456),
('202202','管理员2',654321),
('202203','管理员3',147258);$
drop function if exists func_login$
create function func_login(u varchar(10), passw int)
returns int
reads sql data
begin
declare getpass int;
declare result int default 0;
select password into getpass from users where user=u limit 1;
if getpass= passw
then
set result=1;
else
set result=0;
end if;
return (result);
end$
select func_login('管理员1',123456)$
总结
这个实例几乎覆盖了全部sql语言的基础内容,本文面向开发层面,没有过多介绍图形界面,希望能够帮助初学者了解掌握数据库开发的基本方法。创作不易求求关注啦!