今天开始学习mysql数据库了,也是第一次在这里写技术笔记,相信好记忆不如烂笔头,就以此来见证自己的成长吧!
首先安装mysql服务器的过程这里就不啰嗦啦,相信大家都懂的,直接进入主题吧,欢迎那些也是刚开始学习mysql数据库的来一起探讨,是高手的话就发表下意见咯,小弟在这里虚心请教!
一、入门语句:
首先打开运行对话框-->输入cmd-->回车
1.连接到mysql服务器:
mysql -h localhost -u 用户名(通常都是root) -p 密码;
如果不写 -h localhost,默认是连接到本地的mysql服务器,比如在我的电脑:
mysql -u root -p mysql;
2.查看所有的数据库
show databases;
3.选择使用哪个数据库
use databaseName; --这条语句比较特殊,可以不写分号
比如我有一个数据库名字是test,则use test;
4.查看某个数据库下的所有表
show tables;
5.查看表结构
desc(全称description) 表名;
6.建库语句
create database 数据库名;
7.建表语句
注意:建表之前必须先选择使用某个数据库,use test,
create table 表名(
列名 数据类型, --多个列用逗号隔开
......
)
其实建表就是声明列的过程。
8.重命名表
rename table oldName(原来的表名) to newName(新的表名);
注意:不能给数据库重命名的。
9.设置字符集
set names gbk;
二、详解列类型之三大列类型
1.数值型(整型列,浮点型列)
2.字符型列
3.日期/时间类型
整型列存储范围与所占空间
类型 |
字节 | 位 | 有符号 | 无符号 |
tinyint | 1 | 8 | -2^7-2^7-1 | 0-2^8-1 |
smallint | 2 | 16 | -2^15-2^15-1 | 0-2^16-1 |
mediumint | 3 | 24 | -2^23-2^23-1 | 0-2^24-1 |
int bigint |
4 8 |
32 64 |
-2^31-2^31-1 -2^63-2^63-1 |
0-2^32-1 0-2^64-1 |
tinyint类型分析:
默认是有符号的,存储-128-127;
比如:我们有一列age年龄列,年龄适合用tinyint类型,但年龄又不能为负数,这时候我们就要声明为unsigned无符号类型,如:
create table student(
id int,
age tinyint unsigned
)
整型列的可选属性
tinyint(M) unsigned zerofill;
M:宽度(在零填充的时候才有意义),不会影响存储范围
unsigned:无符号类型(非负),会影响存储范围
zerofill:0填充,默认无符号
zerofill详解:
比如:我们往student表新增一列
alter table student add age2 tinyint(5) unsigned(可写可不写) zerofill;
然后我们再往student表插入一行数据时:
insert into student(id,age2) values(1,255);
表里显示的数据会是
id age2
1 00255
位数不够时,用0来填充就是这个意思。
另外,smallint,mediumint,int,bigint用法也是大同小异,此处就不多说了。
浮点型与定点型:
float(M,D),decimal(M,D)
M:代表精度,即总位数(不包含小数点)
D:代表标度,即小数位数
比如float(6,2),代表的取值范围为-9999.99-9999.99
注意:和整型有一点不同的是float的M是影响它的取值范围的,而整型则不会。
float和decimal的区别在于:decimal表达的值更精确,比如我们创建一张商品表:
create table goods(
id int primary key auto_increment,
floatprice float(9,2) not null default 0.00,
decimalprice decimal(9,2) not null default 0.00);
然后插入一行数据:
insert into (name,floatprice,decimalprice) values('法拉利',1234567.23,1234567.23);
goods最终显示的结果是:
id name floatprice decimalprice
1 法拉利 1234567.25 1234567.23
由此可见它们谁更加精确了。
字符型:
char(M),varchar(M)
类型 | 宽度 | 可存字符 | 实存字符(i<=M) | 实占空间 | 利用率 |
char | M | M(0-255字节) | i | M | i/M<=100% |
varchar | M | M(0-65535字节) | i | i字符+(1-2个字节) | i/(i+1-2)<100% |
char和varchar的主要区别:
1.char:定长,M个字符,如果存的小于M个字符,实占M个字符,如果不够M个字符,内部会用空格来补全;
如果某列尾部值存在空格,用char的话会造成空格的丢失:
比如我们创建一张学生表:
create table stu(
id int primary key auto_increment,
name char(8) not null default '',
waihao varchar(8) not null default '');
insert into stu(name,waihao) values('lisi ','lisi ');
这里某人的姓名就是lisi+两个空格
然后我们查询的时候
select concat(name,'!'),concat(waihao,'!') from stu;这里用concat是为了让大家看出效果
结果为:
id name waihao
1 lisi! lisi !
可见,char类型的name列的空格丢失了,为什么呢?
因为char类型,我们这里定义了8个字符,我们实际存储的lisi+加两个空格只有六个字符,它内部会再用2个空格再帮我们补全8个字符,而当我们查询的时候,它会把后面的空格全部去掉,这样就造成我们空格的丢失了。
varchar:变长,M个字符,如果存的小于M个字符,设为N,N<=M,实占N个字符
2.它们的利用率
3.速度上char会比较快
char和varchar的选择原则,以下三方面来考虑:
1.空间利用率,比如四字成语表,就可以用char(4),可以保证空间百分百利用;
而像个人简介,微博这种就应该用varchar;
2.速度上,比如用户名,如果用char,可能会浪费几个字节空间,但从速度上来考虑,当用户注册量非常大的时候,还是选择用char比较好。
最后还有一个text类型的,它是文本类型,可以存储比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议用char,varchar来代替;
text还有一个要注意的:不能给text类型的字段加默认值。
三、日期/时间类型
1.year
1个字节,表示1901-2155年,[0000,表示错误时的选择]
如果输入两位,'00-69',则表示的是2000-2069年;'70-99',则表示的是1970-1999年;
如果嫌记得麻烦,就四位一起输咯。
2.date
典型格式:1990-09-14;
表示的范围:1000-01-01 到 9999-12-31
3.time
典型格式:hh:mm:ss
表示的范围:-859:59:59->859:59:59
4.datetime
典型格式:yyyy-mm-dd hh:mm:ss
表示的范围:1000-01-01 00:00:00->9999-12-31 23:59:59
5.时间戳
1970-01-01 00:00:00到当前的秒数;
一般存注册时间,商品的发布时间并不是用datetime类型来存储,而是用时间戳,
因为datetime虽然直观,但计算不方便。
而用int类型来存储时间戳,方便计算,对于显示来说也方便格式化。