飞道的博客

初始MySQL

347人阅读  评论(0)

目录 

一、什么是数据库

二、SQL分类

三、库的操作

四、表的操作

五、数据类型

六、表的约束


什么是数据库

存储数据用文件就可以了,为什么还要有数据库?

文件保存数据有以下几个缺点:

文件的安全性问题
文件不利于数据查询和管理
文件不利于存储海量数据
文件在程序中控制不方便
理解数据库
软件角度
有了数据库,用户或用户程序能更方便的数据管理!
数据库也是用文件的方式进行数据保存的
数据库中直接和文件打交道的,是数据库的存储引擎!

文件角度

如下图,本来我们如果要对文件中的数据进行增删改查,就得自己去找文件并增加或修改数据的,

有了数据库之后,就可以交给它来做,我们只需要对数据库做一些处理即可!

我们下载的数据库就是图中的mysql和mysqld,即客户端与服务器,mysql是CS模式,在本地访

问时:mysql 127.0.0.1 3306,3306是端口号,127.0.0.1是本地IP地址

mysql或者数据库属于应用层,需要我们自己安装,底层一定是直接或间接访问OS的文件接口

数据库中的库+表全部都会在该路径下!

服务器、数据库、表之间的关系

所谓的创建数据库,本质就是在Linux下创建一个目录

所谓的创建数据库表,本质就是在特定目录下创建特定的文件!

数据的逻辑存储

MySQL 是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如 Unix/Linux、
Windows、Mac和Solaris!
SQL分类
DDL:数据定义语言,用来维护存储数据的结构代表指令: create, drop, alter
DML:数据操纵语言,用来对数据进行操作代表指令: insert, delete,update,DML中又单独
分了一个DQL,数据查询语言,代表指令: select
DCL:数据控制语言,主要负责权限管理和事务代表指令: grant,revoke,commit
为什么会有不同的SQL分类?
因为使用SQL的人,它的需求是不一样的!
MySQL的核心就是插件式存储引擎,支持多种存储引擎!
库的操作
创建数据库
create database db_name;
创建一个utf8字符集的数据库
create database db2_name charset=utf8;
创建一个使用utf字符集,并带校对规则的数据库
create database db_name charset=utf8 collate utf8_general_ci;
校对规则:比如当我们取数据的时候,以什么样的方式取结果是不一样的,而校对规则就类似于这
样!!!
如下图,两种不同的校对规则,查询的结果不一样

显示创建数据库的详情

数据库名字的反引号``,是为了防止使用的数据库名刚好是关键字

注意:下图中的/*...*/不是注释,表示当前mysql版本大于4.01版本,就执行这句话!

修改数据库

alter database db_name 新的字符集或校对规则;

对数据库的修改主要指的是修改数据库的字符集,校验规则,数据库名也能改,最好别改!

如下图,修改了字符集

删除数据库

drop database db_name;

查看连接情况 

show processlist;

表的操作

创建表,如下图,红色框中的可不带!fifield 表示列名,datatype 表示列的类型

注意:不同的存储引擎,创建表的文件不一样,如下图,users.frm:表结构,users.MYD:表数

据,users.MYI:表索引

查看表结构,desc table_name

修改表结构

建议:表结构最好不要修改!!!

添加某一列

ALTER TABLE tablename ADD (column datatype [DEFAULT expr][,column datatype]...);
如下图,在id列之后添加sno列
注意:没有before!!!

修改某一列

ALTER TABLE tablename MODIfy (column datatype [DEFAULT expr][,column datatype]...);

删除某一列

ALTER TABLE tablename DROP (column);

修改表名

alter table users rename to employee;
注意:to可以省略!!!
修改列名
alter table employee change name xingming varchar(60);
删除表
drop table table_name;
数据类型
数据类型的分类
数值类型:BIT(M),TINYINT [UNSIGNED],INT [UNSIGNED],FLOAT[(M,D)]  [UNSIGNED],
DECIMAL(M,D) [UNSIGNED]
文本、二进制类型:CHAR(SIZE),VARCHAR(SIZE),TEXT
时间日期:DATE/DATETIME/TIMESTAMP
String类型:ENUM,SET
当我们进行插入的时候,如果数据越界(插入了不符合对应数据类型范围的)数据,此时sql直接终
止,即数据类型本质其实是一种约束!!!
数值类型
TINYINT
有符号的范围是-128~127,默认有符号,如下图,当越界时直接报错了!
无符号的范围是0-255,如下图
注意:尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下!
BIT
bit[(M)] :位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1
如下图,在插入10的时候,a列未显示,在插入65的时候,却显示了,这是因为bit字段在显示时,
是按照ASCII码对应的值显示,而ASCll码表的有些符号是不可打印的!
INT
有符号的范围是-2^31~2^31-1,无符号的范围是2^32-1
FLOAT
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
如下图,float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入
float(4,2) unsigned,范围是0~99.99
decimal 
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
decimal整数最大位数m为65,支持小数最大位数d是30,如果d被省略,默认为0,如果m被省
略, 默认是10,最好不要使用默认的!
decimal和float差不多,无论是有符号的,还是无符号的。而区别在于表示的精度不一样,
decimal 更精确
建议:如果希望小数的精度高,推荐使用decimal
字符串类型
CHAR
char(L):固定长度字符串,L是可以存储的长度,单位为 字符 ,最大长度值可以为255

如下图,char(3),表明可以存储三个字符,可以是字母或者是汉字,但不能超过3个

VARCHAR

varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节

varchar括号内的len有多大,与编码密切相关!

varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效
节数是65532
utf8时,是65532/3=21844,一个字符占用3个字节;gbk时,是65532/2=32766,一个字符占用2
个字节!
CHAR与VARCHAR的区别
类似于string与char str[64],一个定长的,确定了空间,string则是你需要多少,就给你多少空间
如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去
定长的磁盘空间比较浪费,但是效率高;变长的磁盘空间比较节省,但是效率低
定长的意义是,直接开辟好对应的空间;变长的意义是,在不超过自定义范围的情况下,用多少,
开辟多少

日期和时间类型

date :日期 'yyyy-mm-dd' ,占用三字节
datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime完全一致,占用
字节
如下图,时间戳没有填,它显示的是插入数据的时间

 如下图,在更新日期后,时间戳也跟着变了,只有时间日期不变!

如下图,我们填的不完整时,在一定程度上能够补齐;也有可能会报错!

enum 

枚举,“单选”类型,enum('选项1','选项2','选项3',...);

实际存储的其实是数字,1,2,3,....最多65535个,所以可以插入数字,来达到我们想要的效果,但

不建议这么做,最好还是插入男、女等直观上的字

set

set:集合,“多选”类型,set('选项值1','选项值2','选项值3', ...);
也可以通过数字来插入,只不过和枚举不一样的是,它是按bit位来的,类似于位图,比如插入3,
3的二进制是0011,第一个和第二个bit位为1,就会把网球和篮球都插入进去
如下图,在查找时,=号是严格查找的,而如果我们要的是包含某一个事物的全部拥有者,就要用
到find_ in_ set函数

 

如下图,就把全部喜欢网球的都找出来了!

表的约束

mysql是和数据打交道的,mysql一定要尽量保证数据不要出现"偏差",所以mysql为了让自己的

结构里面的数据完整性一致性非常强,mysql是要给我们提供强约束的!!!

空属性

null(默认的)和not null(不为空),实际开发时,尽可能保证字段不为空,因为数据为空没办法参
与运算!
在MySQL中,null和0是不一样的,null表示不存在!
例如:如果班级没有名字,你不知道你在哪个班级,如果教室名字可以为空,就不知道在哪上课,
这样就要求我们在创建表时,班级和教室名,不能为null,必须插入数据
默认值
某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户
可以选择性的使用默认值
如下图,在not nll和default同时存在,且不给该列插入数据时,会使用default,忽略not null,
最好不要同时有not null和default!
comment
没有实际含义,只是对列进行说明,有点类似于C语言的注释
如下图,desc查看表结构,是无法看到comment写的说明的,需要show查看创建表的详情
zerofill
我们前面创建int类型的列时,查看表结构会是int(11),就显得很奇怪,其实没有zerofifill这个属
性,括号内的数字是毫无意义的!
如下图,在添加了zerofill后,如果数字的宽度不够int括号内的值,它会自动补齐
如下图,在MySQL中实际存储的还是原来插入的值!
主键
数据库存入数据不是唯一目的,也要方便提取!一般而言,要求数据库表中的记录,有一个特定的
唯一标识,标志唯一性!
主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能
有一个主键;主键所在的列通常是整数类型
如下图,设置主键后,该列会自动设为不能为空!
删除主键
alter table 表名 drop primary key;
添加主键
alter table 表名 add primary key(属性列)
如下图,如果你要在某一列添加主键时,即给整个表添加主键,那该列就一定不能有重复值,否则
不能添加
复合主键
如果有多个字段作为主键,可以使用复合主键!
如下图,id与course一起才算作主键!
如下图,只有当插入的数据与表中的数据id与course同时相同时才会报错,无法插入!
自增长
auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的
大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键
自增长的特点:
任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
自增长字段必须是整数
一张表最多只能有一个自增长
如下图,最大值+1增长!
如下图,某一列要设为自增长,就必须是具有唯一性属性列!
唯一键
唯一键所在的列可以为null!!!
如下图,在给id设为unique后,就不能插入重复的id值了!设为unique的属性列可以为NULL,这
也是与主键最大的区别,而 下图可以重复插入NULL,则是因为NULL表示不存在,而不存在就没
有比较,也就谈不上重复了!!!
如下图,在给设为唯一键的属性列设为不能为null后,就直接变为了主键了!
主键与唯一键
主键和唯一键并不冲突!在一张表中可以有一个主键,也可以同时具有唯一键!
表其实就是MySQL级别的"类or结构体对象"的集合,表中保存的其实就是某些场景下的属性字
段!
主键不是设置了主键属性,你才成为主键的,而是对应的属性被选择成为主键!而没有成为主键属
性,但是依旧需要唯一性的列属性,所以就有了unique键,这是因为数据库本身是一个对数据约
束非常严格的技术!!!
需要具有唯一属性的列:比如身份证号 码,电话号码,QQ号等等,不需要具有唯一性的列有姓
名,年龄等等
外键
如下图有两张表,这两张表通过class_id关联起来,class_id在语义上,叫做外键,class_id为主
键属性列的表被称为主表,另一个则被称为从表,如下图中的班级表为主表,学生表为从表!
如果我们要在学生表中插入一个学生,信息为id:102,name:王五,class_id:30,但是显然
是不能插入的,因为班级表中没有这个班级;如果我们要删除20班,java大神班,也无法删掉,因
为该班级还有学生!!!

通过外键产生关系的表,除了在逻辑上要有关联,被称为外键;mysql在操作上也要维护这种逻辑

关系的正确性,也被称为外键约束!

如下图,必须先创建主表,再创建从表,顺序不能颠倒! 

如下图,得Class表中有班级,才能插入这些班级的学生;同样,得Stu中没有某一班级的学生

了,才能在Class表中删除该班级!


转载:https://blog.csdn.net/weixin_58867976/article/details/127816179
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场