MySQL(2):表的建立及常用数据类型

为什么关系型数据库的语法都比较相似?

IBM实验室搞了一套SQL标准(规范),结构化查询语句(Structured Query Language)。

MySQL分页

select * from 表名 limit 从第几条取 取出几条;

建表。

create table 表名 (

列名 列的数据类型(MySQL的数据类型),

....

); character set 字符集名称 collate 校对规则


MySQL的数据类型中,把日期(date,年月日)和时间(datatime,时分秒)分开了。

create table users(id int, name varchar(64), pwd varchar(64), birthday date);


对于一个关系型数据库的列类型,就是一个重点!

1. bit类型

create table test1(id bit(1)); -- 1位

create table test1(id bit(64)); -- 64位 --> 最多64位

2. tinyint类型

create table test2 (num tinyint);

insert into test2 values (1); --  默认是有符号,1字节

1 111 1111 (-128) ~ 00000000(0) ~ 0 111 1111 (127)

计算机整型的存储方式 … 还是很复杂的…

负数用补码来表示……

create table test3 (num tinyint unsigned); -- 定义无符号的tinyint,1字节。0 - 255


3. smallint类型 2字节


4. int类型 4字节


5. bigint类型 8字节


6. float类型 4个字节 定长

create table test4 (num float); -- 默认

insert into test4 values (45.67);

create table test5 (num float(5,1)); -- 一共5位,小数1位

insert into test5 values (45.67); -- 四舍五入!

select * from test5;

MySQL允许使用非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。这里,“(M,D)”表示该值一共显示M位整数,其中D位位于小数点后面。例如,定义为FLOAT(7,4)的一个列可以显示为-999.9999。MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)列内插入999.00009,近似结果是999.0001。

四舍五入!财务软件怎么办??


7. double类型 8个字节  定长


8. decimal,numeric 定点小数

numeric(m,d) -- d==0,整数

e.g.  在新版本中

DECIMAL(4, 1) -999.9  9999.9

DECIMAL(5,1) -9999.9  99999.9

DECIMAL(6,1) -99999.9  999999.9

DECIMAL(6,2) -9999.99  99999.99

DECIMAL(6,3) -999.999  9999.999

当数值在其取值范围之内,小数位多了,则直接截断小数位。

若数值在其取值范围之外,则用最大()值对其填充。


create table test6 (num numeric); -- 什么都不写,默认d是0了。

Query OK, 1 row affected, 1 warning (0.00 sec)。 有警告!四舍五入!

insert into test6 values (45.67); -- 46

select * from test6;


create table test7 (num numeric(5,2)); -- 一共5位,小数点2位

insert into test7 values (45.67); 

insert into test7 values (45.67823); -- 四舍五入! 

select * from test7;


9. 主要的字串类型

(1)char -- 定长。 最大 0-255个字节,每个英文字符一个字符
e.g. 学号,isbc,xxx……

char(20) 定长! 如果存的是 'abc' , 实际上是 'abc                '; -- 定长!
select * from users where name = 'abc'; -- 查不出来!
create table test8 (content char(20));
insert into test8 values ('abc123');

mysql> insert into test8 values ('C加加'); -- 汉字加不进去!
ERROR 1406 (22001): Data too long for column 'content' at row 1
汉字在CMD,MySQL的CMD加不进去…
ASCII码,GBK码,……

【小trick】
show variables; -- 显示所有的参数
show variables like 'char%'; -- 把关于字符的参数列出来

set character_set_client=gbk; //通过mysql控制台,就可以存中文

set character_set_results=gbk; //可以看中文

之前控制台只能接收utf-8,而中文是gbk…

在控制台上,把客户端的字符集&结果字符集 改成 gbk,就可以在MySQL的控制台添加中文了。

但实际上,存储的还是utf-8,MySQL会帮忙转成utf-8。


(2)varchar(m) -- m表示大小,最大是65535个字节(也就是66535个英文字符,或xxx中文字符)
create table test9 (num varchar(32));
insert into test9 values ('qcyfred');
select * from test9;

(3)text 大文档
drop table if exists test_text;
create table test_text (content text);
insert into test_text values ('算法与数据结构');
select * from test_text;

10. 3种常用的时间/日期类型

select now() from dual;

(1) date 年-月-日

create table test10 (birthday date);
insert into test10 values (now());
select * from test10;

(2) datetime 日期时间类型 (年月日时分秒)
create table test11 (tradetime datetime);
insert into test11 values (now());
select * from test11;

(3) timestamp 年月日时分秒
该类型可以保存年-月-日 时:分:秒
和datetime的区别是:

它和datetime 最大的区别是,当你 update 某条记录的时候,该列值,它会自动更新!

create table test12 (name varchar(64), salary float, hiredate1 timestamp, hiredate2 datetime);
insert into test12 values ('aaa',56.7, now(),now());
select * from test12;
update test12 set salary = salary + 10 where name = 'aaa';
select * from test12;
timestamp类型,在更新记录的时候,会自动更新!
邮戳类型要慎用!!!
财务软件要死惨!!!

select now() from dual; -- dual 虚表… 专门用来做测试用的表。

综合案例

字段

属性

Id

整型

name

字符型

sex

字符型或bit型

birthday

日期型

entry_date

日期型

job

字符型

salary

小数型

resume(简历)

大文本型


drop table if exists users;
create table users (id int, name varchar(64), sex char(2), birthday date, entry_date date, job varchar(64), salary float, rusum text);


修改表结构。
修改不能修改列名,只能修改数据类型。

追加列
alter table 表名 add 列名 数据类型
alter table users add image blob; -- blob 二进制的方式存放
show create table users;

修改列(有数据的话,修改不会成功)
alter table 表名 modify 列名 新的数据类型(含大小)
alter table users modify job varchar(60);

删除列
alter table 表名 drop 列名
alter table users drop sex;

改表名
rename table 旧表名 to 新表名
rename table users to employee;

改字符集
alter table 表名 character set utf8; -- gbk, utf8

修改列名
alter table 表名 change column 原列名 新列名 数据类型(含大小)
alter table users change column name username varchar(64);

desc users; (describe
create table 表名;
create database 数据库名;



你可能感兴趣的:(数据库,mysql,数据库)