安装:
官网下载地址:MySQL :: Download MySQL Community Server (Archived Versions)
连接:
mysql -u用户名 -p密码 [-h数据库服务器的IP地址 -P端口号]
数据库设计-DDL
查询所有数据库:
show databases ;
查询对当前数据库:
select database() ;
创建数据库:
create database [ if not exists ] 数据库名;
//通过if not exists 参数来解决这个问题,数据库不存在, 则创建该数据库,如果存在,则不创建。
切换数据库:
use 数据库名 ;
删除数据库:
drop database [ if exists ] 数据库名 ;
退出:
quit
//加上参数 if exists ,如果数据库存在,再执行删除,否则不执行删除。
表操作:
创建表:
create table 表名(
字段1 字段1类型 [约束] [comment 字段1注释 ],
字段2 字段2类型 [约束] [comment 字段2注释 ],
字段3 字段3类型 [约束] [comment 字段3注释 ],
......
字段n 字段n类型 [约束] [comment 字段n注释 ]
) [ comment 表注释 ] ;
约束:
约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:
保证数据库中数据的正确、有效性和完整性。
分类:
//注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
主键自增 auto_increment:
具有auto_increment属性的数据列应该是一个正数序列(从1开始自增),auto_increment数据列必须有唯一索引,以避免序号重复;必须具备NOT NULL属性。
常用的数据类型:
数值类型:
字符串类型:
日期时间类型:
注意事项:
create_time:记录的是当前这条数据插入的时间。
update_time:记录当前这条数据最后更新的时间。
查询:
查询当前数据库所有表:show tables;
查看指定表结构:desc 表名 ;
查询指定表的建表语句:show create table 表名 ;
修改:
添加字段:alter table 表名 add 字段名 类型 (长度) [ comment 注释 ] [ 约束 ];
修改数据类型:alter table 表名 modify 字段名 新数据类型 (长度);
修改字段名和字段类型:alter table 表名 change 旧字段名 新字段名 类型 (长度) [ comment 注释 ] [ 约束 ];
删除字段:alter table 表名 drop 字段名;
修改表名:rename table 表名 to 新表名;
删除:
删除表:drop table [ if exists ] 表名;
删除指定表, 并重新创建表:truncate table 表名;
//注意: 在删除表的时候,表中的全部数据也都会被删除。
数据库操作-DML
增加(insert):
给指定字段添加数据:
insert into 表名 (字段名1, 字段名2, ...) values (值1, 值2, ...);
给全部字段添加数据:
insert into 表名 values (值1, 值2, ...);
批量添加数据:
1.insert into 表名 (字段名1, 字段名2, ...) values (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...) ;
2.insert into 表名 values (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...) ;
注意事项:
• 插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
• 字符串和日期型数据应该包含在引号中。
• 插入的数据大小,应该在字段的规定范围内。
修改(update)
update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , .... [ where 条件 ] ;
注意事项:
A. 修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
B. 在修改数据时,一般需要同时修改公共字段update_time,将其修改为当前操作时间。
删除(delete)
delete from 表名 [ where 条件 ] ;
注意事项:
• DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
• DELETE 语句不能删除某一个字段的值(可以使用UPDATE,将该字段值置为NULL即可)。
• 当进行删除全部数据操作时,datagrip会提示我们,询问是否确认删除,我们直接点击Execute即可。
数据库操作-DQL
基本查询(不带任何条件)
条件查询(where)
分组查询(group by)
排序查询(order by)
分页查询(limit)
基本查询:
查询多个字段的数据(根据某字段查询该字段的数据) :
select 字段1, 字段2, 字段3 ... from 表名 ;
select * from 表名 ;
字段设置别名 :
select 字段1 [ as 别名1 ] , 字段2 [ as 别名2 ] ... from 表名;
select 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... from 表名;
去除重复记录(根据某字段去重相同的数据) :
select distinct 字段列表 from 表名;
条件查询:
语法:
select 字段列表 from 表名 where 条件列表
(查询某条件下的某字段);
条件:
常用的比较运算符如下:
常用的逻辑运算符如下:
排序查询:
语法:
select 字段列表 from 表名 order by 字段1 排序方式1 , 字段2 排序方式2 ;
排序方式:
ASC : 升序(默认值)
DESC: 降序
注意事项:
• 如果是升序, 可以不指定排序方式ASC ;
• 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;
分页查询:
select 字段列表 from 表名 limit 起始索引, 查询记录数 ;
某一页的开始索引:(页码-1)*每页记录数;
聚合函数:
介绍:
将一列数据作为一个整体,进行纵向计算 。
常见的聚合函数 :
语法 :
select 聚合函数(字段列表) from 表名 ;
//注意 : NULL值是不参与所有聚合函数运算的。
统计数量可以使用:count(*)count(字段)
count(1),推荐使用count(*)。
分组查询
语法:
select 字段列表 from 表名 [ where 条件 ] group by 分组字段名 [ having 分组后过滤条件 ];
where与having区别:
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
判断条件不同:where不能对聚合函数进行判断,而having可以。
//注意事项:
//• 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
//• 执行顺序: where > 聚合函数 > having 。
//• 支持多字段分组, 具体语法为 : group by columnA,columnB
IF 函数:
IF(条件表达式1,表达式为true取的值,表达式为false取的值)
怎么实现给查询的值设定新的数据:比例 1变成男,2变成女
多表设计:
一对多:
一对多关系实现:
在数据库表中多的一方,添加字段,来关联一的一方的主键。
外键约束:
让两张表的数据建立连接,保证数据的一致性和完整性。 对应的关键字:foreign key
-- 创建表时指定
create table 表名(
字段名 数据类型,
...
[constraint] [外键名称] foreign key (外键字段名) references 主表 (主表列名)
);
-- 建完表后,添加外键
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(主表列名);
物理外键 与 逻辑外键:
物理外键:
介绍:使用 foreign key 定义外键关联另外一张表
缺点:
A. 影响增、删、改的效率(需要检查外键关系)。
B. 仅用于单节点数据库,不适用与分布式、集群场景。
C. 容易引发数据库的死锁问题,消耗性能。
逻辑外键:
介绍:在业务层逻辑中,解决外键关联。
特点:通过逻辑外键,就可以很方便的解决上述问题
在现在的企业开发中,很少会使用物理外键,都是使用逻辑外键。 甚至在一些数据库开发规范中,会明确指出禁止使用物理外键 foreign key 。
一对一:
关系:
一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
实现:
在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)
多对多:
关系:
一个学生可以选修多门课程,一门课程也可以供多个学生选择
实现:
建立第三张中间表,中间表至少包含两个外键,分别关联两方主键