2、用户场景
例如存储用户基础信息数据,通常都会下面几个相关表结构:用户信息表、单点登录表、状态管理表、支付账户表等。
用户信息表
存储用户三要素相关信息:姓名,手机号,身份z,登录密码,邮箱等。
CREATE TABLE `ms_user_center` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',`user_name` varchar(20) NOT NULL COMMENT '用户名',`real_name` varchar(20) DEFAULT NULL COMMENT '真实姓名',`pass_word` varchar(32) NOT NULL COMMENT '密码',`phone` varchar(20) NOT NULL COMMENT '手机号',`email` varchar(32) DEFAULT NULL COMMENT '邮箱',`head_url` varchar(100) DEFAULT NULL COMMENT '用户头像URL',`card_id` varchar(32) DEFAULT NULL COMMENT '身份z号',`user_sex` int(1) DEFAULT '1' COMMENT '用户性别:0-女,1-男',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表' 单点登录表
用意是在多个业务系统中,用户登录一次就可以访问所有相互信任的业务子系统,是聚合业务平台常用的解决方案。
CREATE TABLE `ms_user_sso` (`user_id` int(11) NOT NULL COMMENT '用户ID',`sso_id` varchar(32) NOT NULL COMMENT '单点信息编号ID',`sso_code` varchar(32) NOT NULL COMMENT '单点登录码,唯一核心标识',`log_ip` varchar(32) DEFAULT NULL COMMENT '登录IP地址',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户单点登录表' 状态管理表
系统用户在使用时候可能出现多个状态,例如账户冻结、密码锁定等,把状态聚合到一起,可以更加方便的管理和验证。
CREATE TABLE `ms_user_status` (`user_id` int(11) NOT NULL COMMENT '用户ID',`account_status` int(1) DEFAULT '1' COMMENT '账户状态:0-冻结,1-未冻结',`real_name_status` int(1) DEFAULT '0' COMMENT '实名认证状态:0-未实名,1-已实名',`pay_pass_status` int(1) DEFAULT '0' COMMENT '支付密码是否设置:0-未设置,1-设置',`wallet_pass_status` int(1) DEFAULT '0' COMMENT '钱包密码是否设置:0-未设置,1-设置',`wallet_status` int(1) DEFAULT '1' COMMENT '钱包是否冻结:0-冻结,1-未冻结',`email_status` int(1) DEFAULT '0' COMMENT '邮箱状态:0-未激活,1-激活',`message_status` int(1) DEFAULT '1' COMMENT '短信提醒开启:0-未开启,1-开启',`letter_status` int(1) DEFAULT '1' COMMENT '站内信提醒开启:0-未开启,1-开启',`emailmsg_status` int(1) DEFAULT '0' COMMENT '邮件提醒开启:0-未开启,1-开启',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户状态表' 支付账户表
用户交易的核心表,存储用户相关的账户资金信息。
CREATE TABLE `ms_user_wallet` (`wallet_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '钱包ID',`user_id` int(11) NOT NULL COMMENT '用户ID',`wallet_pwd` varchar(32) DEFAULT NULL COMMENT '钱包密码',`total_account` decimal(20,2) DEFAULT '0.00' COMMENT '账户总额',`usable_money` decimal(20,2) DEFAULT '0.00' COMMENT '可用余额',`freeze_money` decimal(20,2) DEFAULT '0.00' COMMENT '冻结金额',`freeze_time` datetime DEFAULT NULL COMMENT '冻结时间',`thaw_time` datetime DEFAULT NULL COMMENT '解冻时间',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`wallet_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户钱包' 二、设计规范 1、涉及模块
通过上面几个表设计的案例,可以看到表设计关联到数据库的各个方面知识:数据类型,索引,编码,存储引擎等。表设计是一个很大的命题,不过也遵循一个基本规范:三范式。
2、三范式 基础概念
一范式
表的列的具有原子性,不可再分解,即列的信息,不能分解,关系型数据库MySQL、Oracle等自动的满足。
二范式
每个事实的数据记录只会出现一次, 不会冗余, 通常设计一个主键来实现。
三范式
要求一个表中不包含已经存在于其它表的非主键信息,例如部门和员工的信息,员工表包含部门表的主键ID,则可以关联获取相关信息,没必要在员工表保存相关信息。
优缺点对比
范式化设计
范式化结构设计通常更新快,因为冗余数据较少,表结构轻巧,也更好的写入内存中。但是查询起来涉及到关联,代价非常高,非常损耗查询性能。
反范式化设计
所有的数据都在一张表中,避免关联查询,索引的有效性更高,但是数据的冗余性极高。
建议结论
上述的两种设计方式在实际开发中都是不存在的,在实际开发中都是混合使用。比如汇总统计,缓存数据,都会基于反范式化的设计。
三、字段属性
合适的字段类型对于高性能来说非常重要,基本原则如下:简单的类型占用资源更少;在可以正确存储数据的情况下,选最小的数据类型。
1、数据类型选择 整数类型
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,根据数据类型范围合理选择即可。
实数类型
FLOAT、DOUBLE、DECIMAL,建议资金货币相关类型使用高精度DECIMAL存储,或者把数据成倍扩大为整数,采用BIGINT存储,不过处理相对麻烦。
字符类型
CHAR、VARCHAR,长度不确定建议采用VARCHAR存储,不过VARCHAR类型需要额外开销记录字符串长度。CHAR适合存储短字符,或者定长字符串,例如MD5的加密结构。
时间类型
DATETIME、TIMESTAMP,DATETIME保存大范围的值,精度秒。TIMESTAMP以时间戳的格式,范围相对较小,效率也相对较高,所以通常情况建议使用。
MySQL的字段类型有很多种,可以根据数据特性选择合适的,这里只描述常见的几种类型。
2、基础用法 *** 作 数据类型
修改字段类型
ALTER TABLE ms_user_sso MODIFY state CHAR(1) DEFAULT '0'ALTER TABLE ms_user_sso MODIFY state INT(1) DEFAULT '1' COMMENT '状态:0不可用,1可用'
修改名称位置
ALTER TABLE ms_user_sso CHANGE log_ip login_ip VARCHAR(32) AFTER update_time 索引使用
索引类型:主键索引,普通索引,唯一索引,组合索引,全文索引。这里演示普通索引的 *** 作。MySQL的核心模块,后续详说。
添加索引
ALTER TABLE ms_user_wallet ADD INDEX user_id_index(user_id) CREATE INDEX state_index ON ms_user_wallet(state)
查看索引
SHOW INDEX FROM ms_user_wallet
删除索引
DROP INDEX state_index ON ms_user_wallet
修改索引
不具有真正意义上的修改,可以把原有的索引删除之后,再次添加索引。
外键关联
用处:外键关联的作用保证多个数据表的数据一致性和完整性,建表时先有主表,后有从表;删除数据表,需要先删从表,再删主表。复杂场景不建议使用,实际开发中用的也不多。
添加外键
ALTER TABLE ms_user_wallet ADD CONSTRAINT user_id_out_key FOREIGN KEY(user_id) REFERENCES ms_user_center(id)
删除外键
ALTER TABLE ms_user_wallet DROP FOREIGN KEY user_id_out_key四、表结构管理 1、查看结构DESC ms_user_status SHOW CREATE TABLE ms_user_status2、字段结构 添加字段 ALTER TABLE ms_user_status ADD `delete_time` datetime DEFAULT NULL COMMENT '删除时间' 删除字段 ALTER TABLE ms_user_status DROP COLUMN delete_time3、修改表名ALTER TABLE ms_user_center RENAME ms_user_info4、存储引擎 存储引擎 SELECT VERSION() SHOW ENGINES
MySQL 5.6 支持的存储引擎有InnoDB、MyISAM、Memory、Archive、CSV、BLACKHOLE等。一般默认使用InnoDB,支持事务管理。该模块MySQL核心,后续详解。
修改引擎
数据量大的场景下,存储引擎修改是一个难度极大的 *** 作,容易会导致表的特性变动,引起各种后续反应,后续会详说。
ALTER TABLE ms_user_sso ENGINE = MyISAM5、修改编码
表字符集默认使用utf8,通用,无乱码风险,汉字3字节,英文1字节,utf8mb4是utf8的超集,有存储4字节例如表情符号时使用。
查看编码 SHOW VARIABLES LIKE 'character%' 修改编码 ALTER TABLE ms_user_sso DEFAULT CHARACTER SET utf8mb4五、数据管理 1、增删改查
添加数据
INSERT INTO ms_user_sso ( user_id,sso_id,sso_code,create_time,update_time,login_ip,state ) VALUES ('1','SSO7637267','SSO78631273612','2019-12-24 11:56:57','2019-12-24 11:57:01','127.0.0.1','1' )
更新数据
UPDATE ms_user_sso SETuser_id = '1',sso_id = 'SSO20191224',sso_code = 'SSO20191224', create_time = '2019-11-24 11:56:57',update_time = '2019-11-24 11:57:01', login_ip = '127.0.0.1',state = '1' WHERE user_id = '1'
查询数据
一般情况下都是禁止使用 select* *** 作。
SELECT user_id,sso_id,sso_code,create_time,update_time,login_ip,state FROM ms_user_sso WHERE user_id = '1'
删除数据
DELETE FROM ms_user_sso WHERE user_id = '2'
不带where条件,就是删除全部数据。原则上不允许该 *** 作,优化篇会详解。TRUNCATE TABLE也是清空表数据,但是占用的资源相对较少。
2、数据安全 不可逆加密
这类加密算法,多用来做数据验证 *** 作,比如常见的密码验证。
SELECT MD5('cicada')='94454b1241ad2cfbd0c44efda1b6b6ba' SELECT SHA('cicada')='0501746a2e4fd34e1d14015fc4d58309585edc7d' SELECT PASSWORD('smile')='*B4FB95D86DCFC3F33A3852714DC742C77504479D' 可逆加密
安全性要求高的系统,需要做三级等保,对数据的安全性极高,数据在存储时必须加密入库,取出时候需要解密,这些就需要可逆加密。
SELECT DECODE(ENCODE('123456','key_salt'),'key_salt') SELECT AES_DECRYPT(AES_ENCRYPT('cicada','salt123'),'salt123')
上述数据安全的管理,也可以基于应用系统的服务(代码)层进行处理,相对专业的流程是从数据生成源头处理,规避数据传递过程泄露,造成不必要的风险。
姚津泓实验作业 网页链接可以看看
--实验一
create database test1
on
(name=test1,
filename='d:\3116004357姚津泓\test1.mdf',
size=10,
maxsize=50,
filegrowth=5)
log on
(name=test1_log,
filename='d:\3116004357姚津泓\test1.ldf',
size=5mb,
maxsize=25mb,
filegrowth=5mb)
create database test2
on
(name=test11,
filename='d:\3116004357姚津泓\test11.mdf',
size=10,
maxsize=50,
filegrowth=5),
(name=test22,
filename='d:\3116004357姚津泓\test22.ndf',
size=10,
maxsize=50,
filegrowth=5),
(name=test33,
filename='d:\3116004357姚津泓\test33.ndf',
size=10,
maxsize=50,
filegrowth=5)
log on
(name=test11_log,
filename='d:\3116004357姚津泓\test11.ldf',
size=5mb,
maxsize=25mb,
filegrowth=5mb),
(name=test22_log,
filename='d:\3116004357姚津泓\test22.ldf',
size=5mb,
maxsize=25mb,
filegrowth=5mb)
create database test3
on
(name=dab1,
filename='d:\3116004357姚津泓\dab1.mdf',
size=10,
maxsize=50,
filegrowth=5),
filegroup fg11 --第一个文件组
(name=dab2,
filename='d:\3116004357姚津泓\dab2.ndf',
size=10,
maxsize=50,
filegrowth=5),
filegroup fg22 --第二个文件组
(name=dat1,
filename='d:\3116004357姚津泓\dat1.ndf',
size=10,
maxsize=50,
filegrowth=5),
(name=dat2,
filename='d:\3116004357姚津泓\dat2.ndf',
size=10,
maxsize=50,
filegrowth=5),
filegroup fg33--第三个文件组
(name=daz1,
filename='d:\3116004357姚津泓\daz1.ndf',
size=10,
maxsize=50,
filegrowth=5),
(name=daz2,
filename='d:\3116004357姚津泓\daz2.ndf',
size=10,
maxsize=50,
filegrowth=5)
alter database test1
add file
(name=te,
filename='d:\3116004357姚津泓\te.ndf',
size=10,
maxsize=50,
filegrowth=5
)
alter database test2
modify file
(name=test11,
filename='d:\3116004357姚津泓\test11.mdf',
maxsize=55
)
drop database test1
--实验2--
create database 实验
create schema yaojinhong
create table yaojinhong.仓库
(
仓库号char(6)primary key check (仓库号like'[A-Z][A-Z][0-9][0-9][0-9][0-9]'),
城市char(10) unique not null,
面积 int check(面积>=50)
)
create table yaojinhong.职工
(
职工号char(8)primary key check (职工号like'[A-Z][A-Z][0-9][0-9][0-9][0-9][0-9][0-9]'),
仓库号char(6)constraint ck foreign key references yaojinhong.仓库(仓库号),
工资 money check (工资>=1000 and 工资<=10000)
)
create table yaojinhong.供应商
(
供应商号 char(4)primary key check (供应商号like'[S][0-9][0-9][0-9]'),
供应商名 char(16),
地址char(30),
)
create table yaojinhong.订购单
(职工号 char(8) not null foreign key references yaojinhong.职工.(职工号),
供应商号 char(4) null constraint supply foreign key references yaojinhong.供应商(供应商号) on delete set null,
订购单号 char(6) primary key check(订购单号 like 'OR[0-9][0-9][0-9][0-9]'),
订购日期 datetime default getdate(),
金额 money default null
)
create table yaojinhong.订购单明细
(订购单号 char(6) not null foreign key references yaojinhong.订购单(订购单号),
序号 char(2),
产品名称 char(20),
单价 money default null check(单价>0),
数量 int not null check(数量>0),
primary key(订购单号,序号)
)
alter table yaojinhong.订购单
add 完成日期 datetime default null
alter table yaojinhong.订购单明细
add check(数量 between 0 and 1000)
alter table yaojinhong.订购单明细
alter column 数量 int not null alter table yaojinhong.供应商
alter column 供应商名 varchar(30)
实验3
insert into yaojinhong.仓库 values('QW0001','广州',500)
insert into yaojinhong.仓库 values('QW0002','上海',900)
insert into yaojinhong.仓库 values('QW0003','北京',250)
insert into yaojinhong.仓库 values('QW0004','纽约',1000)
insert into yaojinhong.仓库 values('QW0005','深圳',650)
insert into yaojinhong.职工 values('ZG000001','QW0005',3000)
insert into yaojinhong.职工 values('ZG000002','QW0001',5600)
insert into yaojinhong.职工 values('ZG000003','QW0004',6600)
insert into yaojinhong.职工 values('ZG000004','QW0002',3800)
insert into yaojinhong.职工 values('ZG000005','QW0005',3900)
insert into yaojinhong.职工 values('ZG000006','QW0001',4600)
insert into yaojinhong.职工 values('ZG000007','QW0003',4000)
insert into yaojinhong.职工 values('ZG000008','QW0003',5000)
insert into yaojinhong.职工 values('ZG000009','QW0002',4800)
insert into yaojinhong.职工 values('ZG000010','QW0004',6000)
insert into yaojinhong.供应商 values('S001','华广','深圳')
insert into yaojinhong.供应商 values('S002','广工','广州')
insert into yaojinhong.供应商 values('S003','美的','茂名')
insert into yaojinhong.供应商 values('S004','乐视','深圳')
insert into yaojinhong.供应商 values('S005','康佳','广州')
insert into yaojinhong.订购单 values('ZG000007','S005','OR0001','2015-1-6',5000,'2015-2-5')
insert into yaojinhong.订购单 values('ZG000002','S001','OR0002','2015-2-3',10000,'2015-3-4')
insert into yaojinhong.订购单 values('ZG000003','S004','OR0003','2015-2-17',3000,'2015-5-16')
insert into yaojinhong.订购单 values('ZG000006','S002','OR0004','2015-2-16',9000,'2015-4-18')
insert into yaojinhong.订购单 values('ZG000010','S005','OR0005','2015-3-20',8000,'2015-6-27')
insert into yaojinhong.订购单 values('ZG000001','S001','OR0006','2015-3-22',7500,'2015-7-29')
insert into yaojinhong.订购单 values('ZG000006','S003','OR0021','2015-2-15',4600,'2015-10-13')
insert into yaojinhong.订购单 values('ZG000004','S002','OR0007','2015-2-23',8500,'2015-8-29')
insert into yaojinhong.订购单 values('ZG000003','S005','OR0008','2015-1-5',3600,'2015-11-11')
insert into yaojinhong.订购单 values('ZG000001','S004','OR0009','2015-1-31',7600,'2015-12-14')
insert into yaojinhong.订购单 values('ZG000007','S001','OR0010','2015-3-25',12000,'2015-7-30')
insert into yaojinhong.订购单 values('ZG000008','S002','OR0011','2015-2-26',4600,'2015-9-27')
insert into yaojinhong.订购单 values('ZG000010','S002','OR0012','2015-1-28',3400,'2015-11-21')
insert into yaojinhong.订购单 values('ZG000009','S004','OR0013','2015-3-19',2300,'2015-10-24')
insert into yaojinhong.订购单 values('ZG000007','S005','OR0014','2015-2-23',9000,'2015-9-21')
insert into yaojinhong.订购单 values('ZG000008','S003','OR0015','2015-2-27',6400,'2015-12-23')
insert into yaojinhong.订购单 values('ZG000002','S001','OR0016','2015-1-30',7900,'2015-6-30')
insert into yaojinhong.订购单 values('ZG000005','S004','OR0017','2015-1-27',20000,'2015-8-18')
insert into yaojinhong.订购单 values('ZG000009','S004','OR0018','2015-3-5',13000,'2015-7-31')
insert into yaojinhong.订购单 values('ZG000004','S002','OR0019','2015-3-14',7000,'2015-6-17')
insert into yaojinhong.订购单 values('ZG000006','S005','OR0020','2015-2-21',4300,'2015-5-25')
insert into yaojinhong.订购单明细 values('OR0020','01','沐浴露',32,240)
insert into yaojinhong.订购单明细 values('OR0001','02','洗衣粉',30,125)
insert into yaojinhong.订购单明细 values('OR0012','03','洗衣液',39,59)
insert into yaojinhong.订购单明细 values('OR0014','04','香皂',14,99)
insert into yaojinhong.订购单明细 values('OR0004','05','盐',2,169)
insert into yaojinhong.订购单明细 values('OR0005','06','酱油',14,65)
insert into yaojinhong.订购单明细 values('OR0011','07','化妆品',26,24)
insert into yaojinhong.订购单明细 values('OR0019','08','洗面奶',39,68)
insert into yaojinhong.订购单明细 values('OR0008','09','面膜',5,147)
insert into yaojinhong.订购单明细 values('OR0003','10','花生油',36,258)
insert into yaojinhong.订购单明细 values('OR0017','11','鼠标',69,72)
insert into yaojinhong.订购单明细 values('OR0015','12','鼠标垫',18,64)
insert into yaojinhong.订购单明细 values('OR0016','13','移动电源',58,69)
insert into yaojinhong.订购单明细 values('OR0012','14','插座',37,169)
insert into yaojinhong.订购单明细 values('OR0011','15','牛奶',72,111)
insert into yaojinhong.订购单明细 values('OR0020','16','洗洁精',9,114)
insert into yaojinhong.订购单明细 values('OR0019','17','洁厕液',6,300)
insert into yaojinhong.订购单明细 values('OR0010','18','鸡蛋',14,124)
insert into yaojinhong.订购单明细 values('OR0009','19','牛肉',38,300)
insert into yaojinhong.订购单明细 values('OR0016','20','内裤',59,654)
insert into yaojinhong.订购单明细 values('OR0018','21','鞋子',299,300)
insert into yaojinhong.订购单明细 values('OR0015','22','手表',890,34)
insert into yaojinhong.订购单明细 values('OR0005','23','钱包',129,124)
insert into yaojinhong.订购单明细 values('OR0008','24','行李箱',344,64)
insert into yaojinhong.订购单明细 values('OR0014','25','手袋',3,874)
insert into yaojinhong.订购单明细 values('OR0018','26','篮球',360,59)
insert into yaojinhong.订购单明细 values('OR0003','27','足球',260,36)
insert into yaojinhong.订购单明细 values('OR0005','28','羽毛球拍',78,69)
insert into yaojinhong.订购单明细 values('OR0007','29','乒乓球拍',89,145)
insert into yaojinhong.订购单明细 values('OR0020','30','羽毛球',5,645)
insert into yaojinhong.订购单明细 values('OR0013','31','乒乓球',3,542)
insert into yaojinhong.订购单明细 values('OR0016','32','牙膏',23,200)
insert into yaojinhong.订购单明细 values('OR0009','33','牙刷',6,456)
insert into yaojinhong.订购单明细 values('OR0019','34','防晒霜',56,65)
insert into yaojinhong.订购单明细 values('OR0017','35','水杯',39,1187)
insert into yaojinhong.订购单明细 values('OR0010','36','拖把',15,187)
insert into yaojinhong.订购单明细 values('OR0004','37','扫把',6,200)
insert into yaojinhong.订购单明细 values('OR0005','38','垃圾桶',16,254)
insert into yaojinhong.订购单明细 values('OR0006','39','书',46,688)
insert into yaojinhong.订购单明细 values('OR0016','40','卫生纸',13,500)
insert into yaojinhong.订购单明细 values('OR0020','41','相机',3698,32)
insert into yaojinhong.订购单明细 values('OR0013','42','手机',2000,200)
insert into yaojinhong.订购单明细 values('OR0017','43','音响',500,143)
insert into yaojinhong.订购单明细 values('OR0001','44','吸尘器',1688,40)
insert into yaojinhong.订购单明细 values('OR0012','45','油烟机',3500,10)
insert into yaojinhong.订购单明细 values('OR0010','46','台式电脑',4000,25)
insert into yaojinhong.订购单明细 values('OR0013','47','空调',50,230)
insert into yaojinhong.订购单明细 values('OR0005','48','电视机',1300,100)
insert into yaojinhong.订购单明细 values('OR0016','49','洗衣机',3400,15)
insert into yaojinhong.订购单明细 values('OR0011','50','笔记本',6000,20)
insert into yaojinhong.仓库 values('QW0001','惠州',600)
原因:违反了PRIMARY KEY 约束'PK__仓库__530C599C7F60ED59'。不能在对象'yaojinhong.仓库' 中插入重复键。语句已终止。
insert into yaojinhong.职工 values('ZG000011','QW0009',3000)
原因:仓库号列参照仓库表的仓库号,此时在仓库表中找不到仓库号为QW0009的仓库。INSERT 语句与FOREIGN KEY 约束"FK__职工__仓库号__0AD2A005"冲突。该冲突发生于数据库"实验",表"yaojinhong.仓库", column '仓库号'。
insert into yaojinhong.仓库 values('QW0006','天津',30)
原因:在定义时,面积要大于等于50,这里面积为30,明显违反了用户定义完整性
delete yaojinhong.仓库 where 城市='北京'
删除 *** 作失败。因为有职工参照了干记录
delete yaojinhong.供应商 where 供应商号='S002'
因为删除参照完整性规则定义为set null
alter table yaojinhong.职工
drop constraint ck
alter table yaojinhong.职工
drop column 仓库号
alter table yaojinhong.职工
add 仓库号 char(6)constraint ck foreign key references yaojinhong.仓库
on delete cascade
on update cascade
update yaojinhong.职工 set 仓库号='QW0006' where 职工号='ZG000002'
更新 *** 作失败,因为职工表所参考的仓库表中不存在仓库号为QW0006的仓库。
update yaojinhong.仓库 set 仓库号=null where 仓库号='QW0001'
更新 *** 作失败,因为仓库号是关键字,不能为空。
update yaojinhong.仓库 set 面积=30 where 仓库号='QW0001'
更新 *** 作失败,因为面积被定义约束大于或等于50,此处面积=30,显然违反了约束。
update yaojinhong.职工 set 工资=(工资+(工资*0.1))
update yaojinhong.订购单 set 金额=(select SUM(单价*数量) from yaojinhong.订购单明细
where 订购单明细.订购单号=订购单.订购单号)
delete yaojinhong.职工 where 仓库号 in (select 仓库号 from yaojinhong.仓库 where 城市='北京')
delete yaojinhong.订购单 where 供应商号 in (select 供应商号 from yaojinhong.供应商 where 供应商名='广工')
实验4
1 select distinct 工资 from yaojinhong.职工
select all 工资 from yaojinhong.职工
2 select * from yaojinhong.仓库
3 select 职工号 from yaojinhong.职工 where 工资>5000
4 select * from yaojinhong.仓库 where 仓库号 in(select 仓库号 from yaojinhong.职工 where 工资>5000)
5 select 职工号 from yaojinhong.职工 where 仓库号 in ('QW0005','QW0002') and 工资<5000
6 select * from yaojinhong.职工 where 工资 between 3000 and 5000
7 select * from yaojinhong.供应商 where 供应商名 like '%公司'
8 select * from yaojinhong.仓库 where 城市!='北京
9 select * from yaojinhong.订购单 where 供应商号 is null
10 select * from yaojinhong.订购单 where 供应商号 is not null
11 select * from yaojinhong.职工 order by 工资 ASC
12 select * from yaojinhong.职工 order by 仓库号 ASC,工资 DESC
13 select 职工号,城市 from yaojinhong.职工 join yaojinhong.仓库 on 职工.仓库号=仓库.仓库号 where 工资>6000
14 select 职工号,城市 from yaojinhong.职工 join yaojinhong.仓库 on 职工.仓库号=仓库.仓库号 where 面积>700
16 select * from yaojinhong.仓库 cross join yaojinhong.职工
17 select * from yaojinhong.仓库 cross join yaojinhong.职工
where 仓库.仓库号=职工.仓库号
18 select 供应商.供应商号,供应商名,订购单号,订购日期 from yaojinhong.供应商 join yaojinhong.订购单
on 供应商.供应商号=订购单.供应商号
19 select 供应商.供应商号,供应商名,订购单号,订购日期 from yaojinhong.供应商 left join yaojinhong.订购单
on 供应商.供应商号=订购单.供应商号
20 select 供应商.供应商号,供应商名,订购单号,订购日期 from yaojinhong.供应商 right join yaojinhong.订购单 on 供应商.供应商号=订购单.供应商号
21 select 供应商.供应商号,供应商名,订购单号,订购日期 from yaojinhong.供应商 full join yaojinhong.订购单 on 供应商.供应商号=订购单.供应商号
22 select 城市 from yaojinhong.仓库 where 仓库号 in
(select 仓库号 from yaojinhong.职工 where 工资=3300)
23 select * from yaojinhong.仓库 where 仓库号 not in
(select 仓库号 from yaojinhong.职工 where 工资<5000)
24 select * from yaojinhong.职工 where 工资 in
(select 工资 from yaojinhong.职工 where 职工号='ZG000001')
and 职工号!='ZG000001'
25 select 城市 from yaojinhong.仓库 where 仓库号 in
(select 仓库号 from yaojinhong.职工 where 职工号 in
(select 职工号 from yaojinhong.订购单 where 供应商号 in
(select 供应商号 from yaojinhong.供应商 where 地址='广州')))
26 select 供应商名 from yaojinhong.供应商 join yaojinhong.订购单 on 供应商.供应商号=订购单.供应商号 join yaojinhong.职工 on 订购单.职工号=职工.职工号 join yaojinhong.仓库 on 职工.仓库号=仓库.仓库号 where 地址='广州'and 城市='广州'
select 供应商名
from yaojinhong.供应商 where 地址='广州' and 供应商号 in
(select 供应商号 from yaojinhong.订购单 join yaojinhong.职工 on 订购单.职工号=职工.职工号
join yaojinhong.仓库 on 职工.仓库号=仓库.仓库号 where 城市='广州')
27 select 仓库号 from yaojinhong.仓库 where 仓库号 in
(select 仓库号 from yaojinhong.职工 where 工资>any
(select 工资 from yaojinhong.职工 join yaojinhong.仓库 on 职工.仓库号=仓库.仓库号
where 仓库.仓库号='QW0001')and 仓库号!='QW0001')
28 select 仓库号 from yaojinhong.仓库 where 仓库号 in
(select 仓库号 from yaojinhong.职工 where 工资>all
(select 工资 from yaojinhong.职工 join yaojinhong.仓库 on 职工.仓库号=仓库.仓库号
where 仓库.仓库号='QW0001'))
29 select * from yaojinhong.订购单 a where 金额=
(select MAX(金额) from yaojinhong.订购单 b where a.职工号=b.职工号)
order by 职工号 ASC
30 select * from yaojinhong.仓库 where exists(select * from yaojinhong.职工 where 职工号 is null and 职工.仓库号=仓库.仓库号)
31 select * from yaojinhong.仓库 where not exists(select * from yaojinhong.职工 where 职工号 is null and 职工.仓库号=仓库.仓库号)
32 select COUNT(distinct 城市)城市数目 from yaojinhong.仓库 where 城市 is not null
33 select SUM(工资)需要支付职工工资总数 from yaojinhong.职工
34 select SUM(工资)北京和上海的仓库职工的工资总和 from yaojinhong.职工 join yaojinhong.仓库 on 职工.仓库号=仓库.仓库号
where 城市='北京' or 城市='上海'
35 select AVG(面积)平均面积 from yaojinhong.仓库 where 仓库号 not in
(select 仓库号 from yaojinhong.职工 where 工资<6000)
36 select max(金额)工资大于的职工所经手的订购单最高金额 from yaojinhong.订购单 where 职工号 in
(select 职工号 from yaojinhong.职工 where 工资>6000)
37 select 仓库号,AVG(工资)平均工资 from yaojinhong.职工
group by 仓库号
38 select 仓库号,max(金额)最高金额,MIN(金额)最低金额,AVG(金额)平均金额 from yaojinhong.职工 join yaojinhong.订购单 on 职工.职工号=订购单.职工号 group by 仓库号
39 select 订购单.订购单号,AVG(金额)平均金额 from yaojinhong.订购单 join yaojinhong.订购单明细 on 订购单.订购单号=订购单明细.订购单号
group by 订购单.订购单号 having COUNT(订购单.订购单号)>=5
40 select 仓库号,职工号,工资 from yaojinhong.职工
order by 仓库号
compute avg(工资),sum(工资)by 仓库号
compute avg(工资),sum(工资)
41select 订购单明细.订购单号,序号,产品名称,单价,数量,金额
from yaojinhong.订购单明细 join yaojinhong.订购单 on
订购单.订购单号=订购单明细.订购单号 order by 订购单.订购单号
compute avg(金额),sum(金额)by 订购单.订购单号
compute avg(金额),sum(金额)
42 select * from yaojinhong.订购单
compute avg(金额),sum(金额)
实验5
一
(1) 基于单个表按投影 *** 作定义视图。
create view yaojinhong.仓库视图 as select * from yaojinhong.仓库
(2) 基于单个表按选择 *** 作定义视图。
create view yaojinhong.仓库视图1 as select * from yaojinhong.仓库 where 城市='广州'
(3) 基于单个表按选择和投影 *** 作定义视图。
create view yaojinhong.仓库视图2 as select 仓库号,面积 from yaojinhong.仓库 where 城市='广州'
(4) 基于多个表根据连接 *** 作定义视图。
create view yaojinhong.视图3 as select 职工号,城市,工资 from yaojinhong.职工 join yaojinhong.仓库 on 职工.仓库号=仓库.仓库号
(5) 基于多个表根据嵌套查询定义视图。
create view yaojinhong.视图4 as select * from yaojinhong.仓库 where 仓库号 in
(select 仓库号 from yaojinhong.职工 where 工资>4000)
(6) 定义含有虚字段的视图。
create view yaojinhong.虚字段视图(仓库号,城市,面积) as select 仓库号,城市,面积*2 from yaojinhong.仓库
2、分别在定义的视图上设计一些查询(包括基于视图和基本表的连接或嵌套查询)。
select * from yaojinhong.仓库视图
select * from yaojinhong.仓库视图1 where 城市='广州'
select 仓库号,面积 from yaojinhong.仓库视图2
select 职工号,城市,工资 from yaojinhong.职工 join yaojinhong.仓库视图 on 职工.仓库号=仓库视图. 仓库号
select * from yaojinhong.仓库视图 where 仓库号 in
(select 仓库号 from yaojinhong.职工 where 工资>4000)
3、在不同的视图上分别设计一些插入、更新和删除 *** 作,分情况讨论哪些 *** 作可以成功完成,哪些 *** 作不能完成,并分析原因。
insert into yaojinhong.仓库视图(仓库号,城市) values('QW0008','长沙')
update yaojinhong.仓库视图 set 面积=650 where 仓库号='QW0008'
insert into yaojinhong.仓库视图 values('QW0008','长沙',500)
update yaojinhong.仓库视图 set 面积=700 where 仓库号='QW0001'
delete yaojinhong.仓库视图 where 仓库号='QW0008'
delete yaojinhong.仓库视图 where 仓库号='QW0008'
中文名是MT.MIT。MT.MIT钱包是香港每天集团(股份)有限公司品牌。
MI.MIT产品涉及行李箱,服装,鞋帽,眼镜,手表,珠宝,化妆品和其他配件。 从最初的设计到板子,著名的大师设计师亲自 *** 纵产品。
在当今的时尚世界中,欧美,日韩等流行风尚,MT.MIT将香港的国际大都市与领先的国际时尚和潮流信息相结合,并结合了快节奏,高效的商务工作和休闲生活。 产品简单时尚,耐用创新。 在选择行李箱,衣服,鞋子和帽子以及各个方面时,我们注重低碳环保,而工艺完全是手工的。
扩展资料注意事项
1、 超负荷盛物,猛力大开大合,易造成受力部位如耳仔、手挽、肩带脱线或断裂,或造成拉链松牙,或造成袋口接驳位边缘撕裂;
2、日常使用随意摆放,与粗糙尖锐物品摩擦或碰撞,造成包袋边角摔跌或配件磨损;
3、终日暴晒或经常湿水未及时风干,或接触油污、酸碱性物品,易造成变形、透色、串色;
4、 长期空置未做内填充和防尘防潮措施,造成制品藏污纳垢、变形、发霉、变味;
5、 对不同材料特性不明,护理不当,使用非对应的护理材料和方法,造成制品变色、破损等。
参考资料来源:百度百科-MT.MIT
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)