目录
0.打开MySQL
要设置环境变量才能这样打开
mysql -uroot -p
root
1.操作数据库
--创建数据库
create database mydatabase;
create database mydatabase2 charset gbk;
--显示所有数据库
show databases;
--查看以my开头的数据库
show databases like 'my%';
--查看单个字符_
show databases like 'my_ql';
--查看数据库创建语句
show create database mydatabase;
--选择数据库
use mybatabase;
--修改数据库字符集
alter database mydatabase charset gbk;
--删除数据库
drop database mydatabase;
2. 操作表
--创建数据表
CREATE TABLE class(
-- 字段名 字符类型
--字段与表其实是分不开的
name VARCHAR(10) --10个字符(不能超过)
);
--将数据表放在数据库下
CREATE TABLE mydatabase.class(
name VARCHAR(10)
);
--进入数据库,创建表
USE mydatabase;
CREATE TABLE class(
name VARCHAR(10)
);
--使用表选项
CREATE TABLE student(
name VARCHAR(10)
)engine [=] innodb/myisam charset utf8;
--复制已有结构
CREATE TABLE teacher LIKE mydatabase.teacher;
--显示所有表
show tables;
show tables LIKE 'c%';
--显示表结构 field:字段名 type:字段类型 Null:是否允许为空 key:索引 Default:默认值 Extra:额外的
describe class;
DESC teachar;
show columns FROM student;
--查看创建表的语句
show CREATE TABLE student;
--语句结束符排版不一样
show CREATE TABLE student\g
show CREATE TABLE student\G
--修改表选项
ALTER TABLE student charset gbk;
--修改表名
rename TABLE student TO my_student;
--给学生表增加age字段
ALTER TABLE my_student ADD [column] age int;
ALTER TABLE my_student ADD id INT first;
--修改字段名
ALTER TABLE my_student change age nj int;
--修改字段类型
ALTER TABLE my_student modify name VARCHAR(20);
--删除字段
ALTER TABLE my_student DROP nj;
--删除表结构表名[,表名]
DROP TABLE my_student,class,teacher;
3.操作列表
--整数类型
--tinyint 采用一个字节保存的整型,表示0-255 -128~127
--smallint 采用两个字节 ,表示0-65535
--mediumint 三个字节
--int 四个字节
--bigint 八个字节
CREATE TABLE my_int(
int_1 tinyint,
int_2 smallint,
int_3 mediumint,
int_4 int,
int_5 BIGINT
)charset utf8;
ALTER TABLE my_int ADD int_6 TINYINT unsigned first;
ALTER TABLE my_int ADD int_6 TINYINT zerofill first;
--zerofill会进行补齐
--插入数字不超过限定范围都行,可以超出自己设定的范围
ALTER TABLE my_int ADD int_7 TINYINT(2) zerofill first;
小数类型 浮点型:精度类型
浮点数能储存较大的数,原因是通过指数存储
浮点型又称之为精度类型:是一种有可能丢失精度的数据类型,数据有可能不那么准确(由其是在超出范围的时候),
Float又称之为单精度类型:系统提供4个字节用来存储数据,但是能表示的数据范围比整型大的多,大概是10’38﹔只能保证大概7个左右的精度(如果数据在┐位数以内,那么基本是准确的,但是如果超过┐位数,那么就是不准确的)
Double又称之为双精度。系统用8个字节来存储数据,表示的范围更大,10^308次方,但是精度也只有15位左右。
基本语法
Float:表示不指定小数位的浮点数。
Float(M,D):表示一共存储M个有效数字,其中小数部分占D位sFloat(10,2):整数部分为8位,小数部分为2位
如果数据结构丢失,浮点型会四舍五入
定点数decimal
Decimal定点数:系统自动根据存储的数据来分配存储空间,每大概9个数就会分配四个字节来进行存储,同时小数和整数部分是分开的。
Decimal(M,D):M表示总长度,最大值不能超过65,D 代表小数部分长度,最长不能超过30。
定点数会更加精确,但定点数无法进位
3.1.操作数据
--插入数据到数据表
CREATE TABLE my_teacher(
name varchar(10),
age INT
)charset utf8;
--可以只插入部分
INSERT INTO my_teacher (name,age) VALUES('jack',30);
INSERT INTO my_teacher VALUES('ham',20);
--获取数据-表
SELECT *FROM my_teacher;
SELECT name FROM my_teacher;
SELECT name FROM my_teacher WHERE age =30;
--删除数据
DELETE FROM my_teacher WHERE age =30;
--更新数据
UPDATE my_teacher SET age = 25 WHERE name= 'tom';
--修改字符集
SET names gbk;
--等价于SET character_set_client = gbk;
--SET character_set_connection = gbk;
--SET character_set_results = gbk;
--查看系统保存的三种关系处理字符集
show variables LIKE 'character_set%';
--修改变量
SET character_set_client = gbk;
3.2.操作日期
时间日期类型
DATE
日期类型:系统使用三个字节来存储数据,对应的格式为:YYYY-mm-dd,能表示的范围是从1000-01-01到 9999-12-12,初始值为0000-00-00
TIME
时间类型:能够表示某个指定的时间,但是系统同样是提供3个字节来存储,对应的格式为:HH:ii:ss,,但是mysal…中的 time类型能够表示时间范围要大的多,能表示从-838:59:59~838:59:59,在mysql 中具体的用处是用来描述时间段。
DATETIME
日期时间类型:就是将前面的date和time合并起来,表示的时间,使用8个字节存储数据,格式为YYYY-mm-dd HH:iliss,能表示的区间1000-01-01 00:00:00 到9999-12-1223:59:59,其可以为o值: 0000-00-0000:00:00
timestamp
时间戳类型,从格林威治时间开始但格式依然是YYYY-mm-dd HH:iliss
YEAR
年类型:占用一个字节来保存,能表示19002155年,但是year有两种数据插入方式:o99和四位数的具体年。
year进行两位数插入的时候,有一个区间划分,零界点为69和70:当输入69以下,那么系统时间为20+数字,如果是o以上,那配系统时间为19+数字
CREATE TABLE my_date(
d1 date,
d2 time,
d3 datetime,
d4 timestamp,
d5 YEAR(4)
)charset utf8;
INSERT INTO my_date VALUES(‘1900-01-01’,‘12:12:12’,‘1900-01-01 12:12:12’,‘1999-01-01 12:12:12’,‘69’);
当timestamp对应的数据被修改时,会自动更新数据为当前时间
update my_date set di='2000-01-01' where d5=2069;
在进行时间类型录入的时候(time)还可以使用一个简单的日期代替时间,在时间格式之前加一个空格,然后指定一个数字(可以为负)。系统会自动将该数字转换成天数*24小时,再加上后面的时间。
PHP中有着非常强大的时间日期转换函数: date将时间戳转换成想要的格式,strtotime,又可以将很多格式转换成对应的时间戳。PHP通常不需要数据库来帮助处理这么复杂的时间日期,所以通常配合PHp的时候,时间的保存通常使用时间戳(真正),从而用整型来保存。
3.3.string
数据类型 | 使用的字节 | 属性 |
---|---|---|
char(n) | n<=255 | 字符 |
varchar(n) | n<=65535 | 字符 |
binary(n) | n<=255 | 二进制 |
varbinary(n) | n<=65535 | 二进制 |
tinytext() | n<=255 | |
text | 65535 | |
mediumtext | 1.67e+7 | |
longtext | 4.29e+9 | |
tingblob | 255 | 二进制 |
blob | 65535 | 二进制 |
mediumblob | 1.67e+7 | 二进制 |
longblob | 4.29e+9 | 二进制 |
varchar,要记录数据长度(系统根据数据长度自动分配空间),所以每个varchar,数据产生后,系统都会在数据后面增加1-2个字节的额外开销:是用来保存数据所占用的空间长度s如果数据本身小于127个字符。额外开销一个字节,如果大于127个,就开销两个字节
char会预先划好空间,大小固定
Text :存储普通的字符文本
Blob:存储二进制文本(图片,文件),一般都不会使用blob来存储文件本身,通常是使用—个链接来指向对应的文件本身
enum
枚举类型:在数据插入之前,先设定几个项,这几个项就是可能最终出现的数据结果。
如果确定某个字段的数据只有那么几个值:如性别,男、女、保密,系统就可以在设定字段的时候规定当前字段只能存放固定的几个值:使用枚举,
基本语法:enum(数据值1,数据值2…)
系统提供了1到2个字节来存储枚举数据﹔通过计算enum列举的具体值来选择实际的存储空间:如果数据值列表在 255个以内,那么一个字节就够,如果超过255但是小于65535,那么系统采用两个字节保存。
enum能够规范数据
CREATE TABLE my_enum(
gender enum('男','女','保密')
)charset utf8;
insert into my_enum value('女');
INSERT INTO my_enum value('男');
--存储数字
--男1,女2,保密3
--字段将按照数值输出
select gender +0 from my_enum;
--所以可以插入数字
INSERT INTO my_enum VALUES(3);
set
集合:是一种将多个数据选项可以同时保存的数据类型,本质是将指定的项按照对应的二进制位来进行控制:1表示该选项被选中,o表示该选项没有被选中。
基本语法:set(值1;值;值 3…)
系统为set提供了多个字节进行保存,但是系统会自动计算来选择具体的存储单元
1个字节: set只能有8个选项s2个字节: set只能有16个选项3个字节: set只能表示24个选项,8个字节:set可以表示64个选项
CREATE TABLE my_set(
hobby SET('篮球','足球','羽毛球','乒乓球','网球','星球')
-- 1 1 1 1 1 1
)charset utf8;
INSERT INTO my_set VALUES('篮球,网球,羽毛球');
-- 101010
--系统在进行存储的时候会自动将得到的最终的二进制颠倒过来,然后再进行转换成十进制存储
--存储转化 010101 --》1+4+16=21
SELECT hobby +0 FROM my_set;
--可以用数字表示选择 63表示全部选中,可以这样做但实际并不会这么做
insert into my_set values(63);
mysql记录
mysql只允许65535个字节,
varchar可以有65535个字符
utf8标准 65535/3=21845
gbk 65535/2=32767 如果为varchar需要额外2个字节记录长度
所以在varchar标准下utf8可储存21844个字节,gbk可储存21844个字节
字段属性
1属性
1.null
字段为空
1、在设计表的时候,尽量不要让数据为空,
2、Mysql_的记录长度为65535个字节,如果一个表中有字段允许为NULL,那么系统就会设计保留一个字节来存储NULL,最终有效存储长度为65534个字节。
2.default
age int default 18
3.列描述
类似于注释但是能够让开发者看到
create table my_comment(
user varchar not null comment (user不能为空)
)charset utf8;
show create table my_comment;
主键
primary key
随表创建
CREATE TABLE my_pri1(
username VARCHAR(10) PRIMARY KEY
)charset utf8;
CREATE TABLE my_pri2(
username varchar(10),
PRIMARY KEY(username)
)charset utf8;
--后添加主键
create table pri3(
username varchar(10)
)charset utf8;
alter table pri3 add primary key (username);
--删除主键
alter table pri3 drop primary key;
--复合主键
主键描述pri 主键不允许为null
当删除主键时not null属性不会被删除
复合主键数据不能重复
业务主键:主键所在的字段,具有业务意义(学生ID,课程ID)
逻辑主键:自然增长的整型(应用广泛)
自动增长
auto_increment
create table auto(
id int primary key auto_increment,
user varchar(10) not null
)charset utf8;
insert into auto values(null,'tom');
--修改auto_increment
alter table auto auto_increment =10;
--删除自增长
alter table auto modify id int;
--查看自增长变量
show variables like 'auto_increment%';
一张表只能拥有一个自增长,auto_increment不能改小
唯一键
unique key
一张表只能有一个主键,唯一键能有多个
唯一键字段可以为null
非空不允许重复
在看到创建语句UNI会自动为字段起名通常为字段名
username varchar unique
username varchar.
unique key(username)
alter table unique1 add unique key(username);
--删除唯一键
alter table unique1 drop index username[columnname];
表关系
一对一
一对多
建立两张表
多对多
建立三张表,建立一个中间表形成两个多对一的关系