因此,char定长若存空格,读取时会丢失。
而变长不会。
Char利用率小于等于100%,而varchar永远小于100%,1-2个字节用于标志实存字符长度。
Char(M)如何占据M个字符宽度?
答:
如果实际存储内容不足M个,则后面加空格补齐,取出来的时候再把后面的空格去掉,(所以如果内容后面有空格,将会被清除)
选择原则:
1.空间利用效率(M固定选Char)
2.速度
速度上:
定长速度快些,
四.日期时间列类型
Date日期
Time时间
Datatime时间类型
Year年类型
1.Year类型:
1个字节表示1901-2155年【0000年表示错误时】
如果输入两位,“00--69”表示2000—2069,
如果输入两位“70--99”表示1970—1999
如果记得麻烦,输入四位就行了、
2.Date类型:
典型格式,1992-08-12
‘1000-01-01’à’9999-12-31’
3.Time类型,典型格式hh:
mm:
ss
‘-838:
59:
59’à’+838:
59:
59’
4.Datetime典型格式:
’1989-05-0612:
23:
34’
‘1000-01-0100:
00:
00’à‘9999-12-3123:
59:
59`
注意:
在开发中很少使用日期时间类型来表示一个需要精确到秒的列,原因:
虽然日期时间类型能够精确到秒,而且方便查看。
但是计算不便。
用时间戳来表示。
时间戳:
1970-01-0100:
00:
00到当前的秒数
面试1:
当表示性别时,可用1或0表示男女,如,
可能会问到为什么不用enum枚举,原因:
enum不符合关系型数据库设计理念,而且字节上不比tinyint少。
实例:
增删改查之案例过程分析
用户注册表单收集,提交数据,注册页面收集到表单的数据后,形成insert语句,user表插入该条数据,用户注册完成
前台用户中心,用户新昵称,根据新昵称和用户id,形成update语句,完成昵称修改
管理后台点击会员列表,此时,网页形成select语句,查询出所有会员的数据,完成会员的查看
管理员后台选中某用户并且删除,捕捉此用户的id,根据用户id形成相应的delete语句
执行delete语句,完成用户的删除。
阶段总结
(一)
列类型的概念
数值型
整型tinyintsmallintmediumintintbigint
整型的unsigned代表无符号,zerofill代表0填充,M代表宽度(在0填充)
浮点型/定点型float(M,D)unsignedMà精度,即总位数,D代表小数位decimal比float更精确。
字符型
Char(M)定长,可存储的字符数,M<=255
Varchar(M),变长,可存储的字节数,M<=65535
Char与varchar的不同点
Char(M),实占M个字符,不够M个右侧补空格,取出时,在去除右侧空格,导致右侧真有空格时会丢失。
Varchar(M),有1-2个字节来标记真实的长度,
日期时间型
Year1901-2155,如果输2位,‘00-69’之间+2000,‘70-99’之间+1900
DateYYYY-MM-DD,范围在1000-01-01à9999-12-31
TimeHH:
ii:
ss,范围在-838:
59:
59à838:
59:
59
DatetimeYY-MM-DDHH:
ii:
ss1000-01-0100:
00:
00à9999-12-3123:
59:
59
开发中的一个问题—精确到秒的时间表示方式,不是用datetime,而是用int来表示时间戳
用时间戳方便计算,而且方便格式化成不同的显示样式。
建表语句
Createtable表明(
列名称,列类型[列属性][默认值],
…..
)engine引擎名charset字符集
增:
insert
答:
往哪张表增,增那几列,各为什么值?
Insertinto表名
(列1,列2,..列N)
Values
(值1,值2..值N)
**如果不声明插入的列,则默认插入所有列。
改:
update
答:
修改哪张表,修改那几列,修改成什么值?
在哪几行上生效?
Update表名
Set
列1=值1,
列2=值2,
….
列N=值N
Where表达式;
删:
delete
删除哪张表的数据,删除哪些行?
Deletefrom表名
Where表达式
查:
select*from表名
查询的五种语句:
where,group,having,orderby,limit
一.Where条件查询
比较运算符
1.In<值1,值2,值3…..值N>,等于1àN任意一个。
例:
selectgoods_idfromgoodswherecat_idin(4,5);
2.Between值1and值2,表示在值1和值2之间
例:
selectgoods_idfromgoodswherecat_idbetween1and5;
逻辑运算符
1.Not逻辑非
例:
selectgood_idfromgoodswherecat_idnotin(4,5);
2.Or逻辑或
3.And逻辑与
模糊查询:
案例:
想查找‘诺基亚’开头的所有商品
Likeà像,%à通配任意字符_à单个字符
Selectgoods_idfromgoodswheregoods_namelike‘诺基亚%’;
Selectgoods_idfromgoodswheregoods_namelike‘诺基亚__’;
二.Group分组查询
Groupby
作用:
把行按字段分组
语法:
groupbycol1,col2…colN
运用场合:
常见于统计场合,如按栏目计算帖子数,统计每个人的平均成绩等。
Group与统计函数
Max:
求最大,
min:
求最小,
sum:
求总和,
avg:
求平均,
count:
求总行数
练习:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
三.Having
*******例题:
只用一个select,不用子查询和左连接。
四.Orderby
Orderby排序功能
接一个或多个字段对查询结果进行排序
知识点在本项目案例的运用
对栏目的商品按价格由高到低或由低到高排序
知识点的运用场合描述
各种排序场合,如取热点新闻,发帖状元等。
多重排序:
Limit在语句的最后起到了限制条目的作用。
Limitoffset,[N]
offset:
偏移量,N:
条目;如果不写,则从头开始写。
即:
limit0,N;
Truncatetable清空表
思考:
取出每个栏目下最贵的商品
解法一:
首先建个临时表g2,将goods表导入g2,
此时,g2中每个栏目的第一个goods_id就是该栏目下最贵的那个,再取出每个栏目下的第一个。
解法二:
思想类似解法一,将select后的结果看作是一张表。
五.良好的理解模型
1.Where表达式:
把表达式放在行中,看表达式是否为真,
2.列:
理解成变量,可以运算
3.取出结果:
可以理解成一张临时表
六.子查询
1.Where型子查询
2.From型子查询
3.Exist型子查询
一.Where型子查询
是指把内层的查询结果作为外层查询的比较条件。
二.From型子查询
把内层的查询结果当成表供外层继续查询
使用了from+where子查询。
三.Exists子查询
把外层的查询结果拿到内层,看内层的查询是否成立。
阶段总结二
查select
Where表达式
表达式在哪一行成立,哪一行就取出来
=,!
=/<>,>,<,>=,<=,in,betweenand,or,not
Groupby
分组,一般和统计函数配合使用
Max,min,avg,sum,count
Having
数据在表中,表在硬盘或内存以文件形式存在
Where就是针对表文件发挥作用的
查询的结果,也可以看成一张表,其文件一般临时存在缓冲区
针对查询的结果发挥作用
Orderby
作用:
排序
可以针对字段,升序