Mysql数据库笔记

数据操作

一、SQL

将SQL的基本操作根据操作对象进行分类:库操作,表操作(字段),数据操作。

二、库操作

对数据库的增删改查(CRUD)
1、新增数据库
create database 数据库名 【库选项】;
库选项:用来约束数据库,分为两个选项
字符集设定:charset/character set 具体字符集(数据存储的编码方式):GBK、UTF8
校对集设定:collate 具体校对集(数据比较规则)

2、查看所有数据库
(1)show databases;
(2)查看指定部分的数据库:模糊查询
show databases like ‘pattern’; –pattern是匹配模式
%:表示匹配多个字符
-: 表示匹配单个字符
(3)查看数据库的创建语句
show create database 数据库名;
2、更新数据库
数据库名不可修改,仅限于库选项:字符集和校对集(校对集依赖字符集)
alter database 数据库名 [库选项];
3、删除数据库
drop database 数据库名;

三、表操作

1、新增数据表
create table [if not exists] 表名 (
字段名 数据类型,
字段名 数据类型,
….
字段名 数据类型
)[表选项];

表选项:控制表的表现
字符集:charset 具体字符集; –保证表中数据存储的字符集
校对集:collate 具体校对集;
存储引擎:engine 具体的存储引擎(innodb和myisam)
(1)显示指定表所属的数据库
create table 数据库名.数据表名;
(2)隐式指定表所属数据库
①use 数据库名;
②创建表
2、查看数据表
(1)查看所有表
show tables;
(2)查看指定表
show tables like ‘pattern’;
(3)查看表的创建语句
①show create table 数据表名\g –表示
②show create table 数据表名\G –表示将查看到的结构旋转90度变成纵向
(4)查看表中的字段信息
desc / describe / show columns from 表名;
3、更新数据表
(1)修改表本身
①重命名表名
rename table 旧表名 to 新表名;
②修改表选项
alter table 表名 表选项 = 值;
(2)修改字段
①新增字段
alter table 表名 add [column] 字段名 数据类型 [列属性] [位置] (其中位置可为 first 或 after 字段名)
②修改字段
alter table 表名 modify 字段名 数据类型 [列属性] [位置]
③重命名字段
alter table 表名 change 旧字段 新字段 数据类型 [列属性] [位置]
④删除字段
alter table 表名 drop 字段名
4、删除数据表
drop table 表名 1,表名 2……….; –可以一次性删除多张表

四、数据操作

1、新增数据
(1)给全表增加数据,不需要指定字段列表,要求数据得知出现顺序与表中数据顺序相同,非数值数据都需要使用单引号。
insert into 表名 values(值,值,值…..,值) [,(值列表)]; –可以一次增加多条数据
(2)给部分字段插入数据,需要指定字段列表,字段列表出现顺序与字段顺序无关,但值列表的顺序必须与选定的字段顺序一致。
insert into 表名 (字段,字段…,字段) values (值,值…,值) [,(值列表)];
2、查看数据
单表:
(1)查看所有数据
select * from 表名;
(2)查看部分数据
select 字段列表 from 表名 where 字段 = 值 ;
多表:(确定表、字段以及表与表之间连接条件)
(3)关联查询
–交叉连接查询(会产生笛卡尔积问题,即记录数=字段数 * 表数)
select 表1字段,表2字段,… from 表1,表2…
–内连接查询
① select 表1字段,表2字段,… //要查询的字段
from 表1,表2,… //要查询的表
where 表1.字段 = 表2.字段 … //表与表之间关系,如外键中对应的字段
② select 表1字段,表2字段, ..
from 表1 [[AS] 别名]
inner join 表2
on 表1.字段 = 表2.字段
–左外连接查询:使用左边表的数据匹配右边表的数据,左表数据都显示,右表符合直接显示数据,否则显示null
select 表1字段,表2字段, ..
from 表1 [[AS] 别名] //作为左表
left outer join 表2 //右表
on 表1.字段 = 表2.字段
–右外连接查询
select 表1字段,表2字段, ..
from 表1 [[AS] 别名] //作为右表
right outer join 表2 //左表
on 表1.字段 = 表2.字段

3、更新数据
update 表名 set 字段 = 值 [where 条件] ;
4、删除数据
delete from 表名 [where 条件];
5、存储过程
(1)特点:①执行效率高; ②可移植性差
(2)语法:
—-创建存储过程
delimiter $ //声明结束符
create procedure 函数名([IN in 类型,OUT out 类型]) //IN输入出参数,OUT输出参数

begin
可以写多条sql语句
select 字段 into out from 表名 where 字段=in //如果有参数
end $

