设计题 有一个MySQL数据库store,在store数据库中含有一个销售表sale,用于存放商品的销售记录。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计题 有一个MySQL数据库store,在store数据库中含有一个销售表sale,用于存放商品的销售记录。相关的知识,希望对你有一定的参考价值。
sale表的结构如下:
字段名 类型 附加属性 字段含义
id int auto_increment 序号
pm varchar(30) 商品名称
price decimal(9,2) 单价
num int 数量
sum decimal(11,2) 金额
写出下列各题的SQL实现命令。
1.打开store数据库。
2.按照上述表结构,写出创建sale表结构的SQL命令。
3.给sale表插入下面一个记录:
id pm price num
1 电视机 1400.00 4
4.查询全部记录。
5.更新每个销售记录的金额。
6.查询价格大于4000元的销售记录,要求查询结果按金额从高到低排序。
编程题
1、根据以下公式,计算s的值。
其中,a、b、c的值通过图1所示的网页文件multi.htm的表单来输入,表单的3个文本框的名字分别是a、b、c,单击“计算”按钮,将表单上输入的数据发送给WEB服务器的php程序calc_multi.php来接收,由calc_multi.php按照上述公式实现计算s的值,并输出s的值。比如在图1中输入10、20、30,单击“计算”按钮,显示如图2所的结果。
图1 图2
下面给出multi.htm的部分内容,请在划线处填上有关内容。
<form name="form1"method="________" action="________">
输入三个数值
<input name="__________"type="text" size="5">
<input name="__________"type="text" size="5">
<input name="_________"type="text" size="5">
<input type="__________"name="Submit" value="计算">
</form>
2、写出上述第1题的calc_multi.php的程序代码。
3、根据前面第四题的store数据库的sale表的结构,写一个PHP程序,以表格形式输出sale表的全部记录,输出样式如图3所示。
图3
其程序的部分内容如下,根据程序的上下文,在划线处书写一段PHP程序。
<body>
<table width="358" border="1"cellpadding="0" cellspacing="0">
<tr>
<tdwidth="52" >商品名</td>
<tdwidth="77" >单价</td>
<tdwidth="46" >数量</td>
<td width="45" >金额</td>
</tr>
____________________________________________________________
</table>
</body>
use store;
create table sale(id int auto_increment primary key,pm varchar(30) ,price decimal(9,2),num int,sum decimal(11,2));
insert into sale(pm,price,num) values (\'电视机\',1400.00,4);
select * from sale;
update sale set sum = 0 ;
select * from sale where price > 4000.00 order by sum desc
method = "post"
action = "calc_multi.php"
a
b
c
submit
...
CREATE DATABASE store;
USE store;
CREATE TABLE sale(
id INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT "序号",
pm VARCHAR(30) COMMENT "商品名称",
price DECIMAL(9,2) COMMENT "单价",
num INT(11) COMMENT "数量",
SUM DECIMAL(11,2) COMMENT "金额"
)ENGINE=INNODB;
INSERT INTO sale(id,pm,price,num) VALUES(1,"电视机",1400.00 ,4);
INSERT INTO sale(id,pm,price,num) VALUES(2,"电视机",7400.00 ,11);
INSERT INTO sale(id,pm,price,num) VALUES(3,"电视机",1500.00 ,9);
SELECT * FROM sale;
UPDATE sale SET SUM=price*num;
SELECT * FROM sale WHERE SUM>4000 ORDER BY SUM DESC;
mysql表设计的一些面试题
MySQL表设计有一些比较重要的点,面试的时候常常会被问到。
为什么一定要设置一个主键?
在不设置主键的情况下,InnoDB存储引擎会帮你生成一个隐藏列作为自增主键。因此,手动指定主键可以为以后的维护带来便利,比如说在自定义主键上建立主键索引来提高查询效率。
主键是用自增还是随机(UUID)?
主键建议是自增的好。因为InnoDB中的主键是聚簇索引,如果主键是自增的话,每次插入新的记录就会顺序添加到当前索引节点的后续位置,当一页写满就会自动开辟新的页。如果不是自增主键,可能就会在中间插入,引发页的分裂导致产生很多表空间的碎片。
可以理解为当主键是UUID的时候,插入表记录的时间会更长,占用空间也会更大。
主键为什么不推荐有业务含义?
主要有两点。
1.任何有业务含义的列都有改变的可能性,主键一旦带上了业务含义,那么主键就有可能发生变更。而主键一旦发生变更,该记录数据在磁盘上的存储位置就会发生改变,甚至有可能会引发页分裂导致产生空间碎片。
2.带有业务含义的主键就不一定是顺序自增的了,这样就会导致数据的插入顺序不到有序的,也不能保证后面插入数据的主键一定比前面的数据大。如果出现了后面插入数据的主键比前面的小的情况,就有可能引发页分裂导致产生空间碎片。
表示枚举的字段为什么不用enum类型?
表示枚举的字段一般选用tinyint类型。不选用enum类型主要有两个原因:
1.enum类型的order by的操作效率低,需要额外的操作。
2.如果枚举值是数值类型的,会很容易出现语法陷阱,枚举的下标和数值很容易会被弄混淆。
货币字段用什么类型?
如果货币单位是分,可以是int类型;如果坚持用元,则要用decimal类型。
但是是不能用float和double类型的,因为这两个类型是以二进制存储的,会有一定的误差。比如float类型如果你insert一个1234567.23,查询出来的结果可能是1234567.25。
时间字段用什么类型?
时间字段的话需要结合项目背景,varchar、timestamp、datetime或bigint类型都可以。
1.varchar类型。如果用varchar类型来存时间,优点在于显示直观,存取都方便。但是缺点也是挺多的,比如插入的数据没有校验,某一天你可能会发现数据库中存了一个2019-06-31的数据。其次,做时间比较运算时需要用str_to_date()
等函数将其转化为时间类型,除非建立基于函数的索引,否则这么写是无法命中索引的,数据量一大,查询效率就会很低。
2.timestamp类型。这个类型是四个字节的整数,它能表示的时间范围为1970-01-01 08:00:01到2038-01-19 11:14:07,而2038年以后的时间,是无法用timestamp类型存储的。但是它有一个优势是它带有时区信息的,一旦系统中的时区发生改变,项目中的该字段的值也会自己发生改变。
3.datetime类型。datetime类型的储存占用8个字节,存储的时间范围为1000-01-01 00:00:00 ~ 9999-12-31 23:59:59。显然,存储时间范围更大,但是它存储的是时间绝对值,不带有时区信息。如果改变了数据库的时区,该项的值不会自己发生变更。
4.bigint类型。这个类型也是8个字节,自己维护一个时间戳,表示范围比timestamp类型大多了。缺点就是要自己维护,不大方便。
为什么不直接存储图片、音频和视频等大容量内容?
在实际应用中,一般都是用HDFS来存储文件的,在MySQL中只会存文件的存放路径。但是实际上MySQL是有提供两个字段类型被涉及用来存放大容量文件的,一个是text类型,一个是blob类型。然而在生产中基本不会使用这两个类型,主要原因如下:
1.MySQL内存临时表不支持text和blob这样的大数据类型。如果查询中包含这样的数据,那么在排序等操作的时候就不能够使用内存临时表,只能使用磁盘临时表,会导致查询效率低下。
2.这两种类型会造成binlog的内容太多。因为数据的内容比较大,也就会造成binlog的内容比较多。我们知道,主从同步是通过binlog来进行的,如果binlog过大,就会导致主从同步的效率问题。
为什么字段要被定义为NOT NULL?
1.索引的性能不好。MySQL难以优化引用可空列查询,它会使得索引、索引统计和值更加复杂。可空列需要更多的存储空间,还需要MySQL内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节。
2.查询可能会出现一些不可预料的结果。比如说使用count()聚合函数去统计一个可为空的字段,那么最后统计出来的记录数可能会和实际的记录数不同。
MySQL表设计面试题的总结
MySQL如果要深入提问的话,可以把你问到叫爸爸,因此平时要注意多积累。
另外要注意的是,上面的回答都是基于InnoDB存储引擎的。
"心结如果真的打不开,你就给它系成个花样儿,其实生活就需要这样。"
以上是关于设计题 有一个MySQL数据库store,在store数据库中含有一个销售表sale,用于存放商品的销售记录。的主要内容,如果未能解决你的问题,请参考以下文章
Ngrx Store 在浏览器刷新后重置。如何让应用保持状态?
System.Data.SqlClient.SqlException:“将 nvarchar 值 'STORES' 转换为数据类型 int 时转换失败。”