创建表
create table 表名(
id int,
name char(18),
字段名3 类型[(宽度) 约束条件]
);
注意:
- 在同一张表中,字段名是不能相同
- 宽度和约束条件可选
- 字段名和类型是必须的
- 放在中括号里面的内容是可以不写的
创建一张学生表
create table student(id int,name char(18));
写入数据的方式
插入数据:插入一条数据
insert into student values(1,'alex');
插入数据:插入多条数据
insert into student values(2,'wusir'),(3,'大壮');
插入数据:指定写入某一个字段
insert into student (name) values('语文杨');
insert into student (id) values(4);
插入数据:另一种写法
insert into student (id,name) values(5,'语文杨');
insert into student (字段1,字段3) values(值1,值3);
查表中的数据
select * from 表名;
查看表结构
desc 表名;
能够查看到有多少个字段/类型/长度,但是看不到表编码,引擎,具体的约束信息也只能看到一部分
show create table 表名;
能够查看到字段/类型/长度/编码/引擎/约束。 但是格式不太直观
mysql中的数据类型
数字
TINYINT:(1个字节)简洁的整形,一个字节就能表示.一个字节就是8位(00000000-11111111)
能表达256种情况。单纯的表示正整数。如果第一位表示符号了,那就剩下7位了。7位就能表示128种情况了。
所以:TINYINT用一个字节,如果是有符号的整数,他能表示从(-128,127),如果是无符号的整数,他就能表示(0,255)
如果想表示年龄,用TINYINT就行了。为了最节省空间,也严谨一点。
SMALLINT:(2个字节)
MEDIUMINT:
INT或INTEGER:一般用这个就能表达了
BIGINT:8个字节
上面这些数字都是有符号的,就是有负数的。如果想没有负数。建表的时候,加unsigned约束一下就行
创建一张表
id是int类型的,age是tinyint 类型的且没有符号,都是正数。
默认是有符号的,如果需要定义无符号的使用unsigned
create table t1(id int,age tinyint unsigned);
插入数据
insert into t1 values(1,1);
插入完之后,是可以正常看到数据的
插入数据
insert into t1 values(-1,-1);
插入边界数据
insert into t1 values(256,256);
小数
Float:精确到小数点后面4,5差不多了
float(255,30):小数点后面30位,一共255位
float(5,2):小数点后面2位,一共5位。如:234.32
Double:可以精确到小数点后面更多的位数
创建一个表
create table t2(
f1 float(5,2), #保留两位小数,并四舍五入
f2 float,
f3 double(5,2),
f4 double
);
插入数据
insert into t2 values(5.2336,5.2336,5.2336,5.2336);
select * from t2;
insert into t2(f2,f4) values(5.1254789654545646,5.1254789654545646);
大部分的时候用float的就可以了
创建一张表
create table t3(f1 float,d1 double,d2 decimal(30,20),d3 decimal);
decimal默认是10位整数:decimal(10,0)
insert into t3 values(5.1254789654545646,5.1254789654545646,5.1254789654545646,5.1254789654545646);
总结:
int 不约束长度,最多表示10位数
float(m,n)
m 一共多少位
n 小数部分多少位
时间格式
前3个最多
data 20190620
time 231520(23点15分20秒)
datatime 20200331231520
year 范围:1901/2155
timestamp 1970-01-01 00:00:00/2038(几乎现在没人用了,时间快到期了)
创建一张表
create table t4(
dt datetime,
y year,
d date,
t time,
ts timestamp
);
insert into t4 values(now(),now(),now(),now(),now());
insert into t4 values(20180808080808,2018,20180808,080808,20180808080808);
insert into t4 (dt,d) values('2018-8-8 8:21:08','2018-8-8');
update t4 set y=2016 where y=2020;
这样就有一个好处,就是总是记录最后一次操作的时间
但是timestamp这个时间类型,快到期了,不用了。要是datetime有这个功能就好了
有办法:
如下:
create table t5(
id int,
dt datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
#NOT NULL(不为空) DEFAULT CURRENT_TIMESTAMP(默认是当前时间) ON UPDATE CURRENT_TIMESTAMP(在更新的时候使用当前时间更新字段)
字符串
char
varchar
char(18) 最多能表示255个字符(中英文最多能写255个)
-
定长存储:比如存一个 alex 在库里是 alex后面加14个空格
-
节省时间,但是浪费空间
varchar(18) 最多能表示65535个字符(中英文最多能写65535个)
-
变长存储:比如存一个 alex 在库里是 alex4 后面4是这个字符的长度
-
这个更节省空间,但是存储速度慢。(因为总是先计算多长才能取,先计算一下多长才能存进去)
什么时候适合用char
身份证号
手机号码
qq号(因为QQ有5位,6,7,8,9...)
username
password
银行卡号
适合用varchar的
评论
朋友圈
微博
创建一张表
create table t6(
c1 char,
v1 varchar(1),
c2 char(8),
v2 varchar(8)
);
insert into t6 values('alex q','alex q','alex q','alex q');
enum/set
-
enum 单选行为
-
set 多选行为
enum 单选行为
性别,国籍
create table t8(
id int,
name char(18),
gender enum("male","female") #限定只能写入"male"或"female"
);
insert into t8 values(1,"alex","不详");
是写不进去的
set 多选行为
create table t9(
id int,
name char(18),
hobby set("抽烟","喝酒","烫头")
);
insert into t9 values(1,"太白","喝酒,烫头"); #多选的时候,只能在引号里面,用逗号隔开
insert into t9 values(1,"太白","喝酒,喝酒,喝酒,烫头,打游戏"); #存的时候,会先去重,将不再里面的所有内容去掉