—-执行存储过程
call 存储过程名() //无参
call 存储过程名(IN实参,@OUT实参(可以是变量))
select @OUT实参
6、触发器
当操作了某张表时,希望同时触发一些动作/行为,可以使用触发器完成!!
例如: 当向表插入一条记录时,希望同时往日志表插入数据
(1)创建触发器(添加)
CREATE TRIGGER tri_Add AFTER INSERT ON 表名 FOR EACH ROW
INSERT INTO test_log(content) VALUES(‘员工表插入了一条记录’);
(2)创建日志表
CREATE TABLE test_log(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(100)

(3)执行sql语句

五、 字符集和校对集

1、查看所有字符集
show Character set;
2、查看服务器默认的对外处理的字符集
show variables like ‘character_set%’;
3、修改服务器认为的客户端数据的字符集为GBK
set character_set_client = gbk;
set 变量 = 值;修改只是会话级别(当前客户,当前连接有效,关闭失效)
4、修改服务器给定数据的字符集为gbk
set character_set_results = gbk;
5、快捷设置字符集
set names gbk;
6、查看所有校对集(数据比较的方式)
show collation;
7、设置校对集
三种格式:
_bin:binary,二进制比较,取出二进制位,一位一位比较,区分大小写
_cs:case sensitive,大小写敏感,区分大小写
_ci:case insensitice,大小写不敏感,不区分大小写

六、高级数据操作

1、主键冲突(新增数据时)
(1)当插入数据出现主键冲突时,可在插入语句后加冲突处理 on dupilcate key update 字段名 = 值;
(2)替换。replace into 表名 values(值列表);
2、蠕虫复制:从已有的数据中获取数据,然后将数据有进行新增操作,使其成倍的增加。
可以从已有表创建新表(表复制)。
insert into 表名 [字段列表] select [字段列表] / * from 数据表名
3、限制记录(更新数据时):限制更新的记录。 在更新语句后面加上:limit 限制数量。
4、删除数据:与更新数据类似,但是不会改变表结构,只能删除表后再创建表,重置自增长
truncate条件 表名;
5、select完整语法:select [select选项] 字段列表[字段别名] * from 数据源 [where 条件子句] [group by子句] [having 子句] [order by 子句] [limit 子句]
(1)select选项:select对查出来的结果的处理方式
all:默认,保留所有结果
distinct:去重,去除查出的重复的结果(所有字段相同)
(2)字段别名:select 字段名 [as] 字段别名
(3)数据源:可以是一张表或多张表
(4)where条件子句:可使用逻辑运算符(and、or、not)、关系运算符、between and、in / not in,where针对磁盘数据进行判断,进入到内存后才会进行分组操作
例:select 字段,count() from 表名 where count() 关系运算符 值 group by 字段名
(5)group by 字段 [asc / desc]分组:select * from 表名 group by 字段/ 多个字段;可以排序(默认升序)
(6)SQL中的统计函数(函数参数为字段名)
①Count():统计分组后每一组的记录数
②Max() / Min():统计每组的最大/小数
③Avg():统计平均值
④Sum();统计和
⑤group_concat():可对分组的结果中某个字段进行字符串连接
⑥with rollup 回溯统计:加在分组语句后,对上一级分组进行上报统计
例:select 字段名,count(*),max(字段),……,sum(字段),from 表名 group by 字段名
(7)having:与where语句类似,除此之外还可以对分组结果进行处理,还能使用字段别名
例:select 字段,count() from 表名 group by 字段 having count() 关系运算符 值
可以先给字段设置别名,然后使用别名来查找
select 字段,count(*) as 别名 from 表名 group by 字段 别名 关系运算符 值
(8)order by子句:根据某个字段进行升序或降序排序。排序时保存所有记录,而分组只取第一条记录
语法:order by 字段名 [asc / desc] ;
(9)limit子句:限制结果的语句,限制数量
①只用来限制长度(数据量):limit 数据量
②限制起始位置,限制数量:limit 起始位置,长度; (主要用于数据的分页)

数据类型

一、数据类型(列类型)

1、整数型
(1)tinyint 迷你整型,使用一个字节存储,最多状态256种
(2)smallint 小整型,使用两个字节存储,最多状态为65536种
(3)mediumint 中整型,使用3个字节
(4)int 整型,使用4个字节
(5)bigint 大整型,使用8个字节
(6)unsigned 表示无符号型(数据类型之后)
(7)数据类型(2) 这里的2指显示宽度,指数据最终显示的位数,如果小于2位,则自动提升为2位,否则无意义。
(8)zerofill 在位数提升时使用0进行左位填充,并指定为无符号型(使用时在数据类型之后)。

2、小数型
(1)浮点型:小数点浮动,精度有限,会丢失精度(自动四舍五入)
①float 单精度,占4个字节,精度范围大概为7位
②double 双精度,占8个字节,精度范围大概为15位
创建表方式:float或float(M,D),后者表示最大位数为M,小数位为2位。
插入数据:整形部分不能超出长度,但小数部分可以超出(系统会四舍五入)
(2)定点型:小数点固定,精度固定,不会丢失精度。
创建表:decimal(M,D) M最大为65,D最大为30.

3、时间日期类型
(1)datetime:时间日期格式:YYYY-mm-dd HH:ii:ss,表示从1000到9999年,有0值
(2)date:指日期部分
(3)time:时间,指定的某个时间段
(4)year:年份
(5)timestamp:时间戳,不是严格意义上的,只是从1970年开始的YYYY-mm–dd HH:ii:ss格式与datatime一致。
(6)插入数据:时间time可以为负数(表示向前推进的某个时刻到现在的一段时间), year可以使用2位数插入,也可以是4位数

4、定长、变长字符串
(1)定长。char,磁盘(二维表)在定义结构的时候就确定了最终数据的存储长度
char(L),L指可以存储的长度,单位字符最大为255
(2)变长。varchar,在分配空间时按最大分,但实际占用空间以具体数据为准
varchar(L),理论长度为65536字节,一般会多出1到2个字节。
(3)定长的磁盘空间浪费,但是效率高,如果数据基本确定长度一样就使用定长;变长磁盘空间比较节省,但是效率低。

5、文本字符串
数据量大,超过255个字符。
(1)text:存储文字
(2)blob:存储二进制数据(一般存储路径)

6、枚举字符串(enum)
事先将所有可能出现的结果设计好,实际数据必须是其中之一。
定义:enum(可能出现的元素列表),创建表时将其作为一个字段

7、集合
(1)定义:set(元素列表),元素使用单引号。
(2)使用:可以使用元素列表中的元素(多个),使用逗号隔开
(3)插入数据:可以使用多个元素字符串组合,与插入顺序无关,也可以直接插入数值(对应二进制)
(4)查看数据:数值加数据查看(字段 + 0),集合中每一个元素都是对应一个二进制位,选中为1.,顺序相反。

8、MySQL记录长度
(1)MySQL任何记录都不超过65535字节
(2)utf8下varchar的实际顶配:21844字节
(3)gbk下的varchar的实际顶配:32766字节
(4)如果有任何一个字段允许为空,那么系统会自动从整个记录保留一个字节来存储NULL(若想释放NULL所占字节,必须保证所有的字段不允许为空),只需在字段类型后加入not null
(5)文本字符串,不占用记录长度,占据10字节(保存数据的地址以及长度)

二、列属性(约束)

1、空属性:null / not null
2、列描述:comment 用来描述字段,使用,在字段后加(comment 值)
3、默认值:default ,使用:在字段后加(default 值)。
4、主键:primary key 用来唯一的约束该字段里面的数据,不允许为空
(1)创建表时直接指定(只有一个字段为主键)
(2)创建表时,在所有字段后,使用primary key(主键字段名列表)来创建,多个字段为复合主键。
(3)创建好表后,额外追加主键,可以通过修改字段属性,也可直接追加alter table 表名 add / modify 字段名 primary key(字段列表)

5、自增长
(1)添加:字段后加上 auto_increment
(2)修改自增长值:alter table 表名 auto_increment = 值 (值变小不生效,只能更大)
(3)查看自增长变量:alter variables like ‘auto_increment%’;
(4)修改自增长步长:set auto_increment_increment = 值
(5)删除自增长:修改字段不加auto_increment即可

6、唯一键
(1)创建表时,字段后加 unique / unique key (唯一,允许为空)
(2)增加唯一键:创建表时,在所有字段后加 unique(字段列表),指复合唯一键,当表中无主键,且该唯一键指定not null时,会默认为PRI
(3)追加唯一键:alter table 表名 add unique key(字段)
(4)删除唯一键:alter table 表名 drop index 索引值 (默认字段名)

7、外键
(1)当表A中某个字段的值多次重复时,应将其提取出为另一张表B,在表A上只需记录提取出字段在表B对应的ID即可。表B称为主表,表A称为副表或从表
(2)当第一张表插入的数据不合法时,使用外键进行约束,声明在副表。
(3)格式:constraint 表A_表B_fk foreign key (表A字段) references 表B(表B字段)
(4)主表的参考字段通常为主键
(5)注意:
添加数据时,应先添加主表,再添加副表
修改或删除时,应先修改或删除副表,再修改或删除主表
(6)级联:在修改或删除时,直接修改删除主表字段,副表所关联数据也会被修改或删除
语法:在外键约束语句后加上:on update cascade

8、索引
(1)关系
①一对一:两张表必须要有一个具有唯一性的字段连接,两张表的单条记录只能互相匹配一条记录
②一对多:一张表的单条记录可以匹配到另一张表的多条记录,在某张表中增加一个字段,能够找到另外一张表中的记录。
③多对多:两张表的一条记录可以同时互相匹配到多条记录,增加一张中间表来维护两张表之间的关系

9、范式(Normal Format)
是一种离散数学中的知识,是为了解决一种数据的存储与优化的问题,主要是为了使能够通过关系找到的数据不再重复。也是一种分层结构的规范,分为六层,1NF、2NF…..依次更严格
(1)1NF:在设计表存储数据时,要求字段的数据具有原子性,即不可再拆分
(2)2NF:在数据表设计的时候,不允许出现部分依赖,即存在复合主键,有些字段不由整个主键确定,而是依赖主键中的某个字段。解决方案可以使用逻辑主键代替复合主键
(3)3NF:解决传递依赖。传递依赖就是某个字段通过依赖其他一个非主键字段来依赖主键。解决方案就是将这些字段单独建表。
(4)逆规范化:为了提高效率,不建议创建多表

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