今日分享开始啦,请大家多多指教~
MySQL:先别跑好吗?
程序员:不跑你养我啊?
MySQL:你听我给你解释啊。
程序员:你先管好你本人吧。
这是我之前看过的一个十分乏味的对话,这也是真实写照。明天分享的是 MySQL 数据库,打好根底十分重要,话不多说,注释开始啦~
一,数据库
1.1 DBMS
Database Management System:数据库管理系统
DBMA:数据库管理员
常见的数据库管理系统:
- MySQL:Oracle 公司的中小型数据库,从 6 版本开始免费
- Oracle:Oracle 公司的大型数据库,免费的
- DB2:IBM 公司的大型数据库
- SQLServer:Mircosoft 公司的大型数据库
- SQLite:挪动端的嵌入式的小型数据库
Java 中次要应用的是 MySQL 和 Oracle
1.2 数据库的构造
- 一个 DBMS 中能够保护治理多个数据库
- 一个数据库由若干张表组成
- 一张表蕴含若干条记录
- 一条记录蕴含若干字段信息
1. 数据库中的表相当于代码中的实体类
例如:要钻研医生这个类,就应该创立一张医生表
2. 数据库表中的一列(字段)相当于实体类中的属性
例如:汽车有品牌属性,那么在汽车表中就应该有品牌字段
3. 依据类创立出的对象就相当于数据库表中的一行(一条记录)
例如:当咱们获取宠物对象时,咱们就能够从该对象上获取它所具备的所有属性;同样的,当咱们查问到一条宠物记录时咱们就能够从表中明确该宠物的所有字段信息。
1.3 SQL 语言
结构化查询语言:Structured Query Language
分类:
- DDL:数据定义语言(Data Definition Language)
对数据库、表进行创立、批改、删除等操作
关键字:create、alter、drop 等
- DML:数据操作语言(Data Manipulation Language)
对表中记录、字段进行增、删、改等操作
关键字:insert、delete、update 等
- DQL:数据查询语言(Data Query Language)
对数据库、表、记录、字段进行查问的
关键字:select、from、where、in、and、or、between、having、group by、order by、limit 等
- DCL:数据管制语言(Data Control Language)
对数据库的安全级别和拜访权限进行治理的
关键字:revoke、grant、commit、roll back 等
1.4 mysql 软件
注:
- 装置的目录必须是纯英文门路的
- 删除步骤
- 在控制面板中卸载软件
- 删除 mysql 装置门路下的 mysql 文件夹
- 删除 C 盘下 ProgramData 下的 mysql 文件夹
登录 mysql
形式一:
- 关上 cmd
- 输出 mysql -uroot - p 明码
办法二:
- 关上 cmd
- 输出 mysql -uroot -p
- 再输出明码
形式三:
- 找到装置 mysql 后的 Command Line Client
- 输出明码
二,SQL
C (create) R (read) U (update) D(delete)
2.1 库的操作
建库:create database 库名;
判断数据库是否存在,不存在才创立:create database if not exists 库名;
创立数据库并指明编码格局:create database 库名 character set 编码格局;
查询数据库的创立语句以及编码格局:show create database 库名;
查看已有的数据库:show databases;
删库:drop database 库名;
判断数据库是否存在,存在才删除:drop database if exists 库名;
批改数据库的编码格局:alter database 库名 character set 编码格局;
指定应用的数据库:use 库名;
2.2 表的操作
建表:create table 表名 (字段名 字段类型 [ 束缚], 字段名 字段类型 [束缚], 字段名 字段类型 [束缚], …);
判断表是否存在,不存在才创立:create table if not exists 表名 (字段名 字段类型 [ 束缚], 字段名 字段类型 [束缚], 字段名 字段类型 [束缚], …);
查问所有表:show tables;
查看表构造:desc 表名;
删表:drop table 表名;
判断表是否存在,存在才删除:drop table if exists 表名;
复制表构造:create table 新表名 like 被复制的表名;
批改表名:alter table 旧表名 rename to 新表名;
批改表构造:
增加新字段:alter table 表名 add 新字段 字段类型 [束缚];
删除字段:alter table 表名 drop 字段;
批改字段类型:alter table 表名 modify 字段 字段类型 [束缚];
批改字段名:alter table 表名 change 旧字段名 新字段名 字段类型 [束缚];
2.3 记录、字段的操作
查问表中的所有记录:
- select * from 表名;
-
- 示意所有字段(列)
- 等价于 select 字段 1, 字段 2, 字段 3,… from 表名;
增加记录:
向所有字段增加数据:insert into 表名 values (值 1, 值 2, 值 3,…);
向指定字段增加数据:insert into 表名 (字段 1, 字段 2, 字段 3,…) values (值 1, 值 2, 值 3,…);
批量增加(所有字段):insert into 表名 values (值 1, 值 2, 值 3,…), (值 1, 值 2, 值 3,…),…;
批量增加(指定字段):insert into 表名 (字段 1, 字段 2, 字段 3,…) values (值 1, 值 2, 值 3,…), (值 1, 值 2, 值 3,…),…;
删除记录:
删除所有记录:delete from 表名;
依据条件删除指定记录:delete from 表名 where 条件;
删除所有记录:truncate table 表名;
批改记录:
批改所有记录:update 表名 set 字段名 = 值, 字段名 = 值, 字段名 = 值 …;
依据条件批改指定记录:update 表名 set 字段名 = 值, 字段名 = 值, 字段名 = 值,… where 条件;
注:
- 增加记录时,值的数量必须与列的数量统一
- 增加记录和批改记录时,值的类型必须与字段类型统一
- 除了数值类型,其余类型都必须用单 / 双引号括起来
- delete from 表名;删除表中所有记录,它的删除形式是逐行删除,表中有多少条记录,删除语句就会执行多少次;truncate table 表名;删除表中记录,它的删除形式是将整张表删除,而后构建一张与原来表构造雷同的空表。
2.4 数据类型
2.4.1 数值类型
int:整数类型
double:小数类型
非凡的:salary double(n,m)
n:示意整数位和小数位一共最多有 n 位
m:示意小数位最多保留 m 位
例如:salary double(6,2) 的最大值是 9999.99
2.4.2 日期和工夫类型
datetime:工夫戳,蕴含年月日时分秒,格局:yyyy-MM-dd HH:mm:ss
timestamp:工夫戳,蕴含年月日时分秒,格局:yyyy-MM-dd HH:mm:ss
注:
- 如果某个字段的是类型是 timestamp,在咱们给它赋值为 null 或者没有对它赋值时,零碎会给它一个默认值,默认值是增加这条语句的工夫或者是对它赋值为 null 时的工夫。
- timestamp 类型字段值不可能是空值
2.4.3 字符串类型
varchar:
例如:name varchar(20):示意姓名字段的值最大 20 个字符
2.5 查问
2.5.1 根底查问
查问所有:select * from 表名;
查问所有记录的指定字段:select 字段 1, 字段 2, 字段 3,… from 表名;
去重查问:select distinct 字段名 from 表名;
2.5.2 条件查问
在 where 关键字后加上条件,查问时会依据条件进行记录的筛选
1. 逻辑运算符
- &&、and
- ||、or
- !
2. 关系运算符
- ” > “
- ” < “
- ” >= “
- ” <= “
- ” = “
- ” !=“、”<> “
3. 指定范畴内
- between … and …
例如:查问问题在 80~100 之间的学生
select * from student where score between 80 and 100;
注:含头含尾
4. 在指定列表中 in(值 1,值 2,值 3,…)
不在指定列表中 not in(值 1,值 2,值 3,…)
5. 空和非空
- 判断为空:is null
- 判断非空:is not null
6. 含糊查问
关键字:like
占位符:
- _:单个任意字符
- %:任意个任意字符
2.5.3 排序查问
关键字:order by
排序办法:
- 升序:默认,asc
- 降序:desc
// 降序排列员工的销售额,销售额雷同时,依据工资升序排列
select * from emp order by sale desc,salary asc;
注:如果多个字段进行排序,只有第一字段的值雷同时,才会执行第二字段的排序
格局:order by 字段 1 排序形式,字段 2 排序形式,…;
2.5.4 聚合函数
概念:将一列数据作为一个整体,而后进行纵向的计算
- avg():计算平均值
- sum():求和
- max():求最大值
- min():求最小值
- count():求数量
注:
- count() 的参数个别应用非空字段或者 *
- 聚合函数不计算 null 值
2.5.5 分组查问
关键字:group by
注:
- 分组后查问的字段只能是:分组字段、聚合函数
- where 和 having 的区别:
where 用在分组前进行条件筛选,如果不满足 where 的条件则不进入分组;having 用在分组后进行条件筛选,如果不满足 having 的条件则不被查问到
where 后不能跟聚合函数,having 后能够应用聚合函数进行分组后的条件筛选
2.5.6 分页查问
关键字:limit
语法:limit 开始索引,每页查问的记录数
注:索引从 0 开始
公式:开始索引 =(以后页码 – 1)* 每页查问的记录数
2.5.7 查问语句的构造
select:字段列表
from:表名
where:条件列表
group by:分组字段
having:分组后的条件
order by:排序字段 排序形式
limit:索引,记录数
2.5.8 起别名
能够为字段、表起别名
起别名的作用是可能辨别多张表中的同名字段,并且简化了书写
格局:as 别名
注:as 能够省略
2.6 束缚
概念:对表中数据进行限定
分类:
- 非空束缚:not null
- 惟一束缚:unique
- 主键束缚:primary key
- 外键束缚:foreign key
2.6.1 非空束缚:not null
限定字段值不能为空
- 创立表时,增加非空束缚
create table 表名 (字段名 字段类型 not null, 字段名 字段类型 [ 束缚], 字段名 字段类 [束缚]…);
- 创立表后,增加非空束缚
alter table 表名 modify 字段名 字段类型 not null;
注:已存在空值的字段不能被设置成非空
- 删除非空束缚(设置字段容许有空值)
alter table 表名 modify 字段名 字段类型;
2.6.2 惟一束缚:unique
限定字段值不能有反复
- 创立表时,增加惟一束缚
create table 表名 (字段名 字段类型 unique, 字段名 字段类型 [ 束缚], 字段名 字段类 [束缚]…);
- 创立表后,增加惟一束缚
alter table 表名 modify 字段名 字段类型 unique;
- 删除惟一束缚
alter table 表名 drop index 字段名;
注:
- 惟一束缚的值能够是空值,并且容许存在多个 null 值
- 曾经存在反复值的字段不能被设置成惟一的
- 一个字段能够同时被设置成非空且惟一的,并且非空和惟一的关键字的程序是任意的
2.6.3 主键束缚:primary key
个别主键不应用具备非凡含意的字段
特点:
- 非空且惟一
- 一张表中只能有一个主键字段
- 主键是表中记录的惟一标识
- 创立表时,增加主键束缚
create table 表名 (字段名 字段类型 primary key, 字段名 字段类型 [ 束缚], 字段名 字段类 [束缚]…);
create table 表名 (字段名 字段类型 [ 束缚], 字段名 字段类型 [束缚],…, primary key(主键字段));
- 创立表后,增加主键束缚
alter table 表名 modify 字段名 字段类型 primary key;
- 删除主键束缚
alter table 表名 drop primary key;
注:删除主键束缚后,主键仍有非空束缚
主键自增长:
概念:如果某个字段是数值类型的主键字段,能够应用 auto_increment 来实现主键自增长
- 创立表时,增加主键自增长
create table 表名 (字段名 字段类型 primary key auto_increment, 字段名 字段类型 [ 束缚], 字段名 字段类 [束缚]…);
- 创立表后,增加主键自增长
alter table 表名 modify 主键字段 字段类型 auto_increment;
- 删除主键自增长
alter table 表名 modify 主键字段 字段类型;
- 创立表后,增加主键束缚的同时增加自增长
alter table 表名 modify 字段 字段类型 primary key auto_increment;
注:
- 能增加自增长性能的必须是主键字段
- 增加主键自增长的主键字段必须是数值类型的
- 第一条自增长的字段值是 1
- 从存在过的最大值开始 +1
- 如果存在过的最大值是小数,那么自增长的值是大于它的最小整数
2.6.4 外键束缚:foreign key
外键让表与表之间产生了分割,保障了数据的完整性
注:从表外键的类型必须与主表主键的类型统一
- 创立表时,增加外键束缚
create table 表名 (字段名 字段类型 [ 束缚], 字段名 字段类型 [束缚], …, [constraint 外键名] foreign key(外键字段) references 主表 (主表的主键字段));
- 删除外键
alter table 表明 drop foreign key 外键名;
- 创立表后,增加外键束缚
alter table 表名 add [constraint 外键名] foreign key(外键字段) references 主表 (主表的主键字段);
- 创立表后,新建外键字段的同时,增加外键束缚
alter table 表名 add 外键字段 字段类型, add [constraint 外键名] foreign key(外键字段) references 主表 (主表的主键字段);
级联操作:对主表中的记录进行更新和批改的同时,能间接影响从表中的记录
- 创立从表时,增加级联操作
create table 表名 (字段名 字段类型 [ 束缚], 字段名 字段类型 [束缚], …, [constraint 外键名] foreign key(外键字段) references 主表 (主表的主键字段) on delete cascade on update cascade);
- 创立从表后,增加级联操作
alter table 表名 add [constraint 外键名] foreign key(外键字段) references 主表 (主表的主键字段) on delete cascade on update cascade;
- 创立从表后,新建外键字段,增加外键束缚,并增加外键的级联操作
alter table 表名 add 外键字段 字段类型, add [constraint 外键名] foreign key(外键字段) references 主表 (主表的主键字段) on delete cascade on update cascade;
2.7 多表
2.7.1 表与表之间的关系
- 一对一,例如:人和身份证、公司与注册地址、汽车与车牌号
- 一对多(多对一),例如:部门和员工、商品和分类
- 多对多,例如:学生和课程、商品和订单
2.7.2 多表建设连贯
- 一对一,在任意一方增加外键指向另一方的主键,外键要保障惟一
- 一对多,在多的一方增加外键指向一的一方的主键
- 多对多,须要借助第三张两头表。两头表至多蕴含两个字段,这两个字段作为两头表的外键,别离指向两张主表的主键。为了保障两头表不会呈现反复值,须要将这两个外键字段造成联结主键。
2.8 多表查问
2.8.1 穿插查问
语法:select 字段列表 from 表 1, 表 2;
穿插查问的后果是笛卡尔积,是多张表所有记录的组成状况
咱们须要应用条件来去除有效的数据
2.8.2 内连贯查问
在穿插查问的根底上应用 where 条件 去除有效的数据
语法:
- 隐式内连贯
select 字段列表 from 表 1, 表 2 where 条件;
- 显式内连贯
select 字段列表 from 表 1 inner join 表 2 on/where 条件;
注:inner 能够省略
内连贯查问的后果是两表的交加
2.8.3 外连贯
语法:
- 左外连贯
select 字段列表 from 表 1 left outer join 表 2 on 条件;
- 右外连贯
select 字段列表 from 表 1 right outer join 表 2 on 条件;
注:outer 能够省略
左外连贯查问的后果是左表的全副和两表的交加
右外连贯查问的后果是右表的全副和两表的交加
2.9 子查问
概念:将一条查问语句的后果作为另一条查问语句的表、记录、字段、条件
小结
数据库就是存储数据的仓库,能够实现数据的长久化存储,它的实质是文件系统。
今日份分享已完结,请大家多多包涵和指导!